docs(spec): the agent.tools rejection now says why ADR-0064 binds, so its Proposed status does not read as not-yet-in-force - #17699
Conversation
…s here
The author-facing tombstone for `agent.tools` cites ADR-0064 for the
invariant it rests on. That record's own header reads `Status: Proposed`
and carries a cloud-owned callout marking it superseded in part, so an
author who follows the citation cannot tell from the record itself that
the rule still binds them.
ADR-0064 remains the correct authority: it is the record that states the
invariant ("an agent's tool set is the union of its surface-compatible
skills' tools"), and ADR-0109 never names `agent.tools` at all. So this
adds one clarifying clause rather than retargeting the citation: the
`Proposed` / cloud-owned status scopes the runtime half that lives in
cloud `service-ai`, while the authoring half is in force here and
ADR-0109 (Accepted — implemented) is the in-repo record carrying it.
Prose only — no behaviour, no schema, no accept-set change. The
generated reference page is rebuilt from the same source.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH
The edited source file ships from a released package — `@objectstack/spec` lists both `dist` and `src/**/*.zod.ts` in its `files[]`, and the new clause was measured into 18 `dist` artefacts and the shipped `agent.zod.ts` — so the prose change is user-visible and graded `patch`. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 135 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 89e151c1f7465c5ffaf2d25c1d9658d58572e0a6 && git checkout 89e151c1f7465c5ffaf2d25c1d9658d58572e0a6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 88a933088e93067b4df4b20380ab9a1ceed2ed17 1a55b9dc0bc17f2392c9127dcfc110c21b1b6677 && git checkout -B drift-repro 88a933088e93067b4df4b20380ab9a1ceed2ed17 && git merge --no-ff 1a55b9dc0bc17f2392c9127dcfc110c21b1b6677
node scripts/docs-audit/affected-docs.mjs --json 88a933088e93067b4df4b20380ab9a1ceed2ed17
|
Part of #16927
What this is
The author-facing tombstone for the retired
agent.toolskey rests the rule on ADR-0064. An author who follows that citation lands on a record whose own header reads**Status**: Proposed (2026-06-22)and carries a🔶 Cloud-owned — superseded in part by cloud ADR-0025 (2026-06-25)callout. Nothing on the record tells them the rule still binds — the metadata invites the weaker reading.⛔ Nothing here re-opens the retirement.
agent.toolsstays retired, the rejection stays correct, the accept set is untouched.The card's route 1 is falsified — the citation is NOT retargeted
The card offered "retarget the author-facing citations to ADR-0109". Reading all three records on
origin/main@88a933088esays no:**Status**: Proposed (2026-06-22) — cloud-owned (2026-07-16 audit): the only framework dependency (\skill.surface`) exists; the tool-resolution scoping, global fall-through removal, and bind-time affinity error live in cloud `service-ai` and are not verifiable in this repo.`**Status**: **Accepted — implemented (Phase 1)** (2026-07-28; revised same day before acceptance — see Revision note).**Status**: Accepted (2026-07-27; implemented 2026-08-08 — #3682)The deciding measurement: ADR-0109 names
agent.toolszero times (grep -c 'agent\.tools' docs/adr/0109-…→0; lit control: the same grep overdocs/adr/0064-…→1). ADR-0109's own**Builds on**line attributes the invariant back to ADR-0064 — "(an agent's tools are its skills' tools)" — and ADR-0064's title is that invariant, with Decision §1 statingtools(agent) = ⋃ { skill.tools | skill ∈ agent.skills ∧ skill.surface ∈ {agent.surface, 'both'} }.⇒ Retargeting would send an author to a record that does not contain the rule they broke. This matches the triage ruling on the card, which reached the same conclusion independently.
What actually changed
One clarifying clause in the tombstone, splitting the two halves the status line conflates: the
Proposed/ cloud-owned marking scopes the runtime half (tool resolution, which lives in cloudservice-ai), while the authoring half is in force in this repo, and ADR-0109 (Accepted — implemented) is the in-repo record carrying it.The standardised
os migrate meta --from 16sentence remains the closing sentence of the prescription, per the maintainer ruling inshared/retired-key.ts.content/docs/references/ai/agent.mdxisAUTO-GENERATEDfrom that same source and was regenerated withpnpm --filter @objectstack/spec gen:docs;check:generatedandcheck:docsare green.Scope held
⛔ No behaviour, no schema, no guidance mechanism, no accept set. ⛔
content/docs/releases/untouched (measured: the message text appears there 0 times; lit controlagent.tools→ 6 hits). ⛔ No repeater/row-schema file touched.ADR-0064's own record was deliberately NOT edited. A clarifying note on the record itself would reach all 32 citing files at once, but
docs/adr/**is a governed surface (PD #14) and the record is cloud-owned. Triage placed the landing face inpackages/spec; the maintainer may prefer the record-side note instead, and that option is left open rather than taken.Census — citations of ADR-0064
Tracked files only (
git grep, no builtdist/in tree — verifiedgit ls-files | grep -cE '(^|/)dist/'→ 0):git grep -oIE 'ADR-0064|0064-tool-scoping-to-agent').9a89a0040dand scoped to three directories only.conversions/registry.ts, and threeos explaincatalog rows inpackages/cli. Only the tombstone is changed here; the other two are noted, not filed.content/docs/releases/v17.mdx:719is nowcontent/docs/releases/v17/17-0.mdx.Verification
pnpm --filter @objectstack/spec test→VERDICT command-exit 0, 473 files / 13432 tests passed.pnpm --filter @objectstack/spec typecheck→VERDICT command-exit 0.pnpm --filter @objectstack/spec build→VERDICT command-exit 0.Gate families derived mechanically (
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, not a hand-written list) and reconciled with--rancarrying each recorded exit code, all at1a55b9dc0b:Four families first refused their prerequisite and were converted to real readings after building the
@objectstack/lint,@objectstack/formulaand@objectstack/client-reactclosures (check:doc-formula-expressions,check:doc-security-posture,check:docs-transcript-drift,check:skill-examples— all then exit 0). The remaining two,check:dual-build-cjs-loadsandcheck:lean-entry-closure, need a repo-wide build of 79+ packages and stay NOT MEASURED — a self-declaredPREREQUISITE NOT MET, neither a pass nor a finding. CI runs them.Notably green and directly load-bearing here:
check:generated,check:docs(the regenerated page is in sync) andcheck:authorable-surface(the accept set did not move).Dependency closure (①) is empty:
@objectstack/specdeclares noworkspace:dependencies.Changeset
skip-changesetwould be wrong here, measured rather than assumed.@objectstack/specis published and itsfiles[]ships bothdistandsrc/**/*.zod.ts— the edited file itself. Afterpnpm --filter @objectstack/spec build, the new clause was found in 18distfiles, 6json-schemafiles and the shippedsrc/ai/agent.zod.ts(positive control, a pre-existing sentence from the same message: 38 / 130 / 1). Published bytes move, so the change is gradedpatchin.changeset/16927-agent-tools-retirement-citation.md.Generated by Claude Code