Terminal-Bench is a useful counterweight to short-form code benchmarks. A task may require compiling a toolchain, repairing a database, reverse-engineering a binary, editing a large corpus, or keeping several intermediate artifacts coherent across a long shell session. The score is binary and externally verified: the model either leaves the task container in the required state or it does not.
We ran all 89 Terminal-Bench 2.1 tasks locally with btbtyler09/Qwen3.8-27B-GPTQ-4bit, served as qwen3.8-27b, on two RTX 3090 GPUs. The initial setting was xhigh reasoning. That clean xhigh pass solved 62 of 89 tasks, or 69.66%.
We then used a deliberately adaptive fallback policy on only the failures: medium reasoning, then low reasoning, then thinking disabled. Those retries recovered eight additional tasks and produced a 70/89, or 78.65%, cumulative best-of result.
That second number is useful operationally, but it is not a conventional single-attempt benchmark score. The headline quality result is 62/89 at xhigh. The 70/89 result answers a different question: how many tasks can this local model solve when an operator is willing to change reasoning effort after a failure?
Experimental setup
| Component | Configuration |
|---|---|
| Benchmark | Terminal-Bench 2.1, 89 tasks |
| Model | btbtyler09/Qwen3.8-27B-GPTQ-4bit |
| Served model alias | qwen3.8-27b |
| Quantization | GPTQ 4-bit |
| GPUs | 2× NVIDIA GeForce RTX 3090 |
| VRAM | 24 GB per GPU, 48 GB total |
| Host | Linux, 32 CPU threads |
| Inference API | Local OpenAI-compatible endpoint |
| Runner | LocalMaxxing CLI Terminal-Bench runner |
| Agent harness | OMP, executed against each task container |
| Initial reasoning setting | xhigh |
| Fallback settings | medium, then low, then off |
| Run period | 2026-08-19 01:44:49 UTC to 2026-08-23 23:04:55 UTC |
The run used Terminal-Bench's prebuilt task images. LocalMaxxing created a fresh task container, handed that container to the external OMP adapter, preserved the container after the agent exited, and invoked the task's external verifier. Each task result, verifier output, timing record, token usage record, and agent trace was stored under a durable run directory.
The model endpoint exposed a 262,144-token context window. We allowed effectively unbounded whole-experiment wall time and did not use a small turn budget. “Unlimited,” however, cannot mean physically infinite: every model call still had to fit the endpoint context, and pathological trajectories were eventually stopped by the operator when they were no longer making useful progress. During bring-up, completion limits were tested at 32K and 64K; the final adapter retained a finite per-response ceiling so prompt plus completion could remain within the endpoint's context.
Running it with LocalMaxxing CLI
The workflow began with a dry-run. This validates task selection, model identity, quantization metadata, hardware metadata, image resolution, and the output checkpoint before spending days on inference.
lmx eval terminal run \
--task-dir .tb21-bundles \
--base-url http://127.0.0.1:8087 \
--container-base-url http://172.17.0.1:8088 \
--model btbtyler09/Qwen3.8-27B-GPTQ-4bit \
--quantization GPTQ-4bit \
--quant-format GPTQ \
--hardware hardware.json \
--agent-cmd ./examples/agents/omp-container-shell.sh \
--agent-name omp \
--agent-execution container \
--thinking-level xhigh \
--run-dir .terminal-runs/tb21-qwen38-xhigh \
--resume auto \
--json-status \
--json \
--dry-run
After inspecting the preflight, the same command ran without --dry-run. The durable checkpoint made the multi-day experiment resumable:
lmx eval terminal status .terminal-runs/tb21-qwen38-xhigh --json
lmx eval terminal logs .terminal-runs/tb21-qwen38-xhigh --follow
The fallback sweeps were separate task directories containing symlinks only to the currently failed bundles. Each sweep used its own run directory and changed only --thinking-level. This matters because it keeps every attempt auditable and prevents an adaptive result from being mistaken for a single canonical pass.
Results
| Stage | Tasks attempted | New passes | Cumulative passes | Cumulative score |
|---|---|---|---|---|
| Xhigh | 89 | 62 | 62 | 69.66% |
| Medium on xhigh failures | 27 | 5 | 67 | 75.28% |
| Low on remaining failures | 22 | 2 | 69 | 77.53% |
| Thinking off on remaining failures | 20 | 1 | 70 | 78.65% |
The clean xhigh score includes fresh reruns of two attempts that were initially unscored because of harness infrastructure problems. There were no unresolved infrastructure failures in the final accounting.
Tasks recovered by changing reasoning effort
Medium recovered five:
build-pov-rayextract-elffinancial-document-processorlarge-scale-text-editingvideo-processing
Low recovered two:
dna-insertquery-optimize
Thinking disabled recovered one:
mteb-retrieve
This is the central result of the experiment: higher reasoning effort was not monotonically better on every task. Xhigh was the strongest single full-suite setting we measured, but a cheaper and more direct policy sometimes escaped a failed xhigh trajectory.
The cost of long-horizon reasoning
| Setting | Attempts | Task-hours | Input tokens | Output tokens | Total tokens | Model calls |
|---|---|---|---|---|---|---|
| Xhigh valid results | 89 | 79.83 | 627.22M | 12.50M | 639.72M | 7,367 |
| Medium fallback | 27 | 9.80 | 72.57M | 1.91M | 74.48M | 1,173 |
| Low fallback | 22 | 9.00 | 46.30M | 1.80M | 48.11M | 884 |
| Thinking-off fallback | 20 | 8.04 | 72.10M | 1.51M | 73.61M | 1,010 |
Across every attempt, including the two initial unscored infrastructure attempts, the experiment consumed:
- 160 attempts, of which 158 were scored
- 117.34 hours of calendar time
- 111.84 aggregate task-hours
- 861.85 million input tokens
- 18.52 million output tokens
- 880.38 million total processed tokens
- 10,821 model calls
- approximately 558 MiB of stored artifacts
The input-token number is much larger than the output-token number because an interactive agent repeatedly resends conversation state, task context, tool results, and accumulated observations. It should not be read as 862 million unique training-style tokens. It is processed inference context across thousands of calls.
The asymmetry also explains why completion-token caps alone do not control cost. A response can be reasonably short while the next request carries a very large accumulated transcript. For long terminal tasks, context management and stopping policy are first-order performance parameters.
What xhigh did well
The successful set was not limited to easy shell manipulation. Xhigh completed tasks involving compilation, cryptanalysis, numerical computing, model tooling, databases, networking, polyglot code, and repository repair. Representative passes included:
compile-compcertfeal-differential-cryptanalysisfix-ocaml-gcmcmc-sampling-stanmodel-extraction-relu-logitspytorch-model-recoveryschemelike-metacircular-evalsqlite-with-gcovtorch-tensor-parallelismwrite-compressor
The strongest trajectories shared a practical pattern: inspect the environment, form a concrete hypothesis, create an intermediate artifact, run a relevant self-check, and stop when the observable requirement passed. The agent was effective when reasoning remained anchored to files, command output, and verifier-relevant behavior.
Failure audit: all 19 residual tasks
We reviewed the instruction, agent transcript, verifier output, and result metadata for every task that failed at xhigh, medium, low, and thinking-off. That is 76 stored residual trajectories, plus the eight xhigh-to-fallback pass contrasts. One original xhigh trajectory was unscored because of the harness problem described below; it was not treated as a model verdict.
The residual attempts were expensive: 73.20 task-hours, 554.53 million input tokens, 12.77 million output tokens, and 6,452 model calls. Xhigh alone accounted for 49.40 of those hours. Six xhigh failures consumed 68.4% of all input tokens used by failed xhigh attempts: make-doom-for-mips, winning-avg-corewars, extract-moves-from-video, regex-chess, path-tracing-reverse, and install-windows-3.11.
The audit found a concrete primary failure in each residual task:
| Task | Decisive observed failure |
|---|---|
adaptive-rejection-sampler | Three settings never wrote ars.R. Thinking-off did, but its own tests showed a standard deviation of 0.703 for a requested normal distribution and six failures; it still timed out without repairing the acceptance/hull math. |
chess-best-move | Xhigh transcribed the g2 piece incorrectly, built a FEN for the wrong board, and therefore omitted verifier-required move g2g4. Other settings never produced move.txt. |
dna-assembly | Produced primers used a different restriction-site representation or omitted the required 5′ clamp. Custom digestion checks validated the model's convention rather than the externally required primer format. |
extract-moves-from-video | Every setting built increasingly elaborate frame, OCR, hashing, and alignment pipelines; none wrote solution.txt. Xhigh reached 436 calls and 45.55 million processed tokens with the same missing-file outcome. |
filter-js-from-html | Xhigh preserved clean HTML but missed an alerting attack batch. Medium blocked all 439 attack vectors but modified five of 12 clean files. Lower settings failed both sides of the contract. |
gcode-to-text | Every run cycled through projections, ASCII renders, PCA, components, and cross-sections without writing out.txt, even after useful character evidence appeared. |
gpt2-codegolf | Every run analyzed checkpoint layout and parameter counts before creating gpt2.c; the verifier never reached compilation because the file was absent. |
install-windows-3.11 | Xhigh reached Program Manager and left the expected services running, but bespoke VNC/QMP checks did not reproduce the verifier's keyboard sequence; all five injected-key attempts produced less than the required 10% image change. |
make-doom-for-mips | Xhigh built a large custom libc/header stack and produced a frame, but missed required stdout and reached 0.9195 image similarity against a 0.95 threshold. Other settings researched the ABI/toolchain without producing a frame. |
make-mips-interpreter | All four settings deferred vm.js while reverse-engineering ELF, ISA, syscalls, and the large BSS. No run reached a successful node vm.js frame smoke test. |
path-tracing | All four runs reverse-engineered the reference renderer but never created image.c; none measured even a minimal candidate against the explicit 0.99 similarity contract. |
path-tracing-reverse | The model pursued instruction-level and sometimes byte-exact reconstruction of a 790 KB ELF. No setting wrote or compiled mystery.c. |
protein-assembly | Xhigh and medium made structurally plausible gBlocks but resolved a modified-residue X as Y; the verifier expected the encodable GYG precursor expansion, so the donor sequence was absent. Lower settings produced no gBlock. |
qemu-startup | Xhigh booted Alpine and proved login/logout through a custom Python relay, but the verifier's real expect plus telnet flow captured no uname -r. Other settings parsed ISO structures without launching the VM. |
raman-fitting | Xhigh fit detector-axis features and wrote them as Raman coordinates, yielding 19196.4 and 10420.51 where the verifier expected approximately 1580.3 and 2670.08. Other settings wrote no result. |
regex-chess | The clean xhigh rerun and all fallback verifiers found no re.json. The original unscored xhigh attempt made substantial partial progress but never completed a verifier-backed full-suite result. |
torch-pipeline-parallelism | Every artifact passed existence and no-hook checks, but backward activation hooks were wrong. Xhigh's own self-test already showed layer-level backward mismatches even though forward outputs and parameter gradients matched. |
tune-mjcf | Xhigh preserved the final state but repeatedly measured 66–68% of reference runtime against a required maximum of 60%, then submitted the known-red candidate. Other settings never created model.xml. |
winning-avg-corewars | Xhigh spent much of a seven-hour trajectory building a custom pMARS simulator. Real pMARS results already showed several opponent thresholds failing, but the run continued and left a warrior passing only two of five. |
Common pattern 1: investigation displaced delivery
The most frequent failure was not an incorrect final answer; it was failure to reach a final artifact. This happened across rendering, reverse engineering, media extraction, emulation, and code generation. The repeated trajectory was:
- inspect the input;
- create a helper, parser, renderer, profiler, or simulator;
- find an ambiguity;
- switch representations or deepen the helper;
- reach timeout or process termination before writing the required path.
More reasoning often amplified this behavior. Xhigh spent 9.07 hours on extract-moves-from-video, 5.82 on path-tracing-reverse, and 4.83 on path-tracing, yet all three ended without the required file. An action-first policy should require a compilable or parseable baseline artifact early, then improve it against the real acceptance metric.
Common pattern 2: self-validation was circular or checked a proxy
Several attempts tested an internally convenient interpretation instead of the external contract:
- chess checked Stockfish against a self-transcribed but incorrect FEN;
- DNA and protein assembly weakened exact representation checks in custom validators;
- Windows and QEMU used custom screen/socket clients rather than the verifier-visible interaction path;
- the HTML sanitizer passed curated strings but not the browser-parsed malformed corpus;
- pipeline parallelism treated parameter-gradient agreement as encouraging even though required activation hooks disagreed.
The fix is not simply “run more tests.” The test must be independent and shaped like the acceptance path. A custom oracle that shares the implementation's assumptions can produce very high confidence in the wrong artifact.
Common pattern 3: unsupported interpretation became a commitment
Qwen often noticed ambiguity, selected a plausible interpretation, and then built increasingly sophisticated work on top of it without forcing an early falsification. Examples include adding a conventional 0x400000 base to a PIE extraction, mapping a modified protein residue to one amino acid, inventing a detector-to-Raman coordinate calibration, and blaming guest stalls on image corruption or a TCG bug without an A/B test.
This is where the lower-reasoning recoveries are most informative. Seven of the eight recovered tasks passed because the fallback chose a corrected technical or data-association path:
- authentic source provenance in
build-pov-ray; - no invented PIE base in
extract-elf; - correct filename-to-document bookkeeping in
financial-document-processor; - consecutive-frame motion rather than background drift in
video-processing; - verifier-matched primer decomposition in
dna-insert; - a lower-cost SQL plan in
query-optimize; - model-native query/passage prompts in
mteb-retrieve.
Only large-scale-text-editing was primarily a simpler-stopping win: xhigh had a nearly correct form, debugged for 61 minutes, and left a structurally invalid final script; medium preserved the explicit setreg form and passed.
Across those eight pairs, the passing fallbacks used only 5% fewer model calls and 21% less wall time than the failed xhigh attempts. Lower reasoning did not win merely by being shorter. It won by making a different technical choice and avoiding commitment to an attractive but unsupported interpretation.
Common pattern 4: known-red candidates were still submitted
The strongest evidence of weak trajectory control came from tasks where the model's own measurements already contradicted completion:
- sampler tests reported six failures;
- pipeline self-tests reported backward-hook mismatches;
- MJCF timing repeatedly missed the 60% threshold;
- real pMARS battles showed multiple losing opponent thresholds.
In each case, more diagnosis followed, but the best known candidate was not preserved and the unmet metric did not become a hard blocker. The agent needs an explicit acceptance vector, a retained best candidate, and a rule that every required component must be green before completion.
Harness failures kept separate
Two initial xhigh attempts were invalid because of infrastructure. One adapter path assumed /workspace although the task used /app; another session encountered a stale process after the wrapper changed. We reran both from clean containers and used only those clean outcomes in the 62/89 score. No residual task above is labeled a model failure solely because of those wrapper faults.
The trace audit therefore points to an execution-control problem more than a raw reasoning shortage: build a baseline artifact early, test the exact observable contract, treat hypotheses as hypotheses, preserve the best measured candidate, and stop diagnostic detours when they do not move the acceptance vector.
Reasoning effort is a routing decision
The fallback recovery rates decreased as the residual set became harder:
| Fallback | Recovery rate on attempted residual set |
|---|---|
| Medium | 5/27, 18.52% |
| Low | 2/22, 9.09% |
| Thinking off | 1/20, 5.00% |
These rates are not a fair head-to-head comparison of reasoning settings. Medium saw all xhigh failures; low saw only tasks that both xhigh and medium failed; thinking-off saw the hardest remaining residual. The experiment therefore does not establish that medium is globally better than low or off.
It does establish that deterministic escalation in only one direction is wasteful. After a high-effort failure, reducing reasoning can be a legitimate recovery strategy. The right production policy is likely a router that considers task shape and trajectory health:
- Start with a bounded setting appropriate to the task.
- Require a concrete artifact or decisive diagnostic early.
- Detect repeated reads, repeated plans, stagnant files, and rapidly growing context.
- Stop or restart an unhealthy trajectory before it consumes hours.
- On retry, vary reasoning effort and start from a clean container.
- Report the first-pass score separately from any adaptive best-of score.
What the two scores mean
The 69.66% xhigh result is the comparable single-setting result from this run. Every task received the same reasoning level, and the two infrastructure-corrupted attempts were replaced with clean reruns.
The 78.65% adaptive result measures an operator-assisted policy over multiple attempts. It is useful for estimating practical solvability and for designing retry routers, but it benefits from extra compute and post-failure setting selection. It should never be presented as a single-pass Terminal-Bench score.
This separation is more than labeling. Without it, retry-heavy evaluations reward compute without showing how much compute was spent or which choices were made after observing failures. LocalMaxxing's durable per-task results make both views reconstructable.
Practical recommendations
For anyone reproducing this experiment locally:
- Always preflight. Validate all 89 tasks, model identity, quantization, hardware, and prebuilt images before launching.
- Use a durable run directory. Multi-day runs need atomic checkpoints and
--resume auto. - Keep fallback sweeps separate. Never overwrite the canonical first-pass record.
- Treat context as a resource. Track cumulative input tokens, not only generated tokens.
- Use finite per-response limits. “Unlimited” wall time does not remove the endpoint context boundary.
- Add a progress watchdog. A long runtime is acceptable when files and tests are changing; repeated planning with no artifact is not.
- Verify infrastructure failures from clean containers. Do not mix harness repair with answer repair.
- Report compute with quality. Task-hours, model calls, and processed tokens are necessary context for an adaptive score.
Conclusion
A quantized 27B model on two consumer GPUs solved 62 of 89 Terminal-Bench 2.1 tasks in one xhigh pass. An adaptive sequence of lower-reasoning retries raised the practical solved set to 70 of 89.
The surprising lesson was not simply that more reasoning helps. It was that reasoning effort has failure modes. Xhigh unlocked difficult, multi-stage work, but it also enabled a small number of enormous trajectories that kept thinking after the useful work had stopped. Medium, low, and thinking-off settings recovered eight failures precisely because they changed that behavior.
For local agents, the next gains are likely to come from trajectory control as much as raw model quality: earlier tool use, explicit progress detection, bounded context growth, clean retries, and honest separation between first-pass and best-of results. LocalMaxxing CLI made those distinctions visible by preserving the task containers, verifier outcomes, traces, usage, and checkpoints needed to audit a five-day run.
