docs(skills): the AI domain has no CEL site — correct the os validate clause in objectstack-ai - #14819
Merged
Conversation
… clause
`skills/objectstack-ai/SKILL.md` told an author that `os validate` checks "any
CEL predicate parses and resolves — in this domain that is a model-registry
`promptTemplate.system` / `.user`". Those two keys are
`TemplateExpressionInputSchema` (`packages/spec/src/ai/model-registry.zod.ts`
:121-122), which `packages/spec/src/shared/expression.zod.ts:121-124` defines as
the `template` dialect — `{{var}}` interpolation, not CEL, not a predicate.
`predicate` occurs 0 times in `model-registry.zod.ts`, and those two keys are
the only Expression-typed sites anywhere in `packages/spec/src/ai/`.
The true half of the sentence is kept verbatim: `ToolSchema` carries no
expression field of any kind (`ai/tool.zod.ts` matches `cel|formula|expression`
0 times). The `npm run validate` sentence and the platform pointer are kept.
The fenced comment above the paragraph is untouched — it describes the command
platform-wide, not this domain.
Shrink-or-neutral: 21,903 B -> 21,900 B (5,476 -> 5,475 tokens at
`ceil(utf8/4)`), 417 lines unchanged, no re-wrap of untouched lines.
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 09:20
os-zhuang
enabled auto-merge
September 3, 2026 09:20
os-zhuang
deleted the
claude/issue-14797-ai-skill-cel-predicate-clause
branch
September 3, 2026 11:32
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 free
to 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 #14797
One clause in
skills/objectstack-ai/SKILL.md, under Verify your work, told an author thatos validateCEL-checks a model-registry prompt template. It does not, and there is no CEL site anywhere in the AI domain. Three lines change; nothing else in the file moves.Before / after — verbatim
Before (
:404-408at5a5336b399):After (
:404-408at90670f2b4a):Lines 3, 4 and 5 of the paragraph are byte-identical to before — the
ToolSchemaclause, thenpm run validatesentence and the platform pointer are kept exactly as they were, and the diff is3 insertions(+), 3 deletions(-)in one file.Every claim, cited — read in this branch, not recalled
promptTemplate.system/.userareTemplateExpressionInputSchemapackages/spec/src/ai/model-registry.zod.ts:121-122.describe()text says "supports{{var}}interpolation"TemplateExpressionInputSchemais dialecttemplate: a bare string becomes{ dialect: 'template', source }packages/spec/src/shared/expression.zod.ts:116-124(doc comment:116-120, union:121-124)predicateoccurs 0 times in the model registrygrep -c 'predicate' packages/spec/src/ai/model-registry.zod.ts= 0ToolSchemacarries no expression field of any kind — the clause keptgrep -Eic 'cel|formula|expression' packages/spec/src/ai/tool.zod.ts= 0grep -rn 'ExpressionInputSchema|ExpressionSchema|PredicateSchema|PredicateInputSchema' packages/spec/src/ai/returns exactly three lines — the import atmodel-registry.zod.ts:4and the two uses at:121-122. 22 files inpackages/spec/src/ai/, no other hit.packages/spec/src/shared/expression.zod.ts:99-101—ExpressionInputSchemais the one whose bare-string shorthand isdialect: 'cel'What
os validateactually does here — checked, not assumedos validateparsesObjectStackDefinitionSchemaand runs the authoring rules (packages/cli/src/commands/validate.ts:7-16imports,:39-41description). Two readings matter for this clause:FLOW_NODE_EXPRESSION_PATHSslots, object validation-rule / formula predicates, and UI actionvisible/disabledpredicates (packages/lint/src/validate-expressions.ts:4-17, scope table:34-44). Grepping that file forpromptTemplate,modelRegistry,knowledgeSourceor anai/path returns nothing: no AI slot is expression-validated.One thing the card asked for that the tree does not support
The card and the triage both proposed also naming "the 5-field cron at
packages/spec/src/ai/knowledge-source.zod.ts:28" as the domain's other expression-typed site. Measured at5a5336b399, it is not one. The field iscron: z.string().optional()atpackages/spec/src/ai/knowledge-source.zod.ts:33— a plain string;:28is the doc comment that calls it 5-field. It is absent from theExpressionSchemagrep above. Writing "and the cron on knowledge sources" into a sentence about expression checking would have replaced one false claim with another of the same class, so it is omitted. The omission also keeps this paragraph consistent withskills/objectstack-ai/SKILL.md:332, which already tells the author thatagents/tools/skillsare the only AI stack collections and that knowledge sources have none.Token accounting — shrink, per the lane rule
Convention is the ratchet's own:
ceil(utf8 bytes / 4)(scripts/check-skills-token-ratchet.mjs:184,TOKEN_CONVENTION).skills/objectstack-ai/SKILL.mdbeforeskills/objectstack-ai/SKILL.mdafterPackage total is the same delta — this is the only file touched, and no new file is added. The paragraph itself went 358 B to 355 B, so the new clause is shorter than the one it replaces rather than merely neutral. No re-wrap of untouched lines: the line count is unchanged and only the three lines shown above differ. The ceiling row is untouched (
['skills/objectstack-ai/SKILL.md', 6806],scripts/check-skills-token-ratchet.mjs:286); lowering it is permitted but not required by the script's own discipline note at:85-87.Fence census — nothing moved
The file's
os:checkmachinery all sits above the edit, so it cannot have shifted. Measured both sides:os:checkmarkersThe fenced
os validatecomment at:400—# Zod schema + CEL predicate validation + bindings (no artifact)— is deliberately not touched: it describes the command platform-wide, where CEL validation is real, and it is not this domain claim.Edit-landed-on-disk proof
grep -c 'CEL predicate parses' skills/objectstack-ai/SKILL.mdgrep -c 'no CEL site' skills/objectstack-ai/SKILL.md(injected text)grep -c 'ToolSchema' skills/objectstack-ai/SKILL.mdgrep -c 'npm run validate' skills/objectstack-ai/SKILL.mdGates — all at head
90670f2b4aThe union was re-derived after the last edit with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, which reportedgate list derived from the tree of 'objectstack-ai/objectstack' at commit 90670f2b4aand 16 commands over the 1-path change set. Every one was run; exit codes captured by redirect before any pipe.node scripts/check-skills-token-ratchet.mjs✓ check-skills-token-ratchet: skills/objectstack-ai/SKILL.md is 5475 tokens (ceiling 6806; headroom 1331).and✓ … 36 authored bundle file(s) within their ceilingsnode scripts/check-skills-token-ratchet.mjs --self-test✓ check-skills-token-ratchet self-test: 64 cases pass.node scripts/check-ci-filter-parity.mjsOK: all 133 declared cross-package glob(s) (93 unique) are covered …node scripts/check-cross-package-test-inputs.mjsOK: 25 package(s) read outside themselves, all declared …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.NOT MEASURED — the log is produced by the CI test run, which this gate cannot produce.pnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions (spec TSDoc, #6763): 9 @example(s) judged clean across 1120 packages/spec/src filespnpm --filter @objectstack/spec run check:skill-docs✅ Skill docs in syncpnpm check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 430 file(s) …pnpm check:corpus-claim-driftScanned: 224 .md/.mdx file(s) … Rules: 4 row(s) …(no violations)pnpm check:cross-package-test-inputsAll 117 self-test cases passed./OK: 25 package(s) …pnpm check:doc-authoring✓ doc authoring guard: 14546 customer-facing string(s) across 710 spec sources cleanpnpm check:pm-governed-merges✓ check-governed-merges --self-test: 243 assertions …pnpm check:role-wordScanned: 224 .md/.mdx file(s) read across 2 root(s) — content/docs 190, skills 34.(no violations)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).Named in the dispatch and run although the derivation did not list them:
pnpm --filter @objectstack/spec check:skill-examples✅ 256 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of themnode scripts/check-nul-bytes.mjscheck-nul-bytes: OK (scanned 8070 text file(s) … no raw ASCII control bytes).Three gates first answered
PREREQUISITE NOT MET(exit 3) or refused, and were re-run to a real verdict rather than reported as red:check-ci-filter-parityandcheck-shard-attestationwantedpnpm installin the fresh worktree, andcheck:doc-formula-expressions/check:skill-exampleswanted compiled output. Builds went through the shared lock (OS_VERIFY_LOCK_SLOT=issue-14797) —pnpm --filter @objectstack/spec --filter @objectstack/formula build, thenturbo run build --filter=@objectstack/lint --filter=@objectstack/client-react --filter=@objectstack/client --concurrency=2— both endingos-verify-lock: VERDICT command-exit 0, 34/34 turbo tasks successful. The rows above are the post-build runs.check-test-completenessis the one that stays NOT MEASURED; only CI can feed it.ESLint — a measured total, not a narrowing
Three pieces, each read from ESLint rather than assumed:
files:blocks ineslint.config.mjs(:971,:1015,:1054,:1103,:1172,:1212,:1238viaCOMMENT_SWALLOW_FILESat:785) are scoped to{ts,tsx,mts,cts,js,jsx,mjs,cjs}.grep -n '\.md\|mdx' eslint.config.mjsreturns 0 hits — Markdown is not in the linted population at all.--format json.pnpm exec eslint --no-inline-config --format json skills/objectstack-ai/SKILL.mdexits 0 with"errorCount":0and the messageFile ignored because no matching configuration was supplied.So 0 of the 1 changed paths are lintable, and the run over the change set is complete rather than narrowed.:328that there is(no parserOptions.project, no typed @typescript-eslint rules) for ANYblock, and the grep confirms onlyparserOptions: { ecmaVersion, sourceType }. With no type-aware program there is no cross-file coupling, and this diff edits no config, manifest, tsconfig or TS/JS source — so it cannot move any untouched file's verdict.Labels
skip-changeset: this PR releases nothing. The change set is one path underskills/**, andscripts/check-empty-changeset.mjs:359-362enumerates that case in its own words —It releases nothing (.github/, .claude/, skills/, docs/, content/, examples/, tests-only, and the like) -> delete the changeset and apply the 'skip-changeset' label (route 2). The gate pins exactly this shape as GREEN 3 at:559-568: "a skills/**-only PR carrying NO changeset (route 2) … must be green here". No package version moves, so no changeset file is added.needs:contract-review: the rewritten clause asserts what the AI surfaces are and what the author-time gate does with them.Review posture
Draft, and it stays draft — governed
skills/**, human merge is the review record. Not flipped ready, not enqueued, no auto-merge, no reviewers requested.Out of scope and untouched, as the triage directed:
skills/README.md:105(PR #14795 holds it), and the reference indexSKILL_MAP— #14462 is a different defect and is not addressed here.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code