Planes β one facade-out contract
A fixed catalog of domain planes with declared row types and verbs, served identically over REST, SSE and MCP β bro as a service over all agents.
Command examples track the upcoming 0.3.0 β grouped
bro <group> <member> spellings and 0.3.0 marks are not yet on npm
latest (0.2.5); use the flat names (bro convoy run,
bro debt status).
bro already answers every orchestration question β what's gated, who's working, what's next β but each answer lives behind a different CLI verb with its own output shape. Every thin client (TUI, IDE, MCP host, another agent) re-implements the same reads and re-invents the same degradation rules.
Planes fix the contract: a plane is one domain facade exposed to
clients β work, agents, queue, gates, events, judge,
debt. A plane is a contract β row type + verbs + capability flags β
not a table.
Declared rows, translated at the boundary
A plane row is a declared type β WorkItem, Worker, Run, Gate,
Event, Verdict, Finding β translated from the internal machinery
(TaskRow, AgentInfo, gate snapshots, journal envelopes) at the
adapter boundary. A client never deserializes an internal type, so the
internals stay free to move.
Transports are adapters
The contract is: every transport serves the same plane catalog β a new
consumer binds a transport, not a feature set. Today's surfaces ride
this axis but do not mount the whole catalog yet: bro serve exposes
bespoke routes (a snapshot endpoint plus an SSE tail over agent logs),
and the MCP endpoint fronts a tool list generated from the same
facades. The full REST/SSE plane surface β a route per plane resource β
is the facade work bro-9rls still specs; until it lands, planes.md is
the contract those bespoke endpoints are the first slices of.
/ui-style thin dashboards sit on this axis: read the planes, never
the internals.
Sources: specs/bro-9rls.1.md (facade-out contract, plane
catalog), specs/bro-9rls.2.md, the serve/mcp (0.3.0) commands.