You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(pm): 17 of 24 domain:uipm:blocked cards carry no machine-readable Blocked-by: line — they are invisible to the unlock scan's reverse index #6653
Filed unlabelled beyond finding by the domain:ui execution seat, PM session session_01CRJge11jso9TpXRWFt1Z49, while running the owed unlock scan. Routing, domain:*, type and grading are triage's to produce — this seat does not apply them. Suggested routing at the bottom. Filed unassigned: this is a recording, not a claim.
What was measured
Population: open issues labelled pm:blocked, read as a single query with the label filter verified (totalCount: 37, hasNextPage: false). Of those, 24 carry domain:ui, 7 domain:devx, 6 domain:spec — 24 + 7 + 6 = 37, so the split is exhaustive.
Bodies of the 24 domain:ui cards, classified by whether the reverse index can see them:
The second and third rows were separated deliberately with a case-insensitive block probe rather than one strict pattern, because a strict-only probe cannot distinguish "written in another format" from "absent" — and a mis-aimed pattern producing a confident zero is the exact failure this card is about. (In the same scan a probe aimed at src/index.ts returned a clean zero for a barrel that is actually src/index.tsx.)
Why it matters
Blocked-by: is not documentation — it is the machine-readable reverse index that feeds three readers in one pass: putting a card back when its upstream closes, ordering selection by unlock fan-out, and re-verifying the file face on the merged ref. A pm:blocked card without that line is a half-state: the label says "waiting on an upstream" and nothing records which upstream, so no scan can ever put it back. 17 of 24 cards in this lane are in that state — they do not age into the queue, they age indefinitely.
This is a silent failure, not a loud one. The cards look correctly labelled on the board.
What the 7 well-formed cards showed (evidence the index works when present)
Resolved in this scan, which is what the other 17 cannot receive:
ActionParamDialog: honour the spec carry-over param declaration — render carried JSON params as read-only summaries (objectstack#11753 ruling, ui half) #6246 → upstream objectstack#11992 closed (merged PR objectstack#12614, ActionParamSchema.carryOver), also unpublished. Converted to pm:on-hold. ⚠️ Worth noting for anyone writing restart criteria: objectstack main's packages/spec/package.json still reads 17.2.0, the same string as the published release that does not contain carryOver — so a version-comparison restart criterion would have fired a false unlock. The criterion written instead probes for the symbol on the installed package.
So 2 of 7 were resolvable the moment the index was read. If that rate is representative, the 17 invisible cards plausibly hide several resolvable ones.
What this card is asking for
A decision on the remedy, then the work:
Backfill the 17 — read each card's comments for the blocking reason and either write the Blocked-by: line, unblock it, or convert it to pm:on-hold with a restart criterion. This is lane work and this seat can prosecute it.
Make it mechanical — the half-state patrol already reports paired-label/comment gaps; "pm:blocked without a Blocked-by: line" is the same class of defect and is cheaply detectable in the same sweep. A gate is a stronger remedy than a one-time backfill, because the backfill decays.
This card records the measurement; it does not decide between them, and 2 is a domain:devx shape while 1 is per-lane.
Scope note
Only the 24 domain:ui cards were classified. The 7 domain:devx and 6 domain:spec blocked cards were not measured — they belong to other seats, and "not measured" is recorded here as not measured rather than assumed to be clean. If the pattern holds repo-wide the population is larger than this card's table.
Suggested routing (triage's call, not this seat's)
Remedy 2 (the gate) reads as domain:devx. Remedy 1 is per-lane execution and needs no routing. If the card is graded as a single unit, the gate half is the one with a durable reader.
Filed unlabelled beyond
findingby thedomain:uiexecution seat, PM sessionsession_01CRJge11jso9TpXRWFt1Z49, while running the owed unlock scan. Routing,domain:*,typeand grading are triage's to produce — this seat does not apply them. Suggested routing at the bottom. Filed unassigned: this is a recording, not a claim.What was measured
Population: open issues labelled
pm:blocked, read as a single query with the label filter verified (totalCount: 37,hasNextPage: false). Of those, 24 carrydomain:ui, 7domain:devx, 6domain:spec— 24 + 7 + 6 = 37, so the split is exhaustive.Bodies of the 24
domain:uicards, classified by whether the reverse index can see them:Blocked-by:lineThe second and third rows were separated deliberately with a case-insensitive
blockprobe rather than one strict pattern, because a strict-only probe cannot distinguish "written in another format" from "absent" — and a mis-aimed pattern producing a confident zero is the exact failure this card is about. (In the same scan a probe aimed atsrc/index.tsreturned a clean zero for a barrel that is actuallysrc/index.tsx.)Why it matters
Blocked-by:is not documentation — it is the machine-readable reverse index that feeds three readers in one pass: putting a card back when its upstream closes, ordering selection by unlock fan-out, and re-verifying the file face on the merged ref. Apm:blockedcard without that line is a half-state: the label says "waiting on an upstream" and nothing records which upstream, so no scan can ever put it back. 17 of 24 cards in this lane are in that state — they do not age into the queue, they age indefinitely.This is a silent failure, not a loud one. The cards look correctly labelled on the board.
What the 7 well-formed cards showed (evidence the index works when present)
Resolved in this scan, which is what the other 17 cannot receive:
@objectstack/plugin-securityis 17.2.0 from 2026-08-23, one day before the merge. Converted topm:on-holdwith an executableRestart-when:.ActionParamSchema.carryOver), also unpublished. Converted topm:on-hold.main'spackages/spec/package.jsonstill reads17.2.0, the same string as the published release that does not containcarryOver— so a version-comparison restart criterion would have fired a false unlock. The criterion written instead probes for the symbol on the installed package.TimelineSchema.itemshas no declared element type, and there are two of them #6356, docs(components):sonnerandbutton-groupstill document four more props no shipped type declares #6347, page:header implements the declared action-id lookup — resolveactions: string[]likerecord:quick_actionsdoes (objectstack#11592 ruling) #6252, ObjectTree's schema-settled latch is a bare boolean, so a query after an object switch carries the previous object's$expand#6481 → upstreams verified still open; correctly blocked, no action.So 2 of 7 were resolvable the moment the index was read. If that rate is representative, the 17 invisible cards plausibly hide several resolvable ones.
What this card is asking for
A decision on the remedy, then the work:
Blocked-by:line, unblock it, or convert it topm:on-holdwith a restart criterion. This is lane work and this seat can prosecute it.pm:blockedwithout aBlocked-by:line" is the same class of defect and is cheaply detectable in the same sweep. A gate is a stronger remedy than a one-time backfill, because the backfill decays.This card records the measurement; it does not decide between them, and 2 is a
domain:devxshape while 1 is per-lane.Scope note
Only the 24
domain:uicards were classified. The 7domain:devxand 6domain:specblocked cards were not measured — they belong to other seats, and "not measured" is recorded here as not measured rather than assumed to be clean. If the pattern holds repo-wide the population is larger than this card's table.Suggested routing (triage's call, not this seat's)
Remedy 2 (the gate) reads as
domain:devx. Remedy 1 is per-lane execution and needs no routing. If the card is graded as a single unit, the gate half is the one with a durable reader.