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

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

Request Review

@github-actionsgithub-actionsBot 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 mainJul 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:aiprotocol:uisize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude