AoE2 · LLM Arena

ADR 0001 — Broker-first event architecture

Status: Accepted (2026-05). Shipped through Phases 0–C. Context: docs/design/event-broker-architecture.md (frozen full spec).

Decision

Make the event broker the single source of truth for live event consumers. DuckDB and the web UI are symmetric materializations of the broker stream — neither knows about the other. Delete the old live.py shim and LiveRunRegistry / BroadcastingSink.

What we considered

  1. Status-quo patch — drop read_only=True from the SSE handler’s DuckDB scan, or route the live path past the scan by tracking db_path in a registry.
  2. Broker-first redesign — abstract producers and consumers behind an EventBroker Protocol, push DuckDB to the side as one of N consumers.

Why broker-first

The status-quo patches both work and both ship in half a day. They also both encode the load-bearing assumption that “readers open the writer’s DuckDB file.” That assumption is fine in a single-process FastAPI app and instantly false the day any of these happen:

Each of those is a forced rewrite of the SSE layer under deadline pressure if we bake in the file-coupling assumption now. The broker-first design moves that assumption out of the SSE layer entirely.

Consequences

Positive

Negative

Sequencing