docs(protocol): the actions.mdx outputSchema bullet says the cloud AI runtime validates the action result - #21303
Merged
objectstack-fleet[bot] merged 1 commit intoOct 2, 2026
Conversation
… runtime validates the action result The bullet no longer claims "enabling structured tool chaining", which no reading measured. It says what the runtime does with ai.outputSchema: the action's result is validated against it and withheld when it does not conform, and a schema the runtime cannot enforce is refused before the action runs. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FNKm1SmPpuJASnbjxWGtsJ
This was referenced Oct 2, 2026
objectstack-fleet
Bot
deleted the
claude/issue-21288-actions-mdx-outputschema
branch
October 2, 2026 03:30
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.
Refs #21288
Clause-②: no
What this does
One bullet in
content/docs/protocol/objectui/actions.mdx(the AI Tool Exposure section, line 494 at4e6dc233) saidai.outputSchemais "JSON Schema for the return value, enabling structured tool chaining". No reading on the parent card names a consumer that chains tools on it, and the 2026-08-29 cloud re-close recorded "no chaining consumer"; meanwhile the one thing the runtime does with the key was missing. The bullet now reads: JSON Schema for the return value. The cloud AI runtime validates the action's result against it and withholds a result that does not conform; a schema it cannot enforce is refused before the action runs.guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274, of cloudmaincb62c3ea:packages/service-ai/src/tools/action-tools.ts#compileOutputContractreadsaction.ai.outputSchemadirectly, inside the action tool's handler; a non-conforming result is withheld with a typed error.guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274, of cloudmainafter the merge1e0ea49a(objectstack-ai/cloud#2572 landed): a schema zod cannot parse, or one with a type-scoped keyword in an untyped subschema, is refused before the action runs (AI_TOOL_OUTPUT_SCHEMA_VIOLATION, stagebefore_run); every other schema is checked against the return value after the run, and a violation withholds the value.Why a second PR, and why
RefsThis is the cross-lane
domain:devxsurface of #21288, routed by triage 5944149289: the card's two skill positions land in the governedskills/**PR onclaude/issue-21288-ai-skill-guardrails-outputschema-enforced(Tier H, draft until an authorized APPROVED review), and this docs line lands as an ordinary PR under the same claim. The card is closed by that PR. This one deliberately carries no closing keyword, so the duplicate-fix guard sees one claim on the issue, not two.Verification (at
7e943517, worktreeobjectstack-issue-21288-docs)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 40 commands from the merge base4e6dc233(1 path, +1/−1). Each ran with its exit code captured before any pipe;--rananswered: "✓ dispatch-gates --ran: 40 derived famil(ies) accounted for — 40 run, 0 NOT-MEASURED".pnpm check:doc-authoring,pnpm check:doc-anchors,pnpm check:docs-single-h1,pnpm check:docs-redirects,pnpm check:docs-spec-enumerations,pnpm check:docs-audit-scope,pnpm check:docs-transcript-drift,pnpm check:corpus-claim-drift,pnpm check:role-word,pnpm check:nul-bytes,pnpm check:published-readme-links,pnpm check:skill-identifier-liveness,pnpm check:gitlink-declared,pnpm check:cross-package-test-inputs,pnpm check:driver-memory-census,pnpm check:react-page-adapter-contract,pnpm check:refd-timer-probe,pnpm check:vendor-version-stamps,pnpm check:watch-hint-literal;pnpm --filter @objectstack/spec run check:docs,check:empty-state,check:liveness,check:strictness-ledger,check:variant-docs,check:yaml-examples(afterpnpm --filter @objectstack/spec buildunder the shared verify lock); and the directnode scripts/check-*.mjsrows (ci-filter-parity, closing-keyword-parity and its self-test, comment-mask-corpus, doc-frontmatter and self-test, doc-route-spelling advisory and self-test, docs-section-name and self-test, section-landing-index and self-test).pnpm --filter @objectstack/lint run check:doc-formula-expressionsandcheck:doc-security-posture: first run exit 3, PREREQUISITE NOT MET (@objectstack/formula/@objectstack/lintnot built), nothing measured; afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the lock, exit 0 each ("✅ 27 ObjectSchema.create example(s) in 227 marked block(s) across 249 prose file(s) in 2 root(s) carry an os validate-clean security posture").pnpm --filter @objectstack/spec run check:skill-examples: first run exit 3 (packages/client-react/distholds no declarations), nothing measured; afterpnpm exec turbo run build --filter=@objectstack/client --filter=@objectstack/client-reactunder the lock, exit 0: "✅ 259 prose examples type-check across 3 surface(s)".Build Docsjob, the whole-rootpnpm lint, the type-check lanes and Test Core; the--ranfooter names them as outside the derived total.Changeset
skip-changeset.content/docs/**is in no published package'sfiles[]: a scan of everypackage.jsonin the tree for afiles[]entry namingskillsorcontent/docsfinds zero; the positive control@objectstack/speclistsdist,json-schema,liveness,prompts,llms.txt,README.md,src/**/*.zod.ts,CHANGELOG.md,api-surface,spec-changes.json. The docs site is built from this tree, not shipped in a tarball.Acceptance notes
content/docs/ai/tools.mdx:148onmainat4e6dc233still carries the folded-into-the-description row for a tool'soutputSchema, as do the spec describe and the generated reference pages. PR feat(spec): agent.guardrails is live, enforced by the cloud AI runtime; tool.outputSchema steers authors to action.ai.outputSchema #21280 (open, draft) rewrites them. Carrier: that PR; noted, not filed.packages/spec/src/ui/action.zod.tstypesaction.ai.outputSchemaas an open record, so authoring accepts an untyped-keyword schema the runtime now refuses at call time (reading 5943779795 raises it for the spec lane). The docs line describes the refusal; whether authoring should refuse it is the same shape of question as spec(ai):agent.structuredOutputis now enforced by cloud, which refuses four authorable members (regex/grammar/xmlformats, thecoerce_typesstep) — retire them or build them, then flip the row #21277 and is not decided here.Generated by Claude Code