Skip to content

Claude Code & OpenCode Harnesses

Current behavior (as implemented): one image carries all three CLIs ([email protected], @anthropic-ai/[email protected], @openai/[email protected]), and a run picks its harness at approval time. The dashboard’s New Coding Task form has a harness picker; delegate_coding_task accepts optional harness and codingModel inputs, validated before a container starts. Only OpenCode has been exercised against a live CLI; the Claude Code and Codex event parsers are asserted from their documented stream formats and pinned by CLI version.

Specification target (GOAL / PLAN T22): API-key harnesses only. Subscription credentials are not proxied.

OpenCode

Default. Multi-provider (google / anthropic / openai). Dummy key in the container; Sandbox egress swaps in the AI Gateway credential.

Claude Code

anthropic/* models, e.g. anthropic/claude-sonnet-4-6. Stream format: --print --output-format stream-json.

Codex

openai/* models, e.g. openai/gpt-5.3-codex. Stream format: codex exec --json.

Per-run selection beats the deploy default: the dashboard harness picker (or the delegate tool’s harness input) overrides AGENT_HARNESS. An unsupported harness/model pair fails on the approval card, never inside a container the human already approved. registry.npmjs.org is not on the egress allowlist, so npm install inside a run is refused.