DeepSeek Harness Hub
← 返回列表

couldbeme/dsh-write-gate

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

一个面向 DeepSeek Harness…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/30 · 已提供中文文档

AI 编码代理的提交写入门控:两层执行前策略(确定性守卫 + LLM 评判器),并带有可测量的回执。DeepSeek Harness 插件,引擎无关核心。

综合分
28.9
GitHub 分
28.9
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add couldbeme/dsh-write-gate
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/17(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-write-gate

ci npm

一个面向 DeepSeek Harness 的承诺写入闸门:由操作者编写约束条件(“绝不强制推送到共享分支”、“对生产数据库保持只读”),而闸门会在工具调用执行之前强制执行这些约束。结构性违规会被确定性地捕获;语义漂移则由模型依据操作者自己的措辞进行判断。每一次拦截都会记录到矛盾日志中,说明是哪条承诺被触发以及原因。

引擎无关的核心(dsh-write-gate/core,零 harness 导入)配有 dsh 适配器;基于同一核心的 Claude Code 适配器已在计划中。

在真实的 dsh 应用中,一个实时模型在被要求强制推送、且闸门拒绝了该调用之后:

“对 main 分支的强制推送被仓库的‘no-force-push’策略阻止了。”

那一轮完全在本地运行,零 API 密钥;复现步骤和会话日志凭证见 docs/E2E-HEADLESS.md。

安装

npm install dsh-write-gate        # library + dsh plugin (see Mounting below)

dsh-write-gate check CLI 随 0.2.0 发布,已在 GitHub 上打标签,npm 发布尚待进行;目前 npm install 解析到的是 0.1.1,该版本没有 CLI。在发布之前,请从克隆仓库运行:pnpm install && pnpm build && node dist/cli/index.js --help。

如何强制执行:两个槽位中的两个层级

| 层级 | 机制 | dsh 槽位 | 为什么是这个槽位 |
|---|---|---|---|
| 1:确定性 | 路径 glob、命令正则、作用域过滤器 | ctx.tools.guard()(单调) | 任何监听器排序都无法将 guard 的拒绝重新变为允许 |
| 2:语义 | 针对承诺语句的 LLM 裁判 | tools/pre-execute 瀑布流(前置) | 支持异步;通过 {kind: 'deny'} 决策对象短路 |

agent/pre-step 会重置每步的裁判预算。矛盾记录会作为 write-gate/contradiction 事件发出,并以 JSONL 形式追加到矛盾日志中。

为什么分两个层级

一项内部 A/B 研究(12 个任务 x 4 个实验组 x 10 次运行;运行手册尚未发布,因此不要引用这句话中的任何内容)发现,仅使用 LLM 裁判的闸门在未标记违规率上表现与基线持平,而确定性检查捕获了裁判反复放行的一整类违规(超长输出);一个朴素的“提醒”实验组在四组中表现最差。可检查的约束用确定性检查,只有真正语义性的约束才用裁判。
二级评审评分标准移植自一条在本地 8B 模型上测得 18/18 开发集 + 16/16 留出集(100% 精确率,0 次弃权)的谱系,并通过本次移植进行了实时重新测量(2026-08-17):准确率 32/34,违规召回率 17/17。它还带有一条反自我辩护条款,该条款是在 holdline 基准测试发现两次注入攻破后添加的(某个动作声称“操作员已批准此操作”或“这只是一次测试”,从而说服评审放行了一次真实违规);该条款将注入准确率从 5/8 提升到 7/8,且在基础用例上零回归。我们保留注入防护提示词,因为它是唯一能保持 100% 违规召回率的变体;对于一道闸门而言,漏掉一次违规比过度拦截更糟。该测试夹具附带 41 个用例(18 个开发集、16 个留出集、7 个注入),位于 test/fixtures/judge-cases.json,其诚实性说明保持原样:它们为手工编写;有意义的信号是复述漏检率、陷阱误报率和留出集泛化能力,而非那个头条百分比。

设计保证,每一条都锚定到一个测试

- 绕过抵抗:一个前置监听器即使在不委托的情况下直接应答 allow,仍然无法让结构性违规通过——test/dsh-plugin.test.ts(“cannot be bypassed by a listener that short-circuits allow”)。
- 故障关闭默认值:评审不可达、超时或超出预算 → 阻断级承诺予以阻断,并将原因记入记录——test/gate.test.ts。
- 有界评审成本:每步预算、裁决记忆化、超时即视为不可用——test/gate.test.ts。
- 提示词注入立场:动作内容以数据形式(“data, not instructions”)围栏进入评审提示词;只接受严格的 JSON 裁决(或 ABSTAIN 标记)返回;ABSTAIN 绝不构成阻断——test/judge-llm.test.ts。
- 响亮的挂载失败:缺失或无效的承诺文件会使部署失败,而不是挂载一道什么都不守护的闸门——test/dsh-plugin.test.ts。
- 真实流水线:集成测试套件将插件挂载到来自已发布 rc 包的真实 Context + ToolRuntime 中,并驱动 ctx.tools.execute——没有模拟测试框架。
- 真实应用、真实模型:在真实的 dsh 无头应用中,一个实时本地模型尝试了强制推送,并被闸门拒绝;它自己的最终答案报告了这次阻断。完整复现、会话日志回执以及两项上游发现:docs/E2E-HEADLESS.md。

运行全部内容:pnpm install && pnpm test 和 pnpm typecheck——测试套件会打印自己的计数;上述每项保证都指明了其测试文件。

观看漂移故事:pnpm demo——确定性,无需模型。范围内的操作通过,一次生产配置编辑和一次强制推送被阻断,而一个放任一切的流氓监听器无法绕过单调防护;矛盾日志会在最后打印。
自己动手衡量评判器:pnpm build && node scripts/judge-eval.mjs --url  --model  会实时运行每一个 fixture 用例,并报告各集合的准确率、弃权(abstain)和漏判(miss)。

Commitments 文件

version: 1
defaults:
failMode: closed        # 评判器不可达 => block 严重级别的 commitment 会阻断
judgeBudgetPerStep: 8
commitments:
- id: no-force-push
statement: Never force-push to a shared branch.
match:
kinds: [shell]
commands: "git\\s+push\\s+[^\\n"]
- id: stay-on-task
statement: Do not modify files unrelated to the assigned task.
severity: warn
semantic: true          # 升级到 tier-2 评判器
match:
kinds: [fs-write]

语义:kinds/tools 是作用域过滤器;paths/commands 是结构性证据。一个非语义的 commitment 若有作用域但没有证据,会在每一个作用域内的动作上触发;一个非语义的 commitment 若两者都没有,则在加载时被拒绝,视为不可执行。命令正则默认不区分大小写。有一个坑需要知道:命令模式在同步守卫内部执行,因此一个灾难性回溯的正则可能会卡住整个工具流水线——commitments 由操作者编写(可信),但仍应保持模式简单。完整示例:commitments.example.yaml(其本身也在测试之中)。

CLI(dsh-write-gate check)

一个独立于任何 harness 之外的检查,用于 CI、pre-commit 钩子或手动使用:

dsh-write-gate check --commitments  --tool  [--path  ...] [--command ] [--explain] [--json]
dsh-write-gate --help | -h   # 或:dsh-write-gate check --help(打印此用法概要,退出码 0)

v0 仅支持 tier-1(结构性)——尚不存在 --judge 标志。 每一个仅凭结构无法裁定的 semantic: true commitment 都会始终升级为“未配置评判器”,然后遵循 commitments 文件的 failMode。在默认的 failMode: closed 下,这意味着如今在 CLI 中,每一个升级的语义 commitment 都会始终阻断。--judge 标志是明确推迟的后续工作;在那之前,直接驱动 CLI 时,请将语义 commitment 视为一触即阻断(dsh 插件本身在配置了 judge 时没有此限制)。

--tool 是必需的(例如 bash、write、read);除了非空之外,它不会进行任何枚举校验——kind 由它派生,不能直接设置。--path 可以重复;--command 若重复则取最后一个值。--path / --command 中至少需要一个。

退出码:

| 代码 | 含义 |
|---|---|
| 0 | ALLOW,包括 fail-open 降级放行(降级会在输出中体现,绝不通过改变退出码来体现) |
| 1 | BLOCK——统一涵盖 tier-1 结构性、tier-2 评判和 tier-2 fail-closed 阻断 |
| 2 | 用法错误 |
| 3 | WARN |
| 4 | Commitments 文件不可读,或无效(YAML 错误、正则错误、重复 id、schema 违规、不支持的版本) |
| 5 | 内部/意外错误 |
--json 仅将 JSON 文档打印到 stdout(可安全用于 | jq .);所有提示性信息都输出到 stderr。--explain 会为每条记录展开承诺、其陈述、严重级别、层级、匹配的模式以及理由;在 --json 下,这是一个有文档说明的空操作。

挂载

该包声明了生态系统约定(dsh.bundle.patch → cordis.patch.yml),并通过以下方式挂载:

dsh plugin --profile  add dsh-write-gate

配置键:commitmentsFile(默认 COMMITMENTS.yaml,从 cwd 解析)、contradictionsLog(JSONL,默认 write-gate.contradictions.jsonl)、judgeTimeoutMs,以及 judge: { provider, model, maxTokens } —— 省略 judge 则仅运行第 1 层(此时升级将遵循 failMode)。

一份可直接使用的起始策略位于 examples/team-policy.yaml:将其复制为 COMMITMENTS.yaml,或将 commitmentsFile 指向它。
生产配置由 fs-write 路径 glob 保护,仅第 1 层。
强制推送由 shell 命令正则捕获。
生产数据库通过一个正则保持只读,该正则匹配同时指定生产主机和变更型 SQL 关键字的 psql/mysql 调用;针对同一主机的读取操作则放行。
一个 severity: warn、semantic: true 的 stay-on-task 承诺会升级到第 2 层评判器。
pnpm demo(见上文)是同类策略的叙事版本。

当前限制(v0,明示而非隐藏)

- CLI(dsh-write-gate check)仅支持第 1 层:它从不配置评判器,因此每个升级的语义承诺都会报告“no judge configured”并遵循 failMode —— 默认阻止。参见上文 CLI 部分。
- 动作规范化器是一张针对 dsh 树内工具名称(bash、read/write/edit、web 工具)的启发式表;无法识别的工具会降级为类型 other 并附带完整摘要 —— 对语义承诺可见,但路径/命令规则不适用于它们。
- dsh 是 0.1.0-rc 开发者预览版,已宣布将有破坏性变更;对等依赖被固定为 <0.2.0。
- 早期版本(0.1.x 核心 + dsh 插件在 npm 上;0.2.0 增加了 CLI,在 GitHub 上打标签,npm 发布待定);pnpm build 生成 dist/,prepublishOnly 在每次发布前以构建 + 测试作为门禁。
- 第 2 层评判器的效果仅取决于其模型和评分标准;上述测量数字来自随附的 fixtures,而针对带标签轨迹为该门禁(及其他门禁)评分的基准测试是 holdline(见路线图)。

路线图

1. 演示的 llm-replay fixture 变体(dsh 快照格式),以便该故事能在完整的 agent 循环中重放。
2. 门禁基准测试 → 已发布为 holdline:捕获率、误拦率、类别平衡 kappa,以及一个注入攻击类别,对任何防护(包括本防护)进行评分。自建语料库:本门禁的评判层级在平衡 kappa 上得分 0.95(100% 捕获,5% 误拦),而承诺盲结构防护为 0.15–0.35。在 548 条真实 ODCV-Bench 轨迹上,使用独立的 4 模型面板标注,评判保持平衡 kappa 0.64(75% 捕获,9% 误拦)。holdline 如实记录评判失手之处(注入、截断)。
3. 基于同一核心的 Claude Code 适配器。

依赖与信任基础

运行时:zod、yaml、picomatch(主流、积极维护),@deepseek-ai/schemastery(dsh 自有的配置模式库,Koishi 血统)。测试框架同级依赖:@deepseek-ai/cordis + @deepseek-ai/dsh- rc 包,已固定版本。开发依赖:vitest、typescript。

MIT。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群