Arbitration for Claude Code, Codex, and Pi Workflows
Shared enforcement and project-context parity across Claude Code, Codex, and Pi. Tests, reviews, and security checks are real stops in any host.
A gate catching a real mistake
- git commit -m "add payment hash"
- codeArbiter pre-commit · scanning diff...
- H-09b BLOCKED: banned crypto, createHash("md5") on line 42.
- CRITICAL: MD5 is forbidden. Replace with SHA-256 (see security-controls.md).
- No security-gate-passed marker for the changed crypto lines. Commit rejected.
- sed -i 's/createHash("md5")/createHash("sha256")/g' payment.ts
- /ca:commit
- crypto-compliance gate · reviewing changed crypto lines...
- SHA-256 confirmed. No banned primitives.
- security-gate-passed marker recorded, bound to the line digests.
- H-09b passed: marker matches the diff. Commit accepted.
- [main 3fb950c] add payment hash (sha-256)
Not a description of gates. A gate doing its job.
Three governance hosts, one shared project store. Gated lanes for every kind of work.
- Claude Code
- /plugin marketplace add arbiterForge/codeArbiter
- Marketplace added: codearbiter.
- /plugin install ca@codearbiter
- Installing ca@codearbiter ...
- Plugin installed. Hooks, commands, and agents loaded.
- All commands resolve under the /ca: namespace.
- /ca:statusline
- Wiring the statusline into ~/.claude/settings.json ...
- Statusline wired. It renders on every session.
- Codex (public marketplace)
- codex plugin marketplace add arbiterForge/codeArbiter
- codex plugin add ca-codex@codearbiter
- Review the trusted hook set in /hooks, then start a fresh thread.
- $ca-doctor
Get the Arbiter on Your Case
Choose Claude Code or Codex, shown here. All three governance hosts enforce the same project state. ca-pi is available as a Feature Forge preview, with real use and feedback welcome.

Gates are hooks, not suggestions
Every codeArbiter gate runs at its host’s hook boundary before the tool call. The shared Python guard returns one verdict; the Claude Code and Codex adapters surface that verdict in their native hook protocols.
Prompt-layer rules still matter. They are the model’s judgment for everything a hook does not reach. Hooks are the backstop for the moment that judgment slips: a blocking gate does not ask the model to agree, it stops the call.
Every block names the gate that caught it. A BLOCKED [H-09b] line in
your terminal points at an entry in the hook gates reference, with the exact
condition and the exact message the hook prints.
How a gate fires
- A shell or write call reaches the host’s
PreToolUseboundary. - The matching hook runs first, against the repository’s current state.
- It allows the call or blocks with a
BLOCKED [H-xx]message.
Who this is for
Built for
- Teams and solo developers who want an audit trail, not a changelog written after the fact.
- Compliance-minded adopters who need to show a control actually ran.
- Anyone who has watched an agent commit untested code and wants that failure mode closed.
- Brownfield repos that need governance layered on, not a rewrite.
Not built for
- A quick throwaway script you plan to delete in an hour.
- Anyone who finds any gate friction unacceptable, even a fixable one.
- A repo where you do not want a
.codearbiter/state directory checked in.
- 21gate IDs enforced
- 39slash commands
- 28specialist agents
- 22skills
- stdlib-onlyevery hook is stdlib-only Python, no third-party dependencies
Docs source map
Update the right layer
The site mixes handcrafted pages with generated reference. Edit the source that owns the page, or the next generator run will overwrite the wrong change.
Handcrafted docs
Guides, concepts, install, FAQ, and this landing page live under
site/src/content/docs/. These pages are safe to tune directly.
Generated reference
Command, skill, agent, hook-gate, and changelog pages come from
site/scripts/gen.ts, plugins/ca/, and
site/src/curated/. Change those inputs, then regenerate.
Root context
Repo-level docs such as README.md, CHANGELOG.md,
and docs/*.md stay source-of-truth material. The site should
point at them or render from them, not drift into a fork.
Three ways in
Learn
Understand what a gate is and why the lane model exists before you touch a command.
Use
Get codeArbiter installed and take your first change through a gated lane.
Look up
Find the exact command, gate ID, or hook behavior you are checking against.
Turning it off is documented too: disable per-repo with one frontmatter flag, or uninstall entirely.