Skip to content

feat(spec,cli): one platform capability vocabulary — canonical kebab tokens, deprecated aliases, warn-first validation (#3265)#3281

Merged
os-zhuang merged 2 commits into
mainfrom
claude/optional-plugin-intent-driven-fh2azp
Jul 19, 2026
Merged

feat(spec,cli): one platform capability vocabulary — canonical kebab tokens, deprecated aliases, warn-first validation (#3265)#3281
os-zhuang merged 2 commits into
mainfrom
claude/optional-plugin-intent-driven-fh2azp

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

First implementation slice of #3265 (Phase 1 + the small Phase-2 core), following up on #3228/#1597. Companion cloud PR (token migration aiStudio/aiSeat → kebab) follows separately.

Problem

The standalone serve path (packages/cli/src/commands/serve.ts) and cloud's objectos-runtime capability loader resolve requires: [...] through parallel registries that had already diverged: framework ships ai-studio (kebab, consistent with pinyin-search / hierarchy-security) while cloud uses aiStudio (camelCase). Both sides silently ignore unknown tokens, so the same declaration means different things per runtime and the mismatch never surfaces (declared ≠ enforced across the repo boundary).

Change — spec becomes the single owner of the vocabulary

Canonical spelling: lower-case kebab-case (decision recorded on #3265).

  • packages/spec/src/kernel/platform-capabilities.ts (new):
    • PLATFORM_CAPABILITY_TOKENS — the one vocabulary across both runtimes (tier-gated + service tokens + enterprise/cloud-runtime tokens hierarchy-security, ai-seat, governance).
    • DEPRECATED_PLATFORM_CAPABILITY_ALIASESaiStudio → ai-studio, aiSeat → ai-seat; honored for one deprecation cycle, no new aliases.
    • canonicalizePlatformCapability / isKnownPlatformCapability helpers. Exported from @objectstack/spec root and /kernel subpath.
  • defineStack: rewrites deprecated aliases to canonical at authoring time (fix the producer, Prime Directive Add comprehensive test suite for Zod schema validation #12) with a deprecation warning, and warns on unknown tokens. Warn-first by design — both runtimes previously ignored unknown tokens silently, so a hard reject could brick working stacks; the warn is intended to become an error once the vocabulary proves complete. Non-strict mode stays untouched (it skips all validation by contract).
  • serve.ts: canonicalizes raw artifact requires through the same helper (covers artifacts compiled by an older spec), warns on declared-but-unknown tokens instead of silently ignoring them (closes the silent-typo hole the Make optional-plugin loading intent-driven: fail-fast on declared-but-missing, drop presence-based auto-enable #1597 fail-fast left: a token with no registry entry fell through if (!spec) continue), and lifts CAPABILITY_PROVIDERS / CAPABILITY_TO_TIER to statics (pure-data move) so a drift test can assert every registry key stays inside the spec vocabulary.
  • @objectstack/types: the missing-vs-crashed module classifier moves to a shared isModuleNotFoundError (the perf(build): OS_SKIP_DTS gating + fix optional AI plugin "Cannot find package" skip #1595 err.code-first fix); Serve.isModuleNotFoundError delegates. Cloud's objectos-runtime adopts the shared classifier at its next framework pin bump — one owner, no more re-introducing the perf(build): OS_SKIP_DTS gating + fix optional AI plugin "Cannot find package" skip #1595 false-alarm class.

Known vocabulary tokens without a local provider (hierarchy-security via the enterprise plugin in plugins[]; ai-seat/governance cloud-runtime-only) stay quiet in the serve resolver — only genuinely unknown tokens warn, so there are no false alarms for cross-runtime stacks.

Verification

  • spec: platform-capabilities.test.ts (13) + stack-requires.test.ts (5: alias rewrite + warn, canonical pass-through, unknown warn-not-throw, per-token dedupe, non-strict untouched) + existing stack.test.ts (89) — 102 passing
  • cli: new serve-capability-vocabulary.test.ts drift tests (5) + serve-optional-plugin-intent (14) + serve-defaults/serve-host-config/serve-log-level/serve-automation-summary40 passing
  • types: 25 passing · tsc -p packages/cli/tsconfig.build.json --noEmit exit 0 · eslint clean

🤖 Generated with Claude Code


Generated by Claude Code

…tokens, deprecated aliases, warn validation (#3265)

The standalone serve path and cloud's objectos-runtime resolve `requires`
tokens through parallel registries that had already diverged: framework
shipped `ai-studio` (kebab) while cloud used `aiStudio` (camel), and both
sides silently ignored unknown tokens, so the mismatch failed silently.

Make the spec the single owner of the vocabulary:

- spec/kernel/platform-capabilities: canonical PLATFORM_CAPABILITY_TOKENS
  (kebab-case; includes cloud-runtime tokens ai-seat/governance and
  hierarchy-security), DEPRECATED_PLATFORM_CAPABILITY_ALIASES
  (aiStudio -> ai-studio, aiSeat -> ai-seat, one deprecation cycle),
  canonicalizePlatformCapability, isKnownPlatformCapability.
- defineStack: rewrite deprecated aliases to canonical at authoring time
  (fix the producer, PD#12) and warn on unknown tokens. Warn-first by
  design - both runtimes previously ignored unknown tokens, so a hard
  reject could brick working stacks; intended to become an error once the
  vocabulary proves complete.
- serve.ts: canonicalize raw artifact `requires` through the same helper
  (covers artifacts compiled by an older spec), warn on declared-but-
  unknown tokens instead of silently ignoring them, and lift
  CAPABILITY_PROVIDERS / CAPABILITY_TO_TIER to statics with a drift test
  asserting every registry key stays inside the spec vocabulary.
- types: move the missing-vs-crashed module classifier to
  @objectstack/types isModuleNotFoundError (the #1595 err.code-first fix);
  Serve.isModuleNotFoundError delegates. Cloud's objectos-runtime adopts
  the shared classifier at its next framework pin bump.

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 Ready Ready Preview, Comment Jul 19, 2026 1:37pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cli, @objectstack/spec, @objectstack/types.

109 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 packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @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/cli, 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/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • 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/cli, @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/cli, @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/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, 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/authentication.mdx (via @objectstack/cli)
  • 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/cli, @objectstack/spec, @objectstack/types)
  • 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/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • 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/cli, @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.

…surface snapshot

check:api-surface guards the public API; the vocabulary exports (root + /kernel)
are intentional additions (0 breaking), so regenerate and commit the snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TjHfkKmEvgk8v7N8nTe5sH
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