Uh oh!
There was an error while loading. Please reload this page.
docs(skills): admit hand-authored reference files under references/ in the catalog anatomy - #14786
Merged
Merged
Conversation
The catalog anatomy in `skills/README.md` reserved `references/` for the generated `_index.md` alone and assigned every hand-authored per-topic file to `rules/`. Three published skills already keep hand-authored anchors under `references/` (`objectstack-data/references/data-hooks.md`, `objectstack-platform/references/plugin-hooks.md`), each linked directly from its own `SKILL.md` and cited by path from sibling packages, so the anatomy described a layout the catalog does not have. Amend the anatomy rather than move the files: the reader reaches the same text either way, and a move would be a multi-package rename with binding checks and ceiling-row renames for zero reader value. `_index.md` keeps its "generated — do not hand-edit" line and its `gen:skill-refs` pointer, byte-identical; `rules/` keeps its per-topic role. The requirement travels with the permission: a hand-authored reference file must be linked from `SKILL.md`. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This was referenced Sep 3, 2026
os-zhuang
approved these changes
Sep 3, 2026
os-zhuang
marked this pull request as ready for review
September 3, 2026 02:33
os-zhuang
enabled auto-merge
September 3, 2026 02:33
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#14655
What this changes
One line of
skills/README.md, inside the "Skill anatomy" tree: thereferences/entrynow carries a comment admitting hand-authored reference files.
The lane decision: option 2 (amend the anatomy, do not move the files)
The card offered two honest resolutions. The skills-lane seat chose option 2 in its
claim comment on #14655, and this PR implements exactly that.
The anatomy reserved
references/for the generated_index.mdand assigned everyhand-authored per-topic file to
rules/. Three published packages already keephand-authored anchors under
references/:SKILL.mdobjectstack-datareferences/data-hooks.mdSKILL.md:50,:173,:522objectstack-platformreferences/plugin-hooks.mdSKILL.md:657,:790Both are cited by path from sibling packages as well, so option 1 (move to
rules/) is amulti-package rename carrying pointer updates, a
check:skill-identifier-livenessLeg-2binding re-check (bindings are keyed by file path plus heading) and ceiling-row renames in
scripts/check-skills-token-ratchet.mjs— for zero reader value, since the reader reachesthe same text either way. Amending the sentence that describes the catalog is the cheaper
and truer half of the pair.
Why it is one block, and one line inside it. The permission is stated where the layout
is defined, so a reader authoring a new skill sees it at the moment the question arises,
and the requirement travels with the permission: a hand-authored reference file must be
linked from
SKILL.md. Everything else in the tree is byte-identical —SKILL.md,the two
_index.mdcomment lines (still "generated pointers", still "do not hand-edit",still the
pnpm --filter @objectstack/spec gen:skill-refspointer),rules/with itsper-topic role,
contracts/andevals/.Before
After
The illustrative examples the card sketched for the new comment (event lists, payload
tables, hook references) were left out deliberately: they are flavour, not contract, and
the block is under a shrink-or-neutral budget. The contract — optional, hand-authored,
linked from
SKILL.md— is stated in full.Token delta
skills/README.md, measured asceil(utf8_bytes / 4):df657d9df)3b9bf9435)Net positive, and stated as such rather than bought back by degrading a neighbouring
sentence. The paid-for alternative was folding the two
_index.mdcomment lines into one,which would have cost the reader the runnable
pnpm --filter @objectstack/spec gen:skill-refscommand on the catalog's front page — a worse trade than +19 tokens.skills/README.mdis outside the token-ratchet population(
scripts/check-skills-token-ratchet.mjs:133, self-test at:790), so no ceiling rowexists for it and none moved; the gate run below confirms that.
Premise correction (
premise_false)The card's closing sentence — "Either way the generator-owned
skills/README.mdisregenerated, never hand-edited" — is false for this block, and the seat corrected it
at dispatch. Measured here at
3b9bf9435:packages/spec/scripts/build-skill-docs.ts:12-13states the contract in its own header:derived listings are "rewritten between BEGIN/END GENERATED: skills markers; prose
outside the markers is preserved".
skills/README.md:44. The "Skillanatomy" heading is at
:50and the tree at:52-62— after it, in preserved prose.it by hand. That the generated region was not touched is proved by
check:skill-docsstaying green, and by the reverse verification below showing that thesame gate does go red for an edit inside the region.
Second, smaller correction: the seat's claim comment located the block at
:44-58. Atthis branch point it is the END marker that sits at
:44; the anatomy heading is:50and the tree
:52-62. No effect on the decision.Changeset
None, and the
skip-changesetlabel is applied. This diff releases nothing from anypackage —
scripts/check-empty-changeset.mjs:359-361enumerates that case by name:The diff is exactly one file,
skills/README.md, which is inside the enumeratedskills/.Gates
Head
3b9bf9435. The list is the union re-derived after the last edit withnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(16 families, all matched via
skills/README.md), plus the three the dispatch nameddirectly. Exit codes captured by redirect before any pipe; every run went through
scripts/pm/os-verify-lock.sh.node scripts/check-ci-filter-parity.mjsOK: all 130 declared cross-package glob(s) (92 unique) are covered by core or crosspkg, …node scripts/check-cross-package-test-inputs.mjsOK: 25 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.node scripts/check-shard-attestation.mjs✓ check-shard-attestation: 2 aggregate gate(s) count 3 declared leg(s) across 3 attesting job(s).node scripts/check-test-completeness.mjsPREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named.The gate's own text: "the local reading for this gate is NOT MEASURED. ⛔ It is not a red, and there is nothing here to fix."pnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1365 TS blocks judged clean by @objectstack/formula.(first run exited 3 on unbuilt prerequisites; measured after building@objectstack/formulathen@objectstack/lint)pnpm --filter @objectstack/spec run check:skill-docs✓ skills/README.md·✓ content/docs/ai/skills-reference.mdx·✅ Skill docs in syncpnpm check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 430 file(s) · 5698 bare -- token(s) · …pnpm check:corpus-claim-driftcheck-corpus-claim-drift: OK, no new claim sites beside a pinned spelling.pnpm check:cross-package-test-inputsAll 117 self-test cases passed.·OK: 25 package(s) read outside themselves, all declared…pnpm check:doc-authoring✓ doc authoring guard: 46 published skill files clean — no internal issue-id references.pnpm check:merge-driver✓ check-regen-pending self-test passed.pnpm check:pm-governed-merges✓ check-governed-merges --self-test: 243 assertions …pnpm check:role-wordcheck-role-word: OK, no new occurrences of the reserved word.pnpm check:skill-compatibility✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 79 workspace packagespnpm check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filespnpm check:skill-identifier-livenesscheck-skill-identifier-liveness OK — Leg 1: 465 citation(s) over 46 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s).node scripts/check-skills-token-ratchet.mjs✓ check-skills-token-ratchet: 36 authored bundle file(s) within their ceilings; 11 generator-owned file(s) measured, not ratcheted.node scripts/check-skills-token-ratchet.mjs --self-test✓ check-skills-token-ratchet self-test: 64 cases pass.node scripts/check-nul-bytes.mjscheck-nul-bytes: OK (scanned 8053 text file(s) … no raw ASCII control bytes).18 measured green, 1 recorded NOT MEASURED (CI-only input), 0 red.
Reverse verification of
check:skill-docsThe gate that proves the generated region was left alone is only worth quoting if it can
fail. Run from the committed state, under the verify lock, by a script with a
traponEXIT, INT and TERM that re-checks the file out, and absolute paths throughout. No rebuild
leg is owed: the gate is
tsx scripts/build-skill-docs.ts --check, which reads themarkdown sources from disk — no compiled artifact sits between the mutation and the
measurement.
expressiondomain cell)2940ce52…→e023126d…✗ skills/README.md is out of date — run pnpm --filter @objectstack/spec gen:skill-docsgit checkout HEAD -- skills/README.md)2940ce52…= the HEAD blob;git diff HEAD0 bytes;git status --porcelain0 lines✅ Skill docs in syncThe predicted direction was red naming
skills/README.md, and that is what it did.ESLint
Narrowed to the changed file, and the narrowing is a measurement rather than a skip:
eslint.config.mjsitself: the base block at:971isfiles: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'], and every later block (:1015,:1054,:1103,:1172,:1212,:1238) narrows within those extensions. No blockadmits
.md.--format json: one entry forskills/README.md, 0 errors, 1 warning,and the warning is
File ignored because no matching configuration was supplied.ESLint exited 0.
parserOptions.projectandno
projectServiceanywhere (its own comment at:328says so — "noparserOptions.project, no typed@typescript-eslintrules"), so no verdict on anyfile is a function of another file's contents. A markdown-only diff cannot move a lint
result anywhere in the tree.
Follow-up, not this PR
Adding one was explicitly out of scope. A gate is plausible — the shape would be "every
non-
_index.mdfile under a publishedskills/*/references/is referenced by thatskill's
SKILL.md" — but it needs the lane's decision, and there is a third file totriage first (below).
skills/objectstack-ui/references/react-blocks.mdis a generated file (its ownheader: "GENERATED by
packages/spec/scripts/build-react-blocks-contract.ts— do notedit") living under
references/beside_index.md, andgrepfinds no link to it fromobjectstack-ui/SKILL.md. It is neither the generated_index.mdthe anatomy names northe hand-authored, linked material this PR admits, so the amended sentence does not cover
it either. Reported to the lane seat for dedup against Seam (spec lane, ruled):
gen:react-blocksstops emittingskills/objectstack-ui/contracts/react-blocks.contract.json— the markdown rendering becomes the single AI-facing output (#14296 item 3 = A) #14559 rather than filed fromhere.
Merge
Draft, and it stays draft — governed
skills/**surface (Prime Directive #14): themaintainer's human merge is the review record. No reviewers requested, no auto-merge, no
ready flip.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1