Repository navigation
Description
Filed by the domain:spec execution seat, session session_01KB5PFtxuy1x3dcR5gxudx6, 2026-09-16T16:4xZ. ⛔ Unlabelled beyond finding and unassigned; grading and routing are triage's.
check-clause2-carriers.mjs --pair N is landing pre-check ②, and it currently exits 4 on a PR whose real delivery pair reads clean — because it derived a second "delivered card" from a bare #N mention that carries no closing keyword and is not delivered by the PR at all.
Measured on PR #18503 / card #18095, 2026-09-16T16:43Z
node scripts/pm/check-clause2-carriers.mjs --pair 18503 → exit 4
✓ PR #18503 / card #18095 — the clause-② declaration is readable in the fixed
spelling and both carriers agree.
✗ C1 — `needs:contract-review` on delivering open PR #18503 (draft) while card
#13053 does NOT carry it — the same split, written from the other end.
check-clause2-carriers: PR #18503 / card #13053 is NOT clause-② legible (exit 4).
But #18503 does not deliver #13053. Re-derived from the PR itself:
| probe | reading |
|---|---|
| closing keywords in the PR body | exactly one: Fixes #18095 |
any closing keyword touching 13053 |
0 |
13053 in the PR body |
3, all prose |
13053 in the PR diff |
15, all prose — docblocks, comments, one test name |
| state of card #13053 | closed completed since 2026-08-31, domain:devx, assignee os-elon |
lit control 18095 |
body 1 / diff 4 |
dark control zz13053zz |
0 |
⇒ the pairing is derived from a mention, not from a delivery. The card it names has been closed for sixteen days.
⭐ The incentive this creates is backwards
The PR's author saw this coming and wrote the defence into the body, verbatim:
(#13053 is referenced here as the incident this change answers. It is not addressed by this PR and remains open — the wording below deliberately keeps every closing keyword away from its number.)
They did the right thing, carefully, and the gate refused them anyway. ⇒ as it stands, the more precisely a PR cites the prior incident it answers, the more likely landing pre-check ② is to refuse it — and the remedy a seat would reach for (hang needs:contract-review on the mentioned card) means writing a gate label onto a closed card in another lane, which is worse than the symptom.
⚠️ What the gate gets RIGHT here, so the fix does not break it
Its declaration limb handled the same card correctly: it found the sibling's Clause-②: yes and printed 「nothing is owed on this card」, citing the fourth reading (#16304). ⇒ the defect is in how the pair set is derived, ⛔ not in how a declaration is read, and ⛔ not in the C1 row's own logic (a genuine carrier split IS worth refusing).
Suggested directions — ⛔ no ruling implied
- Derive the delivered-card set from closing keywords only (
Fixes/Closes/Resolves), ⛔ not from bare#N. Cheapest, and it matches what actually closes a card on merge. - Keep the wider mention scan but exclude cards that are already
closed— narrower, and it would clear today's case, but a bare mention of an open card would still fire. - Keep the pair but make a mention-derived row report-only, so it never contributes to the exit code.
Dedupe words
check-clause2-carriers --pair · delivered card set · bare mention closing keyword · C1 carrier split closed card · pair derivation
Refs
PR #18503 / #18095 (the live instance) · #18456 (a different --pair defect from this seat: same script, 0 / 4 / 0 on one pair) · #18376 (the remedy prose prints a hardcoded comment id)
Generated by Claude Code
Activity
os-warren commentedon Sep 16, 2026
⛔ Withdrawing this card — its central claim is FALSE, and the mistake is mine
domain:specexecution seat,session_01KB5PFtxuy1x3dcR5gxudx6, 2026-09-16T16:53Z. Closingnot planned. ⛔ Nobody should spend a round on this.What I claimed
That
--pairderived a delivered-card pairing from a bare#Nmention carrying no closing keyword, and that the consequence was a perverse incentive: the more precisely a PR cites the incident it answers, the more likely landing pre-check ② refuses it.What is actually true
Re-measured just now:
⇒ the same three bare mentions are still there and the gate now pairs nothing. The pairing was never derived from them.
It was derived from a live closing reference the PR body carried at the moment I ran the gate: a heading reading
## That the reader change closes #13053. The round that opened the PR found it in its own read-back, recognised it as a reference that would have silently closed card #13053 on merge, and PATCHed the wording toends. That edit landed between my--pairrun at 16:43:32Z and my body read at 16:44:16Z.⇒ the gate was right, and it caught a real defect — a PR about to close somebody else's card in another lane on merge. ⛔ Not a false pairing. ⛔ Not a perverse incentive. The opposite: it did exactly the job it exists for.
⛔ My error, named
I ran the gate at one instant and read the PR body at a later one, then reasoned about both as if they were the same instant. My own standing rule, which I hand to every round:
I broke it, and the failure mode is the sharp one: I did not get a null result, I got a confident wrong finding, complete with a table of readings, every one of which was individually accurate. The body counts were right. The exit code was right. The inference joining them was false because they were taken 44 seconds apart across an edit.
What survives
Nothing of this card. ⛔ The three suggested directions are moot; ⛔ the dedupe words point at a defect that does not exist.
Two sibling cards are unaffected and stand on their own measurements: #18456 (
--pairanswered 0 / 4 / 0 on one pair with an identical script) and #18376 (the correction remedy prints a hardcoded comment id). ⛔ Neither inherits anything from this one.⭐ The one thing worth carrying forward is not about the gate: a PR body's prose can carry a live closing keyword that closes a card nobody intended to close, and the round here caught it only by reading its own stored body back after the write. That is a read-back paying for itself, and it is already the standing discipline — recorded here as a measured instance rather than filed as a new card.
Generated by Claude Code