Errors and reset
Read retryable on each error frame. The code alone does not authorize repeated attempts. Your last locally committed checkpoint is the safe recovery boundary.
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.
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.
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.
