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
D1: declare the metadata item-name grammar in spec and refuse it loudly at the publish door — dotted qualified form becomes enforced (#12176 stage 1) #12194
Stage 1 of #12176's maintainer-ruled retirement of compound-name addressing. Filed and dispatched by the PM session under the maintainer direct-dispatch channel; provenance (verbatim, untranslated): 「我认为斜杠不该存在」 · 「斜杠不该存在,现在就立卡,你负责派发,然后给我结果」, and the Q2 fork (dotted form) presented with four-axis analysis and accepted: 「我看到你的意见了,我同意」 (Q2 = B). PM session session_01H9StxQgG2DPA26XzZZqnJB.
Ruled scope
Declare the item-name grammar in packages/spec: item names are lowercase snake_case segments, optionally dot-qualified — the shape ViewItemNameSchema already declares (crm_lead.pipeline). ⛔ Reuse/extend that existing declaration as the single source; do not mint a second grammar. Exact regex is the implementer's to derive from it (expected family: /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/), with the boundary cases decided by the declaration, not ad hoc: no /, no empty string, no whitespace, no uppercase, no leading/trailing/double dots.
Enforce it at the publish door (packages/metadata-protocol — the publishMetaItem/store write path): a name failing the grammar is refused loudly with guidance naming the grammar and the dotted qualified form. This deliberately widens refuseUnmintableMetaType's refusal: Ban / in metadata item names — retire compound-name addressing (maintainer-ruled direction): census, migration surface, staged plan #12176's census measured that a slash in the name currently BYPASSES the unrecognised-type refusal (type=fieldz, name='a/b' accepted and stored while name='a' is 400) — that hole closes here.
Landing assert (absorbed D2): census measured zero stored rows with / in the name; assert that at land time against the seeded stores. If any slash row exists after all, ⛔ do not migrate silently — report it (that is D2 reopening as its own card).
ADR-0087 semantic entry + changeset stating the narrowing and what an author must write instead.
Premise (binding — verify before landing the regex)
The dotted convention's existing corpus is coherent: census the stored/seeded/authored item names for dot usage and confirm the declared ViewItemNameSchema grammar accepts every legitimate existing name (flat snake_case included) while refusing the junk shapes ('', a//b, 'Views/All Leads' — all measured accepted today). If a legitimate existing name class fails the declared grammar, ⛔ stop and report the fork with the census — do not widen the grammar unilaterally and do not exclude the class silently.
Out of scope
⛔ REST/SDK re-addressing and compound-route retirement (D3, blocked on this card). ⛔ Docs sweep (D4). ⛔ Do not touch the mounted compound routes or SDK URL construction. ⛔ No edits to what closed PR #12105 contained.
Clause-②: yes — contract narrowing (accept set shrinks at the publish door); dispatch at the contract-review tier. Serial note at claim: packages/spec has in-flight work on component.zod.ts + migrations/registry.ts (#12039 Key 1 landing) — registry entries are per-file tail-append with regeneration, different files; name the check in the claim.
Refs: #12176 (census report with the four tables and staged plan) · #12106, #11932 (parked behind D3) · closed PR #12105.
Stage 1 of #12176's maintainer-ruled retirement of compound-name addressing. Filed and dispatched by the PM session under the maintainer direct-dispatch channel; provenance (verbatim, untranslated): 「我认为斜杠不该存在」 · 「斜杠不该存在,现在就立卡,你负责派发,然后给我结果」, and the Q2 fork (dotted form) presented with four-axis analysis and accepted: 「我看到你的意见了,我同意」 (Q2 = B). PM session
session_01H9StxQgG2DPA26XzZZqnJB.Ruled scope
packages/spec: item names are lowercase snake_case segments, optionally dot-qualified — the shapeViewItemNameSchemaalready declares (crm_lead.pipeline). ⛔ Reuse/extend that existing declaration as the single source; do not mint a second grammar. Exact regex is the implementer's to derive from it (expected family:/^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/), with the boundary cases decided by the declaration, not ad hoc: no/, no empty string, no whitespace, no uppercase, no leading/trailing/double dots.packages/metadata-protocol— thepublishMetaItem/store write path): a name failing the grammar is refused loudly with guidance naming the grammar and the dotted qualified form. This deliberately widensrefuseUnmintableMetaType's refusal: Ban/in metadata item names — retire compound-name addressing (maintainer-ruled direction): census, migration surface, staged plan #12176's census measured that a slash in the name currently BYPASSES the unrecognised-type refusal (type=fieldz, name='a/b'accepted and stored whilename='a'is 400) — that hole closes here./in the name; assert that at land time against the seeded stores. If any slash row exists after all, ⛔ do not migrate silently — report it (that is D2 reopening as its own card).Premise (binding — verify before landing the regex)
The dotted convention's existing corpus is coherent: census the stored/seeded/authored item names for dot usage and confirm the declared
ViewItemNameSchemagrammar accepts every legitimate existing name (flat snake_case included) while refusing the junk shapes ('',a//b,'Views/All Leads'— all measured accepted today). If a legitimate existing name class fails the declared grammar, ⛔ stop and report the fork with the census — do not widen the grammar unilaterally and do not exclude the class silently.Out of scope
⛔ REST/SDK re-addressing and compound-route retirement (D3, blocked on this card). ⛔ Docs sweep (D4). ⛔ Do not touch the mounted compound routes or SDK URL construction. ⛔ No edits to what closed PR #12105 contained.
Clause-②: yes — contract narrowing (accept set shrinks at the publish door); dispatch at the contract-review tier. Serial note at claim:
packages/spechas in-flight work oncomponent.zod.ts+migrations/registry.ts(#12039 Key 1 landing) — registry entries are per-file tail-append with regeneration, different files; name the check in the claim.Refs: #12176 (census report with the four tables and staged plan) · #12106, #11932 (parked behind D3) · closed PR #12105.