docs(skills): cite PLATFORM_CAPABILITY_TOKENS instead of restating its count in objectstack-platform - #18839
Conversation
…its count The `requires:` section of `skills/objectstack-platform/SKILL.md` copied two numbers out of the platform capability vocabulary into prose — "the other eight tokens" and "the authoritative list of all 28" — and no gate reads either against `packages/spec/src/kernel/platform-capabilities.ts`. The vocabulary is 29 on `main` since `package-registry` landed, so both sentences are already false. Cite the constant instead. The tokens outside the CLI's `CAPABILITY_PROVIDERS` map are named as "the tokens in `PLATFORM_CAPABILITY_TOKENS` not in that map", and the authority sentence keeps the constant and drops the count. The enumeration under it is unchanged: every name it lists is still in the constant. Nothing in the tree read the removed numbers, so no gate or generator follows. Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu Co-authored-by: Claude <noreply@anthropic.com>
维护者速读(终稿)改了什么:发布给客户项目的 为什么改:这两个数字是从 风险与代价(含回滚):纯文档、不发布代码、不改运行时;23 个派生门禁全 0,全仓 lint 0。回滚 = revert 这一个 commit。 席位意见:通过,按 dev 交付的原样。 你要做的:批准本 PR( Generated by Claude Code |
Fixes #18705
Clause-②: no
The
requires:section of the publishedskills/objectstack-platform/SKILL.mdcopied two numbers out of the platform capability vocabulary into prose — 「The other eight tokens in the vocabulary …」 and 「The authoritative list of all 28 isPLATFORM_CAPABILITY_TOKENS」 — and no gate reads either number againstpackages/spec/src/kernel/platform-capabilities.ts. PR #18694 (#18053) took the vocabulary 28 → 29 when it landed at 2026-09-17T16:10Z, so onorigin/mainboth sentences were already false when this branch was cut. This PR is the card's option A in the shape of the #16853 precedent (a256f18962, PR #17259 「cite the platform-tool registry instead of restating it」): the two counts become citations, and nothing is left in those two sentences that a registry change can falsify. No other sentence in the file moves. Thepackage-registryruntime half is #17676's and is not addressed here; #16767 (the example block's TypeScript range, same file) remains open and is not folded.维护者速读(草稿)
改了什么 — 发布给客户项目的
skills/objectstack-platform/SKILL.md里,requires:一节原来写死了两个数字(「the other eight tokens」「the authoritative list of all 28」)。本 PR 把这两句改成引用常量PLATFORM_CAPABILITY_TOKENS,不再写数字;其余 1221 行一字未动(diff 是 3 行增 / 3 行删)。为什么改 — 这两个数字是从
packages/spec的能力词汇表抄来的,没有任何门禁核对它们。#18694 落地后词汇表已是 29 个 token(新增package-registry),这两句在main上已经是假话,而客户项目里的 AI 每次加载这份 skill 都会读到。同一类缺陷在skills/objectstack-ai/SKILL.md上已由 #16853 / PR #17259 用同样的办法修过一次:引用注册表,不复述它。风险与代价(含回滚) — 纯文档改动,不发布代码,不改任何运行时行为;skill 的 token 计数 12980 → 12975,上限 12984 不动。回滚就是 revert 这一个提交。留下一处未动:同一节 :440 的「all 20 of its entries」仍是一个抄写的计数(今天为真,#17676 引擎侧落地时会变假),按派发令本卡不动其它句子——要不要顺手折进来由席位定,见下方 Acceptance notes。
席位意见 —
你要做的 — 这是受管面(
skills/**),按 Prime Directive #14 需要你亲自确认并合并;PR 保持 draft。读一眼 diff 里那两句(6 行),没有别的。Re-derived readings
All on
origin/main5941246b70(the branch point); none copied from the card.PLATFORM_CAPABILITY_TOKENSsizepackages/spec/src/kernel/platform-capabilities.ts;PLATFORM_CAPABILITY_PROVIDERShas the same 29 keysServe.CAPABILITY_PROVIDERSsize (the map the section describes)packages/cli/src/commands/serve.ts:1863–:2009; the skill's :442 table names the same 20 as a setaiai-studioi18nuiauthhierarchy-securityai-seatgovernance— the eight the section lists — pluspackage-registryGate reading — which gate surfaces read the constant name — with controls (
git grep -lat5941246b70):scripts/·packages/*/scripts/·.github/forPLATFORM_CAPABILITY_TOKENS: 0 files (exit 1)marketplaceinto an always-on core capability #18694 landed —.changeset/18053-package-registry-capability.mdandcontent/docs/releases/v16.mdxare the new hits)The two sentences, before / after
:452–:453 before:
after:
:463 before:
after:
The diff is 3 insertions / 3 deletions in one file.
The enumeration under :452, re-read against the constant at the tip
Every name the two bullets carry — tier-gated
ai,ai-studio,i18n,ui,auth(= the five keys ofServe.CAPABILITY_TO_TIERat :1577–:1585, verbatim); enterprise / cloudhierarchy-security,ai-seat,governance— is inPLATFORM_CAPABILITY_TOKENSat the tip, and none of the eight is aServe.CAPABILITY_PROVIDERSkey. So the list is kept as the list it is: no name dropped, no name added. The ninth not-in-map token,package-registry, is in the vocabulary and inPLATFORM_CAPABILITY_PROVIDERS(@objectstack/service-package, open edition) but has noServe.CAPABILITY_PROVIDERSrow yet — the constant's own comment says it is inert underobjectstack serveuntil #17676's runtime half lands. Per the card this PR documents no new token; the Acceptance notes say who holds that.The
marketplaceprovider line (:444,@objectstack/service-package) was read againstServe.CAPABILITY_PROVIDERS.marketplace.pkgat :1958 (@objectstack/service-package): it matches the tip and is not touched — repointing it is #17676's engine lane.Token ratchet
node scripts/check-skills-token-ratchet.mjs, convention ceil(utf8 bytes / 4):5941246b70)bef0dc6dfa)No ceiling moves. The published-skill readings the os-dev definition asks for: this file 1223 → 1223 lines and 12980 → 12975 tokens; the package (all ten
skills/*/SKILL.md) 6145 → 6145 lines and 70695 → 70690 tokens; the whole priced bundle 139987 → 139982 tokens. Lowering this file's ceiling to 12975 is the script's stated option, but it editsscripts/check-skills-token-ratchet.mjs, outside this card's one-file surface — left to the seat.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the worktree (no hand-fed paths; change set read from the merge base5941246b70); every exit code captured redirect-then-$?; all runs atbef0dc6dfa.23 derived commands, every one exit 0:
node scripts/check-ci-filter-parity.mjs·node scripts/check-closing-keyword-parity.mjs·node scripts/check-closing-keyword-parity.mjs --self-test·node scripts/check-comment-mask-corpus.mjs·node scripts/check-doc-route-spelling.mjs --advisory·node scripts/check-doc-route-spelling.mjs --self-test·node scripts/check-skills-token-ratchet.mjs·node scripts/check-skills-token-ratchet.mjs --self-test·pnpm --filter @objectstack/spec run check:skill-docs·pnpm check:agent-test-spelling·pnpm check:corpus-claim-drift·pnpm check:cross-package-test-inputs·pnpm check:doc-authoring·pnpm check:driver-memory-census·pnpm check:nul-bytes·pnpm check:pm-governed-merges·pnpm check:refd-timer-probe·pnpm check:role-word·pnpm check:skill-compatibility·pnpm check:skill-frame-sync·pnpm check:skill-identifier-liveness·pnpm check:watch-hint-literal·pnpm --filter @objectstack/lint run check:doc-formula-expressionscheck:doc-formula-expressionsanswered exit 3 (PREREQUISITE NOT MET) on its first run, before any build; thenpnpm --workspace-concurrency=2 --filter '@objectstack/lint...' buildunderscripts/pm/os-verify-lock.sh(VERDICT command-exit 0, held 169s, waited 0s); the second run answered exit 0 — the 0 above is the second run.node scripts/pm/dispatch-gates.mjs --ran ran.list→✓ dispatch-gates --ran: 23 derived famil(ies) accounted for — 23 run, 0 NOT-MEASURED (a DERIVED zero — all 23 recorded an exit code and none of them is 3), exit 0.pnpm check:pm-skill-id-lintexit 0.pnpm lint(eslint . --no-inline-config) under the verify lock: VERDICT command-exit 0 (held 88s, waited 65s — shared-box seconds), atbef0dc6dfa.grep -naPover the C0/DEL range): 0 hits.Not owed locally, because the diff touches no package: no dependency-closure build, no package
test/typecheck. What stays CI's, as the derivation's stderr names it: 51 artifact-roster families, 11 wide-population families, 14 pending-changeset families, and the path-scheduledTest Corejob.Acceptance notes
POST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime half keyspackage-registryinServe.CAPABILITY_PROVIDERS. Kept out by the dispatch's 「no other sentence moves」. 承接者: the seat (a patch round on this PR — 「— all 20 of its entries:」 → 「— its entries:」 — pays for itself in tokens) or A writable package created viaPOST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime-half PR, which must edit the :442 table anyway.package-registry(in the vocabulary since spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694, no CLI provider row yet) is not documented in this section, so the enumeration of not-in-map tokens is one name short on the tip. Incompleteness, not a wrong instruction: an author never writes the token, it is always-on. It closes by itself when A writable package created viaPOST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime half adds the row (the enumeration is complete again and the :442 table gains a line). 承接者: A writable package created viaPOST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676 (open,domain:engine); the card's 「spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694 / spec/kernel: carve the package-registry persistence (sys_packagescontainer + hydration) out ofmarketplaceinto an always-on core capability under its own name — the spec half of #17676 ruling A′ item 1 #18053's own text」 has no live holder — spec/kernel: carve the package-registry persistence (sys_packagescontainer + hydration) out ofmarketplaceinto an always-on core capability under its own name — the spec half of #17676 ruling A′ item 1 #18053 is done and spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694 landed without touching the skill.skills/**for exactly this shape isscripts/check-skill-identifier-liveness.mjsLeg 2 (its header: 「the missing row — a doc enumeration presented as exhaustive stopped growing when the schema did」); registering this section's enumeration (the :442 table plus the two bullets) againstPLATFORM_CAPABILITY_TOKENSthere would flagpackage-registrytoday, while a prose COUNT such as 「all 20」 is outside both of its legs (existence, not arithmetic) andcheck-skills-token-ratchet.mjsprices bytes, not claims.check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767 remains open — the example block's TypeScript range in this file is a different number and is not folded.Generated by Claude Code