Skip to navigation

Errors and reset

View as Markdown

Read retryable on each error frame. The code alone does not authorize repeated attempts. Your last locally committed checkpoint is the safe recovery boundary.

CodeMeaningAction
unauthenticatedAuthentication rejectedCheck the current key with the operator; stop frequent retries
forbidden_scopeScope not permittedNarrow the request or arrange the entitlement
invalid_filterUnsupported shape, selector or catalog bindingCorrect the request; do not silently remove a predicate
subscription_limitSubscription or reservation capacity exhaustedFollow retryability; consider lease expiry and retained snapshots
cursor_mismatchWrong filter/subscription/bindingRestore exact parameters or explicitly choose a new start
cursor_expiredCursor below the retained floorHandle reset; do not automatically jump live
history_unavailablePrevious history unavailableStop continuation and determine available history
resume_overloadedReplay resources unavailable nowIf retryable, use finite backoff with the same token
slow_consumerSend or unacknowledged window exceededImprove processing and resume from committed state
ack_invalidACK not valid for the active session/boundaryCheck connection, generation, token and local commit
source_degradedSource observation problemInspect quality snapshot and quality events
server_unavailableRequest cannot currently be servedPreserve token; bounded retry if permitted, otherwise operator assistance

Closing a socket need not immediately release every reservation. Avoid reconnect storms when a lease has not expired.

Error frame

This complete synthetic shape illustrates a rejected authentication; it is not a captured session response.

{"version":1,"frameSequence":"2","kind":"error","code":"unauthenticated","retryable":false}

Only code and retryable are defined beyond the common envelope. V1 does not promise message, reason or requestId fields.

Reset frame

The normal reader path reports cursor_expired and history_unavailable through reset_required, though these codes also belong to the error schema. This complete synthetic shape does not authorize a new live start.

{
"version": 1,
"frameSequence": "3",
"kind": "reset_required",
"code": "cursor_expired",
"streamId": "22222222-2222-4222-8222-222222222222",
"historyGeneration": "33333333-3333-4333-8333-333333333333",
"retainedFloor": "100",
"permittedActions": ["discover_current_history", "explicit_live_cut"]
}

retainedFloor is required, with a decimal string or null. Stream/history IDs are required non-nil UUIDs. Actions are exactly the two strings shown, in that order; they do not name HTTP endpoints. Resolve the history with the operator and record an explicitly accepted gap before starting live. See retention/reset.

Transport closure

A broken socket can prevent delivery of the error itself. Recovery must work from saved state without a final JSON error. Record transport symptoms using safe diagnostics, without tickets, tokens or raw payloads.