Skip to content

[finding] Census of all 47 pm:blocked cards: 32 park Blocked-by: outside the body (invisible to the unlock scan), 16 wait on already-closed upstreams, 7 name no blocker at all #11747

Description

@os-sam

Filed unassigned, observation-class, awaiting first grading. Suggested lane for triage: domain:skills (this is protocol machinery, and #8941 — the card that first recorded the blind spot measured here — sits there). Not self-labelled: domain:* is the triage seat's to produce.

Provenance: maintainer, 2026-08-24, live PM chat, verbatim: 「跑一遍并把结果落成卡」 — instructing that the reverse-index reconciliation offered in that chat be run in full and recorded as a card. PM session session_01FfmmQb8d7McMLXnzbor3UX.

This card is the measurement, not a re-statement of the problem. #8941 already records that the unlock scan greps issue bodies only while seats park Blocked-by: in comments. Nothing here re-opens that; what was missing was the population, and the population turns out to carry three separate defects, only one of which #8941 names.

Method

Snapshot 2026-08-24 ~14:00–15:00Z, objectstack + objectui (the two repos reachable from this session).

  1. Every open issue labelled pm:blocked in both repos — 33 + 14 = 47.
  2. For each: issue body read in full, matched against ^\s*(?:[-*>]\s*)?\**?Blocked-by:??\**\s*(.+)$ (deliberately looser than the production predicate, so that a body counted as "has a line" is a superset of what any body-grep scan could find).
  3. For every card with no body line: the latest comment read (the protocol's authoritative "最近一次转换评论").
  4. Every named upstream resolved to open/closed by set-difference against the full open-issue number set of its repo.
  5. Every closed upstream then tested against state:CLOSED since:2026-08-24T00:00:00Z to separate "closed today, next sweep will catch it" from "closed on an earlier day and the card is still parked".

Result 1 — where the Blocked-by: line actually lives

channelcardsshare
body (the only channel the unlock scan greps)1532%
comment only — legal under the dual-channel contract, invisible to the scan2451%
no machine-readable line found (body + latest comment)715%
self-closed mid-census (#9652)12%

So two out of three parked cards cannot be discharged by a body-grep scan, and the comment channel is not a rare accident — it is the majority spelling, produced by the triage seat's own routing comments (Triage: … pm:blocked / Blocked-by: in the same comment) and by PM state-transition comments.

Result 2 — a second, independent hazard: the line's spelling varies

Even a scan that read comments would miss part of the population, because the marker is written at least four ways in live cards:

spellingexample
Blocked-by: #N#11333, #9592 (body)
`Blocked-by:` #N (backticked key)#11668, #11611, #11187, #11225
**Blocked-by: #N** (bolded)#11423, #11410
Blocked-by: <owner/repo>#N with a trailing stray backtick#11617

The strict ^Blocked-by: predicate the skill mandates matches only the first. Widening the scan to comments without also settling the spelling would move the blind spot rather than close it.

Result 3 — 16 cards are parked on upstreams that are already closed

Genuinely overdue (upstream closed on an earlier day; the card has not been re-queued):

cardupstreamchannelnote
#9592#9255 (closed 2026-08-19T11:28Z)body5 days parked with a body-visible line — a body-grep scan should have caught this one and did not
#11187#11082comment
objectui#5831#11166body
objectui#3906objectui#3789body

Three of the four carry a body line, so this is not only #8941's comment-channel gap: the scan is also not discharging what it can already see. That is a separate defect and worth its own diagnosis.

Closed today — legitimately awaiting the next sweep, listed so nobody re-derives them:

upstream (closed 2026-08-24)cards still parked on it
#9689#11668 · #11423 · #11410 · #9784
#10812#11333 · #11332 · #11331 · #11330
#11485#11617
#11303#11611
#11513objectui#5987
objectui#5930objectui#5931

Result 4 — 7 cards name no blocker anywhere the census could see

#10726 · #10692 · objectui#5521 · objectui#5493 · objectui#5453 · objectui#4356 · objectui#3719

A pm:blocked card with no machine-readable upstream is a state nothing can ever leave — strictly worse than the comment-channel case, because there is no line to find. objectui#3719 is the proof that this is not self-healing: the unlock scan itself recorded the exact diagnosis on that card on 2026-08-19, asked the owning seat to add a line or swap the label back, and the card is unchanged five days later. Two of the seven (objectui#5453, objectui#4356) carry a triage comment that says in so many words pm:blocked untouched — i.e. the lane was set by a seat that never wrote the blocker down.

Limit on this row: body + latest comment were read. A line sitting in an older comment would be missed here — which does not change the operational verdict (a scan reading the latest transition comment would miss it too), but does mean "no blocker exists" is not proven for these six.

What this suggests (for the grader, not decided here)

  1. The cheap half is the spelling, not the channel: pin one canonical marker and make the mis-spellings a gate error, or widen the predicate to the four live forms. Either is mechanical.
  2. Widening the scan to the comment channel is what [finding] the pm:blocked unlock scan greps issue BODIES only, while seats deliberately park Blocked-by: lines in COMMENTS — blocked cards go invisible and sat 24h+ past discharged upstreams #8941 already asks for; this census gives it a denominator (24 cards today).
  3. The four overdue cards are lane work available immediately: tooling: check-adr-anchors should verify that a cited ADR-NNNN Dk decision letter is a real heading of the cited ADR #9592 (domain:devx), [finding] Publish-time lint for a chained controlled_by_parent declaration (direction 3 of #11082) — and its value CHANGED once direction 1 was implemented #11187 (domain:services), objectui#5831 and objectui#3906 (objectui lanes).
  4. The 7 blocker-less cards need their owning seats to either write the line or return the card to pm:queue. A report-only half-state patrol row ("pm:blocked with no resolvable Blocked-by: in body or comments") would make this class visible without a new label.
  5. Worth noting as the counter-example: [finding] AGGREGATION_ROWS has no boolean column, so the cross-driver aggregation conformance family cannot see a boolean aggregand on any face #11152's seat found its upstream ([Decision] min/max over a boolean aggregand: pin the cross-driver JSON answer — 0/1 (SQL) vs false/true (both in-memory faces) #11249) closed, and rewrote the Blocked-by: to the new real blocker (driver-sql: boolean aggregands need a lowering cast on PG (+ a MySQL min/max presentation check) — the ruled false/true + arithmetic answers are unproducible on the PG face #11635) instead of discharging the card. That is the behaviour the mechanism should make cheap.

Scope limits

Refs: #8941 (the blind spot this measures) · objectui#3719 (the scan's own 2026-08-19 diagnosis of the blocker-less class) · #11152 (the rewrite-the-blocker counter-example)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions