# Random History Anecdote

> 随机提供一个有起伏、经史料核验的中国古代历史段子（原文 150–1500 字，必须有转折、反转或身份揭晓，太短太平的直接重抽）。适合用户说“来个历史段子”“随机历史小故事”“random-history-anecdote”等请求；按译文、出处、出处考证、职官表、原文的顺序输出，译文直接给正文不写“译文：”，出处考证把辞典解释与我的评价分开，保持简短。不附识典古籍链接和左图右史地图链接，但仍按项目规则换算年号、标注古地名今地，遇官职/爵位/官阶时结合朝代据辞典解释、原文没有职官就不写职官表，查不到就重抽或明说。

- Skill: `quzhi1/random-history-anecdote` (Agent Skill)
- Install (CLI): `npx skillmds@latest add quzhi1/random-history-anecdote`
- Raw SKILL.md: https://api.skillmd.com/api/skills/quzhi1/random-history-anecdote/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: quzhi1 (https://skillmd.com/u/quzhi1)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/quzhi1/random-history-anecdote

---


# 随机历史小段子

本 skill 是项目根目录 `SKILL.md` 的轻量入口：目标是让用户快速得到一个有趣的历史小段子，而不是完整历史问答报告。证据底座仍然使用《中国历史大辞典》和 cnkgraph 古籍原文；不得编造段子、不得凭记忆补出处。

## 适用范围

- 中国古代（先秦至清末）人物、事件、言语、轶事、制度运行中的片段，原文 **150–1500 字**。
- **必须有起伏**：至少一个转折、反转、揭穿、机锋或身份错位。只有一句妙语、没有情节推进的，
  再有名也不要——那种段子排成卡片只有两三张，读起来干巴巴。
- 每次调用时动态随机发现候选；不使用固定段子池，不限定书目范围，不限定主题词。
- 段子应有现代读者也能感到的趣味：机智、反转、语言梗、人物性格、处世判断、制度荒诞、名实错位等。

不适合：
- 长篇人物传记、完整事件复盘、严肃比较评价题；这些转用根目录 `SKILL.md` 的完整流程。
- 查不到原文或出处的传闻；不要为了有趣而补写。

## 与主 skill 的关系

继承主 skill 的底线：
- 必须真实查询，不得编造原文、出处、译文或背景。
- 原文必须来自本轮查到的辞典或 cnkgraph 片段。
- 出处必须写书名 + 卷/篇/章节名；cnkgraph 只返回卷名时，不要凭空补篇名。
- 译文只翻译原文；不要另写“好玩处”或趣味解释。
- **译文要像当代人说的中文**：不是逐字换词，而是按现代读者的说话方式重写。文言虚词和生僻单字词（「病其人」「稔知」「俾」「既而」「俄顷」「遂」「奈」之类）一律换成日常说法；该拆长句就拆，该补出主语和逻辑连接就补，宁可重组句子也不要留半文半白的腔调。人物对话按现代人开口的语气译。专名、官名、年号、书名照旧保留，不改不译。
- **诗词韵文不译**：原文里的诗、词、歌、赋、铭、箴、联等韵文照录原文，不翻成白话；只翻周围的散文，需要时在译文里用「他随口作了一首诗」之类带过，再直接引原诗。
- **称谓要还原成人名**：古文常用「姓＋官名/爵名/郡望/排行」代称人（「程光禄」「李司空」「王右军」「杜工部」「谢公」），译文不能照抄这种叫法。先查出本名，译文里写本名；查不到本名时写成「程家那位光禄大夫」之类说得通的说法，用读者听得懂的话说明（如「本名史籍失载」），不要写成查询过程。原文照录不动。
- 史料中出现年号纪年，必须运行 `scripts/dynasty_converter.py`，并写成 `年号（公元年）`。
- 最终回答保留古地名时，必须运行 `scripts/place_resolver.py`，并在首次出现处括注今地；查不到就写“今地未能确认”。
- 段子里出现官职、爵位、官阶时，必须查《中国历史大辞典》，结合段子所在朝代解释该头衔；释义只用辞典查到的内容，查不到就明说。

本 skill 的明确例外：
- **不运行、不输出识典古籍链接**。出处行只写书名 + 卷/篇/章节名。
- **不运行、不输出左图右史地图链接**。地点只做现代今地括注。
- 默认不输出“被引史料说明”，除非来源性质会影响理解或用户追问。
- 输出要短；不要展开成长篇史论。
- 不输出任何外链。
- **不留操作痕迹**：交付的文字是给读者看的，不是工作日志。「本轮」「这次」「本轮未查到辞典佐证」「脚本未返回候选」「辞典未收此人」「已按规则标注」「这次没有职官表」这类描述查询过程的话一概不写；末尾也不加说明干了什么的总结段。没查到就用读者语言直说（「本名史籍失载」「生平不详」「今地未能确认」），或者干脆不提；该省的整段省掉，不要写一句话交代自己省了它。

## 标准流程

> 命令路径默认 macOS/Linux。Windows PowerShell 可用 `python scripts/run_in_venv.py <script.py|mdict> ...` 或对应 `venv\Scripts\python.exe` / `venv\Scripts\mdict.exe`。

1. 切到项目根目录，即本 skill 目录**真实位置**的上一级。全局安装时本 skill 目录是 `~/.claude/skills/` 下的符号链接，必须先用 `realpath` 解析，不能直接用符号链接的上一级：

```bash
cd "$(dirname "$(realpath ~/.claude/skills/random-history-anecdote)")"
# 已在项目目录时直接：cd /path/to/HistoryAgentSkills
```

```powershell
Set-Location (Split-Path (Get-Item "$env:USERPROFILE\.claude\skills\random-history-anecdote").Target)
```

2. 随机发现候选。

```bash
venv/bin/python scripts/random_anecdote_seed.py --json
```

脚本会在运行时随机生成古汉语检索探针，调用 cnkgraph `Book/Find` 检索全库，随机跳到命中结果页，再返回若干带书名、卷名和上下文的候选片段。它不读取固定段子 JSON。

```bash
venv/bin/python scripts/random_anecdote_seed.py --attempts 15 --candidates 8 --json
```

3. 从返回的 `candidates` 里挑一个**能撑起一则完整小故事**的片段。按下面的顺序筛：

   1. 有没有转折？（骗局被拆穿、误认、反将一军、说错话、身份揭晓、算盘落空……）
   2. 有没有具体的人物动作和对话，而不只是叙述或评论？
   3. 原文够不够长？**不足 150 字、或读完只有一个笑点没有推进的，直接放弃，换下一个候选。**

   有没有官职、爵位、官阶**不是筛选条件**：不要偏向含官名的段子，也不要因为一则段子里没有官名就重抽。
   市井、僧道、商贾、妇人、匠人、盗贼的故事同样合格。

   候选普遍太单薄时，不要将就，直接加大取样重抽：

   ```bash
   venv/bin/python scripts/random_anecdote_seed.py --attempts 20 --candidates 12 --json
   ```

   选定后用候选 `keyword` 或原文中的短句再次查询 cnkgraph，**把故事的头尾都补齐**——
   随机脚本返回的往往是中间一段，缺了起因或结局就不成故事。

   补尾的办法：拿片段最后几个字当关键词回查，看 `LaterText`；它每次只给几十字，就再用新末尾
   继续回查，一段段往下接。**接不动就是接不动**——`Book/Find` 只索引部分短语，故事的下一页
   常常检索不到。这时**直接换候选**，不要把一个没有结局的半截故事交出去，也不要自己补写结局。

```bash
venv/bin/python cnkgraph/scripts/query_api.py find --keyword "<候选 keyword 或原文短句>"
```

4. 用《中国历史大辞典》核定人物、书名或关键背景。

```bash
venv/bin/mdict -q "<人物或书名>" dict/历史辞典4合1.mdx
```

5. 查**出处那本书**，做出处考证。用《中国历史大辞典》查这次引用的书名，据词条了解成书年代、作者、性质（正史 / 笔记 / 类书 / 小说等），再据此对这条史料的可信度作一句简短评价。

```bash
venv/bin/mdict -q "<出处书名>" dict/历史辞典4合1.mdx
```

必须把两者分开写：
- **辞典解释**：辞典词条怎么定性这本书，照实转述，不加工。
- **我的评价**：你自己的可信度判断（如正史可信、笔记小说宜存疑、后世类书转引需回溯原书）。

辞典查不到这本书时，如实写"辞典未收此书"，评价只能基于书的性质常识，并标明是推断。转引类书（如《太平广记》《锦绣万花谷》引某书）时，出处以类书为准，可信度按转引处理。

6. **仅当**段子的原文、译文或一句必要背景里出现官职、爵位、官阶名时，逐一查《中国历史大辞典》，结合段子所在朝代解释这个头衔。原文里没有这类头衔就**整步跳过**，不要为了凑出职官表去翻找官名，更不要回头换一个带官名的段子。

```bash
venv/bin/mdict -q "<官职/爵位/官阶名>" dict/历史辞典4合1.mdx
```

- **结合朝代取义**：辞典词条常按朝代分列多个义项（如"司空""知制诰"在不同朝代含义差别很大），必须挑与段子朝代对应的一条来解释，不要照搬别的朝代的含义。
- **只说要点、力求短**：一句话说清这个头衔是什么、大致品级或职掌、是实职还是加官/虚衔即可，不展开成职官志。
- **只用辞典查到的内容**：释义必须来自本轮查到的辞典义项；辞典未收该词条时写"辞典未收此职官"，至多据常识作一句谨慎推断并标明"（推断）"，不得当作辞典结论。
- **范围**：官职、爵位（公/侯/伯/子/男等）、官阶/散官、赠官同样处理；只解释段子里真正出现、且现代读者可能不懂的头衔，人人皆懂的（如"皇帝""将军"泛称）可略。

7. 若查到的段子含年号，运行年号换算。

```bash
venv/bin/python scripts/dynasty_converter.py "永乐十五年"
```

8. 若最终原文、译文或一句必要背景里保留古地名，逐一查今地。

```bash
venv/bin/python scripts/place_resolver.py "长安" --year 755 --json
```

9. 若候选查不到可靠原文、出处不清、译文无法确定，**或者故事太短太平**，都重抽，最多四次。仍失败时简短说明“这次没有抽到可核验段子”。宁可多花一轮，也不要交一个没起伏的段子。

## 输出格式

默认按 **译文 → 出处 → 出处考证 → 职官表 → 原文** 的顺序输出；译文直接写正文，不加“译文：”标签。不加查询日志、地图、识典链接，也不另写“好玩处”。

```markdown
**今天的小段子：[标题——摘一句金句，或起一个抓人的主题，见下]**

[译文正文直接开写，不写“译文：”；用当代汉语说人话，不留文言腔；只翻译原文，不塞分析；原文里的诗词韵文照录不译；「姓＋官名」代称还原成本名；涉及古地名时首次出现括注今地；涉及年号时保留年号并括注公元年。]

出处：《[书名]》卷/篇《[章节名]》

出处考证：辞典解释——[辞典对该书的定性，如成书年代、作者、性质]；我的评价——[一句话可信度判断]。

职官表（**仅当原文里真的出现官职/爵位/官阶时才写**，逐一列出；原文没有就连标题带内容整段删掉，不写“无”“不适用”）：
- [头衔名]（[朝代]）——[据辞典对应义项的一句话释义；辞典未收则写"辞典未收此职官"]。

原文：「[一段短引]」
```

**标题**：**不要总结整个段子**。标题不是内容提要，是钩子。只有两种写法，任选其一：

1. **摘金句**——直接从原文里挑一句最有味道的话当标题，原样照录，不加引号外的解释。
   段子里有妙语、狠话、反问、当场噎人的一句，优先用它。
2. **起主题**——用现代读者一眼有感的角度命名这则故事，像杂志标题、像帖子标题。
   可以用当代词汇和当代视角。

十字以内最好，别超过十五字。两种写法都不需要交代「谁」和「结果」——那是正文的事。

- 好（金句）：「夫人何自苦如此」「汝妇人何知」「是况。」
- 好（主题）：「独立女性在五代」「古代基层公务员的自我修养」「一场把自己坑进去的举报」
- 坏：「邓氏亲自来交税，周行逢下不来台」——把整件事讲完了，读者没有往下看的理由
- 坏：「高防量布幅，五个死囚翻案」——同上，标题替正文把活干了
- 坏：「万一他真死了呢」「一件小事」——空洞悬念、抽象概括，两头不沾

起主题时用词可以现代、可以夸张，但**朝代、人物、事件性质必须对得上**，不能为了顺口把五代写成唐朝。

“出处考证”一行必须让读者一眼看出哪句是辞典说的、哪句是你的判断；辞典未收该书时写“辞典解释——辞典未收此书”。“职官表”只在原文真出现官职/爵位/官阶时才出现，没有就整段不写、也不写占位说明；释义要结合段子朝代取义，不照搬别的朝代含义。

## 选材标准

**篇幅**：原文 200–1500 字。低于 200 字的一律放弃——不要再用「虽然短但有转折」给自己找台阶，
实测这类材料交出去就是平淡；超过 1500 字才截取完整情节的关键片段，并标明「节引」。

**完整故事**（最重要的一条）：要的是一个**故事**，不是一条记事。四段都得有——

1. **起因**：谁、在什么处境下、想要什么或摊上了什么。
2. **经过**：至少两三个具体动作或回合，人物真的做了事（去了哪、动了手、设了局、试了几次）。
3. **转折**：局面翻过来。
4. **结局**：这事最后怎么收的，当事人怎么样了。

一问一答就完、一次进言就了、一条判例式记事（某人建议某事，上从之），哪怕理由再漂亮，
也只是「一个回合」，不算故事，直接换。判断标准很土：**能不能分镜头？**
讲出来要能拆成三四个场景，而不是一段话说完。

**转折**可以是——

- 骗局被拆穿（认错尸、假冒身份、伪造证据）
- 反将一军（对方的话被原样用回去）
- 身份揭晓（「是况。」）
- 算盘落空、弄巧成拙
- 制度或名实的荒诞错位

只有一句妙语、没有前因后果的，不要。人物只是被评价、没有实际动作的，不要。
只有转折而没有结局（后来怎么样了不交代）的，也不要。

**其他优先项**：
- **有人对着人**：至少两个人利害相冲，一方赢一方输，且输的一方付出了看得见的代价（挨打、丢官、出丑、被赶走）。
  只有一个聪明人对着一桩案子、一件公务的（明察秋毫断案、勤政爱民、廉洁自守），哪怕手法再巧也容易平，能不选就不选。
- 有明确的人物动作和对话，能直接改写成场景。
- 读者不需要额外解释也能看出趣味。
- 有具体细节（人名、数目、对话原话），排成卡片时才有东西可写。

**避免**：
- 只有惨烈处刑、灾异、战争死亡数字的材料。
- 需要大段背景才看懂的材料。
- 只在后世笔记中孤证且出处不清的材料；如果使用，必须如实说「仅据某书所载」。
- 把现代段子感强行套到史料上。
- **套路化的天命叙事**：望气、相面、异梦、生时异象、童年指挥群儿、僧道预言某人当贵——
  这类「发迹前兆」自《史记》以下每部史书都有一堆，情节可以预测，读者早看腻了，不要。
- **借事说理的寓言体**：主角无名无姓（「有山人」「楚人有……者」），结尾挂一段「故曰」「君子谓」把道理讲白的，说教味压过故事，不要。
  真人真事、讲完就完、道理自己藏在情节里的才要。

## 质量自查

- [ ] 是否真实运行了随机发现脚本，且不是从固定段子池抽取？
- [ ] 是否查到了原文，而不是凭记忆复述？
- [ ] 出处是否包含书名 + 卷/篇/章节名？
- [ ] 输出顺序是否为 译文 → 出处 → 出处考证 → 职官表（原文无职官时整段省略） → 原文，且译文没写“译文：”标签？
- [ ] 是否查了出处那本书，并给出出处考证？辞典解释与我的评价是否分开、没有混为一谈？
- [ ] 译文是否只翻译原文，没有把分析塞进译文？
- [ ] 译文读起来像不像当代中文？是否还残留文言虚词、生僻单字词或半文半白的句式？
- [ ] 原文里的诗词韵文是否照录原文、没有被译成白话？
- [ ] 译文里的「姓＋官名」代称（如「程光禄」）是否已还原成本名，或已用读者语言说明本名失载？
- [ ] 全文有没有「本轮」「这次」「脚本」「已按规则」之类的操作痕迹，或末尾交代自己做了什么的总结段？有就删掉。
- [ ] 年号是否已换算；无年号则跳过？
- [ ] 古地名是否已查今地；无古地名则跳过？
- [ ] 段子里的官职/爵位/官阶是否已查辞典、并结合朝代解释？辞典未收是否已明说？原文没有此类头衔时，是否整段没写职官表？
- [ ] 选段子时是否没有偏向带官职的材料（市井、僧道、商贾、妇人的段子同样合格）？
- [ ] 是否没有输出识典链接、没有输出左图右史地图链接？
- [ ] 原文是否在 1000 字以内，或已对更长材料作完整情节节引？
- [ ] 原文是否有起伏（至少一个转折），而不是只有一句妙语？
- [ ] 起因、经过、转折、结局四段是否齐全，能拆成三四个场景？只有一个回合（一问一答、一次进言、一条判例）就换掉。
- [ ] 原文是否满 200 字？不满就换，不要用「短而有转折」放行。
- [ ] 是不是借事说理的寓言（无名主角＋结尾一段大道理）？是就换掉。
- [ ] 是不是望气相面、异梦异象那一路的发迹套路故事？是就换掉。
- [ ] 标题是不是金句摘录或抓人主题，而**不是**把整个段子总结了一遍？起主题时朝代和事实有没有写错？
- [ ] 有没有人物对人物的冲突和看得见的代价？只是「能吏办了件漂亮事」的，换掉。
- [ ] 是否确实有趣？

