Uh oh!
There was an error while loading. Please reload this page.
Record the object-literal code-helper blindness with its measured blast radius (no widening) - #13228
Merged
Merged
Conversation
… measured blast radius
`check-dispatcher-error-vocabulary.mjs`'s `codehelper` shape is anchored on an
assignment (`.code = code`), so a helper that stamps through an object literal
(`return { severity, code, message }`, shorthand or longhand) matches no shape
in either gate: no site AND no unresolved entry. A second, independent
blindness sits beside it — `enclosingDeclaration` has no header form for a
class METHOD, so a method helper is unreachable even in the assignment position
the gate already implements.
Measured rather than widened, per triage's scoping of this round. The numbers,
the method and both blindnesses are recorded in
`OBJECT_LITERAL_CODE_HELPER_BLINDNESS`, printed in the run's declared bounds,
and pinned by `--self-test` with a same-genre positive control on each axis, so
a later widening of either half cannot land silently.
No shape is widened and no verdict row is added: the gate's verdict on the tree
is unchanged at 22 classified sites.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CPrUz21stTFhJRUirdc4yw
This was referenced Aug 29, 2026
os-elon
marked this pull request as ready for review
August 29, 2026 14:04
os-elon
enabled auto-merge
August 29, 2026 14:04
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#13131
This round is scoped to measurement, per triage's grading comment: 「本轮范围只到测量 …… 先量出加宽后的爆炸半径,⛔ 不先加宽。数没量出来之前,"该不该加宽"不是一个可裁的问题。」
⛔ No shape is widened. ⛔ No verdict row is added. The gate's verdict on the tree is unchanged: 22 classified sites, 0 unresolved, exit 0 — byte-identical to
main's verdict.What lands
One file:
scripts/check-dispatcher-error-vocabulary.mjs.OBJECT_LITERAL_CODE_HELPER_BLINDNESS— a frozen declaration carrying the corpora, the method and the measured numbers, following theKEBAB_DIAGNOSTIC_VOCABULARYprecedent in the same file.--self-testblock pinning both blindnesses, each against a same-genre positive control, so a later widening of either half cannot land silently.bounds, so a partial gate cannot read as a complete one.The card's four-corpus table, reproduced through the real
deriveSitesand the realfindViolations(e as any).code = codeHELPER_SCREAMINGcodehelperreturn { severity: 'error', code, message }HELPER_SCREAMINGhelper_lowercasereturn { severity: 'error', code: code, message }HELPER_SCREAMINGA reproduces exactly, so B/C/D's zeros are readings rather than a dead instrument.
The blast radius — the two counts, reported separately
Predicate: a
codeproperty of an object literal whose value is an identifier that is a parameter of the enclosing function. Evaluated on the real TypeScript AST overpackages/**non-test source (2082 files, 297 registered codes), with call-site arguments reduced by this gate's own literal grammar (^[A-Za-z][A-Za-z0-9_]*$, so a hyphen does not reduce) and checked against the registered vocabulary and the declaration table.Split by whether
enclosingDeclarationcan see the declaration at all:FieldErrorCodediagnostics (required,invalid_type,min_value, …) in four files — ADR-0112 D6 genre, cheap paperwork. The 4unresolvedfindings are the expensive half: anunresolvedentry is pushed unconditionally and no declaration row discharges it (seereconcile), so each is a RED gate with no verdict available. That includesParser#error, whose 16 call sites all pass kebab literals this gate's grammar refuses to reduce.A second, independent blindness — the card's own live instance needs both
enclosingDeclaration'sDECL_HEADER_RErecognisesfunction NAME(,constructor(andconst|let|var NAME = (— and no class method. Measured with a same-genre control:e.code = codecodehelpere.code = code{ severity, code, message }Parser#errorinpackages/sdui-parser/src/parse.tsis a class method and stamps through an object literal, so widening the position alone would not reach it. Filed separately as #13226.parseParamNamesmis-parsing two-modifier TypeScript parameter properties is #13227 — same failure class, third mechanism.Triage's p2 basis — verified, and refined
The grade rests on there being no visible victim today. Verified across the whole repo, not relayed: of the 33 SCREAMING_SNAKE values the widening would reach, 33 are already registered, so the count that are both ADR-0112 D1 shaped and unregistered is 0.
check:error-code-casing'sfindViolationsreturns 0 on every file involved. The p2 grade stands.Two refinements to the card's reasoning, neither of which moves the grade:
unresolvedfinding. Kebab keeps the values out of the site population; it does not keep the helper out of the finding population.Parser#erroris silent today is the blindness itself (both halves), not only its casing.Verification — all on the final commit
5f70b8bfb9Exit codes captured before any pipe, and each verdict quoted from the gate's own line.
Derived family,
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(13 matched + 2 convention-triggered for editing a gate script) — allexit=0:check:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:dispatcher-error-vocabulary,check:entry-guard,check:parse-guard,check:pnpm-filter-targets,check:watch-hint-literal,check-ci-filter-parity.mjs,check-cross-package-test-inputs.mjs,check-shard-attestation.mjs,pm/bare-root-worklist.mjs --self-test,check:pm-dispatch-gates.check-test-completeness.mjsexits 3 withPREREQUISITE NOT MET— its own text says this branch is NOT MEASURED, not a red (#13110).The pins are shown capable of failing
A green self-test over a healthy tree proves nothing, so both halves were ablated. Each mutation was proved on disk by an anchored
grep -con the injected text plus a blob-hash change; each restore leg usedgit checkout HEAD -- ABSOLUTE_PATHunder anEXIT INT TERMtrap and was proved by hash equality with theHEADblob and an emptygit diff HEAD, with the self-test green again afterwards.codehelperwith an object-literal shorthand anchor: self-test exit 1, 4 assertions fire, naming the measured numbers and the decision.DECL_HEADER_REa class-method header: self-test exit 1, the class-method assertions fire, including the mechanism-level one onenclosingDeclaration.The counting instrument was falsified before its output was read: 5/5 corpora (A/B/C/D plus the class-method case) and 8/8 negative controls — call-argument list, array element, template interpolation, destructured local, destructured param, module constant, property-access value, object pattern in an assignment. An earlier regex instrument was discarded because it matched
${code}in a template andf(a, code, b)in an argument list, then lost a true positive when a bracket inside a regex literal unbalanced its scan.Bounds this measurement does not have
helperCodesForscans only the declaring file, so every count is over in-file call sites. An exported helper called from another package contributes 0 —sendErrorinpackages/types/src/response-envelope.tshas 0 in-file calls and is one of the fourunresolved. Counting cross-file callers needs resolution this source scan does not have: that number is unmeasured, and (a) is a lower bound on it, never an upper one. Measuring it would need a real module graph or a type-aware pass.Scope
packages/sdui-parser/**was read as evidence only and is untouched here (held by #13154). No changeset: this edits a CI-internal gate script and releases nothing, which is theskip-changesetcaselint.ymlprescribes; the label is applied on this PR.The widening question is now decidable, and by triage's own framing it belongs on its own card together with the
domain:cliverdict rows. Not filed here — that is the PM's call, and it is raised in the dispatch report.Generated by Claude Code