Found by measurement while closing #13226 (the CLASS METHOD declaration form). Recorded rather than fixed there: that card is fenced to the class-method form, and this is a fourth form on which no census has ever been run, so it is not a rider.
The shape
enclosingDeclaration in scripts/check-dispatcher-error-vocabulary.mjs now recognises four header forms: function NAME(, constructor(, const|let|var NAME = (, and — as of #13226 — a CLASS METHOD header. There is still no form for a class PROPERTY holding an arrow:
class Thing {
private fail = (code: string, message: string) => {
const e = new Error(message);
(e as any).code = code;
return e;
};
}
The const|let|var NAME = ( form does not reach it (there is no const keyword on a class property), and the class-method form does not either (the name is followed by =, not by (). So the identifier is never recognised as a parameter, helperCodesFor returns null, and the site falls through to resolveConstant, which reduces nothing. No site, no unresolved, nothing reported.
Measured, with a same-genre positive control
Same body, same unregistered probe, one declaration form apart, through the real deriveSites:
| declaration form | body | result |
|---|
control: private fail(code, message) (a METHOD) | e.code = code | 1 site, shape codehelper |
subject: private fail = (code, message) = arrow | e.code = code | 0 sites, and 0 unresolved |
The control is what makes the zero a reading rather than a dead harness. enclosingDeclaration answers null on the subject.
Why it matters
Same genre as #9223 / #9460 / #10918 / #13131 / #13226: a shape the gate's prose claims to cover, implemented for some syntactic forms and silently absent in a sibling form. The declared bound — a value the gate cannot reduce is REPORTED, never dropped — cannot hold, because nothing is recognised in the first place.
Blast radius: zero live instances today
Measured on packages/** non-test source: 0 class-property-arrow helpers stamp .code = ident. So this is preventing a future defect, not fixing a present one — the same posture that graded #13226 p2, and for the same reason: it is a property of the TREE, not of the gate, so it expires and wants re-measuring rather than quoting.
Not decided here
Whether the form is worth admitting at all. It is cheap to recognise (the existing const|let|var alternative already handles NAME = (; the class-property case differs only in having a modifier run instead of a declaration keyword), but it has no live instance to justify it, and this repo's standing discipline is implementation-first for surfaces with no pull.
The blindness is recorded in OBJECT_LITERAL_CODE_HELPER_BLINDNESS in scripts/check-dispatcher-error-vocabulary.mjs as an explicit non-goal of #13226, so nothing here is undocumented — this card only asks whether to close it.
Generated by Claude Code
Found by measurement while closing #13226 (the CLASS METHOD declaration form). Recorded rather than fixed there: that card is fenced to the class-method form, and this is a fourth form on which no census has ever been run, so it is not a rider.
The shape
enclosingDeclarationinscripts/check-dispatcher-error-vocabulary.mjsnow recognises four header forms:function NAME(,constructor(,const|let|var NAME = (, and — as of #13226 — a CLASS METHOD header. There is still no form for a class PROPERTY holding an arrow:The
const|let|var NAME = (form does not reach it (there is noconstkeyword on a class property), and the class-method form does not either (the name is followed by=, not by(). So the identifier is never recognised as a parameter,helperCodesForreturnsnull, and the site falls through toresolveConstant, which reduces nothing. No site, no unresolved, nothing reported.Measured, with a same-genre positive control
Same body, same unregistered probe, one declaration form apart, through the real
deriveSites:private fail(code, message)(a METHOD)e.code = codecodehelperprivate fail = (code, message) =arrowe.code = codeThe control is what makes the zero a reading rather than a dead harness.
enclosingDeclarationanswersnullon the subject.Why it matters
Same genre as #9223 / #9460 / #10918 / #13131 / #13226: a shape the gate's prose claims to cover, implemented for some syntactic forms and silently absent in a sibling form. The declared bound — a value the gate cannot reduce is REPORTED, never dropped — cannot hold, because nothing is recognised in the first place.
Blast radius: zero live instances today
Measured on
packages/**non-test source: 0 class-property-arrow helpers stamp.code = ident. So this is preventing a future defect, not fixing a present one — the same posture that graded #13226 p2, and for the same reason: it is a property of the TREE, not of the gate, so it expires and wants re-measuring rather than quoting.Not decided here
Whether the form is worth admitting at all. It is cheap to recognise (the existing
const|let|varalternative already handlesNAME = (; the class-property case differs only in having a modifier run instead of a declaration keyword), but it has no live instance to justify it, and this repo's standing discipline is implementation-first for surfaces with no pull.The blindness is recorded in
OBJECT_LITERAL_CODE_HELPER_BLINDNESSinscripts/check-dispatcher-error-vocabulary.mjsas an explicit non-goal of #13226, so nothing here is undocumented — this card only asks whether to close it.Generated by Claude Code