Skip to content

feat(spec): reject unknown requires capability tokens at authoring (#3265)#3302

Merged
os-zhuang merged 1 commit into
mainfrom
claude/reject-unknown-capability-3265
Jul 19, 2026
Merged

feat(spec): reject unknown requires capability tokens at authoring (#3265)#3302
os-zhuang merged 1 commit into
mainfrom
claude/reject-unknown-capability-3265

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

The terminal state of the framework#3265 vocabulary work (Prime Directive #12). The warn-first phase (#3281) becomes a hard reject in defineStack.

What

  • Split canonicalizeStackRequires (alias rewrite + deprecation warn only) from a new internal validateKnownCapabilities that returns one error per distinct unknown token; defineStack throws on any, consistent with its existing validators (namespace-prefix, cross-ref, hierarchy-scope).
  • Deprecated aliases (aiStudio/aiSeat) still canonicalize with a warning — they're valid, just deprecated; only genuinely unknown tokens (typos / stale references no runtime provides) throw.
  • The serve resolver keeps warning (not throwing) on an unknown token in a raw artifact — authoring is the gate (PD#12); a pre-built or older-spec artifact must not crash-boot a running server over a no-op token.

Closes the "declared ≠ enforced" gap for capability tokens: a typo like requires: ['automations'] used to be silently ignored by every runtime; now it fails loudly at defineStack time.

Completeness audit (the precondition for flipping)

I enumerated every requires / defaultRequires / dynamic token source across both repos before flipping:

So no real app build in either repo breaks.

⚠️ Tradeoff to weigh before merge (grace period)

The warn added in #3281 has not shipped in a released spec yet. Merging this makes the transition, for any consumer, go straight from silent no-ophard defineStack error, with no warn-only release in between. In-repo this is safe (audited above), and unknown tokens are no-ops today so no real functionality breaks — only a build surfaces a latent typo. But a downstream/customer stack that happens to carry a stale no-op token would start failing its build on upgrade.

If you'd rather preserve the usual deprecation cadence, hold this until #3281's warn has shipped one release; otherwise it's ready. (Consistent with defineStack's other hard validators, I did not add an env escape hatch — Prime Directive #2 keeps env/business logic out of packages/spec.)

Verification

  • platform-capabilities.test.ts + updated stack-requires.test.ts (unknown → throws + names every distinct unknown; alias still canonicalizes+passes; non-strict skips) + stack.test.ts104 passing
  • tsc --noEmit on spec exit 0 · eslint clean · no new public exports (api-surface snapshot unaffected)

🤖 Generated with Claude Code


Generated by Claude Code

…3265)

The warn-first phase (framework#3281) is over: the platform capability
vocabulary is now the proven-complete union of every token the framework CLI
and cloud's objectos-runtime resolve (audited across both repos — the only
out-of-vocabulary token in either is a test fixture). So defineStack now
REJECTS an unknown `requires` token instead of warning:

- Split canonicalizeStackRequires (alias rewrite + deprecation warn only) from
  a new validateKnownCapabilities that returns one error per distinct unknown
  token; defineStack throws on any, consistent with its other validators.
- Deprecated aliases (aiStudio/aiSeat) still canonicalize with a warning — they
  are valid, just deprecated; only genuinely unknown tokens (typos / stale
  references no runtime provides) throw.
- The serve resolver keeps WARNING (not throwing) on an unknown token in a raw
  artifact: authoring is the gate (Prime Directive #12), and a pre-built or
  older-spec artifact must not crash-boot a running server over a no-op token.

Closes the "declared ≠ enforced" gap for capability tokens: a typo used to be
silently ignored by every runtime; now it fails loudly at build time.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TjHfkKmEvgk8v7N8nTe5sH
@vercel

vercel Bot commented Jul 19, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Building Building Preview, Comment Jul 19, 2026 4:50pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

103 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 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/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.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/validating-metadata.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/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/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.

@os-zhuang os-zhuang added the allow-major label Jul 19, 2026 — with Claude
@os-zhuang os-zhuang assigned os-zhuang and unassigned os-zhuang Jul 19, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 19, 2026 17:06
@os-zhuang
os-zhuang merged commit b7eb869 into main Jul 19, 2026
18 of 20 checks passed
@os-zhuang
os-zhuang deleted the claude/reject-unknown-capability-3265 branch July 19, 2026 17:07
os-zhuang added a commit that referenced this pull request Jul 20, 2026
) (#3329)

The one-cycle deprecation window from #3265 is over and a major release is being prepared, so the legacy camelCase `requires` aliases are dropped. `aiStudio`/`aiSeat` are no longer canonicalized to `ai-studio`/`ai-seat` — they now reject as unknown tokens in defineStack (the #3302 end-state).

- spec: remove DEPRECATED_PLATFORM_CAPABILITY_ALIASES + canonicalizePlatformCapability; isKnownPlatformCapability no longer canonicalizes; defineStack drops canonicalizeStackRequires.
- cli: serve resolver no longer canonicalizes raw-artifact requires.
- Regenerate api-surface.json (4 export deletions); sync ADR-0087 spec-changes.json + protocol-upgrade-guide.md (pre-existing v16 drift surfaced by the path-filtered check).

Breaking change shipped as minor per the launch-window convention. Cloud objectos-runtime (pinned to an older framework) follows on its next .framework-sha bump.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants