v0.1.25.40 — webhook lifecycle emit post-review polish
v0.1.25.40 — webhook lifecycle emit post-review polish
Post-review correctness pass on v0.1.25.39 webhook lifecycle Events. No new spec surface, no wire-format changes — strictly better output for listEvents consumers.
Fixed
- B1 — Actor parity on single-op lifecycle emits.
createWebhookSubscription,updateWebhookSubscription, anddeleteWebhookSubscriptionnow populateActor.keyIdfromauthenticated_key_id, matching the bulk-action path. Audit consumers see consistent API-key attribution across all webhook lifecycle Events regardless of code path. - B2/B3 —
changed_fieldsis now a real diff.updateWebhookSubscriptionpreviously listed any field present in the PATCH body even when the value matched the subscription's current value. Each request-provided field is now compared against the prior snapshot; only genuine mutations land inchanged_fields. A full-identity PATCH (every field resent with existing value, no status flip) is a true no-op and emits nothing — aligns with spec v0.1.25.33 §6281.signing_secretkeeps presence-based detection (stored value is encrypted; not safely comparable to plaintext request value). - B4 — Correlation-id uniqueness. The
"no-req"literal fallback inwebhook_update:<sub_id>:<request_id>andwebhook_bulk_action:<action>:<request_id>is replaced withreq_<uuid>fallback. Guarantees uniqueness across concurrent requests ifRequestIdFilterever fails to populate the attribute.
Compatibility
Internal-only fixes. No EventType / schema / endpoint / wire-format changes. Pairs with cycles-server-events v0.1.25.11 dispatcher-side webhook.disabled emit (unchanged).