Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions 语言史/HANDOFF.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,49 @@
# HANDOFF

**交接给下一个 session。写于 2026-08-032026-08-04 第三班次更新。**
**交接给下一个 session。主体写于 2026-08-03;08-04 第三班次、08-09 去模板轮各补了一节;两轮 2026-08-28 才合到一起。**

先读这一节,再动任何东西。

---

## 〇、2026-08-04 第三班次:待核已归零
## 〇、2026-08-09 去模板轮(最近一轮,先看这段)

**这一轮不改史实,改口音。** 起因是用户的一句话:全文整体优化,降低纠正类内容,抹去 AI 生成的痕迹。

**查出来的东西**(实测,见 [提纲/去模板报告.md](提纲/去模板报告.md)):三十三篇用同一个句式开头、二十三篇用同一个加粗爆点收尾、三十篇「订正」区块格式逐字相同、1 390 处整句加粗、破折号每千字 4.9 个。**每一条单看都合规。** 前几轮的 per-chapter 审校一条也没报出来——**单章 agent 看不见"每章都这么写"。**

**做了什么**:

| | 改前 | 改后 |
|---|---|---|
| 粗体中位 / 整句加粗 | 16% / 1 390 | **1% / 0** |
| 「订正」区块 | 30 | **0**(全化进叙事) |
| 裸「年份,地点。」开场 | 28 | **10** |
| 末句加粗 | 23 | **1** |
| 破折号密度(散文口径) | 4.9‰ | **3.0‰** |
| 正文 `\*` 重构星号 | 78 | **78** |

规则先改后动正文:[写作规范](提纲/写作规范.md) §1(反模板条款)、§4(钩子不许有固定鼓点)、**§二之三(新增:排印与句式的纪律)**、**§25 之二(整条翻面:辟谣不再设栏目)**;[全书提纲](提纲/全书提纲.md)那份"计划中的订正清单"作废。

**四条给下一位的实操教训:**

1. **`style_audit.py` 又补了一轮指标**(整句加粗、破折号密度、「不是X是Y」、订正区块数,外加全书汇总行)。**理由与前两次翻车是同一个**:只量总量量不出形状——粗体中位数被压到 16% 的同一时刻,1 390 处整句加粗一处没少。
2. **批量降破折号时,冒号与逗号会弄反。** 脚本把 `**术语**——解释` 一律换成冒号,于是出现 `以及:**我们所有的近亲**` 和一句里两个冒号。**冒号只给定义和清单,逗号给连词和指代。** 修完要跑一遍双冒号扫描。
3. **改完正文务必数 `\*`。** 去模板轮做完时是 **78 个**(`grep -o '\\\*'`,去 frontmatter 与欠账块),那一轮每一步之后都数过、一次没掉。
**2026-08-28 与清账轮合并之后仍然是 78**,一个没多一个没少。
合并当天差点报成 80——那是数的时候把 `第*卷*/_卷细纲.md` 也算进去了,两卷细纲里各有一个 `\*`。
**细纲是工作底稿,不是正文**(`_manuscript.md` 的 `ignore` 里写着)。
数它的时候按 `_manuscript.md` 的篇目清单数,或者干脆用 `build_wechat.py` 产出的 HTML 对:
`cat ~/Documents/Claude/公众号-星号之下/html/*.html | grep -o '\*' | wc -l` 应当也是 78。
4. **`refresh_readme.py` 的总字数正则漏了右边那个千分位逗号**,于是"当前正文字数"那一行静静地过期了半年(一直显示 10,008)。已修,并加了未命中就报错退出。**静默失败的脚本比崩溃的脚本更贵。**

**没做完的**:「不是 X,是 Y」还有 155 处(目标 120),剩下的多是真对比,**逐句判断,不要再上脚本**。

**公众号**:`~/Documents/Claude/公众号-星号之下/` 下的 35 篇 HTML 已按新正文重建,**草稿箱里的旧稿要由用户在本机跑 `mp_publish.py --refresh` 才会更新**(要 AppSecret 与出网 IP 白名单,见那边的 README)。

---

## 〇之二、2026-08-04 第三班次:待核已归零

> **2026-08-24 合并前复核**:`debt_report.py` 原来只数行首的 `- [ ]`,清账时裂出来的缩进子条目没进统计,所以下面的「待核 0」虚报了。工具已改为连缩进一并计数,真实口径是 **762 条 · 已清 754 · 待核 8 · 成书前 0**,8 条全在第 8、9、15 章,都是写明了检索路线的 C 型。本节以下数字保留原记录不改。

Expand Down
105 changes: 63 additions & 42 deletions 语言史/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,45 +70,60 @@

| 篇 | 字数 | 节 |
|---|---:|:--:|
| [序章 · 绵羊和马](序章-绵羊和马.md) | 4,859 | 5 |
| [1 · 禁止讨论的题目](第一卷-开口/01-禁止讨论的题目.md) | 6,714 | 5 |
| [2 · 一条下降的喉管](第一卷-开口/02-一条下降的喉管.md) | 7,002 | 5 |
| [3 · KE家族](第一卷-开口/03-KE家族.md) | 5,893 | 5 |
| [4 · 操场上诞生的语言](第一卷-开口/04-操场上诞生的语言.md) | 5,629 | 5 |
| [5 · 一只羊的账](第二卷-刻下/05-一只羊的账.md) | 5,445 | 5 |
| [6 · 四次从零开始](第二卷-刻下/06-四次从零开始.md) | 5,899 | 5 |
| [7 · 矿工的字母](第二卷-刻下/07-矿工的字母.md) | 6,517 | 5 |
| [8 · 破译者](第二卷-刻下/08-破译者.md) | 6,357 | 5 |
| [9 · 不肯变成字母的字](第二卷-刻下/09-不肯变成字母的字.md) | 6,552 | 5 |
| [10 · 加尔各答的法官](第三卷-认亲/10-加尔各答的法官.md) | 6,430 | 5 |
| [11 · 把p变成f的定律](第三卷-认亲/11-把p变成f的定律.md) | 5,994 | 5 |
| [12 · 一棵树还是一片水](第三卷-认亲/12-一棵树还是一片水.md) | 6,435 | 5 |
| [13 · 听不见的音](第三卷-认亲/13-听不见的音.md) | 5,879 | 5 |
| [14 · 雅利安人是怎么被造出来的](第三卷-认亲/14-雅利安人是怎么被造出来的.md) | 6,595 | 5 |
| [15 · 从冰岛到孟加拉](第四卷-分布/15-从冰岛到孟加拉.md) | 6,665 | 5 |
| [16 · 中古音的回声](第四卷-分布/16-中古音的回声.md) | 6,584 | 5 |
| [17 · 走廊里的语言](第四卷-分布/17-走廊里的语言.md) | 7,393 | 5 |
| [18 · 沙漠河谷与角](第四卷-分布/18-沙漠河谷与角.md) | 6,893 | 5 |
| [19 · 草原与森林](第四卷-分布/19-草原与森林.md) | 6,951 | 5 |
| [20 · 稻作的三条线](第四卷-分布/20-稻作的三条线.md) | 6,138 | 5 |
| [21 · 独木舟上的语言](第四卷-分布/21-独木舟上的语言.md) | 6,482 | 5 |
| [22 · 鼓与搭嘴音](第四卷-分布/22-鼓与搭嘴音.md) | 5,661 | 5 |
| [23 · 世界上最难的地方](第四卷-分布/23-世界上最难的地方.md) | 6,955 | 5 |
| [24 · 新大陆的舌头](第四卷-分布/24-新大陆的舌头.md) | 6,799 | 5 |
| [25 · 没有亲戚的语言](第四卷-分布/25-没有亲戚的语言.md) | 7,132 | 5 |
| [26 · 日内瓦的三堂课](第五卷-解剖/26-日内瓦的三堂课.md) | 5,508 | 5 |
| [27 · 爱斯基摩人的雪](第五卷-解剖/27-爱斯基摩人的雪.md) | 7,063 | 5 |
| [28 · 句法结构](第五卷-解剖/28-句法结构.md) | 7,581 | 5 |
| [29 · 一条河边的例外](第五卷-解剖/29-一条河边的例外.md) | 6,978 | 5 |
| [30 · 手上的语言和造出来的语言](第五卷-解剖/30-手上的语言和造出来的语言.md) | 7,196 | 5 |
| [31 · 每两周一个](第六卷-存亡/31-每两周一个.md) | 5,700 | 5 |
| [32 · 让死掉的语言开口](第六卷-存亡/32-让死掉的语言开口.md) | 6,908 | 5 |
| [33 · 机器读懂了吗](第六卷-存亡/33-机器读懂了吗.md) | 6,170 | 5 |
| [终章 · 星号的另一边](终章-星号的另一边.md) | 5,036 | 5 |

当前正文字数:约 **223,993 / 215,000**(提纲与细纲另计)。

**全部 35 篇初稿完成**(序章 + 第 1–33 章 + 终章),六卷全部落地。**并已过一轮逐篇审校**——三十五篇各派一位责任编辑对着[写作规范](提纲/写作规范.md) §七 的十五项清单逐条查、直接改稿,结果见[审校总报告](提纲/审校总报告.md)。[语系谱](提纲/语系谱.md)的按章销账表**十二行全部打勾**——世界上已确认的语系、主要语族与孤立语言,在书中都有位置。
| [序章 · 绵羊和马](序章-绵羊和马.md) | 4,815 | 5 |
| [1 · 禁止讨论的题目](第一卷-开口/01-禁止讨论的题目.md) | 6,671 | 5 |
| [2 · 一条下降的喉管](第一卷-开口/02-一条下降的喉管.md) | 6,996 | 5 |
| [3 · KE家族](第一卷-开口/03-KE家族.md) | 5,856 | 5 |
| [4 · 操场上诞生的语言](第一卷-开口/04-操场上诞生的语言.md) | 5,614 | 5 |
| [5 · 一只羊的账](第二卷-刻下/05-一只羊的账.md) | 5,421 | 5 |
| [6 · 四次从零开始](第二卷-刻下/06-四次从零开始.md) | 5,831 | 5 |
| [7 · 矿工的字母](第二卷-刻下/07-矿工的字母.md) | 6,468 | 5 |
| [8 · 破译者](第二卷-刻下/08-破译者.md) | 6,368 | 5 |
| [9 · 不肯变成字母的字](第二卷-刻下/09-不肯变成字母的字.md) | 6,375 | 5 |
| [10 · 加尔各答的法官](第三卷-认亲/10-加尔各答的法官.md) | 6,340 | 5 |
| [11 · 把p变成f的定律](第三卷-认亲/11-把p变成f的定律.md) | 5,934 | 5 |
| [12 · 一棵树还是一片水](第三卷-认亲/12-一棵树还是一片水.md) | 6,382 | 5 |
| [13 · 听不见的音](第三卷-认亲/13-听不见的音.md) | 5,850 | 5 |
| [14 · 雅利安人是怎么被造出来的](第三卷-认亲/14-雅利安人是怎么被造出来的.md) | 6,548 | 5 |
| [15 · 从冰岛到孟加拉](第四卷-分布/15-从冰岛到孟加拉.md) | 6,606 | 5 |
| [16 · 中古音的回声](第四卷-分布/16-中古音的回声.md) | 6,518 | 5 |
| [17 · 走廊里的语言](第四卷-分布/17-走廊里的语言.md) | 7,388 | 5 |
| [18 · 沙漠河谷与角](第四卷-分布/18-沙漠河谷与角.md) | 6,811 | 5 |
| [19 · 草原与森林](第四卷-分布/19-草原与森林.md) | 6,908 | 5 |
| [20 · 稻作的三条线](第四卷-分布/20-稻作的三条线.md) | 6,129 | 5 |
| [21 · 独木舟上的语言](第四卷-分布/21-独木舟上的语言.md) | 6,299 | 5 |
| [22 · 鼓与搭嘴音](第四卷-分布/22-鼓与搭嘴音.md) | 5,589 | 5 |
| [23 · 世界上最难的地方](第四卷-分布/23-世界上最难的地方.md) | 6,777 | 5 |
| [24 · 新大陆的舌头](第四卷-分布/24-新大陆的舌头.md) | 6,794 | 5 |
| [25 · 没有亲戚的语言](第四卷-分布/25-没有亲戚的语言.md) | 7,123 | 5 |
| [26 · 日内瓦的三堂课](第五卷-解剖/26-日内瓦的三堂课.md) | 5,456 | 5 |
| [27 · 爱斯基摩人的雪](第五卷-解剖/27-爱斯基摩人的雪.md) | 7,007 | 5 |
| [28 · 句法结构](第五卷-解剖/28-句法结构.md) | 7,555 | 5 |
| [29 · 一条河边的例外](第五卷-解剖/29-一条河边的例外.md) | 6,945 | 5 |
| [30 · 手上的语言和造出来的语言](第五卷-解剖/30-手上的语言和造出来的语言.md) | 7,101 | 5 |
| [31 · 每两周一个](第六卷-存亡/31-每两周一个.md) | 5,607 | 5 |
| [32 · 让死掉的语言开口](第六卷-存亡/32-让死掉的语言开口.md) | 6,828 | 5 |
| [33 · 机器读懂了吗](第六卷-存亡/33-机器读懂了吗.md) | 6,177 | 5 |
| [终章 · 星号的另一边](终章-星号的另一边.md) | 5,028 | 5 |

当前正文字数:约 **222,115 / 215,000**(提纲与细纲另计)。

**全部 35 篇初稿完成**(序章 + 第 1–33 章 + 终章),六卷全部落地。此后过了三轮:**逐篇审校**、**清欠账**、以及 2026-08-09 的**去模板轮**(见下)。审校那一轮——三十五篇各派一位责任编辑对着[写作规范](提纲/写作规范.md) §七 的十五项清单逐条查、直接改稿,结果见[审校总报告](提纲/审校总报告.md)。[语系谱](提纲/语系谱.md)的按章销账表**十二行全部打勾**——世界上已确认的语系、主要语族与孤立语言,在书中都有位置。

---

## 去模板轮(2026-08-09)

**查的不是错误,是口音。** 全书被查出七条逐章复用的模板——三十三篇同一个句式开头、二十三篇同一个加粗爆点收尾、三十篇格式逐字相同的「订正」区块、1 390 处整句加粗。**每一条单看都合规,合起来像同一台机器按同一张表填出来的。**

依据与实测见[去模板报告](提纲/去模板报告.md);规则改在[写作规范](提纲/写作规范.md) §1、§4、§二之三(新增)、§25 之二(整条翻面)。主要动作:

- **去粗体 1 655 处**,中位数 16% → 1%,整句加粗清零
- **三十个「订正」区块全部化进叙事**——辟谣从"设栏目"改成"正面说,或者写这个说法是怎么长起来的"
- **十八章换了开场的入口**,裸时间地点戳 28 → 10
- **破折号密度 4.9‰ → 3.0‰**(新规:每节 ≤3 个)

`tools/style_audit.py` 已补上这四项指标加全书汇总——**per-chapter 的阈值拦不住"每章都这么写"的东西**,这一条是这轮最值钱的教训。

---

Expand All @@ -126,9 +141,15 @@

**一条没糊弄过去的边界**:单语言的母语者数确在订阅墙后($480/年)。免费的 Ethnologue 200 只给 L1+L2 总数,按[写作规范](提纲/写作规范.md) **§36②** 不能与本书的母语者数并排比。本轮只把它当上界用——书里每一处母语者数都通过了上界检验。这一条原样写在各章欠账里,没有说成「已核实」。

**3. 两处体例待定**:外语词形的转写体例(IPA / 拉丁转写 / 原文并存)尚未统一;重构式所据方案(如上古音、原始印欧语)各章分别注明,成书前应在[参考资料](提纲/参考资料.md)集中登记。
**2. 十篇超 6 500 字上限。** 增出来的字来自"把话说准"(限定词、双方并列、出处范围),不是复述,[文风体检](提纲/文风体检.md)第四节查清过。**待主编在"认掉/放宽到 7 200/压回去"三条里拍板。**

**3. 「不是 X,是 Y」仍有 155 处**(目标 120)。剩下的多是真对比,**逐句判断,不要再上脚本**。

**4. 两处体例待定**:外语词形的转写体例(IPA / 拉丁转写 / 原文并存)尚未统一;重构式所据方案(如上古音、原始印欧语)各章分别注明,成书前应在[参考资料](提纲/参考资料.md)集中登记。

**5. 时效句**:第 33 章与终章涉及正在发展中的技术与争论,已带时间戳,定稿时须重审。

**4. 时效句**:第 33 章与终章涉及正在发展中的技术与争论,已带时间戳,定稿时须重审
**6. frontmatter 的 `words` 字段全线过期**,任何时候要字数都跑 `tools/style_audit.py` 取实测,别读那个字段

---

Expand Down Expand Up @@ -169,7 +190,7 @@ cd 语言史 && python3 tools/debt_report.py # 欠账三档快照
```

```bash
cd 语言史 && python3 tools/style_audit.py # 文风体检:粗体占比 / 括号旁白 / 「我们」
cd 语言史 && python3 tools/style_audit.py # 文风体检:粗体 / 整句加粗 / 旁白 / 「我们」/ 破折号 / 订正区块
```

**字数口径**:去 frontmatter、去 HTML 注释、**去 Markdown 强调与代码记号**、去空白后的字符数。实现在 `tools/measure.py`,所有脚本从那里取。
Expand Down
8 changes: 5 additions & 3 deletions 语言史/tools/refresh_readme.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ def chnum(p):
assert re.search(pat, readme), "看板表未匹配——README 结构变了,先看一眼"
new = re.sub(pat, table + "\n", readme, count=1)

pat2 = r"当前正文字数:约 \*\*[\d,\s]+ / [\d,\s]+\*\*" # 目标数带千位逗号,[\d\s] 配不上
assert re.search(pat2, new), "总字数那一行未匹配——先看一眼 README 是不是被改过"
new = re.sub(pat2, f"当前正文字数:约 **{tot:,} / {TARGET:,}**", new, count=1)
# 两侧都可能带千分位逗号——旧版这里漏了右边那个逗号,于是这一行静静地过期了半年
new, n = re.subn(r"当前正文字数:约 \*\*[\d,\s]+ / [\d,\s]+\*\*",
f"当前正文字数:约 **{tot:,} / {TARGET:,}**", new, count=1)
if not n:
sys.exit("没找到「当前正文字数」那一行——README 的措辞变了,改这里的正则")

open("README.md", "w", encoding="utf-8").write(new)
print(f"看板已刷新:{len([r for r in rows if r[1].count('|') > 2])} 篇,合计 {tot:,} 字(目标 {TARGET:,})")
Loading
Loading