Skip to content

Hook Gates

These gate IDs appear in terminal output as BLOCKED [H-xx]: <message> (a blocking hook, exit 2) or REMINDER [H-xx]: <message> (an advisory hook, exit 0). This page is generated at build time directly from the block()/remind() call sites in plugins/ca/hooks/*.py, so it can never drift from what a hook actually prints.

A `{placeholder}` shown in a message is an f-string interpolation — the hook fills it in with a run-time value (a file path, a branch name, a count) when it actually fires.

Blocking

Event(s): PreToolUse (Bash|PowerShell), PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

pre-bash guard crashed while scanning this command — failing closed (ORCHESTRATOR §2) rather than silently allowing an unscanned command. See the traceback above; retry, or report it.

pre-bash.py:68

pre-edit guard crashed while scanning this Edit — failing closed (ORCHESTRATOR §2) rather than silently allowing an unscanned edit. See the traceback above; retry, or report it.

pre-edit.py:231

pre-write guard crashed while scanning this Write — failing closed (ORCHESTRATOR §2) rather than silently allowing an unscanned write. See the traceback above; retry, or report it.

pre-write.py:150


Blocking

Event(s): git backstop

branch state could not be determined (git unavailable or timed out) — failing closed (ORCHESTRATOR §2). Retry, or verify you are not on main/master before committing/pushing.

_bashguardlib.py:805

HEAD’s protected-branch-tip state could not be determined (git unavailable or timed out) — failing closed (ORCHESTRATOR §2). Retry, or verify HEAD before committing.

_bashguardlib.py:816

Direct commit to {target} is prohibited (ORCHESTRATOR §3). Create a feature branch.

_bashguardlib.py:846

‘git push —all’ / ‘—mirror’ publish every local ref (including main) (ORCHESTRATOR §3) — main moves only via a merged PR. Push an explicit feature refspec.

_bashguardlib.py:875

Pushing to a protected branch (‘{tok}’) is prohibited (ORCHESTRATOR §3) — main moves only via a merged PR.

_bashguardlib.py:887

Bare git push from main/master publishes the protected branch (ORCHESTRATOR §3) — main moves only via a merged PR.

_bashguardlib.py:893

‘git -C {cwd}’ does not resolve to an existing directory — failing closed (ORCHESTRATOR §2). Verify the -C target exists before committing/pushing.

_bashguardlib.py:1149

branch state could not be determined (git unavailable or timed out) — failing closed (ORCHESTRATOR §2, #161 git backstop).

git-enforce.py:205

HEAD’s protected-branch-tip state could not be determined (git unavailable or timed out) — failing closed (ORCHESTRATOR §2, #161 git backstop).

git-enforce.py:212

Direct commit to {target} is prohibited (ORCHESTRATOR §3) — this is the git-level backstop (#161). Create a feature branch.

git-enforce.py:217

Pushing to a protected branch (‘{rref}’) is prohibited (ORCHESTRATOR §3, #161 git backstop) — main moves only via a merged PR.

git-enforce.py:281


Blocking

Event(s): git backstop

Force-push is prohibited (ORCHESTRATOR §3).

_bashguardlib.py:870

Force-push / non-fast-forward update is prohibited (ORCHESTRATOR §3, #161 git backstop).

git-enforce.py:290


Blocking

Event(s): (none registered)

‘git add -A’ / ‘git add .’ / ‘git add —all’ / ‘git add -u’ are prohibited. Stage files explicitly (commit-gate skill).

_bashguardlib.py:905

Wildcard staging is prohibited — {why} stages a non-explicit file set. Stage files explicitly, one path per file (commit-gate skill).

_bashguardlib.py:909


Blocking

Event(s): PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

The .codearbiter audit logs (overrides.log, triage.log, sprint-log.md, gate-events.log) are append-only (ORCHESTRATOR §7). Truncating, overwriting, or deleting the audit trail is prohibited; append with ’>>’ only.

_bashguardlib.py:926

MultiEdit cannot guarantee a pure append to an append-only .codearbiter audit log (overrides.log, triage.log, sprint-log.md) (ORCHESTRATOR §7). Append with a single Edit or ’>>’.

pre-edit.py:149

An Edit with replace_all=true on an append-only .codearbiter audit log (overrides.log, triage.log, sprint-log.md) cannot be a verifiable pure append (ORCHESTRATOR §7) — replace_all rewrites every matching occurrence, not just the file’s tail. Append with ’>>’, or a single non-replace_all Edit whose old_string is the file’s current trailing content.

pre-edit.py:160

An Edit with an empty old_string on an append-only .codearbiter audit log (overrides.log, triage.log, sprint-log.md) cannot be a verifiable pure append (ORCHESTRATOR §7) — every string starts with the empty string. Append with ’>>’, or a single Edit whose old_string is the file’s current trailing content.

pre-edit.py:174

The .codearbiter audit logs (overrides.log, triage.log, sprint-log.md) are append-only (ORCHESTRATOR §7). This Edit alters existing audit lines; only pure appends are permitted (new text must extend the old text).

pre-edit.py:180

The .codearbiter audit logs (overrides.log, triage.log, sprint-log.md) are append-only (ORCHESTRATOR §7). This Edit’s old_string is not the file’s current TRAILING content — a mid-file insertion reorders the audit record even though new_string extends old_string. Append with ’>>’, or a single Edit whose old_string is exactly the file’s current tail.

pre-edit.py:192

The .codearbiter audit logs (overrides.log, triage.log, sprint-log.md) are append-only (ORCHESTRATOR §7). Append with Edit or ’>>’, never Write.

pre-write.py:96

The .codearbiter audit logs (overrides.log, triage.log, sprint-log.md) are append-only (ORCHESTRATOR §7). A patch cannot express a verifiable pure append; append with ’>>’ instead.

pre-write.py:101


Advisory

Event(s): PostToolUse (Write|Edit)

Dependency manifest changed. Dispatch dependency-reviewer before committing (ORCHESTRATOR §5).

post-write-edit.py:122


Advisory

Event(s): PostToolUse (Write|Edit)

Crypto/TLS pattern detected. Run the crypto-compliance check + dispatch auth-crypto-reviewer (no MD5/SHA1/DES/3DES/RC2/RC4/Blowfish; do not disable TLS verification). The commit will block until the gate records a pass.

post-write-edit.py:151


Blocking

Event(s): git backstop

the diff for the crypto/secret security scan could not be read (git unavailable or timed out) — failing closed (ORCHESTRATOR §2). Retry, or run the crypto-compliance / secret-handling gate, then commit.

_bashguardlib.py:1006

This commit introduces {kind} changes, but no security-gate pass is recorded (.codearbiter/.markers/security-gate-passed). Run the {skill} gate (it records the pass), then commit. To bypass a security gate, /override requires its heavier security-acknowledgement path.

_bashguardlib.py:1020

{len(uncovered)} {kind} line(s) in this commit are not covered by the recorded security-gate pass — the pass is bound to the exact lines it reviewed, and these changed (or appeared) after it ran. Re-run the {skill} gate so it reviews the current diff and re-records the binding, then commit.

_bashguardlib.py:1032

the staged diff for the crypto/secret scan could not be read — failing closed (ORCHESTRATOR §2).

git-enforce.py:224

This commit introduces {kind} changes, but no security-gate pass is recorded (#161 git backstop). Run the {skill} gate, then commit.

git-enforce.py:235

{len(uncovered)} {kind} line(s) in this commit are not covered by the recorded security-gate pass (#161 git backstop) — re-run the {skill} gate so it reviews the current diff, then commit.

git-enforce.py:240


Advisory

Event(s): PostToolUse (Write|Edit)

Possible hardcoded secret. Run the secret-handling check before committing. The commit will block until the gate records a pass.

post-write-edit.py:157


Blocking

Event(s): git backstop

This commit introduces {kind} changes, but no security-gate pass is recorded (.codearbiter/.markers/security-gate-passed). Run the {skill} gate (it records the pass), then commit. To bypass a security gate, /override requires its heavier security-acknowledgement path.

_bashguardlib.py:1020

{len(uncovered)} {kind} line(s) in this commit are not covered by the recorded security-gate pass — the pass is bound to the exact lines it reviewed, and these changed (or appeared) after it ran. Re-run the {skill} gate so it reviews the current diff and re-records the binding, then commit.

_bashguardlib.py:1032

This commit introduces {kind} changes, but no security-gate pass is recorded (#161 git backstop). Run the {skill} gate, then commit.

git-enforce.py:235

{len(uncovered)} {kind} line(s) in this commit are not covered by the recorded security-gate pass (#161 git backstop) — re-run the {skill} gate so it reviews the current diff, then commit.

git-enforce.py:240


Blocking

Event(s): PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

ADR files under .codearbiter/decisions/ are authored only via /adr and are immutable history (ORCHESTRATOR §6) — shell writes, edits, and deletions there are prohibited.

_bashguardlib.py:937

ADR files are edited only via /adr (ORCHESTRATOR §3) — user attribution required.

pre-edit.py:205

ADR authoring marker is stale (>30 min). Re-run /adr.

pre-edit.py:208

ADR files under .codearbiter/decisions/ are immutable history (ORCHESTRATOR §6) — deleting one is prohibited, marker or not.

pre-write.py:110

ADR files are authored only via /adr (ORCHESTRATOR §3) — user attribution required. Subagent-authored ADRs are prohibited.

pre-write.py:114

ADR authoring marker is stale (>30 min). Re-run /adr.

pre-write.py:117


Advisory

Event(s): PostToolUse (Write|Edit)

{rel} is governed by ADR-{entry['adr']} ({entry['title']}). If this change contradicts it, route to {get_host().cmd_ref('reconcile')} or {get_host().cmd_ref('adr')} — do not drift silently.

post-write-edit.py:114


Advisory

Event(s): PostToolUse (Write|Edit)

{rel}: em/en dash used as a prose separator on line(s) {shown}``{more} (anti-slop-design §3.A). Restructure the prose and run the §3.A/§3.B copy self-audit before committing.

post-write-edit.py:169


Blocking

Event(s): git backstop

the file list for the migration scan could not be read (git unavailable or timed out) — failing closed (ORCHESTRATOR §2). Retry, or run the migration-review gate, then commit.

_bashguardlib.py:1073

{len(uncovered)} staged migration file(s) lack a recorded migration-review pass: {', '.join(uncovered)}. commit-gate dispatches migration-reviewer and records the pass via hooks/migration-pass.py; run that review, then commit. To bypass a migration gate, /override logs the exception.

_bashguardlib.py:1092

the staged file list for the migration scan could not be read — failing closed (ORCHESTRATOR §2).

git-enforce.py:247

{len(uncovered)} staged migration file(s) lack a recorded migration-review pass (#161 git backstop): {', '.join(uncovered)}. Run the migration-review gate, then commit.

git-enforce.py:258


Advisory

Event(s): PostToolUse (Write|Edit)

CI/CD workflow changed. Dispatch security-reviewer before merging (it reviews workflow/secrets/permissions exposure). Advisory — not a commit block.

post-write-edit.py:129


Advisory

Event(s): PostToolUse (Write|Edit)

Deployment/IaC manifest changed. Dispatch security-reviewer before merging (it reviews exposed ports, public ACLs, disabled encryption, privilege). Advisory — not a commit block.

post-write-edit.py:136


Advisory

Event(s): PostToolUse (Write|Edit)

Auth/authorization logic detected. Dispatch security-reviewer before merging (authn on every protected route; authz at the right layer). Advisory — not a commit block.

post-write-edit.py:144


Blocking

Event(s): PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

.codearbiter/CONTEXT.md is the activation switch every enforcement hook reads (#159) — shell rewrites, edits, or deletions that could flip arbiter: enabled off or corrupt its frontmatter are prohibited. Edit it through the sanctioned init path.

_bashguardlib.py:947

This Edit would remove or alter the arbiter: enabled frontmatter in .codearbiter/CONTEXT.md (#159) — the activation switch every enforcement hook reads. Disabling it from inside the repo would make every gate dormant. Keep arbiter: enabled in a well-formed frontmatter block.

pre-edit.py:133

This Write would remove or alter the arbiter: enabled frontmatter in .codearbiter/CONTEXT.md (#159) — the activation switch every enforcement hook reads. Disabling it from inside the repo would make every gate dormant. Keep arbiter: enabled in a well-formed frontmatter block.

pre-write.py:77

This patch operation edits or deletes .codearbiter/CONTEXT.md (#159) — the activation switch every enforcement hook reads — and its resulting frontmatter cannot be verified from patch hunks. Failing closed; use the sanctioned init path (or ).

pre-write.py:86


Blocking

Event(s): PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

The .codearbiter/.markers/ security-gate-passed / migration-gate-passed tokens are recorded only by the sanctioned gate producers (#160) — a shell redirect, write verb, or interpreter invocation (python/node/perl/ruby/sh) naming a gate marker forges a security/migration gate pass and is prohibited.

_bashguardlib.py:973

The .codearbiter/.markers/ gate tokens are not editable via the Edit tools (#160) — editing one forges or tampers with a security/migration/ADR gate pass. Markers are recorded only by the sanctioned gate producers.

pre-edit.py:121

The .codearbiter/.markers/ gate tokens are not writable via the Write tool (#160) — a hand-written marker forges a security/migration/ADR gate pass. Markers are recorded only by the sanctioned gate producers.

pre-write.py:64


Blocking

Event(s): (none registered)

‘—no-verify’ / ‘-n’ on git commit skips the .git/hooks git-enforce backstop entirely (appsec-002) — every commit-time gate (H-01/H-02/H-09b/H-10b/H-14) would go unenforced for this commit. Remove the flag; use /override for a sanctioned bypass.

_bashguardlib.py:832

‘—no-verify’ on git push skips the .git/hooks git-enforce backstop entirely (appsec-002) — every push-time gate would go unenforced for this push. Remove the flag; use /override for a sanctioned bypass.

_bashguardlib.py:863


Blocking

Event(s): PreToolUse (Edit|MultiEdit|NotebookEdit), PreToolUse (Write)

This edit could not be decomposed into per-file operations, so its targets cannot be guarded. Failing closed. Retry, or report it.

pre-edit.py:103

This patch envelope could not be decomposed into per-file operations, so its targets cannot be guarded. Failing closed. Re-issue the change as a plain patch in the documented apply_patch grammar (or split it into smaller single-file patches).

pre-write.py:52