An autonomous coding loop that can't grade its own homework.

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.

planimplementcodex reviewfixcommit gateverify: types + testsdone
loops while P0 / P1 / P2 findings remain · round cap 3 · every round leaves an audit file on disk

How it stays honest

Most agent loops are maker and checker from the same vendor. Camus separates them.

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.

Tests have the last word

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.

Infra failure ≠ findings

Codex not running is ran:false: retried, never treated as a rejection or a pass. Missing deps is verify_inconclusive, not broken code.

Work provably lands

A commit gate after review: nothing staged means no_changes, never a task silently marked done. Every done carries its commit_sha.

Reviews leave receipts

Every round writes Codex's raw output to ~/.camus/reviews/. A missing file means the review never ran.

Scripts stay in bounds

Every gate script is bound to the calling repo, camus/* branches and camus-wt-* worktrees. Anything else is rejected.

Autonomy, bounded

No permission prompts when that's safe. A question when a task is genuinely ambiguous.

Run it

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