Uh oh!
There was an error while loading. Please reload this page.
docs(skills): stop promising os validate checks a model-registry entry - #14953
Merged
Conversation
`skills/objectstack-ai/SKILL.md` told the author to run the author-time gate after "a model-registry entry" and said the gate confirms "skill / tool / model metadata". Neither is a check `os validate` can run: the AI collections of `ObjectStackDefinitionSchema` are exactly `agents` / `tools` / `skills` (`packages/spec/src/stack.zod.ts`), `ModelRegistrySchema` is referenced only by its own file and its own test, and `os validate` parses `ObjectStackDefinitionSchema` (`packages/cli/src/commands/validate.ts`). The same file already says so at its central-registration row. Two deletions, shrink-only: "or a model-registry entry" and "/ model". No re-wrap, no replacement validator named, no other sentence touched. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
os-zhuang
approved these changes
Sep 3, 2026
os-zhuang
marked this pull request as ready for review
September 3, 2026 14:01
os-zhuang
enabled auto-merge
September 3, 2026 14:01
os-zhuang
approved these changes
Sep 3, 2026
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#14836
skills/objectstack-ai/SKILL.mdtold an AI author to runos validateafter authoring "a model-registry entry", and then said the gate confirms "skill / tool / model metadata". A model-registry entry is not an inputos validatecan receive — and the same file already says so, 64 lines above. Two deletions, shrink-only, nothing else moved.The two sentences, before and after
Before, at the base commit
b1d49b3940::396-397— After authoring a*.skill.ts/*.tool.tsor a model-registry entry, run the author-time gate before reporting done::404— It confirms the skill / tool / model metadata conforms to the protocol.After, at this head:
:396-397— After authoring a*.skill.ts/*.tool.ts, run the author-time gate before reporting done::404— It confirms the skill / tool metadata conforms to the protocol.Untouched, deliberately: the
os validatefence comment at:400, the remaining CEL sentence at:404-407, the central-registration row at:332,skills/README.md, and every other file in the tree. No replacement validator is named and no "not currently validated" caveat is added — the fix is to stop promising, not to explain the gap.Premise re-verified at this head — the three reads the card names
packages/spec/src/stack.zod.ts— the AI collections ofObjectStackDefinitionSchemaare exactlyagents,tools,skills(the threez.array(...)rows under the ADR-0063 doc block). A case-insensitive grep of that file formodelRegist,knowledgeorpromptTemplateexits 1 with no output.ModelRegistrySchemais referenced in exactly two files acrosspackages/**/*.ts:packages/spec/src/ai/model-registry.zod.ts(3 occurrences) andpackages/spec/src/ai/model-registry.test.ts(5). No stack key, no lint rule, no CLI command reaches it.packages/cli/src/commands/validate.tsparsesObjectStackDefinitionSchema—safeParseat:187, with the two authoring-lint passes at:184-185reading the same schema.The contradiction partner is still present verbatim at
:332: "agents/tools/skillsare the only AI stack collections — knowledge sources have none, agents are platform-supplied, andtoolsis not the default path".Measurement — this file, before and after
skills/objectstack-ai/SKILL.mdLine count is unchanged because both deletions are intra-line. The token numbers are
node scripts/check-skills-token-ratchet.mjs's own output for this path:✓ check-skills-token-ratchet: skills/objectstack-ai/SKILL.md is 5475 tokens (ceiling 6806; headroom 1331).✓ check-skills-token-ratchet: skills/objectstack-ai/SKILL.md is 5467 tokens (ceiling 6806; headroom 1339).The ceiling map is not edited: this is a shrink under an unchanged ceiling.
Judgement calls
1. No re-flow, and the wrap was measured rather than assumed. This file wraps prose at 80 columns. Line
:396shrinks from 79 to 53 characters while:397keeps five words ("author-time gate before reporting done:", 39 characters) — not an orphan, so nothing is re-wrapped. Line:404shrinks from 76 to 68 with a full 80-character line behind it at:405. Pulling a word up in either place would edit a line this card did not name and would cascade through the rest of the paragraph.2. The
os validatefence comment at:400stays — it is shared wording, not this file's claim. Measured: the identical line, byte for byte, is atskills/objectstack-api/SKILL.md:411, so it describes the gate rather than this domain; and the sentence immediately after it here already tells the reader that this domain has no CEL site. Editing it in one of the two files would fork wording the published catalog shares. Recorded as an observation, not a change.3. Nothing else in the catalog claims a model-registry entry is validated. Swept
skills/**formodel-registry,model registryandModelRegistry: the remaining mentions are:301here (a note thatModelProviderSchemaaccepts a wider provider set),:405here (thetemplatedialect sentence),skills/objectstack-formula/SKILL.md:422(the sametemplatedialect fact) and the generated reference pointer atskills/objectstack-ai/references/_index.md:18. None of them promises a check, so the deletion leaves no instruction stranded and no author without a route.4. No changeset. This diff publishes nothing from any released package — one markdown file in the published catalog — so it carries
skip-changesetrather than an empty changeset.check-changeset-presencestates the outcome in its own verdict line on this PR.Reverse verification
Run from the committed state, under a trap restoring the absolute path, with the mutation proved on disk before anything was measured:
:396;grep -con that phrase moved 0 to 1 andgit hash-objectmoved to3cfae14e1c, away from the HEAD blob9f5231126e. Only then was the ratchet re-read.git checkout HEAD --on the absolute path;git hash-objectreturns9f5231126eab1f93aa5d1a142d4a78867cf8275f, equal to the HEAD blob, andgit diff HEADis empty. The ratchet then re-reads 5467 tokens, andgit status --porcelainis clean.Gates
The union was derived at this head rather than from a hand-written list:
Exit codes were captured by redirecting stdout and stderr into a per-gate log file and reading
$?on the next statement — never through a pipe, which would report the pipe's status instead. Each row quotes the gate's own verdict line.node scripts/check-ci-filter-parity.mjscoreorcrosspkg, everycrosspkgentry still covers one, and thetestjob'sif:still names both filters.node scripts/check-closing-keyword-parity.mjsnode scripts/check-comment-mask-corpus.mjsnode scripts/check-cross-package-test-inputs.mjsnode scripts/check-shard-attestation.mjsnode scripts/check-skills-token-ratchet.mjsnode scripts/check-test-completeness.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm --filter @objectstack/spec run check:skill-docspnpm check:agent-test-spelling--token(s) · 1388 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 81 manifest(s)pnpm check:corpus-claim-driftpnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:refd-timer-probepnpm check:role-wordpnpm check:skill-compatibilitypnpm check:skill-frame-syncpnpm check:skill-identifier-livenesspnpm check:watch-hint-literalTwo readings needed a prerequisite before they meant anything:
check:doc-formula-expressionsfirst answered PREREQUISITE NOT MET twice —@objectstack/formulanot built, then@objectstack/lintnot built — and both builds went through the shared verify lock (os-verify-lock: VERDICT command-exit 0, 190s and 12s held). Its exit 0 above is the reading after that, not the first one.NOT MEASURED
node scripts/check-test-completeness.mjs— exit 3, PREREQUISITE NOT MET. The gate grades a savedturbo run testlog; it does not run tests and cannot produce one. Its own text: "Arrived here from the gate familyscripts/pm/dispatch-gates.mjsderives? That list names this script with NO argument, which is this branch. There is no local log to hand it, so the local reading for this gate is NOT MEASURED. It is not a red, and there is nothing here to fix." Supplying that prerequisite means the repo-wide test farm, which is CI's run, not this flight's. Read as neither pass nor fail.os validatein a way no checker models:check:skill-identifier-livenessgrades whether cited identifiers exist (ModelRegistrySchemadoes exist), and the token ratchet grades size. The reverse verification above demonstrates this rather than papering over it — the mutated tree is green everywhere. The correctness of this change rests on the three source reads, not on a gate.dispatch-gates --commandssays so in its own closing line: workflows with no path filter are not in the local union, and are read from this PR's checks.Landing
Governed surface (
skills/**): this PR stays a draft. Not flipped ready, not enqueued, no auto-merge, no reviewers requested by this seat, no approving review. Labels:skip-changeset, andneeds:contract-reviewbecause the deleted words are a claim about whatos validatechecks.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code