• feat(sse,tui): bump spec pin to v0.29.0 + AwaitingLlmFirstToken (v0.14.0)

    vh released this 2026-05-25 22:57:33 -07:00 | 241 commits to main since this release

    Spec pin moved da93ca7 (v0.28.0) → 562001a (v0.29.0); vendored
    conversation-api-spec.md + conversation_api.contract.md re-snapshotted.
    The only material delta is Worldtree #201's awaiting_llm_first_token
    SSE heartbeat — a top-level event (NOT a worker_phase extension, per
    INV-053's three-field stability) that fires at a configurable interval
    (default 5s) during the BuildingPrompt → CallingLLM gap.

    Wire layer (sse_client.py):

    • New AwaitingLlmFirstToken dataclass: sse_id / turn_id /
      elapsed_ms_since_building_prompt (server-authoritative monotonic)
    • Added to Event union + _envelope_for_type dispatch branch
    • Without this, ratatoskr would crash on any slow-first-token turn
      from a v0.29.0 server (unknown SSE event type → ValueError)

    TUI layer (tui.py):

    • Audit pipeline: per-event debug-pane line with elapsed in seconds
    • Live transcript indicator: first heartbeat mounts a Static
      ("awaiting first token · 5.0s"); subsequent heartbeats update it
      in place; any non-heartbeat event removes it (the gap closed)
    • Turn-summary line now carries heartbeat count
    • Indicator demoted via .awaiting-label CSS so it reads as ambient
      progress, not content

    Tests: 2 wire-layer (single + monotonic sequence) + 3 presenter
    (audit line shape, single-mount semantic, indicator removal on gap
    close). Suite: 318 passing.

    Downloads