Compatibility
codeArbiter’s requirements are deliberately narrow: Claude Code, Codex, or Pi, plus Python 3 on
PATH. All three hosts share .codearbiter/; see the
Claude Code + Codex evidence for the verified boundary
and the Pi install page for the ca-pi install flow.
Requirements Matrix
Section titled “Requirements Matrix”| Requirement | What’s needed | Notes |
|---|---|---|
| Claude Code | Any version with plugin support | plugin.json states no explicit minimum version; the plugin uses standard hook events (SessionStart, PreToolUse, PostToolUse) and the plugin/marketplace install commands documented in Install. |
| Codex | Minimum 0.143.0; live-verified on 0.144.1 | ca-codex uses one OS-specific handler per event and a Codex adapter that converts the shared guard verdict to structured deny output. Trust the hook set through /hooks. |
| Pi | 0.80.5 or 0.80.10 (this release line) | ca-pi is a Feature Forge preview, available and welcomed for real use while broader testing continues before stable status or a claim of 100% validation. Install it Git-only: pi install git:github.com/arbiterForge/codeArbiter@ca-pi-v<version>. Also requires Node.js 22.19+. Requires an affirmative project-trust decision before repository-aware startup. Its human-readable generated catalog is plugins/ca-pi/SKILLS.md. See Install for Pi. |
| Python | Python 3, stdlib only, available under the interpreter name your adapter registers | Claude Code carries its documented python3/python fallback shape. Codex uses OS-specific command and commandWindows handlers and fails loud if its selected interpreter is absent. Pi installs final TypeScript wrappers first, then blocks mutating calls with an interpreter breadcrumb until the Python bridge is healthy. No adapter treats that state as active enforcement. No third-party Python packages are installed or imported (ADR-0004). |
| Operating system | Windows, macOS, or Linux | Hooks are pure Python stdlib and carry no OS-specific code path beyond the interpreter-name fallback above. The .git/hooks backstop shim is a POSIX sh script; on Windows this runs under Git for Windows’ bundled sh.exe, which ships with every standard Git install. Windows is also a promoted, tested platform for ca-pi; see Windows notes. |
| git | Any reasonably current git | Required regardless of codeArbiter: the plugin reads repo state (git config user.email, branch, diff) via subprocess calls to your existing git binary, and installs the .git/hooks backstop through it. |
| Node.js | Not required for Claude Code or Codex | Node is required for ca-pi (22.19+) and is only otherwise needed to build or develop this documentation site (site/) and the optional pluggable-execution-farm TypeScript dispatcher (plugins/ca/tools/) if you use /ca:sprint --farm. Node is not a runtime dependency of the Claude Code/Codex enforcement hooks themselves. |
| Network access | Not required for enforcement | See Network Calls below. The gate-enforcement hook chain makes zero network calls; two clearly-scoped, opt-in-by-default exceptions exist outside that chain. |
Host Differences
Section titled “Host Differences”| Surface | Claude Code | Codex | Pi |
|---|---|---|---|
| Entry commands | /ca:<name> | $ca-<name> | /ca-<name> (generated alias); /skill:ca-<name> fallback |
| Plugin | ca | ca-codex | ca-pi (Feature Forge preview) |
| Distribution | Marketplace + npm-backed release | Marketplace + npm-backed release | Git tags only (ca-pi-v<version>); no npm release |
| Trust/approval | Claude Code plugin trust flow | Review through /hooks; start a fresh thread | Affirmative project-trust decision, then a fresh session |
| Statusline / footer | Available | No statusline surface | Rich footer in every interactive parent repository; governance row only when enabled and affirmatively trusted; rate-window telemetry is omitted |
| Mutation permission | Host permission flow plus gates | Codex approval plus gates | Execute mode asks before governed mutations or external side effects; hard blocks deny first |
| Plan mode | Host plan workflow | Read-only collaboration mode | Plan mode is read-only except for the current canonical spec, plan, and plan ledger |
| Background jobs | Host managed | Host managed | Bounded session-only jobs, never restored from Pi session entries; unverified cleanup blocks later launches with /ca-doctor direction |
/ca:sprint --farm | preview, shared farm.js backend | preview, shared farm.js backend | preview, same shared farm.js backend through the trusted parent extension; no Pi-native farm engine |
| Subagent/child dispatch | Plugin agents dispatched directly | Current hosts provide agent threads: codeArbiter loads the role charter and retains the thread receipt; older hosts may fall back inline, but context creation blocks without isolated scouts | Fresh child Pi processes via the parent-only codearbiter_dispatch EXEC tool; single/chain/parallel modes share bounded depth, concurrency, timeout, cancellation, and process-tree cleanup |
| Transcript pruning / compaction | Claude transcript-pruning engine | No transcript pruning; host-neutral staleness warning | Native Pi compaction event; codeArbiter does not rewrite Pi session JSONL |
| Project state | Shared .codearbiter/ store | Shared .codearbiter/ store | Shared .codearbiter/ store |
The full exception ledger with status and evidence for every host delta lives in
docs/parity.md.
Footer, permission UI, plan UI, and background jobs are parent-interactive only and absent from JSON, RPC, print, and hardened children.
Prerequisites Checklist
Section titled “Prerequisites Checklist”Confirm both before installing, per Install:
- Python 3 on
PATH. Without it, Claude Code can be inactive, Codex’s hook handler fails loud, and Pi blocks mutation. Run the host-native doctor command and require a healthy interpreter and live-fire row before treating the adapter as active. git config user.emailset. Overrides and ADRs are attributed to this identity; an unset email is asked for once, interactively, rather than silently defaulting.
Network Calls
Section titled “Network Calls”Grepping every file under plugins/ca/hooks/ for network-capable stdlib usage (urllib, http.client,
socket) turns up exactly one file that actually opens a connection: _updatelib.py. (_ledgerlib.py
matches a naive text search only because it uses the English word “requests” to mean tool-call
records. It imports nothing network-capable.)
- The gate-enforcement hooks (
pre-bash.py,pre-write.py,pre-edit.py,pre-read.py,post-write-edit.py, andsession-start.py’s activation/briefing logic) make zero network calls. Every check is a local file read, a localgitsubprocess call against your own repo, or an in-process regex/parse. This is the enforcement chain compatibility and security actually depend on. - The update-available notifier (
_updatelib.py) is a separate, non-blocking mechanism: a best-effort, once-a-day, fail-silent, unauthenticated HTTPSGETagainst GitHub’s public Releases API (api.github.com), run as a detached background process off theSessionStarthot path so a slow or unreachable network never delays a session. It only ever displays a one-line notice; it never applies an update. This ships on by default but is easy to make fully offline: see Staying up to date in the project README for the opt-out. - The pluggable execution farm (
/ca:sprint --farm, opt-in, requiresFARM_API_KEY) sends byte-capped, secret-redacted task context to an OpenAI-compatible HTTP provider you configure. This is a separate, explicitly opt-in feature, not part of the gate chain, and inert unless you pass--farm.
No hook writes anything off your machine as a side effect of enforcement. docs/hooks.md documents the
same invariant per-hook, plus the one local, read-only git fetch session-start.py runs in the
background against your own configured remote (the repo-hygiene briefing).
Third-Party Dependencies
Section titled “Third-Party Dependencies”Zero, for the plugin itself. plugins/ca/hooks/*.py import only the Python standard library: no
pip install, no requirements.txt, no compiled binaries (ADR-0004). The one TypeScript toolchain in
the repo, plugins/ca/tools/ (the farm dispatcher), carries its own devDependencies for its own
build and test. Those are irrelevant to whether the enforcement hooks run, since the hooks never
import from that package.
The docs site (site/) has its own, larger package.json (Astro, Starlight, vitest). That’s a
dependency surface for building this website, never for using the plugin.