Uh oh!
There was an error while loading. Please reload this page.
docs(ai): mark the retired agent.tools key as removed in agents.mdx - #10732
Conversation
The field table and the callout under it still taught `agent.tools` as a live authoring field, while `packages/spec/src/ai/agent.zod.ts` carries it as a `retiredKey()` tombstone — typed `never`, rejected at parse. The page already stated the correct ADR-0064 rule in its own prose, so it contradicted itself. Replace the row with the retirement and its prescription, and rewrite the callout to state the ADR-0064 invariant and why the key is gone: the runtime resolved the reference against the full registry with no surface check. Not a rename — no migration command is offered, because there is no key the value moves to. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
PM review — verified against the diff and the spec source, not the report. Approving. ⏳ Arming deferred: GraphQL is exhausted (0/5000, resets ~10:13Z) and the draft flip needs it. Core REST is fine, which is why this lands now. ⛔ Not reaching for
|
Uh oh!
There was an error while loading. Please reload this page.
Closes#10355
content/docs/ai/agents.mdxtaughtagent.toolsas a live authoring field in two places, whilepackages/spec/src/ai/agent.zod.tscarries it as aretiredKey()tombstone —z.never(), so the key types asnever(it failstscat the authoring site) and any value that reaches the runtime is rejected at parse with the prescription. The page already stated the correct ADR-0064 rule in its own prose at line 118 ("an agent's tool set is the union of its surface-compatible skills' tools — there is no global fall-through"), so it contradicted itself: correct rule in the prose, retired key in the table.Site 1 — the "The shape of an agent" field-table row
Before
After
Site 2 — the callout beneath that table
Before
After
The callout kept its
type="info"shape but becametype="warn"— it now carries a retirement, andwarnis the dominant spelling in this corpus (222 uses vs. 5 ofwarning). The old callout's true half ("you do not define ad-hoc tool names with inline parameter schemas here") is preserved and strengthened: an agent has no tool slot at all.Deliberately no migration command
The sibling
knowledgerow on the same table closes with "os migrate meta --from 16rewrites it", because that removal was a rename. This one is not, and the tombstone says so in its own words:So the replacement text offers no codemod and implies no mechanical rewrite. It states the by-hand prescription and why the old shape is gone — the removal closed a real capability leak (
agent.tools[].nameresolved against the full registry with no surface check), so a neutral "this moved" would have been the wrong register.Scope — agent sense only
Only the agent-level key is retired. Every
toolsin the skill sense is correct and is untouched: thedefineSkillexample'stools: ['get_record', ...], and the| **Wiring** | \tools`, `surface`, `triggerConditions` |` row in the skill-halves table. The diff is 2 hunks in 1 file.Verification — 14 gate families green at
888aebf682Gate set derived with
node scripts/pm/dispatch-gates.mjs(no paths — it takes its own change set from the merge base), which matched 13 families forcontent/docs/**, pluscheck:nul-bytesfor the edit itself. Run at the final commit with a clean tree; each exit code captured before any pipe. Their own verdict lines:check:doc-anchors— "272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading"check:role-word— "OK, no new occurrences of the reserved word" (this file's baseline is 5; it was 5 before and 5 after)check:doc-authoring— "389 files clean — no bare metadata literals"check:docs-audit-scope— "scope is in sync with content/docs/: 189 hand-written doc(s)"check:docs-redirects— self-test 48 assertions, greencheck:doc-formula-expressions— "22 record-scoped formula example(s) across 416 files / 1443 TS blocks judged clean"check:published-readme-links— "152 outbound link(s) ... 12 docs-site page(s) resolved (0 via redirect), 1 anchor(s) verified"check:nul-bytes,check:cross-package-test-inputs(both spellings),check:empty-state,check:liveness,check:strictness-ledger,check:variant-docs— all greencheck:skill-examplesdoes not apply: this edit touches no fenced code block. The nearest{/* os:check */}fence (the Sales Assistant example) is below both hunks and unmodified.No changeset
Docs-only — this publishes nothing, so no
.changeset/*.md. Theskip-changesetlabel is applied.Out-of-scope findings — filed, not touched here
Both came out of the card's own rider to sanity-check the remaining field-table rows against
AgentSchema. Neither is assigned and neither carriespm:queue.ai/agents.mdxdocuments the retiredagent.knowledgekey as live RAG access #10730 — theknowledgerow on this same table documents a fully retired key as live RAG access (agent.knowledgeisretiredKeyperPOST /data/sharing/rules绕过SharingRuleSchema:criteria缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896), noting only that a nested alias was removed.AgentSchema's own@exampleteaches the retiredagent.knowledgekey, and thetoolstombstone cites a stale.strict()rationale #10731 — inpackages/spec/src/ai/agent.zod.ts,AgentSchema's own@examplewritesknowledge: { sources, indexes }, a key the same object tombstones ~110 lines below; and thetoolstombstone's rationale still cites "AgentSchemais not.strict()" though the schema is now built withstrictObject.One judgement call to flag: the
knowledgerow sits directly under the row this PR rewrites and is stale in exactly the same way, so it met the bar for a bounded in-place repair. It was filed instead, because the card and its triage both said to report drift on the remaining rows rather than widen, and because that retirement carries its own distinct prescription (#3896) that deserves its own triage.Generated by Claude Code