Skip to content

ADR-0088: metadata-kind admission test — retire trigger/router/function/service#2628

Merged
os-zhuang merged 3 commits into
mainfrom
claude/metadata-showcase-redesign-ougiov
Jul 5, 2026
Merged

ADR-0088: metadata-kind admission test — retire trigger/router/function/service#2628
os-zhuang merged 3 commits into
mainfrom
claude/metadata-showcase-redesign-ougiov

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Closes #2613.

Two commits:

  1. docs(adr) — ADR-0088. States the three-part admission test a metadata kind must pass (independent lifecycle · declarative governability · a real consumer — the kind-level analogue of ADR-0085 §2), retires the four placeholder kinds, and documents external_catalog as runtime-created by design.
  2. feat(spec,objectql,metadata-core)! — the retirement.
    • MetadataTypeSchema + DEFAULT_METADATA_TYPE_REGISTRY shrink 30 → 26, with tombstone comments pointing at the delivered forms: hook / record_change flows (trigger), plugin contributes.routes + declarative apis: (router), defineStack({ functions }) + contributes.functions (function), the plugin/service registry (service).
    • OPS_FILE_SUFFIX_REGEX drops *.trigger.ts / *.router.ts / *.function.ts / *.service.ts.
    • objectql: the dormant load path registering QL functions from type: 'function' metadata items is removed (nothing ever produced such items); function leaves the metadata-service sync list.
    • metadata-core lockstep enum follows.
    • Tests that used the retired kinds as deny-gate fixtures now lean on the remaining allowRuntimeCreate: false kind (agent, ADR-0063) and allowOrgOverride: false kinds (hook/validation/external_catalog); the registry-invariant test keeps asserts on the retired names as reintroduction guards.
    • Reference docs regenerated via gen:docs; ADR-0005/0010 whitelist prose updated; changeset added (minor: spec/objectql/metadata-core).
    • Showcase KIND_COVERAGE shrinks in lockstep (its registry-driven test enforces exact membership); external_catalog's waiver becomes a permanent, documented exclusion.

Why

The registry is the contract authors — human and AI — read to learn what can be authored. Four kinds had no authoring surface, no loader, no schema, and no (or a dead) consumer; every governance flag on their entries was already "no". Keeping them is the kind-level version of advertising undelivered capability (Prime Directive #10), and it actively misleads AI authors that enumerate the registry. Pre-launch is the cheapest moment to remove them (same posture as the earlier workflow/approval retirements, ADR-0019/0020).

Risk notes

  • Persisted sys_metadata rows are unaffected: audited — no production read path re-parses stored type values through the enum (the only enum parsers live in tests).
  • /api/v1/meta/types* is fully dynamic over the registry, so the API surface shrinks automatically; clients hardcoding the four retired kinds (none known in-repo) would observe the change.
  • The triggers capability token in requires: (FlowTrigger plugins) is a different namespace and is untouched.

Verification

All green locally: spec 6690 tests · objectql 773 · metadata-core 80 · metadata 260 · metadata-protocol 11 · full turbo build (70 tasks) · showcase verify (registry-driven coverage now expects exactly 26 kinds) · crm 19.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G6pPpRszk9cD3SxcKNFMWs


Generated by Claude Code

claude added 2 commits July 5, 2026 07:31
…uter/function/service

States the three-part admission test a kind must pass (independent
lifecycle, declarative governability, real consumer — the kind-level
analogue of ADR-0085 §2), retires the four placeholder kinds whose every
governance flag was already 'no', and documents external_catalog as
runtime-created by design. Closes the decision recorded in #2613.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6pPpRszk9cD3SxcKNFMWs
… per ADR-0088

- spec kernel: MetadataTypeSchema + DEFAULT_METADATA_TYPE_REGISTRY drop
  trigger/router/function/service (30 → 26 kinds) with tombstone comments
  pointing at the delivered forms (hook / record_change flows;
  contributes.routes + apis:; defineStack({functions}); the plugin
  registry). external_catalog annotated RUNTIME-CREATED (ADR-0062/0088).
- plugin-structure: OPS_FILE_SUFFIX_REGEX drops the four suffixes.
- objectql: remove the dormant 'function'-kind load path (nothing ever
  produced such items; defineStack({functions}) is the one way in) and
  drop 'function' from the metadata-service sync list.
- metadata-core: lockstep enum follows.
- Tests that leaned on the retired kinds as deny-gate fixtures now use
  the remaining allowRuntimeCreate:false kind (agent, ADR-0063) and
  allowOrgOverride:false kinds (hook/validation/external_catalog); the
  registry-invariant asserts keep the retired names as reintroduction
  guards.
- Reference docs regenerated (gen:docs); ADR-0005/0010 prose updated.
- showcase KIND_COVERAGE shrinks in lockstep; external_catalog waiver is
  now a permanent, documented exclusion.
- changeset: minor for spec/objectql/metadata-core.

Verified: spec 6690 tests, objectql 773, metadata-core 80,
metadata 260, metadata-protocol 11, full turbo build (70 tasks),
showcase verify, crm 19 — all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6pPpRszk9cD3SxcKNFMWs
@vercel

vercel Bot commented Jul 5, 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 5, 2026 7:37am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jul 5, 2026
@github-actions

github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/metadata-core, @objectstack/objectql, @objectstack/spec.

99 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 @objectstack/metadata-core, @objectstack/objectql, 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 packages/objectql, @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/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql)
  • 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/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/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql)
  • content/docs/permissions/authorization.mdx (via packages/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/profiles.mdx (via @objectstack/spec)
  • content/docs/permissions/roles.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/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/objectql)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/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/objectql, @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 packages/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/objectql, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/objectql, @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/setup-app.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.

…etired kinds

The Studio sidebar-group example listed metadata kinds retired by
ADR-0020 (workflow) and ADR-0088 (trigger); use flow + job instead.
Found via the docs-drift check on #2628.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G6pPpRszk9cD3SxcKNFMWs
@os-zhuang
os-zhuang marked this pull request as ready for review July 5, 2026 07:50
@os-zhuang
os-zhuang merged commit da807f7 into main Jul 5, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/metadata-showcase-redesign-ougiov branch July 5, 2026 07:51
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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Metadata kinds without a code-authoring surface: trigger, router, function, service, external_catalog

2 participants