// XORCISE

Control centre for cyber AI evaluation.

One local process: the console, the fence, the collector and the grader. Register any agent, send it on a contained mission, and read back the whole record of what it did.

pip install xorcise

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

// Features

Five views, one record.

The console is not a dashboard bolted onto a test runner. Each view is a different cut of the same evidence, and every number in it is traceable to something that happened.

Dashboard

Counts, system health, and how your fleet is performing.

Agents registered, missions installed, runs completed and evaluated, with the pass rate and score spread across everything you have run. Module, catalog and topology health sit alongside them, so a bad number and a broken component are never confused for one another.

CLI · Dashboard
# start it, then open the console$ xorcise up$ xorcise status # non-zero if anything is down$ xorcise ui
The XORCISE dashboard: agent, mission, run and evaluated counts across the top, a score strip showing a 74% average and 83% pass rate, top agents and most-run missions down the left, and recent runs on the right.

Agents

Every agent you have registered, and how it has held up.

Register any agent that speaks OTLP: Claude Code, Codex, OpenHands, or your own harness. Each carries a track record across runs and model versions, so a single good result is never mistaken for a stable one.

CLI · Agents
# register a harness, then check its track record$ xorcise agent register --name my-agent --kind claude-code$ xorcise agent list$ xorcise agent history my-agent
The XORCISE agents view: four registered harnesses (Strands-AlertTriage, openhands-engineer, codex-cli and claude-code) each showing runs, average and best score, completion split and last run.

Mission Runs

The full record of what the agent actually did.

Reasoning, shell commands, file touches and tool calls, timestamped and attributed, streaming as the run happens rather than reconstructed afterwards. Deploy state and teardown are part of the record, not a footnote to it.

CLI · Mission Runs
# install a target, run an agent against it, watch it work$ xorcise mission pull aviary-access$ xorcise run create --agent my-agent --mission aviary-access$ xorcise run launch-cmd <run-id> # the harness startup block$ xorcise run status <run-id>
A live XORCISE mission run: packed-dropper driven by claude-code, with the mission, agent, harness, budget and objective across the top, an event timeline colour-coded by user prompt, agent reasoning, terminal and infrastructure, and the attributed trace streaming below it.

Results

Deterministic checks and the judge, scored apart.

Hard checks anchor the score: flag match, artefact presence, asserts. The judge scores method against a rubric fixed before the run. Every deduction names what was missing and links back to where in the trace it should have happened.

CLI · Results
# the graded record, and the standings across every run$ xorcise run report <run-id> --format html$ xorcise run traces <run-id>$ xorcise leaderboard
A XORCISE run result: sqli-login run by claude-code scoring 87% overall, with a 100% deterministic half and a 73% judge half, three of three deterministic checks passed across eleven judge criteria.

Configure

The conditions a result has to be read in.

The judge model and its key, the terrain attribution model, token caps, the mission library connection and the runtime environment. These are the settings a score depends on. Change one and every result after it is read differently, so the record carries them.

CLI · Configure
# bring your own judge model, then prove it answers$ xorcise config set-model --name gpt-5.2 --key sk-...$ xorcise config test$ xorcise config show$ xorcise catalog status
The XORCISE settings view: judge model configuration with API key, base URL and token caps on the left, terrain attribution model on the right, and the mission library and environment below.

// Technology

Architecture

You run XORCISE. It never runs your agent. Your agent works in your own sandbox and your own model grades the evidence. XORCISE provides the target, the isolation, the recording and the verdict, and puts a network fence between the agent and the mission that holds by construction, not by trust: a per-run Headscale ACL, enforced at the network layer, that lets the agent reach its one mission and nothing else. Rendering a policy that would allow more fails closed. how the fence is built.

XORCISE runtime architectureYour Cyber Agent runs in your own sandbox. XORCISE.CORE, which you run, prompts the agent and deploys the Mission target, while your BYO LLM provides grading. The agent's trace streams back to XORCISE and its traffic reaches the target across a network fence.YOUR SANDBOXXORCISE.AITRACEEVALPROMPTTRACE · OTELDEPLOYTARGET TRAFFICNTWK FENCEBYO LLMYOUR MODELCyber AgentYOUR SANDBOXXORCISE.COREYOU RUN ITMissionTHE TARGET
  • from XORCISE (prompt · deploy)
  • live data from agent (trace · attack)
  • your model (trace ↑ / eval ↓)

Live data streams across the fence: the agent's trace back to XORCISE, and its traffic out to the target.

What leaves your machine

Three answers, because “local” on its own is not one. A run needs nothing of ours to be reachable.

  • Nothing to us, everNo phone-home and no usage telemetry. App state, the trace store and every result stay in ~/.xorcise on your machine. The OTel mirror is off by default.
  • The mission catalogue, when you ask for itxorcise mission pull and xorcise catalog status fetch from our registry on demand. Once a mission is on disk, running and grading it never touches us again.
  • Your judge modelHalf the grade comes from a model you configure, so the submitted artifacts and a distilled transcript of the run go to that endpoint, which can be a self-hosted or gateway one, since any OpenAI-compatible URL will do. Configure no judge and that half scores zero rather than being quietly redistributed.

Stack

Boring where it counts. Standards at the seams, no heavyweight frameworks in the open-source grader.

Python ≥3.12the core language
FastAPIREST + in-process OTLP receiver
OpenTelemetrythe evidence standard
Dockerephemeral mission targets
Tailscale · Headscaleself-hosted mesh control
WireGuardpeer-to-peer data plane
SQLiteraw trace + logs store
Reactconsole & replay UI
Pydantictyped evidence contracts

Prove it on your own agent.

pip install xorcise

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