Skip to content

feat(spec,lint): ADR-0109 revised + Phase 1 — skills-only default path, tool-name registry, advisory skill.tools lint (#3820 R7) - #3885

Merged
os-zhuang merged 1 commit into
mainfrom
claude/agent-metadata-positioning-th5hhm
Jul 28, 2026
Merged

feat(spec,lint): ADR-0109 revised + Phase 1 — skills-only default path, tool-name registry, advisory skill.tools lint (#3820 R7)#3885
os-zhuang merged 1 commit into
mainfrom
claude/agent-metadata-positioning-th5hhm

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Follow-up to #3871, per maintainer direction on the #3820 thread. Two things happen here: ADR-0109 is revised to the stronger conclusion that surfaced in review, and its Phase 1 ships — which unblocks and delivers the R7 skill.tools branch this issue was blocked on.

The revision

The first draft framed third-party tools as authored binding records (tool → action/flow). Review surfaced that the runtime already materialises a tool per declarative action (action_<name> — the family actions_executor subscribes to with action_*), so the binding the draft proposed already exists implicitly for every action. Revised decision:

The default third-party path needs no tool records at all. A skill's tools[] names either a platform-registered tool or a materialised action_<name> tool from the app's own actions. The executable, its authz, and its audit stay on the action/flow the app already ships — AI capability ≡ application capability. Tool records are demoted to an optional AI-presentation refinement layer (Phase 2: LLM-directed descriptions, parameter narrowing, flow exposure, execution policy — noting requiresConfirmation was just removed in #3876 as unenforced and returns only with enforcement).

"Third-party AI extension = write a skill" becomes the entire story: one concept to document and teach, and one less namespace an AI author can hallucinate into.

Phase 1 implementation

  1. PLATFORM_PROVIDED_TOOL_NAMES (@objectstack/spec/system, new platform-tool-names.ts) — curated registry of the 30 statically-named tools the cloud AI runtime registers (service-ai: 6, service-ai-studio: 24), plus PLATFORM_TOOL_FAMILY_PREFIXES (action_) and isPlatformProvidedToolName(). Exact mirror of the PLATFORM_PROVIDED_OBJECT_NAMES precedent; the owning packages live in the cloud repo, so — like CLOUD_PROVIDED_OBJECT_NAMES — the conformance half of the contract lives there (sibling cloud PR adds those tests). This repo pins the list's internal invariants (snake_case, no cross-package collisions, no static name inside a family namespace, sorted groups).

  2. validate-ai-tool-references (@objectstack/lint) — the R7 skill.tools branch: wildcard-aware resolution against stack.tools ∪ registry ∪ materialised action_<name> family (stack-level and object-level actions). Severity warning per the ADR-0078 advisory-first ratchet — a runtime plugin outside the registry is statically invisible, and the runtime deliberately tolerates unresolved names. Appended to REFERENCE_INTEGRITY_RULES, so validate/lint/compile all pick it up with no CLI changes.

    • Corpus check (per-branch FP floor, feat(lint): translation reference integrity + option-key validation (#3583) #3806): on the HotCRM corpus the rule yields exactly the 10 fictional references and 0 false positives on the 6 that resolve via the registry — the 37.5% FP rate that blocked the original R7 spec is gone by construction.
    • A dedicated near-miss suggestion catches naming the raw action where the materialised tool is meant (triage_caseaction_triage_case) — the mistake edit distance can't reach (the prefix alone is 7 edits).
  3. composeStacks no longer drops tools — the slot joins CONCAT_ARRAY_FIELDS, so a declared record at least survives composition.

  4. stack.tools and the AI-slot prose now teach the ADR-0109 model.

Verification

  • @objectstack/spec: 263 files / 6841 tests pass; tsc --noEmit clean; api-surface regenerated (new public exports); check:docs / check:skill-refs / check:react-blocks all in sync.
  • @objectstack/lint: 36 files / 530 tests pass (7 new rule tests + suite wiring updates).
  • @objectstack/cli: 72 files / 739 tests pass (all three commands pick up the rule through the suite).
  • Full workspace pnpm build green.

Out of scope

  • Phase 2 (ToolSchema binding, flow exposure, boot-mirror provenance guard, metadata-type flag revisit, warning→error ratchet) — gated on ADR acceptance.
  • Cloud registry conformance tests — sibling PR in cloud (feature-detects the new spec export; activates fully when .objectstack-sha advances past this change).
  • HotCRM's 10 fictional tool references now surface as advisory warnings; implementing or removing them is a product decision for that repo.

Refs #3820 · #3871 · ADR-0109 · ADR-0078 · ADR-0063 · ADR-0064

🤖 Generated with Claude Code

https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4


Generated by Claude Code

…h, tool-name registry, advisory skill.tools lint (#3820 R7)
ADR-0109 revision: the first draft framed third-party tools as authored
binding records; review surfaced the stronger conclusion — the runtime
already materialises a tool per declarative action (action_<name>), so the
DEFAULT third-party path needs no tool records at all. Skills are the only
required authoring artifact; tool records are demoted to an optional
AI-presentation refinement layer (Phase 2, gated on acceptance and a real
refinement need). AI capability ≡ application capability: same executable,
same authz, same audit.
Phase 1, implemented here:
- spec: PLATFORM_PROVIDED_TOOL_NAMES / PLATFORM_TOOL_FAMILY_PREFIXES /
isPlatformProvidedToolName in system/constants/platform-tool-names.ts —
the PLATFORM_PROVIDED_OBJECT_NAMES precedent applied to tools. Owning
packages live in the cloud repo, so (like CLOUD_PROVIDED_OBJECT_NAMES)
the conformance half of the contract lives there; this repo pins the
list's internal invariants.
- lint: validate-ai-tool-references — the #3820 R7 skill.tools branch,
wildcard-aware, resolving against stack.tools ∪ registry ∪ materialised
action_<name> family. Warning severity (ADR-0078 advisory-first): runtime
plugins outside the registry are statically invisible. Appended to
REFERENCE_INTEGRITY_RULES → validate/lint/compile pick it up. Exactly 10
findings / 0 false positives on the HotCRM corpus; a dedicated near-miss
suggestion catches the raw-action-name-instead-of-action_<name> mistake
edit distance cannot.
- spec: 'tools' joins composeStacks' CONCAT_ARRAY_FIELDS (declared records
survive composition) and the stack.tools / AI-slot docs teach the
ADR-0109 model.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4
@vercel

vercelBot commented Jul 28, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 28, 2026 2:21pm

Request Review

@github-actionsgithub-actionsBot added size/l documentation Improvements or additions to documentation protocol:system tests tooling labels Jul 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/lint, @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 @objectstack/lint, 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/lint, @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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:systemsize/lteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude