evolve guard <name> reads the tool call as JSON on stdin and exits 0 (allow) or 2 (deny), logging byte-compatibly to .evolve/guards.log (go/internal/cli/guardcmd/guard.go:100-165). Guards: ship, phase, role, docdelete, quota, chain.go/internal/guards/ship.go:33-61): denies any Bash containing git commit/git push/gh release unless it goes through evolve ship — heredoc bodies stripped first so payloads can’t smuggle verbs.role.go:28-91): Edit/Write must match the active phase’s allowlist — workspace, or the lane worktree for tdd/build. A narrow control-plane surface (guards, ACS regression, audit skills, settings, policy — integrity_surface.go:29-64) is denied to EVERY phase and raises a CRITICAL integrity alarm.go/internal/phases/ship/audit.go:49-176): a cycle ship requires the latest auditor ledger entry to match the exact tree — HEAD, sha256(git diff HEAD), artifact SHA, verdict PASS, EGPS red_count==0, ≤7 days old. Change anything after audit and ship refuses (the AUDIT_BINDING_HEAD_MOVED you see under fleet contention is this working)..claude/settings.json:4-44): five PreToolUse hooks; each resolves go/bin/evolve first, falling back to the tracked go/evolve.guards.Phase only inspects ToolName=="Agent" (phase.go:26-49) but is wired under the Bash matcher, so as configured it never fires. Real phase-order enforcement is the in-process state machine (statemachine.go + SpineSatisfiedUpTo). Several docs still describe the hook as the enforcer.The control-plane boundary is ADR-0064, born from the cycle-20 breach where a build agent edited the gate that graded it. The bash→Go guard cutover (v11.4.0) preserved the log byte format. The five-guard set grew from three (v8.13.x) as research-quota (v10.16) and doc-deletion (v10.17) joined. cycle-243 taught why hooks carry a fallback binary path: deleting go/bin/evolve once silently disabled every guard — a failure mode that resurfaced 2026-07-12 (see ship & release).