Skip to main content
A harness is the small process Archal starts for a run. It reads the task, calls your agent, uses normal SDKs for service work, and prints the final answer.

Quick start

For scored clone runs, run the harness in Docker or the sandbox:
Use the rest of this page when you need model defaults or the exact environment contract.

Your harness stays local

The harness is your own agent. archal run always uses whichever local file you point it at via --harness or the agent field in .archal.json - it is never uploaded to your workspace. Scenarios, by contrast, are workspace-scoped artifacts you can reuse across projects. They are not auto-saved on archal run; push one explicitly:
List what is saved with archal scenario list --source workspace. See archal scenario for the full subcommand reference.

Custom harness directory

Point --harness at any directory containing your agent code:
You do not need an agent block when the entrypoint is obvious. Add one to .archal.json (with optional agentModel) when you want command defaults or a default model.

Agent configuration (.archal.json)

Declare the harness command in your project’s .archal.json:

Environment variables

Archal injects these into every harness process.

Task and model

Service connectivity

Harnesses should call normal service domains such as https://api.github.com, https://slack.com/api, or https://api.stripe.com. Clone URLs, MCP configs, and run credentials are managed by Archal and are not part of the harness contract. When using archal clone start for manual integration instead of archal run, the per-clone URLs are exported as ARCHAL_<CLONE>_REST_URL and ARCHAL_<CLONE>_MCP_URL. See Clone sessions for the full env-var naming convention.

API keys

Passed through from your environment or config:

Tuning overrides

Base URL overrides

For Azure OpenAI, API proxies, or self-hosted endpoints:

Metrics and trace output

Archal sets these paths. Your harness may write JSON to them for richer reports:

Service transport

Use the same client code you would use outside Archal. For GitHub, that can be gh, Octokit, or fetch("https://api.github.com/..."). The controlled runtime routes supported service traffic to the scenario clones and applies run credentials server-side.

Example: minimal custom harness

A minimal harness reads the task and invokes your real agent runtime:
With .archal.json:
Run it: