xorcise-playbooks, a skill in the xorcise-skills repository. It is not part of XORCISE itself: it drives your own install through the REST API and nothing more.

An eval card from xor-pb-001-broad_coverage — 4 models × 15 missions × 3 attempts, 180 graded runs, judged by claude-sonnet-4-5, run 29–30 July 2026. One dated result under one set of conditions, not a standing leaderboard.
What you actually do
Most of this page is detail you can ignore on a first read. The skill is conversational: your agent reads it and does the work, asking you only what it cannot determine itself.Install the skill
SKILL.md.Say you're ready
Answer a handful of questions
Approve the spend
Read the eval card
How a benchmark works
Each cell of the matrix is an ordinary XORCISE run. The skill creates it over the REST API, launches one disposable Docker sandbox that joins the mission network and drives the model, waits for the grade, and records the row. Nothing about grading changes: every run is still scored0.5 × deterministic + 0.5 × judge, exactly as How grading works describes.
Two roles matter, and they are configured in different places:
- Contestants are the models under test. You give the skill a short name and a litellm model string for each, for this run only.
- The judge is configured on your XORCISE install, not in the skill — it is the same judge that grades any other run. The skill only verifies it answers. Self-grading is allowed: a contestant may also be the judge.
What it costs
The matrix is the whole cost model:budget_seconds of model time, and agents usually use most of it. Each run then costs one grading, which is itself one judge call per rubric criterion — what grading costs sets out how that scales with transcript size. There is no cost estimator — XORCISE reports token counts but leaves the cost field unpopulated, as Roadmap notes — so treat every figure here as a shape, not a price.
The four presets, sized per model:
What you need
XORCISE running
Docker
/dev/net/tun — sandboxes join the mission network in TUN mode.Python 3
A long-lived API key
/dev/net/tun is present. Warnings are safe to proceed past.
The skill assumes http://127.0.0.1:3001 and only asks where XORCISE is if that check fails. If yours is elsewhere, set this once in the shell you run everything from, before the preflight:
Install
xorcise-playbooks/SKILL.md is a plain Markdown skill file. Point whichever skill-aware agent you use at it — however that agent loads skills — and run it from inside the xorcise-playbooks directory, since every path in it is relative to the skill root.
Your first benchmark
This is the smoke run as the skill performs it. You do not type these — they are here so you can follow along, and so you can reproduce a run without the skill later. The model map names each contestant. Copy the template somewhere temporary, because nothing about a run is meant to persist:--models use — to a full litellm string:
chmod 600s it, and opens it in your editor to fill in:
FAIL before spending. A model whose provider blocks offensive-security prompts shows up here as content_filter, which is much cheaper to discover now than 80 runs in.
Build the sandbox image if the preflight said it was missing, then rehearse the orchestration with no keys and no spend:
$RUN_DIR when you are done with it.
Reading the eval card

The same card from xor-pb-002-offensive_core — 5 models × 8 missions × 3 attempts, 120 graded runs, judged by gpt-5.4, run 31 July 2026. Same layout as the card above, scoped to a different playbook.
manifest.json, written alongside the results; without it the card falls back to labels derived from the run data rather than showing stale values.
The numbers behind it live in the output directory, and these are the source of truth:
--max-attempts, so a persistently dead model is left out instead of retried forever — which is the correct outcome, not a bug.
Going bigger
Build your own playbook
A custom playbook composes missions already installed or available on your platform. The skill cannot author missions; for that, see Author a mission.--as-playbook prints a ready-to-paste missions: block. Filters are --specialty, --proficiency, --type (lab or static), and --installed-only.
Ask your own library what it holds rather than working from a list here — the taxonomy has changed before, and --list-specialties prints the current values with a mission count for each.
Paste the block into a copy of a preset and set the rest:
intel_policy: none for a clean capability comparison — disclosing authored intel helps the agent and makes your numbers incomparable with anyone else’s. See Runs for what intel is.
Choose a concurrency
--concurrency is how many attempts run at once. The intuitive limit is memory — each sandbox is about 400 MB — but that is rarely what breaks first.
The real ceiling is mission provisioning. Every parallel run asks the core to bring up a mission container, and too many starting at once can exceed its readiness window and wedge the worker pool: runs pile up and the core stops answering, well before you run out of RAM.
- Start at 3, which is the default, and raise it only if the core stays healthy. On a small host use 1–2; past about 4–6 you need both spare memory and core headroom.
- For bursty starts, give the core more room before launching:
export XORCISE_READINESS_TIMEOUT_SECONDS=240(the default is 90). - The runner already staggers sandbox starts about 8 seconds apart so their telemetry inits do not collide. You do not need to do anything about that.
Survive a long run
A large matrix runs for hours, and the tooling assumes something will go wrong. Check progress any time, safely, against a run in flight — it reads only that run’s own files:--resume. Every completed run is checkpointed to progress.jsonl, so it skips what is already graded and finishes the rest. Nothing is lost and nothing is repeated.
Detach — run under tmux or a systemd unit so a dropped SSH session cannot kill the matrix. On very long runs you can also let a core wedge self-heal:
Clean up
The runner tears down each sandbox as its run finishes, so there is usually nothing left. To sweep stragglers, scope the filter to this run’s session tag:Running the scripts yourself
Nine scripts, all driveable directly if you want a benchmark in CI or on a schedule rather than in a conversation.run_playbook.py is the only one with a real surface:
--no-sandbox flag also exists, which runs agents directly on your host with no isolation. Don’t use it.
Limits and gotchas
Content filtering is normal. Some providers block offensive-security prompts for some models. The run returns no output and makes zero tool calls, shows astool_calls=0, and is excluded from scores rather than counted as a failure. If a model is consistently filtered on the offensive playbooks it cannot compete there — drop it.
Grades arrive late. Grading can land seconds to minutes after a run goes terminal, and the runner waits up to about five minutes for a real grade. Rows with overall=None usually mean the grade never landed or the transcript was too large for the judge; raising the judge’s token ceiling or the per-run budget is the fix.
Small n is small. Three runs per cell is a pilot. Read a cell as mean ± standard deviation, not a point estimate, and be careful comparing two models three points apart.
One judge carries its own biases. Half of every score comes from a single model reading a rubric. That is the same trade-off any XORCISE run makes, and How grading works sets out its limits — a leaderboard just multiplies it.
Use long-lived keys. A session token that expires mid-matrix can wedge grading. On Bedrock prefer a long-term key in AWS_BEARER_TOKEN_BEDROCK over STS credentials.
The skill ships reference/TROUBLESHOOTING.md with the full list, including the symptom-to-cause table worth skimming before a large run.