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

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.
