Filed unassigned and unlabelled, as an observation for triage, by the #16898 implementer.
Grade deliberately not asserted. ⛔ Deliberately left alone by the PR for #16898, which is #18100: that card
forbids widening the shared core by name, because the core is shared and a widening there
lands on every corpus at once.
Where this came from
#16898 bound scripts/check-platform-checklist.mjs to the one shared resolver,
scripts/symbol-anchors.mjs#symbolResolutionClass. Withdrawing its private permissive rule
stopped 56 of 633 anchor occurrences from resolving. All 56 were enumerated and classified on
that PR; 47 are bad citations (the cited file genuinely does not declare the symbol) and 8
are not — they name something real that the shared accept set does not reach. Those 8 are
this card.
The 8, in two shapes
(1) An object-literal key written INLINE rather than at the start of a line — 6
scripts/symbol-anchors.mjs#scriptSymbolClass admits "a member or object-literal key written
at the START OF A LINE". A key written inline in the same object literal is the same
declaration, differently formatted:
| anchor |
the site, as written |
examples/app-showcase/objectstack.config.ts#declarativeStdio |
new ConnectorMcpPlugin({ declarativeStdio: ['node'] }), |
examples/app-showcase/src/data/objects/business-unit.object.ts#allowCreate |
Field.lookup('showcase_business_unit', { label: 'Parent Unit', allowCreate: true }) |
examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#onMismatch |
validation: { onMismatch: 'warn', checkOnBoot: true }, |
examples/app-showcase/src/ui/actions/index.ts#maxSize |
{ name: 'p_cover', type: 'image', ..., maxSize: 5 * 1024 * 1024 }, |
examples/app-showcase/src/data/seed/index.ts#sales_region |
{ name: 'Northwind', ..., sales_region: 'amer', ... } |
examples/app-showcase/src/data/seed/index.ts#signed_on |
same seed rows |
⚠️ Note what they have in common: every one is a config or seed data literal, which is
where this platform's authorable surface actually lives, and formatting one object per line is
exactly what nobody does there.
(2) A DATA identifier that is the HEAD SEGMENT of a dotted string token — 2
literal is a COMPLETE quoted token, deliberately, so a substring of running text cannot
resolve an anchor. But a dotted machine name is not running text:
| anchor |
the site, as written |
packages/spec/src/kernel/public-auth-features.ts#sys_user |
'sys_user.actions.enable_two_factor', and 10 more |
packages/spec/src/kernel/public-auth-features.ts#sys_invitation |
'sys_invitation.actions.invite_user', and 2 more |
sys_user is precisely the vocabulary the literal class was added for — the module's own
header names "object and field API names like sys_metadata, crm_account" as the reason it
exists. Here the name is declared, and only the dotted suffix keeps it out.
Why this is worth a card rather than a shrug
- The refusal is silent in the useful direction but wrong in the honest one. These are not
rotted pointers: each names a real site in the cited file. A resolver that refuses them
teaches authors that a correct anchor is not writable, and the documented remedy ("drop to a
bare citation") deletes a checkable pointer to satisfy a check.
- It is load-bearing beyond the checklist. Any corpus citing a config literal or a dotted
machine name meets the same two shapes. There are five corpora now.
- ⚠️ And the opposite risk is real, which is why this is a card and not a patch. Widening
(1) toward "a key anywhere on a line" starts admitting things that are not declarations at
all — a call argument, a destructuring pattern. Widening (2) toward "the head segment of a
dotted string" is close to the substring rule the census caveat bans by name, and the
module's 72.1% figure is a one-way lower bound precisely because the census's own test was
permissive. Whether either widening can be written so it admits these 8 and nothing weaker
is the question, and it is the maintainer's to rule on across all five corpora.
Not asserted here
Whether to widen, which of the two shapes to widen, or to leave both refused and re-author the
8 citations instead. If the ruling is "leave them refused", the 8 rows simply become ordinary
bad-citation repairs in the #16898 residual and this card closes with no code change — that
is a legitimate outcome and the card should record it rather than being deleted.
Reproduce, no build needed
Read scriptSymbolClass in scripts/symbol-anchors.mjs beside any site in the tables above.
The 8 rows are carried, already classified verdict: 'accept-set', in
SHARED_RESOLVER_RESIDUAL in scripts/check-platform-checklist.mjs — they are the only 8 of
its 55 rows with that verdict, so the population is enumerable with one grep and does not have
to be re-derived.
⛔ One thing that would be wrong to do from this card alone: widening the core to make the
platform-checklist gate greener. The gate is green today with these 8 held as a named
residual; the reason to touch the core is the authoring shape, not a red.
Generated by Claude Code
Filed unassigned and unlabelled, as an observation for triage, by the #16898 implementer.
Grade deliberately not asserted. ⛔ Deliberately left alone by the PR for #16898, which is #18100: that card
forbids widening the shared core by name, because the core is shared and a widening there
lands on every corpus at once.
Where this came from
#16898 bound
scripts/check-platform-checklist.mjsto the one shared resolver,scripts/symbol-anchors.mjs#symbolResolutionClass. Withdrawing its private permissive rulestopped 56 of 633 anchor occurrences from resolving. All 56 were enumerated and classified on
that PR; 47 are bad citations (the cited file genuinely does not declare the symbol) and 8
are not — they name something real that the shared accept set does not reach. Those 8 are
this card.
The 8, in two shapes
(1) An object-literal key written INLINE rather than at the start of a line — 6
scripts/symbol-anchors.mjs#scriptSymbolClassadmits "a member or object-literal key writtenat the START OF A LINE". A key written inline in the same object literal is the same
declaration, differently formatted:
examples/app-showcase/objectstack.config.ts#declarativeStdionew ConnectorMcpPlugin({ declarativeStdio: ['node'] }),examples/app-showcase/src/data/objects/business-unit.object.ts#allowCreateField.lookup('showcase_business_unit', { label: 'Parent Unit', allowCreate: true })examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#onMismatchvalidation: { onMismatch: 'warn', checkOnBoot: true },examples/app-showcase/src/ui/actions/index.ts#maxSize{ name: 'p_cover', type: 'image', ..., maxSize: 5 * 1024 * 1024 },examples/app-showcase/src/data/seed/index.ts#sales_region{ name: 'Northwind', ..., sales_region: 'amer', ... }examples/app-showcase/src/data/seed/index.ts#signed_onwhere this platform's authorable surface actually lives, and formatting one object per line is
exactly what nobody does there.
(2) A DATA identifier that is the HEAD SEGMENT of a dotted string token — 2
literalis a COMPLETE quoted token, deliberately, so a substring of running text cannotresolve an anchor. But a dotted machine name is not running text:
packages/spec/src/kernel/public-auth-features.ts#sys_user'sys_user.actions.enable_two_factor',and 10 morepackages/spec/src/kernel/public-auth-features.ts#sys_invitation'sys_invitation.actions.invite_user',and 2 moresys_useris precisely the vocabulary theliteralclass was added for — the module's ownheader names "object and field API names like
sys_metadata,crm_account" as the reason itexists. Here the name is declared, and only the dotted suffix keeps it out.
Why this is worth a card rather than a shrug
rotted pointers: each names a real site in the cited file. A resolver that refuses them
teaches authors that a correct anchor is not writable, and the documented remedy ("drop to a
bare citation") deletes a checkable pointer to satisfy a check.
machine name meets the same two shapes. There are five corpora now.
(1) toward "a key anywhere on a line" starts admitting things that are not declarations at
all — a call argument, a destructuring pattern. Widening (2) toward "the head segment of a
dotted string" is close to the substring rule the census caveat bans by name, and the
module's 72.1% figure is a one-way lower bound precisely because the census's own test was
permissive. Whether either widening can be written so it admits these 8 and nothing weaker
is the question, and it is the maintainer's to rule on across all five corpora.
Not asserted here
Whether to widen, which of the two shapes to widen, or to leave both refused and re-author the
8 citations instead. If the ruling is "leave them refused", the 8 rows simply become ordinary
bad-citationrepairs in the #16898 residual and this card closes with no code change — thatis a legitimate outcome and the card should record it rather than being deleted.
Reproduce, no build needed
Read
scriptSymbolClassinscripts/symbol-anchors.mjsbeside any site in the tables above.The 8 rows are carried, already classified
verdict: 'accept-set', inSHARED_RESOLVER_RESIDUALinscripts/check-platform-checklist.mjs— they are the only 8 ofits 55 rows with that verdict, so the population is enumerable with one grep and does not have
to be re-derived.
⛔ One thing that would be wrong to do from this card alone: widening the core to make the
platform-checklist gate greener. The gate is green today with these 8 held as a named
residual; the reason to touch the core is the authoring shape, not a red.
Generated by Claude Code