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

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 2:21pm

Request Review

@github-actions github-actions Bot 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:system size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants