{"slug":"ticket-guard","total":3,"limit":100,"offset":0,"since":null,"commits":[{"hash":"1d2b313","date":"2026-09-13 16:41:45 -0700","author":"Steve","subject":"harden ticket-guard after second-model review: pid+start identity, no-tty guard, throttle (TK-11621)","body":"Codex was spend-capped (TK-11571 condition); review came from Kimi k3. Its sharpest\npoint matched my own adversarial pass: pid ALONE is not a process identity because\nmacOS recycles pids, so a dead writer's pid can be re-issued and re-validate a stale\nrecord. Now requires pid AND start time (ps -o lstart= is byte-identical to the\nrecord's owner.started, verified on ttys003).\n\nAlso from that review: a session with no controlling tty (headless claude -p) would\nhave probed a degenerate state path and let ttyless sessions inherit each other's\nbinding -> now an explicit fail-loud guard.\n\nAdded a 15-min per-identity throttle: without it a genuinely ticketless session gets\nthe reminder on every prompt forever, burning context to repeat itself. Stamp is keyed\nto pid+start so a NEW session is never silenced by a dead one's stamp.\n\nPerf: start time resolved LAZILY, only on the path that needs it — the 45 of 77\nlauncher-bound sessions exit at step 2 and never pay for it. 0.48s -> 0.03s.\n\nNegative test 8 -> 14 cases, all pass, incl. pid-reuse, no-tty, missing start time,\nand all three throttle behaviours.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DkVx1x2ppxm6tdEXngBj2P"},{"hash":"ffe9706","date":"2026-09-13 16:29:38 -0700","author":"Steve","subject":"install.sh: gated, idempotent, self-verifying settings.json wiring (TK-11621)","body":"Refuses to wire if the negative test fails. Backs up settings.json. Rehearsed on a\ncopy: additive only (UserPromptSubmit 5->6), idempotent, other hook events untouched.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DkVx1x2ppxm6tdEXngBj2P"},{"hash":"153f410","date":"2026-09-13 16:27:43 -0700","author":"Steve","subject":"ticket-guard: UserPromptSubmit hook that catches ticketless sessions at first action (TK-11621)","body":"Enforces CLAUDE.md's every-action-rides-a-ticket rule mechanically instead of\nrelying on model memory. Fires on UserPromptSubmit (not SessionStart) so an idle\nrestored session is never made to invent a ticket for work it is not doing.\n\nFail-loud: an unmeasured binding is never treated as bound (TK-11431 amd 1).\nIdentity-checks the tty status record against the live pid to defeat the\nreusable-tty-slot false green. 60-70ms vs the 18-27s full scan.\n\nShips with a negative test (8 cases, all injected faults go red).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DkVx1x2ppxm6tdEXngBj2P\n"}]}