arena
Arena
Open a todolist with one entry per phase (Frame, Fan out, Cross-judge, Pick, Graft, Verify) before launching anything.
Phase A: Frame
Every candidate gets the same prompt, so the prompt is the contract.
- State the artifact each candidate is producing.
- Derive the rubric, 3-6 concrete gradeable criteria for what success looks like on this task. It is the picker's tool in Phase D. Candidates only see the task.
- Pick the runner seats. A seat is an agent, never a model slug, and it must be one OMP can spawn (
scout,librarian,reviewer,security-reviewer,task,sonic,poteto-agent,comment-sicko,seance). The default seats aretaskandreviewer.poteto-agentis a third distinct seat. A caller such as the architect skill (skill://architect) may name its own seats. Each agent's model comes fromtask.agentModelOverridesandmodelRolesin~/.omp/agent/config.yml, which/skill:setup-pstack(skill://setup-pstack) writes. Model diversity exists only when the operator has configured distinct overrides for the seat agents. Claim that two runners ran on different models only from the resolved-model metadata OMP returns with each result. Never infer it from the agent names. Spawn more runners when the arena covers multiple design directions. Use the same agent N times, each item with its own name, when the work is generation-bound rather than judgment-sensitive. Set each item'seffortfor the job only when thetaskschema shows aneffortfield (task.enableEffort). Otherwise omit it. - Give each candidate its own output location, per the separate-before-serializing-shared-state principle skill (
skill://principle-separate-before-serializing-shared-state). Use a git worktree you create withgit worktree addwhere possible, otherwise/tmp/arena-<slug>/candidate-<n>/. When thetaskschema showsisolated(task.isolation.enabled), you may set it on a runner for its own workspace, and the brief still names the output path to read back. Never depend onisolatedbeing present.
N runners plus the judge must fit within task.maxConcurrency (32 by default) so the runners start together. Runners are leaves. They never call task, which also keeps the tree inside task.maxRecursionDepth (2).
Phase B: Fan out
Start all N runners in one task call. context holds the task, the path to the shared grounding, and the output-path convention. Each item carries name (unique, CamelCase, for example CandidateA), agent (its seat), task, and solutionSpace. The task field has the task, the path to the shared grounding, that runner's own output path, and instructions to produce the artifact and a short rationale naming the alternatives it considered and what it rejected. Set solutionSpace to how open the candidate's shape is, and never mention the other runners in it.