🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
广告☁️ 云服务器特惠阿里云首购 8 折 · 腾讯云合作特惠
DeepSeek Harness Hub
← 返回列表

catsenior507/dsh-policy-strict-gate

DeepSeek Harnessspec-screened扫描:中风险在 GitHub 查看 ↗
⚠ 装前注意

严格闸 · Strict Gate

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/11 · 已提供中文文档

将严格检查作为dsh harness策略强制执行:重复失败干预、带诊断信息阻断的glob保护关键路径门禁,以及自动写入后检查。

综合分
28.9
GitHub 分
28.9
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add catsenior507/dsh-policy-strict-gate
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
信任档位:已验证本站已于 0 天前真实安装成功
是什么
dsh 原生插件 · other
装得上吗
本站已真实安装成功(非静态推断)
安全吗
本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
还在维护吗
活跃:最近一次提交在 15 天前

档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →

🟢实装验证通过· 2026/9/25
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/21(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@dsh-external/dsh-policy-strict-gate(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/24 04:18:41

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

由 DeepSeek 最新模型翻译生成
严格闸 · Strict Gate

一个模型必须记得去调用的工具,恰恰会在最需要它的时候被跳过。

一个 DeepSeek Harness 宿主插件:把 strict_check 和失败日志,从 agent 可以用的东西,
变成宿主强制执行的策略。

License: MIT
DeepSeek Harness plugin
version
node
stars

English · 简体中文

它解决什么

前面两个插件给了 agent 能力。这一个,把"要不要用这些能力"的决定权从 agent 手里拿走。

这不是对 agent 的批评 —— 这是关于检查会在什么时候被跳过的陈述。自律恰恰在
最要命的时刻失效:模型很自信的时候、在赶进度的时候、已经陷入循环的时候。
那些时刻检查最值钱,也最不可能被主动调用。

还有第二个理由,也是真正说服我做这个的原因:检查结果落在工具返回值里,是可以被略读的;
而检查结果变成"拒绝下一次写入",略不过去。

三道闸

各自独立失效、独立配置,关掉一道不影响另外两道。

1. 重复失败

同一个失败签名在一个会话里出现 repeatThreshold 次(默认 3),就排入一条通知,
写明失败类别、内置修复提示,以及"你必须改点什么"的指令。之后每隔
repeatCooldown 次再提醒一次,所以长时间循环不会淹没上下文。

宿主对逐字节相同的调用已经做了类似的事。这里把它扩展到"空格或路径不同、
但死于同一个原因"的调用。

刻意挂在 tools/result 而不是 tools/post-execute 上:前者对每一个已结算的结果
都会触发,包括绕过 post-execute 的那些管道失败 —— 被拒绝的调用、未知工具、
被本闸拒绝的调用。一个模型反复撞被拒的调用,恰恰是最值得打断的循环。

2. 关键路径

对受保护 glob 命中路径的写入会被拒绝,直到有一份覆盖它的 Lean 规格通过检查。

两个设计选择让它成为"策略"而不是"障碍":

拒绝理由里带诊断。 宿主会丢弃被拒调用的结果,所以一句只说"已阻止"的拒绝,
会把满足这道闸所需的信息一起销毁。所以闸在拒绝之前先跑检查,并把发现的东西引出来。

修复通道永远打开。 正在修"闸刚刚报出的那个诊断"的写入会被放行。没有这条规则,
闸就死锁了 —— 它会拒绝"对它所报错误的修复",而且没有任何出路。
这就是计数器里的 repairPasses,也是这个插件里最重要的一个行为。

每次拒绝都会打印三条出路:满足闸、重试修复、或把该路径从 criticalPaths 移除。

3. 写后语法检查

每一个被接受的写入,紧接着就跑该语言自己的检查
(py_compile、node --check、PowerShell 解析器),诊断随上下文一起进入下一步。

这是最便宜、也最经常回本的一层:它在弄坏文件的那一步就抓住它,
而不是三个命令之后通过一个不相关的失败才发现。

安装

本插件作为包安装进一个 dsh profile。dsh plugin 会在 profile 目录里转发给 pnpm,
所以 pnpm 接受的任何 spec 都可以用。

从 GitHub 安装(公开发布形式)
dsh plugin --profile web add github:catsenior507/dsh-policy-strict-gate

本地检出安装(开发时用)
dsh plugin --profile web add /absolute/path/to/dsh-policy-strict-gate

web 是自带 GUI 的 profile;可换成 headless、sdk、acp 或你自己的 profile 名。
Windows 上路径用正斜杠,或给路径加引号。

关键路径闸和写后检查依赖它用来判断的检查器,请一并安装:

dsh plugin --profile web add github:catsenior507/dsh-tool-strict-check

闸通过遍历 DSH 的 profile 目录来定位那个包,所以两者是 link 还是各自独立安装都能工作;
如果它不在,闸会明说,并让那两道检查闸停用,而不是靠猜。

装完重启宿主,然后确认:

strict_gate_status action=status

安装不会做的事

- 没有构建步骤 —— 发布的 JavaScript 就是源码;不会跑 prepare 脚本。
- 没有依赖 —— dependencies 和 peerDependencies 都是空的。
- strict-check 在加载期是可选的。 没有它你仍然有"重复失败"那一道闸;
失去的是另外两道。

需要 Node.js 20 或更新版本。

开启关键路径闸

它出厂是关闭的,因为那份 glob 清单是关于你的代码的陈述,没有插件能替你猜。
在你设置之前,另外两道闸照常工作。

dsh plugin add 已经替你插入了插件行。把清单加进 profile 的 cordis.patch.yml
里那一行的 config:

- insert:
- id: policy-strict-gate
name: '@dsh-external/dsh-policy-strict-gate'
config:
criticalPaths:
- 'src/core/'
- 'src//.spec.lean'
protectedTools: ['write', 'edit']
repeatThreshold: 3
repeatCooldown: 3
postWriteSyntax: true
maxDiagnostics: 5

用 strict_gate_status action=targets path= 确认某个路径真的被保护、
被哪条规则保护 —— glob 静默匹配失败、导致这道闸"看着开着其实什么都没做",
是它最常见的失效方式。

规格是怎么被找到的

对受保护目标 src/core/x.ts,闸按顺序找:

1. src/core/x.spec.lean
2. src/core/x.ts.lean
3. src/core/specs/x.lean

无论 glob 怎么写,.lean 文件永远不会被闸拒绝 —— 规格是满足这道闸的方式,
拦住写规格会让这道闸无法被满足。

自省

strict_gate_status 报告哪些闸处于活动状态、编译出来的 glob 规则,以及计数器:

| 计数器 | 含义 |
| --- | --- |
| failures observed | 观察到的已结算异常调用数 |
| repeat notices sent | 已送达的"你在重复"通知数 |
| critical-path refusals | 被 glob 闸拒绝的写入数 |
| repair writes allowed through | 因为属于"修复"而被放行的拒绝数 |
| spec checks run by the gate | 闸自己执行的 Lean 检查数 |

一个静默运行的策略,和一个坏掉的策略,是无法区分的 —— 这个工具的存在就是让差别可见。

开发

npm test        # 72 个测试;集成测试会真的跑 Lean 内核

集成测试驱动的是真实协作者而不是桩,因为它们要防的故障是静默的:
两个插件对"已验证"的理解不一致,会让闸拒绝掉模型刚被告知"没问题"的写入。
test/activation.test.js 更进一步,驱动真实的 cordis waterfall ——
因为监听器挂在错误的事件名上、或者从不调用 next(),都不会抛任何异常,
只会让策略静默地不存在。

四个值得记住的 bug,全都是测试抓出来的而不是 review 看出来的:

- 状态用对象身份做键。 状态袋原本是 WeakMap,键是 agent 对象。宿主对同一个
agent 在不同钩子里传的是不同对象*,于是闸在一个袋子里记下"规格已通过",
却去另一个袋子找 —— 永久拒绝。现在按 session id 做键,并有容量上限。
- 规格的主语是用字符串手术推导的。 x.spec.lean 的词干是 x,
但真实文件是 x.ts;记下 x 等于把一个修复窗口开在任何写入都匹配不到的路径上。
现在主语是按目录解析出来的。
- 卸载时的未处理 Promise 拒绝。 钩子是在异步续体里挂载的,所以一次重载会在协作者
import 完成前就 dispose 掉 fiber;此时注册 effect 会抛
cannot create effect on inactive context,而且抛在游离 promise 里。
那是"插件被卸载"引发的宿主级故障,现在通过询问框架"fiber 是否还活着"来防住。
- 重复失败通知无法挂到它所描述的那次调用上。 tools/result 没有决策通道,
所以通知会排队,在下一次调用的 pre-execute 上送达。这是对的,但很容易被误判成 bug。

送达路径,精确地说

| 通知产生于 | 送达方式 | 延迟 |
| --- | --- | --- |
| tools/result(一次失败) | 排队 → 下一次调用的 pre-execute | 一次调用 |
| tools/post-execute(一次写入、一次检查) | 该结果的 additionalContexts | 无 |
| 一次拒绝 | deny 的 reason 文本 | 立即 |

拒绝没有 additionalContexts,所以为那一步排队的东西会被追加到 reason 字符串里 ——
否则一次拒绝就会静默吞掉"由这次拒绝所参与的循环"产生的那条重复提醒。

| 文件 | 职责 |
| --- | --- |
| lib/index.js | 挂载、协作者发现、卸载保护 |
| lib/gate.js | 三道闸及其决策 |
| lib/matching.js | glob 编译、路径提取、规格主语解析 |
| lib/signature.js | 失败身份与修复提示目录 |
| lib/notify.js | 唯一能抵达模型下一步的通道 |
| lib/status.js | strict_gate_status |

许可

MIT

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

💬 加入社群

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

DPharness QQ 群二维码,QQ 扫码进群
QQ 扫码进群
DPharness 飞书群二维码,飞书扫码进群
飞书扫码进群