team

Hook portability

Team’s runtime hooks are ported across Claude Code, Codex CLI, Antigravity CLI, and OpenCode — every host has a binding, but a binding is not the same as a verified run. Claude keeps the canonical hooks/*.mjs files. Codex and Antigravity get host-specific duplicates under hooks/<host>/. OpenCode drives the canonical files through adapters in opencode/team.js. This page is the single source of truth for where every copy lives, how it registers, what it can block, and exactly what was verified.

The hook × host matrix is the durable record. The live probe transcript (host version, exact command, input, exit code, observed output) lives in the gitignored run artifact docs/plans/2026-09-15-port-runtime-hooks/verification-report.md.

Status vocabulary

Program contract verified by direct invocation; host-firing unverified. Every verified (program) cell means the program was driven directly, not that a running host invokes it — installing the modified plugin into each host’s global cache was out of scope, so host-firing is unverified for every host, Claude included. No cell is claimed “supported” on wiring alone. Direct invocation of a hook program proves the program, not the host registration path.

Matrix

Blocking semantics describe the strongest failure channel the host honors for that event. “none” means the hook always exits 0 and only adds context.

Hook Host File path Event name Registration file Blocking semantics Status Verified host version + date
session-start-recover Claude Code hooks/session-start-recover.mjs SessionStart .claude-plugin/plugin.json none — exit 0, stderr hookSpecificOutput.additionalContext verified (program); host-firing unverified 2.1.270, 2026-09-15
pre-compact-anchor Claude Code hooks/pre-compact-anchor.mjs PreCompact .claude-plugin/plugin.json none — exit 0, stderr hookSpecificOutput.additionalContext verified (program); host-firing unverified 2.1.270, 2026-09-15
post-write-validate Claude Code hooks/post-write-validate.mjs PostToolUse (Write\|Edit) .claude-plugin/plugin.json exit 1 does not block; stderr hookSpecificOutput.additionalContext verified (program); host-firing unverified 2.1.270, 2026-09-15
validate-team-config Claude Code hooks/validate-team-config.mjs UserPromptSubmit .claude-plugin/plugin.json exit 2 blocks; stderr reason verified (program); host-firing unverified 2.1.270, 2026-09-15
session-start-recover Codex CLI hooks/codex/session-start-recover.mjs SessionStart .codex-plugin/plugin.jsonhooks/hooks.json none — exit 0, stdout hookSpecificOutput verified (program); host-firing unverified 0.154.0, 2026-09-15
pre-compact-anchor Codex CLI hooks/codex/pre-compact-anchor.mjs PreCompact .codex-plugin/plugin.jsonhooks/hooks.json none — exit 0, stdout hookSpecificOutput verified (program); host-firing unverified 0.154.0, 2026-09-15
post-write-validate Codex CLI hooks/codex/post-write-validate.mjs PostToolUse (apply_patch) .codex-plugin/plugin.jsonhooks/hooks.json exit 2 blocks; stderr reason verified (program); host-firing unverified 0.154.0, 2026-09-15
validate-team-config Codex CLI hooks/validate-team-config.mjs (reused canonical) UserPromptSubmit .codex-plugin/plugin.jsonhooks/hooks.json exit 2 blocks; stderr reason verified (program); host-firing unverified 0.154.0, 2026-09-15
session-start-recover Antigravity CLI no SessionStart event n/a gap 1.2.3, 2026-09-15
pre-compact-anchor Antigravity CLI no PreCompact event n/a gap 1.2.3, 2026-09-15
post-write-validate Antigravity CLI PostToolUse (output {}) cannot block or inject gap 1.2.3, 2026-09-15
validate-team-config Antigravity CLI hooks/antigravity/validate-team-config.mjs PreInvocation hooks.json (keyed by plugin name team) cannot block; stdout injectSteps only verified (program); host-firing unverified 1.2.3, 2026-09-15
session-start-recover OpenCode opencode/team.js (experimental.chat.system.transform) experimental.chat.system.transform opencode/team.js none — mutates output.system, cached per session verified (program); host-firing unverified 1.18.30, 2026-09-15
pre-compact-anchor OpenCode opencode/team.js (experimental.session.compacting) experimental.session.compacting opencode/team.js none — mutates output.context verified (program); host-firing unverified 1.18.30, 2026-09-15
post-write-validate OpenCode opencode/team.js (tool.execute.after) tool.execute.after opencode/team.js throws; the tool call reports the failure verified (program); host-firing unverified 1.18.30, 2026-09-15
validate-team-config OpenCode no prompt-block hook n/a gap 1.18.30, 2026-09-15

The shared validator hooks/lib/validate-plugin-file.mjs is a library, not a hook; it is called by Claude post-write-validate.mjs, Codex post-write-validate.mjs, and OpenCode tool.execute.after.

Duplicated hooks, listed

Duplication is deliberate: a host whose stdin, output envelope, or exit-code contract differs gets a readable host-native copy rather than a compatibility layer. Every duplicated copy’s header names its siblings and its exact divergence.

Logical hook Canonical copy Codex copy Antigravity copy OpenCode binding
session-start-recover hooks/session-start-recover.mjs hooks/codex/session-start-recover.mjs — (event absent) opencode/team.js reuses canonical
pre-compact-anchor hooks/pre-compact-anchor.mjs hooks/codex/pre-compact-anchor.mjs — (event absent) opencode/team.js reuses canonical
post-write-validate hooks/post-write-validate.mjs hooks/codex/post-write-validate.mjs — (cannot block) opencode/team.js calls the shared validator
validate-team-config hooks/validate-team-config.mjs reused canonical hooks/antigravity/validate-team-config.mjs — (no block channel)

The two recovery hooks keep a byte-identical inference region across all four recovery copies — hooks/session-start-recover.mjs, hooks/pre-compact-anchor.mjs, hooks/codex/session-start-recover.mjs, and hooks/codex/pre-compact-anchor.mjs — from const ID_RE to async function main(.

Per-host notes

Claude Code

The canonical files and .claude-plugin/plugin.json are the unchanged baseline. Recovery hooks write their envelope to stderr (context only); post-write-validate exits 1 and validate-team-config exits 2. Each row’s program contract was verified by direct invocation; host-firing is unverified (see the status vocabulary above).

Codex CLI

Antigravity CLI

OpenCode