dsh-todo-guard ✅
A reliable todo panel plugin for DeepSeek Harness (dsh) web: the todo strip survives restarts (works around the official panel disappearing after a restart), and completion is verified against evidence paths.
Unofficial project: independently developed and maintained by a community member, not an official DeepSeek product.
Screenshot

Requirements
- DSH web >= 0.1.0-rc.6 (run with
npx @deepseek-ai/dsh web) - Version compatibility (best effort — the settings card uses dual-field
key+idregistration to satisfy both rc.6 (id) and rc.7+ (key); verified locally on rc.6/rc.8/0.1.1-rc.2, not guaranteed on every DSH version):
- DSH 0.1.0-rc.6 and newer (incl. 0.1.1-rc.1/rc.2): try main (default). - Conservative fallbacks (the last pre-0.1.1 build): DSH 0.1.0-rc.7/rc.8 → v0.1.4 (dsh plugin add github:a903067276-rgb/dsh-todo-guard#v0.1.4); DSH 0.1.0-rc.6 → frozen rc6-compat tag (no maintenance).
- Maintenance policy: this plugin keeps evolving with the latest DSH releases; compatibility with older DSH versions is best-effort only and not guaranteed going forward.
Features
- Restart-proof panel — replaces the official todo strip (
conversation.input.dockcell, shadowed atpriority: -1); after a dsh restart, reopening the session shows the todo list again - Completion verification (three states) — when the agent marks a todo
completed, evidence is checked automatically:
- (证据:路径) and the path exists → ✅ green check (verified) - (证据:路径) but the path does not exist → 🚫 blocked, the agent gets a clear error and must fix it - no evidence marker → ⚠️ allowed, the item shows a yellow "unverified" badge (no false blocks on "did it but forgot to write evidence"; visible at a glance)
Evidence syntax
Write (证据:路径) inside a todo item (multiple allowed). Relative paths resolve against the session working directory; absolute paths work as-is:
Fix the button(证据:lib/index.js)
Run tests(证据:test/run.log)(证据:docs/result.md)Install
dsh plugin --profile web add "github:a903067276-rgb/dsh-todo-guard#main"
# restart dsh web to activateHow it works (why it survives restarts)
- Data: todos live in the session event stream (official
todo/write, last-wins whole-list), persisted on disk — the official panel just fails to re-render them after a restart - Panel: official
useProjection('todos')projection + same-id slot shadowing (priority: -1, lowest renders) — official interfaces only - Verification: official
tools/pre-executewaterfall interceptstodo_writebefore it commits; failed evidence denies the write with a readable reason
Notes
- Pure local logic: zero model calls, zero token cost
- Fake files are the verification boundary: an existing path does not prove the work was done, but the unverified badge keeps the loop honest
- Strict mode (block when evidence is missing) is planned for v2
License
MIT