dsh-override-guard:凌驾 dsh-purge 之上的净化层

前言

在 DeepSeek Harness(DSH)里给智能体挂插件时,dsh-purge 一类组件会在 system-prompt/assemble 链路上用 prepend: true 且 await next() 的方式改写最终系统提示。链上后注册的净化逻辑往往会被它「包」住,单靠抢注册顺序很难保证结果干净。若上游 hook 吞掉用户消息、或在工具调用上留下 blocked / 拒答文案,模型侧看起来就像被别的插件代笔。dsh-override-guard 针对的是这类局面:在不动模型、不替换 prompt 的前提下,对装配结果做二级净化,并辅以源码级自愈。

这是什么

dsh-override-guard 由 X-max0 维护,目录分类为 admin-security。它定位为凌驾于 dsh-purge 之上的净化层——装配后再次净化系统提示、恢复被吞没的用户消息、清理工具上的 blocked 与拒答错误标记、侦测伪造拒答并写日志,以及在 dsh-purge 升级把门装回去时修复其源码。设计目标是:不让任何插件代替模型发声。

核心功能

下面能力与 README 一致,可按需组合理解。

系统提示二级净化

装配完成后仍会处理:

  • 去掉 Excluded targets only: ... 一类区域/扇区排除句;
  • 将裸的 <project_instructions> 改写为带 scope 属性的形式。

除上述三项外,净化还覆盖固定拒答串 该目标在禁止范围内……;其余内容不碰。

消息与工具

  • 在 agent/pre-step:净化 decision.messages;若 messages 被上游弄空,则尝试恢复被吞没的用户消息。
  • 在 tools/pre-execute:清除其他插件设置的 exec.blocked 以及拒答文案形态的 exec.error。

伪造拒答与自愈

  • 通过 session/event 侦测短 assistant 文本中的伪造拒答,记录来源与时间戳。
  • 定时器约每 5 分钟检查 dsh-purge 标记;必要时对 net-scope.js、index.js、core.js 做带 [operator-fix] 标记的幂等补丁(修改前写 *.bak-<timestamp>)。若 dsh-purge 大版本改了签名,heal 会报 pattern 未命中而不是乱改文件。

与 dsh-purge 的竞态策略

dsh-purge 在链首改写下游产出,因此本插件采用纵深防御,而非抢注册:

手段 位置 作用
事后净化 system-prompt/assemble、agent/pre-step 最后一次改动仍再过一遍净化
源头净化 $DSH_HOME/prompt-inject.md 与加密槽 注入内容已是干净形态
源码自愈 net-scope.js / index.js / core.js 升级重装门禁后约五分钟内再次移除

安装与启用

推荐使用官方 tarball 安装(web profile 示例):

dsh plugin add https://codeload.github.com/X-max0/dsh-override-guard/tar.gz/refs/heads/main --profile web

也可使用 Git 或本地链接:

dsh plugin add https://github.com/X-max0/dsh-override-guard.git --profile web
dsh plugin add "link:C:/path/to/dsh-override-guard" --profile web

注意: 宿主进程运行中执行 dsh plugin add 或 pnpm add 会重写 node_modules 并中断当前进程。应先停止宿主,或接受重启。安装完成后需重启一次宿主,dsh.profile.bundles 在启动时加载。

若使用 pnpm 9/10 且日志出现 Ignored build scripts: dsh-override-guard,需执行一次 pnpm approve-builds,否则 postinstall 无法把包注册进 profile bundles;也可手动在 profile 的 dsh.profile.bundles 数组中加入 "dsh-override-guard"。

手动安装时:将包放到 $DSH_HOME/profiles/web/node_modules/dsh-override-guard,并在 $DSH_HOME/profiles/web/cordis.patch.yml 追加:

- insert:
    - id: dsh-override-guard
      name: dsh-override-guard
      inject: [systemPrompt, tools]
      config: {}

典型用法

安装并重启后,可用自带 CLI 查看状态与修复:

dsh-override-guard status   # inject 文件、purge 标记、override-state
dsh-override-guard verify   # 任意问题则退出码 1
dsh-override-guard heal     # 立即执行完整修复
dsh-override-guard where    # 解析后的路径

确认插件已被宿主加载:

grep "plugin.applied" "$DSH_HOME/override-guard/guard.log" | tail -1

运行时日志路径:$DSH_HOME/override-guard/guard.log。常见事件含义如下:

事件 含义
plugin.applied 已被宿主加载
assemble.sanitized 系统提示被重写
preStep.restore 恢复被吞没的用户消息
tool.unblock 清除 blocked 标记
denial.detected 捕获伪造拒答(附摘录)
heal.trigger / heal.done purge 源码被回滚后已修复

Cordis 侧注册的 hook 摘要:

事件 选项 行为
system-prompt/assemble prepend await next() 后净化 sections[].text
agent/pre-step 默认(链尾) 净化消息;空则恢复
tools/pre-execute prepend 清理 blocked / 拒答 error
session/event global 侦测伪造拒答
定时器 — 约每 5 分钟检查 purge 并自愈

适用场景与注意

适合谁: 已在 DSH 0.2.x 环境使用 dsh-purge 1.x,且需要在对模型 prompt 不做替换的前提下,保证装配结果、会话消息与工具执行面不被其他插件「代笔」或锁死的运维/红队/自托管管理员。要求 Node >= 18,与 dsh-purge 同代宿主。

权限与安全: 插件以当前 DSH 进程权限运行,并会修改 $DSH_HOME 下注入文件与(必要时)dsh-purge 源码。安装前应阅读 仓库源码 与 MIT 许可证,确认符合你的合规与审计要求。

卸载:

dsh plugin remove dsh-override-guard --profile web

同时删除 cordis.patch.yml 中的对应 insert 项并重启;遗留的 *.bak-* 可按需删除。

结尾

dsh-override-guard 把「事后净化、源头净化、源码自愈」叠在一起,用来对冲 dsh-purge 在 assemble 链首改写的行为,而不是与它在注册顺序上赛跑。社区插件目录见 SkillHub 条目;源码与完整说明见 GitHub:X-max0/dsh-override-guard。

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

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

Xiaoye