Skip to main content
The Engineering Manager (EM) loop is the orchestrator. It is deliberately constrained — a tech lead that can decompose and delegate, but cannot invent roles, raise budget, or widen scope. Run it with:

The loop

voss team run composes the team config, board, session tree, and the Reviewer-A/B pair, then drives em_loop to completion and persists a final record.
Each iteration: check whether all cards are terminal, snapshot the board, ask the EM agent for a plan, execute its ops, then tick the board once. The loop ends when every card is Done or Blocked, when max-iterations is reached (default 50), or when the budget is exhausted.

EM operations

The EM agent emits a plan of typed ops — it never mutates state directly:

The cage

The cage is enforced by API surface, not by trusting the model. The handle the EM drives has no set_ceiling, set_budget, extend_budget, register_role, or mutate_team_config method. Violations raise EMCageViolation(op, reason):
  • Dispatching or ticketing a worker_role not in the roster.
  • Rescoping to a scope not contained in the ceiling.
  • Killing or rescoping a card already in Done.
A single violating op is logged and collected — it does not abort the iteration (audit-not-abort). Budget exhaustion forces all open cards to Blocked and ends the run.

The final record

When the loop ends it persists a RunFinal record: Kill and rescope events persist their own lineage records, so a killed or rescoped card stays inspectable. Inspect the result with voss review, voss board, and voss session tree.