v0.11.0
thevoiceguy/siphon-aiv0.11.0Jun 19, 2026by thevoiceguy
Upgrading?
AI Summary
Enhances webhook and CDR delivery reliability by adding idempotency, authenticity, and durability options to the shared delivery transport.
Key Highlights
- Idempotency via `X-SiphonAI-Event-Id` UUID for deduplication.
- Authenticity via HMAC-SHA256 signatures (opt-in) for replay protection.
- Durability via `spool_dir` to persist failed deliveries and resume after daemon restart.
- New delivery metrics for sink performance tracking.
New Features
- Webhook/CDR delivery idempotency
- Webhook/CDR delivery authentication
- Webhook/CDR delivery durability
Full Release Notes
Lifecycle webhooks (`[webhooks]`) and the CDR webhook (`[cdr.webhook]`) share one delivery transport, which now gains authenticity, idempotency, durability, and delivery metrics. **All additive** — the JSON bodies are unchanged, so the webhook and CDR schema `version`s are **not** bumped.
## Added
- **Idempotency.** Every delivery carries `X-SiphonAI-Event-Id` (+ an `Idempotency-Key` alias) — a UUIDv4 **stable across retries and any spool replay**. Delivery is at-least-once; receivers dedupe on this id.
- **Authenticity (opt-in `secret`).** With `[webhooks].secret` / `[cdr.webhook].secret` set, deliveries carry `X-SiphonAI-Signature: t=<unix>,v1=<hex>` — HMAC-SHA256 over `"<unix>.<raw-body>"`. The timestamp is inside the signed string, giving the receiver replay protection from a freshness window. `${VAR}`-expanded, never logged.
- **Durability (opt-in `spool_dir`).** With `[webhooks].spool_dir` / `[cdr.webhook].spool_dir` set, a delivery that exhausts the in-memory retry budget is persisted to disk and re-attempted by a background worker that **resumes after a daemon restart** (spool-on-failure — the happy path stays zero-disk-I/O). Oldest-first with capped backoff; `4xx`/poison entries are eventually discarded; a per-sink file cap bounds disk (drops the newest, never evicts an already-persisted entry). The directory is created + write-probed at startup, so a bad path fails the daemon loudly. Unset ⇒ today's best-effort behavior, unchanged.
- **Delivery metrics.** `siphon_ai_webhook_deliveries_total{sink,result}`, `siphon_ai_webhook_delivery_attempts_total{sink,outcome}`, `siphon_ai_webhook_spool_depth{sink}`, `siphon_ai_webhook_delivery_seconds{sink}` (`sink` ∈ `lifecycle` | `cdr`).
Both `secret` and `spool_dir` are **off by default**.
Docs: `docs/DEPLOY.md` → *Webhook delivery: signing, idempotency, durability* (with a receiver verification snippet); `docs/CONFIG.md` `[webhooks]` / `[cdr.webhook]`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)Related Repositories
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one