随机历史小段子
本 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。
- 切到项目根目录,即本 skill 目录真实位置的上一级。全局安装时本 skill 目录是
~/.claude/skills/下的符号链接,必须先用realpath解析,不能直接用符号链接的上一级:
cd "$(dirname "$(realpath ~/.claude/skills/random-history-anecdote)")"
# 已在项目目录时直接:cd /path/to/HistoryAgentSkills
Set-Location (Split-Path (Get-Item "$env:USERPROFILE\.claude\skills\random-history-anecdote").Target)
- 随机发现候选。
venv/bin/python scripts/random_anecdote_seed.py --json
脚本会在运行时随机生成古汉语检索探针,调用 cnkgraph Book/Find 检索全库,随机跳到命中结果页,再返回若干带书名、卷名和上下文的候选片段。它不读取固定段子 JSON。
venv/bin/python scripts/random_anecdote_seed.py --attempts 15 --candidates 8 --json
从返回的
candidates里挑一个能撑起一则完整小故事的片段。按下面的顺序筛:- 有没有转折?(骗局被拆穿、误认、反将一军、说错话、身份揭晓、算盘落空……)
- 有没有具体的人物动作和对话,而不只是叙述或评论?
- 原文够不够长?不足 150 字、或读完只有一个笑点没有推进的,直接放弃,换下一个候选。
有没有官职、爵位、官阶不是筛选条件:不要偏向含官名的段子,也不要因为一则段子里没有官名就重抽。 市井、僧道、商贾、妇人、匠人、盗贼的故事同样合格。
候选普遍太单薄时,不要将就,直接加大取样重抽:
venv/bin/python scripts/random_anecdote_seed.py --attempts 20 --candidates 12 --json选定后用候选
keyword或原文中的短句再次查询 cnkgraph,把故事的头尾都补齐—— 随机脚本返回的往往是中间一段,缺了起因或结局就不成故事。补尾的办法:拿片段最后几个字当关键词回查,看
LaterText;它每次只给几十字,就再用新末尾 继续回查,一段段往下接。接不动就是接不动——Book/Find只索引部分短语,故事的下一页 常常检索不到。这时直接换候选,不要把一个没有结局的半截故事交出去,也不要自己补写结局。
venv/bin/python cnkgraph/scripts/query_api.py find --keyword "<候选 keyword 或原文短句>"
- 用《中国历史大辞典》核定人物、书名或关键背景。
venv/bin/mdict -q "<人物或书名>" dict/历史辞典4合1.mdx
- 查出处那本书,做出处考证。用《中国历史大辞典》查这次引用的书名,据词条了解成书年代、作者、性质(正史 / 笔记 / 类书 / 小说等),再据此对这条史料的可信度作一句简短评价。
venv/bin/mdict -q "<出处书名>" dict/历史辞典4合1.mdx
必须把两者分开写:
- 辞典解释:辞典词条怎么定性这本书,照实转述,不加工。
- 我的评价:你自己的可信度判断(如正史可信、笔记小说宜存疑、后世类书转引需回溯原书)。
辞典查不到这本书时,如实写"辞典未收此书",评价只能基于书的性质常识,并标明是推断。转引类书(如《太平广记》《锦绣万花谷》引某书)时,出处以类书为准,可信度按转引处理。
- 仅当段子的原文、译文或一句必要背景里出现官职、爵位、官阶名时,逐一查《中国历史大辞典》,结合段子所在朝代解释这个头衔。原文里没有这类头衔就整步跳过,不要为了凑出职官表去翻找官名,更不要回头换一个带官名的段子。
venv/bin/mdict -q "<官职/爵位/官阶名>" dict/历史辞典4合1.mdx
- 结合朝代取义:辞典词条常按朝代分列多个义项(如"司空""知制诰"在不同朝代含义差别很大),必须挑与段子朝代对应的一条来解释,不要照搬别的朝代的含义。
- 只说要点、力求短:一句话说清这个头衔是什么、大致品级或职掌、是实职还是加官/虚衔即可,不展开成职官志。
- 只用辞典查到的内容:释义必须来自本轮查到的辞典义项;辞典未收该词条时写"辞典未收此职官",至多据常识作一句谨慎推断并标明"(推断)",不得当作辞典结论。
- 范围:官职、爵位(公/侯/伯/子/男等)、官阶/散官、赠官同样处理;只解释段子里真正出现、且现代读者可能不懂的头衔,人人皆懂的(如"皇帝""将军"泛称)可略。
- 若查到的段子含年号,运行年号换算。
venv/bin/python scripts/dynasty_converter.py "永乐十五年"
- 若最终原文、译文或一句必要背景里保留古地名,逐一查今地。
venv/bin/python scripts/place_resolver.py "长安" --year 755 --json
- 若候选查不到可靠原文、出处不清、译文无法确定,或者故事太短太平,都重抽,最多四次。仍失败时简短说明“这次没有抽到可核验段子”。宁可多花一轮,也不要交一个没起伏的段子。
输出格式
默认按 译文 → 出处 → 出处考证 → 职官表 → 原文 的顺序输出;译文直接写正文,不加“译文:”标签。不加查询日志、地图、识典链接,也不另写“好玩处”。
**今天的小段子:[标题——摘一句金句,或起一个抓人的主题,见下]**
[译文正文直接开写,不写“译文:”;用当代汉语说人话,不留文言腔;只翻译原文,不塞分析;原文里的诗词韵文照录不译;「姓+官名」代称还原成本名;涉及古地名时首次出现括注今地;涉及年号时保留年号并括注公元年。]
出处:《[书名]》卷/篇《[章节名]》
出处考证:辞典解释——[辞典对该书的定性,如成书年代、作者、性质];我的评价——[一句话可信度判断]。
职官表(**仅当原文里真的出现官职/爵位/官阶时才写**,逐一列出;原文没有就连标题带内容整段删掉,不写“无”“不适用”):
- [头衔名]([朝代])——[据辞典对应义项的一句话释义;辞典未收则写"辞典未收此职官"]。
原文:「[一段短引]」
标题:不要总结整个段子。标题不是内容提要,是钩子。只有两种写法,任选其一:
- 摘金句——直接从原文里挑一句最有味道的话当标题,原样照录,不加引号外的解释。 段子里有妙语、狠话、反问、当场噎人的一句,优先用它。
- 起主题——用现代读者一眼有感的角度命名这则故事,像杂志标题、像帖子标题。 可以用当代词汇和当代视角。
十字以内最好,别超过十五字。两种写法都不需要交代「谁」和「结果」——那是正文的事。
- 好(金句):「夫人何自苦如此」「汝妇人何知」「是况。」
- 好(主题):「独立女性在五代」「古代基层公务员的自我修养」「一场把自己坑进去的举报」
- 坏:「邓氏亲自来交税,周行逢下不来台」——把整件事讲完了,读者没有往下看的理由
- 坏:「高防量布幅,五个死囚翻案」——同上,标题替正文把活干了
- 坏:「万一他真死了呢」「一件小事」——空洞悬念、抽象概括,两头不沾
起主题时用词可以现代、可以夸张,但朝代、人物、事件性质必须对得上,不能为了顺口把五代写成唐朝。
“出处考证”一行必须让读者一眼看出哪句是辞典说的、哪句是你的判断;辞典未收该书时写“辞典解释——辞典未收此书”。“职官表”只在原文真出现官职/爵位/官阶时才出现,没有就整段不写、也不写占位说明;释义要结合段子朝代取义,不照搬别的朝代含义。
选材标准
篇幅:原文 200–1500 字。低于 200 字的一律放弃——不要再用「虽然短但有转折」给自己找台阶, 实测这类材料交出去就是平淡;超过 1500 字才截取完整情节的关键片段,并标明「节引」。
完整故事(最重要的一条):要的是一个故事,不是一条记事。四段都得有——
- 起因:谁、在什么处境下、想要什么或摊上了什么。
- 经过:至少两三个具体动作或回合,人物真的做了事(去了哪、动了手、设了局、试了几次)。
- 转折:局面翻过来。
- 结局:这事最后怎么收的,当事人怎么样了。
一问一答就完、一次进言就了、一条判例式记事(某人建议某事,上从之),哪怕理由再漂亮, 也只是「一个回合」,不算故事,直接换。判断标准很土:能不能分镜头? 讲出来要能拆成三四个场景,而不是一段话说完。
转折可以是——
- 骗局被拆穿(认错尸、假冒身份、伪造证据)
- 反将一军(对方的话被原样用回去)
- 身份揭晓(「是况。」)
- 算盘落空、弄巧成拙
- 制度或名实的荒诞错位
只有一句妙语、没有前因后果的,不要。人物只是被评价、没有实际动作的,不要。 只有转折而没有结局(后来怎么样了不交代)的,也不要。
其他优先项:
- 有人对着人:至少两个人利害相冲,一方赢一方输,且输的一方付出了看得见的代价(挨打、丢官、出丑、被赶走)。 只有一个聪明人对着一桩案子、一件公务的(明察秋毫断案、勤政爱民、廉洁自守),哪怕手法再巧也容易平,能不选就不选。
- 有明确的人物动作和对话,能直接改写成场景。
- 读者不需要额外解释也能看出趣味。
- 有具体细节(人名、数目、对话原话),排成卡片时才有东西可写。
避免:
- 只有惨烈处刑、灾异、战争死亡数字的材料。
- 需要大段背景才看懂的材料。
- 只在后世笔记中孤证且出处不清的材料;如果使用,必须如实说「仅据某书所载」。
- 把现代段子感强行套到史料上。
- 套路化的天命叙事:望气、相面、异梦、生时异象、童年指挥群儿、僧道预言某人当贵—— 这类「发迹前兆」自《史记》以下每部史书都有一堆,情节可以预测,读者早看腻了,不要。
- 借事说理的寓言体:主角无名无姓(「有山人」「楚人有……者」),结尾挂一段「故曰」「君子谓」把道理讲白的,说教味压过故事,不要。 真人真事、讲完就完、道理自己藏在情节里的才要。
质量自查
- 是否真实运行了随机发现脚本,且不是从固定段子池抽取?
- 是否查到了原文,而不是凭记忆复述?
- 出处是否包含书名 + 卷/篇/章节名?
- 输出顺序是否为 译文 → 出处 → 出处考证 → 职官表(原文无职官时整段省略) → 原文,且译文没写“译文:”标签?
- 是否查了出处那本书,并给出出处考证?辞典解释与我的评价是否分开、没有混为一谈?
- 译文是否只翻译原文,没有把分析塞进译文?
- 译文读起来像不像当代中文?是否还残留文言虚词、生僻单字词或半文半白的句式?
- 原文里的诗词韵文是否照录原文、没有被译成白话?
- 译文里的「姓+官名」代称(如「程光禄」)是否已还原成本名,或已用读者语言说明本名失载?
- 全文有没有「本轮」「这次」「脚本」「已按规则」之类的操作痕迹,或末尾交代自己做了什么的总结段?有就删掉。
- 年号是否已换算;无年号则跳过?
- 古地名是否已查今地;无古地名则跳过?
- 段子里的官职/爵位/官阶是否已查辞典、并结合朝代解释?辞典未收是否已明说?原文没有此类头衔时,是否整段没写职官表?
- 选段子时是否没有偏向带官职的材料(市井、僧道、商贾、妇人的段子同样合格)?
- 是否没有输出识典链接、没有输出左图右史地图链接?
- 原文是否在 1000 字以内,或已对更长材料作完整情节节引?
- 原文是否有起伏(至少一个转折),而不是只有一句妙语?
- 起因、经过、转折、结局四段是否齐全,能拆成三四个场景?只有一个回合(一问一答、一次进言、一条判例)就换掉。
- 原文是否满 200 字?不满就换,不要用「短而有转折」放行。
- 是不是借事说理的寓言(无名主角+结尾一段大道理)?是就换掉。
- 是不是望气相面、异梦异象那一路的发迹套路故事?是就换掉。
- 标题是不是金句摘录或抓人主题,而不是把整个段子总结了一遍?起主题时朝代和事实有没有写错?
- 有没有人物对人物的冲突和看得见的代价?只是「能吏办了件漂亮事」的,换掉。
- 是否确实有趣?