codex
Drive the codex CLI (GPT-6 astra) as a delegate — debugging, test writing, scoped implementation. Not for reviews, which go to Opus subagents. Read BEFORE invoking codex.
SKILL.md.claude/skills/codex/SKILL.md
GitHubCodex Delegation
codex is an installed CLI agent backed by GPT-6 astra — cheap, strong, and
independent of this session's blind spots. Use it for root-causing a bug,
adding tests to probe behavior, and implementing well-scoped tasks. Reviews of
plans and code go to Opus subagents instead (the pr skill), not to codex.
Invocation
codex exec -m gpt-6-astra -c model_reasoning_effort=xhigh \
--dangerously-bypass-approvals-and-sandbox \
-o /tmp/codex-<topic>.md \
"<prompt>"
- Always pass
-o— it writes the final reply to a file; stdout mixes it into the transcript and truncates easily.-oholds only the last assistant message: never point it at a file the prompt asks codex to write its report to (or one it might guess) — the message overwrites the report. When the prompt names a report file, give-oa clearly different name (*-final-message.md). - The full bypass is deliberate: the sandbox breaks builds and tooling. Codex therefore runs with your permissions — scope the prompt accordingly.
- xhigh runs take minutes to tens of minutes: run in the background and keep
working, no sleep polling. A background
codex execmust get< /dev/null: with a non-TTY stdin it reads the pipe for extra input and blocks forever (the prompt argument does not help). The same applies to Node — spawn it withstdio: ["ignore", ...]. Right after launch,headthe log and confirm thesession idheader appeared; a live process alone proves nothing. - The startup header prints
session id: <uuid>— capture it whenever a follow-up round is plausible. - If
gpt-6-astrais rejected (plan/auth), drop-mto use the account default, and say so when reporting results. -c service_tier=fastswitches the run to the fast service tier; use it when the maintainer asks for speed (long migrations, translation passes).- Prompt shape: the task, the exact files/commands in scope, and the answer format you want (e.g. "numbered findings, each with a minimal counterexample"). Codex reads files itself — point at paths instead of pasting content.
- Codex does not auto-load
.claude/docs — it discovers onlyAGENTS.md, which this repo does not have. Any run that should follow project rules (test writing, implementation) must be told in the prompt which rule files to read first, e.g..claude/CLAUDE.mdand the cpp-style skill.
Multi-round sessions
codex exec resume <session-id> "<follow-up>" continues with full context
(--last picks the newest session). Use it for successive adversarial rounds,
"now fix what you found", or clarifying questions — never restate context in a
fresh session. Execution-scoped flags are NOT inherited from the resumed
session: repeat -m gpt-6-astra, -c model_reasoning_effort=xhigh,
--dangerously-bypass-approvals-and-sandbox, and a fresh -o path on every
resume, or the follow-up silently runs on the default model at default
effort, sandboxed, and without an output file. codex exec fork <session-id> branches one history
into independent continuations.
Wording
Prompts and everything codex reads go through OpenAI's cybersecurity
filter, which judges phrasing, not intent, and kills the session mid-run
(the content stays in that session's history, so resume trips it again —
only a fresh session recovers). Rules:
- Use QA vocabulary: "review", "latent correctness defects", "regression check". Never "attack surface", "hunt/dig for bugs", "fabricate the conditions for the bug"; a negative control is "a control variant expected to fail". Open with the fact that this is routine quality work on our own open-source project (the repo's git config and LICENSE back it up).
- Do not feed codex internal notes written in hunting slang — extract the scope into a neutral file and keep the ledger edits on this side. Ask for terse, report-only output: long analytical prose triggers the filter too.
- Successive rounds
resumethe same session (or list the prior findings as exclusions), or the round re-reports what is already known.
Discipline
- Codex output is hypothesis, not verdict. Every concrete claim ("this input breaks it") gets an empirical probe before you act on it; "looks fine" carries no weight. Experience runs both ways — codex has correctly refuted arguments this side was sure of, and confidently asserted things a probe then disproved. The probe decides, never authority.
- When codex edits code (implementation, debug fixes, new tests): review its diff as you would a PR — you own what gets committed. Verification (build + suites) happens in the main session, and the hard rules (never weaken tests, never push unverified) apply unchanged to codex-authored code. Any run that may modify files gets its own git worktree — the main checkout is for analysis-only runs, or edits will race with this session's.
- Don't run the same build tree or test suites from codex and this session
concurrently — they race on
build/<preset>/and test state. Either codex runs them and you don't, or codex analyzes and you verify. - Keep codex's raw output out of the main context. Progress checks on a background run (log tail, new commits, report landed?) and the review of a codex-authored diff go through a cheaper subagent that returns a digest or ranked findings; the main session spot-checks and decides.
Recipes
- Debug: give the failing test, the repro command, and the suspect area; ask for a root-cause hypothesis plus the experiment that would confirm it. Let it run the repro itself.
- Test writing: point it at 2-3 neighboring test files as the template;
ask it to add cases probing a specific behavior and report which outcomes
look wrong versus expected, following the test-style skill. Tell it to run
tests via
pixi run test, or with--snapshot-dir=tests/snapshotswhen invokingunit_testsorsystem_testsdirectly. - Implementation: a well-scoped task with acceptance criteria and pointers to the 2-3 existing modules whose structure it should copy. Then review the result with Opus subagents (the pr skill) and verify it.
Recovery
To stop a hung run, kill the PID you recorded at launch ($! for a shell
background job, the task's PID otherwise) and its subtree — other codex
runs may be live in parallel. When the PID is lost, pgrep -af 'codex exe[c]' lists the candidates to pick from; never pkill -f 'codex exec',
which matches your own shell's command line and kills it.
If a run dies before writing -o, the transcript is at
~/.codex/sessions/YYYY/MM/DD/*.jsonl; the final reply is the last record
with payload type == "message" and role == "assistant". These transcripts
persist indefinitely and record full prompts, file contents, and command
output — treat ~/.codex/sessions/ as sensitive local data.