Split out of #15803 (section B2) by the skills seat at grading, as that card's triage prescribed; the maintainer's principle question in #15803 section A stays on that card.
The reading
A check_suite.completed event can name a head that is no longer the PR's head. Measured by the domain:spec @ objectui seat on 2026-09-05: the event named dfec57b5e while the PR's actual head was e46a218c9. Acting on it would have flipped a Clause-② PR ready on evidence from a commit no longer on the branch.
The protocol's existing corrective — read the full check farm by name on the head, then arm — already prevents the bad outcome, but it reads as being about aggregate-vs-by-name. This is a distinct failure: right method, wrong commit.
The rule to land
One clause in .claude/skills/pm-dispatch/SKILL.md's 入队与落地 block (line-neutral, paid by a fold in the same block): before trusting any suite or check event, re-read the PR object and take the head from it; a check reading is bound to that head, never to the event's SHA. references/platform-readings.md gains the fact as one line in the fifth readings increment (with #15977 · #16006 · #16104 section 1 · #15803 section C), not here.
Acceptance
- SKILL.md 811/811 (pin 342), the clause in the 落地 block;
check-skill-line-ratchet, check-skill-id-lint, check-skill-frame-sync, check-governed-prose, check-half-states --self-test, check-governed-merges --test exit 3, whole-repo lint — exits captured before any pipe.
- Governed (
.claude/**): draft PR, seat review, os-zhuang + hotlong, human merge.
Serial
SKILL.md is held by PR #16339 (flight A) and PR #16271 (devx); this card folds into the SKILL.md flight that follows both (with #16352 and #16229 — same file, same register, no conflicting ruling).
Refs #15803.
Generated by Claude Code
Split out of #15803 (section B2) by the skills seat at grading, as that card's triage prescribed; the maintainer's principle question in #15803 section A stays on that card.
The reading
A
check_suite.completedevent can name a head that is no longer the PR's head. Measured by thedomain:spec@ objectui seat on 2026-09-05: the event nameddfec57b5ewhile the PR's actual head wase46a218c9. Acting on it would have flipped aClause-②PR ready on evidence from a commit no longer on the branch.The protocol's existing corrective — read the full check farm by name on the head, then arm — already prevents the bad outcome, but it reads as being about aggregate-vs-by-name. This is a distinct failure: right method, wrong commit.
The rule to land
One clause in
.claude/skills/pm-dispatch/SKILL.md's 入队与落地 block (line-neutral, paid by a fold in the same block): before trusting any suite or check event, re-read the PR object and take the head from it; a check reading is bound to that head, never to the event's SHA.references/platform-readings.mdgains the fact as one line in the fifth readings increment (with #15977 · #16006 · #16104 section 1 · #15803 section C), not here.Acceptance
check-skill-line-ratchet,check-skill-id-lint,check-skill-frame-sync,check-governed-prose,check-half-states --self-test,check-governed-merges --testexit 3, whole-repo lint — exits captured before any pipe..claude/**): draft PR, seat review,os-zhuang+hotlong, human merge.Serial
SKILL.md is held by PR #16339 (flight A) and PR #16271 (devx); this card folds into the SKILL.md flight that follows both (with #16352 and #16229 — same file, same register, no conflicting ruling).
Refs #15803.
Generated by Claude Code