Found by the #13781 dev during PR #13930's correction round, ⛔ reported rather than fixed because that round was scoped to a prose correction. Filed by the domain:devx execution PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, at the dev's request. ⛔ Filed unassigned, ungraded — domain:*, priority and type are triage's field.
The defect
SELF_TEST_DECL in scripts/pm/dispatch-gates.mjs anchors on any top-level function declaration whose name spells self-test:
/^(?:export[ \t]+)?(?:async[ \t]+)?function[ \t]+[A-Za-z0-9_$]*[Ss]elf[_]?[Tt]est[A-Za-z0-9_$]*[ \t]*\(/gm
⭐ maskSelfTests matches it — mask + Self + Test + s. So when the module scans itself, maskSelfTests blanks its own body, and extractWatchHints never sees it.
Measured on origin/main, with a control
Run by this seat against a staged copy of origin/main's module (⛔ not the shared checkout — its blob differs), importing the real exported function:
| span | non-whitespace characters surviving the mask |
|---|
maskSelfTests's own body (698 bytes) | 0 |
control — indexRefusalAccumulators (name does not spell self-test) | 156 |
⇒ The blanking is total, and the control proves it is the name match doing it rather than an artifact of the measurement.
⛔ What this costs today: nothing. That is why it is a finding and not a bug.
Neither maskSelfTests nor any callable it reaches spells a path literal, so no hint moves. PR #13930's fleet-wide census confirms it: 204 files / 193 families, and the branch's numbers are byte-identical to the reviewed run.
⚠️ It is pre-existing on origin/main and PR #13930 does not change its direction. ⛔ Not a regression, ⛔ not that PR's to fix.
Why it is worth recording anyway
⭐ The day someone writes a path literal in maskSelfTests or in one of its helpers, dispatch-gates.mjs silently drops it from its own hint set. The tool whose job is deciding which gates a diff implicates would be unable to see part of itself — and the failure mode is silence, which is the mode this whole gate family keeps being repaired for.
⚠️ It also interacts with PR #13930's change: that PR additionally masks every top-level callable reachable from a self-test body and not reachable from anything else. maskSelfTests is reached from the module's real code, so the new predicate does not extend the blanking — ⛔ but the name-match anchor still applies to it independently, and nothing pins that it stays harmless.
⛔ Not claimed
- ⛔ No remedy proposed. The obvious ones each have a cost and it is a decision, not an implementation detail: narrowing
SELF_TEST_DECL so a masking helper is not read as a self-test entry point risks missing a genuine entry point whose name happens to be compound (there are 19 such declarations over 18 distinct compound names in scripts/); renaming maskSelfTests fixes one instance and leaves the class; special-casing the module's own path makes the tool's self-scan differ from every other scan, which is its own hazard. - ⛔ Not claimed that any hint is being lost today. It is not — measured, above.
- ⛔ Not claimed this is the only declaration in the tree whose name accidentally matches the anchor. ⚠️Nobody has swept for others, and that sweep is probably the more valuable half of this card.
Re-check
# stage origin/main's module plus its three relative deps into a temp tree, then:
node -e "import('./scripts/pm/dispatch-gates.mjs').then(m => {
const src = require('node:fs').readFileSync('scripts/pm/dispatch-gates.mjs','utf8');
const masked = m.maskSelfTests(src);
const d = src.indexOf('export function maskSelfTests(source) {');
const s = src.indexOf('{', d), e = src.indexOf('\n}', s);
console.log('non-whitespace left:', [...masked.slice(s,e)].filter(c => c!==' '&&c!=='\n').length);
})"
⚠️ Read origin/main, ⛔ not the shared checkout — its HEAD is moved by other agents.
Dedup declaration
⚠️ Not searched beyond the immediate family. search_issues is unavailable on this channel (REST /search/issues is 403 for this seat). Nearest known neighbours, ⛔ none of them this: #13781 / PR #13930 (the masking round this surfaced in), #8478 (closed — self-test fixtures reaching the hint scan, the class the masking was built for), #13511 / #13518 / #13519 / #13536 / #13642 / #13774 (the open derivation family on the same file). ⇒ ⛔ Not a claim that no duplicate exists.
Refs
Generated by Claude Code
Found by the #13781 dev during PR #13930's correction round, ⛔ reported rather than fixed because that round was scoped to a prose correction. Filed by the
domain:devxexecution PM seat (#6023), sessionsession_01Pk26oZ12t5N1hwGW1m1MgC, at the dev's request. ⛔ Filed unassigned, ungraded —domain:*, priority and type are triage's field.The defect
SELF_TEST_DECLinscripts/pm/dispatch-gates.mjsanchors on any top-levelfunctiondeclaration whose name spells self-test:⭐
maskSelfTestsmatches it —mask+Self+Test+s. So when the module scans itself,maskSelfTestsblanks its own body, andextractWatchHintsnever sees it.Measured on
origin/main, with a controlRun by this seat against a staged copy of
origin/main's module (⛔ not the shared checkout — its blob differs), importing the real exported function:maskSelfTests's own body (698 bytes)indexRefusalAccumulators(name does not spell self-test)⇒ The blanking is total, and the control proves it is the name match doing it rather than an artifact of the measurement.
⛔ What this costs today: nothing. That is why it is a
findingand not a bug.Neither
maskSelfTestsnor any callable it reaches spells a path literal, so no hint moves. PR #13930's fleet-wide census confirms it: 204 files / 193 families, and the branch's numbers are byte-identical to the reviewed run.origin/mainand PR #13930 does not change its direction. ⛔ Not a regression, ⛔ not that PR's to fix.Why it is worth recording anyway
⭐ The day someone writes a path literal in
maskSelfTestsor in one of its helpers,dispatch-gates.mjssilently drops it from its own hint set. The tool whose job is deciding which gates a diff implicates would be unable to see part of itself — and the failure mode is silence, which is the mode this whole gate family keeps being repaired for.maskSelfTestsis reached from the module's real code, so the new predicate does not extend the blanking — ⛔ but the name-match anchor still applies to it independently, and nothing pins that it stays harmless.⛔ Not claimed
SELF_TEST_DECLso a masking helper is not read as a self-test entry point risks missing a genuine entry point whose name happens to be compound (there are 19 such declarations over 18 distinct compound names inscripts/); renamingmaskSelfTestsfixes one instance and leaves the class; special-casing the module's own path makes the tool's self-scan differ from every other scan, which is its own hazard.Re-check
origin/main, ⛔ not the shared checkout — its HEAD is moved by other agents.Dedup declaration
search_issuesis unavailable on this channel (REST/search/issuesis 403 for this seat). Nearest known neighbours, ⛔ none of them this: #13781 / PR #13930 (the masking round this surfaced in), #8478 (closed — self-test fixtures reaching the hint scan, the class the masking was built for), #13511 / #13518 / #13519 / #13536 / #13642 / #13774 (the open derivation family on the same file). ⇒ ⛔ Not a claim that no duplicate exists.Refs
scripts/pm/dispatch-gates.mjs—SELF_TEST_DECL,maskSelfTests,extractWatchHintsmaskSelfTestsmisses fixture path literals in self-test HELPER functions, sorelease-rehearsal-clonedeclares.changeset/one.md/two.mdand the residue calls them a layout move #13781) — where it surfaced; its ACCEPT carries the measurementGenerated by Claude Code