Repository navigation
docs(skills): an email-template override names a locale its base ships; a new locale carries no overrides - #28814
Conversation
… ships; a new locale carries no overrides Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Contract reviewServed-tier: Inputs: card #28778 (body, claim 6563766275, dev report 6564145197), PR #28814 (body, file list, net diff ① Derived judgments
② Semver level
③ Boundary flagsDev report 6564145197 — four deviations, a ten-row facts table,
Facts table — every
④ Design judgment
Against the card's eval scenario (the Reach line): holds. The author who customizes a vendor email template through BASE.custom now meets, in the one paragraph that defines the override, that the item's identity is Every phrase cut, checked for a lost fact or a wrong identifier: none lost, none wrong.
Should-fix — the
Must-fix: none. Implemented-by: VERDICT: PASS Read-only review of head 7390bef against |
… the other five Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc Contract reviewServed-tier: Delta round over record 6564277480 (PASS, one should-fix). Inputs: card #28778 (body; claim 6563766275; reports 6564145197 and 6564445482), PR #28814 (body, file list, ① Derived judgments
② Semver levelUnchanged from round one and still right: ③ Boundary flagsDelta report 6564445482 — two deviations, four facts,
Facts: ④ Design judgment
Must-fix: none. Should-fix: none — round one's is applied in full. Implemented-by: VERDICT: PASS Read-only delta review of head dd9e43d against |
|
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc 维护者速读(席位终稿 · head
|
The two passages this card extends now come from main; the conflict on them is resolved to this branch's text, which is main's plus this card's sentences (delta against origin/main re-read: this card's changes only). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2g7RyXa8ErM6GAkHyc
Requested by 田騏 · project thread
Fixes #28778
Clause-②: no
Metadata-protocol: none
维护者速读
BASE.custom里带overrides的覆盖只能指向基础包确实发过的语言;基础包没发的语言直接新增、不写overrides。改的是发布技能包skills/objectstack-platform/SKILL.md的 ADR-0146 定制段,和content/docs/concepts/metadata-lifecycle.mdx的 ADR-0146 节。en-US却声明覆盖fr-FR⇒403 NOT_OVERRIDABLE),而技能和文档只说「同名 +overrides即覆盖」,对语言只字未提,照着写的 AI 作者会被拒。OVERRIDABLE_METADATA_TYPES、删四句开场白付账,改后 6005,未动任何规则、未抬上限。回滚即 revert。skills/objectstack-platform/SKILL.md第 131 行的定制段(新句子 + 类型列表的收缩);②content/docs/concepts/metadata-lifecycle.mdx第 117–119 行与新增的「A new locale is not an override」条目;③.changeset/28778-email-template-override-locale.md(@objectstack/skillspatch)。node scripts/check-skills-token-ratchet.mjs,预期输出含skills/objectstack-platform/SKILL.md is 6005 tokens (ceiling 6012; headroom 7)且结尾✓ … 57 authored bundle file(s) within their ceilings。skills/**为 Tier H 受管面——由授权审批人在本 PR 上给出 APPROVED review,之后席位落地;PR 保持 draft、不请审、不指派。What changes
The rule, taken from the gate PR #28777 landed, not from the card. An email template's identity is
(name, locale):ITEM_KEY_DISCRIMINATORS(packages/metadata-core/src/item-key-discriminators.ts:68-70) holds exactly one entry,email_template: { field: 'locale', canonical: 'en-US' }, anditemDiscriminator(:96-100) keys a body that declares no locale as the canonical member. The override write gate reads that table throughoverrideWriteMemberOf(packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:280-282) andoverrideWriteIdentityOf(:299-302, name joined with member), andjudgeOverrideWriterefusesdeclared_package_ships_no_such_itemwhen no closure package ships the base at that member (:448-455, the sentence naming the locale: "ships no email_template named 'X' with locale 'fr-FR'"), thrown as403 NOT_OVERRIDABLE(:535-542). A locale the base does not ship, saved in the pair WITHOUToverrides, collides with no base member and is admitted as the pair's own member (pinned:packages/qa/dogfood/test/email-template-override-unshipped-locale.dogfood.test.ts:125; CLIpackages/cli/src/utils/override-declarations.test.ts:161).skills/objectstack-platform/SKILL.md(ADR-0146 customization paragraph, now L131): one sentence after the honoured-types sentence — An email template is one item per (name, locale): an override names a locale the base ships; a locale the base does not ship is added withoutoverrides.content/docs/concepts/metadata-lifecycle.mdx(ADR-0146 section): the "bears a base item's name" sentence now reads "— for anemail_template, one item per(name, locale), the name and a locale the base ships —", and a new bullet A new locale is not an override says the pair's own locale carries nooverrides, is served underhotcrm.custom, and that declaring one there is refused (403 NOT_OVERRIDABLEat the save, publish and install doors, a row fromos validate)..changeset/28778-email-template-override-locale.md:@objectstack/skillspatch(the catalog ships in that package'sdist),Clause-②: no,Metadata-protocol: none.Paying for the sentence (token ratchet,
skills/objectstack-platform/SKILL.md, ceiling 6012, headroom onmain0 tokens / 3 bytes). Nothing paid with a re-wrap; no rule dropped. What moved:page, app, dataset, doc, book, mapping, flow and action) are no longer enumerated; the clause reads "the rest ofOVERRIDABLE_METADATA_TYPESwait for their doors". The honoured five stay named; the docs page keeps the full list.manifestto identify itself in the ecosystem:" → "Every stack needs amanifest:".Skills readings (both, as the published-catalog rule requires; lines by
wc -l, tokens by the ratchet'sceil((bytes − stamp line) / 4)):origin/mainc064d3a)skills/objectstack-platform/SKILL.mdskills/*/SKILL.md)The ratchet's authored-bundle total (57 files) reads 181895 / 190761 after; only this file moved (−7).
Tests
No code changes; no test added or moved. The gates below are the verification.
Acceptance notes
skip-changesetdoes not apply (@objectstack/skillspublishesskills/**), sopr_createcarries no labels and no assignees.check:dev-prereqs,check:skill-frame-freshness) are not derived for this diff (no spec build or four-axis frame file touched) and were not run.Verification
All readings at head
7390bef4d6afterpnpm install --frozen-lockfileand a fullpnpm build --concurrency=2underos-verify-lock.sh(VERDICTcommand-exit 0, held 1011 s).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 71 commands for this diff (3 paths, 30 changed lines). Every one was run locally with its exit code captured before any pipe: 71 / 71 exit 0, reconciled with--ran.Families the diff touches, with their verdict lines
node scripts/check-skills-token-ratchet.mjs→ exit 0 —✓ check-skills-token-ratchet: skills/objectstack-platform/SKILL.md is 6005 tokens (ceiling 6012; headroom 7)·57 authored bundle file(s) within their ceilings.pnpm check:skill-frame-sync,check:skill-identifier-liveness,check:skill-top-level-keys,check:skill-compatibility→ exit 0 each.pnpm --filter @objectstack/spec run check:skill-docs,check:skill-examples,check:docs,check:variant-docs,check:yaml-examples→ exit 0 each (after the build).pnpm check:doc-anchors,check:doc-authoring,check:overlay-whitelist-table,check:docs-single-h1,check:doc-frontmatter,check:docs-spec-enumerations,check:docs-transcript-drift,check:docs-redirects,check:docs-audit-scope→ exit 0 each.node scripts/check-empty-changeset.mjs --base origin/main,check-changeset-no-major.mjs --base origin/main,check-adr-0087-registration.mjs --base origin/main,pnpm check:changeset-gate-self-tests,check:pm-changeset-deadline-census→ exit 0 each.pnpm check:nul-bytes,check:pm-skill-id-lint,check:role-word→ exit 0 each.Not measured locally (CI's own): the type-check lanes,
Build Docs,Build Core, and themain-push batteries the derivation lists; the PR's check-runs carry them.🤖 Generated with Claude Code