Repository navigation
Commit 96fdac2
docs(skills): cite
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>PLATFORM_CAPABILITY_TOKENS instead of restating its count in objectstack-platform (#18839)1 parent f7e5231 commit 96fdac2
1 file changed
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
449 | 449 | | |
450 | 450 | | |
451 | 451 | | |
452 | | - | |
453 | | - | |
| 452 | + | |
| 453 | + | |
454 | 454 | | |
455 | 455 | | |
456 | 456 | | |
| |||
460 | 460 | | |
461 | 461 | | |
462 | 462 | | |
463 | | - | |
| 463 | + | |
464 | 464 | | |
465 | 465 | | |
466 | 466 | | |
| |||
0 commit comments