Skip to content

Commit dd9add6

Browse files
docs(skills): the D11 close refuses only a declared-override move; an added email-template locale keeps its package-less write (#29924)
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J <!-- claude-projects-attribution: {"github_login":"huangyiirene"} --> _Requested by **Irene** · [project thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67x5FhwXpbo8XHNfhTodcp3zr)_ Fixes #29461 Clause-②: no Metadata-protocol: none Model: the `skills/**` tier mandate (dispatch clause ①) is waived by the maintainer while that tier's quota is exhausted; developed one tier below it; contract review by triage. The ruling, verbatim: > 你的任务继续处理,没有fable可以用 opus,等契约复审 ## 维护者速读 - 改了什么:objectstack-platform 技能里 ADR-0146 定制段的 D11 那句话改正:只有迁移仪式会「以声明 override 的方式」搬走的旧 Setup 行,搬前搬后才拒绝不带包的保存、发布、重置和回滚;基础包没发运的邮件模板语言(仪式把它当配对包自己的成员搬,`addedMember`)保留这个写入口。另删掉一段重复的「CLI Commands」指针小节付 token 账,并加一份 `@objectstack/skills` 的 patch changeset(技能随该包发布)。 - 为什么改:PR #29258 之后迁移仪式会把这种语言行当配对包自有成员搬走,而 D11 关门(`packagelessCloseSubject`)只判声明 override 的搬法;技能原句说「一律拒绝」,对这种行是错的,AI 照着写会以为这类写入已被关。ADR-0087 条目那一半已由 PR #29457 改正,这里是剩下的一份。 - 风险与回滚:纯技能文本加一份 changeset,无代码、无契约改动。token 上限行未动(6011/6011),无 re-wrap;被删的指针小节在同文件 Part 3 指针里有家。回滚即 revert。 - 先看:`skills/objectstack-platform/SKILL.md` 第 132 行定制段里 `(D11)` 前后那半句;同文件被删的 `## CLI Commands` 小节;`.changeset/29461-d11-added-locale-keeps-write.md`。 - 两分钟验证:`node scripts/check-skills-token-ratchet.mjs`,预期 `skills/objectstack-platform/SKILL.md is 6011 tokens (ceiling 6011; headroom 0)`,全绿。 - 需要你做的:Tier H 受管面(`skills/**`),需要 `GOVERNED_APPROVERS` 的批准;PR 保持 draft,等分诊对第二轮的增量契约复审。 ## What changes Facts are taken from the merged code on `main` (a04e9d7), not the card alone: `packagelessCloseSubject` and `classifyPackagelessRow` in `packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts`, the ceremony's `addedMemberOf` and its `moved` + `addedMember` outcome in the same file, and the corrected ADR-0087 entry `packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts` (PR #29457). 1. **`skills/objectstack-platform/SKILL.md`, the ADR-0146 customization paragraph (L132).** The D11 clause read "its package-less save, reset and rollback are refused once movable (D11)". It now reads: "once movable as a declared override, its package-less save, publish, reset and rollback are refused (D11); an email-template row at a locale the base does not ship moves as the pair's own member and keeps that write." The four operations are `PackagelessWriteOperation` (`save | publish | delete | rollback`, `protocol-packaged-base-refusal.ts`); the old clause left out publish. That is what `packagelessCloseSubject` does: it closes a package-less write only where the census answers `movable` AND `overlayPairFixAdmits` admits the declared body into the pair; an `email_template` member at a locale the base does not ship is refused by that gate, so the close leaves it open, while the ceremony moves the row as the pair's own member (`addedMember`, no `overrides`). The rest of the paragraph is byte-identical. 2. **Payment, same file.** The `## CLI Commands` section (a heading, one pointer line and its `---` rule; 140 bytes) is cut. Its home: the Part 3 pointer further down the same file, which links the same `references/operations.md` and names its "Daily-loop commands" section first. No other file links the cut heading's anchor (`git grep '#cli-commands'` over `skills/`, `content/docs/`, `scripts/`: zero hits). 3. **`.changeset/29461-d11-added-locale-keeps-write.md`.** `'@objectstack/skills': patch` with `Clause-②: no` and `Metadata-protocol: none`: `skills/**` ships in `@objectstack/skills`, so a skills change takes route 1 of Check Changeset (`.github/workflows/pr-automation.yml`), never the `skip-changeset` label. ### Token ratchet, paid in place (no ceiling row moved, no re-wrap) | file | tokens before / after / ceiling | bytes before / after | lines before / after | |:--|:--|:--|:--| | `skills/objectstack-platform/SKILL.md` | 6011 / 6011 / 6011 | 24061 / 24064 | 435 / 429 | | package `skills/objectstack-platform` (all files) | — | — | 2238 / 2232 | | every `skills/*/SKILL.md` together | — | — | 4543 / 4537 | The D11 clause grows by 143 bytes and the cut removes 140; the file's priced text was 3 bytes under the 6011 ceiling and is exactly at it now (24044 priced bytes, 6011 tokens). ### Evals `skills/objectstack-platform/evals/config-plugins-ops.json` has two cases on this paragraph. Case 10 (replace a HotCRM view) says a package-unbound Setup row "wins only until the D11 migration": a view is a declared-override move, so it stays true and is unchanged. Case 11 (a dependent package's override) does not touch D11. No case covers an added email-template locale; none is added here (see Acceptance notes). ## Why Since PR #29258 (#28904) `os migrate packageless-overlays` moves a package-less row of an `email_template` locale the base does not ship as the pair's own member, declaring nothing, and the D11 close judges only the declared-override move, so that row's package-less write stays open before and after the move. The skill said every movable row loses it. PR #29457 (#29261) corrected the same claim in the ADR-0087 entry; this was the remaining copy. ## Acceptance notes - The edit is made on the branch the platform fixes for this thread (`claude/project-thread-x5gki7`) in this container's own checkout rather than a sibling worktree: the container is this card's alone. A deviation from the worktree-first spelling, not its purpose. - No eval case was added for the added-locale write: the card asks to check the covering evals, and both still hold. A case could be added later at no ratchet cost (eval fixtures are measured, not ratcheted) if the seat wants that behaviour exercised. - Round 2 (commit 47008cf) answers triage's contract review of c634c95 (comment 6606375768, FAIL): the must-fix (the change publishes through `@objectstack/skills`, so it carries a patch changeset and the `skip-changeset` label was removed) and the should-fix (the clause lists publish). The should-fix was paid inside the same clause, no re-wrap: "it is" dropped and "email template's row" spelled "email-template row". Nothing else moved. - Triage's review names two other copies of the close stated without the carve-out, `content/docs/concepts/metadata-lifecycle.mdx` and ADR-0146 § D11; they are outside this card's file surface and go to a follow-up card. - The `Model:` line above carries no model identifier outside the verbatim ruling quotation (AGENTS.md, commit-message and PR-body rule); the tier names appear only inside the quoted ruling. ## Verification Head `47008cfe` (two commits: c634c95 the change, 47008cf the review's must-fix and should-fix). No code changed, so no package test, typecheck, ablation or dogfood battery is owed (`Clause-②: no`, no `!` in the title). <details><summary>Local gates on 47008cf: 45 derived, 45 run with exit 0, 0 NOT MEASURED (`dispatch-gates --ran`); on c634c95 35 derived, 34 exit 0, 1 NOT MEASURED</summary> - 47008cf: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 45 commands (the changeset adds the changeset families: `check-adr-0087-registration`, `check-changeset-no-major`, `check-empty-changeset`, `check:changeset-gate-self-tests`, `check:closed-ceremony-text`, `check:published-files`, release self-tests). All 45 ran after `pnpm install --frozen-lockfile` and a full `pnpm build` (exit 0), each with a 900 s timeout and its exit code captured before any pipe: all 45 exited 0, `check:dual-build-cjs-loads` included. `--ran`: `45 derived famil(ies) accounted for — 45 run, 0 NOT-MEASURED`. - `check-skills-token-ratchet.mjs`: `skills/objectstack-platform/SKILL.md is 6011 tokens (ceiling 6011; headroom 0)`. - c634c95: 35 derived after install and a `@objectstack/formula` / `@objectstack/lint` / `@objectstack/objectql` build; 34 exited 0 and `pnpm check:dual-build-cjs-loads` exited 3 (`PREREQUISITE NOT MET`, no full build then). - `node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD`: exit 0 on both heads (no card relation, model-free trailer pair). - CI on 47008cf: 44 check-runs, 28 success and 16 skipped by path filter or opt-in, none red or pending. CI on c634c95: 46 check-runs, 28 success, 18 skipped. - Writes: `git push` ×2; one relay `pr_create`; no GitHub MCP write. The `skip-changeset` label that rode the create was removed by the seat. </details> ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (No schema touched.) - [x] 2. Every name I added uses the casing for its kind. (No names added.) - [x] 3. No formatter ran; `pnpm lint` is CI's repo-wide run. - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. The change publishes through `@objectstack/skills`: it carries a `patch` changeset, and both declaration lines are filled in here and in the changeset. - [x] 6. `packages/spec` not touched. - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English (the 维护者速读 block is the repo's own Chinese reading aid; the ruling is quoted untranslated). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01J8VVAnsSK35UdbfYSLvGkz --- _Generated by [Claude Code](https://claude.ai/code/session_01J8VVAnsSK35UdbfYSLvGkz)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 0d40aa1 commit dd9add6

2 files changed

Lines changed: 12 additions & 7 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
'@objectstack/skills': patch
3+
---
4+
5+
docs(skills): objectstack-platform says the D11 close refuses a package-less write only where the row moves as a declared override, and an added email-template locale keeps that write
6+
7+
Clause-②: no
8+
Metadata-protocol: none
9+
10+
- **Before.** The ADR-0146 customization paragraph said a pre-D11 unbound Setup row's package-less save, reset and rollback are refused once it is movable. That is false for a row of an email-template locale the base does not ship: `os migrate packageless-overlays` moves it as the pair's own member (`addedMember`, no `overrides`), and the close judges only the declared-override move, so that row's package-less write stays open before and after its move. The clause also left out publish, which the close refuses too.
11+
- **Now.** The clause says the close covers a row movable as a declared override, lists save, publish, reset and rollback, and says an email-template row at a locale the base does not ship moves as the pair's own member and keeps that write. The file stays at its token ceiling: a duplicate "CLI Commands" pointer section is cut, its home the Part 3 pointer to `references/operations.md`. No rule is removed; no schema or behaviour changes.

‎skills/objectstack-platform/SKILL.md‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ to a new protocol major — never to silence a mismatch.
129129

130130
**`manifest.namespace` (ADR-0048):** Optional, but **enforced once set**. When a package declares `manifest.namespace: 'crm'`, every `object.name` must start with `crm_` or `defineStack` errors (`validateNamespacePrefix` in `@objectstack/spec`); the legacy `<ns>__<short>` double-underscore form is rejected, and `sys_`-prefixed names are platform-reserved and exempt. The namespace is also a package-ownership key — installing two packages that both claim `crm` fails with `NamespaceConflictError` (downgrade to a warning with `OS_METADATA_COLLISION=warn`). `os lint` additionally emits a non-fatal `naming/namespace-prefix` warning for bare-named UI/automation items (app, page, dashboard, flow, action, report, dataset) when a namespace is set.
131131

132-
**Customizing an installed package (ADR-0146):** Customize an installed base `hotcrm` in its paired writable package `hotcrm.custom`, which depends on it: a same-named item there with `overrides: { package: 'hotcrm', basedOn: '3.2.0' }` (its `manifest.id`/`manifest.version`) replaces the base's document whole. The read honours it only from the pair (the row's `package_id`), today only for a view, dashboard, report, email_template, translation or flow, never judges `basedOn` and ignores any other package's declaration. 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 without `overrides`. Then no `?package`, `?package=hotcrm`, the layered read and both lists serve it; the env-wide list holds one item per name one code package ships (a dependent's stays under its own `?package=`); a pre-D11 unbound Setup row wins over the base's until `os migrate packageless-overlays` moves it, and its package-less save, reset and rollback are refused once movable (D11). The base's address serves the pair's added locale too (both lists, the layered read with `code` null and `effective` the pair's, the execution list, a send in that locale); a locale a dependent adds under the base's name is served only under its own `?package=`, never by a base-named or package-less read. An undeclared pair row or a dependent's row at a locale the base ships is an orphan in the layered read's `overlay`, `effective` = the base's. An override may narrow a public form's anonymous intake, never re-open one any honoured body withdrew. `GET /packages/hotcrm.custom/export` carries it with `overrides`.
132+
**Customizing an installed package (ADR-0146):** Customize an installed base `hotcrm` in its paired writable package `hotcrm.custom`, which depends on it: a same-named item there with `overrides: { package: 'hotcrm', basedOn: '3.2.0' }` (its `manifest.id`/`manifest.version`) replaces the base's document whole. The read honours it only from the pair (the row's `package_id`), today only for a view, dashboard, report, email_template, translation or flow, never judges `basedOn` and ignores any other package's declaration. 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 without `overrides`. Then no `?package`, `?package=hotcrm`, the layered read and both lists serve it; the env-wide list holds one item per name one code package ships (a dependent's stays under its own `?package=`); a pre-D11 unbound Setup row wins over the base's until `os migrate packageless-overlays` moves it, and once movable as a declared override, its package-less save, publish, reset and rollback are refused (D11); an email-template row at a locale the base does not ship moves as the pair's own member and keeps that write. The base's address serves the pair's added locale too (both lists, the layered read with `code` null and `effective` the pair's, the execution list, a send in that locale); a locale a dependent adds under the base's name is served only under its own `?package=`, never by a base-named or package-less read. An undeclared pair row or a dependent's row at a locale the base ships is an orphan in the layered read's `overlay`, `effective` = the base's. An override may narrow a public form's anonymous intake, never re-open one any honoured body withdrew. `GET /packages/hotcrm.custom/export` carries it with `overrides`.
133133

134134
The pair comes from `POST /api/v1/packages/hotcrm/ensure-customization`: `namespace` = the base's + `_custom`, `dependencies: { hotcrm: '^<major>' }`; `GET /packages/hotcrm/customizations` lists its overrides, extensions and switched-off items, and uninstalling the base is refused (`409`) while the pair exists. Only the pair declares: the save, publish and install doors, `os validate` and `os build` refuse `overrides` from any other package, and a dependent's item under a base item's name — its one fix is a new name. A permission set, position or capability is never overridden: copy it under a new name ("new similar", landing in the pair). An object is extended (`__c` fields, **objectstack-data**); a flow is overridden or copied (**objectstack-automation**).
135135

@@ -408,12 +408,6 @@ needs an account to exist.
408408

409409
---
410410

411-
## CLI Commands
412-
413-
Daily commands are in [Part 3 — Operations](./references/operations.md#part-3--operations-cli-testing-deployment).
414-
415-
---
416-
417411
→ Moved verbatim to [references/bootstrap.md](./references/bootstrap.md) § Complete Working Example.
418412

419413
---

0 commit comments

Comments
 (0)