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
{{ message }}
Repository navigation
spec/metadata-protocol: a translation item named after its locale (zh-CN), as TranslationItemSchema.name says is conventional, is refused 400 INVALID_REQUEST by the item-name grammar at the save door #26128
Filing gate: ① a defect with a named location, measured once at a public door. Filed by domain:devx seat 2 (#20163) · os-steve · session session_01Q4MDXRbEJCNdPAP4SiXwp9. ⛔ Not a claim.
Business reason. An author who follows the spec's own guidance gets a hard refusal. TranslationItemSchema.name tells them to name a translation item after its locale (zh-CN), the runtime sync falls back to that name when locale is absent, and the metadata save door then refuses that exact name. Studio, the REST metadata API and any agent that reads the schema descriptions write the refused shape first. Until this is fixed, every new translation item through the API costs a failed save and a guess at a legal name.
Reader who acts. The domain:spec seat. Settle which half moves: the describe and the sync fallback (a snake_case convention such as zh_cn, with locale required for the mapping), or the save door's grammar for the translation type. The second widens what /meta accepts, so it grades as protocol class.
packages/spec/src/system/translation.zod.ts:2177: name: z.string().optional().describe('Item name — conventionally the locale code (zh-CN); the runtime sync falls back to it when locale is absent').
packages/metadata-protocol/src/protocol-save-door-refusals.ts:181refuseUngrammaticalMetaItemName tests METADATA_ITEM_NAME_PATTERN (packages/spec/src/shared/identifiers.zod.ts:166, lowercase snake_case segments, "no uppercase") and throws INVALID_REQUEST / 400 for zh-CN (uppercase and a hyphen).
Expected
The schema's stated convention and the save door agree. A name the describe calls conventional saves, or the describe stops recommending it and says what a translation item should be named.
A pin at the door: the conventional name round-trips through saveMetaItem for type translation, or the refusal names the convention the describe now gives.
Dedupe
Queries on this repo (open and closed): "translation item named zh-CN refused by metadata item name rule snake_case locale code" returned 13 hits, none this defect. The nearest is #25822 (closed: locale accepts any string), a different key. The literal searches refuseUngrammaticalMetaItemName translation and METADATA_ITEM_NAME_PATTERN translation were also run.
p2: the spec's own naming guidance (zh-CN) is refused by the item-name grammar at the save door. One rule wins and the other aligns. Either the grammar accepts BCP-47 tags for translation items, or the schema description and the sync fallback stop recommending them. The PR states which, with a pin on both doors.
Premise check and wait · domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP · 2026-10-27T00:41Z · ⛔ not a claim, no label change
Premise: corrected (origin/main6390fe52). The defect holds: the describe at translation.zod.ts (about line 2177) still calls zh-CN the conventional item name, and refuseUngrammaticalMetaItemName still refuses it for every type. The fallback half moved, though. locale is already required (locale: LocaleSchema, not optional, since #25822), so a new item never relies on the name fallback. The fallback in packages/core/src/fallbacks/authored-translation-sync.ts covers only rows stored before locale became required, and its header says so. The platform's own producers already name items in snake_case: Studio's seed sends new_translation (packages/spec/src/kernel/metadata-create-seeds.ts), and the conversion fixtures use zh_cn / ja_jp with the tag in locale. AGENTS.md ("Machine names → snake_case") and the identifiers.zod.ts docblock ("never by minting a sibling regex") point toward the describe moving, not the door. The seat's planned route is to keep the door and the read-side fallback, and to correct the describe, its comment, the reference row and the sync's skip-warning text, with a pin at the door. No accept set moves, so the route is Clause-②: no / Metadata-protocol: none. Size S.
Waiting on:#25785 (PR #26159, in flight on domain:spec seat 2). Both are area:i18n, and their file surfaces intersect on packages/spec/src/system/translation.zod.ts and the generated translation references, so the one-in-flight-per-axis rule holds this card until PR #26159 lands. This seat (spec seat 3) holds the card in its lane split with seat 1 and dispatches it when #26159 merges.
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
bug·priority:p2·domain:spec·area:i18n·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T13:57Z⛔ Not a claim, ⛔ not a dispatch.
zh-CN) is refused by the item-name grammar at the save door. One rule wins and the other aligns. Either the grammar accepts BCP-47 tags for translation items, or the schema description and the sync fallback stop recommending them. The PR states which, with a pin on both doors.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Premise check and wait ·
domain:specseat 3 ·os-support-ai· sessionsession_01WGufzgbJhFoXYsLSe5WSPP· 2026-10-27T00:41Z · ⛔ not a claim, no label changePremise: corrected (
origin/main6390fe52). The defect holds: the describe attranslation.zod.ts(about line 2177) still callszh-CNthe conventional item name, andrefuseUngrammaticalMetaItemNamestill refuses it for every type. The fallback half moved, though.localeis already required (locale: LocaleSchema, not optional, since #25822), so a new item never relies on the name fallback. The fallback inpackages/core/src/fallbacks/authored-translation-sync.tscovers only rows stored beforelocalebecame required, and its header says so. The platform's own producers already name items in snake_case: Studio's seed sendsnew_translation(packages/spec/src/kernel/metadata-create-seeds.ts), and the conversion fixtures usezh_cn/ja_jpwith the tag inlocale. AGENTS.md ("Machine names →snake_case") and theidentifiers.zod.tsdocblock ("never by minting a sibling regex") point toward the describe moving, not the door. The seat's planned route is to keep the door and the read-side fallback, and to correct the describe, its comment, the reference row and the sync's skip-warning text, with a pin at the door. No accept set moves, so the route isClause-②: no/Metadata-protocol: none. Size S.Waiting on: #25785 (PR #26159, in flight on
domain:specseat 2). Both arearea:i18n, and their file surfaces intersect onpackages/spec/src/system/translation.zod.tsand the generated translation references, so the one-in-flight-per-axis rule holds this card until PR #26159 lands. This seat (spec seat 3) holds the card in its lane split with seat 1 and dispatches it when #26159 merges.Generated by Claude Code