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.
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:| Op | Effect |
|---|---|
create_ticket | Derive a card from the idea, with acceptance criteria, domain (code/ai), and risk tier (low/med/high) |
set_ac / set_dod | Set acceptance criteria / definition of done |
dispatch_card | Assign a card to a role, with a routing rationale and candidates considered |
kill_card | Terminate a card, recording a kill rationale |
rescope_card | Replace a card with a successor under a new role/scope |
noop | Explicit no-op |
The cage
The cage is enforced by API surface, not by trusting the model. The handle the EM drives has noset_ceiling, set_budget, extend_budget, register_role, or mutate_team_config method. Violations raise EMCageViolation(op, reason):
- Dispatching or ticketing a
worker_rolenot in the roster. - Rescoping to a scope not contained in the ceiling.
- Killing or rescoping a card already in
Done.
Blocked and ends the run.
The final record
When the loop ends it persists aRunFinal record:
| Field | Meaning |
|---|---|
root_id | Session-tree root for the run |
idea | The original human idea |
total_cards | Cards created |
done_count / blocked_count | Terminal outcomes |
killed_count / rescope_count | Kill and rescope lineage counts |
em_iterations | Loop iterations consumed |
ts | Finalization timestamp |
voss review, voss board, and voss session tree.