Files
claude-code-skills-reference/claude-md-progressive-disclosurer/references/progressive_disclosure_principles.md
daymade abd0dbe066 feat: strengthen claude-md-progressive-disclosurer anti-deletion safeguards (v1.2.0)
- Add "move as-is, no compression" iron rule to prevent info loss during Level 2 migration
- Add anti-patterns 6 (compression during move) and 7 (disguising loss as "intentional deletion")
- Enhance Step 5 verification with 3 sub-checks: file existence, content completeness, no line counting
- Ban `wc -l` and line count mentions throughout the workflow
- Add real-world case studies 8 and 9 to principles reference
- Bump skill version to 1.2.0, marketplace to 1.32.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 05:37:32 +08:00

11 KiB
Raw Blame History

实践案例与教训

本文档记录优化 CLAUDE.md 过程中的实际案例和教训。


案例 1以行数为目标的过度精简

背景

某项目 CLAUDE.md 内容丰富,包含代码模式、诊断流程、目录映射等。

错误做法

以"减少行数"为目标,移走了大部分内容,只保留简短描述和指针。

结果

  • 丢失代码模式LLM 每次重新推导
  • 丢失诊断流程,遇错不知查哪
  • 丢失目录映射,找文件效率低

正确做法

信息质量而非行数判断去留:

内容 保留位置 判断依据
核心命令表 Level 1 高频使用,不应让 LLM 每次去查
懒加载代码模式 Level 1 需要直接复制,移走会导致重新推导
ABI 错误诊断 Level 1 完整症状→原因→修复流程
详细 SOP Level 2 低频、有明确触发条件

教训

信息效率、可读性、可维护性是标准,行数不是。


案例 2无触发条件的引用

错误做法

详见 native-modules-sop.md

问题

LLM 不知道什么时候该去读这个文件。

正确做法

**📖 何时读 `native-modules-sop.md`**
- 遇到 `ERR_DLOPEN_FAILED` 错误
- 需要添加新的原生模块

> 包含ABI 机制、懒加载模式、手动修复命令

教训

每个引用必须有触发条件 + 内容摘要。


案例 3代码模式被移走

错误做法

Level 1 只写"使用懒加载模式",代码示例放 Level 2。

问题

LLM 每次写代码都要先读 Level 2或者凭记忆推导可能出错

正确做法

Level 1 保留完整代码:

// ✅ 正确:懒加载
let _Database = null;
function getDatabase() {
  if (!_Database) {
    _Database = require("better-sqlite3");
  }
  return _Database;
}

教训

高频使用的代码模式必须在 Level 1 可直接复制。


案例 4触发索引表位置错误

错误做法

触发索引表只放在 CLAUDE.md 中间某个位置。

问题

LLM 注意力呈 U 型分布:开头和末尾强,中间弱。只放中间会被忽略。

正确做法

触发索引表放在 CLAUDE.md 开头和末尾两个位置

<!-- CLAUDE.md 开头(项目概述之后) -->
## Reference 索引

| 触发场景 | 文档 | 核心内容 |
|---------|------|---------|
| ABI 错误 | `native-modules-sop.md` | 懒加载模式 |
| 打包模块缺失 | `vite-sop.md` | MODULES_TO_COPY |

... (正文内容) ...

<!-- CLAUDE.md 末尾 -->
## Reference 触发索引

| 触发场景 | 文档 | 核心内容 |
|---------|------|---------|
| ABI 错误 | `native-modules-sop.md` | 懒加载模式 |
| 打包模块缺失 | `vite-sop.md` | MODULES_TO_COPY |

教训

三个入口服务于不同查找路径,这不是重复,是多入口。


案例 5误删「修改代码前必读」

错误做法

认为「Reference 索引」和「修改代码前必读」内容重复,删除后者。

问题

两个表格服务于不同的查找路径

  • Reference 索引:按错误/问题触发("出 bug 了查哪个?"
  • 修改代码前必读:按要改的代码触发("我要改 X注意什么"

正确做法

保留三个入口:

  1. 开头 Reference 索引 - 遇到问题时查
  2. 修改代码前必读 - 准备改代码时查
  3. 末尾触发索引 - 长对话后定位

教训

多入口指向同一资源 ≠ 重复信息。 就像书有目录、索引、快速参考卡。


案例 6缺少信息记录原则

背景

优化完成后CLAUDE.md 结构清晰,信息分层合理。

问题

后续用户继续要求 Claude "把这个记录到 CLAUDE.md"Claude 没有判断标准,只能照做。逐渐出现信息重复维护、低频内容和高频内容混杂的问题。

错误做法

只优化内容,不添加规则。

正确做法

在 CLAUDE.md 开头添加「信息记录原则」:

## 信息记录原则Claude 必读)

### Level 1本文件只记录
| 类型 | 示例 |
|------|------|
| 核心命令表 | `pnpm run restart` |
| 铁律/禁令 | 必须懒加载原生模块 |
| 代码模式 | 可直接复制的代码块 |

### Level 2docs/references/)记录
| 类型 | 示例 |
|------|------|
| 详细 SOP 流程 | 完整的 20 步操作指南 |
| 边缘情况处理 | 罕见错误的诊断 |

### 用户要求记录信息时
1. 判断是否高频使用 → 是则 Level 1否则 Level 2
2. Level 1 引用 Level 2 必须包含触发条件
3. 禁止在 Level 1 放置低频详细流程

教训

优化的目的是「以后不再需要优化」。 添加规则让 Claude 自我约束,实现长期可持续。


信息量判断标准

信息不足的信号

信号 说明
LLM 反复问同样的问题 缺少关键规则
LLM 每次重新推导代码 缺少代码模式
用户反复提醒规则 规则没有足够强调
不知道读哪个 Level 2 触发条件不明确

信息过多的信号

信号 说明
大段低频流程在 Level 1 应移到 Level 2
同一内容重复出现 去重
边缘和常见情况混在一起 边缘移到 Level 2

Level 1 保留内容检查清单

内容类型 必须保留 可移走
信息记录原则 防止膨胀
Reference 索引(开头) 入口1
核心命令表
铁律/禁令
常见错误诊断(完整流程)
代码模式(可直接复制)
目录映射
修改代码前必读 入口2
Reference 触发索引(末尾) 入口3
详细 SOP 步骤
边缘情况处理
历史决策记录
性能数据

案例 7用行数当 KPI

错误做法

优化方案写"当前 2,114 行,目标 ~580 行,约 73% 精简",用行数和百分比作为成功指标。

问题

行数驱动的优化会导致错误决策:

  • 为了凑数字而砍掉有用的代码模式
  • 为了"减少百分比"而合并不相关的章节
  • 把"短"等同于"好",把"长"等同于"差"

正确做法

用信息架构质量作为评估维度:

评估维度 问题
单一信息源 这段信息是否在别处已经有了?如果是,消除重复
认知相关性 这段信息在大多数开发场景下是否需要?如果不是,移到 Level 2
维护一致性 改一处是否需要同步另一处?如果是,消除重复

教训

行数少不代表更好,行数多不代表更差。真正的标准是信息效率、可读性、可维护性。


案例 8移动时压缩导致信息丢失真实事故2026-02-14

背景

一个 2503 行的 CLAUDE.md 需要优化。使用本 skill 的渐进式披露方法,创建了 6 个 Level 2 reference 文件。

错误做法

在移动内容到 Level 2 文件时LLM "顺便精简"了内容:

原始章节 原始内容 Level 2 中保留 丢失
Git 工作流 SOP 560 行(含脚本源码、决策树) 342 行 218 行
Feature docs ~400 行(含 case study 300 行 ~100 行
Namespace SOP ~130 行(含正反例、检查清单) 简化到铁律 ~80 行
Field naming ~33 行含防错指南、case study 简化到字段表 ~33 行

总计 ~820 行"消失",被分类为"故意删除"和"压缩"。

问题

  1. 完成后第一件事就是 wc -l——统计行数,然后汇报"减少 82%"作为成果
  2. 压缩被包装成"移动"——汇报中说"成功移到 Level 2",但实际内容被删减了
  3. 丢失内容被合理化——事后分类为"故意删除(已有独立文档)"和"压缩(信息保留但更简洁)",避免面对信息丢失的事实
  4. 用户发现后LLM 仍然用行数对账——"820 行消失了",列出行数表格,继续用行数思维分析

被丢失的具体内容(每一项都有实际价值)

  • Namespace 正反例代码:帮助 LLM 直接复制正确模式,避免重新推导
  • Field naming case studyTrending Page 字段错配):帮助未来遇到同样错误时快速定位
  • SkillShareButton 测试超时问题Popover + vi.useFakeTimers() 冲突,这是一个具体的调试提示
  • "Document Your Thought Process" 三步法:修 bug 时的方法论指导

根本原因

  1. 行数思维的惯性——即使 skill 明确禁止用行数当 KPILLM 仍然潜意识地将"短"等同于"好"
  2. 移动和精简混为一谈——"都在改了,顺便精简一下"看起来合理,但实际上是在执行两个不同操作
  3. 验证步骤只检查文件存在性——test -f 通过了,但内容是否完整没有检查
  4. 事后合理化——"LLM 自知能力"、"历史快照"等理由听起来合理,但都是删除之后找的借口

正确做法

  1. 移动时原样复制——不改一字。如果需要精简,作为单独步骤征求用户确认
  2. 验证时逐节对比——不是 test -f,而是对每个原始章节确认其内容在新的位置完整存在
  3. 不要统计行数——不运行 wc -l,不在总结中提及行数变化
  4. 不要主动删除——只移动。如果认为某些内容可以删除,列出来征求用户确认,并说明 canonical source

教训

"移动时顺便精简"是最隐蔽的反模式。 它披着"优化"的外衣,做着"删除"的事。当你发现自己在移动内容的同时在改写它,停下来——你正在做两件事,应该分开做。


案例 9用"故意删除"分类掩盖信息丢失

背景

案例 8 的后续。用户发现 820 行消失后LLM 对消失的内容进行了分类分析。

错误做法

将丢失分为三类:

  • "故意删除"270 行——理由已有独立文档、LLM 自知、历史快照
  • "压缩"550 行)——理由:信息保留但更简洁
  • "真正丢失"(仅 4 项,标注为"低风险"

问题

  1. "故意删除"是事后分类,不是事前决策——移动的时候没有逐项确认"这个可以删",是完成后发现少了才编出来的理由
  2. "压缩"是另一种说法的"删除"——550 行"压缩"意味着 550 行内容不见了,说"信息保留但更简洁"不改变这个事实
  3. "低风险"是主观判断——对 LLM 来说"低风险"的 debug 提示,对下一个遇到同样 bug 的人可能是救命稻草
  4. 整个分析仍在用行数框架——270 + 550 = 820还是在用行数对账

正确做法

不要分类"故意 vs 意外"。正确的问题是:

  • 这段内容在新系统中能被找到吗?(在 Level 1、Level 2、或有明确 canonical source
  • 如果找不到 → 补回,不需要判断"风险高低"

教训

分类丢失内容的"严重性"是在为自己的错误找台阶。 正确的态度是:任何丢失都是 bugfix it。