Run an experiment
Check the setup
From the repository root, verify SSH, node paths, the Python environment, model cache, and btp APIs:
python schedule.py check
Resolve failures before submitting GPU work. Missing calibration artifacts or data are blockers, not zero-valued results.
Run one cell
Bootstrap once, wait for that job to complete, then run the loop in the same output directory:
python schedule.py submit --job demo-r0 --wrap "python -m loop.bootstrap --config red_static --attacks-per-round 300 --goal-offset 50 --out loop_runs/demo"
python schedule.py status --jobid <bootstrap_job_id>
python schedule.py submit --job demo-loop --wrap "python -m loop.run_loop --config red_static --rounds 5 --attacks-per-round 300 --goal-offset 50 --blue-adapt --out loop_runs/demo"
Adaptive Blue is the standalone default. Use --blue-frozen for the control. Do not bootstrap over an existing non-empty cell.
Run the Red×Blue matrix through OpenCode
Open this repository as the OpenCode project, then run:
/arena-run <unique_run_id>
Arena initializes an absent run root or validates and resumes existing artifacts. It must stop on partial/inconsistent state rather than overwrite it. The standard comparison has four cells: static/adaptive Red × frozen/adaptive Blue. Keep seed, target, split, attack budget, benign data, and round count matched.
The clean-room empty-root initialization path has not been independently integration-tested. For its first use, inspect the created MATRIX.json and all four cells' WORLD.json, round0_spec.json, and round0_attacks.jsonl before allowing round 1.
Resume safely
If OpenCode or a provider stops, invoke /arena-run <same_run_id> again. Check the scheduler first:
python schedule.py matrix --run-id <run_id>
python schedule.py status --jobid <job_id>
python schedule.py log --job <job_name> -n 80
Do not manually resubmit a queued/running job, invent judge scores, or replace missing mutation variants with fabricated output. A round completes only after its judge handoffs and final spec are present.