chore(spec): flip webhook liveness ledger dead→live + webhook-materialization proof (#3490) - #3518
Merged
Merged
Conversation
…lization proof (#3490) Follow-up to #3489. The materializer bridge made stack-authored webhooks reach the dispatcher, so the webhook liveness ledger (packages/spec/liveness/webhook.json) was stale — it still classified all 16 authorable props `dead` from the pre-bridge "nothing materializes an authored webhook" vantage point. Because `webhook` rides the SPEC_ONLY_SCHEMAS gate path (walk-only), the liveness CI did NOT catch the dead→live drift; this updates it by hand. - Flip the props the materializer + dispatcher consume to `live` with evidence (materializer bootstrap-declared-webhooks.ts + dispatcher auto-enqueuer.ts): object/isActive/url/triggers/method/name/headers/secret/timeoutMs, plus display-only label/description. Drop the `url` authorWarn (authoring is live). - Keep `dead`: body/payloadFields/includeSession/retryPolicy/tags — folded into definition_json by the bridge but parseRow never reads them (no consumer, the #1878 delivery-layer worklist). `authentication` stays experimental. - Add a `webhook-materialization` ADR-0054 high-risk proof class (proof-registry.mts, bound to webhook.object) + its dogfood proof: bootStack with the messaging + webhook plugins but NO realtime, asserting the sys_webhook row materializes with object→object_name / isActive→active. Pins the #3461 integration seam (the bridge was first gated behind the realtime dispatch guard, silently materializing nothing). - Refresh the stale "enforce-or-remove pending #3461" prose in check-liveness.mts and webhook.json's _note (the disconnect is closed by #3489). Verified: liveness gate green (webhook 17 classified: live 11 / dead 5 / exp 1; webhook-materialization proof resolves) and red-proofed (breaking the proof tag → exit 1); the dogfood proof passes (logs confirm hasRealtime:false yet the row materializes). Liveness-ledger + gate assets and the private dogfood package only — no package release. 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 3 package(s): 111 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…ound class (#3490) The registry's BOUND_PROOF_PATHS expected-list and the real-proof-wiring `ledgerFor` map must be updated in lockstep when a bound high-risk class is added — add `webhook/object` and the `webhook` → webhook.json ledger path. The Test Core failure on the first push was exactly this lockstep assertion doing its job. (Validate Package Dependencies is red on OSV-Scanner audit hits for pre-existing transitive deps — next / react-router / sharp / tar / js-yaml / brace-expansion — none introduced here; that job is not a required check and is triggered only because this PR touches pnpm-lock.yaml to add the dogfood workspace deps.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-dead props (#3490) Second half of the Test Core lockstep the bound-class + ledger flip require. The bridge (#3489) made `url` live, so the CLI compile lint's per-webhook author warning must move OFF it onto the props that are STILL dead + misleading: retryPolicy/body/payloadFields/includeSession now carry `authorWarn` (folded into definition_json but never read — authored retry/body/field-projection/session do nothing). `tags` stays unmarked (benign display). `lint-liveness-properties.test.ts` asserts the new behavior: a webhook that authors only now-live props is silent, and the showcase-shaped webhook warns exactly once — on its inert `retryPolicy`, not on `url`. isActive test comment updated (it is live now, not "unmarked dead"). Verified: lint-liveness-properties.test.ts (17) + proof-registry.test.ts (23) green; liveness gate still green (webhook 17 classified, proofs resolve).
Resolve conflicts in webhook.json + lint-liveness-properties.test.ts against #3494 (feat(spec)!: prune still-dead aspirational config from Webhook), which deleted body/payloadFields/includeSession/retryPolicy/tags/authentication from WebhookSchema. With those gone and the #3489 bridge making the rest live, the webhook ledger is 11 props ALL live — no dead surface, so no authorWarn carrier — and the lint test asserts an authored webhook is silent (the old `url` carrier is now live). proof-registry (23) / lint (14) / liveness gate (webhook 11 live) / webhook-materialization dogfood proof all green post-merge.
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 #3490. Follow-up to #3489 (the materializer bridge).
Why
#3489 made stack-authored webhooks reach the dispatcher — but the webhook liveness ledger (
packages/spec/liveness/webhook.json) still classified all 16 authorable propsdead, from the pre-bridge "nothing materializes an authored webhook" vantage point. Becausewebhookrides the gate'sSPEC_ONLY_SCHEMASwalk-only path, the liveness CI did not catch the dead→live drift (it passed green on #3489 while the ledger silently went stale). This corrects it by hand.What changed
webhook.json— flip tolive(with evidence) the props the materializer + dispatcher actually consume:object/isActive/url/triggers/method/name/headers/secret/timeoutMs, plus display-onlylabel/description. Evidence cites the materializer (bootstrap-declared-webhooks.ts) and the dispatcher read points (auto-enqueuer.ts). TheurlauthorWarnis dropped (authoring is live now).dead:body/payloadFields/includeSession/retryPolicy/tags— folded intodefinition_jsonby the bridge butparseRownever reads them, so still no consumer (the [P0] Metadata property liveness audit: ~half of all spec properties are dead; a cluster of security props is parsed-but-unenforced #1878 delivery-layer enforce-or-remove worklist).authenticationstaysexperimental(HMAC-secret-only).webhook-materialization(proof-registry.mts,bound: true, bound towebhook.object) + its dogfood proofpackages/qa/dogfood/test/webhook-materialization.dogfood.test.ts. It boots the real stack with the messaging + webhook plugins but no realtime, and asserts thesys_webhookrow materializes withobject→object_name/isActive→active. This pins the [P2] Webhook: the specWebhookSchemaauthoring surface is disconnected from thesys_webhookdispatcher #3461 integration seam: the bridge was first gated behind the realtime dispatch guard, silently materializing nothing without realtime.check-liveness.mtsandwebhook.json's_note("enforce-or-remove pending [P2] Webhook: the specWebhookSchemaauthoring surface is disconnected from thesys_webhookdispatcher #3461" → closed by fix(webhooks): materialize stack-declared webhooks into the dispatcher (#3461) #3489).Verification
webhook 17 classified (live 11, dead 5, experimental 1);✓ all governed-type properties are classified; all bound high-risk proofs resolve.webhook/object → proof tag "@proof: webhook-materialization-BROKEN" not found→ exit 1.[webhook-auto-enqueuer] disabled … hasRealtime:falseyet thesys_webhookrow still materializes (materialization is engine-only, independent of the dispatch guard).Scope
Liveness-ledger + gate assets (
packages/spec/liveness+scripts/liveness, not in the published spec runtime) and the private@objectstack/dogfoodpackage only — empty changeset, no package release. Whether to foldwebhookback onto the metadata-type registry (out ofSPEC_ONLY_SCHEMAS) is noted in the ledger as a deferred reassessment (the Studio-CRUD + create-seeds cost the #3462 note flagged).🤖 Generated with Claude Code