dsh-plan-checkup
Verifieddsh-plan-checkup · v0.1.1 · MIT · Web UI
Plan Checkup for DeepSeek Harness: checks each step of a plan with Jev or a local LLM before you approve it, and marks the results on the plan review card.
Install
dsh plugin add dsh-plan-checkup Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-plan-checkup · 計畫體檢
DeepSeek Harness(dsh)插件。agent 在計畫模式交出計畫、你按「同意執行」之前,它會逐步檢查每一步,把結果標在計畫審閱卡片上。

| 標記 | 意思 | 判斷方式 |
|---|---|---|
| 🔴 無法復原 | 會刪除或覆寫既有的資料、歷史或資源 | 指令規則(DROP TABLE、rm -rf、git push --force 等)或判斷引擎 |
| 🟠 影響工作區以外 | 會動到遠端 repo、共用或正式環境、其他人,或付費服務 | 指令規則(git push、npm publish、kubectl apply 等)或判斷引擎 |
| 🟡 需求沒提到 | 需求沒有要求的工作 | 判斷引擎 |
| 🟡 描述太模糊 | 看不出要改什麼、檢查什麼 | 判斷引擎 |
| 🟡 沒有驗證步驟(整份計畫) | 有步驟會改程式,但沒有跑測試或建置 | 規則加上判斷引擎 |
| 🟡 可能漏了需求(整份計畫) | 計畫沒有涵蓋需求的所有部分 | 判斷引擎 |
它只提示,不擋、不改寫計畫,也不替你核准。設定判斷引擎之前,不會有任何內容離開你的電腦。
你會看到什麼
- 在 dsh web 輸入
/plan進入計畫模式,再送出需求。 - agent 交出計畫後,審閱卡片的工具列會出現「計畫體檢」徽章,在查看全文的連結旁邊。規則命中的標記馬上出現;引擎檢查期間,徽章顯示進度(例如「體檢中 3/8」),完成後顯示各顏色標記的數量,或「沒發現問題」。
- 點徽章看細節:每個有標記的步驟、標記與機率、規則命中的指令,以及整份計畫的提醒。每個標記旁有 👍 / 👎,你的投票會記在本機檔案裡,之後可以拿來重新校準門檻。
- 要讓 agent 改計畫:先按「帶入輸入框」,再按卡片上的「要求修改」。輸入框會出現整理好的問題清單,確認或修改後送出即可。「複製回饋」會複製同樣的文字。
- 按「同意執行」就照常執行。
連不到判斷引擎時,徽章顯示「只用規則」,面板寫明原因,審閱照常進行。卡片預設跟著 dsh 介面的語言(簡中或英文),要顯示繁中請把 lang 設成 zh-TW(見「設定」)。
需求
- dsh 0.2.x。已在 dsh 0.2.0-rc.2(Windows 11、Node.js 24.21)的 web profile 上實測。
- Node.js 22.19 以上的 22 版,或 24 以上(和 dsh 相同)。
- 指令規則以外的檢查需要判斷引擎(見下一節)。
安裝
dsh plugin --profile web add dsh-plan-checkup
如果你用 npx 執行 dsh,改用 npx @deepseek-ai/dsh plugin --profile web add dsh-plan-checkup。裝好後重啟 dsh web。還沒設定判斷引擎時只跑指令規則,徽章會顯示「只用規則」。
移除:執行 dsh plugin --profile web remove dsh-plan-checkup;如果你在 profile 的 cordis.patch.yml 加過 plan-checkup 段落,也一起刪掉。
設定判斷引擎
設定寫在 profile 的 cordis.patch.yml(web profile 是 ~/.dsh/profiles/web/cordis.patch.yml)。id: plan-checkup 的段落會取代插件的整份 config,沒寫到的鍵用預設值。
方式一:OpenAI 相容端點(不需要 Jev 金鑰)
每一題會轉成有字母選項的選擇題,模型只輸出 1 個 token,插件從選項字母的 logprob 讀出各選項的機率,不解析模型寫的文字。端點要支援 logprobs 和 top_logprobs,例如 vLLM、SGLang、llama.cpp,或 Ollama 0.12.11 以上。
區網裡用 http 連的 vLLM:
- id: plan-checkup
config:
engine: llm
llm:
endpoint: http://10.0.0.20:8000/v1/chat/completions
model: Qwen3.8-27B
allowEgress: true # 計畫會送到這台主機
allowHttpHosts: [10.0.0.20] # 允許用 http 連這台主機
extraBody:
chat_template_kwargs:
enable_thinking: false # 推理模型要關掉思考
本機端點(127.0.0.1、localhost)不需要 allowEgress。端點要金鑰時,把金鑰存成 dsh 憑證或環境變數,再用 llm.apiKeyEnv 指定名稱。
沒關掉思考時,第一個 token 會是 <think> 而不是選項字母;這時體檢會退回只用規則,面板會寫明引擎的回應格式不對。
接上 dsh 之前,可以在這個 repo 的副本裡先測端點:
npm run probe -- --endpoint http://10.0.0.20:8000/v1/chat/completions --model Qwen3.8-27B \
--allow-egress --allow-http-host 10.0.0.20 --extra '{"chat_template_kwargs":{"enable_thinking":false}}'
它用內建的 7 步計畫(或 --plan <檔案>)跑一次,印出每一步的機率和標記。
方式二:TypeSafe Jev,或 API 相同的服務
TypeSafe 雲端:把金鑰存成 TYPESAFE_API_KEY(dsh 憑證或環境變數),再打開外送:
- id: plan-checkup
config:
jev:
allowEgress: true
和 Jev 相容的服務,例如 Laya、openjev:把端點指到它。本機服務不需要 allowEgress。
- id: plan-checkup
config:
jev:
endpoint: http://127.0.0.1:8791/v1/systemone
在我們的評測裡,預訓練的 Laya 在這些題目上接近亂猜,請先用自己的資料微調再使用。預設門檻是依 Qwen3.8-27B 校準的,還沒有對 Jev 核對過。
會送出去的資料
| 項目 | 內容 |
|---|---|
| 送出 | 你最近 3 則需求(最多 2,000 字)、計畫標題、正在檢查的這一步(最多 1,200 字),以及前後兩步的第一行 |
| 不送 | repo 裡的檔案、工具輸出、其他對話內容 |
| 送出前遮罩 | API key 與 token(sk-、ghp_、AKIA、apikey_ 等)、Bearer …、私鑰區塊、帶帳密的 URL、password= |
| 端點限制 | 本機端點不受限;其他端點要 allowEgress: true,而且要用 https,或列在 allowHttpHosts 裡 |
| 請求數 | Jev 每一步 1 個請求;OpenAI 相容端點每一題 1 個請求(7 步約 37 個,同一步的內容會隨每一題重複送) |
| 金鑰 | 只放在 Authorization 標頭,不寫進紀錄,也不送到瀏覽器 |
設定
完整預設值在 cordis.patch.yml。常用的鍵:
| 鍵 | 預設 | 說明 |
|---|---|---|
engine |
jev |
判斷引擎:jev 或 llm |
lang |
auto |
卡片與回饋文字的語言:auto 跟著 dsh 介面(簡中或英文);zh-TW、zh-CN、en 指定其中一種 |
promptLang |
en |
送給引擎的題目語言:en 或 zh。改了會影響機率,門檻要重新確認 |
jev.model |
jev-1.13.0 |
釘住版本,因為門檻是針對特定版本校準的 |
jev.timeoutMs / jev.totalTimeoutMs |
2500 / 4000 |
單一請求與整份計畫的時間預算,超過就只顯示已完成的結果 |
llm.model |
(空) | 必填,端點上的模型名稱 |
llm.extraBody |
{} |
併入每個請求,例如關掉思考;蓋不掉讀機率要用的欄位,例如 max_tokens、logprobs |
llm.swapOptions |
false |
每題正反順序各問一次再平均(請求數加倍) |
llm.temperature |
1 |
校準溫度;大於 1 會讓機率往 0.5 收 |
llm.timeoutMs / llm.totalTimeoutMs |
5000 / 20000 |
同上;本機模型請求多,預算較寬 |
*.allowHttpHosts |
[] |
可以用 http 連的非本機主機,只寫主機名稱或 IP,不含 port |
thresholds.* |
0.4–0.8 | 各標記的門檻,依 Qwen3.8-27B 校準 |
limits.maxSteps |
25 |
超過的步驟只跑指令規則 |
資料存在哪裡
在 $DSH_HOME/plan-checkup/(預設 ~/.dsh/plan-checkup/):
results/<session>_<callId>.json:每份計畫的體檢結果,重開計畫時還看得到。ledger.jsonl:每次體檢用的引擎、各題答案的機率、延遲與 token 數、計畫標題、你的決定(同意執行或要求修改),以及你的 👍 / 👎。不含步驟內容。
插件不會往 session 紀錄寫任何東西。
效果如何
我們用刻意埋了問題的合成計畫做評測(程式與資料在 eval/):210 份用來調整題目與門檻,再用 6 個新情境的 90 份計畫做最後驗證。驗證集上卡片標記的精確率/召回率:
| 標記 | Qwen3.8-27B(OpenAI 相容端點,英文題目) | 只用規則 | 預訓練 Laya |
|---|---|---|---|
| 無法復原 | 1.00 / 1.00 | 1.00 / 0.35 | 0.07 / 0.80 |
| 影響工作區以外 | 1.00 / 1.00 | 1.00 / 0.13 | 0.11 / 0.77 |
| 需求沒提到 | 1.00 / 1.00 | — | 0.10 / 0.05 |
| 描述太模糊 | 0.74 / 1.00 | — | 0.03 / 0.21 |
| 沒有驗證步驟 | 1.00 / 1.00 | 0.59 / 0.94 | 0.50 / 0.03 |
| 可能漏了需求 | 0.91 / 0.87 | — | 0.28 / 0.70 |
在 vLLM 上用 Qwen3.8-27B,一份計畫的中位數是 2.1 秒、p95 是 2.9 秒,約 26 個請求。這些計畫比真實的乾淨,而且每一份都埋了問題,所以這些數字應該當成上限。能力好的 agent 交出的計畫很少有這些疏失,實際使用時多半會顯示「沒發現問題」。
意見回饋
這是第一個公開版本,下一步要做什麼由大家的回饋決定。請用回饋表單開 issue。細節面板底部的「意見回饋」連結會打開同一張表單,並帶入插件版本與引擎;在你自己送出之前,不會送出任何內容。建議附上:
- 標錯的步驟與標記,或沒有標出來的問題;
- 你的 dsh 版本與判斷引擎;
- 可選:計畫節錄(先刪掉私人內容),以及
ledger.jsonl裡對應的紀錄。
已知限制
- 它檢查的是幾種特定的疏失:危險指令、需求沒要求的工作、模糊的步驟、缺少測試。它不判斷做法對不對,也不判斷計畫依據的事實是否正確。
- 題目是為寫程式的計畫設計的;研究或寫作類的計畫,多數題目用不上。
- 步驟是從計畫的頂層清單或標題切出來的:子項目併入所屬的步驟,超過 1,200 字的步驟會被截斷,不是步驟的段落(目標、背景)不會檢查。
- 判斷引擎和寫計畫的是同一個模型時,兩者的盲點相同。
- 門檻是用合成資料、依 Qwen3.8-27B 校準的。其他引擎和模型要各自確認,可以利用
ledger.jsonl裡的機率和投票。 - 「可能漏了需求」是最弱的一項,請當成較弱的提醒。
- 子代理的計畫不會出現審閱卡片(子代理不能向使用者發問),所以不會被體檢。
- 「要求修改」會取消審閱,回饋要由你自己送出,插件無法代送。
- 這是提示工具,不是安全邊界:dsh 的沙箱與審批照常運作。
開發
npm test # 單元測試,不需要網路或金鑰
npm run dev:llm # 假的規劃模型,固定交出一份 7 步計畫(18765 埠)
npm run dev:jev # 假 Jev,檢查請求格式並回傳機率(18766 埠)
npm run dev:logprobs # 給 llm 引擎用的假 logprob 端點(18767 埠)
npm run probe -- … # 用一份計畫測試判斷引擎(見上文)
dev/overlay.yml(假 Jev)和 dev/overlay-llm.yml(假 logprob 端點)會啟動獨立的測試環境,所有服務都在本機,不需要金鑰:
DSH_HOME=.m0/home M0_MOCK_API_KEY=mock dsh web --patch dev/overlay-llm.yml --port 3190 --no-open
node dev/screenshot.mjs <dsh-url> <lang> <request> <out.png> [--feedback <out.png>] 會對執行中的 dsh web 重拍截圖,用 Edge 或 Chrome,不需要另外安裝套件;MOCK_PLAN_LANG=en 或 zh-CN 讓假的規劃模型用該語言交出計畫。
假服務可以模擬錯誤:MOCK_JEV_MODE=401|402|429|529|slow、MOCK_LLM_MODE=401|429|503|slow|nologprobs|think。瀏覽器端的 lib/client.js 是手寫的 dsh 用戶端模組格式,沒有建置步驟。它依賴的 dsh 掛點的實測紀錄在 m0/README.md。