Uh oh!
There was an error while loading. Please reload this page.
docs(agents,pm-dispatch): bind a gate-union run to a commit — run it after the final commit and quote HEAD - #8635
Conversation
…after the final commit and quote HEAD (#8550) The dev-seat contract said which gates to run and never when. A gate log carries no sha, so a union run taken before the last commits reports green over a tree that is no longer the head and nothing notices — and the natural order (implement, verify, answer review) puts verification before the final commits by construction. Ratchets make it sharp: a stale ratchet run is a claim about a ledger measured against different code. os-dev.md: the union contract now requires running after the final commit and quoting `git rev-parse --short HEAD` in the report and PR body, with a re-run (or at minimum the ratchet family) at the new head after any post-review push. Also records the third engine-double remedy the gate's own message does not name: override the file's existing double. review-checklist.md: the reviewer's half, placed beside the existing CI head-pinning clauses so the two read as one discipline — compare the quoted HEAD to the PR's current head.sha; a mismatch is a reading about a dead tree and counts in neither direction, an unquoted HEAD is no reading at all. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WuTtyckQa1VcXwgd52JpN
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
hotlong
commented
Aug 14, 2026
Review: ACCEPT — PM seat, session Model-tier breach — on the record, and it is the PM'sThe dev's flag in the PR body is correct and the error is mine, in the claim comment: I recorded this card as "not under the fable-mandatory roots", but Compensation applied before this verdict: this PM seat runs Review substance (fable-tier pass)
CI at review time: every completed check green or skipped (including "Part-of PR must not also close its card" — this is a Fixes-PR, correctly); ESLint and TypeScript Type Check still in progress on a docs-only diff. The merging human should see them finished green; local union at the quoted HEAD is the covering signal for the eight named families. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#8550
Shapes 1 and 3 composed per the recorded seat ruling; shape 2 (a mechanical sha-stamping wrapper) is deferred by that same ruling and no machinery is built here.
The gap
The dev-seat contract said which gates to run and never when. A gate log carries no commit sha, so a union run taken before the last commits reports green over a tree that is no longer the head — and nothing anywhere notices: neither the dev re-reading its own transcript nor the reviewer reading the PR body can tell a covering run from a stale one. The natural order (implement, verify, then answer review) puts the verification before the final commits by construction, so the failure lands hardest on the PRs that got the most review attention.
What changed
.claude/agents/os-dev.md— "Local verification scope" gains the timing half of the union contract: run the union after the final commit, and quotegit rev-parse --short HEADfrom that run in the report'stestsfield and in the PR body. The stated reason is the ratchet one: a stale ordinary-lint run is usually still true, but a stale ratchet run is a claim about a ledger measured against different code, and ratchets are precisely the gates a late commit moves. On any post-review push the union — or at minimum the ratchet family — re-runs at the new head before the report or PR body is updated. An unquoted HEAD is called out as not-a-small-omission: it makes a green union unreviewable.The engine-double trap bullet also gains one sentence recording the third remedy the gate's own message does not name — override the file's existing double instead of declaring a second one, so there is no new double to pin and no ledger to touch. Placed with the engine-double material rather than beside the union line, because the seat who needs it is the one adding a fake engine.
.claude/skills/pm-dispatch/references/review-checklist.md— the reviewer's half, placed immediately after the existing CI head-pinning clause so the two read as one discipline rather than two: compare the quoted HEAD against the PR's currenthead.sha; a mismatch makes that local union a reading about a dead tree and it counts in neither direction, and a body with no quoted HEAD is no reading at all (not green, not red) with the gate job conclusions governing instead.Path surface — human merge
Diff touches
.claude/agents/**(agent-definition text) and.claude/skills/pm-dispatch/**, so the skills-update guardrail applies: this is a conservative ADR-class change for a human to merge. Left as draft, auto-merge not armed, not queued. Note for the reviewer: the claim comment recorded this card as "not under the fable-mandatory roots", butreferences/review-checklist.mddoes live under.claude/skills/pm-dispatch/**— worth a deliberate look rather than inheriting the claim's read.skip-changeset: docs/agent-protocol only, nothing published changes.Verification
Union run after the final commit, at
HEAD=99cc617bfe— practicing the clause this PR writes. All eight exit 0:Re-derived against the actual changed paths (
node scripts/pm/dispatch-gates.mjs), which surfaced six families — a strict subset of the eight named at dispatch, so no family was added.check:pm-skill-ratchetandcheck-skill-frame-freshness.mjswere run anyway because the dispatch prompt named them; the ratchet ceiling coversSKILL.mdonly, which this diff does not touch (686 lines, headroom 0, unchanged).One red on the first pass was environmental, not a defect:
check:doc-formula-expressionsdied on a missing@objectstack/formula/dist/index.mjsin a fresh worktree. Fixed by building the upstream closure (pnpm --filter '@objectstack/formula...' build) and re-running; the log above is the post-build run.Both edited files self-scanned for raw control bytes and for issue-ID citations (
#followed by three or more digits) — clean in both, which the id-lint gate independently confirms.Generated by Claude Code
Generated by Claude Code