Skip to main content
XORCISE never launches your agent, never dials it, and never inspects its code. You register the agent as a record, create a run, and hand your agent a connect prompt that tells it how to reach the mission and how to report back. Time: about 10 minutes · You need: a running XORCISE (Quickstart) · Interface: CLI or web UI This guide uses the agent scout and the mission chrono-canary. <run_id> stands for the 32-character run id XORCISE prints when you create a run; every command below also accepts its first eight characters.

1. Register your agent

An agent record is a declaration: a unique name, plus optional metadata you disclose yourself. --model is self-reported, because XORCISE cannot detect it. --endpoint and --otel are recorded for your own reference and are read by nothing — the OTLP endpoint your agent actually uses is computed per run. The full field table is on Agents.
You should see the agent registered and the next command offered:
Output
kind is the one field that changes behaviour. XORCISE copies it to every run of this agent as the run’s source_agent, and that single value selects three things at once: the replay adapter that turns raw telemetry into readable events, the telemetry provider that decides which environment variables you are handed and how strongly a trace correlates, and the launch provider that supplies your copy-paste command. Registering scout as openhands instead of claude-code changes all three.
Three built-in harness slugs exist: openhands, claude-code (hyphen, not underscore), and codex. Any other value — including a blank one — falls back to the generic adapter. xorcise agent list renders friendly labels for a few other names, such as gemini and goose; those are display strings with no adapter behind them.

2. Create a run

A run pairs one agent with one mission and, optionally, a wall-clock budget in seconds.
You should see the run id and the two follow-up commands:
Output
XORCISE has now carved a private network for this run, started the mission, and minted a per-run bearer token. The run waits, and the live page reads Awaiting agent, until your agent’s first event arrives.

3. Read the connect prompt

The connect prompt is the mission text your agent reads. It carries no telemetry configuration — that is served separately, as the launch profile.
You should see the run id, the objective, the join recipe, the run-control endpoints, and the correlation marker. Abridged:
Output
The prompt is the whole contract. It tells your agent to:
  1. Join this run’s tailnet with one piped command, without root. In userspace or Docker-sidecar mode the host has no direct route to the targets, so every target connection goes through the SOCKS5 address the join script prints.
  2. Reach targets by IP. There is no name resolution on the tailnet, so a compose service name never resolves.
  3. Authenticate every run-control call with the per-run bearer token. That token is minted separately from the run id and the two are unrelated — you cannot derive one from the other, so pass the bearer through to your agent rather than reconstructing it.
  4. Submit findings as named artifacts. The flag is the artifact literally named flag.
  5. Call POST /complete when it is finished. Grading runs at completion.
  6. Leave the xorcise.run_id= marker in place. For an agent with no telemetry provider, that marker is the only thing tying its traces back to this run.
A static, attachment-only mission has no network, so its prompt drops the join step and the targets section and renumbers run-control to step 1. Everything else is identical.

4. Point the prompt at where your agent runs

The prompt bakes exactly one run-control host, and it has to be the one your agent can resolve. The three built-in harnesses run on your host, so XORCISE bakes your loopback address for them and there is nothing to choose. Every other kind gets the container-facing address host.docker.internal, which a plain terminal cannot resolve.
You should see loopback addresses, not host.docker.internal:
Output
A mismatch here is the most common reason a run appears dead: an agent in a terminal cannot resolve host.docker.internal, so both its run-control calls and its trace exports fail silently. xorcise run prompt asks for container mode, but XORCISE clamps the request to what the harness actually supports — so for the three built-ins you get loopback regardless, and only a custom kind comes back container-baked. For that case, use the web UI toggle or request the host-mode prompt directly from GET /api/runs/<run_id>/prompt?launch_mode=host. An agent you launch in a container needs the reverse: --add-host host.docker.internal:host-gateway.

5. Hand the prompt to your agent

How you deliver the prompt depends on how your agent takes instructions.
Paste the prompt into it as the task. Nothing else is required.

6. Confirm the run is receiving your agent’s work

Correlation is what attaches your agent’s activity to this run. XORCISE reads the xorcise.run_id resource attribute first and falls back to the prompt marker; a batch carrying neither is dropped rather than blended into another run.
You should see numbered records and a count:
Output
If the command prints no trace records for run 4c62254b7f0e4a1b9c3d5e6f70819a2b and your agent emits telemetry, the traces are not correlating — work through the troubleshooting section of Send traces and logs. If your agent emits no telemetry at all, this is expected and the run is still valid: your agent submits artifacts over run-control, calls POST /complete, and XORCISE grades it. Deterministic checks are unaffected, and the judge runs with an explicit no-trace note under which criteria it cannot evidence score unknown and are renormalised out of the average rather than scored zero.

What you just did

  • Declared an agent, and chose the kind that drives replay, telemetry, and launch — see Agents.
  • Created a run with a budget, and watched it wait for its agent — see Runs.
  • Handed your agent the prompt that carries the run-control contract and the correlation marker.
  • Confirmed the run is receiving work, and learned what a run without telemetry still scores — see How grading works.

Next steps

Send traces and logs

Wire your harness’s OpenTelemetry output into the run so the replay shows what your agent actually did.