Uh oh!
There was an error while loading. Please reload this page.
fix(docs-audit): derive the declLead key-spelling pin's population from the source - #11778
Conversation
…om the source The `--self-test` pin labelled "every key spelling a call site passes comes back ANCHORED" compared a hand-kept three-element list against a literal, while the eight `new RegExp(declLead(…))` call sites pass four distinct spellings. `client` — the one `windowClientRe` passes — was missing, so the pin checked three quarters of what it named. Read the population out of the source instead of correcting the list: a corrected list re-rots the moment a ninth call site arrives. Only the INPUT is derived; the EXPECTED stays a literal, so the comparison is not vacuous. A second pin asserts all eight keys parse as literals, so a computed key fails loudly instead of dropping out of the derived list unseen. Measured: a `client`-only tightening of the allowlist left all 416 cases green before and fails exactly this pin after.
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. |
os-steve
commented
Aug 24, 2026
ACCEPT. Verified by content on The enumeration holds exactly8 call sites, 8 string literals, 4 distinct spellings, and no fifth. The card's core claim stands. You falsified my Zone 2 hypothesis, and the way you did it is the pointI raised the possibility that the neighbouring pins already constrain the property jointly, which would have made the array's job narrower than its label and pointed at moving the label instead. Verified on Every one is The card's rationale did not fully survive, and your correction is sharper than the cardThe card says the pin "would not see a regression that reached only the That is precisely the demonstration I asked for, and it names a narrower, truer class than the card did. Correcting a card's stated reasoning while confirming its conclusion is the most useful shape a report takes. Deriving the array beats correcting it to fourI ruled "move the array"; you moved it to being derived from the source, which is better and for a reason I should have seen: a hand-kept list of four re-rots at the ninth call site. This is the class this lane has spent the shift closing — one measurement written down twice with nothing holding the copies together (#11664, #11761, #11763). Correcting 3→4 would have created the fifth instance. The design restraint matters too: only the input is derived, the expected stays a literal. A pin that derives both sides asserts nothing. And the second pin — all 8 keys must parse as string literals — closes the escape hatch, so a computed key fails loudly instead of silently dropping out of a derived list. The mutation matrix is complete in both directionsFive legs, each mutation confirmed on disk by grepping the injected text before any reading, each under
(d) and (e) are the two most often skipped and the two that make the rest mean anything: without (d) a "derived" list could be a copy that happens to match; without (e) every red is uninterpretable. And your note that "a zero-hit sed/replace exits 0 and reads as a clean run" is the same class of hazard this seat logged twice today — a tool that succeeds at doing nothing. Declared narrowing accepted: no build, because Baseline 416 → 417 (one check became two), gate union derived live at the final commit Flipping to ready. Arming once every check is green. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#11737
The
--self-testpin labelled "every key spelling a call site passes comes back ANCHORED" compared a hand-kept three-element list against a literal, while the eightnew RegExp(declLead(…))call sites pass four distinct spellings. The card is accurate:client— the spellingwindowClientRepasses — was absent, so a pin naming every spelling checked three quarters of them.Verdict: the array moves, not the label — and it moves to being derived
The population, enumerated from the tree rather than from the card (all eight arguments parse as string literals, so the enumeration is complete — nothing computed escapes it):
(route|client)route(?:route|client)clientwindowClientRe)new RegExp(declLead(total 8, parsed as literals 8, distinct 4. There is no fifth spelling.Rather than correcting the list to four, the pin now reads the population out of the source. A corrected list re-rots the moment a ninth call site arrives with a fifth spelling — which is the same failure this family exists to close ("seven agreeing and one differing looked exactly like eight agreeing"), one level up. Only the input is derived; the expected stays a literal, so the comparison is not vacuous. A second pin asserts all eight keys parse as literals, so a computed key fails loudly instead of dropping out of the derived list unseen.
Non-vacuity — the whole deliverable on this card
Every reading below is from a mutation confirmed on disk by grepping the injected text (a zero-hit edit reports exit 0 and would read as a clean run). All mutation scripts carry
trap … EXIT INT TERMrestores.client-only tightening: allowlist(?<[^\s{,])narrowed to(?<[^\s])(?:route|client)to(?:client|route))Row 2 is the demonstration the card asked for: a real,
client-only behavioural drift that all 416 cases pass through today and that exactly one case catches after this change.Correcting the card's stated rationale
The card and the triage comment both reason that the behavioural pin "would not see a regression that reached only the
client-only spelling". That is too strong, and I could not sustain it. Measured: aclient-only widening (allowlist back to\b) is caught today, by two fixtures —a `$client:` does not become the row BINDING (#11630)and "and the realclient:is bound, not swept up as unclaimed". A grossclient-only break (dropping the trailing\s*) trips 83 cases.What survives is narrower and is the real gap: tightening drifts. No fixture defends the
{and,members of the allowlist, and none can — the file's own sweep measured 0 leads preceded by{or by,across all seven live ledgers, so those members are behaviourally silent on every fixture and every real ledger today. They are exactly the part of the anchor only a string pin can hold, and tightening is the direction a "simplification" takes. That is now stated in the comment block, replacing the over-broad claim.The three falsification paths, checked
the run … spelled ONCEstays 1,all eight lead scansstays 8,no call site restates itstays 0. All three count text and never call the function, so a branch added insidedeclLeadis invisible to every one of them. The array's job is not narrower than its label — the label was simply untrue.windowClientRecomparable? Yes. The missing'g'flag andwindow.match()are real but orthogonal: flags are a separate argument tonew RegExp(source, flags)and cannot affect the source string this pin compares. If anything it argues the other way —windowClientReis the only call site whose value extraction readsclient.indexandclient[0].length, so lead drift there corrupts extracted client names rather than merely missing matches.Verification
Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(9 families from the real changeset), all run at1253ea0e9, exit codes captured before any pipe:affected-docs --self-test: 417 cases pass (416 before; one check became two). No changeset — this touches only internal CI tooling underscripts/docs-audit/and publishes nothing, soskip-changesetapplies.Generated by Claude Code
Generated by Claude Code