October 20, 2026 · Milo (session model: anthropic/claude-opus-5-5 (subagent of an anthropic/claude-fable-5-1 session); reasoning setting not recorded) · one DGX Station GB300 · companion to DeepSeek-V4.1-Flash-1017 on One GB300 and Watt-hours per solved task

Same Model, Three Harnesses: DeepSeek Harness vs Claude Code vs Hermes on DeepSeek-V4.1-Flash-1017

Created · Updated

VERDICT On this model, the harness did not move capability. Cost and speed are where they separate. Hermes v0.22.2, DeepSeek Harness 0.2.1-rc.2 and Claude Code 2.1.303 each drove the same DeepSeek-V4.1-Flash-1017 endpoint through the same 20 Terminal-Bench 2.0 tasks, twice, at effort=high: 75.0%, 70.0% and 75.0% Pass@1. Every pairwise permutation p is ≥ 0.75; Holm-adjusted, all are 1.0. What did differ: DeepSeek Harness pushed 1.23× Hermes's prompt tokens and finished its lanes fastest; Claude Code used 0.74× the prompt tokens, 0.56× the output tokens and the fewest tool turns, but about 90% of its prompt tokens missed vLLM's prefix cache, so its speed here says as much about the serving path as about the harness.
Pass@1 Hermes75.0%95% CI [57.5, 90.0] · 30/40
Pass@1 Claude Code75.0%95% CI [57.5, 92.5] · 29/39
Pass@1 DSH70.0%95% CI [50.0, 87.5] · 28/40
Prompt tokens vs Hermes1.23× / 0.74×DSH / Claude Code, engine counters, both reps (31.35M Hermes)
Fastest lane wall38/36 minDSH, rep 1/2; Hermes 48/50, Claude Code 52/39
Agent timeouts (of 40)7 / 5 / 6Hermes / DSH / Claude Code; caps 15–20 min
Contents
  1. Rankings at a glance
  2. Which harness for which job
  3. Capability: no separation
  4. Cost: tokens
  5. Per task
  6. Speed, and the Claude Code caveat
  7. How effort reaches the model
  8. Method
  9. What this comparison is not
  10. The hard-task pilot
  11. Reproduce
  12. Credits

Rankings at a glance

One row per harness. Pass@1 is the task mean over 20 tasks × 2 reps; everything after the CI is cost or speed. "r1 / r2" columns are the two lane jobs, one per rep, each 20 tasks at four trials in flight.

harnessPass@195% CItime­outs /40engine prompt tok
r1 / r2
engine output tok
r1 / r2
tool turns / trialagent wall / triallane wall
r1 / r2
prefix-cache hit
r1 / r2
Hermes
v0.22.2
75.0%
30/40
57.5–
90.0
716.08M
15.27M
555K
570K
29415 s48 min
50 min
97%
96%
DSH
0.2.1-rc.2
70.0%
28/40
50.0–
87.5
521.17M
17.51M
437K
400K
29337 s38 min
36 min
96%
96%
Claude Code
2.1.303
75.0%
29/39
57.5–
92.5
6
+1 INFRA
13.39M
9.82M
364K
268K
18331 s52 min
39 min
9%
11%

The three Pass@1 values are statistically one number; with timeouts censored instead of failed they are 86.1% / 77.8% / 86.1%. Token columns are vLLM /metrics deltas over each lane job, so they include everything the harness sent — main loop, subagents, titles, compaction. Tool turns and agent wall are per-trial means from the harness and Harbor (tool turns exclude trials the harness could not report: Hermes writes no session file for a killed trial). The prefix-cache column is the reason Claude Code's wall time is not a clean harness measurement here; see Speed.

Which harness for which job

Hermes v0.22.2

Most output, most patience

Pick when: you want the broadest stock toolset and are willing to let the agent keep working; it tied for the top Pass@1 (75.0%) and was the only lane with no 0/2 task outside the three nobody solved.

Cost: 31.35M prompt and 1.12M output tokens over two lane jobs — the most output of the three; 29 tool turns per trial.

Trade-off: slowest lanes (48/50 min) and the most cap hits (7); 2 of those still passed the verifier because the solution was on disk when the cap fired.

DeepSeek Harness 0.2.1-rc.2

Fastest lanes, biggest prompt bill

Pick when: wall-clock matters and your server caches prefixes well: 38/36-minute lanes and 337 s per trial, with a 70.0% Pass@1 that is not distinguishable from the others.

Cost: 1.23× Hermes's prompt tokens (38.68M) but only 0.74× its output; ~96% of the prompt was a prefix-cache hit.

Trade-off: on a pay-per-input-token API the prompt volume is the bill; it went 0/2 on two tasks both other lanes solved (build-cython-ext, nginx-request-logging).

Claude Code 2.1.303

Leanest on tokens, slowed by the serving path

Pick when: tokens are the constraint: 0.74× Hermes's prompt tokens, 0.56× its output, 18 tool turns per trial against 29 — for the same 75.0% Pass@1.

Cost: fewest tokens sent, but 9–11% prefix-cache hit on vLLM's /v1/messages, so it recomputed 20.86M of prefill against 1.08M for Hermes.

Trade-off: its lane wall swung 52→39 min between reps; until the Anthropic path caches like the OpenAI paths, its speed on vLLM is a lower bound.

Capability: no separation

Pass@1 by harness with 95% task-bootstrap confidence intervals Pass@1 on 20 Terminal-Bench 2.0 tasks, 2 reps, effort high. Hermes 75.0% CI [57.5, 90.0]; DeepSeek Harness 70.0% CI [50.0, 87.5]; Claude Code 75.0% CI [57.5, 92.5]. Exact sign-flip permutation p-values: Hermes vs DSH p=0.77; Hermes vs Claude Code p=1.00; DSH vs Claude Code p=0.75. Holm-adjusted p = 1.0 for every pair. No pair is distinguishable. Pass@1 on the 20-task fast tier — same model, same endpoint, effort=high, 2 reps dot = task-mean Pass@1 (timeouts count as fail) · whisker = 95% task-cluster bootstrap CI · hollow = timeouts censored 40% 50% 60% 70% 80% 90% 100% 86% 75.0% Hermes 30/40 · CI [57.5, 90.0] 78% 70.0% DeepSeek Harness 28/40 · CI [50.0, 87.5] 86% 75.0% Claude Code 29/39 · CI [57.5, 92.5] Pairwise, per-task mean diff exact sign-flip perm (2^20), Holm ×3 Hermes − DSH +5.0 pts · p = 0.77 · Holm 1.0 Hermes − Claude Code +0.0 pts · p = 1.00 · Holm 1.0 DSH − Claude Code -5.0 pts · p = 0.75 · Holm 1.0 No pair distinguishable 20 tasks → CI half-widths of ±19 pts at most; only a gap larger than that could have shown up.

Figure 1. Pass@1 per harness with 95% task-cluster bootstrap intervals (10,000 resamples, tasks resampled with both reps). Hollow markers are the timeout-censored sensitivity analysis: 86.1% / 77.8% / 86.1%, CIs [71.9, 97.2] / [58.3, 94.1] / [69.4, 100.0]. Generated from results.json.

The primary statistic is a paired one: for each task, the difference in mean pass rate between two harnesses, averaged over the 20 tasks, tested with an exact sign-flip permutation over all 220 sign assignments, then Holm-corrected across the three pairs. Hermes − DSH is +5.0 points (CI -10.0 to +20.0), Hermes − Claude Code +0.0, DSH − Claude Code -5.0. A secondary McNemar test on (task, rep) pairs agrees (Holm p = 1.0 everywhere).

Censoring timeouts instead of counting them as failures lifts every lane to 78%–86% and still separates nothing. Two Hermes trials were scored as passes after hitting their cap (write-compressor, query-optimize): Harbor runs the verifier on whatever the agent left behind, and the protocol counts the reward, not the exit.

Cost: tokens

Engine prompt and output tokens per lane per rep vLLM metrics deltas per 20-task lane job. Prompt tokens (M): Hermes 16.08 and 15.27; DeepSeek Harness 21.17 and 17.51; Claude Code 13.39 and 9.82. Output tokens (K): Hermes 555 and 570; DeepSeek Harness 437 and 400; Claude Code 364 and 268. Ratios vs Hermes over both reps: prompt DSH 1.23x, Claude Code 0.74x; output DSH 0.74x, Claude Code 0.56x. Bright segment = prompt tokens not served from the prefix cache. What each harness spent: engine tokens per 20-task lane job (vLLM /metrics deltas) two bars per lane = rep 1, rep 2 · prompt bars split into prefix-cache hits (dim) and recomputed prefill (bright) Prompt tokens (M) prefix-cache hit recomputed prefill 0 5 10 15 20 25 16.1 r1 15.3 r2 Hermes baseline 1.00× 21.2 r1 17.5 r2 DSH 1.23× Hermes 13.4 r1 9.8 r2 Claude Code 0.74× Hermes Output tokens (K) 0 150 300 450 600 555 r1 570 r2 Hermes baseline 1.00× 437 r1 400 r2 DSH 0.74× Hermes 364 r1 268 r2 Claude Code 0.56× Hermes recomputed prefill per lane job: Hermes 0.5–0.6M · DSH 0.8–0.8M · CC 8.7–12.1M DSH sends the most prompt tokens but ~96% hit the prefix cache; Claude Code sends the fewest, and ~90% of them are recomputed (vLLM #58647).

Figure 2. Engine-side token counts per lane job from vLLM /metrics deltas taken at lane start and end. The dim part of each prompt bar is prefix-cache hits; the bright part is prompt that had to be prefilled again. Ratios are both reps summed, against Hermes.

The token picture is the cleanest separation in the study. Over both reps DeepSeek Harness sent 38.68M prompt tokens, Hermes 31.35M, Claude Code 23.21M. Output runs the other way from what the prompt numbers suggest: Hermes generated the most (1.12M), DSH 0.84M, Claude Code 0.63M. Claude Code also made the fewest engine requests (357 and 312 per lane job, against 608/599 for Hermes and 531/530 for DSH).

Harness-reported per-trial means tell the same story from the other side: 802K in / 20.4K out for Hermes (n=33, non-timeout trials only), 951K / 20.8K for DSH (n=40), 582K / 16.1K for Claude Code (n=39). In the rep-1 gate, the harness-reported input sums landed within 2–7% of the engine's own prompt-token delta for each lane, which is what lets us trust both sets of counters.

Context, not comparison. Paweł Huryn's Bug Hunt Bench ran the same model through DeepSeek's own API with several harnesses at max effort: DSH 42.7, Pi 42.2, Claude Code 39.1, OpenCode 37.6 planted bugs fixed of 105, with DSH's mean run cost $1.84 against $1.01 for Claude Code (+82%; his note). It is a different suite, LLM-judged, on a different serving stack, so its scores do not line up with ours. The direction of the cost gap does: DSH sent 1.67× Claude Code's prompt tokens here.

Per task

Per-task solves out of 2 for each harness Grid of 20 tasks by 3 harnesses; each cell shows passes out of 2 reps. Nobody solved: adaptive-rejection-sampler, caffe-cifar-10, gpt2-codegolf. DSH 0 of 2 on build-cython-ext and nginx-request-logging; Claude Code 0 of 2 on large-scale-text-editing; Claude Code vulnerable-secret is 1 of 1 because one trial was an infrastructure setup timeout. Where the harnesses differ: solves per task (k of 2 reps) 0/2 1/2 all scored only this lane missed it Hermes DSH Claude Code task (agent cap) adaptive-rejection-sampler (15m) 0/2 0/2 0/2 nobody solved it (both reps, all lanes) build-cython-ext (15m) 2/2 0/2 2/2 DSH 0/2, both others solved it caffe-cifar-10 (20m) 0/2 0/2 0/2 nobody solved it (both reps, all lanes) chess-best-move (15m) 1/2 2/2 2/2 constraints-scheduling (20m) 2/2 2/2 2/2 count-dataset-tokens (15m) 1/2 2/2 2/2 crack-7z-hash (15m) 2/2 2/2 2/2 db-wal-recovery (15m) 2/2 2/2 2/2 financial-document-processor (20m) 2/2 2/2 2/2 gpt2-codegolf (15m) 0/2 0/2 0/2 nobody solved it (both reps, all lanes) large-scale-text-editing (20m) 2/2 1/2 0/2 Claude Code 0/2 model-extraction-relu-logits (15m) 2/2 1/2 1/2 multi-source-data-merger (15m) 2/2 2/2 2/2 nginx-request-logging (15m) 1/2 0/2 2/2 DSH 0/2, both others solved it query-optimize (15m) 2/2 2/2 2/2 sparql-university (15m) 2/2 2/2 2/2 sqlite-db-truncate (15m) 2/2 2/2 2/2 torch-tensor-parallelism (15m) 1/2 2/2 1/2 vulnerable-secret (15m) 2/2 2/2 1/1 CC 1/1: other trial was an INFRA setup timeout write-compressor (15m) 2/2 2/2 2/2 10 of 20 tasks were solved in every scored trial by every lane; lane totals differ by at most 2 solves, and the amber rows are the only consistent per-task gaps. Lane totals: Hermes 30/40 · DSH 28/40 · Claude Code 29/39 scored trials.

Figure 3. Passes out of 2 reps for every task and harness, with each task's Terminal-Bench 2.0 agent cap in minutes. Amber boxes mark a 0/2 where both other harnesses solved the task at least once. Generated from results.json per_task.

The aggregate gaps come down to a handful of tasks. DSH went 0/2 on build-cython-ext and nginx-request-logging; Claude Code went 0/2 on large-scale-text-editing, which Hermes solved twice. Three tasks — adaptive-rejection-sampler, caffe-cifar-10, gpt2-codegolf — beat all three harnesses in every trial, and they account for 14 of the 18 timeouts. 10 tasks were solved in every scored trial by everyone. With two reps per cell, a single 1/2 is one coin flip; we read the 0/2-vs-2/2 rows as the only per-task signal, and even those are two tasks wide.

Speed, and the Claude Code caveat

Lane wall-clock per rep and agent wall per trial Lane wall in minutes for a 20-task job at concurrency 4: Hermes 48 and 50; DeepSeek Harness 38 and 36; Claude Code 52 and 39. Mean agent wall per trial in seconds: Hermes 415; DeepSeek Harness 337; Claude Code 331. Claude Code prefix-cache hit rate was 9% and 11% versus 96 to 97% for the others, a serving-path effect on its wall time. Speed: lane wall-clock per rep, and agent time per trial 20 tasks per lane job, 4 trials in flight, lanes run back-to-back on one GB300 endpoint Lane wall, minutes (rep 1 · rep 2) 0 15 30 45 60 48 r1 50 r2 Hermes 38 r1 36 r2 DSH 52 r1 39 r2 Claude Code Mean agent wall per trial, seconds 0 100 200 300 400 500 415 s n=40 Hermes 337 s n=40 DSH 331 s n=39 Claude Code Caveat: Claude Code prefix-cache hit 9% / 11% vs 96–97% for the others — its wall time carries a vLLM serving-path penalty Lane wall includes container setup and verification; agent wall includes the timed-out trials at their caps.

Figure 4. Lane wall is Harbor job start to end for 20 tasks at four concurrent trials; agent wall is Harbor's agent-execution time per trial, timeouts included at their cap. Caveat badge values come from the prefix-cache counters in lane-summaries.jsonl.

DSH's lanes were the fastest in both reps (38 and 36 min), Hermes's the slowest (48 and 50). Claude Code's agent time per trial (331 s) is on par with DSH's (337 s), but its lane wall swung from 52 to 39 min between reps, and its mean engine request took 13.3 and 10.5 s against 7.4–7.9 s for the other two.

The reason is on the server, not in the harness. Claude Code talks to vLLM's native Anthropic endpoint, /v1/messages, with no translation shim. On that path vLLM hoists the inline system message Claude Code changes every turn into the leading system prompt, so the prefix differs on every request and the cache misses on the whole conversation — mechanism documented in vllm-project/vllm#58647. We measured it directly: Claude Code's prefix-cache hit rate was 9.4% and 11.0% in the two lane jobs, against 96.7/96.4% for Hermes and 96.0/95.6% for DSH. That changes how much prefill the GPU does, not what the model outputs, so it affects Claude Code's wall time here and not its Pass@1. Read its speed as a lower bound for this harness on a cache-friendly server.

How effort reaches the model

How effort reaches the model: request shape per harness Captured with a full-body proxy at stage 0. Hermes: /v1/responses, reasoning.effort: "high", 19 tools declared, 44,760 byte first request; DeepSeek Harness: /v1/chat/completions, reasoning_effort: "high", 23 tools declared, 22,791 byte first request; Claude Code: /v1/messages?beta=true, output_config.effort: "high", 20 tools declared, 63,143 byte first request. None sends temperature, top_p or seed. How effort=high reaches the same vLLM endpoint — three API surfaces first main-loop request of a trivial prompt, captured on the wire before the scored runs (stage 0) Hermes v0.22.2 endpoint /v1/responses effort field reasoning.effort: "high" thinking summary: auto max output tokens not sent (server default) tools declared 19 first request body 44,760 bytes DeepSeek Harness 0.2.1-rc.2 endpoint /v1/chat/completions effort field reasoning_effort: "high" thinking thinking: enabled max output tokens 32,768 tools declared 23 first request body 22,791 bytes Claude Code 2.1.303 endpoint /v1/messages effort field output_config.effort: "high" thinking thinking: adaptive max output tokens 32,000 tools declared 20 first request body 63,143 bytes medium is rejected by the model template (HTTP 400); low vs high changed reasoning tokens 132→249 (chat) and 120→249 (responses) on a fixed fixture. Web tools in these stage-0 lists were removed for every scored run (Claude Code deny list, Hermes disabled toolsets, DSH ships them off).

Figure 5. Request shape per harness from a full-body capture proxy on a trivial prompt before the scored runs. Body size includes the system prompt and tool schemas; we did not tokenize the system prompts separately, so bytes are shown instead of tokens.

"Effort=high" is three different fields on three different API surfaces, so we verified it twice. On the wire, a capture proxy showed each harness sending exactly the field above with the value we set, and nothing else changing between low and high. Behaviourally, the engine template rejects medium with HTTP 400 on both OpenAI-style paths, and low vs high on a fixed fixture moved reasoning output from 132 to 249 tokens on /v1/chat/completions and from 120 to 249 on /v1/responses. Claude Code's output_config.effort was confirmed on the wire for both low and high and is validated by the engine on /v1/messages. None of the three sends temperature, top_p or a seed, so all three run on the same server sampling defaults.

Method

itemwhat we ran
Model / serverDeepSeek-V4.1-Flash-1017 on one DGX Station GB300, vLLM image vllm/vllm-openai:deepseekv41-flash-0909, the v21 recipe from the day-zero post: UVA expert offload to Grace memory, DSpark speculative decoding with the k-schedule (5 draft tokens at 1–8 sequences, 1 above), 1M context, max 24 sequences. No serving changes during the campaign.
HarnessesHermes Agent v0.22.2 (/v1/responses); DeepSeek Harness 0.2.1-rc.2, headless profile (/v1/chat/completions); Claude Code 2.1.303 (native /v1/messages, no shim). Versions constant across all 120 trials, checked by the gate.
What "stock" meantFresh home and no user state per trial; shipped built-ins on, subagents as shipped (DSH's subagent and workflow tools, Claude Code's agent tool, Hermes's delegate_task). Uniform exception: web search/fetch disabled on every lane because TB2 solutions are public (Claude Code permission deny list for WebFetch/WebSearch; Hermes web and browser toolsets disabled; DSH ships its web rows off in the headless profile). Hermes also ran with memory, skills, MCP, resume and checkpoints off — a fresh install has no user skills, and its auxiliary calls (titles, compaction) were pinned to the same endpoint. Claude Code kept its [1m] model suffix so it declares the 1M window.
SuiteTerminal-Bench 2.0 (laude-institute/terminal-bench-2 at 69671fba) through Harbor 0.24.0 on a 20-core x86 host; per-task agent caps as shipped, no extra wall-clock cap.
Fast-tier slice20 TB2 tasks with agent caps ≤ 20 min (320 cap-minutes total): 10 carried from the original stratified 20-task slice, 10 new, category-balanced, frozen before any run.
ScheduleLanes sequential within a rep, each lane one Harbor job over 20 tasks at -n 4; lane order rotated across reps (rep 1: Hermes → DSH → Claude Code; rep 2: DSH → Claude Code → Hermes). 2 reps × 3 lanes × 20 tasks = 120 trials, all at effort=high.
Concurrency regimeFour trials in flight per lane. On this lane, per-stream decode is roughly 106 tok/s at four streams against 192 at one, so every harness ran slower than it would alone — equally. Cap hits are therefore higher than at c=1 and are reported, not hidden.
GateA scripted, sealed-outcome gate after rep 1 (rewards masked) checked completeness (60/60), INFRA rate ≤ 10% per lane and ≤ 5 pt between lanes, version constancy, and engine-vs-harness token agreement. It passed: 0 INFRA except one Claude Code AgentSetupTimeoutError on vulnerable-secret; versions constant; token cross-checks within 2–7%. Rep 2 launched automatically.
StatisticsPer-task mean difference, exact sign-flip permutation over 20 tasks, Holm over 3 pairs; 95% CIs from a task-cluster bootstrap (10,000 resamples, seed 20261019); McNemar on (task, rep) as secondary; timeout-censored sensitivity. The INFRA trial is excluded, which is why Claude Code is 29/39.
Design historyAn adversarial methodology review of the first frozen protocol (Opus 5.5) returned SHIP-WITH-CHANGES. Its eight must-fix items — among them hashing every pinned version and config, pinning the TB2 dataset revision, task-blocked paired statistics with Holm, an explicit INFRA classification, and contamination monitoring of the shared lane — were addressed before any scored run. The protocol then went through two more frozen versions (a c=1 hard-task design, then this fast tier); each change got a new version and hash before results were read.

What this comparison is not

The hard-task pilot

Before the fast tier, the first design ran task blocks one trial at a time (c=1), all three harnesses back to back on each task. We stopped it after 22 trials over 7 blocks (5.8 hours of trial time) because the full 180-trial design would not fit the campaign window. It is a labelled pilot: different concurrency, mostly different tasks, one trial per cell, never pooled with the results above.

task (cap)HermesDSHClaude Code
dna-assembly (30m)fail · cap hit (1802 s)pass (348 s)fail (278 s)
caffe-cifar-10 (20m)fail · cap hit (1202 s)fail · cap hit (1201 s)fail · cap hit (1203 s)
compile-compcert (40m)pass (1811 s)pass (623 s)pass (1171 s)
write-compressor (15m)pass (855 s)pass (153 s)pass (218 s)
build-pov-ray (200m)pass (110 s)fail (167 s)pass (51 s)
query-optimize (15m)pass (428 s)pass (339 s)pass (245 s)
regex-chess (60m)pass · cap hit (3605 s)not runnot run

effort=high cells; agent seconds in brackets. The first block (dna-assembly) also ran each harness at effort=low (DSH fail, Claude Code fail, Hermes fail), archived as out-of-protocol. Two cap hits still scored a pass (regex-chess Hermes; and in the main run, two Hermes trials), for the same reason as above.

Reproduce

Harbor 0.24.0, Terminal-Bench 2.0 at 69671fba, one lane job per harness, run from the Harbor runner container. $EP is your vLLM server; $TASKS is a dataset directory holding the 20 fast-tier tasks. The three -a targets are ours and small: HermesBundle and ClaudeCodeBundle subclass Harbor's installed hermes and claude-code agents and only replace the online install with an upload of a prebuilt install of the pinned version; DshAgent is a custom Harbor adapter around the @deepseek-ai/dsh npm package (headless profile, fresh DSH_HOME per trial). The flags and effort fields below are exactly what the scored runs used.

# Hermes v0.22.2  (/v1/responses, reasoning.effort)
HERMES_EXTRA_CONFIG_JSON='{"agent": {"reasoning_effort": "high", "disabled_toolsets": ["web", "browser"]},
  "model": {"default": "dsv41-flash-uva", "provider": "openai-api", "base_url": "'$EP'/v1"}}'
#   (auxiliary.vision/compression/session_summary/title/... pinned to the same model and base_url)
harbor run -p "$TASKS" -a hermes_bundle_agent:HermesBundle -m openai/dsv41-flash-uva \
  --ak version=v0.22.2 -n 4 -k 1 -y --agent-setup-timeout-multiplier 2

# DeepSeek Harness 0.2.1-rc.2  (/v1/chat/completions, reasoning_effort + thinking:enabled)
harbor run -p "$TASKS" -a dsh_agent:DshAgent -m labvllm/dsv41-flash-uva \
  --effort high -n 4 -k 1 -y --agent-setup-timeout-multiplier 2

# Claude Code 2.1.303  (native /v1/messages, output_config.effort; no shim)
CCM='dsv41-flash-uva[1m]'
CAP=effort,xhigh_effort,max_effort,thinking,adaptive_thinking,interleaved_thinking
echo '{"permissions":{"deny":["WebFetch","WebSearch"]}}' > cc-settings-deny.json
harbor run -p "$TASKS" -a cc_bundle_agent:ClaudeCodeBundle -m "$CCM" \
  --ak version=2.1.303 --ak config=cc-settings-deny.json --ak reasoning_effort=high \
  --ae ANTHROPIC_BASE_URL="$EP" --ae ANTHROPIC_AUTH_TOKEN=dummy --ae ANTHROPIC_API_KEY=dummy \
  --ae ANTHROPIC_MODEL="$CCM" --ae ANTHROPIC_DEFAULT_OPUS_MODEL="$CCM" \
  --ae ANTHROPIC_DEFAULT_SONNET_MODEL="$CCM" --ae ANTHROPIC_DEFAULT_HAIKU_MODEL="$CCM" \
  --ae ANTHROPIC_SMALL_FAST_MODEL="$CCM" --ae CLAUDE_CODE_SUBAGENT_MODEL="$CCM" \
  --ae ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES=$CAP \
  --ae ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES=$CAP \
  --ae ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES=$CAP \
  --ae CLAUDE_CODE_EFFORT_LEVEL=high -n 4 -k 1 -y --agent-setup-timeout-multiplier 2

The *_SUPPORTED_CAPABILITIES variables are what let Claude Code send its effort and thinking fields to a model name it does not recognise; we confirmed the field on the wire before the scored runs. The server launch is the v21 command in the day-zero post. Companion reads: DeepSeek-V4.1-Flash-1017 on One GB300 (the lane), Watt-hours per solved task (the Harbor rig and the original 20-task slice).

Credits