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