Five implementations, one contract: how the DSH doctor ecosystem converged
Five implementations, one contract
Summary. In one week, five independent community tools for diagnosing
DeepSeek Harness converged on a single machine-readable contract
(dsh-doctor/v1) — not by committee, but by publishing specs with running
reference implementations and letting the format win on evidence. Thread:
#1719.
The starting point: five tools, five formats
The community shipped “dsh doctor” five times:
| Tool | Author | Shape |
|---|---|---|
| dsh-plugin-doctor | zoahdev | author-side preflight + profile tripwire |
| dsh-doctor | moonquake2004 | 19 offline checks, zero deps |
| dsh-doctor | ciceroyang | zero-dep single-file CLI + log health |
| dsh-win32 doctor | sjh9714 | win32-scoped, ships with the platform |
| dsh-diagnose | worm-ai | symptom → mechanism → check skill |
Same niche, five output shapes. Nobody could pipe one tool into another, and CI couldn’t consume any of them uniformly. That was the actual problem — not the tools themselves.
What made convergence possible
- A published envelope spec.
{ schema: "dsh-doctor/v1", generatedAt, profile, exitCode, summary, ok, checks: [{name, status, detail}] }with lowercase status (pass/warn/fail) and a minimal compatible subset of{ok, checks}. - Reference implementations, not promises. Each author shipped the
envelope in a real release within the same day: zoahdev v1.6.0,
moonquake2004 v0.2.4, ciceroyang v0.3.0, sjh9714 v0.8.x, worm-ai
--doctor-json(generation 61+). - Independent verification with honest gap marks. moonquake2004 mapped all 16 of dsh-diagnose’s symptom families to its 28 checks with ✅ direct / ⚠️ partial / ❌ gap — including two honest gaps (sandbox denials, approval policy) that no offline probe can see.
- Provenance without a global registry. The
toolfield was added as an optional provenance marker instead of forcing a global check-id registry early — “checks are data” (declarative, read-only probes) per the check-lifecycle draft.
The vocabulary freeze candidate
The check-name vocabulary went through four drafts (r1 → r4), incorporating:
- the
skipstatus with a mandatory reason (sjh9714); - corrected
nodeprovenance — repo-declaredengines, not folklore (ciceroyang, escalated to #2259); pass→oknormalization debate, settled at the freeze boundary.
The r4 draft is a freeze candidate: same check names, interchangeable across
implementations, CI scripts matching only checks[].name + status.
Why this is a repeatable pattern
The convergence did not happen because anyone “won”. It happened because each round published:
- a spec diff,
- a running implementation of that diff,
- independent verification against the actual source,
- an honest list of what the tool still cannot see.
The last point is the one that builds trust: a diagnostic that admits its gaps is one you can build on.
中文摘要
一周内五个社区工具(dsh-plugin-doctor / moonquake2004 dsh-doctor /
ciceroyang dsh-doctor / dsh-win32 / dsh-diagnose)收敛到同一个
dsh-doctor/v1 契约,靠的不是开会,而是”规格 + 当天就上线参考实现 +
独立核对 + 诚实标注盲区”四件套。检查名词表走到 r4 冻结候选,tool 字段
解决来源溯源而不抢注册表。经验:能承认自己看不到什么的诊断工具,才值得
别人在此基础上继续盖楼。完整讨论:#1719。