jilian-dsh/dsh-rule-engine

插件Plugin 原生Native ⭐ 3 MIT

项目介绍Project Overview

dsh-rule-engine 是 DSH 规则执行引擎插件,以 ~/.dsh/AGENTS.md 为唯一规则源,动态解析规则要素与执行等级,通过工具守卫、文本检测、时序检查、LLM 裁决和 /guard 审计台账强制规则落地。适合希望把 AGENTS.md 规则机器化执行、规则增删改后无需改插件的场景。注意:项目仍在打磨期,可能存在误判与边界问题,输出文本只能事后审计纠正,无法实时拦下。

dsh-rule-engine is a DSH plugin that enforces rules from ~/.dsh/AGENTS.md. It dynamically parses rule elements and execution levels, then applies tool guards, text detection, timing checks, LLM judging, and /guard audit logs so written rules are mechanically followed. Use it when AGENTS.md rules should survive rule edits without rewriting the plugin. Caveat: it is still maturing, may misjudge edge cases, and assistant messages can only be audited or corrected after emission, not blocked in real time.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin --profile web add dsh-rule-engine

jilian-dsh/dsh-rule-engine 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

dsh-rule-engine

npm version

DSH 规则执行引擎 v3 的插件实现。它把 ~/.dsh/AGENTS.md 当作唯一真相源,自动解析规则四要素与执行等级,再通过「工具守卫 + 文本检测 + 时序检查 + 审计台账」执行用户规则,而不是内置一套与用户无关的安全清单。

当前版本 0.5.7(2026-08-26 发布)。本插件面向"规则机器化执行":规则写在 AGENTS.md 里,引擎负责让它们真的被遵守;所有规则动态解析,规则增删改后无需重写插件。

项目背景

这个项目来自一个非常具体的个人需求:

  • 作者是零编程基础用户,但极其重视规则的制定、执行、遵守与复盘。
  • 作者发现:规则如果只写在文本里、靠模型“自觉”执行,会反复失效(例如时间词写错、内联命令违规、交付前漏验证等)。
  • 因此核心思路是:规则的执行不能只靠自觉,要尽量靠插件在机制层强制
  • 本插件所有规则均从 AGENTS.md 动态解析,规则增删改后无需重写插件。

当前实现基于已有的 AGENTS.md 规则体系拓展,社区暂无类似插件供参考(大概率为该等约束可能限制开发自由性,不适用于专业编程人员),可能存在大量不完备、误判或边界问题。欢迎任何使用者提出调整建议、提交 issue 或 PR。项目仍处于“可运行但需要持续打磨”的阶段。

功能分层

  • 阶段 1 容器:解析 AGENTS.md 全部规则 → 理解产物(rule-understanding.json 可生成)
  • 阶段 2 匹配机 + 工具守卫 + 文本检测
  • 阶段 3 时序检查 + 授权询问集成
  • 阶段 4 D 级自证调度 + /guard 命令完善

当前实现以「模式库兜底」为主,LLM 理解器预留扩展点;所有规则均从 AGENTS.md 实时解析。

注入噪音治理(0.5.6 / 0.5.7)

只提醒真正值得提醒的事——这条原则贯穿 0.5.6 与 0.5.7:

  • 0.5.6:同一回复中多条违规 → 聚合为一条注入(明细全在 /guard log);回复含「规则 X 已自证/已核对…」标记 → 该规则当轮不再重复触发;C2 规则统计(detected/suppressed/injected,getRuleStats 面板接口)。
  • 0.5.7(错误才值得被提醒)
    1. 词表只产嫌疑:语义型命中不再直接定罪,标记 awaitingJudge 送裁决;
    2. LLM 裁决:给「规则正文 + 完整回复」判定是否真违规——合规声明/引述/非违规 → 不投递(judge-false);仅裁决为违规才投递(judge-pass);裁决不可用 → 不投递(fail-closedjudge-unavailable)。模型追随会话模型sha256 缓存 + 每日 50 次/会话预算;
    3. 注入轮不检测:没有真实用户消息的回合(引擎注入触发的轮次)不做检测与投递——这是"引擎自己打乒乓"循环的根治(燃料=它对自身回声的检测);
    4. 投递资格闸:同规则同会话仅提醒一次(记住已处理);会话每小时至多 3 条弹窗;
    5. 审计完整性:嫌疑/裁决/拦截/投递全部写入 /guard log——"看了不冤枉"的凭据。

质量与验证(2026-08-26,对齐官方 docs/testing.zh.md)

  • npm run test(全量单测;test/run-all.mjs 统一入口,注意 ESM 缓存顺序约定);
  • node scripts/verify-all.mjs —— 交付前四层体检:语法(lib 全文件 node --check)→ 单元(run-all)→ 组合冒烟test/loader-smoke.e2e.mjs:真实引擎代码 + 真实审计文件,仅 mock LLM 边界,断言外部世界——审计文件里真的出现 judge-false/judge-pass 记录,而非自我报告)→ 真实判例(近 24h 台账 judge-pass/false 记录数,0 条 = WARN 提示需实弹);
  • node scripts/health-audit.mjs —— 找茬清单:近 24h 失败/降级类统计(intent-llm 失败、judge-unavailable、verify-gap、inject-skip…)+ 关键导出接线交叉(疑似未接线 = 告警)——"失败可见化",不再有静默躺 20 小时的降级;
  • 执行协议(本仓库自身交付纪律):方案冻结单(范围/影响面/测试计划/失败预测)→ todo 化 → 小步闭环(每改动立即 node --check)→ 对账交付(计划×实际逐项 ✅/❌/跳过原因)。

0.5.8(2026-08-26 追加)

  • 白名单持久化:"允许使用 X"(未归类工具批准)落盘 ~/.dsh/rule-engine-tools.json——此前为内存态,热重载/重启即清(用户需反复重发,实测 esr_task/esr_close 各被清一次);
  • 只读命令词表补全Select-Object / Out-String / Format-Table / Measure-Object / Sort-Object / Where-Object / Group-Object / Out-Null / ConvertTo-Json 等常见只读 cmdlet 纳入只读判定(此前 Get-Item | Select-Object 被误判为变更拦截)——含"管道内含写操作仍判变更"的安全回归;
  • npm run verify 注册(= scripts/verify-all.mjs 四层体检别名);
  • 工作区内低风险变更豁免(12A 正文对齐:只读诊断脚本不再被拦——0.5.7 的延续项)。

任务契约与反过度工程(可选)

  • 默认关闭;可在规则引擎设置页开启「任务边界与反过度工程」总开关。
  • 开启后默认观察模式,只审计提醒;切到 armed 才真正拦截。
  • 弹窗询问默认关闭askEnabled 开启后,对依赖/hash 等动作走官方 approval 询问。
  • 支持 /guard mode|budget|contract|label 命令。

命令

命令 作用
/guard status 引擎状态(规则数/置信度/放行/解锁)
/guard rules 规则清单 + 理解产物
/guard active 最近激活了哪些规则、为什么
/guard log [N] 最近 N 条审计
/guard unlock [N] 解锁配置写保护 N 分钟(仅用户)
/guard bypass [N] 临时整体放行 N 分钟(仅用户)
/guard lock 立即恢复全部守卫(取消解锁/放行)
/guard revoke 撤销全部授权记录
/guard reload 强制重解析 AGENTS.md
/guard mode <模式> 设置任务契约模式(review/answer/change/monitor/watch/off)
/guard budget ... 设置预算(agents=N files=... deps=allow hash=allow)
/guard contract 查看当前任务契约
/guard label <id> <label> 给审计记录打标(correct/incorrect/inconclusive)

装配方式

本插件已按官方 bundle 规范打包,包内自带 cordis.patch.yml

推荐安装方式:

dsh plugin --profile web add dsh-rule-engine

或手动将 dsh-rule-engine 加入 profile 的 dsh.profile.bundles 数组。包内的 cordis.patch.yml 会自动挂载插件行:

- insert:
    - id: dsh-rule-engine
      name: 'dsh-rule-engine'

如果你是从源码手动调试,也可以沿用 insert 方式挂载,但正式安装建议走 bundle。

安全设计

  • 只读操作(read/grep/glob/read_image/str_replace_editor view)无条件放行,拦截只针对变更类操作
  • 插件自身配置/理解产物对模型只读:直接 edit/write 会被守卫拒绝,需 /guard unlock
  • AGENTS.md mtime 变化后自动重解析(fs.watch + stat 兜底),规则增删改无需重启
  • 修改插件 lib 代码后必须重启 DSH 生效:bundle 装配下 dev_reload_package 热重载不可靠(报成功但行为仍旧代码,踩坑 65);重启后以行为实测(如“请继续”放行)验证
  • LLM 意图兜底:对词表低置信/歧义的用户消息异步调用 ctx.llm 判定意图(sha256 缓存 + 会话每日限额),词表判拦且 LLM 高置信判执行时放行;失败自动降级词表(rule-engine.jsonllmIntent 配置段可开关/调阈值)
  • 状态信号:用户“我已重启/已输入/完成”等就绪确认与无消息回合不做规则 22 拦截,敏感操作仍由 12A/13A 把关(规则 22⑩)
  • 低置信规则不参与硬拦,避免误伤;在 /guard rules 中标记人工复核
  • 授权证据按“操作类型 + 目标路径前缀”结构化匹配,区分“询问”与“授权”
  • 备份证据按“目标路径 → 备份路径”记录,删除/覆盖前必须存在对应路径且备份文件真实存在
  • 版本/手册类文件写后自检:版本号连续、append 不覆盖上一行,失败自动回滚并审计
  • 跨工具一致性:同一敏感操作经 edit / write / str_replace_editor / pwsh 必须得到相同拦截/放行结论
  • 命令输出静默错误检测:全 false/0/null 或与上一条完全一致时审计 + 注入提醒,不阻断
  • 注入提醒通道实测限制(2026-08-24,O1 实测——已修复,批次 6): 根因:agent.injectsession/event 观察回调内同步调用,命中 dsh-session 的 append 重入保护(session append cannot reenter,日志 kind:inject 可见);2026-08-24 批次 6 已修复:投递延迟到 append 发布边界之后(宏任务),语义不变(inject 官方语义即“为下一 pre-step 排队、不唤醒”);审计从 注入异常 变为 注入已投递 可对账(详见局限 6)
  • 消息注入判别(机制 A,2026-08-24)user/message 先判 source.kinduser 以外的官方/插件注入一律跳过:不覆盖回合状态、不产生授权),并用已知注入模板兜底(Current runtime context 快照 / Background subagent 通知 / vision-router 挂载提醒 / [规则引擎] 前缀),全部留 source-skip 审计——系统注入与插件挂载通知不再污染授权池
  • 工具分类制(机制 B,2026-08-24):工具按 analysis / artifact / mutating / unknown 四类判定;未归类工具(新装插件的工具)首次调用走 ask 确认(防“参数名猜不出就放行”的绕过),已归类只读命令(npm test / git -C / node --check / gh auth status 等,按命令链分段判定)无条件放行
  • 授权双轨 + revoke 全清(机制 C,2026-08-24):自动来源授权(执行分点/ask/指令)绝不写入全局池(全局仅显式白名单);/guard revoke 全清 session + turn.scopes + global + askRejections;授权路径匹配带边界(d:/a.txt 不再误匹配 d:/a.txt.bak
  • 技能目录实时联动:ctx.skills 目录变化后自动刷新,已禁用/不存在的技能不触发 12B
  • LLM 增量理解:对非 high 置信规则调用 ctx.llm 补全结构化理解,失败自动回退模式库;AGENTS.md 变化触发重载后会自动补一次增量理解(按规则+版本去重,不重复烧 token)
  • D 级自证泛化:按规则特征触发自证提示,每规则每会话限 3 次
  • D 级自证泛化(0.5.7 起取代上行语义):词表只产嫌疑,LLM 裁决确认错误才提醒;同规则同会话仅提醒一次 + 会话每小时 3 条弹窗预算;无真实用户消息的回合不检测不投递(乒乓根治)
  • 授权记录默认 10 分钟 TTL,无路径的全局授权 TTL 缩短为 2 分钟;可用 /guard revoke 撤销
  • 用户直接命令式指令(如“删除这个文件”)也视为授权
  • 规则 1 支持“用户明确要求重试”豁免
  • 会话状态有容量上限并自动清理,防止长跑内存膨胀
  • LLM 理解按“规则 + AGENTS.md mtime”去重,避免重复烧 token
  • 审计日志:~/.dsh/rule-engine.log.jsonl
  • 守卫使用 ctx.tools.guard() 单调拒绝,模型无法自行绕过
  • 自由区域(Free Zone):AGENTS.md 中 <!-- free-zone:start --> / <!-- free-zone:end --> 标记框住的区段整区跳过(不解析、不产生规则、不硬拦、不审计)——适合放“想生效但不想被机器强制”的软约束(如法律守则)。区内的 ### [规则 F<n>] 条目由配套插件 dsh-rules-manager 在设置页//rules 中可见可管理。新增自由规则请手动在标记内编写(/rules add 只会插入到 free-zone 之前),详见 dsh-rules-manager 的 README「📝 新增一条自由规则(零基础三步)」
  • 禁用规则联动:dsh-rules-manager 的「禁用规则」存储(~/.dsh/disabled-rules.json)会被引擎读取,被禁用的规则标记为 disabled,不参与硬拦/纠察;恢复启用后自动重新生效

当前局限与后续优化路线

当前版本已经具备完整四层骨架,但距离“成熟”仍有距离。以下是一些难度较高、尚未完全实现的优化方向,欢迎社区共同推进:

  1. LLM 理解器深化 当前只对非 high 置信规则做一次 LLM 增量理解;未来应支持“规则变更窗口期”、增量重理解、低置信人工复核队列。

  2. 授权语义精确化 当前 ask 授权记录为宽泛 any + 路径前缀;未来可要求 ask 面板显式声明操作类型,或支持“一次授权仅针对单个 callId”。

  3. 备份证据完整化 当前校验备份文件存在;未来可增加哈希/大小一致性校验、备份链管理与自动清理。

  4. 规则 12C / 13B / 10 / 15 / 19 等流程类规则深度执行 这些规则需要更多业务语义(下载校验、会话三层验证、版本判断、知识沉淀),目前偏“自证提示”,尚未做到机器可判定。

  5. 跨会话持久化 授权/备份目前为内存态,重启失效。持久化涉及写入保护、并发与恢复,风险较高,暂未实现。 注(0.5.7):验证通过记录 verifyPass 已持久化(~/.dsh/rule-engine-verify.json,热重载/重启不丢)——规则 23④ 证据链;授权/备份仍为内存态。

  6. 输出文本实时拦截 受 DSH 官方架构限制,assistant/message 无法“拦下不发”,只能事后审计 + 纠正注入;这是平台边界,不是插件能单独突破的。 另外(2026-08-24 实测 O1 → 批次 6 已修复):纠正注入通道根因是引擎在 session/event 观察回调内同步调用 agent.inject,触发 dsh-session 的 append 同步重入保护(session append cannot reenter while another append is being publishedkind:inject 审计全程可见——注入消息从未到达模型/界面);修复为延迟到 append 发布边界后投递(宏任务 setTimeout 0),inject 官方语义本就是“为下一 pre-step 排队、不唤醒”,语义不变;审计 reason 从 注入异常:session append cannot reenter... 变为 注入已投递(agent=...),可对账(测试 test/phase1f-inject.test.mjs 锁定)。

致谢

感谢以下项目与作者的无私开源付出,本项目在开发过程中直接受益:

  • DeepSeek Harness 官方团队(@deepseek-ai):提供了 DSH 平台、插件机制与官方文档。
  • 本机已安装插件的作者们
    • dsh-guardian(lonelymoon87)
    • dsh-visualize(Nagi-ovo)
    • dsh-rules-manager(jilian-dsh)
    • dsh-vision-router、dsh-super-injector 等未列出的作者
  • 学习参考的社区文档/库作者
    • dsh-handbook(Electricitysheep)
    • SandBase deepseek-harness-handbook(sandbaseai)
    • 以及 DSH 官方文档镜像与源码维护者

免责声明

本项目是个人/社区项目不属于 DeepSeek Harness 官方项目,与官方无隶属关系。使用风险自负,请在生产环境前充分测试。

开发与测试

npm test
bash scripts/build.sh

交付前体检(0.5.7 起):node scripts/verify-all.mjs(四层:语法/单元/组合冒烟/真实判例)与 node scripts/health-audit.mjs(找茬)——详见「质量与验证」。

发布:node ../../scripts/release-plugin.mjs <插件目录> <版本号>(一键 npm + git + GitHub Release,见 scripts/release-plugin.mjs 注释)。

License

MIT

上一个 Prev deepseek-harness-voice-context 下一个 Next dsh-launcher