工程文化 · 8.3›Skill 07 · dsh-trim-cot-leakage
9 min
dsh-trim-cot-leakage
一个只有 AI 时代才会存在的 skill:清理那些读起来像泄漏出来的思考记录的散文——八类模式、一份保留清单、一条判据。
最后核对于 v0.1.1-rc.2 · commit b150a551b8 · 2026-08-22
这是 .agents/skills/dsh-trim-cot-leakage/SKILL.md 的中文精读——本站最喜欢的一个 skill,因为它处理的问题只有 AI 时代才存在:模型写的散文,经常读起来像一段泄漏出来的思考记录。
什么是「思维链泄漏」
思维链泄漏(chain-of-thought leakage)是这样的散文:它的视角是写作那场会话而不是仓库本身——引用只有那场会话才能看到的产物、叙述这次改动而不是当前状态、或者跟一个已经离开的 reviewer 争辩。
修复方式从来不是「一删了之」
段落只要还带事实子句,就要先把每个事实重述到能在 HEAD 上独立成立,再删掉周围的「记录」;完全不带事实的段落(一个审计编号、一段控制流复述)才整段删。必备背景:dsh-prose-standard 拥有本 skill 所套用的「完整命题」规则;「committed-artifact-citations」决策记录拥有引用规则的理由。
唯一的判据
对每个可疑段落问一句:一个站在 HEAD 的读者,在看不到任何会话记录、PR 线程、未提交草稿的情况下,能解析每个引用、验证每个断言吗?
不能——把幸存的事实以仓库视角重述,删掉其余。能——不管听起来多「历史」,都不算泄漏。但要注意:可解析只是过了本 skill 的门槛;在现状类表面(README、docs、JSDoc)上,一个可解析的变更故事仍然是变更叙述,由第 3 类规则把它路由到它该去的家。
八类泄漏
- 死掉的设计会话引用——
(decision 7)、(audit C2)、design §4.7、plan §1.4、阶段标签(T4、W3、P-I)、「the design ledger」、"(B ruling)"。决策有已提交的属主就按名字和路径引用;否则删掉引用,把它的事实子句重述到独立成立。 - 栈与 PR 视角——「本栈靠后的某个 PR」「本 PR 新增」「上一个 commit」。陈述已落地的机制或扩展点;推迟的工作移进
TODO标记或 issue 引用。 - 变更叙述与版本戳——「以前是」「不再」「旧的 X」,以及指示性时间戳(「v1」「这次砍」「今天」「现在」在与过去状态对比时)。陈述现在的行为;已修复的回归写成现在时的反事实(「没有 X 就会发生 Y」),绝不写成仓库史(「以前是 Y」)。
- review 编排——「Rejected in review:」「reviewer 已确认」、草稿序数(「本 note 的 v5」)、轮次归属。幸存的决策与理由以纯事实保留;删掉谁在什么时候说的。
- 对着 reviewer 的辩解——「这个强转是安全的——它只是……」「这是对的,因为……」。在注释里论证自己正确,读者是 reviewer 而不是维护者。要么陈述让代码安全的那个不变量,要么代码本身能展示就删掉注释。
- 复述与推导记录——控制流叙述(「先 X,再 Y」)、测试走读、显而易见分支的证明。删掉;只保留非显而易见的契约或不变量。
- 对冲与规划残留——「大概暂时够用」「应该够了」、没有标记的推迟。提升为
TODO/FIXME,或重述成真实的边界;删掉对冲语气。 - 写作语言混入——整体英文的散文里混着未翻译的工作语言片段(端、设计稿、
---- 私有 ----分隔符),或中文文件里反向混入。翻译或删除。
什么不算泄漏(保留清单)
没人把关的引用清理会双向翻车:误删耐久引用,漏掉死引用。以下保留规则照字面执行(references/examples.md 逐条校准):
- issue 引用——
#1470、TODO(name):、「issue #N owns the follow-up」在 HEAD 可解析;任何表面都可保留,包括 README。不要把它们挪去 Agent Note。 - Agent Note 与 postmortem 内部的已合并 PR / issue 引用——文档标准的「变更故事路由」认可的证据。
- 抑制理由——
oxlint-disable … -- reason、覆盖率忽略的理由、空 catch 的解释是必备散文;理由错了就修,绝不删。 - 反事实现在时的回归钉——「没有 X 就会发生 Y」「一个朴素的 X 会……」。
- 实测边界——「(measured: 512 nests ≈ 0.15s)」这种为常量定标的数字;「measured」这个词是承重的。
- 运行时的新旧状态——「旧连接排空后新连接才接受」是运行时生命周期,不是变更史。
- note 的变更故事小节里的历史阶段名——「the first cut shipped X」在那里是现状安全的;指示性戳(「this cut」)在任何地方都禁止。
- 按设计在仓库外解析的外部引用——标准章节(RFC 9110 §10.1.5)、Figma 帧名;§ 禁令管的是未提交的内部草稿,不管外部标准或自带 § 编号的已提交文档。
- 项目口吻与体裁形式——作为项目声音的「we」;note 的 Alternatives-considered 小节。
工作流
- 范围与排除按 dsh-prose-standard:要求显式 scope;绝不碰
vendor/、.agents/notes/archived/、已记录的 fixture 与快照——录制下来的模型输出和封存的历史保留原始声音。 - 先只读审计:跑召回电池(references/recall-batteries.md,带
--hidden让.agents/也被搜到),然后对每条命中做语义判断。电池是探针不是定义——最初大清理的每一轮都发现了电池漏掉的案例,所以还要不带预设模式地读范围内最稠密的散文(模块 JSDoc、README、Agent Note)。 - 修复从属主开始,按表面区分:生成的目录 → 改源头 JSDoc 或生成器模板再重新生成;类型等价围栏 → 改源头 JSDoc,再重贴双语两页(
verify-type-equiv钉住它们);双语对 → 更新对侧并按 dsh-translate-docs 重录;模型可见字符串 → 措辞即行为,标记为需要快照支撑的改动,而不是悄悄改写。 - 删之前,枚举段落的命题(prose-standard),并查过度纠正陷阱(references/examples.md#overcorrection-traps):把义务裁成背书、把假设升格为已发布特性、删掉真实事实、丢掉出处。
- 验证:重跑电池,预期只剩被认可的保留、本 skill 自己的目录、属主 note 里引用的证据;确认每个剩余引用在 HEAD 可解析;跑触达表面的门禁(docs 走
doc-sync,另有verify-type-equiv、verify-translation-pairing)。