What happens
check-half-states.mjs's H31 binds a pull request to a card through a Part of #N line, not only through a closing keyword. On an epic tracker — a card no PR will ever close — that manufactures a row saying the gate label is missing from the card half of a dual carrier, and the row's own remedy text tells the reading seat to hang needs:contract-review on it.
Hanging it would be the wrong write: nothing closes an epic tracker, so the gate would never be cleared by the mechanism that clears gates, and it would sit on the tracker as a permanent false blocker.
Measured, on the 2026-09-14T19:45:00Z sweep of anchor #9857
The row:
H31 #14122 — needs:contract-review on the delivering open PR #18213 (draft, via a Part of declaration), #18212 (draft, via a Part of declaration) while the CARD does NOT carry it …
The two PRs' own bodies, read at 2026-09-14T21:1xZ via GET /repos/objectstack-ai/objectstack/pulls/{n}:
| PR |
closing keyword |
Part of line |
| #18212 |
Fixes #18202 |
Part of #14122 — the epic tracking the one-artifact/N-packages family. That tracker stays open. |
| #18213 |
Fixes #18204 |
Part of #14122 — the ADR-0130 tracker stays open; nothing here is a closing keyword for it. |
And the delivering cards:
⇒ Both dual carriers are intact. The only card missing the label is the one that is not a delivering card at all — and both PR bodies say so in their own words, in the same line the predicate read.
Why this one matters more than an ordinary false positive
H31 is the row family whose stated purpose is that 「闸门被剥不是红灯是放行」 — a stripped gate is a GREEN light, so the row exists to make a missing carrier visible. That makes its rows action-shaped: a seat that trusts the row writes a label. This false positive therefore does not cost a reading, it costs a wrong write, and the wrong write is one that nothing later removes.
It is also self-reinforcing: every epic tracker whose sub-PRs are correctly gated produces one row per sweep, forever.
Suggested direction (not a ruling)
Bind the PR to the card the PR closes. A Part of line declares membership in a tracker, which is the opposite of a delivery binding — the two PR bodies above both state that distinction explicitly, so the corpus already carries the discriminator the predicate needs.
If Part of must stay in the population for some other row's sake, then H31 should at minimum decline to judge a card carrying tracking, and say it declined rather than reporting clean.
Dedupe words
H31 · Part of · dual carrier · needs:contract-review · epic tracker
Filed by the domain:spec execution PM seat (session_01KB5PFtxuy1x3dcR5gxudx6), 2026-09-14T21:2xZ, while discharging anchor #9857's rows for this lane. ⛔ The seat wrote no label on #14122. Per 「立卡者不查重,只附 3–5 个查重词」 this card is NOT deduped by its filer.
Generated by Claude Code
What happens
check-half-states.mjs's H31 binds a pull request to a card through aPart of #Nline, not only through a closing keyword. On an epic tracker — a card no PR will ever close — that manufactures a row saying the gate label is missing from the card half of a dual carrier, and the row's own remedy text tells the reading seat to hangneeds:contract-reviewon it.Hanging it would be the wrong write: nothing closes an epic tracker, so the gate would never be cleared by the mechanism that clears gates, and it would sit on the tracker as a permanent false blocker.
Measured, on the 2026-09-14T19:45:00Z sweep of anchor #9857
The row:
The two PRs' own bodies, read at 2026-09-14T21:1xZ via
GET /repos/objectstack-ai/objectstack/pulls/{n}:Part oflineFixes #18202Part of #14122 — the epic tracking the one-artifact/N-packages family. That tracker stays open.Fixes #18204Part of #14122 — the ADR-0130 tracker stays open; nothing here is a closing keyword for it.And the delivering cards:
defineStack's per-stack cross-reference validation refusespermissions[].objectsanddata[].objectthat name an object owned by ANOTHER PACKAGE OF THE SAME ARTIFACT — so ADR-0130's co-owned artifact and the "permission sets stay whole in the app package" addendum cannot both hold once the app package owns objects #18202 carriesneeds:contract-review(labels read 21:0xZ:bug, priority:p1, pm:dispatched, domain:spec, needs:contract-review).os build/os devper-package author-time rules refuse an action param's record-pickerreferenceto a dependency's object (object-reference-unknown), while the composed pass accepts it and ADR-0130 R1 accepts the field-level equivalent #18204 carriesneeds:contract-review(labels read 21:0xZ:bug, priority:p1, pm:dispatched, domain:cli, needs:contract-review).⇒ Both dual carriers are intact. The only card missing the label is the one that is not a delivering card at all — and both PR bodies say so in their own words, in the same line the predicate read.
Why this one matters more than an ordinary false positive
H31 is the row family whose stated purpose is that 「闸门被剥不是红灯是放行」 — a stripped gate is a GREEN light, so the row exists to make a missing carrier visible. That makes its rows action-shaped: a seat that trusts the row writes a label. This false positive therefore does not cost a reading, it costs a wrong write, and the wrong write is one that nothing later removes.
It is also self-reinforcing: every epic tracker whose sub-PRs are correctly gated produces one row per sweep, forever.
Suggested direction (not a ruling)
Bind the PR to the card the PR closes. A
Part ofline declares membership in a tracker, which is the opposite of a delivery binding — the two PR bodies above both state that distinction explicitly, so the corpus already carries the discriminator the predicate needs.If
Part ofmust stay in the population for some other row's sake, then H31 should at minimum decline to judge a card carryingtracking, and say it declined rather than reporting clean.Dedupe words
H31·Part of·dual carrier·needs:contract-review·epic trackerFiled by the
domain:specexecution PM seat (session_01KB5PFtxuy1x3dcR5gxudx6), 2026-09-14T21:2xZ, while discharging anchor #9857's rows for this lane. ⛔ The seat wrote no label on #14122. Per 「立卡者不查重,只附 3–5 个查重词」 this card is NOT deduped by its filer.Generated by Claude Code