Memoize the board so streaming events from an active run no longer force
all 38 collapsed cards to re-render — only the open CardModal/AgentRunBar
re-renders, since its props stay referentially equal.
- KanbanCard: wrap in React.memo; take isRunning/bevyRunning primitives
instead of the whole orchestrator object; onOpen now takes the card id.
- useOrchestrator: expose a memoized activeByCard map, recomputed only
when runs/bevyRunning change (not on every streamed text/tool event).
- KanbanBoardPage: pass a stable openById callback + primitive props so
memo bails; memoize StatCard; extract the static category legend to a
memoized CategoryLegend component.
Also drops the per-card .filter().find() status scans each render.