arena
Installation
SKILL.md
Arena
Open a worklist 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. For subjective criteria, use Eval's criterion and calibration guidance. It is the picker's tool in Phase D. Candidates only see the task.
- Pick the runners. Use the
arena runnersrole, one arm per entry. Its default is one each onfable,opus,sonnet. A rejected entry also follows the required-arm rule below. Spawn more runners when the arena covers multiple design directions. Use the same model N times when the work is generation-bound rather than judgment-sensitive. Use the pstack-harness skill for the spawn. Its Spawn a role section resolves the role and builds this CLI's spawn call. - Give each candidate its own output location (a git worktree where possible, otherwise
candidate-<n>/inside a freshmktemp -d "${TMPDIR:-/tmp}/arena-<slug>.XXXXXX"made for this run), per the separate-before-serializing-shared-state principle skill. Never reuse an earlier run's directory. A native isolation option counts only when it makes a git worktree, wheregit -C <its path> rev-parse --path-format=absolute --git-common-dirprints the project's. Grok Build'sisolation: worktreecan make a standalone clone, so spawn there withisolation: none. If you omit the field, a Grok role or persona default can still turn isolation on. Make every other candidate worktree yourself, one at a time, withgit worktree add --detach <run dir>/candidate-<n>, where<run dir>is that freshmktemp -d, and name the path in the candidate's brief. If an add fails, remove the worktrees already made and give every candidate a plain directory there instead, so all candidates start alike. The pstack-harness skill's fallback says how to seed and brief a plain directory. Clean up the run when it ends, after saving its outputs per Outputs, and before a re-frame and re-run starts, whether Phase E or Phase F sent you back. To clean up, remove each candidate worktree withgit worktree remove --force <path>, delete any branch made for it withgit branch -D, and delete the scratch directory. Going back to Phase E to graft keeps them. Keep the rubric outside every directory a candidate can read, and give it to the cross-judge in its prompt.
Phase B: Fan out
Spawn all N subagents in one message with run_in_background: true, each with the task, the path to the shared grounding, its own output path, and instructions to produce the artifact and a short rationale naming the alternatives it considered and what it rejected.