Problem
In stella-events.jsonl (the adapter's live feed), streaming fragments are emitted as {"type":"text_delta","text":"<fragment>"} and the once-per-message consolidated body as {"type":"text","delta":"<complete message>"} — each type carries the other's natural field. Every consumer has to learn this by observation (arenabench's TranscriptReader appended both and rendered every response twice until PR #1884).
Where
Find the emitter: bench/harbor_adapter/stella_harbor/live_feed.py and/or the CLI-side event writer feeding stella-events.jsonl (rg for "text_delta"). Decide the canonical shape — either rename the types (text_fragment / text_final) or fix the fields (text_delta.delta, text.text) — and version the change so existing readers (arenabench TranscriptReader, arenabench flip, any bench tooling reading these files) keep working on old streams. TranscriptReader now tolerates both shapes, so this is cleanup, not a fix.
Done when
The emitter writes self-describing names, a doc comment (or docs/wire entry if these events are covered there) states the contract, and readers accept both old and new streams with a test each way.
Problem
In
stella-events.jsonl(the adapter's live feed), streaming fragments are emitted as{"type":"text_delta","text":"<fragment>"}and the once-per-message consolidated body as{"type":"text","delta":"<complete message>"}— each type carries the other's natural field. Every consumer has to learn this by observation (arenabench's TranscriptReader appended both and rendered every response twice until PR #1884).Where
Find the emitter:
bench/harbor_adapter/stella_harbor/live_feed.pyand/or the CLI-side event writer feedingstella-events.jsonl(rg for "text_delta"). Decide the canonical shape — either rename the types (text_fragment/text_final) or fix the fields (text_delta.delta,text.text) — and version the change so existing readers (arenabench TranscriptReader,arenabench flip, any bench tooling reading these files) keep working on old streams. TranscriptReader now tolerates both shapes, so this is cleanup, not a fix.Done when
The emitter writes self-describing names, a doc comment (or docs/wire entry if these events are covered there) states the contract, and readers accept both old and new streams with a test each way.