Skip to content

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

Description

@os-trump

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

  1. 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.
  2. 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.
  3. 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).
  4. 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.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions