terminal-bench-2
This runbook describes the current AlphaDiana path for terminal-bench-2.
Use it for local AlphaDiana evaluation and smoke validation. It is not a claim of strict Harbor-equivalent leaderboard execution.
For the benchmark-plan direct_llm baseline, use the official
terminal-bench-2 repository and Harbor's built-in terminus-2 agent. The
April 19, 2026 OpenRouter/Qwen evidence for that official path is summarized
below.
Current Support
| Mode | Checked-in smoke config |
|---|---|
direct_llm | configs/examples/terminal_bench2_directllm_minimax.yaml |
opencode | configs/examples/terminal_bench2_opencode_minimax.yaml |
openclaw | configs/examples/terminal_bench2_openclaw_minimax.yaml |
zeroclaw | configs/examples/terminal_bench2_zeroclaw_minimax.yaml |
All four paths use the same local AlphaDiana terminal_bench2 benchmark loader and scorer.
This checkout does not ship a Terminal-Bench 2 full-run config.
Podman Task-Container Readiness
On May 15, 2026, Phase 7 validated the opt-in
terminal_bench2_opencode Podman task-container path with a five-task
official TerminalBench2 pilot.
Entry points:
- Config:
configs/smokes/podman_terminal_bench2/terminal_bench2_opencode_pilot.yaml - Runner:
scripts/run_podman_terminal_bench2_readiness.sh
Run shape:
export TERMINAL_BENCH2_DIR=<official-terminal-bench-2-task-root>
export OPENAI_BASE_URL=<openai-compatible-base-url>
export OPENAI_API_KEY=<api-key-or-placeholder>
export OPENAI_MODEL_NAME=<model-name>
export TB2_OPENCODE_RUNTIME_IMAGE=localhost/alphadiana/tb2-opencode-controller:latest
export ALPHADIANA_TB2_LOGS_DIR="$PWD/logs/podman-terminal-bench2-readiness/task-logs"
export PODMAN_TB2_RUN_PREFIX=podman_tb2_$(date +%Y%m%d_%H%M%S)
bash scripts/run_podman_terminal_bench2_readiness.sh validate
bash scripts/run_podman_terminal_bench2_readiness.sh preflight
bash scripts/run_podman_terminal_bench2_readiness.sh pilot
bash scripts/run_podman_terminal_bench2_readiness.sh audit
Passing evidence:
- Run prefix:
podman_tb2_20260515_phase7_abslogs - Pilot run:
podman_tb2_20260515_phase7_abslogs_terminal_bench2_opencode - Tasks:
db-wal-recovery,fix-git,overfull-hbox,adaptive-rejection-sampler,break-filter-js-from-html - Result: 5/5 task JSON rows, all
valid_scored,score=0.0,metadata.container_engine=podman, verifierok, and discoverable artifacts/logs. - Audit: passed with five
cleaninfrastructure rows.
This supports recommending a larger overnight TerminalBench2 OpenCode Podman campaign. It does not prove Direct x TerminalBench2, OpenClaw/ZeroClaw TerminalBench2 Podman readiness, full-sweep readiness, Podman global default promotion, or any SWE-bench/MMMU-Pro status.
OpenRouter/Qwen pilot status on April 19, 2026:
direct_llmofficial Harbor baseline: the initial batchpilot_20260419_qwen35_27b_terminal_bench2_directllm_t3failed (0/3verifier rewards, oneAgentTimeoutError), but the repaired follow-up archivepilot_20260419_qwen35_27b_terminal_bench2_directllm_t3_repair_r1is now3/3normal trajectories with3/3 reward=1on the approved trio. This is repaired official-checkout evidence, not a stock upstream invocation.opencodenative in-container pilot:pilot_20260420_qwen35_27b_terminal_bench2_opencode_t3_r2completed3/3normal task records (score=0,0,1) and was uploaded topilot_run/pilot_20260420_qwen35_27b_terminal_bench2_opencode_t3_r2/openclawnative in-container pilot: after removing the bad/app/TASK.mdprompt assumption, the rerunpilot_20260420_qwen35_27b_terminal_bench2_openclaw_t3_r4completed3/3normal task records with3/3 score=1and was uploaded topilot_run/pilot_20260420_qwen35_27b_terminal_bench2_openclaw_t3_r4/zeroclawnative in-container pilot:pilot_20260420_qwen35_27b_terminal_bench2_zeroclaw_t3_repair_r5completed3/3normal task records (score=0,1,1) and was uploaded topilot_run/pilot_20260420_qwen35_27b_terminal_bench2_zeroclaw_t3_repair_r5/
Local follow-up on April 19, 2026:
rerun_20260419_qwen35_27b_terminal_bench2_openclaw_timeoutcheck_r2completed unattended on the timeout-check sample and no longer reported the old innerctx=16000mismatchrerun_20260419_qwen35_27b_terminal_bench2_zeroclaw_fixgit_r1no longer reproduced the old missing-repo / missing-site workspace mismatch; the preserved failure moved to the loop detector
Local OpenCode/logprob follow-up on April 25, 2026:
phase12_opencode_tb2_qwen35_64k_logprobs_t3_parallel_20260425completed the same three-task local OpenCode path and wrote all three task JSONs.- All three tasks have no task-level
errorand saved provider-proxy logprobs with matching float/int16 sidecars (1388,1242, and4389records). - This was not a clean task-quality pass:
bn-fit-modifyisvalid_scored, whileadaptive-rejection-samplerandbreak-filter-js-from-htmlended withresponse_json.returncode=-1andscore_status=verifier_errorafter a long local run. The raw log also contains one vLLM HTTP 400 where accumulated OpenCode context plus the local output cap exceeded the model context window by one token. terminal_bench2_opencodenow wraps the container-local OpenCode command intimeout --kill-after, so future solver timeouts should not leave container-local OpenCode processes continuing to hit the provider after the host-sidedocker exectimeout.
Prerequisites
Run from the repo root:
source scripts/activate.sh
export PYTHONPATH=$PWD
export OPENAI_BASE_URL=https://models.sjtu.edu.cn/api/v1/
export OPENAI_API_KEY=sk-...
export OPENAI_MODEL_NAME=minimax-m2.5
For the April 19, 2026 OpenRouter/Qwen pilot:
export OPENAI_BASE_URL=https://openrouter.ai/api/v1
export OPENAI_MODEL_NAME=qwen/qwen3.5-27b
Model-Pin Caveat
The general "some smoke configs pin the model in YAML" rule lives in
benchmarks/index.md. This is the concrete tb2 case.
configs/examples/terminal_bench2_directllm_minimax.yaml hard-pins
agent.config.model: "minimax-m2.5", so it ignores OPENAI_MODEL_NAME
(it still reads api_base / api_key from OPENAI_BASE_URL /
OPENAI_API_KEY). To run a different model on that config, override the
agent config explicitly:
python -m alphadiana.cli run configs/examples/terminal_bench2_directllm_minimax.yaml \
-o agent.config.model=... \
-o agent.config.api_base=... \
-o agent.config.api_key=...
The opencode, openclaw, and zeroclaw tb2 example configs read the model
from the environment (${OPENAI_MODEL_NAME}), so for those switching the env
vars is enough. The zeroclaw config additionally accepts
-o agent.config.logs_base_dir=... when redirecting log output.
You also need:
- Docker
- a local
terminal-benchtask checkout - pre-pulled task images
- runtime source images for the native in-container agents:
tmlrgroup/alphadiana:v1foropenclaw,alphadiana/tb2-opencode-controller:latestforopencode, andzeroclaw-reasoning:0.6.9forzeroclaw
Official DirectLLM Baseline
This section is for the official direct-LLM baseline only. It is outside the
AlphaDiana runtime, but it is the benchmark-plan meaning of
DirectLLM x terminal-bench-2.
Minimal Harbor invocation shape from the upstream repo:
cd /path/to/terminal-bench-2
unset ALL_PROXY all_proxy HTTP_PROXY HTTPS_PROXY http_proxy https_proxy
export OPENROUTER_API_KEY=...
uv run harbor run --path . \
--agent terminus-2 \
--model openrouter/qwen/qwen3.5-27b \
--n-concurrent 3
Local April 19 OpenRouter/Qwen pilot specifics:
- approved trio:
adaptive-rejection-sampler,bn-fit-modify,break-filter-js-from-html - runtime settings:
temperature=0.6,top_p=0.95,max_tokens=32768,reasoning_effort=high - output root:
jobs/pilot_20260419_qwen35_27b_terminal_bench2_directllm_t3 - accepted repaired archive:
pilot_20260419_qwen35_27b_terminal_bench2_directllm_t3_repair_r1
Observed outcome on the initial official baseline:
- Harbor completed
3/3trials and preserved all trial artifacts - all verifier rewards were
0 adaptive-rejection-samplerended withAgentTimeoutErrorbn-fit-modifyandbreak-filter-js-from-htmlboth reached the verifier and still scored0
Local repair follow-up in the same official checkout:
- verifier entrypoints for
adaptive-rejection-sampler,bn-fit-modify, andbreak-filter-js-from-htmlwere normalized to a stablepython venv + pip + pytestflow - Harbor's local JSON parser was patched to ignore benign pre-JSON prefix text instead of surfacing a parser warning
adaptive-rejection-samplerwas rerun after tightening the task contract to the requiredars(density_fn, domain, n = ...)interface and switching the task image to a lightweight local R image- accepted repaired task runs:
bn-fit-modifyfrompilot_20260419_qwen35_27b_terminal_bench2_directllm_t3_r2: normal trajectory,reward=1,exception_type=nullbreak-filter-js-from-htmlfrompilot_20260419_qwen35_27b_terminal_bench2_directllm_break_filter_js_from_html_r4: normal trajectory,reward=1,exception_type=nulladaptive-rejection-samplerfrompilot_20260419_qwen35_27b_terminal_bench2_directllm_adaptive_rejection_sampler_r6: normal trajectory,reward=1,exception_type=null, verifier9/9 passed
- the accepted repaired bundle was uploaded to
T-MARS/alphadiana-benchmark-resultsunderpilot_run/pilot_20260419_qwen35_27b_terminal_bench2_directllm_t3_repair_r1/
Treat that repaired bundle as the current local smoke-valid signal for the
official direct_llm path on OpenRouter/Qwen.
Official leaderboard path (Harbor + Terminus-2)
The sections above are the AlphaDiana container-agent path. To run the
official/leaderboard configuration instead (standalone Harbor CLI + the
upstream terminus-2 agent), use the path below. Harbor owns the system prompt;
the AlphaDiana task-container harness at
alphadiana/benchmarks/terminal_bench2/harness/docker.py is not on this path.
vLLM endpoint (Qwen3.5-27B; the serve-side flags match the official spec):
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen3.5-27B --host 0.0.0.0 --port <port> \
--trust-remote-code --enable-auto-tool-choice --tool-call-parser qwen3_coder \
--tensor-parallel-size 2 --gpu-memory-utilization 0.9 \
--max-model-len 262144 --generation-config vllm \
--override-generation-config '{"presence_penalty": 1.5}' \
--served-model-name qwen3.5-27b Qwen/Qwen3.5-27B
--enable-auto-tool-choice --tool-call-parser qwen3_coder is required for
terminus-2 to issue tool calls; --generation-config vllm ignores the model's
shipped sampling defaults; omitting --reasoning-parser keeps thinking tokens in
message.content.
Install Harbor + Terminus-2:
export DIRECTLLM_TB2_ROOT=/path/to/terminal-bench-2
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install harbor # installs the `harbor` binary
No official Terminal-Bench 2 campaign manifest is checked into this checkout.
Use Harbor directly for that leaderboard path, or add and review a campaign
manifest before invoking alphadiana.benchmark_rollout_cli.
The intended campaign command runs harbor run --dataset [email protected] --agent terminus-2 --model openai/qwen3.5-27b ... at temperature=0.0,
reasoning_effort=high, top_p=0.95, max_tokens=131072, --n-concurrent 10
(pass@1). Outputs land in $DIRECTLLM_TB2_ROOT/jobs/<run_id>/. Renderer and
dispatch live in alphadiana/utils/rollout_campaign.py
(_render_official_tb2_command, render_run_command); Harbor upstream is
github.com/laude-institute/harbor.
Prepare Tasks
Clone a local task checkout:
git clone --depth=1 https://github.com/laude-institute/terminal-bench.git /tmp/terminal-bench
Set the full-run task root:
export TERMINAL_BENCH2_DIR=/tmp/terminal-bench/tasks
Prepare a deterministic smoke staging directory with one task:
rm -rf /tmp/terminal-bench-smoke-dbwal
mkdir -p /tmp/terminal-bench-smoke-dbwal
cp -a /tmp/terminal-bench/tasks/db-wal-recovery /tmp/terminal-bench-smoke-dbwal/
export TERMINAL_BENCH2_SMOKE_DIR=/tmp/terminal-bench-smoke-dbwal
For the April 19 OpenRouter pilot, the approved staged trio was:
db-wal-recoveryfix-gitbreak-filter-js-from-html
Example staging flow with environment variables instead of a hardcoded local path:
export TERMINAL_BENCH2_SOURCE_ROOT=/path/to/terminal-bench-2/tasks
export TERMINAL_BENCH2_PILOT_ROOT=/path/to/staged-terminal-bench-2-qwen-t3
rm -rf "$TERMINAL_BENCH2_PILOT_ROOT"
mkdir -p "$TERMINAL_BENCH2_PILOT_ROOT"
cp -a "$TERMINAL_BENCH2_SOURCE_ROOT"/db-wal-recovery "$TERMINAL_BENCH2_PILOT_ROOT"/
cp -a "$TERMINAL_BENCH2_SOURCE_ROOT"/fix-git "$TERMINAL_BENCH2_PILOT_ROOT"/
cp -a "$TERMINAL_BENCH2_SOURCE_ROOT"/break-filter-js-from-html "$TERMINAL_BENCH2_PILOT_ROOT"/
The smoke configs assume TERMINAL_BENCH2_SMOKE_DIR points at a directory whose immediate children are task directories. The full-run configs assume TERMINAL_BENCH2_DIR points at the full task root.
Current loader note on April 22, 2026:
pointing TERMINAL_BENCH2_DIR at a normal checkout root is valid. The loader
skips non-task directories such as .git and jobs. On the current local
April 22 checkout used for the OpenRouter full-run follow-up, that meant
91 immediate directories on disk but 89 loaded task roots.
Pre-pull Task Images
Before any smoke or full run:
python - <<'PY' | sort -u | xargs -r -n1 docker pull
import os, tomllib
from pathlib import Path
for task_toml in Path(os.environ["TERMINAL_BENCH2_DIR"]).glob("*/task.toml"):
with task_toml.open("rb") as f:
data = tomllib.load(f)
image = data.get("environment", {}).get("docker_image")
if image:
print(image)
PY
For the default smoke task specifically:
docker pull alexgshaw/db-wal-recovery:20251031
Prepare Runtime Source Images
direct_llm still uses the helper-workspace controller path. The native agents
opencode, openclaw, and zeroclaw now run inside a derived task image, so
they need runtime source images instead of controller containers.
Prepare the checked-in sources once:
docker pull tmlrgroup/alphadiana:v1
docker image inspect alphadiana/tb2-opencode-controller:latest >/dev/null
docker pull zeroclaw-reasoning:0.6.9
The first native-agent smoke/full run automatically builds a derived
alphadiana-tb2-runtime:<agent>-<fingerprint> image from the task image plus
the selected runtime source image.
Early OpenRouter full-run evidence on April 22, 2026 uses
nvidia/nemotron-3-nano-30b-a3b:free:
full_20260422_openrouter_nemotron_3_nano_30b_a3b_terminal_bench2_directllm_r1and..._openclaw_r1already wrotetb2_adaptive-rejection-sampler.jsonasvalid_scoredwithreward=0,metadata.verifier_status=ok, andmetadata.verifier_reward_observed=true..._zeroclaw_r1also advanced with normalvalid_scoredreward-0 task JSONs..._opencode_r1is less quiet so far: its first task wrotescore_status=verifier_errorwithmetadata.verifier_status=missing_reward- the first task still takes roughly minutes before its JSON appears because of container bring-up plus verifier startup; do not classify the run as stalled during that gap alone
For ZeroClaw, prefer putting large temporary files on a data disk before running:
export TMPDIR=/data/$USER/tmp/alphadiana-tb2
mkdir -p "$TMPDIR"
Runtime Model
AlphaDiana now uses two different TB2 execution contracts:
direct_llm: helper-workspace controller mode. The model seestb2-exec,tb2-copy-from,tb2-copy-to, andtb2-test.opencode,openclaw,zeroclaw: native in-container mode. AlphaDiana derives a runtime image from the task image, starts that task container directly, and runs the agent CLI inside it.
For the native agents:
- the model sees the live task filesystem directly
tb2-exec/tb2-copy-*are not exposed to the model/tests/test.shandreward.txtstay unchanged- the outer harness still runs verification once at the end
Smoke Runs
Validate the smoke configs first:
python -m alphadiana.cli validate configs/examples/terminal_bench2_directllm_minimax.yaml
python -m alphadiana.cli validate configs/examples/terminal_bench2_opencode_minimax.yaml
python -m alphadiana.cli validate configs/examples/terminal_bench2_openclaw_minimax.yaml
python -m alphadiana.cli validate configs/examples/terminal_bench2_zeroclaw_minimax.yaml
Run the three smoke configs:
python -m alphadiana.cli run configs/examples/terminal_bench2_directllm_minimax.yaml --redo-all
python -m alphadiana.cli run configs/examples/terminal_bench2_opencode_minimax.yaml --redo-all
python -m alphadiana.cli run configs/examples/terminal_bench2_openclaw_minimax.yaml --redo-all
python -m alphadiana.cli run configs/examples/terminal_bench2_zeroclaw_minimax.yaml --redo-all
April 19 OpenRouter/Qwen 3-task pilot commands:
python -m alphadiana.cli validate configs/examples/terminal_bench2_openclaw_minimax.yaml \
-o run_id=pilot_20260419_qwen35_27b_terminal_bench2_openclaw_t3 \
-o output_dir=./results \
-o benchmark.config.tasks_dir="$TERMINAL_BENCH2_PILOT_ROOT" \
-o benchmark.config.max_tasks=3 \
-o agent.config.model_name=qwen/qwen3.5-27b
python -m alphadiana.cli validate configs/examples/terminal_bench2_opencode_minimax.yaml \
-o run_id=pilot_20260419_qwen35_27b_terminal_bench2_opencode_t3 \
-o output_dir=./results \
-o benchmark.config.tasks_dir="$TERMINAL_BENCH2_PILOT_ROOT" \
-o benchmark.config.max_tasks=3 \
-o agent.config.model_name=qwen/qwen3.5-27b \
-o agent.config.model=custom/qwen/qwen3.5-27b \
-o agent.config.streaming=true \
-o max_concurrent=2
python -m alphadiana.cli run configs/examples/terminal_bench2_openclaw_minimax.yaml \
-o run_id=pilot_20260419_qwen35_27b_terminal_bench2_openclaw_t3 \
-o output_dir=./results \
-o benchmark.config.tasks_dir="$TERMINAL_BENCH2_PILOT_ROOT" \
-o benchmark.config.max_tasks=3 \
-o agent.config.model_name=qwen/qwen3.5-27b \
2>&1 | tee logs/pilot_20260419_qwen35_27b_terminal_bench2_openclaw_t3.log
python -m alphadiana.cli run configs/examples/terminal_bench2_opencode_minimax.yaml \
-o run_id=pilot_20260419_qwen35_27b_terminal_bench2_opencode_t3 \
-o output_dir=./results \
-o benchmark.config.tasks_dir="$TERMINAL_BENCH2_PILOT_ROOT" \
-o benchmark.config.max_tasks=3 \
-o agent.config.model_name=qwen/qwen3.5-27b \
-o agent.config.model=custom/qwen/qwen3.5-27b \
-o agent.config.streaming=true \
-o max_concurrent=2 \
2>&1 | tee logs/pilot_20260419_qwen35_27b_terminal_bench2_opencode_t3.log
Observed results for that pilot:
pilot_20260419_qwen35_27b_terminal_bench2_opencode_t3:3/3task records, allscore=1pilot_20260419_qwen35_27b_terminal_bench2_openclaw_t3:3/3task records,tb2_fix-git -> score=1,tb2_db-wal-recovery -> score=0,tb2_break-filter-js-from-html -> score=0- The OpenClaw pilot captured
low context window: ... ctx=16000on all three tasks and needed manual watchdog interruption on the first two tasks. Treat that path as experimental on OpenRouter/Qwen. - the initial strict ZeroClaw smoke-plan alignment attempt
smoke_20260420_qwen35_27b_terminal_bench2_zeroclaw_align_r1was abnormal because AlphaDiana still let ZeroClaw auto-enable its own internal Docker sandbox inside the TB2 controller image, which hid the mounted control workspace and broke the./tb2-execcontract - after forcing
security_sandbox_enabled=falseonterminal_bench2_zeroclaw, the repairedsmoke_20260420_qwen35_27b_terminal_bench2_zeroclaw_align_r2completed normally as a reward-0 task record, and the replacement rerunpilot_20260420_qwen35_27b_terminal_bench2_zeroclaw_t3_repair_r3completed3/3with normal task JSONs (2reward-0 failures,1reward-1 pass) - the April 20 in-container migration smokes supersede the native-agent
controller-specific caveats:
smoke_20260420_qwen35_27b_tb2_openclaw_incontainer_r2completed1/1onbreak-filter-js-from-htmlwithscore=1,smoke_20260420_qwen35_27b_tb2_opencode_incontainer_r2completed1/1onbreak-filter-js-from-htmlwith a normal reward-0 trajectory, andsmoke_20260420_qwen35_27b_tb2_zeroclaw_incontainer_r2completed1/1ondb-wal-recoverywith a normal reward-0 trajectory after sanitizing runtime logs out of the top-level assistant text - the full April 20 native TB2 reruns are now the accepted pilot evidence:
pilot_20260420_qwen35_27b_terminal_bench2_opencode_t3_r2wrote3/3normal task JSONs and was uploaded,pilot_20260420_qwen35_27b_terminal_bench2_openclaw_t3_r4wrote3/3normal task JSONs after fixing the in-container prompt contract to stop assuming/app/TASK.md, andpilot_20260420_qwen35_27b_terminal_bench2_zeroclaw_t3_repair_r5wrote3/3normal task JSONs and supersedes the older controller-moderepair_r3archive
Smoke success means:
- the task loads
- the selected agent path runs
/tests/test.shruns- a scored JSONL result is written
It does not mean the agent is competitive across the full benchmark.
Full Runs
There is no checked-in Terminal-Bench 2 full-run YAML. The example configs are
bounded smoke entry points. For a full evaluation, create and review a dedicated
config that points benchmark.config.tasks_dir at the complete task checkout
and sets the intended task selection, runtime, timeouts, output directory, and
concurrency.
Recommended concurrency:
direct_llm:max_concurrent: 4opencode:max_concurrent: 2openclaw:max_concurrent: 1zeroclaw:max_concurrent: 1
Adjust only if the local machine has enough Docker and API capacity.
Result Interpretation
The current AlphaDiana terminal_bench2 scorer is binary:
reward.txt == "1"means pass- missing or non-
1reward means fail
The JSONL score comes from that reward path.
As of April 22, 2026, current main no longer fabricates metadata.reward="0"
for metadata.verifier_status="skipped_duplicate" when no reward file was
actually observed. Historical artifacts such as
full_20260422_terminal_bench2_opencode_deepseek_chat_r2/tasks/tb2_adaptive-rejection-sampler.json
remain useful audit evidence, but the intended current behavior is the
post-fix reproducer
fixproof_after_20260422_tb2_opencode_deepseek_fast2_t1, which records
metadata.reward=null, metadata.verifier_reward_observed=false, and
score_status=verifier_error for that bookkeeping path.
Current Config Semantics
Smoke configs:
- live under
configs/examples/ - use
TERMINAL_BENCH2_SMOKE_DIR - intentionally run one staged task
A full-run config is not checked in. A project-specific full config should use
TERMINAL_BENCH2_DIR and scan the intended task directories under that root.
For the current checked-in smoke setup, the canonical staged task is db-wal-recovery.
The April 19 OpenRouter/Qwen pilot used the approved trio db-wal-recovery,
fix-git, and break-filter-js-from-html instead of a single staged task.
ZeroClaw Reproduction Notes
terminal-bench-2 does not use ROCK. The formal ZeroClaw smoke path is now
the TB2 native in-container path:
- AlphaDiana starts a derived TB2 runtime image for the selected task
- ZeroClaw runs directly inside that task container
- the task JSON is normal as long as the run writes a scored record, even if
the verifier reward is
0
Reproduce The 2026-04-20 In-Container Smoke
Prepare the staged smoke task and runtime source image first:
export OPENAI_BASE_URL=https://openrouter.ai/api/v1/
export OPENAI_API_KEY=sk-...
export OPENAI_MODEL_NAME=Qwen/Qwen3.5-27B
export PYTHONPATH=$PWD
export TERMINAL_BENCH2_SMOKE_DIR=/path/to/terminal-bench-smoke-dbwal
export TMPDIR=/data/$USER/tmp/alphadiana-tb2
mkdir -p "$TMPDIR"
docker pull alexgshaw/db-wal-recovery:20251031
docker pull zeroclaw-reasoning:0.6.9
Run the smoke:
python -m alphadiana.cli run configs/examples/terminal_bench2_zeroclaw_minimax.yaml \
-o run_id=smoke_20260420_qwen35_27b_tb2_zeroclaw_incontainer_r2 \
-o output_dir=./results/smoke_20260420_qwen35_27b_tb2_zeroclaw_incontainer_r2
Observed local verification on 2026-04-20:
- run_id:
smoke_20260420_qwen35_27b_tb2_zeroclaw_incontainer_r2 - result:
1/1completed,predicted=0, noerror - execution mode: derived in-container TB2 runtime image
- the assistant trajectory contains normal task reasoning after runtime-log
sanitization; it no longer exposes
tb2-exec/tb2-copy-*