Apache-2.0 · public beta · runs on your machine, no account

Run your cyber agent against a real system. Grade everything it did.

Connect your own agent to a real, contained mission, then grade the full evidence of what it did, not just whether it finished. Your harness, your judge model, your machine.

pip install xorcise

Python 3.12+ · Docker · 1–2M output tokens per run, on your own model.

// Quickstart

First run, start to finish.

Two commands to see the shape of it, nine for a real run. No account, no config file to write. Note the second to last one: XORCISE never runs your agent, so run launch-cmd prints the startup block you paste into the harness you already use. Pulling the mission image is the slow step; everything after it is local.

Before you run it: xorcise up binds the REST API and console on :3001 with no authentication — loopback plus, on Linux, the Docker bridge gateway, so the agent container can reach it. The console's file picker can browse the host's directory tree. Every process on the machine, and every container on that bridge, can create runs, read results and browse it too. The missions are deliberately vulnerable by design. Run this on a host you are willing to treat as untrusted. Every port, as shipped →

CLI · First run
### NO DOCKER · the self-contained demo, about a minute$ pip install xorcise$ xorcise up --stub # no daemon, no image pull, no real target### FULL INSTALL · a real run against a real target, nine commands# install, then check the host before you start$ pip install xorcise$ xorcise doctor # blockers fail the verdict# bring it up and give it a judge model; half the score is the judge$ xorcise up$ xorcise config set-model --name <model> --key sk-...$ xorcise agent register --name my-agent --kind claude-code# pull a target, create the run, then launch your agent into it$ xorcise mission pull aviary-access$ xorcise run create --agent my-agent --mission aviary-access$ xorcise run launch-cmd <run-id> # paste this into your agent$ xorcise run report <run-id> --format md

What the host needs

  • Python 3.12+a hard floor, not a recommendation
  • Docker + Compose v2a reachable daemon; Compose v1 is not enough
  • openssl on PATHgenerates the local control-plane cert
  • ~10 GB freemission images run 1–3 GB each

Linux is the tested platform, macOS is expected to work, and Windows is not addressed. Apple Silicon runs the amd64 mission images emulated. xorcise doctor checks all of it and tells you which are blockers.

Budget about ten minutes for the first full run, most of it the image pull.

Docker is not optional for a real run: it stands up a real target, so there is no version of that without it. xorcise up --stub bypasses it entirely, but a stub has no target and produces no evidence to grade. It is there to show you the shape of the thing before you commit a disk. What you do not have to stand up is the mesh. xorcise up provisions the local control plane and xorcise down tears it back out.

// The agent

Bring the harness you already run.

XORCISE never runs your agent; it evaluates one it does not build. So it asks for two open standards and nothing else: OpenTelemetry, so the run can be recorded, and a tailnet join, so it can be fenced.

Claude Codeclaude-code
Codex CLIcodex
OpenHandsopenhands
Generic floorany OTLP agent
OpenTelemetryOTLP/HTTP
The harness emits its spans to the run's collector on :4318, JSON or protobuf. That stream is the evidence; nothing is reconstructed afterwards.
Tailscale joinPOSIX sh, no root
The harness runs the run's join script to enter the fenced tailnet. The per-run ACL then lets it reach its one mission and nothing else.

The first three are registered: they get first-class run_id correlation and a replay adapter, and xorcise agent register --kind knows them by name. Anything else that meets the two requirements still runs, on the generic floor, at lower fidelity.

// The engine

Run it. Read the trace.

Reasoning, shell, files, tools, and the flag: the full record streams into the console as the run happens, then it's graded on the evidence. Hover or tap the trace to watch it play. The trace here is a constructed illustration; the graded run below it is a real one.

// Missions

Real targets, not quizzes.

A mission is a contained environment with a real objective and real consequences. Lab missions stand up hosts, services and a router behind a per-run network ACL that permits the agent its one target and nothing else; static missions hand over evidence to work through. Either way the agent gets freedom of action inside it, and nothing it does reaches anything it should not.

Each one is authored as terrain: the ground truth of what was there to find. During a run the agent's actions are attributed back onto it, so you can see how much of the environment it ever understood, and by which route.

A XORCISE terrain map for a blue-team defence run: grouped zones for the XORCISE control plane, the agent workspace, foothold and live-traffic capture, attack triage, and inline IPS prevention. Nodes are coloured by state (agent, discovered, enumerated, objective) and each edge is annotated with the action that traversed it, from joining the tailnet through validating the Suricata configuration to the verified inline drops. A legend explains each state.

// Evaluations

A score you can argue with.

The result is not a number handed down; it is an evidence-anchored record. Every panel ties back to something recorded during the run, so a verdict you disagree with is a verdict you can go and check.

A XORCISE run result in the console: the run named sqli-login · claude-code #1, with mission, agent, harness, start time and duration across the top, then overall 87%, deterministic 100%, judge 73%, elapsed 2m 54s, 8.3k tokens, 13 tool calls and 13 model calls. A scorecard below shows the overall ring beside separate deterministic and judge bars, three of three deterministic checks passed across eleven judge criteria, and a cross-run context strip comparing this run with the average.

Every run exports the same record as Markdown or HTML. A published example: .md · .html, a Claude agent graded by gpt-5.2, redacted because that mission is in the public library. How it is graded.

  • Two halves, never blended

    Deterministic checks score the facts: flag match, artefact presence, asserts. The judge scores the method against a rubric fixed before the run. You always see which is which.

  • Deductions with reasons

    Every point lost names what was missing, and links to the moment in the trace where it should have happened.

  • Read in context

    Model, token budget, sandbox and judge status ride with the score, plus the same agent's results across previous runs.

// Playbooks

One run is an anecdote.

A playbook takes a set of missions across a set of models, several attempts each, on a pinned harness, and aggregates every run into one evaluation report. You do not drive that by hand: it ships as a Claude Code skill, so you name the models and your own agent expands the matrix, launches every run through the API and hands back one card. The playbook is the script. Below is what one of ours produced, and the numbers we publish are the numbers we got.

xor-pb-001final · 180 of 180 runs
#ModelOverallDet.Judgepass@1std %
1sonnet-565.6%69620.6228.6
2sonnet-4-662.5%64610.5629.6
3glm-537.3%38360.3127.7
4kimi-2.532.3%39250.2221.7

180 runs is 4 models × 15 missions × 3 attempts, fewer attempts than the playbook declares (10), so read each cell as a mean of three. The judge is claude-sonnet-4-5, held outside the contestant pool. Conditions, caveats and the per-mission breakdown ship with the report, and every one of the 180 runs is published with it. read the whole thing.

// Doctrine

Trust is not established in ideal conditions. It is revealed under pressure.

// Security

Public beta. Deploy it accordingly.

It runs offensive agents against deliberately vulnerable targets on a host you should be willing to treat as untrusted. The isolation boundary, every port as shipped, what leaves your machine, what we have not done yet, and how to report a flaw. All on one page.

Run it yourself.

No account, no tier, nothing to buy. The engine, the fence, the grader and the CLI are one local process. You bring the agent and the judge model.

Apache-2.0 · public beta

The whole engine

Missions run in your containers. Traces, results and reports stay in ~/.xorcise. No phone-home, no usage telemetry. Publishing a result is a deliberate act.

  • Unlimited local runs
  • The public mission library, same licence as the engine
  • Playbooks for benchmarking

Prove it on your own agent.

pip install xorcise

Apache-2.0 · Python 3.12+ · runs locally · no phone-home.