Files
digital-me-history/digital-me-backend/docs/考验-汉.md
T
admin 0593ff7e62
nginx serve /uploads direct (audio speed) / patch-nginx (push) Failing after 1m34s
数字我 Digital Me:全量入库(大文件走 Git LFS)
2026-10-10 16:24:43 +08:00

320 lines
22 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 考验 · 汉 —— 残差 = 天
> **一句话:天 = 0 格。而这不是「没测到」,是【测不到】—— 我能证明。**
> 而老板要验的那一格(李广),**不是最大的正残差 —— 它是最大的【负】残差。**
跑法:`computeRank(profileFromSubs(subsOf(id), { wang: 0 }), 'han')`
数据:`src/renwu.js`(十人,画像/实职/入仕,curl 双证)· `src/kaoyan.js`(成绩单 + 残差)
**引擎(`dynasties.js` / `talents.js`)一个字未改。** `npm test` 473/473。
---
## ⚠ 先读这一条:这场考试不合法
**引擎的汉 = 东汉(`era:'东汉'`, `span:'25–220'`);本表十人 = 西汉,全部死于公元前 87 年以前。**
十人里**四个的实职是御史大夫**,而 `dynasties.js` 自己的铁律写着「御史大夫**不是东汉官**,绥和元年(前8)罢」。
⇒ **引擎里那个汉,连这四个人的官名都不存在。**
**✗ 谁都不许把下面任何一个数读成「引擎在汉朝的准确率」。那个数不存在,因为题目错配。**
跑它的理由只有一个:**量出引擎的行为**,不是给引擎打分。
---
## 成绩单 + 残差(每人一行)
`residual = 引擎给的位阶 − 他真到的位阶`
· **正残差(算高了)= 天** —— 引擎说他该到,他没到。
· **负残差(算低了)= 引擎缺变量** —— 他到了,引擎说他到不了。**这不是天,是我们的错。**
| 人 | 画像(史官的字,逐字) | 出处 | 我们认出的 subs | 引擎给的 | 他真到的 | **残差** |
|---|---|---|---|---|---|---|
| 晁错 | 錯為人**陗直刻深** | 《史記》卷101 | blunt, rigorous | 辟召·县令 **3** | 御史大夫 **5** | **−2** 缺变量 |
| 张汤 | 湯爲人**多詐,舞智以御人** | 《史記》卷122 | —(空) | 一条路都不开·斗食 **0** | 御史大夫 **5** | **−5** 缺变量 |
| 汲黯 | 黯為人**性倨,少禮,面折,不能容人之過** | 《史記》卷120 | blunt | 军功·县令 **3** | 主爵都尉 **5** | **−2** 缺变量 |
| **李广** | 廣**訥口少言**,其善射亦天性也,莫能及廣 | 《史記》卷109 | —(空) | 一条路都不开·斗食 **0** | 郎中令(九卿)**5** | **−5** 缺变量 |
| 李蔡 | 蔡**爲人在下中**,名聲出廣下甚遠 | 《史記》卷109 | —(空) | 一条路都不开·斗食 **0** | 丞相 **5** | **−5** 缺变量 |
| 公孙弘 | 弘為人**恢奇多聞**/**意忌,外寬內深** | 《史記》卷112 | datadriven, warm | 辟召·县令 **3** | 丞相 **5** | **−2** 缺变量 |
| 董仲舒 | 董仲舒為人**廉直** | 《史記》卷121 | blunt | 军功·县令 **3** | 江都相→膠西相 | **—** 量不了 |
| 桑弘羊 | 雒陽賈人子,**以心計**,年十三侍中 | 《史記》卷30 | datadriven | 辟召·县令 **3** | 御史大夫 **5** | **−2** 缺变量 |
| 兒宽 | 寬為人溫良…**善著書、書奏,敏於文,口不能發明也** | 《史記》卷121 | warm, calm | 一条路都不开·斗食 **0** | 御史大夫 **5** | **−5** 缺变量 |
| 程不识 | **爲人廉,謹於文法** | 《史記》卷109 | rigorous | 辟召·县令 **3** | 太中大夫(比千石) | **—** 量不了 |
**天(正残差):0 格 | 缺变量(负残差):8 格 | 算对:0 格 | 量不了:2 格**
**残差的值域:{−5, −2}。只有两个值,中间什么都没有,正的一个也没有。**
> 「量不了」**不是**「算对了」:董仲舒是诸侯王相、程不识是比千石 —— **本表的梯子上没有他们站的地方**。
> ✗ 不许算成错(那是拿「我们没有这一格」冒充「他不行」),✗ 也不许算成对。
---
## ★ 李广那一行 —— 老板点名要单独拎出来的那一格
```
引擎:一条路都不开 → 郡县小吏,斗食(tier 0)
史料:「然廣不得爵邑,官不過九卿」(《史記》卷109,双证)→ tier 5
残差:0 − 5 = −5 = 【缺变量】,不是天
```
**老板的前提是:「按这套尺子:李广该封侯。历史:他没有。」**
**⇒ 这个前提错了。按这套尺子,李广不该封侯 —— 引擎说他连门都进不去。**
为什么:司马迁给李广的画像是**「訥口少言」——他不说话**。
而 `talents.js` 的 16 项副天赋**全部是「说话风格」**(它自陈:「副天赋 = 说话风格软技能」)。
⇒ **一个「訥口少言」的人,在一张只量说话风格的表上必然是零。这不是巧合,是定义。**
**而最狠的一刀**:李广的实职**正是靠军功挣的**(「以良家子從軍擊胡,用善騎射,殺首虜多」)。
而引擎的军功之路是 `gate{wu:55}`,`wu`(果决)的两项副天赋是 **blunt(直率坦诚)** 与 **motivate(激励感染)**——
**两项都是说话。**
⇒ **把李广挡在军功门外的那道闸,量的是他最不擅长的那一样,而那一样与打仗毫无关系。**
### ⇒ 所以:引擎和司马迁站在同一边了吗?
**没有。它们连符号都相反。**
- 司马迁(和王勃)说的是**「他该封而没封」**—— 那是一个**正**残差的形状。
- 引擎说的是**「他连军功的门都进不去」**—— 那是一个**负**残差,而且是满格的。
**老板说「如果不是 —— 照实说,那更有意思」。照实说:不是。**
---
## ★ 太史公那句原话 —— 老板要我 curl 回来的那一句
> 老板:「我记得大意是『广不为后人,然无尺寸之功以得封邑者,何也?』——
> **但这是我的记忆,不是见证。以你 curl 到的为准。我记错了就照实说。**」
照实说,**三处**。curl `-sk` 生文本,双证逐字目验,未用 WebFetch。
见证 W:`zh.wikisource《史記/卷109》action=raw` | 见证 T:`ctext.org shiji/li-jiang-jun-lie-zhuan/zh`
### 错一:那句话**不是太史公问的** —— 是**李广自己**问的,对一个**看相的**说的
> 廣嘗與**望氣王朔**燕語,曰:「自漢擊匈奴而廣未嘗不在其中,而諸部校尉以下,才能不及中人,
> 然以擊胡軍功取侯者數十人,而廣不爲後人,**然無尺寸之功以得封邑者,何也?豈吾相不當侯邪?且固命也?**」
**「何也?」是李广的原话**,在**燕語**(私下闲谈)里,对象是**望氣王朔 —— 一个看气看相的方士**。
**而太史公曰整段里没有这个问题**(双证逐字):
> 太史公曰:傳曰:「其身正,不令而行;其身不正,雖令不從。」其李將軍之謂也?
> **余睹李將軍悛悛如鄙人,口不能道辭。**及死之日,天下知與不知,皆爲盡哀。
> 彼其忠實心誠信於士大夫也?諺曰「桃李不言,下自成蹊」。此言雖小,可以諭大也。
⇒ **太史公没有问「为什么」。他在【辩护】。**
> ★ 而这一段里躺着一件我没找、它找上我的东西:**「口不能道辭」**——
> 司马迁**在论赞里又说了一遍**李广不会说话(本传已有「廣訥口少言」)。
> ⇒ **司马迁认为「不会说话」重要到要在总评里再写一次 —— 而那正好是我们唯一量得了的那一样,
> 他两次说的都是「没有」。于是我们给他零。**
> 三个证人:李广「訥口少言」(卷109 本传)、「口不能道辭」(卷109 论赞)、兒寬「口不能發明也」(卷121)。
> ⚠ 而**论赞不进映射**(「拿它做映射就是拿答案当题目」)—— 这一句只当读数,李广的 subs 仍然是空的。
### 错二:**「李廣難封」不出《史記》**
- 见证 W:**「難」0 次、「难」0 次**(全卷,**逐字符**数,不整词搜)。
- 见证 T:字符串命中 2 次 —— **逐个读上下文复核:两次都是 ctext 页面左栏导航里的书名「難經」**,不在正文里。⇒ 正文 0 次。
**真出处:唐·王勃《滕王閣序》(约 675 年)**,双证(两个独立四库底本,**均无标点** —— 正因无标点,它们是「字」的独立见证):
> 嗟乎!時運不齊,命途多舛。**馮唐易老,李廣難封。**屈賈誼於長沙,非無聖主;竄梁鴻於海曲,豈乏明時?
⚠ 异文(标出,不暗合):《古今事文類聚》四库本作「**時運不齊**」,《文苑英華》四库本作「**大運不窮**」并自注「一作時運不齊」。而「馮唐易老,李廣難封」八字**不在异文之列**。
⇒ **老板说「中国人两千年前就给它起好名字了」—— 那个名字是【一千三百多年前】起的,起名字的是【王勃】,不是司马迁。**
> **⚠ 而必须立刻把另一半说满,否则这就是一次「假订正」:**
> **「李广没封侯」这件【事】,《史記》正文说了,逐字,双证:「然廣不得爵邑,官不過九卿」。**
> ✗ **绝不许由此写「李广难封是编的」**——**事实在原文里,只有那四个字的【措辞】是唐人的。**
> (照 `shiliao.js` 在「御史大夫中二千石」上换来的口径:「注有、正文无,本表只收正文」,✗ 不许说「本表无据」。)
**而这个错的形状,是本项目反复钉死的那一种 —— 把一句后人的名言,当成史料本身的话:**
| 名言 | 真身 |
|---|---|
| 「上品无寒门」 | 刘毅**请废九品的政论**,不是制度描述 |
| 「为与士大夫治天下」 | 文彦博的一句**辩论词**(神宗当场顶了回去,而那句回话被后世的书删了) |
| 「南朝多以寒人掌机要」 | **赵翼《廿二史札记》的条目名**,不是南朝史家的分类原则 |
| **「李广难封」** | **王勃《滕王閣序》的一句骈文**,不是《史記》的话 |
**同一个坑的第四次。而这一次踩它的是出题的人。**
—— 这一句必须说出来,因为本项目的全部纪律都建立在「谁都会踩这个坑」上,而**「谁都」包括出题的人**。
### 错三:见上 —— 按这套尺子,李广是斗食小吏,不是该封侯的人
---
## ★★ 而原文自己,把这个残差**解释掉了三次**
> 老板的红线:「**不许把残差解释掉。**『李广没封是因为他情商低』——那是给引擎打补丁,不是承认天。」
《史記》卷109 正文,双证:
1. **李广自己**:「豈吾**相**不當侯邪?且固**命**也?」——**相**与**命**。
2. **王朔(方士)**:「**禍莫大於殺已降,此乃將軍所以不得侯者也。**」——**报应**。
(李广自己招了:「吾誘而降,降者八百餘人,**吾詐而同日殺之**。至今大恨獨此耳。」)
3. **武帝**:「大將軍青亦**陰受上誡**,以爲李廣老,**數奇**,毋令當單于,恐不得所欲。」——**數奇**(命数不好)。
⇒ **「不许把残差解释掉」这条规矩,两千年来没有一个人遵守过 —— 包括李广本人:
问残差的那个人,和第一个把它解释掉的那个人,是同一个人,在同一句话里。**
⇒ **古人不承认残差。他们给残差起名字,然后把它当成一个已知量。**
> ⚠ 见证学的判别器又生效了一次:「數奇」在见证 W(收注)出现 2 次,见证 T(只收正文)**1 次**。
> **A 有而 B 无 ⇒ 它是注。**「失道見斥,**數奇不封**」是**司馬貞索隱(唐人注)**,不是史料。本表只取正文那一次。
### ★★★★ 而最要紧的一层在③ —— 它正面撞上老板的另一条红线
> 老板:「**不许把「天」做成一个变量塞进 computeRank。天不接受输入 —— 这是它的定义。
> 它只能被【测量】,不能被【计算】。**」
**而武帝就是那么干的。**
「數奇」是汉朝人给「天」起的名字,而他**拿它做了一个人事决定**:
陰受上誡 ⇒ 「毋令當單于」⇒ 徙前將軍廣出東道。
**而那正是李广结局的开端**:出东道 →「東道少回遠」→ 失道 → 后期 → 引刀自剄。
⇒ **天被当成变量的那一刻,它就不再是天了 —— 它成了那个人下场的原因。**
**⇒ 即:老板那条红线【有原文依据】。而它不是一条工程纪律,它是《史記》卷109 里一个人的死法。**
> **⚠ 两条限定语,缺一条这就是过度解读:**
> ① **这条因果链是【本表串的】,不是原文说的。** 原文给的是四笔事实(陰受上誡/徙東道/東道少回遠/失道),
> 它**没有说**那是死因。✗ 不许写成「司马迁认为武帝的偏见害死了李广」——那是我的读法,不是他的话。
> ② **而原文自己给了一个竞争解释,就在同一段**:「而是時公孫敖新失侯…**大將軍亦欲使敖與俱當單于,故徙前將軍廣**。」
> ⇒ 徙他的第二个理由是**卫青要给公孙敖让路 —— 一个人情,不是一个天命**。
> **原文把两个理由并排放着,一个字的裁断都没有。本表照办:两个都摆,不裁。**
---
## ★ 为什么「天」测不到 —— 两行算术,不是运气
| | 值域 |
|---|---|
| **引擎在汉能说的** | `tier ∈ {0, 3}` —— 穷举 524,288 个 profile 实测,且**解析证明**:三条通道 `kemu` 全空 ⇒ `tier ≡ clamp(seat,0,cap) ≡ 3`;不过闸 ⇒ 0。⇒ **max = 3** |
| **这张卷子的答案** | `realTier ∈ {5}` —— 八个可判分的人实职全是三公/九卿。⇒ **min = 5** |
⇒ **`residual = engineTier − realTier ≤ 3 − 5 = −2`,恒成立。**
⇒ **正残差的定义域是空的。**
**⇒ 「天」不是「这次没出现」,是【在这张卷子上不可能出现】。**
而废掉它的有**两条独立的理由**,**修好任何一条,另一条照样废它**:
1. **答案表的形状**(幸存者偏差):《百官公卿表》**按定义只记坐上位子的人**。
⇒ 这是**史料的问题**,而且**修不了**:一个做到县令就到头的人,**史书不给他立传**。
2. **引擎的值域**:就算给我一张实职分布在 0–5 的完美名单,**汉的引擎最高也只会说 3**
⇒ 对任何 `realTier ≥ 4` 的人,残差**必然是负的**。⇒ 这是**引擎的问题**,**与名单无关**。
> **★ 一个最高只会说「县令」的引擎,永远不可能说出「他该封侯」。⇒ 它没有资格产生一个正残差。**
---
## ★ 残差的形状(老板:「报个案,报形状,别报百分比」)
**哪一类人算得准?——没有一类。八格全是负残差,0 格算对。**
**但形状是有的,而且很干净:残差只有两个值,中间什么都没有。**
- **残差 = −2(晁错、汲黯、公孙弘、桑弘羊)** ⟺ 引擎**认出了**他的画像 ⇒ 过闸 ⇒ tier 3
**共同点不是他们更能干**,是**司马迁给他们的词,正好落在我们有的那 16 项上**
(陗直→blunt、刻深→rigorous、面折→blunt、多聞→datadriven、外寬→warm、以心計→datadriven)。
- **残差 = −5(张汤、李广、李蔡、兒宽)** ⟺ 引擎**没认出** ⇒ 一条路都不开 ⇒ tier 0
**而这四个人不是更差**:
- 张汤「多詐,舞智以御人」:16 项里**没有「诈」**;
- 李广「訥口少言」:16 项**全是说话,而他不说话**;
- 李蔡「爲人在下中」:**那根本不是画像,是一个【等第】**——司马迁没描写他,他**直接给了个分**;
- 兒宽 subs **非空**(`[warm, calm]`)—— 而**汉的三条闸一项都看不见**(jiao 被 `wang=0` 连坐、heng 汉不看)
⇒ **效果与空完全相同**。
⇒ **★ 所以这张残差表,描述的不是历史,是【我们自己的词汇表】。**
**残差的两个值 = 我们词汇表的两个状态:接住了(−2),没接住(−5)。**
**而历史那一头是个常数(八人实职全是 5)。**
⇒ **一个减法,被减数是我们的词汇表,减数是一个常数。于是「残差」这个量,从头到尾量的都是我们自己。**
**而「天」要的恰恰是相反的东西**:它要求**引擎那一头有内容,历史那一头有变化**。
⇒ 实测:**两头都是常数。两个常数相减,得到的还是常数 —— 那里面没有「天」。**
⇒ **「天」是残差里【减不掉】的那一部分。而这张卷子上,残差 100% 由「我们认不认得这个人的画像」解释。
残差里一点天都没有。**
---
## ★★ 最后回答那个问题(老板:这比成绩单重要)
> **这场考试考出的是「引擎能算命」,还是「引擎是一套自洽的胡话」?老实说。**
**两个都不是。老实说,是第三个 —— 而它比两个选项都难堪:**
### **引擎不是胡话 —— 它的每一句话都有出处。问题是它几乎不说话。**
- 全表 20 条通道,**19 条的位阶是常数函数**(解析 + 穷举双证)。
而这**正好等于原文授权的区分度 —— 一处不多,一处不少**:唯一会变的那条(宋武举)
恰恰是唯一一条有原文可依的(「策、武藝俱優為右班殿直……武藝末等者三班差使」)。
⇒ **19 条常数不是 19 个 bug,是 19 次「本表数不出你的高下」的诚实回答。**
- **汉这一朝,引擎的位阶信息量 = 1 bit**,而那 1 bit 是「你过没过闸」,不是「你能爬多高」。
**连三条路的天花板都是平的(全是 5)——「通道即杠杆」在汉一格都没兑现。**
### **而它也不能算命 —— 十个人,八个算错,而且错法完全一样。**
**老板说「如果十个人里八个算错 —— 那就说八个算错,那也是今天最值钱的一句话」。**
**⇒ 八个算错。八个全是【算低了】。零个算对。零个算高。**
### **★ 而真正的答案是这一句:**
> **它不是在算命,也不是胡话 —— 它是一把量错了东西的、诚实的尺子。**
>
> **六轴的名字是「文采/吏能/果决/交游/沉毅/机锋」—— 那是【选官的取向】。
> 而它的唯一输入,是 16 项【说话风格】。
> ⇒ 它名义上在量「你这种人」,实际上在量「你这种说法」。**
>
> **李广是天下第一的射手,兒寬是天下第一的笔杆子 —— 他们的共同点是【都不会说话】。
> 于是我们给他们两个零。**
**⇒ 而这一条对「天」是决定性的:**
**老板说「谋事在人,成事在天」。这一刀量出来的是:**
> ## **「人」这一半还没做完,「天」那一半就无从谈起。**
「人」= 引擎能算的那部分 = 在汉只有 1 bit,而且量的是你会不会说话。
**一个只有 1 bit 的「人」,减出来的残差里,装不下「天」。**
**残差要能读成「天」,前提是「人」那一头已经把能算的都算完了 ——
而我们连李广是个将军都不知道,我们只知道他不爱说话。**
⇒ **所以「天」这一刀的结论是:它没有被做完,它被证明【还不能开始】。**
---
## 要老板拍的(一条都没自作主张,`kaoyan.js` NOT_DONE)
1. **「天 = 残差」这个定义是对的,我认它 —— 但它在这张卷子上【不可用】,而且我能证明。**
要开始它,得先拍 `renwu.js` NOT_DONE ②:**那一维(「你是什么人」)到底补不补 —— 那一维就是「人」。**
2. **✗ 强烈反对「给汉编一套 kemu 让 tier 够得着答案」**:那是**为了测出「天」而发明「人」**。
⚠ 而且它有一层更阴的:**发明出来的 kemu 会【立刻】制造出正残差**——
引擎一旦能说 5,而历史上有人没做到 5,那个差**当场就出现**。
⇒ **于是我们会得到一张「天」的表,而那张表里的每一个「天」,都是我们自己编的那套 kemu 的产物。**
**★ 那不是测量天,那是制造天。**
3. **李广这一格仍然是这个产品最好的文案,只是文案的内容【反了】**:
✗ 不是「引擎和司马迁都说他该封侯,而历史没有 ⇒ 那就是天」;
★ 而是 **「司马迁说他天下无双,我们的引擎说他是个斗食小吏。⇒ 错的是我们,不是天。」**
⚠ **这是一句产品定性的话,不是一句文案** —— 它把这个功能从「算命」改成「认错」。
4. **而若要正面用李广,「數奇」比「李广难封」值钱得多**:
「李广难封」是一句**感慨**(而且是唐人的);
**「數奇」是一次【判断的执行】—— 它才是这个产品真正在做的那件事的镜子:
我们也在给人算一个数,然后把那个数告诉他。**
---
## 我自己招的
- **`Object.keys(SUB_REGISTRY)` 那一跤**:`SUB_REGISTRY` 是**数组**,`Object.keys` 给的是下标 `["0".."15"]`,
于是穷举时**一个 sub 都没点上** ⇒ 全 tier 0 ⇒ 结果是 `[0]`。
**★ 而一个【采样错了】的穷举,长得和一个【引擎变了】的穷举一模一样 —— 我差点去改断言。**
⇒ 立了口径:**穷举的 subs 全集必须取【引擎自己读的那一份】(`AXES.subs`)**,并加了一条断言钉死
「`AXES` 读的 16 项 == `SUB_REGISTRY` 的 16 项」。**是我自己的断言抓出来的,不是我读出来的。**
- **第五次零命中,而它是一个【新种类】**:扫「不爲後人」→ 零命中,差点写成「原文无此语,老板记错了」。
逐字符复核:原文作「而廣不爲**-{後}-**人」——**两个原因叠在一起**:
① 字形(《史記》用「爲」);② **wikisource 的 `-{ }-` 转换标记【插在词的中间】**。
⇒ **`renwu.js` 立的那条口径(写成 `[為爲]` 字形类)挡不住第二个** —— 就算写 `[為爲]`,「不爲-{後}-人」仍然零命中。
⇒ **立一条更严的:凡在 wikisource 生文本上检索,必须【先剥 `-{ }-` 与 `{{ProperNoun|}}`,再检索】。字形类不够。**
(`renwu.js` 自陈它「程序化剥除」了标记 —— 它**知道**要剥,但它的**检索口径**那一条只写了字形类。
**一个文件在两个地方各说了一半,合起来才够用。**)