Exceptions stop hiding in inboxes
Email is not a triage queue. The Exception Inbox is a single named surface for the desk, with SSE push and audit-chained closure.
A dedicated inbox for lock exceptions (pricing anomalies, pullthrough drift, missed fills). Streams via SSE, surfaces AI-suggested resolutions, supports resolve / dismiss / embed / recompute actions, and writes every step to the platform-wide audit chain.
Overview
The Exception Inbox surfaces lock-level anomalies that the platform detects across pricing, locks, and ratesheets. Each exception carries a kind (pricing drift, pullthrough drift, missed fill, sell-side mismatch), a severity, a summary of what changed, an AI-suggested resolution, and a link to the source events. Operators triage via resolve / dismiss / embed-for-context / recompute actions — every action writes to the audit chain. The Inbox pushes new exceptions via SSE; no client-side polling, no missed minute.
lock-service emits exception.* events as anomalies are detected; the Inbox subscribes via SSE for live updates.
Each exception ships with a draft resolution from ai-service — accept, edit, dismiss, or recompute. Suggestion is grounded on the exception payload + source events.
Resolve (apply the fix) · Dismiss (acknowledge as known) · Embed (attach as context for a future exception) · Recompute (rerun the underlying pricing or scoring).
warn vs error vs critical drives placement in the Inbox and the alerting policy (email, Slack on Business and above).
Every action — open, suggest, resolve, dismiss, embed, recompute — writes to common_audit_log. The full lifecycle is replayable for compliance.
The Hedge Cockpit surfaces high-severity exceptions inline; one click drops you straight into the Inbox with the exception focused.
How it works
Numbered steps from input to output. Each step maps to a specific subsystem you can inspect via OpenTelemetry.
lock-service runs detectors on pricing.computed, locks.*, and ratesheets.activated events. When a detector trips, an exception row is created with kind + severity + payload.
ai-service receives the exception payload, retrieves related lock + ratesheet + pricing trace, and drafts a resolution with citations. Suggester is rate-limited and audit-chained.
lock-service emits exception.* on the SSE channel and HMAC-signed webhooks. The Inbox subscribes; alerting policies fire on warn+.
From the Inbox: read the summary, inspect citations, pick an action. Accept the AI suggestion as-is, edit it, or override.
The chosen action runs (recompute reprices the lock; resolve marks the exception closed with the fix applied; embed attaches as context for the next detector run).
Auditors can walk the exception's full lifecycle from the audit chain — detector fire, AI suggestion, operator action, downstream effects.
Hands on
Live cURL sample — copy, paste, ship.
# Subscribe to the SSE exception stream
curl -N "https://api.ratestack.com/v1/locks/exceptions/stream?desk=primary" \
-H "X-API-Key: $RATESTACK_KEY"
# Each event looks like:
# event: lock.exception
# data: {
# "id": "exc_4f7a",
# "lockId": "lck_8a7c",
# "kind": "PULLTHROUGH_DRIFT",
# "severity": "warn",
# "openedAt": "2026-05-26T13:42:11Z",
# "summary": "Pullthrough confidence fell 0.18 vs prior session",
# "suggestion": { "action": "RECOMPUTE", "reason": "fresh ratesheet at 14:00 ..." },
# "auditChainId": "audit_9b1a"
# }Why this matters
Email is not a triage queue. The Exception Inbox is a single named surface for the desk, with SSE push and audit-chained closure.
Suggested resolutions cut median time-to-resolve. Operators stay in control; nothing applies without explicit acceptance.
Every detector fire, AI suggestion, and operator action lands in the audit chain. The exception's lifecycle replays deterministically.
Frequently asked
Pricing drift (price changed >X between Stage 1 and Stage 2), pullthrough drift (confidence drop), missed fills (lock expired with no fund), sell-side mismatch (sell-side completion doesn't reconcile to lock), and ratesheet anomalies (column count change, unexpected null surge). New detectors ship continuously.
On Enterprise, yes. Custom detectors are JVM functions registered against the event stream; they run alongside built-ins. Talk to sales for the SDK pattern.
Optionally. The 'embed' action attaches the dismissed exception as context — the next detector run can read it as a known acknowledged drift. Plain 'dismiss' is acknowledgement only.
Exceptions are platform-native — the detectors live next to the rule engine, the AI suggester reads the actual lock and pricing trace, and the audit chain spans detection through resolution. A generic alerter is a notification layer; the Inbox is the workflow.
Yes. The list endpoint paginates with filters; CSV / NDJSON export is available on Business and above.
Related capabilities
Ready to see it on your data?
We'll spin you a sandbox, load your actual ratesheets, and walk you through this capability against your top scenarios.