Skip to content

chore(spec,cli): enroll webhook in the liveness GOVERNED set (#3462)#3485

Merged
os-zhuang merged 1 commit into
mainfrom
chore/spec-webhook-liveness-3462
Jul 25, 2026
Merged

chore(spec,cli): enroll webhook in the liveness GOVERNED set (#3462)#3485
os-zhuang merged 1 commit into
mainfrom
chore/spec-webhook-liveness-3462

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes the final third of #3462 (umbrella #1878). report + dashboard landed in #3474; this enrolls webhook, which was deferred for two reasons — both handled here.

Why webhook was hard (and how it's resolved)

1. Not a registered metadata type. webhook is absent from the metadata-type registry, so the gate can't resolve it via getMetadataTypeSchema. Registering it would switch on Studio webhook CRUD + saveMetaItem overlay acceptance + diagnostics sweeping — the wrong move while the authoring surface is still disconnected. Instead the gate walks it via a small SPEC_ONLY_SCHEMAS override in check-liveness.mts (consulted before the registry). Zero runtime blast radius — the accommodation is isolated to the gate script.

2. The whole authoring surface is dead (#3461, re-confirmed at HEAD). Nothing materializes an authored webhooks: entry (stack / connector) into a sys_webhook dispatcher row — the runtime AutoEnqueuer reads only admin-authored sys_webhook rows (auto-enqueuer.ts:175). So liveness/webhook.json classifies all 16 authorable props dead + authentication experimental (HMAC-secret-only, its existing marker).

What's in the ledger

Per-prop notes double as the future materializer's mapping table (#3461 option A): which props have a sys_webhook column equivalent (objectobject_name, isActiveactive, with the name mismatches flagged), which are definition_json-only (headers/secret/timeoutMs), and which have no sink anywhere (body/payloadFields/includeSession/retryPolicy/tags). It also documents the objectql engine.ts:1183/1343 dead-end that registers webhooks: as inert in-memory metadata items nothing reads back — the trap that makes the surface look connected.

Author-warning wired (@objectstack/cli)

Added { type: 'webhook', key: 'webhooks' } to TYPE_COLLECTIONS in lint-liveness-properties.ts, so os compile now advises that webhooks: is a silent no-op. The required url prop carries the single warning per webhook (one heads-up per artifact, not one per dead prop); isActive is left unmarked (default(true) boolean). The showcase's TaskChangedWebhook — which authors a retryPolicy that never fires — is the canonical real-world example.

Verification

  • Gate red→green. With webhook in GOVERNED and no ledger: 16 UNCLASSIFIED, exit 1. With the ledger: webhook 17 classified (dead 16, experimental 1), ✓ all governed-type properties are classified.
  • Lint contract test red→green. 3 new positive tests fail before the TYPE_COLLECTIONS wire, pass after; all run against the real shipped ledger.
  • @objectstack/spec 6857 tests pass (258 files); @objectstack/cli 640 pass (61 files). Both packages build clean (CLI tsc with declarations).
  • README Current state count corrected 13→16 (it was stale after chore(spec): enroll report and dashboard in the liveness GOVERNED set (#3462) #3474) + webhook row + SPEC_ONLY_SCHEMAS exemption note.

Scope

Enrollment only — this does not decide #3461's build-the-bridge vs retire-the-surface question. When that lands, the mapped props flip to live (cite the materializer) or the ledger is removed with the schema. No spec shape/behavior change (ledger + gate/lint config only).

Refs #3461, #1891, #1878, #3197.

🤖 Generated with Claude Code

Closes the final third of #3462 (umbrella #1878). report/dashboard landed in
#3474; webhook was deferred for two reasons, both handled here.

- Not a registered metadata type: webhook is absent from the metadata-type
  registry, so the gate can't resolve it via getMetadataTypeSchema. Registering
  it would switch on Studio webhook CRUD + saveMetaItem overlay acceptance +
  diagnostics sweeping — wrong while the authoring surface is still disconnected.
  Instead the gate walks it via a small SPEC_ONLY_SCHEMAS override in
  check-liveness.mts (consulted before the registry). Zero runtime blast radius.

- The whole authoring surface is dead (#3461, confirmed at HEAD): nothing
  materializes an authored webhooks: entry (stack/connector) into a sys_webhook
  dispatcher row; the runtime reads only admin-authored sys_webhook rows. So
  liveness/webhook.json classifies all 16 authorable props dead + authentication
  experimental (HMAC-secret-only, its existing marker). Per-prop notes record the
  sys_webhook column map as the future materializer's mapping table (#3461 A) and
  flag the object->object_name / isActive->active mismatches. Also documents the
  objectql engine.ts:1183/1343 dead-end that registers webhooks: as inert
  metadata items nothing reads back — the trap that makes this look connected.

- Author-warning wired (@objectstack/cli): added { type: 'webhook', key:
  'webhooks' } to TYPE_COLLECTIONS so os compile now advises that webhooks: is a
  silent no-op. The required url prop carries the single warning per webhook
  (one heads-up per artifact, not one per dead prop); isActive left unmarked
  (default(true) boolean). The showcase's TaskChangedWebhook is the live example.

Enrollment only — does not decide #3461's build-the-bridge vs retire-the-surface
question. Gate green (webhook 17 classified: dead 16, experimental 1); lint
contract test red->green; spec 6857 + cli 640 tests pass. No spec shape/behavior
change (ledger + gate/lint config only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 25, 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 25, 2026 2:54am

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

110 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/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • 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/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)
  • 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/v16.mdx (via @objectstack/cli, @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.

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.

1 participant