READMESource: main@8bac5f67
dsh-strict-rules
DeepSeek Harness(DSH)全局行为规则插件:让所有会话自动遵守用户预设规则(先问后做、未答重问、交付前润色、边做边确认、Token 预算不设限),不依赖用户每次重复强调。可在 DSH 插件管理器中识别、启停和卸载。
| 规则 | 行为 | 实现方式 |
|---|---|---|
| R1 先问后做 | 新任务先用 ask_user_question 至少两轮提问,完成前不允许动手 | 系统提示规则 + 每回合近距提醒 + tools/pre-execute 硬门禁 |
| R2 不明确就问 | 有歧义先问;提问被取消/中断会原样重问同一问题 | 提示规则 + tools/execute 包装重试(指数退避、不设上限,按用户选择) |
| R3 交付前润色 | Word/PPT/PDF/Excel 交付前必须做一轮去 AI 痕迹润色 | 提示规则 + present 前内容哈希校验门禁 |
| R4 永久生效 | 所有会话和子代理自动适用;/rules 可查看/临时停用 | 全局 system prompt section + /rules 命令 |
| R5 边做边确认 | 工作中出现新疑惑或发现可改进之处,先问询确认再继续 | 提示规则 + 每轮提醒中的近距提醒 |
| R6 不省 Token | 用户已声明用量 unlimited、预算无上限;不因省 Token 省略调查/验证/测试/轮次,不截断交付物 | 系统提示规则(含用户原话)+ 每轮提醒中的近距提醒 |
规则细节
- 先问后做(R1):新任务或需要动手的输入先走两轮提问。
- 第 1 轮:目标、对象/范围、输入、期望输出、约束与禁忌、验收标准。
- 第 2 轮:先复述理解并请用户确认,再补问新发现的歧义。
- 完成提问前,写文件 / 改文件 / 执行命令 / 启动子代理 / 交付文件等动手工具会被拦截(只读调查与提问放行;未知第三方工具默认也拦截)。
- 用户说"直接做/别问了"、或只是"继续/好的/谢谢"时不强制提问;"不要直接做,先问我"这类否定句仍按任务处理。
- 子代理不向用户提问:遇到不明确处写入报告,由父代理统一询问。
- 已知边界:PTC 模式下 run_code 程序内部直接读写文件(不经工具)无法被拦截,规则文本会明确约束模型,但这不是机械强制。
- 不明确就问(R2):任何会影响结果的歧义先问;提问不设时长限制。用户取消或提问中断时,插件自动用同一组问题重问(指数退避、按用户选择不设次数上限;/rules off 是唯一刹车)。整个回合被用户停止(Stop)时无法在同一回合内重问。
- 交付前润色(R3):文档交付(present)前必须实际改写文件内容:先按清单自检,再逐段重写有问题的段落,保留事实、数据、引用、结构。
- 首次交付某内容会被拦截,拦截信息会写明"已记录基线 + 哈希前 8 位",并说明这是预期流程;改写保存(内容哈希变化)后再 present 才放行。
- 改写完也可以先调用工具 rules_mark_polished 登记(只记在插件状态与审计里,不会写进或改动文档),这样随后一次 present 直接放行,不必先吃一次拦截。
- 登记后如果又改了文件,需要重新润色并重新登记;同一内容润色通过后,后续回合再次交付同一版本直接放行(润色记录保留整个会话)。
- 若文件确实无法改写(如扫描版 PDF),连续 4 次内容未变化后门禁放行并写入审计(避免永久卡死)。
- 永久生效(R4):规则对所有会话和子代理生效;/rules status 查看,/rules off 临时停用(只停用强制执行与提醒,规则文本仍在系统提示中),/rules on 恢复,开关持久保存。
- 边做边确认(R5):任务执行中若对用户意图产生新的疑惑,或发现用户的想法、方案、当前做法有任何看得见的可改进之处,先问询确认再继续。
- 影响下一步的立即问;不影响当前步骤的记下来,在最近的自然停点合并成一轮问,相关问题放一起、不限条数。
- 建议直接说明价值或风险,不贴「超出范围」「可选优化」之类的标签。
- 与当前任务无关但顺手发现的明显问题,也在停点提一句,不打断当前工作。
- 文风、排版、措辞类改进放到交付前的润色环节一并处理;硬伤和风险照常提。
- 用户否决或说按原计划后,按用户决定执行,不重复提同一建议;子代理写进报告,由父代理统一问。
- 不省 Token(R6):用户的用量是 unlimited、token 预算无上限,插件把用户原话原样放进系统提示,并明确落地要求:不因 Token 顾虑省略调查、验证、测试、复核与轮次;该读全的读全、该展开的展开,交付物不自我截断;需要子代理、并行任务、重复尝试或更长推理时直接用。R6 不改变 R1–R5,也不改变工具权限、沙箱与审批策略——预算宽裕用于把事做完整、做可靠,不是跳过验证或降低标准的理由。
插件管理器可见性
按 DSH 插件元数据约定做了以下配置,插件管理器(设置 → 插件)会显示本插件而不是裸包名:
- package.json:dsh.bundle.patch(bundle 层)、icon(./icon.svg)、语义化 version;exports 暴露 ./locale/*.json。
- locale/en.json、locale/zh.json:meta.title / meta.description,中英双语标题与描述。
- icon.svg:256 KiB 以内的 SVG 图标。
- 插件管理器中可看到版本,并支持启停、卸载;卸载或禁用后重启生效。
- 禁用语义:在插件管理器里禁用本插件 = 完全停用(插件不加载,规则文本也不再注入);/rules off 只停用强制执行与提醒,规则文本仍保留。两者按你的要求区分。
- 版本号只在插件管理页显示(按你的选择,/rules status 不显示版本)。
安装(本机已完成)
本插件已安装进 desktop profile(dependencies + bundles 中的 dsh-strict-rules,链接到本目录)。重启 DeepSeek Harness 后加载本目录的最新代码;插件管理页显示 "行为规则 / Strict Rules"。
在另一台机器或重装时:
powershell -ExecutionPolicy Bypass -File "<本插件目录>\install.ps1"
或手动执行(使用 DSH 自带 CLI):
& "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add "<本插件目录>"
使用
- /rules status:查看总开关、当前回合提问进度、待润色文档;/rules 会出现在斜杠命令列表里。
- rules_mark_polished:agent 在完成文档润色后调用,参数 path(文档路径)和可选 note;标记只存在插件内存状态与 audit.ndjson 中,文档本身一个字节都不会变。
- /rules off 或 /rules on:全局停用/恢复,重启后保留最后一次状态。
- 审计:%DSH_HOME%\strict-rules\audit.ndjson(默认 C:\Users<你>.dsh\strict-rules\audit.ndjson),记录门禁拦截、提问轮次、重问、润色、放行、开关操作。
更新与维护
更新方式是"会话里说一声",流程固化成一条命令:
- 你在任意会话里说"更新插件"(或我按你的要求改完代码后)。
- 我修改源码,然后运行 update.ps1:语法检查 → 全部测试 → 重建发布包 → 检查 desktop profile 链接。
- 脚本最后提示重启;重启 DeepSeek Harness 后生效,插件管理页显示新版本。
也可以手动运行:
powershell -ExecutionPolicy Bypass -File "<本插件目录>\update.ps1"
维护配套:语义化版本 + CHANGELOG.md、update.ps1、34 项回归测试、可分发 zip。版本策略:行为变更升次版本(0.x.y),修 bug 升补丁版本。
验证情况
- 真实运行版:DSH 0.2.1-rc.5(桌面版),插件 0.2.3。
- 实测记录:0.2.0 曾在桌面版热加载成功(规则段、/rules 与门禁真实生效);0.2.1 因 rules_mark_polished 缺少 output 投影器,apply() 抛错、整个插件不加载,0.2.2 修复;0.2.3 在 0.2.1-rc.5 上现场验证:plugin-loaded 正常,只读 pwsh 管道、内置 python 探测、style_profile 只读动作放行,非白名单命令仍被门禁拦截。
- 插件管理器元数据:从 desktop profile 上下文解析 dsh-strict-rules/locale/en.json 与 icon.svg 成功;locale 目录下所有 json 均符合 meta.title/description 约定;icon 为 410 字节 SVG(上限 256 KiB)。
- 单元测试:node --test,34 项全部通过(含 R6 提示词/顺序校验、rules_mark_polished output 投影器回归、只读 pwsh 命令与管道、style_profile 只读动作、python 探测脚本白名单)。
文件结构
index.js 插件入口(name / inject / apply)
cordis.patch.yml bundle 层:把插件行插入 profile
icon.svg 插件管理器图标
locale/en.json 英文标题与描述
locale/zh.json 中文标题与描述
lib/constants.js 静态规则文本、提醒文本、润色清单、MIN_ROUNDS
lib/classify.js 用户输入分类(任务/延续/豁免/空)
lib/state.js 会话状态、开关持久化、审计、文件哈希、注入消息
lib/policy.js 门禁决策(提问门禁、润色门禁、只读白名单)
lib/readonly_probe.py 内置只读文档探测脚本(python,提问期白名单)
test/ 单元测试(含插件元数据校验)
install.ps1 安装到 desktop profile
uninstall.ps1 从 desktop profile 卸载
update.ps1 一键更新:语法检查、测试、重建发布包、重启提示
CHANGELOG.md 版本变更记录
已知边界(不是"完美强制")
- 本插件拦截的是工具调用。PTC 模式下 run_code 内部直接读写文件(不经工具)无法拦截,只能靠系统提示约束模型。
- 未通过 present 的交付(例如在回复里直接给出文件路径)无法机械校验润色;规则靠系统提示约束。
- 未知的第三方/MCP 工具在提问完成前默认被拦截(严格模式)。如确属只读且必须使用,可先 /rules off,或把工具名加入 lib/policy.js 的 SAFE_TOOL_NAMES。
- 提问期间 pwsh 放行只读命令与只读管道:数据源 Get-Item、Get-FileHash、Get-ChildItem、Get-Content、Select-String、Test-Path、Resolve-Path、Get-Location、Get-ItemProperty、Get-Command、Get-Help、Get-Volume、Get-Partition、Get-Disk;管道后接 Select-Object、Sort-Object、Format-Table、Format-List、Out-String、Measure-Object。写命令、脚本块、重定向、分号、变量赋值、子表达式、换行拼接和未知命令仍拦截。
- 提问期间只读 python 放行两类脚本:插件内置的 lib/readonly_probe.py(读 docx/pptx/xlsx/pdf/文本并输出 JSON,不写文件),以及 %DSH_HOME%\strict-rules\readonly-scripts.json 的 scripts 数组里登记过的绝对路径 .py 脚本。python -c、python -m、相对路径脚本、未登记脚本和写操作仍拦截。
- 提问期间 style_profile 的只读动作(view/card/rules/history/stats)放行;consolidate/undo/reset/import/export 等写动作仍拦截。
- 用户主动取消整个回合(Stop)时不会重问——回合已结束,没有可恢复的提问上下文。
- 子代理(subagent/teammate)不触发硬门禁,避免因无法向用户提问而死锁;规则文本仍注入其系统提示。
- agents 服务不可用/归属未知时不启硬门禁(宁可少拦不死锁)。
- 插件管理器的启停与更新需要重启 DSH 后生效(你的选择:一步命令完成,接受重启)。
- R6 是提示层规则:它让模型不因预算顾虑而省略工作,但不会改变模型服务端真实的计费或配额限制(如果存在)。
卸载
powershell -ExecutionPolicy Bypass -File "<本插件目录>\uninstall.ps1"
然后重启 DeepSeek Harness。运行时数据在 %DSH_HOME%\strict-rules\,可手动删除。
No comments yet. Be the first to write one.