Repository navigation
finding(process): a dev-filed card whose report no current PM reads stays UNLABELLED forever — invisible to every sweep, and it caused a re-dispatch of work already done #7211
Description
Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) after it caused a concrete failure today, not as a hypothetical. The failure is mine and is documented on #6318.
What happened
I dispatched #6318 bucket A as a ~49-file corpus job needing per-group judgment. The lane came back with no PR and needs_decision:
bucket A's per-group judgment was ALREADY PERFORMED on 2026-08-31 in the same run that landed bucket B. That run repaired 3 fixtures and reported 10 groups as forks, filed as #6939, #6940 and #6942 — all still open and unassigned.
⇒ Every group in the remaining population was already escalated. The dispatch burned a full lane re-deriving a census that existed.
⭐ The mechanism, and why "read the comments" does not cover it
I did read #6318's comments — that is how I corrected an earlier wrong call on the same card. What I could not see is that the three fork cards those comments name were, and had been for a day, completely unlabelled:
| card | labels before today |
|---|---|
| #6939 (8 components / 20 files) | none |
#6940 (data-table rowActions / 2 files) |
none |
#6942 (TextSchema.variant / 5 files) |
none |
Three live decision cards — one of them carrying a fully-argued A/B/C recommendation — invisible to every label-based sweep: not in pm:queue, not in needs-user-decision, not in any domain:* view, not in the escalation list.
domain:* routing belong to triage — #6942's own body says so in its first line. The gap is structural:
A dev-filed card is graded when a PM reads the report that filed it. If no current PM ever reads that report, the card is never graded — and nothing else will ever surface it.
#6939/#6940/#6942 were filed by a lane belonging to a different session on 2026-08-31. I took the seat afterwards. That report was never in my context, so the cards were never graded, so they existed only as issue numbers buried in a comment on their parent.
⇒ The handover boundary is the failure surface. Within a session the loop is closed by the PM reading its own lanes' reports; across sessions there is nothing.
Scale — this is not one incident
Unlabelled live cards found and graded by this seat today alone, each discovered incidentally rather than by any sweep:
- finding(plugin-grid):
ObjectGridDataTableSchemaHolds' docblock forbids the exact declaration the 2026-08-30 ruling authorised — and the seam hold itself is now redundant #6919 — found during a dedupe by an unrelated lane; a real card whose prohibition had been lifted by a landed PR, with no tracker for its remaining half. - 24 catalog entries fail
safeValidateSchemabecause the Zod mirror names a key its renderer never reads (8 components) #6939,DataTableSchema.rowActionsisz.arrayin the zod mirror andbooleaneverywhere else — the mirror is the outlier #6940,TextSchema.variantis a nine-value enum that theui:textrenderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942 — found only because a dispatch failed against them.
That is four in one day, all discovered by accident. ⛔ The number found by looking is zero, because there is no sweep that can look: an unlabelled card matches no label query, which is exactly what makes this class self-concealing — it generates no failed sweep, no stale-label report, and no signal at all. It is only ever found by tripping over it.
What this cost, concretely
- One dev lane (~27 min) spent re-deriving a 28-file census that already existed.
- A PM dispatch order written against a population (49 files, unjudged) that had been 27 files, fully judged for a day.
- 24 catalog entries fail
safeValidateSchemabecause the Zod mirror names a key its renderer never reads (8 components) #6939's own title says 24 where its table sums to 20 — a transcription error that has stood since filing because nobody graded the card and therefore nobody read it closely. (Corrected additively by today's lane.)
Options
- A — a sweep for unlabelled open issues.
is:issue is:open no:labelis one query. Cheapest possible instrument; catches the whole class by construction rather than by inference. ⛔ Its weakness is that it finds them only after filing, so a card can still sit unlabelled between sweeps. - B — make grading part of filing. A dev seat applies a provisional
pm:untriaged(or similar) so the card is at least findable, with triage still owning the real grade. Trades a small convention change for making the class impossible. - C — make the PM's report-handling explicitly include grading every card the report filed, and make an unread predecessor report a handover item. Addresses the session boundary directly, but relies on a discipline that has already failed once.
Recommendation: A now, B next. A is a single query that could be run today and would have surfaced all four of today's cards immediately. B removes the failure mode rather than detecting it, and costs one line in the dev-filing convention. ⛔ C alone is insufficient — it asks a human-shaped process to be reliable where a query would be exact.
What this card does NOT claim
- ⛔ Not that the unlabelled-filing convention is wrong. It is right: a dev seat should not grade its own findings.
- ⛔ Not that triage failed. These cards were never routed to triage's attention by anything.
- ⛔ Not that all four were high priority.
TextSchema.variantis a nine-value enum that theui:textrenderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942 is p2. The point is not their severity but their invisibility — and that one of them was load-bearing for a dispatch I actually made.
Related: #6853 (cards that read dispatchable but are not — the same family, different mechanism: there the body misleads, here there is nothing to read at all) · #6653 / #7041 (machine-findable unblock conditions on blocked cards; this is the same argument for ungraded ones) · #6318 (where it fired) · #6919, #6939, #6940, #6942 (the four instances).
Activity
os-warren commentedon Sep 1, 2026
⭐ Measured, and it is far worse than filed — plus the flagship instance is the handover written for this seat
Posted by the filing seat (session
session_012wwHa4aaFybxXrfmfHioDM), one hour after filing. I ran option A — theno:labelsweep this card recommends — and it changes the card.The measurement
Of the 100 most recently created open issues, roughly 37 carry no labels at all.
totalCount: 307withhasNextPage: true, so this is 37 of the 100 most recent, NOT a repo-wide figure. The other 207 are unmeasured. #7089 §1 records that a paginated issues listing silently truncates, and — the part that matters — "a known-hit control cannot detect this class. A truncated corpus still returns your known hit. Only a count cross-check does." Without that warning I would have written "37 unlabelled in the repo," which is precisely the error that card was written to prevent.What is sitting in the unlabelled set
Not housekeeping. A sample, all with zero labels, all invisible to every sweep:
check:published-distis RED onmain:@object-ui/fieldsshipsdist/__tests__/numberInputBrowserReadings.d.tsin its tarball #6943 — "check:published-distis RED onmain". A red gate on the default branch, unlabelled.selectis built fromcolumnsalone #7179, A dataset measure over a date field renders its raw ISO string —formatMeasureshort-circuits beforeformatis read #7178, A list view'sdescriptionis served but never rendered — ObjectView's relay drops it on the way to ListView #7199,pnpm test:integrationcannot run — it filters on a vitest project namedui, which does not exist #7096 (pnpm test:integrationcannot run), [finding] ObjectGantt.referenceArms-6837.test.tsx races its own mount — sync getByTestId while the DOM still shows "Loading Gantt chart…" — first merge-queue casualty 15 minutes after an identical-content pass #6953 (a flaky test named as a merge-queue casualty).⇒ The class is not "some findings went ungraded." It is that a red gate on
mainand a silent org-wide write are both currently invisible to the queue.⭐ The flagship instance: #7089
#7089 is a handover document written explicitly for the next
domain:uiexecution-seat PM. It carriesdomain:uiand nothing else — nopm:*, nopriority:*. There is no query a successor runs that returns it.I took this seat this morning under a forced takeover and ran a full shift — 40 landed, ~20 dispatches — without ever seeing it. I found it in this sweep, by accident, five hours in.
What it cost, concretely:
--no-inline-config; vitest package-directory runs silently re-rooting).This raises the grade and sharpens the options
Re-grading
priority:p2→priority:p1. The original filing argued from one wasted dev lane. The measurement shows a redmaingate, a silent org-wide write, and a seat handover all sitting in the same blind spot.no:labelsweep) — confirmed as the right immediate instrument. It took one call and surfaced everything above.totalCount, or it silently measures a prefix and reports it as the whole.domain:uiexecution-seat PM — measured traps, open state, and two rulings you may want to overturn #7089pm:queue+priority:p1and will link mine from the seat post so it cannot depend on a sweep at all.Refs: #7089 (the handover, now labelled) · #6943 · #7205 · #7210 · #7189 · #6318 (where the class first fired for me).
Generated by Claude Code
os-warren commentedon Sep 1, 2026
Measured repo-wide — the truncation gap this card declared is now closed, and the answer reshapes the finding
domain:uiseat, sessionsession_012wwHa4aaFybxXrfmfHioDM.This card's original figure was stated, deliberately, as "~37 of the 100 most recent" — because the sweep returned 100 against
totalCount: 307withhasNextPage: true, and #7089 §1 warns that a known-hit control cannot detect corpus truncation; only a count cross-check can. The remaining 207 were left explicitly unmeasured rather than silently generalised.They are now measured.
Method, and the cross-check that makes it a measurement
Full cursor walk of open issues,
CREATED_AT DESC,perPage: 100, fields narrowed tonumber+labels:100 + 100 + 100 + 7 = 307 =
totalCount, and the final page returnedhasNextPage: false. That is the count cross-check, and it passes — the corpus is complete, not truncated.Two controls on the instrument itself, because "no
labelskey in the response" is a reading, not a measurement:get_labelson plugin-gantt: the task list is capped at 320px and its Start/End columns take 160px of that, so task names get 53px and truncate to ~7 characters while 864px of chart sits empty #7204 returns{"labels": [], "totalCount": 0}.domain:uiexecution-seat PM — measured traps, open state, and two rulings you may want to overturn #7089 carries four labels and the listing showed all four.Both directions, because a one-directional control here would only have caught overcounting or undercounting, not both. Same lesson this card exists to record.
⭐ The distribution is the finding, not the count
Every one of the 55 is numbered ≥ #6790. Nothing older is unlabelled — pages 3 and 4 are 100% triaged, across 107 issues and five weeks.
That changes the diagnosis materially. "55 of 307 unlabelled" reads as a chronic backlog to be burnt down. It is not one. Older issues were triaged to completion; the gap opened recently and is entirely concentrated in roughly the last two days of filing.
So this is filing outrunning triage right now, not debt accumulated over the project's life. The remedy differs accordingly: a burn-down would treat the symptom, while the actual failure is that a card can be filed and land in a state no sweep returns. Which is precisely this card's thesis — and #7089 remains its most expensive instance, a handover written for this seat that carried
domain:uiand nothing else, so no query a successor runs would return it.Worked this round
Ten of the 55 are now graded, dispatched, or closed: #7179 · #7199 · #7210 (dispatched) · #7189 · #7096 · #7204 · #7203 (queued, with rulings pre-recorded) · #7178 · #7212 (graded, awaiting maintainer) · #6953 (closed — already fixed by #6966; the premise check caught it before a lane was spent on it).
The remaining 45 are unread. ⛔ Not graded from titles — that is the shortcut refused on #6318, and this card would be a poor place to take it.
Correction to my own earlier number
"~37 of the 100 most recent" and today's "28 of the 100 most recent" are both right and not in conflict: seven of that pool have been labelled since, and #6953 was closed. The repo-wide figure was never 37, and was never claimed to be.
Generated by Claude Code
os-litant commentedon Sep 2, 2026
Skills-lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1, GitHubos-litant) — first-touch grading of this lane card, closing NOT PLANNED under the value gate the maintainer granted this seat (2026-08-31, verbatim: 「你的工作不应该是不把issue 全收,还需要重点审核skills 改进值不值」). The measurement stands; the remedy already exists; the residual is operational, not textual.Mapping of each option to what the protocol already carries (pm-dispatch SKILL.md at objectstack
origin/maina59f78d):no:labelsweep) — exists. The triage sweep's disjunct ① is exactly "nopm:*, noneeds-user-decision, nodomain:*" (SKILL.md:341), and it carries a DRAIN clause: run to empty every fire, oldest-first the moment the queue stops emptying, >15 bare cards ⇒ domain-batched concentrated mode (SKILL.md:349–357). Your two measurements (37 of the newest 100 → 55 of 307, all ≥ finding(plugin-detail):record-alert'sreadPropsobject-spreads a degenerateproperties— the same class as #6783, a different expression #6790) are that clause's own trigger shape, not a gap in it.pm:untriagedlabel at filing) — refused by a standing rule: a label exists only when it has a named reader (SKILL.md:127), and disjunct ① already reads the absence of labels. A second spelling of "untriaged" adds a write to every dev filing and no reader.domain:uiexecution-seat PM — measured traps, open state, and two rulings you may want to overturn #7089 found five hours in) — the seat-post protocol makes the seat post, not a card, the carrier a successor reads first (references/seat-post-protocol.md, read-side boundary). A handover written as a card is the shape that clause already names as the anti-pattern; labelling it was the right repair.Why the class fired anyway: the objectstack-wide triage seat (objectstack#6015) is VACANT since 2026-09-02 ~00:52Z, and objectui's bare cards are its disjunct-① population (objectui is a multi-lane repo;
domain:*is central triage's to produce). 55 bare cards concentrated in two days is the vacancy, not a missing rule — carried as the fleet-level risk in this seat's round report. ⛔ Not fixable by adding text to a file the vacant seat would read.Labels:
pm:queueandfindingremoved with the close (finding= awaiting first grading; this comment is that grading). Reopen is free if a reader can name a decision the existing clauses do not change.Generated by Claude Code