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,用台账工具跟进状态。它不能替代「判据写得好不好」的产品判断,但能减少事后改门槛、改脚本、口头通过这类协作损耗。

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

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

小夜