• feat(#1): shared SSE resume orchestration; wire cli --send

    vh released this 2026-06-30 15:42:33 -07:00 | 181 commits to main since this release

    v1 coverage-audit slice b1. The audit found reconnect_turn had no
    caller — every presenter dropped the stream on disconnect instead of
    resuming, leaving the "reference SSE-resume implementation" (design-
    brief §3/§8d) unreachable. Add stream_turn_resilient as the single
    shared resume surface (design-brief §8b "share the consumer, branch
    the presenter") and route cli --send through it.

    • stream_turn_resilient wraps stream_turn + reconnect_turn: on
      SseConnectionDropped (mid-stream drop or clean EOF before terminal),
      resume from the last-seen sse_id via reconnect_turn (Last-Event-ID),
      up to max_reconnects (default 5). last_seen persists across attempts.
    • Non-drop reconnect failures (412/410/400/TurnIdFlip/SseConnectFailed)
      propagate unchanged, per contract #1's "surface, not recover".
    • cli.py: --send consumer now drives stream_turn_resilient (transparent
      reconnect). tui/web still consume bare stream_turn (follow-up).
    • Contract #1 amended (FN stream_turn_resilient) + validated; 8 TDD
      cases (happy, resume-after-1/2-drops, clean-EOF resume, unresumable
      zero-event, max-reconnects-exhausted, zero-budget, buffer-expired-
      propagates). Suite 518 green; ruff + mypy clean on touched code.
    Downloads