Repository navigation
Commit 197fbe2
docs(skills): the two READMEs the skills package ships install the catalog from @objectstack/skills at the installed spec's version; the GitHub path is the next channel only (#23232)
Fixes #22668
Clause-②: no (docs and README text)
The closing half of ruling A on #22649 (record 6096124407), at the tier
`skills/**` mandates. PR #23220 (`Part of #22668`) rewrote the four docs
pages; this PR rewrites the two READMEs the `@objectstack/skills`
package ships — `skills/README.md` (the catalog's front page, copied
into the tarball as `dist/skills/README.md`) and
`packages/skills/README.md` (the npm page) — and adds the patch
changeset. Both now give the install the docs give: add
`@objectstack/skills` at the installed `@objectstack/spec`'s version,
then `npx skills experimental_sync`; the GitHub path is named once, as
the `next` channel. No `SKILL.md` is touched, and the generated index
block in `skills/README.md` is untouched.
## 维护者速读(草稿)
### 改了什么
- `skills/README.md`(目录首页,随 `@objectstack/skills` 发布为
`dist/skills/README.md`)的安装段落:不再教 `npx skills add
objectstack-ai/objectstack/skills …`,改为两步 —— 按项目已安装的 `@objectstack/spec`
版本安装 `@objectstack/skills`,再 `npx skills experimental_sync --agent
claude-code -y`。GitHub 路径只保留一句,作为 `next` 渠道(未发布的 `main`,用于试用下一版的
skills,不用于已发布项目)。生成的 index 块一字未动。
- `packages/skills/README.md`(npm 页面):裸装 `npm install --save-dev
@objectstack/skills` 改为钉版本的命令;删掉从未发布过的 `@objectstack/skills@17.7.0`
示例;写明版本自 `18.0.0-next.0` 起提供(无 17.x,17.x 项目第一步会报 `ETARGET`);写明
`experimental_sync` 会跳过 `skills add` 装的 skill,脚手架项目须先 `npx skills remove
--all`;更新口径改为「随其他 `@objectstack/*` 一起升 `@objectstack/skills`,再重跑 sync」。
- 新增 `.changeset/22668-skills-readme-install.md`:`@objectstack/skills` 的
patch changeset(两份 README 都在 tarball 里)。
### 为什么改
- 两份 README 教的是 #22649 裁决 A 之前的安装方式。npm 页面上的裸装命令,在依赖
`@objectstack/spec@17.7.0` 的项目上今天实测会装上 `18.0.0-next.0`(registry 的
`latest`),即下一个大版本的目录;首页仍教从 GitHub `main` 安装,拿到的目录与项目的 spec 版本无关。
- 与 #23220 的四个 docs 页面保持同一条命令、同一句版本说明、同一个 `next` 渠道句,读者从 npm、GitHub、docs
三处看到的是一套说法。
### 风险与代价(含回滚)
- 只改两份 markdown 和一个 changeset,不改任何代码、`SKILL.md` 或
schema;`check:skill-docs` 绿,`dist/skills/README.md` 构建后与源文件逐字节一致。
- 风险在文字本身:两处「自 `18.0.0-next.0` 起提供」「脚手架到 `18.0.0-next.0` 仍用 `skills
add`」是对今天 registry 的实测陈述;#22659(脚手架改为从包安装)落地后,后一句需随之改写(见 Acceptance
notes)。
- 回滚:revert 本 PR 即可;changeset 未被消费前删除即无痕,已发布则随下一次 patch 发布回退文字。
### 席位意见
(留空,席位定稿)
### 你要做的
- 这是 Tier H 受管面(`skills/**`):PR 保持 draft,等你的 APPROVED review 后由席位落地;不挂
auto-merge。
- 两个待裁问题仍是上一轮报告里的:17.x 项目要不要一次性发布
`@objectstack/skills@17.7.0`(只有维护者能做,PD15);以及 #22659 落地时同步改写两处「Through
`18.0.0-next.0`」句。
## What changes, file by file
- `skills/README.md` (the install paragraph, lines 5–23; the generated
index block and everything below it are byte-identical to `main`):
- the two-step install with the version pinned to the installed spec's:
`npm install --save-dev "@objectstack/skills@$(node -p
"require('@objectstack/spec/package.json').version")"`, then `npx skills
experimental_sync --agent claude-code -y`; the sentence that the
catalog's version is then your spec's;
- the update story: bump `@objectstack/skills` with the other
`@objectstack/*` packages, then re-run the sync;
- which versions exist: published from `18.0.0-next.0` on (there is no
17.x release); `--copy`, scaffolded projects and the rest point at the
[Skills
reference](https://objectstack.ai/docs/ai/skills-reference#installing-skills)
(the `#installing-skills` heading exists on `main` today);
- the one `next` channel sentence naming the GitHub path: `npx skills
add objectstack-ai/objectstack/skills --skill '*' --agent claude-code
-y` reads the catalog straight from the repository's unreleased `main` —
for trying the next version's skills, not for a released project.
- Removed: the `--all` multi-runtime paragraph and the `/skills` subpath
sentence, both about the GitHub `add` path as the install.
- `packages/skills/README.md` (the npm page; `files` lists `README.md`):
- the paragraph that said "A project that depends on
`@objectstack/skills@17.7.0` reads the skills written for
`@objectstack/spec` 17.7.0" now says it of "`@objectstack/skills` at the
version of its `@objectstack/spec`" — 17.7.0 of this package was never
published;
- the install section: the same two commands as above, numbered as in
the reference; what the sync writes (links per agent, `--copy`); "Keep
the version in step 1: a bare install installs whichever version the
registry tags `latest`, not your spec's";
- **Updating** (bump with the other `@objectstack/*` packages, re-run
the sync), **Which versions exist** (from `18.0.0-next.0` on; a 17.x
project's step 1 refuses with `ETARGET`), **Projects scaffolded by
`create-objectstack`** (through `18.0.0-next.0` the scaffolder uses
`skills add` from the `next` channel; the sync skips those; `npx skills
remove --all` or by name, then steps 1 and 2);
- **The `next` channel** keeps its section, with the same sentence as
the docs; "How the tree is produced" is unchanged; the Related link to
the reference gains the `#installing-skills` anchor.
- `.changeset/22668-skills-readme-install.md`: `"@objectstack/skills":
patch`, `Clause-②: no`, the before and after in prose. Both READMEs ship
in the tarball (`files`: `dist`, `README.md`, `CHANGELOG.md`; the build
copies `skills/**` into `dist/skills/**`), so this is a published change
and `skip-changeset` does not apply.
## Consistency with PR #23220 (the docs half)
#23220 merged while this PR was being verified (squash `01a3421f42`,
2026-10-13T10:13Z); the four docs pages on `origin/main` are
byte-identical to its head `7a3bc7f47`, which is what the READMEs were
aligned against. Read side by side with
`content/docs/ai/skills-reference.mdx` and `skills.mdx` there: the
step-1 command, the step-2 command and its flags, the sentence "the
catalog's version is then your spec's", the update story, the "published
from `18.0.0-next.0` on" line, the scaffolded-project remedy (`npx
skills remove --all`, or by name) and the `next` channel sentence are
the same words. `skills/README.md` carries the short form `skills.mdx`
carries and links to the reference for the rest;
`packages/skills/README.md` carries the reference's full set, because
the npm page has no docs page beside it.
## Measured on the claim's day (2026-10-13), not taken from the card
Throwaway projects under the session scratchpad, against the registry,
npm 10.9.4, node 22.22.0, skills CLI 1.7.2 (every exit captured before
any pipe; logs under `issue-22668/r2-probes/`):
- `npm view @objectstack/skills dist-tags versions`: `latest` and `next`
both `18.0.0-next.0`; versions `0.0.0-stage`, `18.0.0-next.0`.
`@objectstack/spec`: `latest` 17.7.0, `next` 18.0.0-next.0.
`create-objectstack`: the same two tags.
- (a) a project on `@objectstack/spec@17.7.0`: the bare `npm install
--save-dev @objectstack/skills` exits 0 and installs `18.0.0-next.0`
(saves `^18.0.0-next.0`) — the sentence the npm page now carries. (b)
The pinned step 1 on that project exits 1: `npm error code ETARGET` /
`No matching version found for @objectstack/skills@17.7.0`.
- (c) a project on `@objectstack/spec@next` (18.0.0-next.0): step 1
exits 0 and saves `^18.0.0-next.0`; `npx skills experimental_sync
--agent claude-code -y` exits 0 and links 10 skills —
`.agents/skills/NAME` to
`../../node_modules/@objectstack/skills/dist/skills/NAME`,
`.claude/skills/NAME` to `../../.agents/skills/NAME`; `skills-lock.json`
records `sourceType: node_modules`, `version: 18.0.0-next.0`.
- (d) the scaffolder's sequence: `npx skills add
objectstack-ai/objectstack/skills --skill '*' --agent claude-code -y`
from GitHub exits 0; the sync after it exits 0 and prints `Skipped NAME
from @objectstack/skills: installed with skills add from
objectstack-ai/objectstack` for all 10; after `npx skills remove --all`
(exit 0) the sync installs all 10 from the package.
- The published `@objectstack/skills@18.0.0-next.0` tarball: its
`README.md` is byte-identical to `packages/skills/README.md` at the base
commit `920bc12a24` (the npm page carries the text this PR replaces),
and its `dist/skills/README.md` is byte-identical to `skills/README.md`
at that commit.
- The build: `pnpm --filter @objectstack/skills build` under the verify
lock, `VERDICT command-exit 0` — self-test 9 cases, "65 file(s) across
10 skill(s) copied from skills/** into dist/skills and read back
byte-identical"; `cmp skills/README.md
packages/skills/dist/skills/README.md` is clean, so the new front page
is what the tarball will carry.
## Readings the `skills/**` rule asks for
- `skills/README.md`: 126 → 128 lines, 8,078 → 8,322 bytes (+2 lines,
+244 bytes), all inside the install paragraph: 10 lines about the GitHub
`add` path removed (the `--all` paragraph, the subpath sentence), 12
added (the package install, the update story, the versions line, the
`next` channel). The file is outside `check:skills-token-ratchet`'s
population (its header, "population 3: OUTSIDE — skills/README.md") and
outside `check:pm-skill-ratchet`'s map.
- The bundle's `SKILL.md` sum: 4,409 → 4,409 lines over 10 files (no
`SKILL.md` touched).
- `packages/skills/README.md` (not under `skills/**`): 55 → 74 lines,
2,786 → 4,024 bytes.
## Gates
All at `3f11f00524` (worktree `objectstack-issue-22668-readme`, base
`920bc12a24` = `origin/main` at claim time, the branch's empty probe
commit `150da61aa5` fast-forwarded onto it). Every exit code was
captured before any pipe (`cmd > log 2>&1; EXIT=$?`); logs are under the
session scratchpad, `issue-22668/r2-gates/`.
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (no paths: the change set comes from the
merge base, 3 paths) derived 66 commands. Pass 1 ran all 66 plus two I
added because `packages/skills/README.md` is in their population:
`check:published-readme-links` and `check:published-readme-exports`.
Result: 64 exit 0, 4 exit 3 (`PREREQUISITE NOT MET`, read as NOT
MEASURED, not as red): `check:doc-formula-expressions`,
`check:dual-build-cjs-loads`, `check:lean-entry-closure`,
`check:published-readme-exports`.
- After `pnpm turbo run build --filter='@objectstack/lint...'
--filter='@objectstack/formula...' --filter='@objectstack/objectql...'
--concurrency=2` under the verify lock (14 tasks, 4m20s, `VERDICT
command-exit 0`), `check:doc-formula-expressions` and
`check:lean-entry-closure` re-ran to exit 0 ("22 record-scoped formula
example(s) across 474 files / 1391 TS blocks judged clean"; "2 published
condition(s) measured from a real load").
- `--ran` reconciliation over the 68 recorded exit codes: `66 derived
famil(ies) accounted for — 65 run, 1 NOT-MEASURED (1 DERIVED from a
recorded exit 3)`, `0 UNRUN`. The one is `check:dual-build-cjs-loads`,
which loads every package's `dist/`; `check:published-readme-exports`
(outside the derivation) refuses for the same reason — the built type
entries. **NOT MEASURED locally**, reason: both read built output of
packages this diff does not touch (two markdown files and a changeset;
no source, `exports` or type entry moves), and the prerequisite is the
full build — a turbo dry-run on this tree reads 81 of 82 build tasks as
cache MISS — on a shared box. `Lint & Repo Gates` runs both on the PR; a
declared narrowing, not a skip.
- The card's named gates: `pnpm --filter @objectstack/spec run
check:skill-docs` exit 0 (`✓ skills/README.md`, `✓
content/docs/ai/skills-reference.mdx`, "Skill docs in sync": the
generated index block is untouched). `check:skill-compatibility`,
`check:skill-frame-sync`, `check:skill-identifier-liveness`,
`check:corpus-claim-drift`, `check:doc-authoring`,
`check:doc-route-spelling` (advisory and self-test), `check:nul-bytes`,
`check:pm-governed-merges`, and the changeset gates —
`check:empty-changeset --base origin/main`, `check:changeset-no-major`,
`check:adr-0087-registration`, `check:changeset-gate-self-tests`,
`check:pm-changeset-deadline-census`, `check:published-files` — all exit
0. `check:published-readme-links` exit 0: "226 outbound link(s) across
103 published markdown file(s): 0 root-relative, 0 non-canonical
origin(s), 28 docs-site page(s) resolved, 2 anchor(s) verified" (the
`#installing-skills` anchor is one of the two).
- Control characters: a grep for the C0 range, DEL and the two
C1-adjacent bytes (`[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]`, `-naP`) over the
three files has no hits (exit 1); `check:nul-bytes` exit 0. No HTML
comment is added; the two in `skills/README.md` are the generated
block's own markers, untouched.
- `pnpm lint`, narrowed and proven: eslint's own config answers for all
three files `File ignored because no matching configuration was
supplied` (`eslint --no-inline-config --format json` over them: 3
results, 0 errors, that one warning each), so the population this diff
can reach is 0 of eslint's; `eslint.config.mjs` enables no type-aware
linting (no `parserOptions.project`, its own line 328 says so), so no
untouched file's verdict can move. A measurement, not a skip.
- Step ① (`pnpm --filter '@objectstack/skills^...' build`):
`@objectstack/skills` has no workspace dependencies, so the closure is
empty. Step ②: the package declares no `test` or `typecheck` script
(`build` and `prepublishOnly` only), so there is none to run — and a
zero-match `--filter` run would exit 0 having run nothing, which is why
it is not cited; its `build` ran under the lock (above) and proved the
copy byte-identical. No reverse verification or ablation applies to a
docs-only diff.
- The derivation printed a STALE TREE note at the `--ran` read:
`origin/main` moved 8 commits (to `01a3421f42`) while the battery ran,
and 4 of the files it derives from changed. Read: `lint.yml` / `ci.yml`
add `check:authorable-surface` and `check:docs` steps (`packages/spec`
families; this diff touches no spec path) and
`scripts/ci/lane-verdict.mjs` replaces
`scripts/report-unmeasured-gate-tail.mjs` (gate reporting, not a gate);
none names these three paths. The only other overlap with this PR's
subject is #23220 itself landing (below). The branch is not re-merged
onto that `main`: the diff is disjoint from everything that landed, and
the queue rebuilds on current `main` when the PR is landed.
## Acceptance notes
- Tier H: the diff touches `skills/**`, so this PR stays a draft until
the maintainer's approval; no seat readies it or arms auto-merge.
- When the `create-objectstack` card (#22659 remains open) lands the
package-based scaffolder, the "Through `18.0.0-next.0` …" paragraph in
`packages/skills/README.md` goes stale and that PR owes the rewording,
as #23220's two sentences do. It stays true as written for every
scaffolder version up to and including `18.0.0-next.0`.
- 17.x projects: both READMEs state what is measured and nothing more —
no 17.x `@objectstack/skills` exists. The choice between leaving it
there (the docs' current line) and a one-time
`@objectstack/skills@17.7.0` publish from the tag (a release act, the
maintainer's) is the open question in the report; neither README
documents the tag sparse-clone path, which is a second GitHub channel
ruling A excludes.
- `h46ClaimNamesBranch` (the predicate `check:closing-target-claim`
imports) answers `true` for this branch against the claim extension
6142814394 and `false` for #23220's branch, read offline from the
comment's body; `Fixes #22668` is therefore the closing keyword here,
and #23220 keeps `Part of`.
- The commit trailer pair is the model-free form AGENTS.md requires.
---
_Generated by [Claude
Code](https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 01a3421 commit 197fbe2
3 files changed
Lines changed: 60 additions & 26 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
16 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
22 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
26 | | - | |
27 | | - | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
28 | 32 | | |
29 | 33 | | |
30 | 34 | | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
35 | 54 | | |
36 | 55 | | |
37 | 56 | | |
38 | 57 | | |
39 | 58 | | |
40 | | - | |
41 | | - | |
| 59 | + | |
| 60 | + | |
42 | 61 | | |
43 | 62 | | |
44 | 63 | | |
| |||
51 | 70 | | |
52 | 71 | | |
53 | 72 | | |
54 | | - | |
| 73 | + | |
55 | 74 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
7 | 9 | | |
8 | 10 | | |
9 | | - | |
| 11 | + | |
| 12 | + | |
10 | 13 | | |
11 | 14 | | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
19 | 20 | | |
20 | | - | |
21 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
22 | 24 | | |
23 | 25 | | |
24 | 26 | | |
| |||
0 commit comments