原书简读版 · Book → 可读完的结构化简读稿
上游:book-learn-distill 已把原文放进
图书馆/<分类>/<slug>/原文/产出目录:图书馆/<分类>/<slug>/v<版本>-原书简读版/首个成品:图书馆/<slug>/v2.0-原书简读版/(20 章 · 16.9 万字 · 单文件阅读器)
何时启动
- 「做一版简读版」「原书简读版」「把这本压成能读完的」「/abridged 」
- 原书太长读不完,但不接受观点卡片——要的是原书的精简,不是外部科普
- 已有知识图谱,仍然缺一个能从头读到尾的正文版本
不适用
- 只想要几页要义 → 走
learn子 skill 的 2–3 小时要义课 - 只想要方法论调用 → 走
book-learn-distill的 Skill 抽象 - 原文尚未 ingest → 先走
docling-ingest
两条铁律
一、结构从书里读出来,不套模板。
每本书有自己的叙述逻辑。哲学史按"时代 → 问题 → 理论 → 人物"走,方法论书按"问题 → 框架 → 步骤 → 案例"走,论证型专著按"论题 → 论证 → 反驳 → 结论"走。 拿哲学史的骨架去套一本方法论书,会把书拆坏——段名对不上内容,压缩时只能硬填。
所以阶段 1 先摸结构,把章节骨架写进 abridged.json 的 chapterSections,
后面的并行任务和验收脚本都以它为准。脚本里没有写死任何段名。
二、先机械拆章,再逐章压缩。
把整本书交给一个任务去"按时代整理",会静默失败:任务不报错、不写文件,只是卡住。 西方哲学史 162 万字节、20 章,第一次按五个时代切五个并行任务,全部空转。 改成先切 20 个章文件、再一章一压,一次通过。
拆分是机械动作,必须用脚本,不能让模型"读一遍再分"。
七阶段
| 阶段 | 动作 | 产出 | 门禁 |
|---|---|---|---|
| 0 定版 | 定版本号、命名、保留比例 | meta.json |
确认版本名与信息量 |
| 1 读结构 | 摸清原书自己的叙述逻辑 | abridged.json 的 narrative + chapterSections |
确认骨架 |
| 2 拆章 | split-chapters.py 机械切分 |
临时 章节原文/ |
章数与原书目录一致 |
| 3 压缩 | 每 1–2 章一个并行任务 | 章节/NN-*.md |
骨架段名齐全 |
| 3.5 扳正 | normalize-headings.py |
层级与段名归一 | 先预演再 --write |
| 4 导航 | 每个分组一页导航 | 10/20/30/…-*.md |
只导航不重复正文 |
| 5 收口 | 导读目录 + 全书总结 | 00-*.md、60-*.md |
目录链接可跳 |
| 6 成品 | build-reader.py |
单文件阅读器 HTML | 占位符全部替换 |
| 7 验收 | qa-abridged.py |
通过即定稿 | 11 项硬门禁全绿 |
SKILL=${CLAUDE_SKILL_DIR}
BOOK=图书馆/<分类>/<slug>
V=$BOOK/v2.0-原书简读版
# 2 拆章(--expect 卡住漏切)
python3 $SKILL/scripts/split-chapters.py "$BOOK/原文/<原文>.md" /tmp/<slug>-章节原文 --expect 20
# 3.5 扳正层级与段名(先看预演,再 --write)
python3 $SKILL/scripts/normalize-headings.py "$V"
# 6 编译阅读器
python3 $SKILL/scripts/build-reader.py "$V"
# 7 验收
python3 $SKILL/scripts/qa-abridged.py "$V" --source "$BOOK/原文/<原文>.md"
阶段细则
0 定版
版本号接在 book-learn-distill 的产出之后:原文与图谱是 v1.x,简读版从 v2.0 起。
写 abridged.json(字段见 references/pipeline.md),同时在 meta.json 记 targetInformationRetention。
默认保留原章约 50% 有效信息。 这是"删重复表述和枝节",不是"抽成提纲"。 判据:未读原书的人能读懂论证,而不是只认识人名。
1 读结构
不要跳过这一步,也不要凭书名猜。 先读原书的目录、序言、任意两章正文,回答三个问题:
- 全书按什么推进?时间、问题、框架层级、论证步骤,还是案例序列?
- 每一章内部的固定动作是什么?把三章对照着看,重复出现的才是骨架。
- 章之上还有没有分组(部/篇/时代/阶段)?有则作为
groups,没有就按章分组。
结构原型与推导方法见 references/chapter-template.md。
定下来后写进 abridged.json。以西方哲学史为例——这是那本书的答案,不是默认值:
"narrative": "按时代正序推进;每章内部是问题—理论—人物",
"chapterSections": ["本章定位", "关键问题", "理论应对", "代表人物", "本章小结", "主要问题"]
这一步要人确认。 骨架一旦开压就很难改,20 章返工的代价远大于先聊清楚。
2 拆章
先用 rg '^##\s+第' <原文> 确认章标题层级,再决定 --pattern。
西方哲学史的坑:正文用 ## 第1章(阿拉伯数字),书末参考文献用 第一章(中文数字)。
按中文数字匹配会切出 0 章。匹配到 0 章或章数不符时不要往下走。
3 压缩 · 按本书骨架逐章写
# 第N章 <章名> ← 必须一级标题,这条与书无关
## <chapterSections[0]>
## <chapterSections[1]>
## …
段名用阶段 1 定的那套,顺序一致、不增不减。哲学史那套只是其中一个实例。
并行粒度按源文字数切,不按篇数切:一个任务 1 万汉字上下、最多 2 章。 共用的编写规范写成文件放在简读版目录下,任务提示只说「先读规范 + 读哪个 + 写哪个 + 源文多少字、目标多少字」。提示越短越不容易跑飞——毛选那次把完整规范塞进提示、 一次派 5 篇,跑了 8 分半一个文件没落盘。详见 references/pipeline.md。
这三条一定会被违反,别指望任务自觉。 首版 20 章的实际情况:8 章主标题写成 ##
(HTML 全显示"未命名章节")、4 章整体层级下移一级、10 章段名夹带写作指令
("理论应对(沿原书小节完整展开)""主要问题 list")、3 处人物条目从 ## 直跳 ####。
所以下一步是机械扳正,不是人工逐章改。
3.5 扳正 · 层级与段名归一
python3 $SKILL/scripts/normalize-headings.py "$V" # 预演,只报不改
python3 $SKILL/scripts/normalize-headings.py "$V" --write # 确认后执行
它做四件纯机械的事,不碰正文一个字:把段名还原成 chapterSections 的写法、
按标题的嵌套深度重排层级(用栈算深度,跳级自然消失且同级兄弟仍同级)、
把分组导航页的段名对齐 guideSections、给指向章节的相对链接补上 章节/ 前缀。
导航页是按位置对齐的:「关键问题」与「本时代关键问题」、「三、理论应对与接续」
与「理论应对的接续」彼此既非子串也无共同词根,只能靠顺序。所以段数对不上时它拒绝改,
直接报出来。同理,导读与全书总结不受 guideSections 约束——它们收的是全书,各有各的结构。
修完若某章的二级段名仍对不上骨架,它也会跳过并报出来——那是内容缺段,得回去补写。
4 导航 · 每个分组一页
导航页只做四件事:本组的推进线索、本组要处理的核心问题、内部如何接续、条目索引 + 逐章入口。 不复制正文,控制在 6000–11000 字节。分组的性质随书而变:时代、部、阶段、主题都可以。
5 收口
00-导读与目录.md:这是什么版本、全书主线、贯穿全书的问题线、完整目录、建议读法60-全书总结与主要问题.md:概述、各分组之间如何接续、问题线、主要问题 list、原书边界
原书边界这一节别省:它写清楚原书省略了什么、选材如何不均衡、不能直接当引证来源。
6 成品 · 单文件阅读器
build-reader.py 套 templates/reader-template.html,产出离线可用的单文件 HTML。
能力清单与标注设计见 references/reader-html.md:
- 分组 / 章节目录、全文搜索、阅读进度、明暗主题、字号、续读记忆
- 四色语义标注:黄=重点 蓝=概念/观点 红=疑问/不同意 绿=启发/关联
- 批注、章节总结、完成勾选、标注 JSON 备份与恢复
- 一键导出结构化读书笔记 Markdown
可选脑图:放 片段/00-导读与目录.html,编译时自动追加到该篇末尾。
脑图要画出分组之间的因果(前一步留下什么缺口 → 下一步为何出现),不是几张并列卡片。
7 验收
qa-abridged.py 十一关,每一关都对应一次真实返工:
Markdown
- 主标题是
#且只有一个 - 二级段名与
chapterSections逐字一致、顺序一致(旧版用子串匹配,###也算通过,放行了 6 章); 分组导航页同样按guideSections校验——首版 5 个导航页写出了 3 种段名 - 标题不跳级,且每个标题下有正文或更深小节
- 无 TODO / 待补充 / 未命名 这类占位残留
- 相对链接指向真实存在的文件
- 篇幅在区间内:导航页不膨胀成第二份正文,章节没被压成提纲
- 原书每个编号小节都出现(需
--source)
HTML
8. 无模板占位符、无占位文字、无重复篇 id
9. 目录与正文条目一一对应,目录名与正文标题一致
10. 站内锚点都能跳到存在的篇,不残留 .md 死链
11. 脑图片段的分组标题够短,不在卡片里折行
阈值可在 abridged.json 的 qaLimits 里按书调整。
改了任何 Markdown 主标题,必须重新 build-reader.py,否则左侧目录仍是旧标签——
首版就是只改了正文、忘了目录,"未命名章节"看上去像没修好。
QA 的取舍:只收纯占位词。「同上」「见上文」这类曾被列为占位残留,结果把 "人同上帝的关系"判成了问题——门禁一旦开始误报,就会被当噪音忽略,等于没有门禁。
交付物
| 文件 | 说明 |
|---|---|
章节/NN-*.md |
逐章简读正文,全书主体 |
<数字>-<分组名>.md |
分组导航页(时代 / 部 / 阶段 / 主题,随书而定) |
00-导读与目录.md / 60-全书总结与主要问题.md |
入口与收口 |
abridged.json |
本书骨架 + 装配说明,编译与验收都读它 |
<slug>-v<版本>-原书简读版.html |
单文件阅读器成品 |
<书名>-v<版本>-读书笔记.md |
读完后由阅读器导出,放书籍根目录 |
约束
- 简读版是原书的精简:不引入原书没有的事实与判断,不用模型自身知识替换原文
- 保留论证链、概念差异、人物关系与必要例子;被删的是重复表述和枝节
- 不改动
原文/、knowledge-graph.html和skills/<slug>/ - 读书笔记由使用者读完后导出,Agent 不代写个人批注