Safety is enforcement, not prompts. The boundary is the container and the hash — not a request in a system message.
Isolation
Docker sandbox only
All generated code runs in a pinned-image container: --network none, read-only root, dropped capabilities, bounded PID/memory/CPU/time. Never on the host.
Credentials
No host secrets
Sandbox and verifier receive no host secrets, home, or auth mounts. Outbound network is denied by default.
Model access
ChatGPT-login only
Local Codex CLI via Sign in with ChatGPT — no OpenAI Platform API billing. OPENAI_API_KEY, CODEX_API_KEY, and CODEX_ACCESS_TOKEN are rejected even when empty.
Scope
One bounded candidate
A single repair attempt capped at ≤5 files and ≤250 changed lines. No dependencies, lockfiles, CI, infra, migrations, secrets, or verifier weakening.
Provenance
Write-once, hash-bound
Snapshots, results, evidence, proof bytes, diffs, and terminal status are persisted immutably and cross-bound by hash, so every claim reads back independently.
Failure posture
Fail-closed
Missing, contradictory, tampered, timed-out, or uncertain evidence stays INCONCLUSIVE or REJECTED — never promoted to PASS.
Approval
Hash-bound human decision
Approval binds to the exact candidateId + current combinedDiffHash, and exports the verified diff and rollback handle only — it never merges or deploys.
Fixture plane
Labeled, unapprovable
The fixture control plane is conspicuously labeled and terminates as INCONCLUSIVE. Fixture-mode candidates can never reach approval.