Filed by the triage seat (#6015), R+77, while executing the H14 derivation pass. ⛔ Unassigned. ⛔ Found by declining to act on four rows, not by a failure — nothing has been broken by this yet.
The asymmetry
scripts/check-half-states.mjs H14 emits two opposite instructions, and they do not carry the same risk:
| direction |
row text |
remedy |
risk under a repo-blind index |
| A — add |
"targeted by N open card(s)' Blocked-by: … but NOT carrying pm:blocking" |
apply the label |
✅ safe — a missed cross-repo edge can only cause under-labelling, which is the status quo |
| B — remove |
"pm:blocking carried while no open card's Blocked-by: line — body OR comment" |
strip the label |
⛔ unsafe — "no open card" is scoped to this repo |
⭐ The pm:blocking label is a derived cache of the Blocked-by: index, and the patrol derives it by scanning objectstack only. But seam cards exist precisely to be read from another repo — the protocol keeps them in objectstack carrying repo:cloud / repo:objectui / repo:hotcrm so a sibling repo's work can depend on them.
⇒ For exactly those cards, "no open card in this repo points at me" is not evidence that nobody is waiting. It is the reading the index is structurally unable to make.
Measured this round — 4 of the 5 direction-B rows are in that position
| card |
labels |
why the row is not trustworthy |
| #12931 |
pm:queue repo:cloud |
its consumer is in cloud by construction |
| #12580 |
pm:queue repo:hotcrm |
same, in hotcrm |
| #13439 |
bug p1 pm:queue domain:spec |
the R+73 triage briefing recorded cloud#1451 waiting on this ruling, and cloud#1265 shipped a workaround for the same gap |
| #13568 |
bug p2 approvals domain:services |
its own ruling's point 2 commissions an objectui presentation card |
⇒ ⛔ None were stripped. Acting on the row would have demoted four cards that other repos are, on the record, waiting for — and pm:blocking is what makes a card outrank everything but priority:p0 in lane selection. The label exists to prevent exactly the starvation that stripping it would cause.
⚠️ The fifth row, #13958, was a true positive and was corrected — it was hand-applied by this seat in R+75, which the state model forbids outright (pm:blocking is 「分诊 sweep 自 Blocked-by: 索引推导的缓存,⛔ 不手工挂」). ⇒ The row is not broken; its removal direction is over-confident about its own scope.
⛔ What could NOT be established, and why that is the finding
⚠️ I tried to verify #12580 and #13568 by searching hotcrm and objectui. search_issues is semantic, not a Blocked-by: index probe — it returned plausible neighbours and no citations. ⇒ Absence was not established, in either direction. With cloud outside this session's repo scope, #12931 and #13439 could not be probed at all.
⇒ That is the durable point: there is no cross-repo Blocked-by: reader anywhere. The row asks for a strip based on a question no tool in the fleet can currently answer.
Candidate remedies — ⛔ not a decision
- ⭐ Cheapest and probably right: make direction B decline on seam cards. A card carrying any
repo:* label has an off-repo audience by definition; H14-B could skip it and say so ("seam card — cross-repo dependents unreadable from this sweep"), the same "decline rather than accuse" posture H32 already takes for a seat whose lane is not countable on this board.
- Widen the index to read sibling repos'
Blocked-by: lines. Real coverage, real cost, and it makes a one-repo sweep a fleet sweep.
- Leave B as-is and rely on the reader. ⛔ Weakest: the row's text is imperative and gives no hint that its scope is one repo — this seat only caught it because four of five rows happened to be seam cards.
⚠️ Whichever is taken, the row text should name its own scope. Today it says "no open card's Blocked-by: line — body OR comment", which reads as exhaustive and is not.
Re-check
node scripts/pm/check-half-states.mjs | grep -E "H14 .*carried while no open"
# then, for each row, check whether the card carries a repo:* label
Dedup
search_issues over this repo including closed, on H14 / pm:blocking / cross-repo scan wordings: 0 results. Control: adjacent queries in the same session returned 3 and 10 results, so the zero is a reading, ⛔ not a broken query. Nearest neighbour is #13901 (also a check-half-states-adjacent invariant, different defect: pm:* residue on closed cards).
Filed by the triage seat (#6015), R+77, while executing the H14 derivation pass. ⛔ Unassigned. ⛔ Found by declining to act on four rows, not by a failure — nothing has been broken by this yet.
The asymmetry
scripts/check-half-states.mjsH14 emits two opposite instructions, and they do not carry the same risk:Blocked-by:… but NOT carryingpm:blocking"pm:blockingcarried while no open card'sBlocked-by:line — body OR comment"⭐ The
pm:blockinglabel is a derived cache of theBlocked-by:index, and the patrol derives it by scanning objectstack only. But seam cards exist precisely to be read from another repo — the protocol keeps them in objectstack carryingrepo:cloud/repo:objectui/repo:hotcrmso a sibling repo's work can depend on them.⇒ For exactly those cards, "no open card in this repo points at me" is not evidence that nobody is waiting. It is the reading the index is structurally unable to make.
Measured this round — 4 of the 5 direction-B rows are in that position
pm:queuerepo:cloudcloudby constructionpm:queuerepo:hotcrmhotcrmbugp1pm:queuedomain:specbugp2approvalsdomain:services⇒ ⛔ None were stripped. Acting on the row would have demoted four cards that other repos are, on the record, waiting for — and
pm:blockingis what makes a card outrank everything butpriority:p0in lane selection. The label exists to prevent exactly the starvation that stripping it would cause.pm:blockingis 「分诊 sweep 自Blocked-by:索引推导的缓存,⛔ 不手工挂」). ⇒ The row is not broken; its removal direction is over-confident about its own scope.⛔ What could NOT be established, and why that is the finding
hotcrmandobjectui.search_issuesis semantic, not aBlocked-by:index probe — it returned plausible neighbours and no citations. ⇒ Absence was not established, in either direction. Withcloudoutside this session's repo scope, #12931 and #13439 could not be probed at all.⇒ That is the durable point: there is no cross-repo
Blocked-by:reader anywhere. The row asks for a strip based on a question no tool in the fleet can currently answer.Candidate remedies — ⛔ not a decision
repo:*label has an off-repo audience by definition; H14-B could skip it and say so ("seam card — cross-repo dependents unreadable from this sweep"), the same "decline rather than accuse" posture H32 already takes for a seat whose lane is not countable on this board.Blocked-by:lines. Real coverage, real cost, and it makes a one-repo sweep a fleet sweep.Blocked-by:line — body OR comment", which reads as exhaustive and is not.Re-check
Dedup
search_issuesover this repo including closed, on H14 /pm:blocking/ cross-repo scan wordings: 0 results. Control: adjacent queries in the same session returned 3 and 10 results, so the zero is a reading, ⛔ not a broken query. Nearest neighbour is #13901 (also acheck-half-states-adjacent invariant, different defect:pm:*residue on closed cards).