Arena
Fan out N parallel attempts at the same task. Read every candidate end to end. Pick the strongest as the base. Graft the best ideas from the others into it. Verify the synthesized result.
Read ~/.config/opencode/bestfriend/rules/arena-protocol.md first. That file is the protocol. This skill is the slash entry.
Model pool
Do not read a model pool. Treat model IDs as opaque. MODEL_DIVERSITY=false. Same-model N candidates are allowed. Do not invent commercial slugs.
- Missing file, or every role is
inherit-parent→ all candidates inherit the parent model. SetMODEL_DIVERSITY=false. Do not invent commercial slugs. - Same-model N candidates are allowed. Label them honestly (
candidate-1…), not as different families. - Never print gateway URLs, tokens, or model-mapping values. Model names are opaque aliases.
templates/model-pool.example.jsonin the product checkout is bootstrap only. It is not a runtime path.
Start
Open a todolist with one entry per phase before launching anything.
- Frame
- Fan out
- Cross-judge
- Pick
- Graft
- Verify
Phase A: Frame
The N candidates receive the same prompt, so the prompt is the contract.
- State the artifact each candidate is producing.
- Derive the rubric. 3–6 concrete gradeable criteria. Concrete:
Adds a --dry-run flag that skips writes. Vague:code is correct. - Pick the runners from the live model pool (
builders). Default inherit-parent. - Assign output paths. Each candidate writes to its own location (a git worktree where possible, otherwise
/tmp/arena-<slug>/candidate-<n>/). Shared writable paths are forbidden.
Phase B: Fan out
Spawn all N isolated attempts with the same prompt, each with the shared grounding, its own output path, and instructions to produce both the artifact and a short rationale.
The rationale is mandatory. Each rationale names the alternatives the candidate considered and what it rejected.
If a candidate fails to produce output, proceed with N-1 and note the dropout.
Phase C: Cross-judge
After all Phase B candidates complete, pick a judge from the live pool (judges). Prefer a different family only when the live pool actually has one. Otherwise inherit-parent and set DEGRADED_NO_REVIEW_PANEL if a judge cannot be spawned.
The judge sees the rubric and the candidates by path label, scores each criterion, and recommends a base. Do not spawn the judge while candidates are still writing.
Phase D: Pick a base
Read every candidate end to end before picking. Score criterion by criterion. Compare against the cross-judge. Prefer the cleaner boundary or smaller surface when two feel tied.
Record the pick and the reason in a short synthesis note.
Phase E: Graft
Walk each losing candidate once more. Port one or two ideas into the base by hand. Record grafts and rejections.
When N candidates converge, ship the consensus shape. When they wildly diverge, Phase A was under-specified. Reframe and re-run rather than averaging.
Phase F: Verify
The synthesized artifact gets the same proof as any other output. The arena does not earn a pass.
Outputs
One synthesized artifact. One short synthesis note naming the base, the grafts, the rejections, the dropouts if any, MODEL_DIVERSITY, and the verification result.