Operator surface
Knocker’s operator actions are durable SQLite operations exposed through the language bindings. It is not a built-in HTTP control plane.
For production recovery recipes, see the Operator runbook.
Common Operations
Section titled “Common Operations”events = webhooks.list_events(endpoint="stripe", limit=50)invalid = webhooks.list_deliveries( endpoint="stripe", signature_valid=False, orphaned=True, since=1700000000, limit=50,)
event = webhooks.get_event(42)delivery = webhooks.get_delivery(99)
webhooks.ignore(event.id)webhooks.replay(event.id)webhooks.requeue(event.id)webhooks.replay_delivery(delivery.id)SELECT e.id, ep.name AS endpoint, e.event_type, e.status, e.last_errorFROM knocker_events eJOIN knocker_endpoints ep ON ep.id = e.endpoint_idORDER BY e.id DESCLIMIT 50;
SELECT d.id, d.event_id, ep.name AS endpoint, d.signature_valid, d.signature_errorFROM knocker_deliveries dJOIN knocker_endpoints ep ON ep.id = d.endpoint_idWHERE ep.name = 'stripe' AND d.signature_valid = 0ORDER BY d.received_at DESCLIMIT 50;
SELECT knocker_mark_ignored(:event_id, 0);SELECT knocker_replay(:event_id, 'knocker.events', 3);SELECT knocker_requeue(:event_id, 'knocker.events', 3);
-- replay_delivery is a binding helper over a selected delivery body:-- reset the event, clear stale live jobs for that event, then enqueue-- {"event_id": ..., "delivery_id": ...} with honker_enqueue(...).const events = webhooks.listEvents(50);const invalid = webhooks.listDeliveries({ endpoint: "stripe", signatureValid: false, orphaned: true, since: 1700000000, limit: 50,});
const event = webhooks.getEvent(42);const delivery = webhooks.getDelivery(99);
webhooks.ignore(event.id);webhooks.replay(event.id);webhooks.requeue(event.id);webhooks.replayDelivery(delivery.id);{:ok, events} = KnockerSqlite.list_events(webhooks, 50){:ok, invalid} = KnockerSqlite.list_deliveries(webhooks, %{ endpoint: "stripe", signature_valid: false, orphaned: true, since: 1_700_000_000, limit: 50 })
{:ok, event} = KnockerSqlite.get_event(webhooks, 42){:ok, delivery} = KnockerSqlite.get_delivery(webhooks, 99)
{:ok, :ignored} = KnockerSqlite.ignore(webhooks, event["id"]){:ok, _} = KnockerSqlite.replay(webhooks, event["id"]){:ok, _} = KnockerSqlite.requeue(webhooks, event["id"]){:ok, _} = KnockerSqlite.replay_delivery(webhooks, delivery["id"])events, err := webhooks.ListEvents(50)if err != nil { return err}
event, err := webhooks.GetEvent(42)if err != nil { return err}
delivery, err := webhooks.GetDelivery(99)if err != nil { return err}
_ = webhooks.Ignore(event.ID)_ = webhooks.Replay(event.ID)_ = webhooks.Requeue(event.ID)_ = webhooks.ReplayDelivery(delivery.ID)const event = webhooks.getEvent(42);const delivery = webhooks.getDelivery(99);const related = webhooks.listDeliveriesForEvent(event.id);const invalid = webhooks.listDeliveries({ endpoint: "stripe", signatureValid: false, orphaned: true, since: 1700000000, limit: 50,});
webhooks.ignore(event.id);webhooks.replay(event.id);webhooks.requeue(event.id);webhooks.replayDelivery(delivery.id);events = webhooks.list_events(limit: 50)invalid = webhooks.list_deliveries( endpoint: "stripe", signature_valid: false, orphaned: true, since: 1_700_000_000, limit: 50,)
event = webhooks.get_event(42)delivery = webhooks.get_delivery(99)
webhooks.ignore(event["id"])webhooks.replay(event["id"])webhooks.requeue(event["id"])webhooks.replay_delivery(delivery["id"])Semantics
Section titled “Semantics”Event lists are newest-first, inclusive on since, and bounded. Delivery
reads preserve receipt-level audit/debugging details, including invalid and
orphaned receipts.
Current action semantics:
ignore(...)is allowed fromreceived,failed, ordead.ignore(...)is a no-op when the event is alreadyignored.replay(...)is allowed fromhandled,failed,dead, orignored.requeue(...)is allowed fromfailed,dead, orignored.replay(...)andrequeue(...)use the canonicalEventpayload.replay_delivery(...)is explicit and delivery-level: it processes the specified storedDeliverybody through the linked event’s handler without mutating the canonicalEventpayload.
Provider redelivery of a dead event is audit-only. Knocker stores the new
Delivery, keeps duplicate ingest non-mutating, and waits for an operator
to call requeue(...) or replay_delivery(...).
Concurrency Model
Section titled “Concurrency Model”Operator reads are best-effort under concurrent worker activity. They are good for inspection and manual recovery, but they are not advertised as a cross-call snapshot API.