diff --git a/scripts/check-adr-0087-registration.mjs b/scripts/check-adr-0087-registration.mjs index 8bbc395598..8e9cbd0d47 100644 --- a/scripts/check-adr-0087-registration.mjs +++ b/scripts/check-adr-0087-registration.mjs @@ -2003,7 +2003,7 @@ const IDENT = '[A-Za-z_$][A-Za-z0-9_$]*'; const MEMBER_PATH_RE = new RegExp(`^${IDENT}(?:\\.${IDENT})*$`); /** - * `path/to/file.ts#Symbol` or `path/to/file.ts#a.b.member` -> its halves, or null. + * `/.ts#` or `/.ts#..` -> its halves, or null. * * ⚠️ The grammar was widened to a dotted member path (#15627), and the widening is * only sound because the READER was widened in the same commit. `packages/client/ diff --git a/scripts/check-scripts-symbol-anchors.mjs b/scripts/check-scripts-symbol-anchors.mjs index 33fe82dab3..23751124f5 100644 --- a/scripts/check-scripts-symbol-anchors.mjs +++ b/scripts/check-scripts-symbol-anchors.mjs @@ -145,17 +145,12 @@ export const CENSUS_15765 = { * The only admissible reason is the hot-file serial queue. */ export const HELD_FILE_ALLOWANCES = Object.freeze([ - Object.freeze({ - file: 'scripts/check-adr-0087-registration.mjs', - dated: '2026-09-05', - heldBy: 'PR #15724 (#15627)', - why: 'A one-line docblock on `scripts/check-adr-0087-registration.mjs#parseSymbolRef` writes its ' - + 'placeholder path-shaped, so a resolver reads the illustration as an anchor into a file this ' - + 'tree does not have. The repair is the angle-bracket spelling `/.ts#` that ' - + '`scripts/symbol-anchors.mjs#ANCHOR_GRAMMAR` already uses, and it is one line — but the file ' - + 'is held by a governed draft awaiting a human merge, and a comment-only edit landing under a ' - + 'reviewed governed PR is exactly the conflict this queue exists to prevent.', - }), + // EMPTY, and empty is the healthy state: every row written so far has been + // retired by repairing the citation it held. The mechanism above is not dead + // code — `triage()` still takes rows, and the self-test still exercises it in + // BOTH directions against its OWN fixture row (`scripts/bad.mjs`), including + // the leg that proves a row is load-bearing rather than decorative. So an + // empty live array leaves that battery running, not vacuous. ]); export const CORPUS = defineCorpus({ @@ -244,10 +239,14 @@ function assert(cond, msg) { if (!cond) { console.error(`❌ check-scripts-symbo // exactness loop below runs four `check()`s over each row), so retiring a row // legitimately lowers this floor by 4 — and that is the ONLY reason it may be // lowered. 34 → 30 when the `scripts/check-react-page-adapter-contract.mjs` -// row was retired (#15765). Any other drop is cases that STOPPED RUNNING; find what -// stopped registering instead of moving the number. +// row was retired, then 30 → 26 when the `scripts/check-adr-0087-registration.mjs` +// row was retired and the array went EMPTY (#15765). Any other drop is cases that +// STOPPED RUNNING; find what stopped registering instead of moving the number. +// ⚠️ An empty array does NOT make the allowance battery vacuous: its five +// fixture cases run off `scripts/bad.mjs`, never off the live rows, so they are +// not part of this arithmetic and must never fall out of the count. const SELF_TEST_BATTERIES = Object.freeze({ - 'check-scripts-symbol-anchors self-test': 30, + 'check-scripts-symbol-anchors self-test': 26, }); // DELETING an entry silences that battery's floor exactly as effectively as