dsh-oracle-gate:先凍結驗收標準,再只認執行回執

前言

在 DSH(DeepSeek Harness)裏做多 agent 協作時,常見摩擦不是「代碼寫錯」,而是雙方對「做完了」的定義不一致:實現者說跑過了,驗收者事後放寬門檻,或把真實失敗包裝成環境問題再重試。口頭約定和事後補測很難審計,也擋不住判據或腳本在凍結後被悄悄改掉。

下面介紹社區工作流插件 dsh-oracle-gate(維護者 CresBigB)。它把順序反過來:先把驗收判據落成帶哈希的不可變文件,之後每次執行只能按凍結過的判據 id 進行,裁決依據代碼記賬的回執,而不是任何人的自我評價。插件當前版本 0.2.0,許可證 MIT,需在 DSH 宿主中加載,不能獨立用 node 直接當普通庫跑全套工具鏈。

這是什麼

dsh-oracle-gate 是 DSH 的驗收准入閘門插件。README 用一句話概括目標:讓「做完了」這件事不再由做的人說了算。

DSH 生態的理念是「一切皆插件」;SkillHub 等社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。安裝前建議自行閱讀源碼與許可證,並理解插件在宿主進程內運行時的權限邊界(見下文「適用場景與注意」)。

核心機制

插件用四步流程,每一步對應一類常見「作弊路徑」。

1. 凍結 oracle_gate_freeze

判據寫入 <workspace>/.protocol-kit/<run_id>/oracles.json,並記錄內容哈希。凍結後:

  • 同一 run_id 不能再次凍結
  • 判據引用的每個本地文件(腳本、數據、基線)記下 sha256 與字節數
  • 可在尚未寫實現代碼之前就定死門檻

支持直接傳 oracles,或傳 acceptance 由 src/kernel/compile.js 編譯;dry_run 只編譯不落盤。

2. 執行 oracle_gate_exec

只接受判據 id,不接受臨時指定的命令。執行前校驗判據文件哈希,以及引用文件的哈希;任一項不匹配則拒絕執行(不是警告)。預算在預留階段消耗,失敗不退。

3. 裁決 oracle_gate_gate

區分「真實執行回執」與「人工 / LLM 評審結論」,再統一裁決。四種結果:

裁決 含義
pass 全部可執行判據通過,人工判據也有明確結論
rejected 硬失敗(退出碼、超時等);人工評審傳 pass 也攔不住
insufficient-evidence 證據不足:缺回執、缺引用
blocked-on-human 在等人,不算失敗

人工判據須以結構化形式傳入,並帶 evidence_refs;無引用則視爲未過。

4. 歸因 oracle_gate_failures

失敗類型綁定固定回退目標,例如 requirement-misread → clarify、implementation → implement、oracle-gamed → freeze、infrastructure → no-replay 等,避免所有失敗都當成再實現一遍。

README 中記錄了兩類實測:凍結後篡改判據腳本會被文件哈希拒絕執行;判據硬失敗時即使人工傳 verdict: "pass",裁決仍爲 rejected。

工具清單

共 12 個工具,統一前綴 oracle_gate_。不確定下一步時,可先調只讀總入口 oracle_gate:掃描臺賬,列出各 run 的裁決狀態與建議的下一步。

類別 工具 作用
總入口 oracle_gate 驗收臺賬;無參數時缺省用當前目錄
執行內核 oracle_gate_freeze / exec / gate / failures 凍結、執行、裁決、失敗歸因
進度 oracle_gate_status run 進度、判據通過/失敗/未跑、預算桶、下一步建議(只讀)
設計 oracle_gate_inventory / design / run / domain 資產盤點、P1–P4 決策協議、領域包
數值 oracle_gate_numeric 曲線比較(相對誤差、覆蓋率等;不記賬不裁決)
診斷 oracle_gate_ping 版本、掛載配置、服務可見性自檢

領域包(backend、frontend、numeric、architecture)隻影響設計階段注入的視角;執行內核不依賴領域包。

安裝與啓用

⚠️ 這是 DSH 插件,不能獨立運行。需要 DSH 宿主環境,由宿主解析 @deepseek-ai/dsh-tools;直接 node import 找不到該模塊屬正常現象。要求 Node.js ≥ 22。

package.json 中 peerDependencies 爲 @deepseek-ai/dsh-tools: >=0.2.0-rc.2 <0.3.0-0。若區間未覆蓋宿主當前內核版本,插件會被靜默跳過(無報錯、工具消失)——安裝後若工具不出現,應對照同 profile 下其它插件與宿主版本是否在區間內。

官方 README 給出的安裝步驟如下(link: 指向源碼目錄,改代碼即時生效):

git clone https://github.com/CresBigB/dsh-oracle-gate.git

cd ~/.dsh/profiles/desktop
corepack pnpm add "link:/abs/path/to/dsh-oracle-gate"

然後把 "dsh-oracle-gate" 加入該 profile 目錄下 package.json 的 dsh.profile.bundles 數組,並重啓 DSH Desktop。不同平臺 profile 目錄可能不同,示例路徑爲 ~/.dsh/profiles/desktop。

典型用法

快速開始遵循「先凍結 → 再執行 → 再裁決 → 隨時查狀態」。下面示例來自 README(路徑需換成你的絕對路徑):

// 1. 凍結:先把門檻定死
oracle_gate_freeze({
  root: "/abs/path/to/project",
  run_id: "add-pagination",
  acceptance: [
    { criterion: "類型檢查通過", level: "L0", check: "npx tsc --noEmit" },
    { criterion: "分頁行爲正確", level: "L1", check: "npm test -- pagination" },
    { criterion: "代碼風格一致", level: "L2" }
  ]
})

// 2. 執行
oracle_gate_exec({ root: "...", run_id: "add-pagination", oracle_id: "L0-typecheck" })

// 3. 裁決
oracle_gate_gate({
  root: "...",
  run_id: "add-pagination",
  reviews: [{ oracle_id: "L2-style", verdict: "pass", veto: false, evidence_refs: ["src/table.tsx:12"] }]
})

// 4. 看進度
oracle_gate_status({ root: "...", run_id: "add-pagination" })

產物落在 .protocol-kit/<run_id>/:

oracles.json     # 凍結判據(含哈希)
ledger.jsonl     # 預算賬本
receipts/        # 執行回執
failures.jsonl   # 失敗歸因

均爲純文本,可用 git diff 審計。若只想理解設計,可不安裝,直接閱讀 src/kernel/ 與 src/tools/ 下的 ESM 源碼。

設計邊界與安全

能做到的(README 列舉):判據凍結後不可 silent 修改;執行僅按 id;硬門優先於人工評審;預算預留即消耗;產物可審計。

做不到的:判據 import 的模塊不在文件鎖內;無法判斷判據本身是否合理;無法阻止凍結之前就把門檻定得很低——保證的是「定下來之後不能改」。

安全方面:插件運行在宿主進程內,擁有完整 Node 權限,沒有沙箱。寫文件限制在 <root>/.protocol-kit/;不發起網絡請求;不讀 root 外路徑;不記錄密鑰、令牌。安裝前仍應通讀 src/ 與 cordis.patch.yml,確認符合你的安全策略。

測試與維護

倉庫內測試:

npm test

README 說明爲 10 個測試文件、19 個用例,覆蓋內核、裁決、狀態、數值比較、領域包校驗、文件鎖;使用本地臨時目錄,不聯網。

問題與貢獻可走 GitHub Issues:https://github.com/CresBigB/dsh-oracle-gate/issues。

結尾

dsh-oracle-gate 適合需要在 agent 工作流裏把「驗收標準」和「執行證據」綁死、且可審計的團隊:先 freeze,再 exec 與 gate,用臺賬工具跟進狀態。它不能替代「判據寫得好不好」的產品判斷,但能減少事後改門檻、改腳本、口頭通過這類協作損耗。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜