cd /news/artificial-intelligence/pi-vs-the-official-deepseek-harness-… · home topics artificial-intelligence article
[ARTICLE · art-110138] src=github.com ↗ pub= topic=artificial-intelligence verified=true sentiment=· neutral

Pi vs. the official DeepSeek Harness on the same local model (Qwen3.8-27B)

Pi 0.73.1 outperformed the official DeepSeek Harness (DSH) 0.1.1-rc.2 in a 16-run coding benchmark on the same local Qwen3.8-27B model, passing 6/8 externally checked runs versus DSH's 4/8, with mean external scores of 0.825 and 0.680. Pi also used 14.0% less total wall time (6,455.5 vs 7,356.5 seconds) and had 10.7% higher aggregate generation throughput, but the author cautions that the small sample size and single separating fixture do not support a general ranking.

read15 min views1 publishedAug 25, 2026
Pi vs. the official DeepSeek Harness on the same local model (Qwen3.8-27B)
Image: Michielbdejong (auto-discovered)

Date: 2026-08-23 (America/Los_Angeles)

In this 16-run, coding-only benchmark, Pi led the official DeepSeek Harness (DSH) on the measured sample. Pi passed 6/8 externally checked runs versus DSH's 4/8, with mean external scores of 0.825 and 0.680 respectively. Pi won two paired task/trial comparisons, six tied, and DSH won none. Both separating pairs were taskflow

: Pi passed both; DSH timed out with partial scores of 0.28 and 0.56.

DSH also used 14.0% more total wall time (7,356.5 versus 6,455.5 seconds). It produced 14.8% more completed-response output tokens and had 10.7% lower aggregate generation throughput. These are whole-harness outcomes on one local model/runtime, not evidence that Pi is universally better. Four fixtures, two trials, and only two non-tied pairs are too small for a general ranking or a statistically persuasive winner claim.

This is a separate follow-up to the checked-in Pi versus Prime study. It does not replace or modify that study.

Of the four tasks, two were at ceiling for both harnesses (make-ci-green

and add-feature

, 2/2 each) and one was at floor for both (webcore

, 0/2 each, neither harness changing a file). Exactly one, taskflow

, separated them. The entire pass-rate and mean-score margin therefore comes from a single fixture, and only two of eight paired cells were non-tied. That supports a lead on the measured sample and the cost/latency observations, not a general harness ranking; no confidence interval or significance claim is warranted. The floor task also argues against fixture curation in Pi's favor. See Limitations for the full list.

Metric Pi 0.73.1 DSH 0.1.1-rc.2 DSH vs Pi
External passes 6/8 (75%) 4/8 (50%) -2 passes
Mean external score 0.825 0.680 -0.145
Paired wins / losses / ties 2 / 0 / 6 0 / 2 / 6 Pi +2 wins
Timeouts 3 4 +1
Total wall time 6,455.5 s 7,356.5 s +14.0%
Median wall time 906.5 s 1,055.2 s +16.4%
Endpoint requests 86 80 -7.0%
Completed responses 83 76 -8.4%
Completed-response input tokens 1,009,881 1,130,071 +11.9%
Completed-response output tokens 26,587 30,520 +14.8%
Median output tokens per run 3,012 2,981.5 -1.0%
Aggregate prompt tokens/s 387.47 382.55 -1.3%
Aggregate generation tokens/s 12.74 11.38 -10.7%
Mean time to first token 31.40 s 38.87 s +23.8%

The token totals cover responses that delivered a final usage trailer. Seven timed-out request streams (three Pi, four DSH) were cancelled and therefore have no final usage record; their partial final-stream tokens are omitted. A timeout does not automatically mean incorrect code: Pi's second taskflow

cell reached the cap but its resulting workspace passed the hidden checker.

Task Pi passes DSH passes Pi mean score DSH mean score Pi mean wall DSH mean wall
make-ci-green
2/2 2/2 1.00 1.00 221.7 s 385.1 s
add-feature
2/2 2/2 1.00 1.00 608.0 s 892.6 s
taskflow
2/2 0/2 1.00 0.42 1,197.4 s 1,200.4 s
webcore
0/2 0/2 0.30 0.30 1,200.7 s 1,200.2 s

On the four pairs where both harnesses passed, Pi was faster by 144.3 to 291.8 seconds. Both harnesses made no file changes in either webcore

trial, so its unchanged fixture score of 0.30 did not separate them.

Pass

is the external hidden checker's result. Cap

means the harness process reached the common 1,200-second limit. Output tokens exclude a capped cell's unterminated final stream.

Trial Task Harness Score Pass Cap Wall (s) Requests Output tokens Changed files
1 make-ci-green
Pi 1.00 yes no 229.7 6 1,253 6
1 make-ci-green
DSH 1.00 yes no 374.0 7 2,499 6
1 add-feature
DSH 1.00 yes no 874.9 11 7,875 1
1 add-feature
Pi 1.00 yes no 597.6 12 5,483 2
1 taskflow
Pi 1.00 yes no 1,194.6 17 5,693 7
1 taskflow
DSH 0.28 no yes 1,200.5 12 3,586 0
1 webcore
DSH 0.30 no yes 1,200.2 10 1,619 0
1 webcore
Pi 0.30 no yes 1,200.5 6 1,120 0
2 make-ci-green
DSH 1.00 yes no 396.2 9 3,012 6
2 make-ci-green
Pi 1.00 yes no 213.7 6 1,518 6
2 add-feature
Pi 1.00 yes no 618.5 14 5,804 2
2 add-feature
DSH 1.00 yes no 910.3 10 7,253 2
2 taskflow
DSH 0.56 no yes 1,200.3 12 2,951 3
2 taskflow
Pi 1.00 yes yes 1,200.1 17 4,506 7
2 webcore
Pi 0.30 no yes 1,200.8 8 1,210 0
2 webcore
DSH 0.30 no yes 1,200.1 9 1,725 0

The field-whitelisted source for this table and all aggregate calculations is results/2026-08-23-clean.json. It contains cell metadata, scores, diff hashes/status, request identity, timing, and usage, but no full prompts, model responses, checker output, credentials, or machine-specific absolute paths.

Primary sources were accessed 2026-08-23. The benchmark pins the official deepseek-ai/deepseek-harness

release dsh-v0.1.1-rc.2, commit

, npm package

b150a551b8d465e31e418e1b2eaf5e79bbb7d28e

@deepseek-ai/dsh@0.1.1-rc.2

, and MIT license. This is an RC/developer-preview release, so its behavior and configuration may change quickly.

The official one-shot invocation is:

dsh --profile headless --patch <benchmark.cordis.patch.yml> "<exact task>"

Before inference, the runner resolves that same composition without booting it:

dsh --profile headless --patch <benchmark.cordis.patch.yml> --dump-config

The shipped headless bundle creates a fresh persisted agent, submits the positional task as an ordinary user message, waits for quiescence, and exits without starting a server. The custom local route uses the official @deepseek-ai/dsh-llm-pi-ai adapter, backed in this release by

@earendil-works/pi-ai

0.82.1. That dependency is a transport/model adapter inside DSH; it is not the Pi coding-agent harness arm.DSH's shipped default model is deepseek-v4-flash

through its native DeepSeek adapter. The native adapter defaults reasoning effort to high and its own request cap to 256,000. A hand-declared generic route instead has fallback capacities of 262,144 context and 32,768 output, no reasoning capability unless declared, provider-default sampling when fields are omitted, and a normal agent-level retry policy of five retries. Those defaults were not silently accepted: the benchmark declared the exact oMLX model/capacities, medium reasoning, and zero agent-level retries to match a single Pi attempt.

An unknown OpenAI-compatible endpoint is not safely auto-detectable. DSH's official adapter documentation says it otherwise assumes OpenAI-style developer

role, max_completion_tokens

, and bare reasoning_effort

. oMLX requires explicit compatibility values here:

api: openai-completions
baseURL: http://127.0.0.1:<per-cell-proxy>/v1
reasoning: medium
retryPolicy: {mode: normal, maxRetries: 0}
compat:
  supportsDeveloperRole: false
  supportsReasoningEffort: false
  supportsUsageInStreaming: true
  maxTokensField: max_tokens
  thinkingFormat: qwen-chat-template
models:
  - id: Qwen3.8-27B-MLX-oQ8e-mtp
    contextWindow: 98304
    maxTokens: 32000
    reasoningEfforts: {medium: medium}

The real key never entered this configuration. DSH saw a dummy environment credential; the loopback proxy replaced it only on the upstream request.

The official base bundle ships a broad native tool/control surface: bash or PowerShell, background jobs, filesystem and search tools, skills, todo/goal tools, string replacement, web search, subagents/forks, workflows, and Ralph iteration, plus compaction and result-pruning infrastructure. Headless defaults to workspace-write

plus approval prompts.

For comparability and unattended execution, DSH used native presentation mode and native remaining tools, but the overlay disabled:

  • repository instruction/context-file and skills, matching Pi's flags;
  • web search, because the outer sandbox allowed only the local proxy;
  • LLM session-title generation, which would add unscored model traffic;
  • subagent, fork, workflow, and Ralph model fan-out, enforcing the no-concurrent oMLX rule.

The fan-out restriction is not a handicap specific to DSH. With one model loaded on a single oMLX server, concurrent subagent requests would serialize on that endpoint anyway, so fan-out buys no wall-clock parallelism here. Allowing it would also break the metering invariant that no two requests overlap inside a cell, which the analyzer enforces.

DSH retained 19 model-facing tool schemas per request; Pi retained its four stock built-ins. DSH ran danger-full-access

only inside the stricter outer Seatbelt policy, removing headless approval prompts without broadening actual filesystem or network access. This is a whole-harness comparison, not a tool-schema-matched ablation.

The identity correction is material: the local model is Qwen3.8-27B-MLX-oQ8e-mtp

; no local oQ8c model exists. The benchmark used oQ8e only.

  • MacBook Pro, Apple M4 Max, 16 CPU cores, 128 GB unified memory

  • macOS 26.5.2 build 25F84; Node.js 25.6.1

  • oMLX app/server 0.6.1

  • exact endpoint http://127.0.0.1:8000/v1

  • exact model Qwen3.8-27B-MLX-oQ8e-mtp

  • persisted 98,304-token context; 32,768 model output limit

  • temperature 0.6, top-p 0.95, top-k 20, repetition penalty 1.0

  • thinking enabled at medium; thinking-budget mode disabled

  • native MTP enabled at draft depth 4

  • DFlash, SpecPrefill, TurboQuant KV, VLM MTP, guided grammar, ANE prefill, and remote code disabled

The model and server settings were read and verified, not rewritten. Both harnesses sent max_tokens: 32000

, omitted request-level temperature, top-p, and reasoning_effort

so the same persisted runtime controls applied, and sent the same Qwen chat-template kwargs (enable_thinking: true

, preserve_thinking: true

). The proxy verified every measured inference used POST /v1/chat/completions

and the exact oQ8e model.

The four tasks came from minghinmatthewlam/openbench at exact commit

9e26c96a7df012ca9173e9725211c4cc58e11948

:| Task | SHA-256 of task tree | Purpose | |---|---|---| make-ci-green | 4a32fed72b90141fe985416c4b7d44d4f7b34c453fde69773e326b3994f9ce21 | Multi-module repair from a failing suite | add-feature | d38f578795043c0f10f139647374d3d2563fbea21161ae978ce3c3297f9dbfba | Recursive config-include feature | taskflow | 6ed568c66534b0f7839438bfd34c0696a2b6f4a07d2f9469c1541c7e0be074bb | Orchestration/scheduling logic repair | webcore | a5119ebfed497c749d2d0c93ea41b85dc1fbcd35d22fb0377a836ffa411f4dde | Connected routing/mounting feature |

Each cell received the exact fixture instruction.md

plus the same fixed suffix:

Work only in the current workspace. Implement the requested coding change, run the relevant tests, and finish when the implementation is correct.

There were two trials per task and harness. Trial one alternated which harness went first by task; trial two reversed every task's order. Runs were serial, not concurrent.

Every cell had a fresh copied workspace, initialized git baseline, HOME, temp directory, Pi/DSH configuration, and session. A macOS Seatbelt profile denied external network, permitted only the per-cell loopback proxy, limited writes to the cell workspace/HOME/temp, and exposed only the exact isolated Pi and DSH installation roots plus system runtime paths. The runner denied 12 representative hidden-checker path probes before any inference.

The hidden checker.sh

ran outside the harness after every normal exit or timeout, with a separate 180-second checker limit. The measured scores came from the pinned OpenBench task tree. After adversarial review, all 16 saved workspaces were regraded without inference: the runner first required the complete task tree to match the hard-coded SHA-256 above, then invoked each checker with the benchmark orchestrator's exact sys.executable

, a minimal allowlisted environment (no orchestrator credentials), and a separate Seatbelt profile that denied network, limited reads to the pinned task/workspace plus system runtimes, and limited writes to the workspace/checker temp directory. Every score, pass flag, and checker exit matched the original result. This separate per-run evidence is in the sanitized JSON; the published runner now applies the hardened boundary to every new checker execution as well. Harness self-reports and visible test claims were never scored. Golden solutions passed all four checkers; untouched fixtures produced scores 0.312, 0.400, 0.280, and 0.300, confirming the checker path and partial-score behavior before traffic.

The metering proxy logged no message bodies. It recorded request IDs, method, path, model, selected request fields, tool count, event timing, response bytes, and usage/duration metadata. The analyzer required:

  • exactly one terminal response/error event per request;
  • no overlapping requests inside a cell;
  • exact endpoint and model identity;
  • the complete 4-task × 2-trial × 2-harness matrix with unique IDs;
  • exact task-tree hashes;
  • two consecutive oMLX samples with zero active and waiting requests at controlled boundaries.

All checks passed. Seven proxy errors are expected cancellation terminals for the seven timed-out final streams. No Pi, DSH, or benchmark child remained after the matrix.

Two orchestration preflights failed before any benchmark trial and are operational notes, not measurements:

  • oMLX's hard memory watermark blocked the first attempt.
  • After the previously resident Qwen3.6-35B-A3B-bf16

model was unloaded (oMLX logged 65.39 GB freed), the balanced prefill guard blocked the second.

Global oMLX Memory Guard was therefore changed from balanced to aggressive for benchmark traffic. After all traffic, the runner restored it to balanced in a finally

path. An independent authenticated check at 2026-08-23 15:40:16 -0700 confirmed balanced plus two consecutive oMLX 0.6.1 samples with zero active and zero waiting requests. This evidence is included in the sanitized JSON. No other persistent setting was changed.

Before the full protocol, the runner successfully completed a matched, excluded make-ci-green

smoke pair:

Harness External pass Wall Requests Output tokens
DSH yes 404.3 s 8 1,905
Pi yes 252.0 s 6 1,283

The smoke gate confirmed successful process/checker exits, zero proxy errors, and identical observed request settings before allowing the full matrix.

The same loaded model, endpoint, hardware, server process, persisted sampling, reasoning mode, MTP depth, task bytes, prompt suffix, checker, isolation, and wall-clock cap were shared. That removes obvious model/runtime substitutions.

What remains deliberately different is the harness: system-prompt assembly, tool schemas, context/history management, retry/compaction policies, editing strategy, termination decisions, and request count/shape. DSH's larger prompt and 19-tool surface likely contribute to its higher input-token total and latency, but this benchmark does not isolate a single causal mechanism. Reported token throughput is also workload-weighted: prompt length, cache reuse, and generation length differ because the harnesses chose different trajectories on the same model. It should not be read as a pure oMLX kernel benchmark.

The author has no affiliation with earendil-works (Pi) or deepseek-ai (DSH). Neither harness is a dependency of pdd, and pdd itself is not an arm of this benchmark. Pi is the harness the author uses day to day, which is why it is the reference arm here and in the Pi-versus-Prime study; readers should treat that as a bias to check rather than a disclosed-and-therefore-settled detail. The reverse experiment, the same protocol run by someone whose daily driver is DSH, is invited. The pinned locks and repro commands below exist to make that cheap.

  • Four fixtures and two trials are too small for a general harness ranking. With only two non-tied pairs, even both favoring Pi is weak inferential evidence; no confidence interval or significance claim is warranted.
  • Runs were balanced but not randomized. One long local session can contain thermal, cache, memory-pressure, or power drift.
  • All trials used one model, one quantization, one machine, one reasoning level, and one timeout.
  • Seven final partial streams have no token-usage trailer, so usage totals undercount work in capped cells. webcore

was too difficult for either harness at this budget and provided no separation.- DSH is an RC/developer-preview release and its generic transport is a newer, forked pi-ai package than Pi 0.73.1's transport. This is unavoidable for the pinned official release and is part of the DSH harness as shipped.

  • DSH retained more native tool schemas than Pi. The capability boundary was equalized for network/filesystem/model concurrency, not schema count.
  • Seatbelt is a best-effort local benchmark boundary, not a hardened multi-tenant security sandbox.

A stronger follow-up would use more held-out repositories, randomized order, at least five trials per task, multiple budgets, and explicit thermal/power telemetry. Tool-schema and system-prompt ablations would help explain the whole-harness result.

Use an isolated tool root; do not install either harness globally. The exact dependency graphs used for the published run are checked in under tool-lock/pi and

. Their

tool-lock/dsh

package-lock.json

SHA-256 values are respectively c2c6cbeb831c9748f7071e32d81240ed017adc2a81aac7153ea5638821ca6275

and d09b9445494e44c7f6239524acc4a82e751b67006f2b10ca3977eba94abd739a

; both match the actual benchmark installations byte-for-byte. The commands below intentionally use /private/tmp

, those locks, and exact source commits:

bench_root=/private/tmp/pdd-pi-dsh-bench-repro
mkdir -p "$bench_root/tools/pi" "$bench_root/tools/dsh"

cp research/omlx-qwen38-pi-deepseek-harness-2026-08-23/tool-lock/pi/package*.json \
  "$bench_root/tools/pi/"
cp research/omlx-qwen38-pi-deepseek-harness-2026-08-23/tool-lock/dsh/package*.json \
  "$bench_root/tools/dsh/"
npm ci --prefix "$bench_root/tools/pi" --no-audit --no-fund
npm ci --prefix "$bench_root/tools/dsh" --no-audit --no-fund

git clone https://github.com/deepseek-ai/deepseek-harness.git \
  "$bench_root/tools/deepseek-harness"
git -C "$bench_root/tools/deepseek-harness" checkout \
  b150a551b8d465e31e418e1b2eaf5e79bbb7d28e

git clone https://github.com/minghinmatthewlam/openbench.git \
  "$bench_root/openbench"
git -C "$bench_root/openbench" checkout \
  9e26c96a7df012ca9173e9725211c4cc58e11948

Before inference, load Qwen3.8-27B-MLX-oQ8e-mtp

in oMLX 0.6.1 with the exact persisted settings above, ensure no active/waiting requests, and confirm the global Memory Guard target/rollback. The runner validates the hidden-checker boundary and DSH composed configuration, performs the matched smoke pair, gates on request parity, runs the balanced matrix, and restores Memory Guard in its outer finally

block:

eval "$(conda shell.zsh hook)"
conda activate pdd

python research/omlx-qwen38-pi-deepseek-harness-2026-08-23/benchmark.py \
  --tasks-root "$bench_root/openbench/tasks" \
  --pi "$bench_root/tools/pi/node_modules/.bin/pi" \
  --dsh "$bench_root/tools/dsh/node_modules/.bin/dsh" \
  --tool-root "$bench_root/tools" \
  --run-base "$bench_root/run" \
  --trials 2 \
  --timeout-seconds 1200 \
  --smoke-timeout-seconds 600

python research/omlx-qwen38-pi-deepseek-harness-2026-08-23/revalidate_checkers.py \
  "$bench_root/run/benchmark/results.jsonl" \
  --tasks-root "$bench_root/openbench/tasks" \
  --raw-root "$bench_root/run/benchmark/raw" \
  --evidence-output "$bench_root/checker-revalidation.json"

python research/omlx-qwen38-pi-deepseek-harness-2026-08-23/analyze.py \
  "$bench_root/run/benchmark/results.jsonl" \
  --manifest "$bench_root/run/manifest.json" \
  --checker-revalidation "$bench_root/checker-revalidation.json" \
  --clean-output "$bench_root/clean.json"

pytest -q tests/test_omlx_pi_deepseek_harness_benchmark.py

--tool-root

must contain the exact readable subdirectories pi/

and dsh/

; the runner rejects overlap among tool, run, and hidden-task roots. Raw transcripts and proxy JSONL stay in the temporary run root and must not be published without a separate content review. The checked-in clean artifact was generated by analyze.py, whose whitelist and forbidden-material scan fail closed on credentials and absolute user/temp paths.

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @pi 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/pi-vs-the-official-d…] indexed:0 read:15min 2026-08-25 ·