Skip to content

feat(lint,spec): AI surface-affinity rule, ADR-0063 doc completion, ADR-0109 draft (#3820) - #3871

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

feat(lint,spec): AI surface-affinity rule, ADR-0063 doc completion, ADR-0109 draft (#3820)#3871
os-zhuang merged 3 commits into
mainfrom
claude/agent-metadata-positioning-th5hhm

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Positioning work ahead of R7, per the disposition in #3820 (assessment comment): the agent authoring surface is closed per ADR-0063, and the tool namespace has no fact registry yet (D0), so the buildable AI rule today is the one that checks a statically provable, runtime-fatal contradiction — skill ↔ agent surface affinity (ADR-0064 §3).

What's in here

1. validate-ai-surface-affinity (new lint rule)

An agent binds a surface (ask/build, ADR-0063 §1); a skill declares affinity (ask/build/both, §3). The runtime throws on an incompatible binding (resolveActiveSkills, cloud agent-runtime.ts) — chat-time 500 after parse, validate, and deploy all passed. Both sides of the check are declared in the same stack, so the rule has zero false positives by construction; both sides default 'ask' when surface is absent, mirroring the runtime, so it is safe on the raw-config lint path too.

2. Spec docs: finish what ADR-0063 already decided

The AI-slot prose in stack.zod.ts still described the withdrawn ADR-0040 model ("Persona-bearing copilots (1-3 per app)… the active app's defaultAgent is selected automatically"), and app.defaultAgent's example was literally the withdrawn tenant-agent pattern (defaultAgent: 'sales_copilot'). Rewritten to the ADR-0063 reality:

  • stack.agents — marked platform-internal (§2): kernel ships exactly two agents; third parties author skills.
  • stack.tools — marked declaration-only pending lint: no reference-integrity for AI metadata (agent skills, skill tools) — R7, blocked on D1/D2 #3820 D0: no handler binding, no runtime reader; the executable tool set is runtime-registered.
  • app.defaultAgent — re-documented as a surface-binding knob ('ask' implicit default / 'build' for authoring surfaces), not a custom-agent slot; app.form.ts helpText matched.
  • SkillSchema — documents that per-skill permissions deliberately does not exist (ADR-0049): HotCRM authored one and Zod silently stripped it; the doc now tells authors (human and AI) where access is actually gated.

3. ADR-0109 (Proposed) — the #3820 D0 decision

Third-party tools are bindings to executable primitives the platform already has (actions/flows), never free-floating executables; kernel tool names become facts via a conformance-tested PLATFORM_PROVIDED_TOOL_NAMES registry (the #3657 precedent). This is what unblocks the R7 skill.tools branch with a resolvable universe instead of a 37.5% false-positive rate on its own motivating corpus.

Out of scope (per issue thread)

  • Knowledge half (D1) — deferred entirely, not a current priority.
  • R7 skill.tools resolution — blocked on ADR-0109 acceptance.
  • Cloud runtime holes (loadAgent/resolveDefaultAgent platform filtering) — sibling PR in cloud.

Verification

  • @objectstack/lint: 35 files / 507 tests pass (8 new).
  • @objectstack/spec: 259 files / 6745 tests pass.
  • @objectstack/cli: 72 files / 734 tests pass (suite wiring picks the rule up on all three commands).
  • Full workspace pnpm build: 71/71.

Refs #3820 · ADR-0063 · ADR-0064 · ADR-0078 · ADR-0049

🤖 Generated with Claude Code

https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4


Generated by Claude Code

…DR-0109 draft (#3820)

Positioning work ahead of R7 (issue #3820): the agent authoring surface is
closed per ADR-0063, so the buildable AI rule is the one that checks a
statically provable, runtime-fatal contradiction — skill ↔ agent surface
affinity (ADR-0064 §3) — not agent.skills resolution.

- lint: new `validate-ai-surface-affinity` rule + tests, appended to
  REFERENCE_INTEGRITY_RULES so `validate`/`lint`/`compile` all pick it up.
  Error severity: the runtime throws on this binding at chat time. Unresolved
  skill names are deliberately out of scope (kernel skills are
  runtime-registered; #3820 D0/D2). False-positive floor read per branch
  (#3806): clean on the HotCRM-shaped corpus, `examples/` proves nothing here.
- spec: stack.zod.ts AI-slot prose no longer describes the withdrawn
  ADR-0040 model — agents marked platform-internal (ADR-0063 §2), tools
  marked declaration-only pending #3820 D0, skills named as THE extension
  primitive. app.defaultAgent re-documented as a surface-binding knob (its
  example was the withdrawn tenant-agent pattern). SkillSchema documents that
  per-skill `permissions` deliberately does not exist (ADR-0049) — the field
  HotCRM authored and Zod silently stripped.
- docs: ADR-0109 (Proposed) — the #3820 D0 decision: third-party tools are
  bindings to actions/flows; platform tool names become a conformance-tested
  registry; unblocks the R7 skill.tools branch.

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 1:49pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ui protocol:ai 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.

Check Changeset and the generated-docs gate in TypeScript Type Check both
flagged the previous commit: add the missing changeset (@objectstack/lint
minor, @objectstack/spec patch) and the regenerated
content/docs/references/ui/app.mdx row for the re-documented
`app.defaultAgent`.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4
…rfaceAffinity to the suite

Both branches appended a rule to REFERENCE_INTEGRITY_RULES; resolution
keeps main's validateFlowTemplatePaths (#3810) first and this branch's
validateAiSurfaceAffinity last, with the suite test's fixture and
report-order assertions carrying both.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHjroNkLkajskKbJaidko4
@os-zhuang
os-zhuang merged commit 33f5e23 into main Jul 28, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/agent-metadata-positioning-th5hhm branch July 28, 2026 14:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants