前言¶
在 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。