dsh-writing-discipline:给写作加一道「剃掉防御性噪音、锁住事实层」的闸门

前言

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 用一次是强调,用三次是套路;我们认为 有时是弱的正当解释。工具只负责标出来,删不删由你定。

安装与启用

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,DSH 0.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 自己列得很清楚:

  1. 中文规则偏严格:可能 在技术文本里常是真的不确定,不是防御。README 建议用 profile=academic 或 severityMin=warn 过滤。
  2. 不改写语义:wd_rewrite 只删不造,给不出「改成事实句」的替代文本。
  3. 守恒锁是启发式:数字比对按字面 token,840 ms 与 840ms 会被视为不同;主张强度靠成对词表,覆盖不到所有动词。它是安全带,不是刹车。
  4. 不处理 .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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜