chore(spec,cli): enroll webhook in the liveness GOVERNED set (#3462)#3485
Merged
Conversation
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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
📓 Docs Drift CheckThis PR changes 2 package(s): 110 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
This was referenced Jul 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the final third of #3462 (umbrella #1878).
report+dashboardlanded in #3474; this enrollswebhook, which was deferred for two reasons — both handled here.Why webhook was hard (and how it's resolved)
1. Not a registered metadata type.
webhookis absent from the metadata-type registry, so the gate can't resolve it viagetMetadataTypeSchema. Registering it would switch on Studio webhook CRUD +saveMetaItemoverlay acceptance + diagnostics sweeping — the wrong move while the authoring surface is still disconnected. Instead the gate walks it via a smallSPEC_ONLY_SCHEMASoverride incheck-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 asys_webhookdispatcher row — the runtimeAutoEnqueuerreads only admin-authoredsys_webhookrows (auto-enqueuer.ts:175). Soliveness/webhook.jsonclassifies all 16 authorable propsdead+authenticationexperimental(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_webhookcolumn equivalent (object→object_name,isActive→active, with the name mismatches flagged), which aredefinition_json-only (headers/secret/timeoutMs), and which have no sink anywhere (body/payloadFields/includeSession/retryPolicy/tags). It also documents theobjectqlengine.ts:1183/1343dead-end that registerswebhooks: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' }toTYPE_COLLECTIONSinlint-liveness-properties.ts, soos compilenow advises thatwebhooks:is a silent no-op. The requiredurlprop carries the single warning per webhook (one heads-up per artifact, not one per dead prop);isActiveis left unmarked (default(true) boolean). The showcase'sTaskChangedWebhook— which authors aretryPolicythat never fires — is the canonical real-world example.Verification
webhookinGOVERNEDand no ledger:16 UNCLASSIFIED, exit 1. With the ledger:webhook 17 classified (dead 16, experimental 1),✓ all governed-type properties are classified.TYPE_COLLECTIONSwire, pass after; all run against the real shipped ledger.@objectstack/spec6857 tests pass (258 files);@objectstack/cli640 pass (61 files). Both packages build clean (CLItscwith declarations).Current statecount corrected 13→16 (it was stale after chore(spec): enroll report and dashboard in the liveness GOVERNED set (#3462) #3474) + webhook row +SPEC_ONLY_SCHEMASexemption 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