前言¶
DeepSeek Harness(DSH)把代理流程和能力扩展做成插件化组件。AI coding agents 在执行任务时会调用 shell、文件读写等工具。如果只把“不要做某类操作”写进提示词,或者只做简单的文本过滤,执行前仍缺少一道可审计的策略检查。
dsh-write-gate 针对这个问题:操作者用 commitments 描述策略,插件在工具调用执行前检查这些 commitments,再决定是否放行该次工具调用。
这是什么¶
dsh-write-gate 是 couldbeme 维护的 DSH 插件,仓库为 couldbeme/dsh-write-gate,许可证为 MIT,Node 要求 >=20。
它提供 commitment write-gate,面向 AI coding agents,核心能力是 two-tier(deterministic + LLM judge)pre-execution policy:
- 操作者编写 commitments。
- 工具调用执行前,插件先检查这些 commitments。
- 结构类约束走确定性检查。
- 语义类约束走 LLM judge。
核心模块是 dsh-write-gate/core,定位为 engine-agnostic core;仓库提供 DeepSeek Harness(dsh)适配器。文档还提到,同一个 core 上的 Claude Code adapter 是 planned 能力。
两级检查¶
dsh-write-gate 的检查分两层。
1、Tier 1 是 deterministic structural checks。它使用 path globs、command regexes 和 scope filters,挂在 ctx.tools.guard()。适合可以明确表达的约束,例如限制某类 shell 命令、限制文件路径范围。
2、Tier 2 是 semantic LLM judge。它对 commitments 里的自然语言 statement 做判断,挂在 tools/pre-execute waterfall。适合结构规则无法完全判断的约束,例如“不要修改与当前任务无关的文件”。
被拦截的调用会生成 write-gate/contradiction 事件,并追加 JSONL 到 contradictions log。日志会解释哪个 commitment 触发,以及为什么触发。
承诺文件¶
操作者通过 commitments file 定义策略。文件可以设置默认行为,也可以逐条定义 commitments。下面是一个结构示例:
defaults:
failMode: closed
judgeBudgetPerStep: <judgeBudgetPerStep>
commitments:
- id: <commitment-id>
statement: "<operator-authored commitment>"
match:
kinds: ["<kind>"]
commands: ["<command-regex>"]
- id: <semantic-commitment-id>
statement: "<operator-authored commitment>"
severity: <severity>
semantic: true
match:
kinds: ["<kind>"]
字段含义如下:
defaults.failMode:控制 judge 不可用时的默认行为。文档示例使用closed。defaults.judgeBudgetPerStep:控制每步 judge budget。id:commitment 标识。statement:操作者编写的自然语言约束。match.kinds:scope filter。match.commands:structural evidence。severity:commitment 的级别。semantic: true:表示该 commitment 需要 Tier 2 judge 处理。
需要注意几个行为:
- 非语义 commitment 如果只有 scope 但没有 evidence,会在所有 in-scope action 上触发。
- 非语义 commitment 如果既没有 scope 也没有 evidence,会在加载时被拒绝为 unenforceable。
- command regexes 默认大小写不敏感。
- command patterns 会执行在 synchronous guard 中,过复杂或可能回溯的 regex 会卡住工具管道。commitments 由操作者编写,但仍应尽量保持 pattern 简单。
- commitments file 缺失或无效时,插件会 loud mount failure,让部署失败,而不是挂载一个不守任何策略的 gate。
安装与启用¶
先安装 npm 包:
npm install dsh-write-gate
这个命令安装的是 library 和 dsh plugin 入口。core 入口是 dsh-write-gate/core,dsh 入口是包根入口。
仓库列出的 peer dependencies 包括:
@deepseek-ai/cordis >=4.0.1 <5
@deepseek-ai/dsh-agent >=0.1.0-rc.5 <0.2.0
@deepseek-ai/dsh-llm >=0.1.0-rc.5 <0.2.0
@deepseek-ai/dsh-tools >=0.1.0-rc.5 <0.2.0
在 DSH 应用中使用前,需要准备有效的 commitments file,并把插件挂载到目标 dsh 进程。如果 commitments file 缺失或无效,挂载会失败,而不是静默继续。
独立 CLI 检查¶
dsh-write-gate check 可以在不启动 harness 的情况下做检查,适合 CI、pre-commit hooks 或手动验证:
dsh-write-gate check --commitments <file> --tool <name> [--path <p> ...] [--command <c>] [--explain] [--json]
帮助命令如下:
dsh-write-gate --help
dsh-write-gate -h
dsh-write-gate check --help
CLI 的 v0 形态只做 Tier 1 structural check,没有 --judge flag。对于 semantic: true 且结构检查无法判定的 commitments,会走到 no judge configured,再按 commitments file 的 failMode 处理。
当 failMode 为默认 closed 时,CLI 中这类 escalating semantic commitments 会阻塞。若 dsh 插件侧配置了 judge,则插件侧没有这个 CLI v0 的限制。
如果需要从源码运行 CLI,可以按仓库说明安装依赖并构建:
pnpm install && pnpm build && node dist/cli/index.js --help
本地验证¶
仓库提供以下命令用于测试、类型检查和演示:
pnpm install && pnpm test
pnpm typecheck
pnpm demo
如果要自行运行 judge 评估脚本,可以使用:
pnpm build && node scripts/judge-eval.mjs --url <openai-compatible-endpoint> --model <model>
这个命令需要 OpenAI-compatible endpoint 和 model,用于对 judge 表现做评估。
关键设计取向¶
dsh-write-gate 的几个关键行为如下:
- Fail-closed default:judge unreachable、timed out 或 over budget 时,block-severity commitments 会阻塞。
- Bounded judge cost:使用 per-step budget、verdict memoization 和 timeout-as-unavailable 限制 judge 成本。
- Prompt-injection stance:action content 以 fenced data 形式进入 judge prompt,只接受 strict JSON verdict 或
ABSTAIN。 - Loud mount failure:commitments file 缺失或无效时,部署会失败,而不是挂载一个 guard nothing 的 gate。
适用场景与注意¶
适合以下场景:
- 在 DSH 中给 shell、文件写入等工具调用加前置策略。
- 在 CI 或 pre-commit hooks 中使用 CLI 做结构检查。
- 需要记录哪些 commitments 被触发,以及为什么触发。
使用前需要注意:
- 插件以当前 dsh 进程权限运行。它能影响的工具调用范围,受该 dsh 进程权限约束。
- 安装前应检查源码、commitments 示例和许可证。
- 策略由操作者编写。错误 regex、过宽 scope 或过严 failMode 都会影响正常工具调用。
- CLI v0 没有 judge 能力。语义类 commitments 在 CLI 中会按
failMode处理;如需语义判断,需要在 dsh 插件侧配置 judge。 - Claude Code adapter 是 planned 能力,不是当前已交付功能。
链接¶
- GitHub: https://github.com/couldbeme/dsh-write-gate
- 社区目录页: https://www.skillhub.cn/plugins/couldbeme/dsh-write-gate
这里的社区目录页是独立站点,不代表 DeepSeek 或幻方的官方应用商店。