the unified v2 client: live subscribeEvents + replay cutover (Go client parity) master
the 'archive now, live later' split in the README was not upstream's shape — the official Go client is ONE Subscribe covering the live tail, filtered replay, and a gapless replay→live cutover (doc.go). ported at pin 289b032: - live.zig: the subscribeEvents live tail. xrpc.v1.json subprotocol offer, seq-dedup'd at-least-once reconnects resuming at the highest delivered seq, bounded exponential backoff, TCP keepalive, dict-zstd binary frames with rotation recovery, and the typed pre-upgrade error contract (CursorTooOld terminal / UnknownZstdDictionary refetch / InvalidRequest fatal) via websocket.zig v0.1.12's handshake_failure. - livedecode.zig: lexicon frame decode with upstream's exact malformed-vs-future policy and required-field enforcement; bounded untrusted diagnostics. - client.zig: the cutover engine (runBackfillThenLive port): sweep sealed archive → cut over at max(sealed tip, cursor) → live at that dedup floor → CursorTooOld re-enters backfill from the last delivered seq, monotonic, stall-bounded at 5. - archive_backfill.zig: extended onRow handler delivering every row WITH its seq — including identity/account/sync markers (upstream's inline sentinel semantics; the seq was previously decoded and discarded). the classic onEvent contract is unchanged for existing consumers. deps: websocket.zig v0.1.12, zat v0.4.1 (same websocket pin, so the two package instances dedup). one recorded divergence: commit records stay wire JSON, not reconstructed DAG-CBOR (no JSON→DAG-CBOR encoder in zat.cbor; zig consumers fold on JSON). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>