前言¶
DSH(DeepSeek Harness)的理念是「一切皆插件」,社区维护者会针对智能体写作、提示词纪律这类工程环节做独立插件。下面介绍的 dsh-writing-discipline(维护者 oobitoooo,分类 admin-security)就是其中偏审计向的一个:它不是排版工具,也不是风格润色器,而是一个「写作纪律闸门」。
它针对的问题很具体:模型在写东西时会习惯性地为不被指责而写,而不是为把事交付而写。结果是免责、「作为一个 AI」、说教劝退、无意义对冲、过程旁白这类防御性表达大量出现在交付物里,读者看完无法行动。清理这些表达的工具市面上不少,但最大的风险不是删不干净,而是顺手把真事实一起删了——主语里的否定、数字、引用、适用边界、主张强度。这个插件同时做两件事:清掉防御性噪音,并用守恒锁证明改写前后事实层一个字都没动。
这是什么¶
一句话定位:一个零网络、零 LLM、纯本地正则加统计的 DSH 插件,用五个确定性工具检测并清除防御性写作,同时保证改写不破坏事实层。它不调用任何外部服务,同样的输入永远给同样的输出,因此可以放进 CI 或 pre-commit。
- 名称:
dsh-writing-discipline - 维护者:oobitoooo
- 分类:admin-security
- 当前版本:0.2.1
- 许可:MIT
- 目录页:https://www.skillhub.cn/plugins/oobitoooo/dsh-writing-discipline
- GitHub:https://github.com/oobitoooo/dsh-writing-discipline
插件对应目录页由社区独立站点维护,与 DeepSeek / 幻方没有官方从属关系。
它匹配的五类病灶¶
README 把它针对的问题列成一张表,每一类都对应现实中的固定表达:
| 病灶 | 典型形态 | 代价 |
|---|---|---|
| 免责 | 「仅供参考」「不构成任何建议」 | 交付物变成半成品,责任推回读者 |
| 能力自贬 | 「作为一个 AI」「能力有限」「如有疏漏」 | 占篇幅,零信息 |
| 说教劝退 | 「请注意」「务必确保」「建议谨慎」 | 用姿态替代参数 |
| 无意义对冲 | 「可能或许大概」「一定程度上」 | 主张被稀释到无法据此决策 |
| 过程旁白 | 「首先我需要了解…」「接下来我将」 | 纯噪音 |
只做一个环节的工具是残缺的:只做清理是排版工具,只做事实核对是审计工具。这个插件明确两者缺一不可。
五个工具¶
安装后会在工具表中出现五个以 wd_ 开头的工具,全部确定性。
wd_scan — 扫描¶
{ "text": "……", "profile": "chat", "severityMin": "warn", "maxWarn": 3, "verbose": true }
// 或 { "filePath": "docs/report.md" }
返回 ERROR / WARN / INFO 计数、逐条命中(这条规则、行号、段落、命中原文、语义片段、建议动作),以及文本指标(平均句长、对冲密度、破折号密度)。
profile 控制判定严格度。README 明确区分了几种文档类型:
chat:hedge 记 WARN,说教 / 免责记 ERROR(chat被描述为默认常见值)。report/readme/email:同上,元评论残留加重。academic:hedge 全部降级为 INFO,理由是学术 hedging 是 ICMJE 认可的正当表达。review:「as requested」「按要求」类过程残留不报。
wd_rules — 规则速查¶
列出 24 条规则加 3 条密度规则在当前 profile 下的实际严重度。README 的用法建议是写作前扫一眼,比写完再改便宜。
wd_rewrite — 确定性改写¶
它只做三件有把握的事:剥离引子(好的, / 请注意, / 需要注意的是, / 温馨提示:)、压缩堆叠对冲(可能或许 → 可能、may potentially → may)、删掉纯防御句。硬约束是含数字、引用、图表编号、链接的句子永不删除。返回改写后文本、逐条变更记录,以及对改后文本的复扫结果。
需要说清边界:它不生成新句子。「把这句话改写成事实句」这种语义级改写要人来做。
wd_conservation — 守恒锁¶
{ "original": 原文, "revised": 改后文本 } // 或 originalPath / revisedPath
它对比改写前后,检查四类事实漂移,并给出级别:
| 检查 | 级别 | 说明 |
|---|---|---|
| 数字 / 单位 / 百分比 / p 值 / n= | INVARIANT |
丢失即 HIGH,必须回滚 |
| 引用键 / 图表编号 / DOI / URL | INVARIANT |
同上 |
| 主张强度上调 | VIOLATION |
可能→导致、associated→caused、suggests→proves |
| 段落否定漂移 | INVARIANT |
相似度 ≥40% 的段落里 不/未/never 数量变了 |
| 适用边界词消失 | CANDIDATE |
仅/限于/only/within 被删——人工确认 |
INVARIANT / VIOLATION 一旦出现即 ok: false,CI 可以直接红。
wd_stats — 指标¶
统计字符、中文词数、英文词数、段落、句数、平均句长、对冲密度(每千语言单位)、破折号密度。README 给出的典型用法是改写前后各跑一次,用数字说话。
规则表¶
README 列出 25 条规则加 3 条密度规则,按组划分:
| 组 | 规则 |
|---|---|
| 防御性 | 能力自贬、拒绝式措辞、道歉、自我评价、免责类、防御性声明、推责专业人士、合规姿态 |
| 元评论 | 社交尾巴、开场白、过程旁白、反问请示、修改过程残留 |
| 对冲 | 中文信使词、英文信使词、模糊程度词、限定词堆叠(ERROR) |
| 文体 | 绝对化、填充开头、中文套话、英文套话、不是X而是Y、元评论开场白、铺垫式开头 |
| 密度 | 段落软对冲 ≥3 处且 0 处量化数据 → ERROR、破折号 >6‰、超长句(中 >55 字 / 英 >34 词) |
密度规则是它和普通禁词表的关键差别:单独一个 可能 不是问题,一段里三个 可能 且一个数字都没有才是。
判定分级与建议动作¶
级别分三档,每级对应不同的 CI 策略:
| 级别 | 含义 | CI 策略 |
|---|---|---|
ERROR |
防御性写作,删掉不损失信息 | 必须为 0 |
WARN |
可疑:软对冲、绝对化、套话 | 设阈值,看趋势 |
INFO |
学术语境下的正当 hedging | 不计入失败 |
每条命中都带 action,有四种取值:
CUT:整句删。TIGHTEN:压缩,保留信息、去掉保险层。REFRAME:改写成事实句,从条件推到后果。REVIEW:需要人判断,不要自动删。
REVIEW 的存在有明确理由:不是X而是Y 用一次是强调,用三次是套路;我们认为 有时是弱的正当解释。工具只负责标出来,删不删由你定。
安装与启用¶
方式 A:本地 link(开发 / 自用)¶
dsh plugin --profile desktop add link:C:/path/to/dsh-writing-discipline
方式 B:从 GitHub 装¶
dsh plugin --profile desktop add github:oobitoooo/dsh-writing-discipline
装完重启 DSH(或等插件热加载),wd_* 五个工具就会出现在工具表里。
注:安装命令中的
link:/github:前缀与--profile desktop均为 README 原文写法。它只用到ctx.tools.register和defineTool,DSH0.1.x与0.2.x均可。README 明确说明没有 postinstall 脚本、不写磁盘、不改配置。
命令行(CI / pre-commit)¶
插件带有独立 CLI——装完包就有 wd-lint:
wd-lint README.md docs/DESIGN.md # 多文件
cat x.md | wd-lint - # stdin
wd-lint -t "本内容仅供参考。" # 直接测一段
wd-lint -m 3 src/ # WARN 预算 3
wd-lint --json x.md # JSON,给 CI 解析
wd-lint --fix x.md # 就地改写(原文件存 .bak)
wd-lint --diff before.md after.md # 守恒锁:两版事实是否漂移
退出码:0 通过;1 有 ERROR 或超出 WARN 预算;2 用法或 IO 错误。
README 专门解释了 WARN 预算的用途:存量项目一开始必然一堆 WARN,直接卡死没人会开。先清到 ERROR=0,再把预算从 20 一周周压到 0。wd-lint -m 3 的就是「这周最多容忍 3 个 WARN」。
pre-commit 示例:
- repo: local
hooks:
- id: writing-discipline
name: writing discipline
entry: wd-lint -m 0
language: node
types: [markdown, text]
接 CI¶
README 给了两种方式。一种是直接在工作流里调用规则模块:
- name: writing discipline
run: node -e "import('./lib/rules.js').then(m=>{const r=m.scan(require('fs').readFileSync('dist/README.md','utf8'),{profile:'readme'});if(!r.ok){console.error(m.formatReport(r));process.exit(1)}})"
另一种是直接 import 纯函数,scan / rewrite / conservation / stats 都不依赖 DSH 运行时:
import { scan, conservation } from 'dsh-writing-discipline/rules'
const r = scan(text, { profile: 'report' })
if (!r.ok) throw new Error(`防御性写作 ${r.counts.error} 处`)
const c = conservation(before, after)
if (!c.ok) throw new Error('改写破坏了事实层:' + c.items.filter(i => i.severity === 'error').map(i => i.message).join('; '))
适用场景与注意¶
适合谁:需要在一条流水线里对中文技术文档、README、报告、邮件做规范化的 DSH 开发者,尤其是想把写作纪律变成 CI 门槛、而不是口头约定的团队。它能对 --fix 场景做就地改写,也能在 CI 里用守恒锁兜底。
需要留意的边界,README 自己列得很清楚:
- 中文规则偏严格:
可能在技术文本里常是真的不确定,不是防御。README 建议用profile=academic或severityMin=warn过滤。 - 不改写语义:
wd_rewrite只删不造,给不出「改成事实句」的替代文本。 - 守恒锁是启发式:数字比对按字面 token,
840 ms与840ms会被视为不同;主张强度靠成对词表,覆盖不到所有动词。它是安全带,不是刹车。 - 不处理 .docx/.pdf:纯文本进,纯文本出,Office 文档请先用对应 skill 抽取。
插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。仓库附带了代码与规则实现,测试用 npm test 跑(17 个用例,纯 node:assert,无依赖),npm run check 做语法检查。规则都集中在 lib/rules.js 的 RULES 数组里,加一条就是加一个对象。test/smoke.mjs 会校验「所有正则都能编译」和「ruleId 不重复」。
结尾¶
这个插件的价值不在「一键消灭废话」,而在它把两件平时分开做的事绑在了一起:用确定性规则清掉防御性表达,同时用守恒锁把数字、引用、否定和主张强度压在原地。前者决定了交付物能不能被行动,后者决定了自动清理能不能被信任。
目录页:https://www.skillhub.cn/plugins/oobitoooo/dsh-writing-discipline
GitHub:https://github.com/oobitoooo/dsh-writing-discipline