Commit 52ef672
fix(pm): route the artifact-roster classifier through the file's own resolver (#13862)
* fix(pm): route the artifact-roster classifier through the file's own resolver
`artifactOnlySilence` decided "every declared literal is a tracked FILE" with
`trackedFiles.has(collapseHint(h))` — a private, weaker copy of a question this
file already has an owner for. `hintCovers` follows a dropped extension through
MODULE_SPECIFIER_EXTENSIONS and `extensionlessModuleTarget` names the file such
a specifier resolves to; this predicate followed neither, so a family whose
roster is extensionless import targets failed the every-literal test and printed
as an ordinary silence — a different fact, and one that reads as a clearance.
The repair is the single owner, not a list of the families it got wrong:
`declaredFileTarget` is now the one answer to "the tracked FILE this declared
literal names", composed from the membership test and the resolver, with
patterns refused up front. `artifactOnlySilence` asks it and holds no rule of
its own, and takes the `watchHintTree` bundle rather than a bare file set —
refusing the bare set loudly, since that is exactly the input that
mis-categorises silently.
Measured over the whole fleet at 16c3601 (192 families, 754 distinct hints,
7605 tracked files): artifact-roster families 30 -> 39 (+9, ZERO lost), zero
existing rosters whose membership or directory moved, and literals where the
covering rule and the classifier disagree 40 -> 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
* test(pm): state the class guard over the CLASSIFIER, not over the resolver
The first spelling of the fleet-wide agreement case compared
`declaredFileTarget` against `hintCovers`. The ablation that put the old
per-literal rule back inside `artifactOnlySilence` left the resolver untouched,
so that case was GREEN against the exact bug it exists to catch — a guard on the
owner does not hold the caller to it. Restated at family grain over the
classifier's own output: 5 of 1060 cases red under the ablation before, 6 after,
and the sixth is the one that generalises past the fixture.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 46b53a2 commit 52ef672
1 file changed
Lines changed: 297 additions & 17 deletions
0 commit comments