Cross-vendor review
The reviewer is codex, not another Claude. A thin runner relays its JSON verbatim; Claude never re-judges the verdict. Each round gets a fresh Codex session, so findings are re-raised.
Camus runs your coding tasks from plan to verified commit, unattended. Claude writes the code. Codex, a different vendor's model, reviews every change. Your own tests have the final word.
Most agent loops are maker and checker from the same vendor. Camus separates them.
The reviewer is codex, not another Claude. A thin runner relays its JSON verbatim; Claude never re-judges the verdict. Each round gets a fresh Codex session, so findings are re-raised.
A clean review doesn't ship code that fails type-check or test. If no verifier is found, that is a failure, not a pass.
Codex not running is ran:false: retried, never treated as a rejection or a pass. Missing deps is verify_inconclusive, not broken code.
A commit gate after review: nothing staged means no_changes, never a task silently marked done. Every done carries its commit_sha.
Every round writes Codex's raw output to ~/.camus/reviews/. A missing file means the review never ran.
Every gate script is bound to the calling repo, camus/* branches and camus-wt-* worktrees. Anything else is rejected.
No permission prompts when that's safe. A question when a task is genuinely ambiguous.
One egress trust line and allow rules for five gate scripts. Not bypassPermissions, no broad shell access.
autonomous · ask_on_ambiguity (default) · ask_on_major. An ambiguous task halts with a question; your answer resumes the same run.
Every judgment call lands in the report with the reason and the rejected alternative. You review decisions, not just diffs.
Trivial work goes to Sonnet, the rest to Opus. Persistent findings escalate the fix model. Override with model: or modelTier:.
Resumed with their exact original arguments. Done tasks skip; the unfinished one re-runs.
You need Claude Code (subscription), the Codex CLI (authenticated), node, python3, and a repo you trust.
# one-time $ npm i -g camus-cli $ camus install # skill + workflows → ~/.claude (frozen copy) $ camus auto-setup # opt-in: scoped unattended profile # per run, from your repo $ camus check # gate in sync? $ export CAMUS_REPO_ROOT="$(pwd -P)" $ export CAMUS_VERIFY_CMD="pnpm type-check && pnpm test" $ claude --permission-mode auto > /camus-feat { feat: "Harden input boundaries", tasks: [...] } ✓ env + baseline · 3/3 tasks done · integration verify green ✓ report → ~/.camus/reports/harden-input-boundaries-x1f9q2.json