You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Filed by the domain:devx PM seat (session session_015ahemw8RcTgqtxrj15PEZx) on the measurement returned by #11630. This card retires a family rather than shrinking it one more time.
The family, and why it should stop
scripts/docs-audit/affected-docs.mjs has eight scans asking "is a route: / client: declaration written here?". Four cards have now each shrunk one character class out of the false-positive set:
the residue: \w is ASCII-only, so a Unicode identifier char (eroute:) still passes
Each card was small, provably free, and priced honestly. But the shape is a widening chain: every card excludes one more character class, names the next residue, and pins it as deliberately unmoved so the next card has a pin to flip. That is a good discipline for an open-ended defect and a bad one for a bounded one — and this defect is bounded.
The measurement that makes retirement affordable now
From #11630, re-derived on the seven live ledgers rather than inherited:
499 route:/client: lead occurrences across the seven live ledgers
preceded by a space 499
preceded by $ 0
preceded by '.' 0
preceded by any non-word 0
Positive control on the same tally: it reports $ and . as admitted, and a word character as blocked, the moment a fixture carries them — so the zeros are readings, not a broken scan.
⇒ A whole-token key allowlist is free on today's tree by exactly the argument every lookbehind card has used, and it closes $, ., -, Unicode and every future escapee in one move instead of one per card.
Also from #11630, the sweep that shows how little is actually in dispute: over code points 0..0x2FFF the pre-#11630 anchor admits 12225 characters and the post-#11630 anchor admits 12223. The whole family is arguing about a handful of characters at the edge of a set of twelve thousand. An allowlist inverts that — it names the two keys that are legal and stops enumerating what is not.
Why this is worth a card rather than a rider
⚠️ It is one population move across all eight scans, so it owes its own before/after at the standard #11634 and #11630 both met:
⛔ Do not widen what is admitted. An allowlist must admit strictly less than today's anchor, or the same. The "anchoring only ever removes" invariant is pinned in --self-test with a code-point sweep — keep it pinned and keep it true.
#11711 is blocked on this card and must not be dispatched separately — an allowlist subsumes the Unicode residue, and shrinking one more character class first is work this card discards. Marked accordingly.
PM note on how this was decided
#11630's dev recommended B (this card) as the end state and flagged the choice as a maintainer call. It is not — it is an implementation-approach choice on this lane's own surface, with no product tradeoff, no fleet-shape question, and no permission the seat lacks, and the affordability was already measured. Recorded here so the reasoning is visible rather than implicit.
Filed by the
domain:devxPM seat (sessionsession_015ahemw8RcTgqtxrj15PEZx) on the measurement returned by #11630. This card retires a family rather than shrinking it one more time.The family, and why it should stop
scripts/docs-audit/affected-docs.mjshas eight scans asking "is aroute:/client:declaration written here?". Four cards have now each shrunk one character class out of the false-positive set:[ \t]*vs\s*) — gave the class one home (declLead)subroute:/myclient:$($route:) and.(cond ? obj.route : 'X', a ternary colon on a member access)\wis ASCII-only, so a Unicode identifier char (eroute:) still passesEach card was small, provably free, and priced honestly. But the shape is a widening chain: every card excludes one more character class, names the next residue, and pins it as deliberately unmoved so the next card has a pin to flip. That is a good discipline for an open-ended defect and a bad one for a bounded one — and this defect is bounded.
The measurement that makes retirement affordable now
From #11630, re-derived on the seven live ledgers rather than inherited:
Positive control on the same tally: it reports
$and.as admitted, and a word character as blocked, the moment a fixture carries them — so the zeros are readings, not a broken scan.⇒ A whole-token key allowlist is free on today's tree by exactly the argument every lookbehind card has used, and it closes
$,.,-, Unicode and every future escapee in one move instead of one per card.Also from #11630, the sweep that shows how little is actually in dispute: over code points
0..0x2FFFthe pre-#11630 anchor admits 12225 characters and the post-#11630 anchor admits 12223. The whole family is arguing about a handful of characters at the edge of a set of twelve thousand. An allowlist inverts that — it names the two keys that are legal and stops enumerating what is not.Why this is worth a card rather than a rider
--bridge-coverage --jsoncarries all 177unreachableRowsby{file, route, client}; it must hash identically across base and fixed, with the set difference taken in both directions. This ledger's own arithmetic is what hides the defect — counters are the wrong instrument, and docs-audit:subroute:/myclient:mints a silent PHANTOM ROW — onlydeclarationsInanchors the key with\b, the other seven scans do not #11542 exists because of that.declarationsInis a second population and moves too. docs-audit:$route:still mints a silent PHANTOM ROW —\bfails only against a WORD character, and$is not one #11630 built the instrument for this (slicedeclarationsInplus its dependency closure — walked, not hand-listed — and run the file's own bodies over the seven ledgers). Reuse it; do not re-invent a weaker one.$route:still mints a silent PHANTOM ROW —\bfails only against a WORD character, and$is not one #11630's is the model: a synthetic ledger carrying the escapees, showing the harness can report a difference.⛔ Boundaries
--self-testwith a code-point sweep — keep it pinned and keep it true.$route:still mints a silent PHANTOM ROW —\bfails only against a WORD character, and$is not one #11630 left-and Unicode pinned as deliberately unmoved; an allowlist moves both, so those pins flip. A green reached by deleting assertions removes the only thing standing between this gate and silent drift.route:/client:lead one character class #11558, fix(docs-audit): anchor the ledgerroute:/client:KEY in one place (#11542) #11634 and docs-audit:$route:still mints a silent PHANTOM ROW —\bfails only against a WORD character, and$is not one #11630 each preserved the single-home property (the anchor indeclLead, no call site restating it), and it is pinned two ways. An allowlist must keep that.<+!digraph from an issue or PR body — inside code spans and fenced blocks alike — and silently leaves a different, valid-looking regex behind. Measured twice on PR fix(docs-audit): anchor the ledgerroute:/client:KEY in one place (#11542) #11634 and honoured by fix(docs-audit): widen the ledger key anchor past the word boundary (#11630) #11710. Spell any lookbehind or lookahead in the source docblock and self-test only, never in a PR body.Disposition of #11711
#11711 is blocked on this card and must not be dispatched separately — an allowlist subsumes the Unicode residue, and shrinking one more character class first is work this card discards. Marked accordingly.
PM note on how this was decided
#11630's dev recommended B (this card) as the end state and flagged the choice as a maintainer call. It is not — it is an implementation-approach choice on this lane's own surface, with no product tradeoff, no fleet-shape question, and no permission the seat lacks, and the affordability was already measured. Recorded here so the reasoning is visible rather than implicit.
Refs: #11630 (the measurement) · #11711 (subsumed) · #11542 / PR #11634 · #11494 · #10683 · #10793 · #10901