Harnesses

A harness is the agent CLI a station runs. A station names one by its id in harness. Spotlight runs three. The runner starts each over the Agent Client Protocol (ACP), in /workspace, as the agent user.

Built-in harnesses

Claude CodeCursorCodex
Idclaude-codecursorcodex
NameClaude CodeCursor CLICodex
ACP commandclaude-agent-acpcursor-agent acpcodex-acp
Model bindingANTHROPIC_MODEL environment variable--model <model> argumentmodel in the JSON of CODEX_CONFIG
Effort bindingCLAUDE_CODE_EFFORT_LEVEL environment variableappended to the model as <model>[effort=<effort>], when a model is setmodel_reasoning_effort in the JSON of CODEX_CONFIG
Model discoveryGET https://api.anthropic.com/v1/modelscursor-agent modelsGET https://api.openai.com/v1/models, ids starting gpt, o<digit> or codex
Key model discovery sendsANTHROPIC_API_KEY, else CLAUDE_CODE_OAUTH_TOKENnone; cursor-agent models signs in by itselfCODEX_API_KEY, else OPENAI_API_KEY
Version probethe bundled claude CLI's --versioncursor-agent --versioncodex-acp cli -V
Skills directory.claude/skills, read by the harness.spotlight/skills, listed in the briefing.spotlight/skills, listed in the briefing
Native settings formatJSON objectJSON objectconfig.toml text

A station names its harness; there is no default, and a station without one runs nothing. The work stations of the built-in lines name claude-code.

Harness environment

The runner sets these for the harness, besides the model and effort bindings. ${SPOTLIGHT_STATE_DIR} is /workspace/.spotlight/state.

HarnessVariableValue
claude-codeCLAUDE_CONFIG_DIR${SPOTLIGHT_STATE_DIR}/claude
claude-codeCLAUDE_CODE_ENABLE_TELEMETRY1
claude-codeCLAUDE_CODE_ENHANCED_TELEMETRY_BETA1
claude-codeOTEL_TRACES_EXPORTERotlp
claude-codeOTEL_METRICS_EXPORTER, OTEL_LOGS_EXPORTERnone
claude-codeOTEL_EXPORTER_OTLP_PROTOCOLhttp/json
claude-codeOTEL_EXPORTER_OTLP_ENDPOINTthe runner's loopback telemetry address
claude-codeOTEL_TRACES_EXPORT_INTERVAL1000
codexCODEX_HOME${SPOTLIGHT_STATE_DIR}/codex

A harness profile adds the harness's native settings, MCP servers and permission rules. See Inside a sandbox for the rest of the agent's environment.

Token counts

The runner journals the token usage each harness reports at the end of every turn. Claude Code reports input, output, cache-read and cache-write tokens. Codex reports no cache-write tokens, and its counts cover only the last request of each turn. Cursor's counts are not confirmed. See Spend.

Efforts

Every harness takes the same efforts, from least to most: low, medium, high, xhigh, max. A station with no effort sets none.

Models

A model id is the first field of each line a harness's discovery command prints, kept when it matches:

^[a-z0-9][a-z0-9._:@/-]*$

A discovery command that fails, or does not finish within 15 seconds, lists no models. Model discovery runs behind an egress, which adds the host's harness keys to requests to the model endpoints.

Installed harnesses

A harness counts as installed in an image when its ACP executable (claude-agent-acp, cursor-agent or codex-acp) is on PATH. The host runs spotlight runner harnesses '<json>' in each image it serves, within 2 minutes, and reports each installed harness with its models and version. The Runners page shows them.

A run goes only to an image that holds its station's harness. If an image changes and no longer holds it, the run fails with Runner image <digest> no longer holds the <harness> harness.

Versions

A harness's version is the one built into the runner image. The image digest pins it. The default image is built from .docker/runner/Dockerfile in the Spotlight repository, with these build arguments. Cursor is installed at its latest release.

ArgumentDefaultInstalls
CLAUDE_CODE_VERSIONlatest@anthropic-ai/claude-code
CLAUDE_AGENT_ACP_VERSIONlatest@agentclientprotocol/claude-agent-acp
CODEX_ACP_VERSIONlatest@agentclientprotocol/codex-acp
TERRAFORM_VERSION1.16.4Terraform
Run a line in your own runner image
for an image with other versions.

On this page