Skill: Audit Domain 4 — Infrastructure & DevOps
This skill audits one specific domain. It runs in an isolated subagent
context spawned by the audit-orchestrator. The subagent loads this
skill and the audit rules, runs against the audit scope, and returns
a ~2K-token findings report.
Pre-flight
view ~/.codex/context\audit-rules.md
If you have findings from previous audit phases (hard stops, Tambon,
blind spots), the orchestrator passes them as input. Use them — don't
re-discover findings other phases already produced. Specifically:
- Hard stops related to this domain: H4
- Blind spots that route to this domain: B5
If the orchestrator didn't pass you these inputs, do NOT re-run the
hard-stops or blind-spots walks. Audit your domain only and trust the
orchestrator to stitch.
Scope
CI/CD pipelines, deployment scripts, Infrastructure-as-Code, secrets management, environment configuration (dev/staging/prod), logging, observability, monitoring, on-call.
Key questions to answer
For each, find the evidence and report it. The questions are the
audit's spine — every finding maps back to one of them.
- Is the deployment process scripted and version-controlled, or manual?
- Are secrets handled by a real secret manager, or env vars on disk?
- Are environments (dev/staging/prod) properly isolated?
- Is logging centralized and searchable?
- Are basic metrics (request rate, error rate, p50/p95 latency) collected?
- Is there an on-call setup / alerting?
- Are CI workflows tested as part of code review?
- Email deliverability (if the app sends ANY email — signup, reset, receipts,
alerts — this is a silent launch-killer: "signups work" but nobody receives them):
- SPF, DKIM and DMARC records configured on the sending domain? (
nslookup -type=txt)
- Transactional email provider actually wired (not a TODO / console.log fallback)?
- Has a real signup/reset email been received in BOTH Gmail and Outlook? (evidence:
ask for proof or mark UNVERIFIED — inbox placement cannot be inferred from code)
- App email sent from a subdomain (mail.domain.com), isolating marketing/app reputation?
- mail-tester.com score if available (9+ target). Missing ALL of these = launch blocker.
Vibe-coding specific checks (production-readiness)
Cite the playbook for depth: view ~/.codex/context\production-readiness-playbook.md
- Staging environment + preview deployments per change (playbook L5).
- One-click rollback to last-good in <60 seconds (playbook L5, L7).
- Infrastructure as code; deterministic builds (same result every deploy) (playbook L5, FM-19).
- Canary deployments (5% → watch → promote) and feature flags for instant disable (playbook L13, CHK-2).
- Secret scanning (GitGuardian/TruffleHog) AND dependency scanning in CI, blocking merge (playbook L8).
- Main = production; branch-per-change; atomic commits (playbook L7).
- If on a free tier: are platform limits (timeout, no background jobs) about to bite? Is there a background-job runner for heavy/async work? (playbook L6).
Files most likely to have findings
Don't read everything. Read these files first:
- .github/workflows/ or equivalent
- Dockerfile / docker-compose.yml
- deployment scripts
- env example files
- logging config
If you exhaust these and the budget allows, expand outward. Otherwise,
report what you found and note what you didn't read.
Process
Re-read the rules. R1-R7 apply to every finding. Especially R2
(quote before cite) — for a domain skill running in a subagent, the
subagent's context is fresh; don't assume you remember a file from
a previous turn.
Enumerate before verdict. List every CI/deploy/security workflow
first, then audit each listed workflow. Do not conclude "CI exists"
from a trigger or filename alone. The verdict must be about success
semantics: which commands run, whether failures fail the job, whether
deploy actually deploys, and whether missing secrets/env make the
workflow fail closed.
Run mandatory shortcut-audit checks. These checks exist because
the v4 remediation comparison found DevOps audits treated automation
presence as a gate and missed miswired success behavior.
- Security scan gate check: grep every workflow for
continue-on-error: true, continue-on-error:true, exit-code: 0,
and exit-code: '0' on security scan steps such as Trivy, npm audit,
Snyk, CodeQL wrappers, or custom vulnerability scans. Any match on a
security-scan path is a finding unless a later explicit blocking gate
proves the scan still fails the workflow.
- Frontend build env injection check: enumerate all frontend build-time
env vars from Vite/Next/frontend config and browser source
(
VITE_*, NEXT_PUBLIC_*, equivalent public build prefixes). Verify
each one is injected into the deploy workflow or documented as
intentionally absent for that deploy target. A required build env var
missing from deploy workflow injection is a finding.
- Deploy success-semantics check: for each deploy workflow, prove that
an action intended to deploy cannot finish green when deploy secrets,
environment IDs, artifact upload, or provider CLI calls are missing.
"Workflow dispatch exists", "runs on main", or "has a deploy job" is
only trigger presence and is not sufficient.
Walk the key questions. For each question, run the relevant
detection commands (greps, file reads, schema lookups). Capture
evidence at path:line. Verify by reading the actual code.
Cross-reference orchestrator inputs. If the orchestrator passed
hard-stops or blind-spots findings tagged for this domain, include
them in your report. Don't re-investigate; just include with the
provided evidence.
Triage. For each finding, set severity per the audit rubric and
exploitability per R4.
Produce the domain report.
Output format
═══════════════════════════════════════════════════════════════════════
DOMAIN 4: Infrastructure & DevOps
═══════════════════════════════════════════════════════════════════════
▶ FOUNDER VIEW
[2-4 sentences in plain English. Sample tone:]
What happens when you push to main? What happens at 3am when it breaks? This is operational maturity.
▶ TECHNICAL EVIDENCE
Scope of this domain audit:
Files read: <count>
Files skipped: <count> (reason: outside scope or low-priority)
Findings:
F-4.1 — <one-line title>
Severity: Critical | High | Medium | Low
Exploitability: EXPLOITABLE-NOW | EXPLOITABLE-LOW-EFFORT | BAD-PRACTICE | UNKNOWN
Hard-stop: H<N> if applicable
Blind-spot: B<N> if applicable
Evidence:
<path:line> <one-line description>
What's wrong:
<one paragraph>
Why it matters:
<one sentence>
Recommended fix:
<one paragraph; for full fix prompt, use /audit-fix F-4.1>
Verification after fix:
<command>
F-4.2 ...
Summary:
Total findings: <count>
By severity: <counts>
Most urgent: <which finding ID>
[SECTION COMPLETE: Domain 4]
If the domain has zero findings:
▶ TECHNICAL EVIDENCE
✅ No findings in this domain.
Verification:
<commands run that produced no signal>
Confidence: High | Medium | Low
Reason for low confidence: <if applicable>
Failure modes to refuse
- ❌ Producing findings without path:line citations (R1)
- ❌ Citing a path you didn't read (R2)
- ❌ Re-running hard-stops or blind-spots walks (orchestrator did this)
- ❌ Including findings outside this domain's scope (route them to the
right domain instead)
- ❌ Soft-pedaling a Critical to Medium because "it's a small app" (R3)
- ❌ Skipping section completion marker (R6)
Codex Port Notes
- Audit mode is read-only for product code unless the user explicitly requests remediation.
- Treat
.claude/, .codex/, .agents/, .gitnexus/, caches, node_modules/, virtualenvs, and generated build outputs as tooling or generated scope unless the finding is specifically repo hygiene.
- For context references written as
@.claude/context/<file>, read ~/.codex/context\<file> in Codex.
- Prefer PowerShell equivalents on Windows; use
rg before grep and Get-ChildItem before Unix find when running in PowerShell.
- If GitNexus MCP tools are unavailable, use
.gitnexus/meta.json, .gitnexus/ artifacts, and npx gitnexus CLI as the fallback.
- Findings should also be representable as:
{id, domain, severity, exploitability, evidence_path, evidence_line, summary, impact, recommended_fix, verification}.
1---2name: audit-domain-04-devops3description: Audit the infra and DevOps domain — CI/CD, deployment, IaC, secrets management, environments, logging, observability. Run as part of /audit Phase E.4---56# Skill: Audit Domain 4 — Infrastructure & DevOps78This skill audits one specific domain. It runs in an isolated subagent9context spawned by the audit-orchestrator. The subagent loads this10skill and the audit rules, runs against the audit scope, and returns11a ~2K-token findings report.1213## Pre-flight1415```16view ~/.codex/context\audit-rules.md17```1819If you have findings from previous audit phases (hard stops, Tambon,20blind spots), the orchestrator passes them as input. Use them — don't21re-discover findings other phases already produced. Specifically:2223- Hard stops related to this domain: H424- Blind spots that route to this domain: B52526If the orchestrator didn't pass you these inputs, do NOT re-run the27hard-stops or blind-spots walks. Audit your domain only and trust the28orchestrator to stitch.2930## Scope3132CI/CD pipelines, deployment scripts, Infrastructure-as-Code, secrets management, environment configuration (dev/staging/prod), logging, observability, monitoring, on-call.3334## Key questions to answer3536For each, find the evidence and report it. The questions are the37audit's spine — every finding maps back to one of them.38391. Is the deployment process scripted and version-controlled, or manual?402. Are secrets handled by a real secret manager, or env vars on disk?413. Are environments (dev/staging/prod) properly isolated?424. Is logging centralized and searchable?435. Are basic metrics (request rate, error rate, p50/p95 latency) collected?446. Is there an on-call setup / alerting?457. Are CI workflows tested as part of code review?468. **Email deliverability** (if the app sends ANY email — signup, reset, receipts,47 alerts — this is a silent launch-killer: "signups work" but nobody receives them):48 - SPF, DKIM and DMARC records configured on the sending domain? (`nslookup -type=txt`)49 - Transactional email provider actually wired (not a TODO / console.log fallback)?50 - Has a real signup/reset email been received in BOTH Gmail and Outlook? (evidence:51 ask for proof or mark UNVERIFIED — inbox placement cannot be inferred from code)52 - App email sent from a subdomain (mail.domain.com), isolating marketing/app reputation?53 - mail-tester.com score if available (9+ target). Missing ALL of these = launch blocker.5455### Vibe-coding specific checks (production-readiness)5657Cite the playbook for depth: view ~/.codex/context\production-readiness-playbook.md5859- Staging environment + preview deployments per change (playbook L5).60- One-click rollback to last-good in <60 seconds (playbook L5, L7).61- Infrastructure as code; deterministic builds (same result every deploy) (playbook L5, FM-19).62- Canary deployments (5% → watch → promote) and feature flags for instant disable (playbook L13, CHK-2).63- Secret scanning (GitGuardian/TruffleHog) AND dependency scanning in CI, blocking merge (playbook L8).64- Main = production; branch-per-change; atomic commits (playbook L7).65- If on a free tier: are platform limits (timeout, no background jobs) about to bite? Is there a background-job runner for heavy/async work? (playbook L6).6667## Files most likely to have findings6869Don't read everything. Read these files first:7071- .github/workflows/ or equivalent72- Dockerfile / docker-compose.yml73- deployment scripts74- env example files75- logging config7677If you exhaust these and the budget allows, expand outward. Otherwise,78report what you found and note what you didn't read.7980## Process81821. **Re-read the rules.** R1-R7 apply to every finding. Especially R283 (quote before cite) — for a domain skill running in a subagent, the84 subagent's context is fresh; don't assume you remember a file from85 a previous turn.86872. **Enumerate before verdict.** List every CI/deploy/security workflow88 first, then audit each listed workflow. Do not conclude "CI exists"89 from a trigger or filename alone. The verdict must be about success90 semantics: which commands run, whether failures fail the job, whether91 deploy actually deploys, and whether missing secrets/env make the92 workflow fail closed.93943. **Run mandatory shortcut-audit checks.** These checks exist because95 the v4 remediation comparison found DevOps audits treated automation96 presence as a gate and missed miswired success behavior.9798 - Security scan gate check: grep every workflow for99 `continue-on-error: true`, `continue-on-error:true`, `exit-code: 0`,100 and `exit-code: '0'` on security scan steps such as Trivy, npm audit,101 Snyk, CodeQL wrappers, or custom vulnerability scans. Any match on a102 security-scan path is a finding unless a later explicit blocking gate103 proves the scan still fails the workflow.104 - Frontend build env injection check: enumerate all frontend build-time105 env vars from Vite/Next/frontend config and browser source106 (`VITE_*`, `NEXT_PUBLIC_*`, equivalent public build prefixes). Verify107 each one is injected into the deploy workflow or documented as108 intentionally absent for that deploy target. A required build env var109 missing from deploy workflow injection is a finding.110 - Deploy success-semantics check: for each deploy workflow, prove that111 an action intended to deploy cannot finish green when deploy secrets,112 environment IDs, artifact upload, or provider CLI calls are missing.113 "Workflow dispatch exists", "runs on main", or "has a deploy job" is114 only trigger presence and is not sufficient.1151164. **Walk the key questions.** For each question, run the relevant117 detection commands (greps, file reads, schema lookups). Capture118 evidence at path:line. Verify by reading the actual code.1191205. **Cross-reference orchestrator inputs.** If the orchestrator passed121 hard-stops or blind-spots findings tagged for this domain, include122 them in your report. Don't re-investigate; just include with the123 provided evidence.1241256. **Triage.** For each finding, set severity per the audit rubric and126 exploitability per R4.1271287. **Produce the domain report.**129130## Output format131132```133═══════════════════════════════════════════════════════════════════════134 DOMAIN 4: Infrastructure & DevOps135═══════════════════════════════════════════════════════════════════════136137▶ FOUNDER VIEW138139[2-4 sentences in plain English. Sample tone:]140What happens when you push to main? What happens at 3am when it breaks? This is operational maturity.141142▶ TECHNICAL EVIDENCE143144Scope of this domain audit:145 Files read: <count>146 Files skipped: <count> (reason: outside scope or low-priority)147148Findings:149150 F-4.1 — <one-line title>151 Severity: Critical | High | Medium | Low152 Exploitability: EXPLOITABLE-NOW | EXPLOITABLE-LOW-EFFORT | BAD-PRACTICE | UNKNOWN153 Hard-stop: H<N> if applicable154 Blind-spot: B<N> if applicable155156 Evidence:157 <path:line> <one-line description>158159 What's wrong:160 <one paragraph>161162 Why it matters:163 <one sentence>164165 Recommended fix:166 <one paragraph; for full fix prompt, use /audit-fix F-4.1>167168 Verification after fix:169 <command>170171 F-4.2 ...172173Summary:174 Total findings: <count>175 By severity: <counts>176 Most urgent: <which finding ID>177178[SECTION COMPLETE: Domain 4]179```180181If the domain has zero findings:182183```184▶ TECHNICAL EVIDENCE185186 ✅ No findings in this domain.187188 Verification:189 <commands run that produced no signal>190191 Confidence: High | Medium | Low192 Reason for low confidence: <if applicable>193```194195196197## Failure modes to refuse198199- ❌ Producing findings without path:line citations (R1)200- ❌ Citing a path you didn't read (R2)201- ❌ Re-running hard-stops or blind-spots walks (orchestrator did this)202- ❌ Including findings outside this domain's scope (route them to the203 right domain instead)204- ❌ Soft-pedaling a Critical to Medium because "it's a small app" (R3)205- ❌ Skipping section completion marker (R6)206---207208## Codex Port Notes209210- Audit mode is read-only for product code unless the user explicitly requests remediation.211- Treat `.claude/`, `.codex/`, `.agents/`, `.gitnexus/`, caches, `node_modules/`, virtualenvs, and generated build outputs as tooling or generated scope unless the finding is specifically repo hygiene.212- For context references written as `@.claude/context/<file>`, read `~/.codex/context\<file>` in Codex.213- Prefer PowerShell equivalents on Windows; use `rg` before `grep` and `Get-ChildItem` before Unix `find` when running in PowerShell.214- If GitNexus MCP tools are unavailable, use `.gitnexus/meta.json`, `.gitnexus/` artifacts, and `npx gitnexus` CLI as the fallback.215- Findings should also be representable as: `{id, domain, severity, exploitability, evidence_path, evidence_line, summary, impact, recommended_fix, verification}`.