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 triggerscapability 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

vercelBot commented Jul 5, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 5, 2026 7:37am

Request Review

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

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

Labels

documentationImprovements or additions to documentationsize/mteststooling

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

@os-zhuang@claude