Skip to content

Commit 96fdac2

Browse files
os-justinclaude
andauthored
docs(skills): cite PLATFORM_CAPABILITY_TOKENS instead of restating its count in objectstack-platform (#18839)
Fixes #18705 Clause-②: no The `requires:` section of the published `skills/objectstack-platform/SKILL.md` copied two numbers out of the platform capability vocabulary into prose — 「The other eight tokens in the vocabulary …」 and 「The authoritative list of all 28 is `PLATFORM_CAPABILITY_TOKENS`」 — and no gate reads either number against `packages/spec/src/kernel/platform-capabilities.ts`. PR #18694 (#18053) took the vocabulary 28 → 29 when it landed at 2026-09-17T16:10Z, so on `origin/main` both 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. The `package-registry` runtime 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/main` `5941246b70` (the branch point); none copied from the card. | reading | value | how | |:--|:--|:--| | `PLATFORM_CAPABILITY_TOKENS` size | **29** | parsed the frozen array literal in `packages/spec/src/kernel/platform-capabilities.ts`; `PLATFORM_CAPABILITY_PROVIDERS` has the same 29 keys | | `Serve.CAPABILITY_PROVIDERS` size (the map the section describes) | **20** | top-level keys of the static at `packages/cli/src/commands/serve.ts` :1863–:2009; the skill's :442 table names the same 20 as a set | | vocabulary tokens NOT in that map | **9** | `ai` `ai-studio` `i18n` `ui` `auth` `hierarchy-security` `ai-seat` `governance` — the eight the section lists — plus `package-registry` | | 「all 28」 on the tip | **false** (29) | | | 「the other eight」 on the tip | **false** (nine) | | | 「all 20 of its entries」 at :440 (same section; not named by the card) | **true** today (20 = 20) | | **Gate reading — which gate surfaces read the constant name — with controls (`git grep -l` at `5941246b70`):** - `scripts/` · `packages/*/scripts/` · `.github/` for `PLATFORM_CAPABILITY_TOKENS`: **0 files** (exit 1) - lit control, the same grep across the whole tree: **18 files** (exit 0; the card read 17 before #18694 landed — `.changeset/18053-package-registry-capability.md` and `content/docs/releases/v16.mdx` are the new hits) - dark control, a forged constant name across the whole tree: **0 files** (exit 1) ## The two sentences, before / after :452–:453 before: ``` The other eight tokens in the vocabulary are **not** in that map and do not resolve through it: ``` after: ``` The tokens in `PLATFORM_CAPABILITY_TOKENS` not in that map do not resolve through it: ``` :463 before: ``` The authoritative list of all 28 is `PLATFORM_CAPABILITY_TOKENS` ``` after: ``` The authoritative list is `PLATFORM_CAPABILITY_TOKENS` ``` 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 of `Serve.CAPABILITY_TO_TIER` at :1577–:1585, verbatim); enterprise / cloud `hierarchy-security`, `ai-seat`, `governance` — is in `PLATFORM_CAPABILITY_TOKENS` at the tip, and none of the eight is a `Serve.CAPABILITY_PROVIDERS` key. 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 in `PLATFORM_CAPABILITY_PROVIDERS` (`@objectstack/service-package`, open edition) but has no `Serve.CAPABILITY_PROVIDERS` row yet — the constant's own comment says it is inert under `objectstack serve` until #17676's runtime half lands. Per the card this PR documents no new token; the Acceptance notes say who holds that. The `marketplace` provider line (:444, `@objectstack/service-package`) was read against `Serve.CAPABILITY_PROVIDERS.marketplace.pkg` at :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): | | bytes | tokens | ceiling | headroom | exit | |:--|--:|--:|--:|--:|--:| | before (`5941246b70`) | 51918 | 12980 | 12984 | 4 | 0 | | after (`bef0dc6dfa`) | 51898 | 12975 | 12984 | 9 | 0 | 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 edits `scripts/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/objectstack` from the worktree (no hand-fed paths; change set read from the merge base `5941246b70`); every exit code captured redirect-then-`$?`; all runs at `bef0dc6dfa`. 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-expressions` - `check:doc-formula-expressions` answered exit **3** (PREREQUISITE NOT MET) on its first run, before any build; then `pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build` under `scripts/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. - Reconciliation: `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. - Named by the dispatch and run in addition (not in the derivation): `pnpm check:pm-skill-id-lint` exit 0. - Repo-wide `pnpm lint` (`eslint . --no-inline-config`) under the verify lock: VERDICT command-exit 0 (held 88s, waited 65s — shared-box seconds), at `bef0dc6dfa`. - Control-byte self-scan of the edited file (`grep -naP` over 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-scheduled `Test Core` job. ## Acceptance notes - noted, not filed — :440 「all 20 of its entries」 is a third copied count in the same section, true on the tip (map = 20, table = the same 20 names) and the same class as this card; it turns false the moment #17676's runtime half keys `package-registry` in `Serve.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 #17676's runtime-half PR, which must edit the :442 table anyway. - noted, not filed — `package-registry` (in the vocabulary since #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 #17676's runtime half adds the row (the enumeration is complete again and the :442 table gains a line). 承接者: #17676 (open, `domain:engine`); the card's 「#18694 / #18053's own text」 has no live holder — #18053 is done and #18694 landed without touching the skill. - option B, one sentence for the seat, no code: the gate that already walks `skills/**` for exactly this shape is `scripts/check-skill-identifier-liveness.mjs` Leg 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) against `PLATFORM_CAPABILITY_TOKENS` there would flag `package-registry` today, while a prose COUNT such as 「all 20」 is outside both of its legs (existence, not arithmetic) and `check-skills-token-ratchet.mjs` prices bytes, not claims. - #16767 remains open — the example block's TypeScript range in this file is a different number and is not folded. --- _Generated by [Claude Code](https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent f7e5231 commit 96fdac2

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

‎skills/objectstack-platform/SKILL.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,8 +449,8 @@ token through the `CAPABILITY_PROVIDERS` registry in
449449
| `mcp` | `@objectstack/mcp` |
450450
| `triggers` | `@objectstack/trigger-record-change`, plus `trigger-schedule` and `trigger-api`. **Pair it with `job`** — schedule and time-relative triggers run on the job service |
451451

452-
The other eight tokens in the vocabulary are **not** in that map and do not
453-
resolve through it:
452+
The tokens in `PLATFORM_CAPABILITY_TOKENS` not in that map do not resolve
453+
through it:
454454

455455
- **Tier-gated** — `ai`, `ai-studio`, `i18n`, `ui`, `auth` have no provider
456456
entry; dedicated blocks in `serve.ts` `run()` open their tier instead
@@ -460,7 +460,7 @@ resolve through it:
460460
ships in `@objectstack/security-enterprise`, loaded through `plugins[]`;
461461
`ai-seat` and `governance` are resolved only by cloud's objectos-runtime.
462462

463-
The authoritative list of all 28 is `PLATFORM_CAPABILITY_TOKENS`
463+
The authoritative list is `PLATFORM_CAPABILITY_TOKENS`
464464
(`@objectstack/spec`, `kernel/platform-capabilities.ts`) — an unknown token is
465465
**rejected by `defineStack` at authoring time**, not at boot.
466466

0 commit comments

Comments
 (0)