Made Different

Made Different

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);
  }
}
Shared reducer = identical behavior in CI and production.

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.