Skip to content

fix(spec): tombstone agent.tools instead of deleting it — unbreak main - #3904

Merged
os-zhuang merged 1 commit into
mainfrom
claude/ai-tools-retirement-tombstone
Jul 28, 2026
Merged

fix(spec): tombstone agent.tools instead of deleting it — unbreak main#3904
os-zhuang merged 1 commit into
mainfrom
claude/ai-tools-retirement-tombstone

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

main is currently red and this fixes it. pnpm --filter @objectstack/spec build fails on a cold build of main:

❌ 4 authorable key(s) disappeared from the contract:
     - ai/AITool:description
     - ai/AITool:name
     - ai/AITool:type
     - ai/Agent:tools

#3894 (mine) removed agent.tools and AIToolSchema outright. The authorable-surface ratchet (ADR-0104 / #3733) rejects that, and it is right: none of these schemas is .strict(), so Zod silently STRIPS an unknown key — an author who keeps writing tools: would get a clean parse and an agent that reaches none of the tools they listed. That is precisely the silent-capability-loss shape #3820 exists to eliminate, reintroduced one layer down by the PR meant to eliminate it.

It slipped CI because Build Core restored a turbo cache entry for the spec build; the failure reproduces on any cold build.

The removal stands — the method changes

ADR-0064 still needs the second, unscoped tool slot gone. Three changes make that removal honest:

1. agent.tools is tombstoned, not deleted. retiredKey() makes it z.never(), so authoring it throws with the fix in the message:

agent.tools was removed in @objectstack/spec 17 (#3894) — use skills. An agent reaches exactly the tools its surface-compatible skills declare (ADR-0064), so move each reference into a skill: a platform tool by its registered name, or action_<name> for one of your own AI-exposed Actions. Run os migrate meta --from 16 to rewrite it automatically.

This supersedes #3894's changeset line claiming the key "remains a silent no-op rather than a parse error". Loud is correct, and it is what this repo's ratchet requires.

2. A D2 conversion + D3 chain step. agent-tools-to-skills joins CONVERSIONS_BY_MAJOR[17] and step 17's conversionIds, so the removal reaches spec-changes.json, the upgrade guide, and the spec_changes MCP tool. Unlike the protocol-17 renames beside it, this one has no lossless target — each entry must become a reference inside a skill, which is a human decision about which skill. So it drops the dead key (the runtime stopped reading it in objectstack-ai/cloud#910, so it already contributes nothing at load) and emits one notice per agent marking where capability has to be re-declared, rather than guessing a destination.

3. The three ai/AITool:* baseline lines are deleted deliberately — the one case the ratchet sanctions in-PR. Those keys were authorable only as the element shape of agent.tools; with the parent tombstoned nothing reaches them, so they cannot vanish silently — the parent speaks first, with a prescription. Keeping AIToolSchema alive purely to hold three unreachable lines would be exactly the dead contract surface this issue is about.

Agent tests now pin the rejection and its message rather than the strip semantics they previously asserted.

Verification

pnpm --filter @objectstack/spec build ✅ (was the failure) · spec 262 files / 6823 tests · lint 37 / 540 · cli 72 / 761 · full workspace pnpm build · doc-authoring guard (213 files) · check:docs (250) · check:api-surface unchanged · check:skill-refs (9) · check:skill-examples (197) · eslint — all green.

Refs #3894 · #3820 · ADR-0104 · ADR-0064 · ADR-0087

🤖 Generated with Claude Code

https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4


Generated by Claude Code

#3894 follow-up)

#3894 removed `agent.tools` and `AIToolSchema` outright, which broke
`pnpm --filter @objectstack/spec build` on main: the authorable-surface
ratchet (ADR-0104 / #3733) fails when an authorable key disappears,
because none of these schemas is `.strict()` — Zod silently STRIPS an
unknown key, so an author who keeps writing `tools:` gets a clean parse
and an agent that reaches none of the tools they listed. That is the
silent-capability-loss shape #3820 exists to eliminate, restored one
layer down. The gate was right; my removal was wrong.

(It slipped CI because Build Core restored a turbo cache entry for the
spec build; the failure reproduces on any cold build of main.)

The removal stands — ADR-0064 needs the second, unscoped tool slot gone.
What changes is HOW it is removed:

- `agent.tools` is now `retiredKey()`, so authoring it throws with the
  fix in the message (use `skills`; a platform tool by name, or
  `action_<name>` for your own AI-exposed Action; `os migrate meta`).
  This supersedes #3894's "remains a silent no-op rather than a parse
  error" — loud is correct, and is what the ratchet requires.
- A D2 conversion `agent-tools-to-skills` + its D3 chain step, so the
  removal reaches spec-changes.json, the upgrade guide and the
  `spec_changes` MCP tool. Unlike the protocol-17 renames beside it this
  has NO lossless target: each entry must become a reference inside a
  skill, which is a human decision. So it drops the dead key (the runtime
  stopped reading it in cloud#910, so it already contributes nothing) and
  emits one notice per agent marking where capability must be
  re-declared.
- The three `ai/AITool:*` baseline lines are deleted deliberately — the
  one case the ratchet sanctions in-PR. They were authorable only as the
  element shape of `agent.tools`; with the parent tombstoned nothing
  reaches them, so they cannot vanish silently: the parent speaks first,
  with a prescription. Keeping a schema alive purely to hold three
  unreachable lines would be the dead contract surface this issue is
  about.

Agent tests now pin the rejection and its message rather than the strip
semantics they asserted before.

Verified: spec build OK, spec 6823 tests, lint 540, cli 761, full
workspace build, doc-authoring guard, check:docs, check:api-surface,
check:skill-refs, check:skill-examples (197), eslint — all green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4
@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 28, 2026 4:31pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ai tooling labels Jul 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

104 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review July 28, 2026 17:02
@os-zhuang
os-zhuang merged commit 11949fc into main Jul 28, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/ai-tools-retirement-tombstone branch July 28, 2026 17:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ai size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants