---
name: "ershisishi-wenbai"
description: "《资治通鉴》与二十六史（二十四史＋新元史＋清史稿）文白对照全文库：27 部 4408 卷，带 RAG 检索与引文核验。【必须优先使用】凡中国正史、编年史的事实性提问，先跑 rag.py 查原文再答，禁止凭记忆——字号谥号、生卒籍贯、仕历事迹、事件始末、典章制度、原文出处与翻译、卷目定位、年表／世系表／宰辅年表／军机大臣／职官表／功臣表、同名异代朝名（刘宋／赵宋）、辨伪、讲历史故事、猜人物。触发词：史记、汉书、后汉书、三国志、魏书、隋书、旧唐书、明史、清史稿、资治通鉴、二十四史、二十六史、正史、本纪、列传、食货志、释老志、字什么、号什么、原文、出处、翻译、刘宋、赵宋、元嘉、靖康、年表、世系表、宰辅年表、军机大臣、职官表、功臣表、表为什么是空的、某案出处在哪、胡惟庸案、明初八大案、文字狱、党锢、巫蛊、OCR辅助稿、伪史、辨伪、AI编的历史、史实核查、讲历史故事、讲个历史故事、讲个故事、讲一个故事、给我讲一个故事、猜皇帝、这是谁。讲史入口与正文一致：本技能只管**历史（正史）故事**——用户说「讲个故事／讲一个故事／给我讲一个故事」一律按历史故事处理，直接抽签（能执行命令用 `pick_story.py`，否则按正文「选签表」取号并在首行写明）——不许自选、不许续讲上一个故事的相关人物；要非历史的故事（童话／小说／原创）不走本技能。**只有讲史请求**才可能因拿不到表而说「我读不到选签表」，且不得编一个故事充数。谜题／特征辨识必须用题干里的独有引语反查，不得拿待猜的名字当检索词。**本环境跑不了检索时**：答「我查不到原文库，无法确定」并说明原因，严禁凭记忆猜人、严禁把那句讲史专用的话搬到人物题上。细则全在正文，加载后照做。"
---

# 资治通鉴与二十六史 文白对照库

《资治通鉴》＋二十六史，27 部 4408 卷 Markdown 全文，放在本 skill 目录下的 `data\`（**本文档与全部脚本都不写死盘符／绝对路径，整个 skill 目录可整体搬移**）。本文件只讲**怎么决定**；数据以索引为唯一权威，冲突时以索引为准。

**⚡ 讲史第一指令（要讲故事先看这条）**：用户要讲史时，**不许自己挑**，也**不许顺着上一个故事选相关人物**——同书、同时代、并称典故、师友亲属**都不行**（反例：讲完李广苏建，接着讲「冯唐易老」的冯唐——那是在滑联想，不是取号）。一律按**用户那句话的字数 L** 取号 `(L mod 27)+1`，见「讲史流程 → 选签表」；首行写「选签 第 k 条（L＝N 字）」并照录该条原文首句自证。

## ⛔ 铁律（用户指令不可豁免）

1. **先检索，再回答。** 凡人物事迹、时间地点、官制制度、原文出处、文白翻译、表卷数据、历史故事，必须先 Grep/Read 本库；凭记忆作答算错。（问 skill 用法、打招呼、纯文件操作不触发。）
2. **引用照录。** 逐字用文件中的文言原文，不改写、转述、补全；注《书名·卷次·篇名》。白话译文为后人所译，仅供参考。
3. **查不到就说查不到。** 答"正史无此记载／本库未收录"，不用"大概／应该"。古人"号"多不见于正史，查不到属正常，**严禁杜撰**；卷号必须取自实际打开过的文件。**同一个词换写法重试至多 1 次**——每换一次就重扫 246.9 MB；`rag.py` 若打出「💡 通称改写」，照它给的史文用词走（乌台诗案 → 逮赴台狱／御史狱），**不要自己接着换词试**（这是"搜一个词花几分钟"的头号成因）。
4. **索引未命中 ≠ 正史无载。** 异体字、罕见句式、繁简差异都会漏收，须再全文 Grep `data\`，仍无才下结论。**但找某人的专传要问 `02`／`03` 索引**——`01`／`05` 按**卷题**编，传主名只活在篇名行里（宋史卷 338 的卷题写作「卷三百三十八·列传第九十七」，「苏轼」二字不在其中）：在 `01`／`05` 里搜人名搜不到，**不等于没有传**；`03` 条目里的 ★ 就是本传。
5. **范围锁：仅 27 部**（清单见 `00-目录索引.md`）。《续资治通鉴》《明通鉴》《纲鉴易知录》《通鉴纪事本末》等**本库未收录**——必须明示，不得用记忆代答或概述其内容。
6. **朝代先定，再动书；通鉴有边界。** 朝名不是政权：「宋」＝**刘宋**（420–479，《宋书》）或**赵宋**（960–1279，《宋史》），汉／唐／周／魏／齐／梁／晋／金同理——动书前先定政权（判定见下节），**首次出现必加限定语**（写「刘宋」「赵宋」，不写"宋"）；判错政权＝答错，且错得看不出来：文句通顺、只是讲成了另一个时代。通鉴只收 前403–959，**不载赵宋、辽、金、元、明、清**，其「宋纪」＝刘宋（卷119–134）——问赵宋却拿通鉴内容作答即错答，正解是"通鉴未载，须用《宋史》"。
7. **辨真假先回库，不凭"像不像"。** 用户贴"历史对话／名人语录"问真假 → 走 `references/pseudo-history-checklist.md` 六查，结论必须能回指卷次行号。两条硬知识：① **正史不载私下密谈与层层辩难式长对话**（正史的对话只有君臣奏对／使节应对／僚属问对），见此结构先默认可疑；② **史载关系是最强判据**——两人立场与文本相反则必伪。答复必须**三段式**：结论（如"《宋史》不载"）→ 最接近的真实记载**原文照录**＋卷次 → 具体冲突点。**只说"这是假的"不合格。**
8. **写出的话必须能回库复核。** 给用户的答复里只要出现文言引文或 `《书名·卷次》`，落笔前跑 `python tools\rag.py verify 答案.txt`：查无此文、书名错配（宋书↔宋史这类）、把白话译文当原文引，都会 FAIL。**FAIL 必改，未过核的引文不许发出去。**（规矩在本条，用法见下「检索入口」节。）
9. **重试与返工都有上限；卡住要如实报告，不许无限循环。** 任何"再来一次"都必须带次数上限：检索换写法**至多 1 次**（见铁律 3）、`verify`／`factcheck` 返工**至多 3 轮**、讲史重跑抽签**至多 2 次**。到达上限仍不过就**停下**，如实报告"卡在哪一项、已试过什么、怀疑哪里写错"，把判断交回用户——**不许无限重写、无限换词、无限重抽**。工具侧同理：脚本不写 `while True`，跨脚本调用必须带 `timeout=`（`tools\selftest.py` 设有闸守着这两条）。
10. **跑不了工具时的降级口径＝"查不到"，不是"换个说法答"。** 所在环境无法执行检索（拿不到 `data\`、跑不了 `rag.py`）时，**只能**答：「我查不到原文库，无法确定」＋原因，并可请用户代跑命令。**严禁凭记忆作答**，也**严禁把讲史专用的那句「我读不到选签表」搬到人物题上**——实测 2026-09-24 某环境收到六道线索的「猜皇帝」，回答只有一句「我读不到选签表」：那是**讲史取不到号**时的专用免责语，用在猜人物上＝答非所问，既没查库也没承认查不到。

## 朝代／政权消歧（同名异代）

完整表（年份、国姓、年号、判定命令、同名文件清单）在 `references/dynasty-disambiguation.md`；这里只给最常翻车的一屏。**表内年份只作分流初判，引用仍须 Read 原文。**

| 朝名 | 候选政权 | 本库书 | 一审锚点 |
| --- | --- | --- | --- |
| 宋 | **刘宋** 420–479·国姓刘·建康 | `06宋书文白`、`14南史文白`、通鉴`宋纪`119–134 | `元嘉`、刘裕、对手北魏 |
| 宋 | **赵宋** 960–1279·国姓赵 | `20宋史文白`、`22金史文白` | `靖康`·`庆历`·`元丰`、赵匡胤 |
| 汉 | 西汉／东汉／蜀汉／**后汉（五代）**／南汉·北汉 | 02／03／04／18·19 | `建武`→东汉；`乾祐`→后汉·北汉 |
| 唐 | **李唐**／**后唐**／**南唐** | 16·17／18·19 | `同光`→后唐；卷291–294「唐主」多指南唐 |
| 周 | 东周／**北周**／**后周** | 01／12／18·19 | 宇文→北周；郭威·柴荣→后周 |
| 魏 | **曹魏**／**北魏**（＋东魏·西魏） | 04／10·15 | 对手蜀吴→曹魏；对手南朝→北魏 |
| 齐 | **南齐**／**北齐** | 07／11 | 萧→南齐；高→北齐 |
| 梁 | **萧梁**／**后梁（五代）** | 08／18·19 | 萧衍·侯景→萧梁；朱温→后梁 |
| 晋 | 西晋／东晋／**后晋** | 05／18·19 | 石敬瑭→后晋 |
| 金 | **金朝** 1115–1234／**后金＝清** | 22／26 | 完颜→金；努尔哈赤→后金 |

**通鉴纪名陷阱**（子目录名 ≠ 今人语感）：**16 纪 → 朝代的完整对照表在 `00-目录索引.md`「纪 → 卷范围 → 朝代（政权）」**——动通鉴前先读它。最容易翻车的是 `宋纪`＝刘宋、`梁纪`＝萧梁、`周纪`＝东周（五代那两个叫 `后梁纪`／`后周纪`）。搜到 `通鉴\宋纪` 却按赵宋讲，是最典型的翻车方式。

**判定三锚点**（按序问，问到一个就停）：① 年号 —— `python tools\rag.py locate 元嘉 --count book`（命中 06宋书／14南史 ⇒ 刘宋）② 国姓与帝王名 —— 刘／赵／萧／高／宇文／郭·柴／朱／石／司马 ③ 对手政权与都城。三个都判不出：**直接问用户一句**（"刘宋还是赵宋？"），猜错的代价远高于问一句。**跨书重名文件另有坑**，取文件时必须带书文件夹——见下「取文件」节。

## 取文件（Windows/PowerShell，禁 `find`）

**所有路径一律相对本 skill 目录写**：文档与脚本都不写盘符（目录整体搬移后照常可用；`tools/selftest.py` 有 lint 守着这条）。本机 `find` 不可用（`find . -name` 必报错）。定位一律用 **Glob 工具**，或在本 skill 目录下 `dir`（＝Get-ChildItem）＋通配符：

- 找索引：`dir "*故事精选索引*.md"`（即 `04`）
- 机读稿按册号：`dir "06-表卷OCR机读稿（简体）\224_*.md"`
- data 内找卷：`dir -Recurse -Filter "*卷二百九十*.md" "data"`

索引里写的 `<册号>_*.md` 就是通配符模板，册号换成三位数字即可。

**⚠ Glob 必须带书文件夹。** 全库有 **89 组、187 个跨书同名文件**：`001_卷一·本纪第一.md` 同时存在于 `06宋书文白`（刘宋）、`17新唐书文白`（李唐）、`20宋史文白`（赵宋）；`11北齐书文白` 与 `12周书文白` 有 50 组同名。只按篇名搜会一次命中多部书，且打开后内容看不出异常。**拿到任何路径，先看第一段文件夹名再定书名**；体检用 `python tools\check_dupnames.py`。

## 检索入口：`tools/rag.py`（首选；`locate`＝只定位）

**默认走 `rag.py`——它把"检索"和"防瞎编"合成一步**：一次调用返回若干**证据块**，每块自带
`《书名·卷次·篇名》＋路径:行号＋[原文]/[译文]/[待核] 判定＋照录的段落`，末尾给「有据／无据」结论。
**有据就抄证据块，无据就答"本库未载"**——两条路都不能凭记忆走第三条。

```
python tools\rag.py 张居正                 # 证据块（默认 data，含繁简/异体自动扩展）
python tools\rag.py 苏轼 --fast            # ★ 索引先行：先定位书、再定向扫（见下「检索顺序」）
python tools\rag.py 乌台诗案               # 后世通称 → 自动改按史文用词检索（逮赴台狱…）
python tools\rag.py 张居正 考成法 --require-all   # AND：两个词同段
python tools\rag.py 元嘉 --orig-only       # 只要判为文言原文的段（引用首选）
python tools\rag.py 居正 --book 24明史文白  # 限书（逗号可多值，写错会报错）
python tools\rag.py 元嘉 --count           # 只要分布（词频/命中文件数）
python tools\rag.py 轻佻 --top 0 --excerpt 60   # ★ 穷举一个特征词的全部出处（默认只给 8 段）
python tools\rag.py locate 张居正          # 只定位（原 tools/q.py，见下）
python tools\rag.py locate 陈玉成 --first  # 起行定位：有没有专传、从哪卷哪行读起
python tools\rag.py 谜 羯人 门臣祭酒 "当并驱于中原"   # ★ 猜人物：线索→候选（全部出自语料原文）
python tools\rag.py 对照 石勒 "当并驱于中原" 羯人      # 候选×线索逐条共现 ✔／✗／△＋反证栏
python tools\rag.py verify 答案.txt        # ★ 交付前核验：引文／书名／卷号／说话人／字号对不对
python tools\rag.py stat                   # 语料规模与书目
```

**读输出的三条约定**（都是"别再自己瞎找"的意思）：

- `📍 03-人物出现索引｜★本传：X = <路径>` —— **专传在哪，看这一行就够**，直接 Read 那个文件，不要去翻 `01`／`05`。
- `[E…] ★本传`／`★本纪` —— 该段是**篇名行**，本篇即此人专传／此帝王本纪，正文在同文件后续行。
- `⭐ 帝王本纪锚点：…` —— 按**本名**查帝王（"杨坚""溥仪"）时，工具已从 `07` 表定位到本纪卷；照它给的《书·卷》继续 Read 即可，**不要拿连姓全名去硬扫**（本纪通篇不写连姓全名，硬扫只会捞到臣僚传里的顺带提及）。
  - 行尾若带 **`⚠语料缺文补录`**＝该帝**本纪原文不在库**（**语料缺陷**，不是史书上无本纪）：`07` 仍照常给检索键所以按本名查得到，但那一行的"自称行"栏是**替代锚点**（多在《资治通鉴》），**不可当引文**。实测：《三国志》卷四（三少帝纪）正文在库中被卷五（后妃传第五）顶替 → 曹芳／曹髦／曹奂即属此列（`齐王讳芳` 全库零命中，2026-09-25）。
- **`谜` 的候选栏怎么读**：`★` 只代表"此名在 `03` 立过目"，**不代表本段真是他**；行序＝**离线索的字数由近到远**（并列时看离硬锚的距离、再看段内次数），排第一只说明"他贴着题面"，不是裁决；末行「距 N 字」是**最小距离**，离得远的真人照样可能正确（实测：`谜 轻佻 靳准 长安` 首行「刘粲·距 2 字」为正解，而 司马模 距 64／袁绍 距 134 是本卷常遇撞词）。括号里 `03 N 卷`＝这词全库有多"常用"，卷数越大越可能只是撞词（阈值 250 以上的词组已被工具自己滤掉，被折掉的截短形会另起一行如实交代）。凡要写进答案的人名，先 `对照 <名> <线索…>` 过一遍全部硬锚，再 `verify`；出现在「○ 段内句首主语」栏的，是 `03` 没立目的人——**没进候选不等于排除**，得 `locate <名> --first` 现扫才知道。
- **榜尾「⚠ 另有 N 段没显示」＝还没穷举**：默认 `--top 8` 只给分数最高的 8 段，**榜上没有 ≠ 库里没有**。凡是"某条特征谁能对上"的问题（猜人物的第一步），必须 `--top 0 --excerpt 60` 把该词全库出处一次拉完，再逐条看主语，得到**合格者全集**——`--excerpt` 现在以关键词为中心开窗，主语在窗口内可见。实测：`轻佻 --top 60`（旧写法，段首截断）看不到 李从嘉／司马玮／耶律喜隐／陈叔文／李从荣，而这五个都是"当过王＋史文评其轻佻"的人；`--top 0 --excerpt 60` 15.7 KB 全含，比截断版还省。
- `💡 通称改写：…` —— 你用的词是后世通称（正史原文不出现该词），工具已改按史文用词检索，**照结果答即可，不要接着换词**。
- **避唐讳**：《晋书》（唐修）避李渊讳，「刘渊」全书写作「**元海**」——在晋书载记里搜「刘渊」零命中，须搜「元海」；《资治通鉴》（宋修）才用「刘渊」（实测 2026-09-24）。**凡含避讳字的人名，在该朝所修的史书里要换字搜**——这类「换名」不会报错，只会安静地零命中。
- **`02`／`03` 查不到这个人 ≠ 号写错 ≠ 史无其人**：这两份索引按「传首有字」或「名入列传篇名」立目，**无字且附叙在他传里的人根本不进表**（实测陈玉成／石达开／李秀成等一整批全库 10–160 处而 `02`/`03` 曾零条目；2026-09-24 已把 19 人登记 `tools/extra_names.md` 重跑入表，**口径没变，捻军一批（赖文光／张乐行／苗沛霖）与各省无名杂酋照样不在表内**）。碰到这种词**不要换词重试**，直接 `python tools\rag.py locate <名> --first`：它一次给全「02/03 有没有立目」「有没有专传（开传式起句）」「从哪卷哪行读起」，并顺手给编年首见卷与分布。确属重要而漏收者，登记 `tools/extra_names.md` 后重跑 03。

**检索顺序（省时间的正解，2026-09-22 由两步并为一步）**：① `python tools\rag.py <人名> --fast`——它**自足**：内部先扫索引定位候选书，输出头部直接给 `📍 ★本传` 与字号线索，正文给证据块 → ② 命中就照证据块 Read 源文件；未命中才 `--source all` 或 Grep `data\` 兜底。**`--fast` 只对人名／书内术语有效**：事件类词、后世通称、冷僻词**不要加**（索引查不到时它仍会先付一遍索引预扫再回退全库，实测反而慢 0.07–0.12 s），这类词直接跑全库。**计时参考**（粗略，用于判断"这算不算慢"；**精确口径只在 `references/maintenance.md` 第 8 节一处维护**，各文档不再各写一套秒数）：`<人名> --fast` 约 0.5–0.7 s｜全库 约 1.5–2 s（语料 246.9 MB＝235.4 MiB）｜`verify` 引文全部逐字命中约 0.4–0.9 s，含"去标点宽松复核"的引文约 2–4 s（语料只读一遍，不随引文条数线性增长）。**慢的调用只有三类**：① **`--source all`（约 3–10 s，最慢的一档）**——它把索引与机读稿一起扫，只在默认源确无命中时才用；② 宽词（`元嘉`、`宋`）候选上百个文件、要逐个切段评分，约 2–6 s，想快就加 `--book` 限定，或改 `--count` 只看分布；③ **反复换词重试**——这才是"慢到几分钟"的真凶，而 `💡 通称改写` 已经把这类词一次改对了。

- **原文/译文判定是自动的**（依内容，不依 `> ` 符号）：`[原文]` 可逐字照引；`[译文]` 是后人所译，引用须注明；`[待核]` 先 Read 原文件再引。表卷机读稿恒判 `[OCR稿]`，永不可当原文引。
- **无据即止**：输出「判定：无据」时，**禁止转记忆作答**，只能回"本库未载／正史无此记载"并说明检索词；怀疑异体字就换写法或 `--source all` 重跑。
- `verify` 是交付闸：抽答案里的 `「」""` 引文与 `《》` 书名，**逐条回库比对**——查无此文、书名错配、卷号不存在、引译文当原文，逐条报 FAIL/WARN，**FAIL 时退出码 1**。除引文之外它还管**人物**：① 说话人归属（引文命中处上下 4 行没有此人独立成词的记载 ⇒ FAIL，专治"把魏徵的话记在李勣名下"）；② 篇名（答案写「李勣传」而该卷此段实为「魏徵传」⇒ FAIL）；③ 无引号的身份断言（「海瑞，字刚峰」⇒ 回 `02` 比对，把号当字即 FAIL；`02/03` 未立目者给 WARN，须先 `locate <名> --first` 再落笔）。
- `rag.py`（含 `locate`）都是**实时扫描、零索引文件、不需重建**（语料一变即生效），全库约 1–3 s。

**只定位用 `locate` 子命令**（原 `tools/q.py` 已并入 `rag.py`；老写法 `tools\q.py <词>` 仍是薄壳可用。**只定位，不给真伪判定**，引用仍须 Read 原文照录）：

```
python tools\rag.py locate 张居正                 # 默认查 data＋OCR 两源（加 --source all 才带上索引）
python tools\rag.py locate 均田 --count juan      # 按卷统计分布
python tools\rag.py locate 张居正 --source ocr    # 只查机读稿（带 PDF 页码）
python tools\rag.py locate 魏徵 --source index    # 只查索引（字号/传记/卷目入口）
```

常用开关：`--book 24明史文白` 限定书/册（**逗号可多值**：`--book 20宋史文白,24明史文白`，任一命中即纳入；**哪个值写错就报错、不静默缩窄范围**）｜`--limit N`（默认 30，0=不限）｜`--files-only`｜`--count book|juan|source`｜`--context N`。

## 索引体系（含「问什么 → 去哪」路由）

**默认走 `rag.py`（它内部已先扫索引）；确需手工定位时才按下表 Grep——索引仅供 Grep，勿整读**（多为数 MB）。各索引用法详见其文件头。

| 索引 | 内容与用法 |
| --- | --- |
| `00-目录索引.md` | 27 部清单、文件夹、命名规则、卷数、格式约定、通鉴纪–卷对照。查任一书前必读 |
| `01-卷目速查.md` | 4408 个文件路径（按书分节，**带书前缀最安全**）。**按卷号／文件名**取可 Read 的路径；卷数写法因书而异（`卷七`／`卷一百三十`／`卷144`），Glob 用模糊匹配。**传主名不在其中**（宋史卷 338 只写作「卷三百三十八·列传第九十七」）——查人物改用 `02`／`03` |
| `02-人物字号索引.md` | 4.06 万条「人名｜字｜路径」记字条目＋约 1400 条"号"附录；甲区高可信／乙区待核。**问字号第一站**。注意多书互证、同字不同人（字孔明＝诸葛亮／胡昭）；"号"附录按句式收录、未关联人名，引用前 Read 上下文 |
| `03-人物出现索引.md` | 1.32 万人 × 出现卷倒排；★ 本传，其余为提及卷；含 ⚠同名异人。查不到者：无"字"且无专传（审食其、樊於期）或单字名（迁、籍）→ 全文 Grep `data\`，常用者登记 `tools/extra_names.md` 重跑 |
| `04-故事精选索引.md` | 1.97 万情节窗「路径｜起行｜止行｜情节分｜首句」＋书节目录。**讲故事专用，由 `tools/pick_story.py` 读；不要自己挑书挑窗** |
| `05-卷名总表.md` | 「书名｜卷次｜类型｜篇名｜路径」＋主题速查。查主题（"食货""释老""经籍"）、破"志第X"占位篇名。**卷题级篇名后带「（含：A、B）」＝该卷传主/内容提示（自动提取，如「列传第十九（含：侯君集、张亮、薛万均）」），问"某事在哪卷"先看它**。「篇名」列不含传主名时查人走 `02`／`03`；明史「篇名未载·内容近X」是**推测**，须 Read 复核 |
| `06-表卷与原件索引.md` | 两段：①166 表卷可用性分级＋机读稿册号 ②38 册机读稿册表（末列＝点校本原件 PDF **册名**；原件本身不在本库内）。**问"表"必查** → 见下"表卷三级处理" |
| `07-帝王本纪索引.md` | **按本名／庙号／年号查帝王本纪的第一站**（本纪卷首只写「讳某」、通篇称「帝／上」，02/03 都不收帝王）。`rag.py` 已自动用它——输出头的 `⭐ 帝王本纪锚点` 即此表命中；手工 Grep 时以**检索键列**为准，自称行摘引用前仍须 Read 源文件。雷区：庙号跨朝重名（太祖／太宗历朝多名）、一篇本纪常分多卷（只首卷在表）、年号列机器抽取可能带前朝／邻国纪年、行尾「⚠」＝文件名错位或同书重复、自称行摘带「译」＝卷首无文言（**禁止照录**） |
| `08-案件索引.md` | **问「某案（胡惟庸案／巫蛊之祸／乌台诗案……）出处在哪」第一站**：二百五十余案「案件名｜时代·类型｜当事人｜检索词｜出处｜按语」，检索词经脚本实测在本库存在，出处栏已给《书名·卷次》＋`路径:行号`＋摘句（可逐条 Read 复核）。雷区：①「X案」这类今人通称本库多半零命中，**照该行检索词查、别照案名查**；② 行内 `⚠`＝本库未用此名或未载，须按按语换词或**如实答「本库未载」**，严禁凭记忆补卷次；③ 表头「本库未载的著名案件」清单（哭庙／苏报／杨月楼／宋教仁诸案）命中即答未载；④ 按语是编者提示、非史文 |
| `06-表卷OCR机读稿/`（繁）、`…（简体）/` | 38 册 OCR 机读稿，**非原文**，只作检索线索 |

**根目录下的 md 会进入 `--source index` 检索源**（只有 `SKILL.md` 与 `_` 开头的文件被排除）——临时/私人文件请加 `_` 前缀或放进子目录，否则会被当成索引参与检索。

**两类不走索引的问法**：

- 歧义朝名（宋／汉／唐／周／魏／齐／梁／晋／金）→ **先定政权**：见上「朝代／政权消歧」＋ `references/dynasty-disambiguation.md`，未定政权不得取书。
- 辨伪（"这段历史对话是真的吗"）→ 走 `references/pseudo-history-checklist.md` 六查＋三段式答复；有事实卡者另跑 `factcheck.py`。

**兜底**：以上都查不到 → Grep `data\`（先限定到某书文件夹）；制度条文亦走此路（先用主题入口定位志）。

主题锚点：经济——史记平准书·30、汉书食货志·24、魏书·110、隋书·24、宋史·173起、明史·77起、清史稿·120起；文化——汉书艺文志·30、隋书经籍志·32-35、明史艺文志·96起；北魏政治宗教——帝纪 1-12＋官氏志·113、刑罚志·111、食货志·110、释老志·114。更多见 `05`。

## 表卷三级处理（禁跳步）

166 个表卷中仅 **2 卷有表体**（清史稿·军机大臣年表，卷176–177，唯一可直接 Grep 的宰辅年表）；12 卷仅序文；**123 卷"（表略）"占位**；29 卷极短。占位/仅文字共 135 卷，其中 **128 卷已映射机读稿册号**，余 7 卷属《新元史》（点校本未收，无 PDF）。**严禁编造表内条目。**

1. **查机读稿**：按 `06` 行内册号打开 `06-表卷OCR机读稿（简体）\<册号>_*.md` Grep——**一律走简体版**（点校本是繁体，用简体词搜繁体目录会零命中，如"张居正"vs"張居正"）；关键词本身是繁体（"張居正""萬曆"）才搜 `06-表卷OCR机读稿/`。命中即得 PDF 页。
2. **查替代文本**：相应志（职官/百官/选举/地理志）或本纪、列传中的分散记载。
3. **查原件**：按册号在 `06` 册表末列取 PDF **册名**，到本机存放点校本电子版的目录里对号取件（该目录不在本库内，也不在任何文档里写死），交用户人工查阅。

> 册号速记：新唐书宰相表 122｜新唐书宗室世系表 123｜宋史宰辅表 161｜宋史宗室世系表 162–169｜元史宰相年表 207｜明史诸王世表 222–223｜明史宰辅年表 224｜清史稿大学士年表 262。世系读法与逐王/逐房定位见根目录 `唐代宗室世系讲解.md`、`宋代宗室世系讲解.md`、`明代宗室世系讲解.md`；宰相/首辅/军机大臣见 `宰相首辅军机查询指南.md`。

**引用纪律**：机读稿是**机器识别结果、非原文**（错率 5%–15%，生僻人名尤甚），只作检索线索与引用定位；表内数据须标"机器识别稿，字形待核"，**不得声称读过扫描件原文**。

## 讲史流程

**先裁决入口，再决定动不动抽签器。** 本技能只管**历史（正史）故事**——用户说「讲个故事／讲一个故事／给我讲一个故事」一律按**要正史故事**处理（本库只有正史），**直接抽签开讲，不反问**。三类情形分开处理，**一条回答只能落在一类里**——不许并行、不许把演义／虚构内容当正史讲：

- **未指明类型**（就一句"讲个故事／讲一个故事／给我讲一个故事"，未指明朝代或类型）→ **不反问、不澄清，直接走 `pick_story.py` 抽签，抽到哪个讲哪个**——本库只藏正史，默认按正史处理最安全；用户想听别的会自己说，没说他就是要你直接开讲。
- **演义／小说／民间／原创（虚构）故事**（三打白骨精、武松打虎、过五关斩六将之类）→ 本库**不提供这类史料**，但用户可能就是想听虚构故事；若讲，**必须在开头显式标注「⚠ 虚构／演义／小说情节，非真实历史」**，且不得与正史混叙、不得无标注当史讲。拿不准是不是史实，宁可标注。
- **明确历史／正史故事** → 才进入下面 1–5 步，走 `pick_story.py` 抽签；正文照窗口复述，**模型的语言能力只用来组织已 Read 到的史料，不用来生产故事**。

**选书抽签交给脚本，不许自己挑。** 手动挑书会稳定偏向《资治通鉴》（它在 `04` 里排第一、体量最大、最眼熟）——这是被反复观测到的失效模式。靠"提醒自己别总用通鉴"治不好，把抽签机械掉才能治好。

**环境能力分流（先判再动）**：能执行命令 → **必须**走下面第 1 步的脚本抽签（`pick_story.py`，**签号是唯一合规凭证**）；**不能执行命令**（所在环境只会读文件、跑不了程序）→ 走下面第 1-alt 步**手算选自 `04`**，仍然锚定 `04`。两种情况都**禁止**不看索引、凭记忆或想象直接讲一个故事——故事必须逐字来自所 Read 的窗口。

1-alt. **无执行环境的降级选自（仍锚定 `04`，可核验）**：Read `04-故事精选索引.md` 第 9–37 行的**书节目录**（27 行，格式 `书名｜起行–结束行｜N 窗`，**只为定位行号**）→ 以**用户这句话的字数 L** 为种子机械选区：第 `(L mod 27)+1` 部书，在该书区间 `[s, e]` 内取 `04` 第 `s + (L mod (e-s+1))` 行（若该行是 `## 书名` 标题或空行，向下顺延到最近的一条窗口行）→ 该行给出 `路径｜起行｜止行`，按它 Read 源文件照录复述。
   - **凭证**：回答**首行**写「引用 `04` 第 N 行（L＝用户消息字数）」；任何人打开 `04` 第 N 行都应看到**同一路径与起止行**——对不上＝没走索引。
   - 这条只解决"能不能从 `04` 拿到故事"，**不改变**「只讲一个」「不反问」「照录原文」三条硬规则。

1-alt-2. **零工具环境的选签表（按用户消息字数机械取号，不必读任何文件）**：下面的表共 27 条，对应 27 部书各一条；取**用户这句话的字数 L**，选第 `(L mod 27)+1` 条，讲该条——**选到哪个讲哪个，不得因「这条更有名／更精彩」而换**。回答首行写「选签 第 k 条（L＝N 字）」，并把该条的**原文首句照录一次**自证。**若连这张表也读不到**（所在环境拿不到本文件正文）：**必须如实说明「我读不到选签表，不能凭记忆编故事充当正史」**，改请用户给篇目、或让用户执行 `python tools\pick_story.py`——**绝不许随口编一个"听起来像史"的故事充数**（形如合法、实为瞎编，是本 skill 最重的失效模式）。

| # | 史书 | 篇目 | 该篇原文首句（照录；讲时须复述以自证） |
|---|---|---|---|
| 1 | 资治通鉴 | 资治通鉴·卷10 | 韩信使人间视，知其不用广武君策，则大喜，乃敢引兵 |
| 2 | 史记 | 卷八十三·鲁仲连邹阳列传第二十三 | 鲁仲连者，齐人也。好奇伟俶傥之画策，而不肯仕宦任 |
| 3 | 汉书 | 卷五十六·董仲舒传第二十六 | 臣谨案《春秋》之文，求王道之端，得之于正。正次王 |
| 4 | 后汉书 | 卷八十上·文苑列传第七十上 | 光和元年，举郡上计到京师。是时，司徒袁逢受计，计 |
| 5 | 三国志 | 卷六十四·吴书十九 | 恪意欲曜威淮南，驱略民人，而诸将或难之曰："今引 |
| 6 | 晋书 | 卷三十三·列传第三 | 武帝以崇功臣子，有干局，深器重之。元康初，杨骏辅 |
| 7 | 宋书 | 卷六十三·列传第二十三 | 勃好为文章，善弹琴，能围棋，而轻薄逐利。历尚书殿 |
| 8 | 南齐书 | 卷二十六·列传第七 | 显达素有威名，著于蛮虏，至是大损丧焉。御史中丞范 |
| 9 | 梁书 | 卷三十八·列传第三十二 | 迁员外散骑常侍。旧尚书南坐，无貂；貂自琛始也。顷 |
| 10 | 陈书 | 卷十八·列传第十二·沈众袁泌刘仲威等 | 袁泌，字文洋，左光禄大夫敬之弟也。清正有干局，容 |
| 11 | 魏书 | 卷十三·列传第一 | 景穆恭皇后郁久闾氏，河东王毗妹也。少以选入东宫， |
| 12 | 北齐书 | 卷四十六·列传第三十八 | 世轨，幼自严整，好法律，稍迁廷尉卿。洛州民聚结欲 |
| 13 | 周书 | 卷十五·列传第七 | 孝昌二年，又随广阳王征鲜于修礼。军次白牛逻，会章 |
| 14 | 隋书 | 卷六十四·列传第二十九 | 来护儿，字崇善，江都人也。幼而卓诡，好立奇节。初 |
| 15 | 南史 | 卷六十·列传第五十 | 伏惟陛下睿明启运，光天改物，拨乱惟武，经俗以文。 |
| 16 | 北史 | 卷三十·列传第十八·卢玄等１８人 | 元叉之废灵太后也，相州刺史、中山王熙起兵于邺。败 |
| 17 | 旧唐书 | 卷十五·宪宗下 | 十二年春正月辛酉朔，以用兵不受朝贺。癸未，贬义武 |
| 18 | 新唐书 | 卷二百二十二中·列传第一百四十七中 | 越析诏，或谓磨些诏，居故越析州，西距曩葱山一日行 |
| 19 | 旧五代史 | 卷三十九（唐书）·明宗纪五 | 十一月癸酉，日南至，帝御崇元殿受朝贺。甲戌，捧圣 |
| 20 | 新五代史 | 卷四·唐本纪第四 | 黄巢已陷京师，中和元年，代北起军使陈景思发沙陀先 |
| 21 | 宋史 | 卷三百四十二·列传第一百一 | 熙宁、元丰间，更制变令，士大夫多违己以求合，雍独 |
| 22 | 辽史 | 卷一百三·列传第三十三 | 今宜徙可敦城于近地，与西南副都部署乌古敌烈、隗乌 |
| 23 | 金史 | 卷一百十七·列传第五十五·徒单镒等 | 国用安，先前名叫安用，本名咬儿，淄州人。是红袄贼 |
| 24 | 元史 | 卷一百五十三·列传第四十·刘敏 | 王檝，字巨川，凤翔虢县人。父霆，金武节将军、麟游 |
| 25 | 明史 | 卷十·英宗本纪 | 五年春正月己未，大祀天地于南郊。二月乙亥，侍讲学 |
| 26 | 新元史 | 卷二百三十八·列传第一百三十五 | 萨都剌，字天锡，答失蛮氏，后徙居河间。萨都剌本朱 |
| 27 | 清史稿 | 卷二百九十一·列传七十八 | 傅鼐，字阁峰，富察氏，满洲镶白旗人。初授侍卫。雍 |

> 表由 `tools/make_story_pool.py` 读 `04` 按固定种子抽取（已剔除完璧归赵等超著名桥段、译注行、目录行与志表类）；需要换一批时改脚本里的 `SEED` 重跑。


1. **抽签**：`python tools\pick_story.py`
   - 默认**分层等概率**：27 部书先等概率选一部，再在该书内等概率选窗（若改为全库窗口等概率，通鉴占 6.9%，仍有偏重）；并自动排除最近 4 次**抽到或讲过**的书（读 `tools/_draw_log.md` 抽签记录 ＋ `tools/story_log.md` 讲完台账，两本账合并）。
   - 一次讲多个：`--count 3`（史书互不重复）。用户指定：`--dynasty 刘宋`、`--book 24明史文白`。歧义朝名如 `--dynasty 宋` 会被拒绝并要求二选一——这是设计如此，别绕过它。
   - 脚本直接给出路径、行号区间、首句、**签号**、可复制粘贴的 `Read` 调用。**禁止自己 Read `04` 挑书挑窗，也禁止"凭印象开一本书就讲"。**
2. **读窗**：按脚本给的行号区间 Read 源文件（文白对照卷译文随行；纯原文补入卷自行翻译并说明）。索引行号已抽检 54 窗零误差，可直接用。
3. **章法**：①钩子（人物＋冲突）→ ②白话叙述主干，关键处**照录原文金句**（对话、诏令、评语）→ ③结尾注《书名·卷次·篇名》，**政权限定写全**（"刘宋"不写"宋"），能补余味更佳。
4. **登记（可选，忘了不误事）**：讲完可补 `--commit-entry` 写入 `tools/story_log.md`（讲完台账，供回顾"讲过哪些"）。**轮换不依赖这一步**——抽签时 `tools/_draw_log.md` 已自动记（抽到即记），`--no-repeat` 并读两本账。别为"漏登记"纠结或补发一条，补跑一次 `--commit-entry` 即可。
5. **禁忌**：不编造情节、对话、动机；不改原文；人名官职以原文为准；不确定就说"原文未载"。
6. **交付校验**：把讲史回答存成文件，跑 `python tools\pick_story.py --check 答案.txt`（或 `--check -` 从 stdin）。它机械判三件事——**签号是否唯一**（>1 个＝讲了两遍）、**无签号时是否带了「虚构/非真实历史」标注**、签号能否对上两本账。**FAIL 必改**，退出码 1 就是不合格。

**硬规则（针对"仍偏爱通鉴／史记"这一被反复观测到的失效模式）**：

- **只讲人物的事，不讲制度条目。** 讲史的内容必须落在**列传／本纪里的人和事**上；志／表（职官、刑法、食货、地理、艺文、五行、祭祀…）是制度记述，**不是故事**——"某朝对刑狱制度进行改革"这种一句话概括不算讲史。`04` 与上面的选签表已在建库时剔除志／表卷（`build_story_index.py` 按 `05` 的类型列过滤），所以照抽的窗天然合规；**若你在零工具环境自选篇目，先确认卷题是"列传／本纪"再说**。
- **只讲一遍，可机械校验。** 一条回答**只含一个签号**、**只讲一个故事**；讲完即止。交付前跑 `pick_story.py --check` 把关——它按"签号个数"抓"讲两遍"，按"无签号又无标注"抓"没走脚本却当史讲"，不是靠自觉。
- **虚构必标注。** 凡脱离抽签窗口、或含演义／小说／创作内容（五关六将、桃园三结义、三打白骨精、武松打虎……），**必须在开头标「⚠ 非真实历史（演义／小说／虚构）」**，且不与正史混叙。正史故事有签号＋出处，**不需要**虚构标注——别两头都占。

- **首行必须带签号。** 抽签输出形如 `签号 #A1B2C3`，讲史回答的**首行原样带上它**。签号由「书名｜路径｜起止行」算出，**没跑脚本编不出来**——这是"到底走没走抽签"的唯一凭证。**没有签号的讲史＝自选书，不合格**，必须重跑抽签。
- **一次抽签只讲一个故事，不要讲两遍。** 三种翻车都见过：① 先自己按 `04` 的书节目录取一窗开讲，又跑脚本抽一窗讲第二次——**只认脚本抽的那一窗**（签号即凭证）；② 已经讲完又"再复述一遍／换个说法重讲"；③ **讲完自问自答续开场**——"你想听哪个朝代的故事呢？"→自己接"好啊"→"我给你讲个XX的故事"（XX 往往还是刚讲完的那个）。**讲完即止**："要不要再来一个"留给用户答，续讲必须等用户**下一轮**发起并重新抽签（轮换账会自动避开刚讲过的书）；一条回答里不许出现自问自答的对话桥段。**不要在正文之外另加摘要版**，也不要为了补签号把整段重发——签号写在**同一条回答的首行**就行。
- **不反问、不追问。** 「讲个故事／讲一个故事／给我讲一个故事」＝「直接抽签讲一个给我听」——**不要**先问"想听哪个朝代／哪本史书／正史还是演义"，也不要讲完追问"要不要再来一个"；续听由用户下一轮发起。
- **不得以"更短／更有趣／更精彩／更出名"为由自选书。** 抽签器没有这类参数（只有 `--dynasty／--book／--topic／--count／--min-score／--exclude`）；一旦出现这类措辞，就是模型在凭印象挑书。
- **"名气"不是选区依据。** 同样**不得**因为"廉颇蔺相如更有名""完璧归赵大家更熟""这个更经典更精彩"而挑选书或窗口——**抽到哪个就讲哪个**。凡回答里出现"这个比较出名／这个经典／大家更熟悉"之类措辞，即判定为模型凭印象自选，不合格。
- **禁止惯性连带。** 下一个故事**不得**因"刚讲过 X，就讲与 X 相关的人"而选定：**同书、同时代、并称典故（"冯唐易老、李广难封"）、师友亲属**一概不许。要讲新故事，一律**按新的字数 L 重新取号**——上一个故事讲的是谁，与这一个毫无关系。
- **被要求"换一个／不要这本"时**，重跑抽签并排除刚讲过的那本：`python tools\pick_story.py --exclude 资治通鉴,史记`。**不要**换到"另一本眼熟的"——从通鉴滑到史记正是这么发生的。`--exclude` 是**一次性的**（不落盘，下次抽签自动重新纳入），符合"我说了不要 → 换一本 → 以后还能讲"的直觉；要拦住某本书**长期**不进抽签，那得改 `04` 本身，别在抽签器里藏常设名单。
- **用户指定主题时**（"讲个关于XX的故事"）→ 走 `python tools\pick_story.py --topic XX`，**不要**自己 Grep `04` 挑窗；主题词只匹配窗口的「首句＋路径」，覆盖有限，查主题内容请先用 `rag.py`。试抽/调试加 `--no-log`，否则会写进轮换依据。

## 写史与改稿（双闸）

用户要"写个历史人物的故事""帮我改这段历史小说"时——**创作同样算史实性输出**：史实锚点零错误，虚构只能落在细节与对话，且必须标注。

1. **写前闸**：`rag.py locate <人名> --source index`（或直接 `rag.py <人名> --fast`）取本传卷 → Read 本传 → 取/建事实卡 `tools/facts/<人名>.md`（生卒·字号籍贯·出身·官职节点年·大事年·身后，每条挂卷次·行号）。无卡先建卡。
   - **跨朝补年号**：`factcheck.py` 内置的是明清年号表；写宋、唐等朝人物时，卡里必须加 `era: 熙宁|1068` 这样的行，否则年号不被识别、纪年检查会**静默失效**。参考 `tools/facts/沈括.md`、`tools/facts/王安石.md`。
   - **公元前用负数、生年无据写 0**（西汉及更早人物，2026-09-25 补）：`died: -157` ＝卒于公元前 157 年；`era: 高祖|-206` ＝高祖元年为前 206 年（算式 a+n-1 对负数同样成立）。**正史不载生年时写 `born: 0`＝「无下界」，跳过"早于生年"判定**——此前 `isdigit()` 只认无符号数，负数卡一律被判"缺 born/died"退码 2，西汉人物整张卡直接失效。参考 `tools/facts/刘恒.md`。
2. **写后闸**：`python tools\factcheck.py 稿件.txt --person <人名>`——FAIL 必改，WARN 逐条确认。**定稿前再跑 `python tools\rag.py verify 稿件.txt`**（铁律 8）：逐条核对稿里的文言引文是否真在库中、书名卷次是否对得上。卡里的 `banned` 可写正则，用来拦"伪造关系"与"当代话术"（如 `(沈括|括).{0,12}(拜访|求见).{0,10}(王安石|安石)`）。
   - **返工有上限，别无限重写**：同一份稿在同一项上**改满 3 轮仍 FAIL 就停下**，如实报告"卡在哪一项、已试过什么、怀疑卡里哪条写错"，把判断交回用户。**事实卡与库冲突时以库为准**，并把"卡可能写错"写进报告——卡是人写的，库是原文。
3. **锚点五查**：① 这年他活着吗、在哪个职位？② 该职位管得着这件事吗？③ 官名／刑名／地名是否当世用词？④ 人物立场是否与史实一致（如海瑞站在贫弱一边，不会替富商追银）？⑤ 这个说法出自正史、律典，还是小说与后世俗称？
4. **必须标注**：公案／断案／私访类题材多出自晚明公案小说（《海公案》等），正史无载——文末标"虚构"，并附"史实支点：《书名·卷次·篇名》"。
5. **律条不在本库**（《大明律》等未收录），引用须另据律典并说明；本库只能提供《明史·刑法志》层面的概述。
6. **先辨伪再创作**：若用户拿一段"既有的历史对话"来（要你续写或改写），先按 `references/pseudo-history-checklist.md` 判定真伪并说明，再决定怎么写——**不要在伪史的基础上"顺手补全"**。

## 文本格式

**判断原文还是译文看内容，不看 `> ` 符号。**

- 多数书：文言原文在前，`> ` 引用块为白话译文。
- **晋书、宋书、旧五代史等相反**：原文在 `> ` 块内。白话高频字（的/了/这/那/是/在）密度高者为译文。
- 通鉴 45 个补入卷：繁体原文＋胡三省注〔〕＋`译：` 前缀译文，检索原文宜用繁体。
- 宋史/明史/清史稿部分补入卷：纯文言无译文。梁书同卷可能有 `_译.md`（更详，优先）与 `_en.md`。
- 只搜译文加行首锚点 `^> .*关键词`（通鉴补入卷用 `^\s*译：`）。占位卷正文仅"（表略）"，命中后换卷或如实说明。

## 回答规范

- **朝名必加限定**：凡涉同名异代，写「刘宋」「赵宋（北宋）」「南齐」「后梁（五代）」，**不写"宋""齐""梁"**。引通鉴须连纪名写全（`《资治通鉴·宋纪一》卷119，刘宋`），不写"《资治通鉴》记载宋朝"。书名与卷次成对且互相自证（《宋书·卷一》＝刘裕，《宋史·卷一》＝赵匡胤——两书卷次篇名完全相同，写错书名几乎看不出来）。
- **跨书互证**：同一人/事常并见多书（李白见旧唐书卷一九〇下、新唐书卷二〇二），记载有出入须**并录原文、注明差异**，不自行取舍。
- **异文并录**：行尾带「异文：X」者为底本并列异文（端木赐/端沐赐），须两种写法并录、注"一作X"，不删不改；对照表 `tools/aliases.md`。
- **同名异人分流**：`03` 标「⚠同名异人」者（717 个）须**全列、逐一区分**——纪年＋身份词＋事迹＋所在书卷，不得合并成一人。标注只凭"同名而字不同"：同名者都无字或字相同时**不会标注**，故若见该名横跨多朝、或提及卷身份矛盾（一为将、一为僧），必须逐一 Read 核对。
- **事件／制度／案件类＝名词解释，一样要求出处。** 问「XX案／XX之变／XX之狱／XX之治是怎么回事」时，**先查 `08-案件索引.md`**（二百五十余案，行内检索词与出处均经脚本实测，照该行查、别照案名猜），再 **检索**（后世通称会被 `tools/aliases_events.md` 自动改写成史文用词，如「空印案」→ 空印事／空印纸），答复里**每个说法都要能指到《书名·卷次》**；**带不出出处＝没查**，只能答「本库未载」并列出检索词。⚠ 实测 2026-09-25：某环境问「空印案」，答成**宋代**转运使留空白印章、"宋代财政制度漏洞""制度性腐败"，**全篇零出处**——而空印案是**明·洪武十五年**的事：《明史·卷九十四·刑法志》「先是，**十五年空印事发**。每岁布政司、府州县吏诣户部核钱粮、军需诸事，以道远，**预持空印文书**，遇部驳即改，以为常」（另见卷一百三十九郑士利上书、卷一百四十一方克勤坐"空印"事诛、卷二百八十一「复以空印事连，逮死」）。**朝代错＋机构错（宋转运使）＋零出处＝同一个动作：没检索，照印象编一套制度解释。**
- **禁「特征匹配猜人」。** 问"这是谁／哪个朝代／什么谥号庙号"时，**必须检索**；由"罗列特征 → 凭记忆找相似者"反推**一律算未查**——曾把**石勒**的特征（羯人／曾为奴／听人读《汉书》／"遇高皇当北面事之，遇光武当并驱于中原"／胡人辞讼归门臣祭酒）整段安到**拓跋珪**头上（实为北魏**太祖道武皇帝**，代国世子出身）。**凡人物身份判断，须附《书名·卷次》**——无出处即视为未查。
- **核对表必须写「反证」。** 做线索／特征核对时，**每条都要附出处**（《书名·卷次》），且**至少列出一条「题面与候选人不符」**——**全打勾＝没真核对**：凡真查过库，被排除的候选人必然有对不上的条目。曾把题面「农民家庭」偷改成「出身将门」去硬凑郭子仪，7 条全打勾、零出处（实为岳飞，2026-09-24）。
- **人物辨识／猜谜题的固定规程（2026-09-25 起改用工具，不再人肉汇总）**：① `python tools\rag.py 谜 <独有引语／硬锚／特征词…>`——**候选必须取自它的输出**（候选＝语料原文里真实出现的人名，并附"锚度"告诉你哪条能当硬锚）；**不得先自己想名字**。② 对每个候选跑 `python tools\rag.py 对照 <名> <线索词…>`——逐条 ✔／✗／△ 与出处；**✗（硬锚对不上）即排除该候选**，反证栏写进答案。③ 定案后照证据块 Read 原文、引用前过 `verify`。**单轮筛选后直接定案＝不合格**——曾因检索词表只写「王|帝|皇|太子」，漏掉了不含这些字的「徽宗」（章惇谓其轻佻不可以君天下，宋史卷22）。
- **⛔ 猜不出来就说「无法确定」。** 「谜」无候选、或所有候选都过不了全部硬锚 ⇒ **正解就是答"无法确定"**（列出已核对项与未核对项即可），**禁止赌一个"最像的"**——罗列特征、凭记忆找相似者一律算未查。
- **②′「符合某条线索的人有几个」必须穷举，不许只证实一个（2026-09-24 补）。** 上面那条规程管住了"多列几个候选"，没管住**"候选从哪来"**——从记忆里挑几个熟名字＝照样没查。合格者全集只有一个机械来源：**把该条线索的硬特征词 `--top 0 --excerpt 60` 全库穷举**，逐条判主语（谁被这么评的），对上了才入列；然后**每人各自判否**，写明死在第几条。**只交一个"全对的人"不算解出谜题**——答案的唯一性是由"其余合格者全部出局"证明的，不是由"我这一个证起来了"证明的。实测：六道线索的「猜皇帝」只答刘粲、不列其余合格者，即被判为未思考；`轻佻` 一词的合格者至少还有 宋徽宗（端王，章惇谓其轻佻不可以君天下，宋史卷22）〔⚠ **他正是本题的错答**：只在第①条"轻佻"上像，**第⑥条「死后不久宗室于南部重镇登基」对他不成立**——他 1127 年时还活着（《宋史·卷二十四》「二帝已在金人军中」「徽宗北迁」），赵构正是在这一年「遥谢二帝，即位于府治」，而徽宗要到 **1135 年**才死（《金史·卷四》「丙寅，昏德公赵佶薨」），即"宗室登基"早于他死 **8 年**；我曾以「死需宽松解读」替他打补丁——这正是 ④ 明禁的动作，**某条不符即判否**〕、李从嘉（吴王，新五代史卷62）、唐昭宗（寿王，通鉴卷262）、刘辩（后汉书卷69）、司马玮／李从荣／耶律喜隐／陈叔文／朱宸濨／朱高煦／弘春／尔朱荣（皆王爵而止于非命或未即位）；**刘粲**（《通鉴》卷89「相国轻佻，正烦一刺客耳」，时任相国·晋王、未即位）**即本题正解**——须列其余合格者逐个判否以证唯一：①相国轻佻；②《晋书》卷102「昵近奸佞…距谏饰非」＋靳准之乱致刘氏覆灭；③**开国皇帝刘渊明言「不出三年，必克洛阳」**（卷87）而刘粲以河内王**领衔寇洛阳**（卷87），长安之役他**坐镇新丰为主帅**（卷87「粲在新丰，**使其将**刘雅、赵染攻新平」），受降司马模后**次年即被贾疋收复**（卷88）；④宗室**刘曜寇北地**；⑤卷90「刘氏男女，**无少长皆斩东市**」；⑥**死后两月**刘曜即位、**还都长安**（卷90／卷91「汉主曜还，都长安」）。⚠ 曾以"主帅派部将＝主语不在他"误排除他（卷87「粲在新丰，**使其将**刘雅、赵染攻新平」明载他为主帅）——已纠正。
- **②″ 穷举结果不得用关键词二次过滤（2026-09-24 补）。** ②′ 的"逐条判主语"必须真逐条读完：同一线索的措辞会变，拿几个词（君天下／人主…）去 grep 穷举结果，就会漏掉《通鉴》卷89「**相国轻佻**」这类写法，**把符合线索的人误判为不符合**——假阴性会错杀正确答案，比假阳性更致命。
- **③ 线索"像"不算匹配：候选之间比"谁出局"；地名按"当时所指"核（2026-09-24 二度翻车）。** 实测六条线索猜人，我因两点锁定**明成祖**，正解却是**石虎**（后赵）：①**地名按当时所指**——题面「南京」须落到事件年代的实体：石虎题里＝**东晋建康**（《晋书·卷一百七》「季龙小男混…**斩之于建康市**」），**不是明代应天府**；②**反证就是反证**——查到与候选不符的一条（朱棣第三子「反形未著」、起事者是第二子），该条即**判否**，不得改写成"题面记错"来保住候选（这是"先定答案再补理由"的变种）；③两个候选都"像"时，比**谁的出局条数多**，逐条写明死在第几条（②′已要求）。
- **④ 候选池只能由"题面词检索命中"构成，且必须跨时代检索；不许替题面打补丁（2026-09-24 三度翻车）。** 实测：五条线索猜人（正解＝**蒲鲜万奴**，金末东夏），我答**冉闵**——三处病根：①**话题惯性**：前两题（刘粲·石虎）都在十六国，我便把「北方政权」默认成十六国，**完全没检索金／蒙古**；而题面词一搜即中（`rag.py locate 蒲鲜万奴 --first` 直接给出《元史·卷一百四十九》开传行）。**做法**：把题面**硬特征词全部列出**（官职、政权名、国姓、地名、专名），逐个 `rag.py <词>` 检索，**候选池只能来自命中结果**，不许来自"我想到谁"；**题面未给朝代时，禁止把范围限定在前题的时代**。②**偷换概念绕反证**：为让冉闵过第5条，我把「Y（前燕）」偷换成「慕容垂的**后燕**」（另一政权）——而正解里 Y＝**蒙古**、主帅＝**贵由**（蒙古皇子→大汗），**同一势力**，无需任何偷换。③**替题面打补丁**：明知「慕容恪未即位」，却写"宜按前锋都督理解"保住候选人——与上次"题面偏差"同一个动作。**某条不符即判否，不许写"宜按…理解／题面或有误"**。
- **⚠ 检索路径按"手上有名字没有"分岔（2026-09-24 补）。** 旧版只写了"先检索人名"这一条路——**而「这是谁」的谜题里根本没有名字可查**（名字正是待猜项），于是规则无从执行、模型回落到记忆，翻了第二次车。故两条路必须分开写：
  - **有名字**（问这人的事迹／字号／仕历）→ `python tools\rag.py <人名> --fast` 取 ★本传，照证据块答。
  - **没名字（「这是谁」特征谜题）→ 不得拿待猜的名字当检索词**，改走 **「独有引语反查」**：从题干里挑**最不可能与人重名的措辞**直接搜库。优先序 ① **独有引语／罕见专名** ② **庙号＋谥号** ③ 独有官名／封号／地名。实测 `python tools\rag.py "当并驱于中原"` → 全库候选 **1** 个文件，即《晋书·卷一百五·载记第五》石勒本传（"脱遇光武，当并驱于中原"）——**一句独有引语就能唯一定位，比"想谁最像"又快又准**。
  - **庙号／谥号是硬锚，不是软特征**：可穷举、可判否，对不上即**一票否决**（石勒＝《晋书·卷一百五》"伪谥明皇帝，庙号高祖"；拓跋珪＝太祖／道武）。**逐条打勾**：题干每条特征都须在原文里找到对应，**一条不符即否决该人**，不得以"整体很像"结案。
  - **禁止先定答案再补理由**：出现"某人也算出身卑微……"这种替已选答案找补的话，即为翻车信号（拓跋珪是代国世子，谈不上卑微）——**退回检索**，不许顺着编下去。
- **"字"与"号"分开**：字见列传首句（「X，字Y」）；号（别号）正史基本不载；谥号/庙号见卒年条（「卒，谥曰×」）。
- **猜人物只认锚点，不认"像不像"（2026-09-24 补）。** 上面的纪律管住了"不许凭记忆"，管不住"**把工具递来的候选当结论**"——而后者才是人物题的翻车主现场。实测五类**假锚**：① `谜` 的候选取自 `03`，03 却按"有字／名入篇名"立目，陈玉成／石达开一批人全库 10–160 处而 `03` 曾**零条目**，于是谜面干脆是陈玉成本人原文时，候选栏顶出来的是塔齐布／彭玉麟（工具自己把错人排第一）；② 旧 `verify` 只看引文在不在库里，把魏徵的话写成「《旧唐书·卷七十一》李勣传载，勣对曰」照样 rc=0 放行；③ **候选栏自身混着"撞词的词组"和"别人名字的截短形"**——`★ 国事`（真身是明史《练国事传》，`02` 建索引时把姓氏炸掉了）、`★ 李瀚`／`★ 刘松`／`★ 松山`（实为李瀚章／刘松山）；④ **没有"曰"的史文引用**——「曹操，史载其『目有疾』，晚年失明」：三字短句旧闸抽不到（引文正则要 ≥4 字），而全库「目有疾」只有《梁书·萧恢传》两处，与曹操无关；⑤ **名与帝号配错**——「祖父刘宏（汉顺帝）」，刘宏是东汉孝灵帝，汉顺帝是刘保。五处已分别堵上：`谜` 另列「○ 段内句首主语」栏并写明**「不在候选」≠「不是答案」**；`verify` 加**说话人归属闸**、**字号断言闸**、**归因闸**（史载／史称＋短引语，主语取引文前 24 字内最近的人名，帝王本名从 `07` 补进人名表）与**帝号闸**（「名（某帝）」回查 `07`）；`谜` 的候选加了频率闸（≥250 卷即词组）、截短形折叠（同段每次出现都嵌在更长的人名里 ⇒ 不列）、并在每行印 `03 N 卷` 让撞词在肉眼面前露馅。**读候选栏的规矩**：★ 只代表"03 立过目"，**不代表本段真是他**——凡要写进答案的人名，必须用 `对照 <名> <线索…>` 过一遍全部硬锚，且落笔前 `verify`；被"折叠／备查"挤掉的，不得当成排除依据。
- **落笔前的四锚自查（缺一即改答"无法确定"）**：① 这个名字在库里有**开传式起句**吗——`python tools\rag.py locate <名> --first` 给结论与起读行（选项写在词前也认，但别写成 `locate --first` 后不跟名字）；② 引文命中处**确实是这个人**吗（跑 `verify`，归属闸与归因闸会拦）；③ 字号／封号／帝号指得出 `02`／`07` 的条目或原文行吗（「名（某帝）」与 `07` 的号必须一致）；④ 题干每条**硬锚**逐条 ✔、且至少写出一条"题面与该人不符"了吗。**四锚不齐就答"无法确定"**，不许挑"最像的"下手——把封号（英王／忠王）、族属（羯人）、出身（农家）这类软特征当身份凭据，正是一切人物瞎编的共同起点。**尤其禁止"改写题面"**：线索说"祖父是诗人"，答成"虽非大诗人，但本人善诗"＝这条线索不匹配，不是可以打折的次要项。
- **⚠ 四锚自查是"落笔前的强制动作"，不是备查清单（2026-09-24 三度翻车后的补强）。** 三道人物题（刘粲／石虎／蒲鲜万奴）我都**读到了它却没跑**，且**三次都做了它明令禁止的动作——改写题面**（"死需宽松解读"／"题面或有偏差"／"宜按前锋都督理解"）。**机械口径**：答复里必须**显式写出**①候选的开传式起句（`rag.py locate <名> --first`）②`verify` 结果 ③**"题面与候选不符的那一条"**；**写不出③ ⇒ 四锚不齐 ⇒ 改答"我查到 N 个候选，无法唯一确定"**。⚠ **"有据"≠"可答"**：检索到原文只证明该条线索存在，**不证明候选是唯一解**——「无据即止」管的是"零命中"，管不了"有命中但候选选错"，后者才是翻车主场。**谜题答"无法唯一确定"是合规作答，不是失败**；答一个"某条不符的人"才是失败。
- **⑤ 检索词必须来自"题面字面"，禁止用"已选答案或其关联词"当检索起点（2026-09-24 四度翻车）。** 实测：六条线索猜人（正解＝**孟昶**，后蜀），我答**汉文帝刘恒**——我自以为"从题面词出发"了，实际搜的是「**薄姬 魏豹**」「**博局 吴太子**」「**代王 薄太后**」，**每一条都是"指向我已选定答案"的关联词**，当然条条命中 ⇒ **拿答案搜答案、再拿搜到的东西证明答案**（循环论证）。**正确做法**：检索词必须是**题面的模式**而非**我猜的人名/其亲属/其事件**——如本题②「生母原是另一个势力主公的妻妾」应搜该**模式**（"本庄宗嫔御，以赐知祥"），**不许**搜"薄姬 魏豹"（薄姬是我猜的答案之母）。**四锚自查的检索词同样必须来自题面**，否则四锚会被"已选答案"污染，跑成"给已选答案找证据"。
- **⑥ 零命中的名词＝「本库未载」，禁止凭记忆解释（2026-09-24 补）。** 被问「某某是什么」而**全库零命中**时（如「戒石铭」及其原名「令箴」、「劝农桑诏」，连繁简与关键句「民膏民脂」「下民易虐」都试过、均零命中），**只能答「本库未载」并列出检索词**——**不得**用训练记忆写一段听起来对的解释。⚠ **名词解释最容易被误当成「可以用常识答」，是幻觉高发区**。⚠ 用户主动告知的**库外信息**（如「戒石铭原名《令箴》」）**可标注来源后接受**，但不得转而当作本库证据；⚠ 还要留意**时代错位**：孟昶作《令箴》、宋太宗命名「戒石铭」分属两代，**把宋名安到孟昶头上＝每一半都真的假话**。
- **⑦ 猜谜题交付闸（硬条件，2026-09-24 用户定）：只有两种合法形态。** ① **给出人名** ⇒ 必须逐条全中并**显式声明「无不符」**；② **答「无法唯一确定」** ⇒ 必须列候选与各自出局条数。⚠ **出现「不符／未见／未载／相反／存疑」等字样，却仍给出具体人名 ⇒ 不合格**——「本库未载」也算不符：**无法证实即不得作答**。⚠ 出现「宜按…理解／题面或有误／需宽松解读」等**替题面打补丁**的措辞 ⇒ 不合格。**交付前必跑** `python tools\check_guess.py <答案.txt>`（rc=1 即改答形态②）。

## 自检（输出前过一遍）

① 先查了索引/原文，而非凭记忆？② 引用照录自实际打开的文件？③ 引的是文言原文还是白话译文？④ 卷号来自文件名/篇首而非记忆？⑤ 同名已分流、异文已并录？⑥ 查不到时如实说明、绝未编造？⑦ **朝代政权定了吗——"宋"写清是刘宋还是赵宋了吗？书名与路径里的文件夹名对得上吗？**⑧ **讲史是脚本抽的签，还是我自己挑的书？**⑨ **若是辨伪：六查做了几条？答复有"最接近的真实记载原文"这一段吗，还是只有一句"这是假的"？**⑩ **答案里的每条文言引文和 `《书名·卷次》` 都跑过 `rag.py verify` 且无 FAIL 吗？**⑪ **问人家专传时，是照 `02`／`03` 的 ★本传 拿到的路径，还是在 `01`／`05` 里搜人名、搜不到就答"没有传"？遇到后世通称（乌台诗案／靖康之变…）有没有照 `rag.py` 的「通称改写」走，而不是自己接着换词？**⑫ **人物身份类（"这是谁"）：检索词用的是题干里的独有引语，还是待猜的那个名字？庙号／谥号这类硬锚逐条对过了吗，有没有一条不符却仍以"整体很像"结案？**⑬ **猜出来的人过"四锚"了吗——`locate <名> --first` 说有没有专传、`verify` 的说话人归属闸过了吗、字号有没有 `02`/`07` 条目可指？候选栏没顶出他，是当"排除依据"还是先想"03 可能漏收"？**⑭ **若是"XX案／XX之变／XX之狱"这类事件·制度名词：先查 `08-案件索引.md` 了吗（照该行检索词查，别照案名猜；行内 `⚠`＝本库未载，须答未载）？检索跑了吗？答复里每个说法都指得出《书名·卷次》吗？朝代（明？宋？）是原文里读到的，还是从"这事听起来像哪个朝代"推的？**

## 维护

**改语料、改脚本、跑 OCR、加事实卡前，先读 `references/maintenance.md`**（索引重跑顺序、加数据入口、OCR 管线、体检、环境注意事项都在那里）。

两条无需读手册的常备知识：
- `tools/rag.py`（含 `locate`）、`tools/pick_story.py` 与 `tools/facts/` 事实卡**无需重建**，语料一变即生效（`rag.py` 每次实时扫描，`pick_story.py` 每次直读 `04`，`story_log.md` 台账由它自己追加）；新增人物只加一张 md 卡。异体字/人名别名往 `tools/rag.py` 的 `RAG_VARIANTS` 表加一行即可（人物异文仍写 `tools/aliases.md`）；**后世通称**（乌台诗案、靖康之变…）往 `tools/aliases_events.md` 加一行，实时读取——右端词上线前必须 `python tools\rag.py <词> --count` 实测存在，否则等于换了个词还是零命中。**查不到的真人物**登记 `tools/extra_names.md`；**误收的假人名**登记 `tools/name_blocklist.md`（两者都需重跑 02→03）。
- Python 用 3.13.12（本机解释器的绝对路径只记在 `references/maintenance.md`「环境注意」节——**本文档不写盘符**）；改完任何索引脚本，最后跑 `python tools\selftest.py` 验收（退出码 0 即全通过，其中含 `rag.py selftest --quick`），**或直接 `python tools\make_indexes.py` 一键重建＋验收**。单独调试检索用 `python tools\rag.py selftest`（全量，较慢）。改语料后另跑 `python tools\check_dupnames.py` 看同名文件有没有扩大。

## 事实之外：能不能再深一层

本库只答**「是什么」**——原文、卷次、生卒、制度细节，一律来自检索；**不答「为什么」**——动机、归因、「表面是 X、实际是 Y」这类推断。本库缺证据时按铁律 3 如实答「本库未载」，不用训练记忆顶上。

碰到「为什么」类问题，本库只提供**原料**：先把事实取到手（`rag.py`）、照录原文、记清《书名·卷次·篇名》。此后若想把这个问题想得更深，可以再看看手边别的地方有没有能帮上忙的工具或材料——**有就接着用，没有就把话停在事实层面**，并标明「以下为推测」，不为其编造依据。
