Blocked-by: #12328
Found while measuring #12246 (the mid-segment glob collapse). ⛔ Not fixed there — that card's
declared surface is collapseHint and its --self-test, and its dispatch explicitly ruled the
TRIAGE rows out of scope ("Measuring whether it becomes retirable is in scope; changing it is
not"). Filed unassigned, not graded.
Both rows live in scripts/pm/bare-root-worklist.mjs and were landed by PR #12247.
⚠️ STATUS (PM seat #6023, 2026-08-25). Row 1 is repaired and landed by PR #12330
(cf99875ea8). Row 2 is not, and is not a dev's to take: post-#12300 its narrow spelling
skills/*/references/** covers exactly 12 tracked files — precisely that row's own stated
population, 9 of them the _index.md it emits — so its conclusion "the only spellable claim left
is the bare root" is false on this tree and REFUSE-UNSPELLABLE no longer describes it.
Repairing the quoted value while the verdict stands would ship a row whose reason argues against
its own verdict; changing the verdict is a re-decision on a shrink-only map, reserved by this
card, by the dispatch, and by the file's own docblock alike. The class — this row plus two more
found by sweeping — is #12328, with the full measured table and options A/B/C. This card
stays open and blocked so that the unrepaired half is not hidden by a closed card.
1. check:runner-env-posture SCANNED_ROOTS packages — substantive
The row (:325-330) reads:
packages/**/src/** is the true population and collapseHint reduces it to packages, so the
only spellable claim also names every package manifest, changelog, fixture and the 2746 test
files this gate deliberately skips
Measured on fb5fbb8514:
collapseHint('packages/**/src/**') -> 'packages//src' reaches 0 tracked files
a collapse to 'packages' would have reached 5225 tracked files
collapseHint does not reduce it to packages. The ** deletions leave packages//src, and
the trailing-anchored strips (/\/+$/) cannot touch a double slash left mid-string — so the hint
is dead, not over-broad.
The verdict REFUSE-UNSPELLABLE survives, but its stated mechanism is the wrong one. As written
the row describes an over-claim that does not happen; the real reason this population is
unspellable is the #12246 double-slash defect. A reader pricing the row (or deciding whether it
becomes retirable) is reading a cost model for a collapse the function never performs.
⚠️Superseded by measurement (#12330): the mechanism above is itself wrong post-#12300.
hintCovers short-circuits a glob in a non-final segment to triggerCovers before collapseHint
is ever called, so the hint is live, not dead — and the refusal survives on the file-KIND
filter rather than the segment. That is what PR #12330 landed.
2. check:skill-refs SKILLS_DIR skills — cosmetic
The row (:316-324) reads collapseHint reduces skills/*/references/** to
skills//references/**. Measured:
collapseHint('skills/*/references/**') -> 'skills//references' reaches 0
The trailing /** is stripped; the cited value keeps it. The double-slash point — the substance,
and the row's correct citation of #12246 — is unaffected.
⚠️Also superseded: this row is not cosmetic. See the STATUS block above.
Why this is worth a row of its own
Both rows are in fact instances of the same defect (#12246), and #2 says so by number. #1 does
not, and misreads it as the collapse-to-root case instead. That matters because the two have
opposite remedies: a collapse-to-root over-claim is fixed by narrowing a declaration, while a
dead double slash is fixed in the covering rule and cannot be declared around at all.
scripts/pm/bare-root-worklist.mjs --self-test is green across both rows (46 live row(s), 39 unreachable as spelled, 39 recorded verdict(s) — none stale, none missing), because the self-test
reconciles row keys and reachability, not the prose of why. That is the same shape as the
closed #11277, one file over — a recorded verdict whose measurement text is wrong while the
machinery that would catch a wrong key stays green.
Not asserted
No claim that either verdict should change. Both are REFUSE-UNSPELLABLE and both look correct
under the measured behaviour; what is wrong is the reason text. Re-deciding a TRIAGE verdict is a
separate judgment call and is deliberately not proposed here.
Refs: #12246 (the defect both rows are instances of) · #12247 (landed both rows) · #11277 (closed;
same species, different row) · #12064 (adjacent worklist-output defect, different mechanism) ·
#12300 (the change that falsified both rows' stated mechanism) · #12328 (the class, where row 2
now lives) · PR #12330 (row 1's repair)
Blocked-by: #12328
Found while measuring #12246 (the mid-segment glob collapse). ⛔ Not fixed there — that card's
declared surface is
collapseHintand its--self-test, and its dispatch explicitly ruled theTRIAGE rows out of scope ("Measuring whether it becomes retirable is in scope; changing it is
not"). Filed unassigned, not graded.
Both rows live in
scripts/pm/bare-root-worklist.mjsand were landed by PR #12247.1.
check:runner-env-posture SCANNED_ROOTS packages— substantiveThe row (
:325-330) reads:Measured on
fb5fbb8514:collapseHintdoes not reduce it topackages. The**deletions leavepackages//src, andthe trailing-anchored strips (
/\/+$/) cannot touch a double slash left mid-string — so the hintis dead, not over-broad.
The verdict
REFUSE-UNSPELLABLEsurvives, but its stated mechanism is the wrong one. As writtenthe row describes an over-claim that does not happen; the real reason this population is
unspellable is the #12246 double-slash defect. A reader pricing the row (or deciding whether it
becomes retirable) is reading a cost model for a collapse the function never performs.
hintCoversshort-circuits a glob in a non-final segment totriggerCoversbeforecollapseHintis ever called, so the hint is live, not dead — and the refusal survives on the file-KIND
filter rather than the segment. That is what PR #12330 landed.
2.
check:skill-refs SKILLS_DIR skills— cosmeticThe row (
:316-324) readscollapseHintreducesskills/*/references/**toskills//references/**. Measured:The trailing
/**is stripped; the cited value keeps it. The double-slash point — the substance,and the row's correct citation of #12246 — is unaffected.
Why this is worth a row of its own
Both rows are in fact instances of the same defect (#12246), and #2 says so by number. #1 does
not, and misreads it as the collapse-to-root case instead. That matters because the two have
opposite remedies: a collapse-to-root over-claim is fixed by narrowing a declaration, while a
dead double slash is fixed in the covering rule and cannot be declared around at all.
scripts/pm/bare-root-worklist.mjs --self-testis green across both rows (46 live row(s), 39 unreachable as spelled, 39 recorded verdict(s) — none stale, none missing), because the self-testreconciles row keys and reachability, not the prose of
why. That is the same shape as theclosed #11277, one file over — a recorded verdict whose measurement text is wrong while the
machinery that would catch a wrong key stays green.
Not asserted
No claim that either verdict should change. Both are
REFUSE-UNSPELLABLEand both look correctunder the measured behaviour; what is wrong is the reason text. Re-deciding a TRIAGE verdict is a
separate judgment call and is deliberately not proposed here.
Refs: #12246 (the defect both rows are instances of) · #12247 (landed both rows) · #11277 (closed;
same species, different row) · #12064 (adjacent worklist-output defect, different mechanism) ·
#12300 (the change that falsified both rows' stated mechanism) · #12328 (the class, where row 2
now lives) · PR #12330 (row 1's repair)