Case 02
Boardflow
Board state as the source of truth for agent actions.
- Next.js
- PostgreSQL
- SSE
- Prisma
Overview
Boardflow treats each card as an append-only event log. Agents propose mutations as intents; the server applies them idempotently and broadcasts the resulting events. The UI stays crisp because agents never write directly to React state—they compete fairly with humans through the same API.
Contribution: Product design + real-time agent integration
Agent surface
- Intent queue with optimistic concurrency control
- Streaming commentary from the agent for explainability
- Role-aware tools (PM vs engineer vs bot) with scoped permissions
Event-sourced cards
Cards are reduced from events (`CardCreated`, `FieldUpdated`, `AgentSuggested`). The reducer is shared between API and offline tests, so agent behavior is reproducible from fixtures.
type CardEvent =
| { type: "CardCreated"; id: string; title: string }
| { type: "AgentSuggested"; patch: JsonPatch; traceId: string };
function reduce(card: Card | null, e: CardEvent): Card {
switch (e.type) {
case "CardCreated":
return { id: e.id, title: e.title, column: "backlog" };
case "AgentSuggested":
return applyPatch(card!, e.patch);
default:
return exhaust(e);
}
}SSE commentary stream
While an agent works, commentary tokens stream on a dedicated channel. The board pins the originating card so reviewers can correlate narrative with concrete diffs.
- Back-pressure aware: UI drops superseded partials
- Trace IDs tie commentary to persisted intents
Scoped tool access
Tools are registered per role. The agent runtime injects only the subset allowed for the active board membership, which keeps destructive operations out of reach even if the model misbehaves.
Explore the other cases: Trappan.