Disciplines · Decisions (ADRs)

ADR-0089: Keep Eve turn events bespoke until a truthful AG-UI adapter exists

Eve exposes ten named SSE frames.

3sections2 minread

On this page

Status: accepted, 2026-09-16

Context#

Eve exposes ten named SSE frames. They predate AG-UI and are consumed by the web panel and buffered mobile response path. Similar event names do not make the wire compatible.

This decision compares Eve to AG-UI release/2026-09-14, commit 8143a12313e857b1fbc882e4568df3f0d852fa9f, observed on 2026-09-16. The canonical TypeScript event source hashes to 667c9577913e6c51737fef6463f088e6e39f4d7f6d1046727f7f76ec90a9e362; the types and interrupt sources hash to 454d1638a94cf35d17b2322f29b7211641dd0df38f986069858956a27da159ef and f7413abc6cb66497c5a153db2a59dff870e6ec3d5b0e817461d1f9b0acaa8887.

The executable inventory is apps/oshun/bff/src/assistant/turn-event-protocol.ts. It found four public frames omitted from the route's prior comment: turn.memory, turn.ui, turn.inspection, and turn.client_tool_input. turn.inspection is emitted indirectly through the reply-inspection publisher, which a literal-only route scan misses.

Decision#

Keep eve.turn-events.v1 bespoke. Do not rename its events and do not claim AG-UI conformance. No compatibility adapter ships in this task.

All nine requested vocabulary dimensions are assessed. Seven are partial, cancellation is local-only, snapshots are absent, and none is exact. A truthful adapter has at least nine substantive obligations: stable run/message identity, ordered text lifecycle without terminal supersession, privacy-safe tool lifecycle, shared state and JSON Patch, interrupt-boundary snapshots, new-run resume semantics, explicit cancellation behavior, one terminal error, and validation against an independent implementation.

The largest semantic conflict is not spelling. Eve may stream text and later replace it in turn.complete after safety or grounding checks. Its client-tool bridge also holds the same HTTP run open, whereas AG-UI finishes an interrupted run after state/message snapshots and resumes with a new run. Translating either shape by changing event names would manufacture guarantees the wire does not have.

Consequences#

  • Existing clients and public frame names do not change.
  • The route sink accepts only the ten inventoried names, and a source census fails when production emits an unreviewed frame.
  • AG-UI remains an optional interoperability target, not an adopted protocol.
  • Reconsider an adapter after Tasks 8.5 and 8.9 settle stop/resume and streaming/buffered parity, and Task 16.6 can run it against an independent AG-UI implementation.
  • The inventory measures compatibility work; it does not prove AG-UI conformance, client interoperability, or that an adapter is worthwhile.