Repository navigation
v1.3.0
Minor. Adds a bundled run-trail hook and makes baton's hooks fire on the interactive /baton path
(previously only baton's TypeScript runtime wired them), so the enforcement and trail work without the
runtime. Additive to the frozen 1.0 contract (loop and routing gate, lane map and five bundled agents,
RunRecord shape, MCP-via-.mcp.json), which is unchanged. This entry describes what ships, not what it
achieves — no efficacy claim.
- The run trail is hook-maintained, not memory-maintained. A bundled dual-event hook
(hooks/ledger.py, wired onPostToolUseandStop) keeps a session-scoped trail at
.agents/runs/ledger.mdregardless of whether the model remembers to write one: a line per real lane
spawn, and an idempotent close-out per stop. It is operability, not part of the security-enforcement
contract — its absence loses a trail, never a gate — sobaton doctorwarns (non-gating) when it is not
wired. Claude Code runsStophooks in parallel, so the close-out tolerates a not-yet-stamped verdict
(unstamped) and self-corrects on the next stop; it never derives or overrides the gate's verdict. - An absent disposition record is now explained, not silently missing. On a run where triage names no
sensitive seam, the close-out records why nodisposition.jsonexists (READY by the no-seam row), so a
correct no-seam run is distinguishable from a skipped gate. - Enforcement wires on the interactive path. A shipped self-installer (
hooks/wire_interactive.py)
wires the enforcement + trail hooks into the user-global~/.claude/settings.jsonwith absolute paths,
excluding the SessionStart guard (whose per-project verification-marker model would fail-loud in unrelated
repos). It is idempotent, preserves existing settings, and runsbaton doctorto confirm. The settings
wirer (wire_settings.py) now ships inside the skill, so an installed-only machine can self-wire with no
repo checkout — andbaton doctorpoints at that shipped path rather than a file that isn't present. - Triage names a deployment seam. An outward-facing cloud deploy that creates an IAM role, exposes a
public or no-auth endpoint, or routes data to a hosted model is adata-egress/secrets/authzseam
even when no source line changed; it travels the disposition path, not only the approval gate. - Honest labels. The plan step's
contract-readcheckpoint is labeled guardrail-strength, not
enforcement-strength — no hook can detect an unfamiliar external tool, so it stays a model-written prompt. - CI. The bundled hook self-tests (disposition, contract, doctor, session-start, wiring, self-installer,
ledger) run in the structural smoke gate, and CI triggers onhooks/**.