Uh oh!
There was an error while loading. Please reload this page.
fix(devx): dispatch-gates marks dead watch-hint literals in reachable families and refuses @-scoped specifiers as paths (#13312) - #13447
Merged
os-project-manager merged 1 commit intoAug 30, 2026
Conversation
…fuse @-scoped specifiers as paths Three of the five hints --residue showed for check:query-options-erasure named files that have never existed, printed verbatim: the annotator only spoke when a WHOLE family was unreachable, so one live baseline walked its dead siblings past every reader unlabelled. Measured across all families before choosing the route: 65 of 151 declaring families carried 598 such literals, 353 of them @-scoped package specifiers. - deadHintSweep: the reachability sweep at per-hint grain; the unreachable listing and the new residue annotations read one sweep, two grains. - residueNames / deadNamesNote: dead literals are marked where shown and counted with reasons where not. - isNonPathNamespace: an @-headed first segment (npm scope, version-suffixed specifier, bundler alias) is a namespace, not a path — 353 dead hints refused at extraction, zero tracked paths start with @, no live hint moves. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
This was referenced Aug 30, 2026
os-project-manager
marked this pull request as ready for review
August 30, 2026 12:43
os-project-manager
enabled auto-merge
August 30, 2026 12:43
Uh oh!
There was an error while loading. Please reload this page.
os-project-manager
deleted the
claude/issue-13312-residue-fabricated-leads
branch
August 30, 2026 13:11
This was referenced Aug 30, 2026
This was referenced Aug 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#13312
The defect, and the measurement that chose the route
dispatch-gates --residueprinted three literals incheck:query-options-erasure'snames:line that name files which have never existed in this tree, verbatim, with no dead annotation — the annotator only spoke when a WHOLE family was unreachable, so one live baseline walked its dead siblings past every reader unlabelled.The card declared its scope unmeasured and listed three routes (extractor / annotator / gate-rename) without deciding. Per the dispatch ruling I re-derived the population across ALL families first, on this branch's base
5f0a9c4ad:a3d95518)undetermined)Shape split of the 598: 353 were
@-scoped package specifiers (@objectstack/spec,@fx/canary,@typescript-eslint/parser,@/lib/i18n) — the widest single species, exactly the one the third-instance comment on the card measured. 245 are path-shaped fixture names, owner/repo slugs, action specs and drifted doc examples — no closed shape can refuse those, so they are annotated instead of removed.The measurement picked the route: gate-rename was dead on arrival (it fixes 3 of 598), and the numbers chose one narrow extractor refusal plus the unconditional annotator.
What changed (one file:
scripts/pm/dispatch-gates.mjs)deadHintSweepis the existing reachability sweep at per-hint grain;unreachableFamiliesnow reads its answer off it (one sweep, two grains, no disagreement — pinned). Under--residue, a dead literal is marked where shown and counted where not:(The live output uses the ballot-X mark; spelled as X here to keep this body free of markup-sensitive characters.) Display only — no verdict moves; matched/undetermined/silent and the unreachable listing are byte-compatible except for the new marks and notes.
isNonPathNamespacegains a third closed shape. A first segment beginning with@is a scope marker, not a directory — npm grammar, not a heuristic. Zero tracked paths have an@-headed first segment (measured at5f0a9c4ad), so all 353 refused literals were dead: no live hint moves, no card's verdict moves. The two families whose ENTIRE population was a package-name ledger (check:driver-memory-census,check-test-completeness.mjs— the third-instance comment's table) leave the unreachable listing forundetermined, the bucket that predicate's docblock calls strictly more honest.check:stall-guard-headroom's owner/repo slug is NOT refusable by shape (two bare words are what a path looks like — pinned in that direction) and is now annotated instead.Zone 2 hypothesis: falsified, with numbers
The PM's hypothesis was that the extractor should stop scraping self-test fixture constants because "a fixture-name constant is not a declaration in any sense." I prototyped exactly that (mask module-scope constants whose identifier is referenced only inside self-test bodies, iterated to a fixed point) and measured it: 96 hints removed — 10 dead, 86 LIVE. The live removals include
packages/**andskills/**subtree declarations, whole published-files rosters, and baseline artifacts — because this repo's sanctioned declaration idiom (ROOT_DIR_WATCH_HINTS: a module-scope constant that exists FOR the scanner, referenced only by the self-test that pins it) is structurally indistinguishable from a fixture constant. Reference analysis deletes 8.6 real populations per fabrication removed. In this codebase a scanner-facing constant IS a declaration, so the premise fails and that route is refused. The fixture-name class stays in the hint sets and is now annotated.The three non-empty delivery controls (from triage)
scripts/query-options-erasure-baseline.jsonleads the family'snames:line above; pinned as...and leaves the real hint beside it unmarked.scripts/__planted_never_existed__.mjsplanted beside a live hint is swept, marked in the names fragment, and counted1 of 2with its reason in the note.Verification (all at head
a3d95518, exit codes captured before any pipe)pnpm check:pm-dispatch-gates— verdict line:dispatch-gates self-test: 944 cases pass.(includes the ~30 new pins; one pre-existing pin's specimen-finder needed a third exclusion — the job-filter key,#12956's channel — because thinning the inherited pairs made its.findland on a job-filtered family first; the pin's claim is unchanged)node scripts/pm/bare-root-worklist.mjs --self-test—OK self-test: 51 live row(s), 43 unreachable as spelled, 43 recorded verdict(s) - none stale, none missing, none contradicted.node scripts/check-self-test-wired.mjs—every one of the 151 script(s) CI runs that ship a --self-test has that self-test run by CI.dispatch-gatesno-path mode, banner names commita3d95518):check:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:entry-guard,check:parse-guard,check:pm-dispatch-gates,check:pnpm-filter-targets,check:watch-hint-literal,check-ci-filter-parity,check-self-test-wired, pluscheck:nul-bytes— all exit 0, each verdict read from the gate's own judgment line.check-shard-attestation.mjs,check-test-completeness.mjs,check-cross-package-test-inputs.mjsin their ci.yml forms — they read CI run artifacts (test logs) that do not exist locally; CI runs them on this PR.Out of scope, surfaced by the new annotation (handed to the PM, dedup channel degraded)
hintCoversdoes not follow a final-segment basename glob:.changeset/*.mdcovers zero tracked files while the tree holds ~400 matching changesets, so several changeset gates' hints measure dead and the reason renderer calls itlayout moved, which is false. Verdict-moving to fix; not this card.check:doc-anchorscarries the fabricated hintscripts/scripts/check-doc-anchors.mjs: line 459 of that gate spells./scripts/check-doc-anchors.mjsinside a remedy-message string meant to run from the repo root, and the module-relative resolve doubles the prefix. Now annotated; the spelling fix belongs to that gate.This PR is
skip-changeset: the whole diff isscripts/pm/dispatch-gates.mjs, internal PM tooling — nothing is published from a package.Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
🤖 Generated with Claude Code
Generated by Claude Code
Generated by Claude Code