Skip to content

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.

Published release applicability

This documentation build identifies each independently published governance host from the repository's original-publication receipts.

Published governance host releases described by this documentation
TargetPublished versionTagPublication commit
ca2.17.11v2.17.11d6900d96f0b6
ca-codex0.9.11ca-codex-v0.9.11d6900d96f0b6
ca-pi0.10.13ca-pi-v0.10.13d6900d96f0b6

Documentation build: 516cfcd67a9b

Evidence boundary: release-and-build-identity. This record does not certify runtime compatibility, installation success, or universal host support. Read the complete machine-readable applicability record for the exact identities and evidence sources.

RequirementWhat’s neededNotes
Claude CodeAny version with plugin supportplugin.json states no explicit minimum version; the plugin uses standard hook events (SessionStart, PreToolUse, PostToolUse) and the plugin/marketplace install commands documented in Install.
CodexMinimum 0.143.0; live-verified on 0.144.1ca-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.
Pi0.84.1 (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 with pi install npm:@arbiterforge/ca-pi, or pin the reproducible Git tag: 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.
PythonPython 3, stdlib only, available under the interpreter name your adapter registersNo minimum Python 3 minor is currently declared. CI exercises the runner’s current Python 3 on Windows, macOS, and Linux; focused Windows hook evidence also covers CPython 3.10, 3.12, and 3.14. 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 systemNative Windows, macOS, or Linux runtime with a checkout created and used by that runtime’s GitThe .git/hooks backstop is a POSIX sh script. On Windows, Git for Windows runs it with its bundled sh.exe. Git Bash is part of that native Windows cell and is not WSL. Windows is also a promoted, tested platform for ca-pi; see Windows notes. Linked-worktree support uses Git’s default <main>/.git/worktrees storage layout. See Git runtime boundary for layout and mixed-runtime exclusions.
gitA Git binary that provides rev-parse --git-path hooks, rev-parse --path-format=absolute --git-dir --git-common-dir, and git hook run; ADR lifecycle proof requires Git 2.45.0+ with --no-lazy-fetchcodeArbiter asks the selected Git binary for its effective hook and shared-worktree paths, then doctor uses that same binary for a harmless managed pre-push live-fire probe with empty input. That binary’s accepted core.hooksPath grammar is authoritative, including its expansion of values such as ~, %(prefix), absolute paths, and relative paths. The lifecycle verifier additionally enforces the offline capability described below.
Node.jsNot required for Claude Code or CodexNode 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 accessNot required for enforcementSee Network Calls below. The gate-enforcement hook chain makes zero network calls. Active arbiter startup has separate background Git-fetch and update-check behavior; the execution farm remains opt-in.

Hook registration and linked-worktree metadata are supported when one native runtime owns the checkout and continues to use it with that runtime’s Git, Python, and hook shell.

Repository useStatusEvidence and boundary
Windows checkout and linked worktrees created and used by Git for WindowsSupported with Git’s default worktree layoutActual Git for Windows tests resolve and execute managed hooks from both the primary checkout and a linked worktree. Both native absolute and native relative worktree-admin pointers resolve to the primary marker root. Git for Windows’ bundled sh.exe is the hook shell. A live Git 2.55.0 probe also resolved a primary and linked worktree through a localhost UNC share after that path was explicitly trusted by Git’s safe.directory policy; without Git trust, resolution fails closed. This is not a general claim for every remote SMB server.
Linux checkout and linked worktrees created and used by native Linux GitSupported with Git’s default worktree layoutThe hook suite runs on the Ubuntu CI cell. Paths and registry entries remain in one native dialect.
macOS checkout and linked worktrees created and used by native macOS GitSupported with Git’s default worktree layoutThe hook suite runs on the macOS CI cell. Paths and registry entries remain in one native dialect.
WSL-owned checkout and worktrees used only by WSLNot separately verifiedThis resembles the native Linux cell, but WSL is not a named, proven product cell yet. Do not promote that inference to a support claim without WSL-specific end-to-end evidence.
One physical repository or shared .git alternated between Windows Git and WSL GitUnsupportedRegistry paths, generated shell paths, and trusted executable identities use one runtime’s path dialect. codeArbiter does not translate or maintain parallel runtime identities.
Windows-created linked worktree used through WSL, or the reverseUnsupportedForeign .git pointer paths are rejected rather than treated as relative local paths. In the directly tested Windows-to-WSL direction, WSL Git itself rejects the foreign worktree metadata before codeArbiter runs.
Linked worktree backed by git init --separate-git-dirUnsupportedGit can resolve this layout, but it may not retain the user-supplied primary as the main worktree. codeArbiter escalates only when both the linked checkout and Git’s reported main candidate own real CONTEXT.md files that independently satisfy the canonical activation parser; ordinary separate storage lacks that identity and marker writes stay local. A storage directory deliberately carrying its own enabled identity is inside the local-filesystem trust boundary, not a promoted support cell.

core.hooksPath follows the selected Git binary, not a codeArbiter-specific subset. Doctor checks the effective directory reported by that binary, requires both current executable managed shims there, requires at least one live registered enforcer, and asks Git to run the managed pre-push shim with empty input before reporting the backstop healthy.

On Claude Code, Codex, and Pi, ADR lifecycle verification and its merge-method preflight require Git 2.45.0+ with --no-lazy-fetch. Git 2.45 introduced this option to prevent implicit object retrieval from promisor remotes. This repository’s CI lifecycle checker uses the same requirement. It does not change the unrelated hook-registration paths above.

Every proof read retains the flag. If a read fails, the verifier checks the same selected executable with git --no-lazy-fetch --version, without reading a repository. An unavailable capability produces an upgrade prerequisite instead of a misleading invalid-ref error; a supported Git’s ordinary ref or object failure remains a proof failure. Enforcement checks the actual flag capability, not a parsed version string, and never retries a proof read without the protection. Missing committed objects still block verification: the verifier neither fetches them nor substitutes current working-tree bytes.

SurfaceClaude CodeCodexPi
Entry commands/ca:<name>$ca-<name>/ca-<name> (generated alias); /skill:ca-<name> fallback
Plugincaca-codexca-pi (Feature Forge preview)
DistributionMarketplace + npm-backed releaseMarketplace + npm-backed releaseGit tags (ca-pi-v<version>) + npm (@arbiterforge/ca-pi)
Trust/approvalClaude Code plugin trust flowReview through /hooks; start a fresh threadAffirmative project-trust decision, then a fresh session
Statusline / footerAvailableNo statusline surfaceRich footer in every interactive parent repository; governance row only when enabled and affirmatively trusted; rate-window telemetry is omitted
Mutation permissionHost permission flow plus gatesCodex approval plus gatesExecute mode asks before governed mutations or external side effects; hard blocks deny first
Plan modeHost plan workflowRead-only collaboration modePlan mode is read-only except for the current canonical spec, plan, and plan ledger
Background jobsHost managedHost managedBounded session-only jobs, never restored from Pi session entries; unverified cleanup blocks later launches with /ca-doctor direction
/ca:sprint --farmpreview, shared farm.js backendpreview, shared farm.js backendpreview, same shared farm.js backend through the trusted parent extension; no Pi-native farm engine
Subagent/child dispatchPlugin agents dispatched directlyCurrent hosts provide agent threads: codeArbiter loads the role charter and retains a receipt when evidence requires one. A bounded 0.9.4 receipt proves one exact installed-charter review, not enforced isolation or every route. Older hosts may fall back inline, but context creation blocks without isolated scoutsFresh 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 / compactionClaude transcript-pruning engineNo transcript pruning; host-neutral staleness warningNative Pi compaction event; codeArbiter does not rewrite Pi session JSONL
Project stateShared .codearbiter/ storeShared .codearbiter/ storeShared .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.

Confirm these 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.email set. Overrides and ADRs are attributed to this identity; an unset email is asked for once, interactively, rather than silently defaulting.
  • Git 2.45.0+ with --no-lazy-fetch for ADR lifecycle proof. The selected binary must provide the flag; a missing capability blocks the governed merge preflight and names the upgrade action.

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, and session-start.py’s activation/briefing logic) make zero network calls. Every check is a local file read, a local git subprocess call against your own repo, or an in-process regex/parse. This is the enforcement chain compatibility and security actually depend on.
  • The repository-status fetch is launched by default for an active arbiter session. It runs git fetch --quiet --no-tags against the repository’s configured remote as a detached, fail-silent process. It can update local remote-tracking refs and Git objects, but it never writes to the remote and never delays the startup briefing.
  • The update-available notifier (_updatelib.py) is a separate, non-blocking mechanism: a best-effort, once-a-day, fail-silent, unauthenticated HTTPS GET against GitHub’s public Releases API (api.github.com), run as a detached background process off the SessionStart hot path so a slow or unreachable network never delays a session. It only ever displays a one-line notice; it never applies an update. The background check runs automatically when its cache is stale, at most once per day. There is no user-facing opt-out in the current release line.
  • The pluggable execution farm (/ca:sprint --farm, opt-in, requires FARM_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 and the two default background startup activities described above.

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.