悬疑小说生成器
把「写一个悬疑故事」拆成可验收的工程管线:先锁死答案,再逆向埋线,最后才动笔写正文。
任何一步未通过自检,不得进入下一步;正文落笔时,答案页已封存,避免写到一半为圆谎而机械降神。
零、铁律(任何情况下不可违反)
- 先定结局再动笔——诡计、凶手、动机、真相揭露方式必须在写第一句正文前确定并写入
01-core-trick.md(该文件对读者保密)。 - 线索公平——读者在真相揭露前,必须已在正文里读到过所有关键线索(见
references/05-fair-play.md)。 - 反转必铺垫——每个反转至少 2 处前置伏笔,且伏笔在「误导解」与「真解」下都成立(双重解读原则)。
- 禁止机械降神——不得用巧合、突发自首、天降证据、作者上帝视角、新人物临门一脚收尾。
- 安全约束——不描写可被直接模仿的犯罪手法细节,不影射/诽谤真实在世人物(红线清单见
references/07-safety-and-compliance.md)。 - 法条标注辖区——凡引用法条,必须写明适用辖区(如「中国大陆 / 现行《刑法》」),并在文末「法律依据说明」登记。
一、参数采集(第一步,必做)
向用户收集下列 7 项;用户未给出时按默认值推断,并在 00-brief.md 中显式标注 [推断],不要反复追问。
| # | 参数 | 取值 | 默认 |
|---|---|---|---|
| 1 | 子类型 subgenre | 本格密室 / 连环作案 / 社会派 / 冷硬派 / 法庭 / 心理惊悚 / 叙诡 / 历史公案 | 社会派 |
| 2 | 篇幅 length | 短篇(3000–8000 字,1–3 章)/ 中篇(2–5 万字,8–20 章)/ 长篇(指定章节数) | 短篇 |
| 3 | 主要人物 cast | 数量、职业、关系、是否已有设定 | 由动机链推导 |
| 4 | 时代与地域 era_region | 年代 + 辖区(决定可用侦查手段与法条) | 当代中国内地城市 |
| 5 | 目标读者 audience | 大众通俗 / 硬核本格迷 / 影视改编向 | 大众通俗 |
| 6 | 暴力尺度 violence | L1 克制(不正面描写)/ L2 常规(有限度描写伤口与血迹)/ L3 强(法医式冷静细节,仍受 §五 红线约束) | L2 |
| 7 | 灵异元素 occult | 无 / 伪灵异(必有理性解释)/ 允许超自然 | 无 |
用 scripts/new_case.py 一次性生成项目脚手架:
python scripts/new_case.py --title "《书名》" --subgenre locked-room --length short \
--era "2019年" --region "中国大陆·江州市(虚构)" --audience general \
--violence L2 --occult none --out ./my-case
二、七阶段创作管线
阶段 1 · 定核(Lock Core)——产出 01-core-trick.md
先写「答案页」,再写故事。四个必填字段:
- 核心诡计:一句话说清「读者以为发生了什么 / 实际发生了什么」。从 references/02-trick-design.md 选骨架并做二次改造(禁止原样照抄经典诡计)。
- 结局:凶手是谁、如何被揭露、揭露后代价(谁被毁灭、谁活下来)。
- 动机链:欲望 → 阻碍 → 选择 → 代价,四段式,不得是「他就是疯了」。
- 手法类别:只写类别名(如「延时装置」「身份错位」「毒理误判」),不写可执行步骤。
自检:诡计是否与选定的时代地域技术条件匹配(1996 年不能有基站定位到米级)。
阶段 2 · 逆向人物(Reverse Cast)——产出 05-characters.md
从动机链倒推:谁需要什么、谁愿意付出什么、谁必须被怀疑。
每人一张人物卡(templates/character-card.md),含职业、专业词汇量、说话方式、秘密、不在场证明。
对白与行为必须符合职业身份——法医说「尸斑指压不褪色」,不会说「他肯定死了三小时」;刑警说「调话单」,不说法条序号。
阶段 3 · 双轨时间线(Timeline)——产出 02-timeline.md
- 犯罪轨:动机形成 → 准备 → 作案 → 善后 → 败露(精确到分钟)。
- 侦查轨:接报 → 保护现场 → 初勘 → 复勘 → 检验鉴定 → 排查 → 讯问 → 强制措施 → 侦查终结 → 移送起诉。
两轨交叉点即章节高潮。侦查流程与物证类型对照references/03-investigation-procedure.md。
阶段 4 · 线索与伏笔账本(Clue Ledger)——产出 03-clue-ledger.md
每条线索记录:编号 | 出现章 | 呈现方式 | 真指向 | 误导指向 | 回收章。
分布节奏(按总章数比例):前 20% 埋「异常感」,20–60% 埋「可推理的硬线索」+ 2–3 条红鲱鱼,60–85% 收紧并暴露矛盾,85–100% 揭露与回收。
规则见 references/05-fair-play.md。
阶段 5 · 章节地图(Chapter Map)——产出 04-chapter-map.md
每章写清:章号 | 功能(铺垫/推进/危机/揭露)| POV | 字数 | 本章投放线索 | 章末钩子。
篇幅默认:短篇每章 2000–3000 字;中篇每章 2500–3500 字。
阶段 6 · 正文写作(Draft)——产出 novel/第NN章.md
按章顺序写,每章结尾必须留悬念(新信息、新威胁、新疑问、视角切换四选一),并用统一标记:
<!-- HOOK: 一句话说明本章钩子与指向的线索编号 -->
正文风格与去 AI 味要求见 references/06-style-and-dialogue.md。
阶段 7 · 自检与交付(Audit & Deliver)
三个脚本,顺序固定:
python scripts/audit_case.py ./my-case # 结构:时间线/伏笔回收/法条登记/红线词/章末钩子
python scripts/check_text.py ./my-case # 字面:混字/混语/假名/破折号(长篇必跑)
python scripts/export.py ./my-case --check # 交付:docx + pdf(内置前置自检)
前两个有 FAIL 必须改完再交付。用户要文件时给 _export/ 下的 docx 与 pdf,见 §导出交付。
通过后按 §三 输出格式在对话里交付。
三、输出格式(固定顺序,不可打乱)
- 故事梗概——300–600 字,含「核心诡计一句话」与「结局一句话」。另写入
synopsis.md(给读者的版本,不剧透),导出时作为提要页。 - 人物关系图——Mermaid 图 + ASCII 备选(部分渲染器不支持 Mermaid)。对话交付可标凶手(标注为作者版);写进
synopsis.md的那份不得标凶手。 - 线索与伏笔分布表(建议给出;硬核读者必给)。
- 分章节正文——每章标题、字数、章末悬念。
- 法律依据说明——见
templates/90-legal-note.md,必须含三块:
- 适用辖区(如「中国大陆,现行《中华人民共和国刑法》(2023 修正)《刑事诉讼法》(2018 修正)」);
- 引用条文登记表(条号 / 所涉情节 / 用于哪一章);
- 虚构改编声明(哪些情节为艺术虚构、哪些程序做了压缩、条号以现行文本为准、本故事不构成法律意见)。
四、现实依据要求
- 作案逻辑、侦查流程、物证类型参照真实刑侦实践,细节查
references/03-investigation-procedure.md(含七何要素、现场勘查顺序、物证包装与链式保管、常见物证类型、法医推断口径)。 - 立案、取证、审讯、定罪、量刑须依真实法律条文,查
references/04-legal-basis.md(按辖区分组:中国大陆 / 中国香港 / 中国台湾 / 日本 / 英美法系)。 - 条号以现行文本为准:条文序号随修正案变动,落笔前核对;无法核实时改为描述性写法(如「依刑事诉讼法关于逮捕后侦查羁押期限的规定」)。
- 不得让司法人员实施明显违法的程序却无任何后果;若有,必须写出程序性后果(如非法证据排除)。
五、安全红线(写作时逐条对照)
禁止:具体毒物名称+剂量+获取途径;爆炸物/毒品配方与制作步骤;开锁、撬锁、翻墙、破坏监控的具体技法;网络入侵的具体指令与漏洞利用;枪械改装;破坏 DNA/指纹的反侦察操作;以真实在世人物(含化名明显指认)为负面原型;复刻真实未结案件的关键作案细节。
允许:手法类别名、物证种类名、侦查程序公开流程、结果层面的描写(「她在杯中下了东西」)。
降级写法:把「怎么做成」改成「做成了什么 + 留下什么物证」,把犯罪过程的注意力转移到物证与人心上。
完整清单与替换示例见 references/07-safety-and-compliance.md。
六、目录约定
my-case/
├── 00-brief.md 参数确认表(含 [推断] 标记)
├── 01-core-trick.md 答案页:诡计/结局/动机/手法类别(对读者保密)
├── 02-timeline.md 双轨时间线
├── 03-clue-ledger.md 线索与伏笔账本
├── 04-chapter-map.md 章节地图
├── 05-characters.md 人物卡
├── 06-style-profile.md 模仿模式专用:作者风格档案(见 §七)
├── samples/ 模仿模式专用:用户提供的原文样本
├── synopsis.md 内容提要(给读者的版本,不剧透;导出时作为提要页)
├── novel/第NN章.md 正文(主语言版本;模仿模式按国别语言写)
├── novel/zh/第NN章.md 双语模式专用:与 novel/ 平行对应的中文对照版(命名可同 ChNN.md)
├── 90-legal-note.md 法律依据说明
├── 91-audit-report.md 自检报告(脚本生成)
├── allow_words.txt 可选:本作专属专名白名单,给 check_text.py 用
└── _export/ 导出产物:<书名>.docx / <书名>.pdf / <书名>.md
(双语模式额外有 <书名>(中文).docx / <书名>(双语).pdf 等)
七、模仿作者模式(仅在用户明确要求时启用)
用户要求「模仿某位作者的风格」「用某人的笔法写」或粘贴示例原文要求按同风格创作时启用。未明确要求时不得主动模仿任何真实作者。
启用前确认:① 用户明确提出了模仿请求;② 对象不涉及争议人物与敏感立场;③ 已取得风格来源(原文样本或作者姓名)。任一条不满足则回到常规管线,并向用户说明原因。
7.0 输出语言(按作家国别,模仿模式专用)
模仿作者模式下,正文与专名用被模仿作家的母语语言写,而非一律中文;常规模式(不模仿任何作者)固定中文。规则与国别→语言对照见 references/08-author-imitation.md §九。
- 脚手架阶段即用
--author/--country/--lang让new_case.py确定语言代码(如--author 东野圭吾→ja、--author 尤·奈斯博→no),写入00-brief.md的「语言/输出语言」行。 - 语言代码驱动三处自动适配,无需手工改脚本:
check_text.py(日语不报假名/破折号、拉丁语系不报拉丁词)、style_profile.py(按目标语言标点与引号统计,中文专属指标转 N/A)、export.py(按语言选字体栈)。 - 双语模式(按国别生成主语言版本时同步出中文版):在模仿外国作家时给
new_case.py加--bilingual,它会额外建novel/zh/目录;export.py自动多产出「(中文)」版本、并可加--bilingual-mode interleaved出「(双语)」逐章对照版。novel/zh/放中文对照正文,check_text.py/style_profile.py会自动分别按主语言与zh两次扫描/量化。详见references/08-author-imitation.md§9.5。 - 语言只是载体,§五 安全红线、线索公平、法条辖区、§七 模仿约束(不冒充作者、不复制原作、结尾声明)全部照旧。
7.1 输入处理(优先级固定)
| 优先级 | 来源 | 处理 |
|---|---|---|
| 1 | 用户粘贴的原文样本 | 存为 samples/<名称>.txt,用 scripts/style_profile.py 量化统计,特征以实测为准 |
| 2 | 作者姓名(无样本时) | 基于该作者公开出版作品的通行语言风格提炼;不确定处标注 [推断] |
| 3 | 两者都缺失 | 明确提示用户补充:可给出候选作家名单(见 references/08-author-imitation.md)供其选择,不得自行假定 |
7.2 风格提炼(五维,产出 06-style-profile.md)
- 用词偏好:实词密度、书面/口语比、专业术语域、高频虚词与口头禅、色彩与感官词倾向
- 句式节奏:平均句长、句长标准差、逗号密度、单句成段频率、问句与短句的使用时机
- 语气与情感倾向:冷峻/抒情/讥诮/克制、叙述距离(第一人称介入程度)、情绪外露程度
- 常见修辞:比喻的取材域(器物/人体/自然)、通感、反讽、反复与排比的用法
- 段落组织方式:段落长度分布、对话与叙述的比例、场景切换的标志、章末收束习惯
先跑量化脚本再落笔,避免凭印象提炼:
python scripts/style_profile.py --sample samples/xxx.txt --out 06-style-profile.md
7.3 输出格式(固定,不可打乱)
- 风格特征摘要(不超过 5 条)——每条一句话,含可验证指标(如「平均句长 18 字,逗号密度 6.2/百字,单句成段用于落锤」)。
- 模仿生成的内容——按 §三 的既有格式输出(梗概 → 人物关系图 → 分章正文 → 法律依据说明),原有输出格式与铁律全部照旧。
- 结尾声明(必须有):
> 本内容为风格模仿练习,非该作者真实作品,不代表其本人观点,亦非其未公开发表之作。
7.4 约束(硬性)
- 仅在用户明确要求时启用,不主动模仿真实作者。
- 不冒充作者身份:不使用「我(作者名)」自称,不伪造序言、访谈、题记。
- 不编造未公开作品:不得声称这是该作者的某一部「未发表/佚失/新作」。
- 不涉及争议人物与敏感立场:对象涉及敏感政治、现实争议人物时拒绝执行并说明原因。
- 不复述原作:不得使用该作者作品中的人物姓名、专有名词、具体情节;模仿对象是语言风格而非文本本身。
- 红线照旧:§五 安全红线、线索公平、法条辖区等铁律在模仿模式下同样生效。
7.5 自检
audit_case.py 在检测到 06-style-profile.md 时会自动追加两项检查:结尾是否含风格模仿声明、正文与 samples/ 原文是否存在连续 15 字以上的雷同片段(抄袭护栏)。
附:参考文件索引
| 文件 | 用途 |
|---|---|
references/01-subgenres.md |
八种子类型模板、篇幅与节奏参数、读者预期 |
references/02-trick-design.md |
诡计骨架库、结局先行法、反转铺垫与双重解读 |
references/03-investigation-procedure.md |
真实侦查流程、物证类型、法医口径、讯问与程序 |
references/04-legal-basis.md |
分辖区法条速查(立案/取证/审讯/定罪/量刑) |
references/05-fair-play.md |
线索公平性准则与伏笔分布 |
references/06-style-and-dialogue.md |
文风、职业对白、去 AI 味、章末悬念技法 |
references/07-safety-and-compliance.md |
安全红线、降级写法、虚构声明 |
references/08-author-imitation.md |
模仿作者模式:风格提炼五维、作家候选名单、约束与自检 |
templates/06-style-profile.md |
模仿模式专用:作者风格档案模板 |
templates/07-synopsis.md |
内容提要模板(导出的提要页取它,不剧透) |
examples/sample-locked-room-short.md |
完整样例:从答案页到成稿 |
scripts/check_text.py |
文本净度检查:混字 / 混语 / 假名 / 破折号(语言感知:读 00-brief.md 语言代码;非中文时不报假名与破折号、拉丁语系不报拉丁词,见 references/08-author-imitation.md §九) |
scripts/export.py |
导出 Word / PDF / 合并 Markdown(见 §导出交付) |
文本净度检查(长篇连写必做)
连续生成长篇中文正文时,会随机混入外文碎片与半截拉丁词,以及本环境禁用的破折号。
这类问题不会被 audit_case.py 的任何一项抓到,只能靠扫描:
非中文输出(模仿模式按国别生成的语言版本)时,本脚本按 00-brief.md 的「语言/输出语言」代码自动放宽:日语(ja)不把假名当错误、不报破折号;拉丁语系(en/fr/de/sv/no…)不报拉丁词、不报破折号,只报 stray 的汉字/假名/西里尔等异文。详见 references/08-author-imitation.md §九。
python scripts/check_text.py ./my-case # 每次落稿一批就跑一次
audit_case.py 管结构(线索 / 钩子 / 法条 / 红线),check_text.py 管字面(混字 / 混语 / 日文假名 / 破折号),
两者互不覆盖,建议连跑。白名单里的 HOOK 标记、脚本名、参数键会被自动跳过。
关于日文假名(血泪教训):写日本背景的长篇时,正文会随机冒出「佐原さん」「手続き」「このような」这类碎片。
它们既不是拉丁词(报告里没有),也不是西里尔/谚文那几类外来文字,早期版本完全扫不到,肉眼又极易读漏。
现已加入检测;有意夹杂日语时用 --allow-kana 关闭。中途加检测还会把已完稿的旧章节里的残留一起扫出来,记得回溯清理。
默认只扫 novel/ 正文;设定档里的英文专名(ANPR、HOLMES、人物拉丁名)属正常用词,
只有加 --all 才纳入,且纳入时也只报混语与破折号。本作专属专名可写进 allow_words.txt 免报。
导出交付(Word / PDF)
用户说「导出」「给我 Word」「要 PDF」「能打印的稿子」时用:
python scripts/export.py ./my-case # 出 docx + pdf + 合并 md
python scripts/export.py ./my-case --check # 导出前先自检(推荐)
python scripts/export.py ./my-case --include-notes # 附创作附录(含剧透,默认不给)
python scripts/export.py ./my-case --format docx --open
# 双语模式:novel/zh/ 存在时自动出「(中文)」版;interleaved 再出「(双语)」逐章对照版
python scripts/export.py ./my-case --bilingual
python scripts/export.py ./my-case --bilingual --bilingual-mode both --check
产物落在 <case>/_export/:<书名>.docx、<书名>.pdf、<书名>.md。
读者版组装顺序(固定):封面 → 内容提要 → 人物关系图 + 人物一览 → 正文(每章起新页)→ 法律依据说明 → 风格模仿声明(仅模仿模式)。
取数规则
- 书名:
--title>synopsis.md一级标题 >00-brief.md一级标题 > 目录名。 - 内容提要:
synopsis.md(模板templates/07-synopsis.md);缺失时退回00-brief.md中含「梗概」的小节;都没有则跳过并在输出里提示。 - 人物关系图:取
synopsis.md/05-characters.md里的 mermaid 或 ASCII 代码块,按等宽文本排版。 - 人物一览:优先用
05-characters.md里现成的「人物一览」表;否则按##小节 + 「年龄/身份」字段生成。「警方与司法」这类小节里的表格另立附表。 - 正文:
novel/第*.md;<!-- HOOK: -->标记导出时剥离(那是给创作者看的,读者版不该出现)。 - 法律依据说明:
90-legal-note.md,默认带上(§三 要求文末必附)。
默认不含 01-core-trick.md / 02-timeline.md / 03-clue-ledger.md / 04-chapter-map.md(全是剧透),要一起导加 --include-notes。
剧透边界:§三 的对话交付是给用户看的,可以标凶手;导出的 pdf/docx 是给读者看的,所以 synopsis.md 里不得标注凶手、不得揭谜底(脚本只做拼装,不再脱敏)。
排版要点(脚本已内置,改动前先读)
- docx:A4,正文宋体 12pt、行距 1.6、首行缩进 2 字,标题黑体,页脚居中页码,封面标题单独样式。
- pdf:自写 Markdown→HTML + 本机 Edge/Chrome 无头渲染。分页只由显式的分页标记控制,不要在 CSS 里再加
page-break-before,否则会出现空白页。 - 依赖与排障:docx 需要 python-docx(本机走
~/.workbuddy/binaries/python/envs/default/Scripts/python.exe,已装);pdf 不需要 LaTeX / pandoc / LibreOffice,找不到浏览器时只出 docx 并明确说明。
续写与改写模式
-
模仿作者风格:见 §七,须在
06-style-profile.md落档,并在结尾附风格模仿声明。 -
续写:先读
01-core-trick.md与03-clue-ledger.md,确认待回收线索,再补写章节;不得引入与已封存答案冲突的新事实。 - 改写:先定位问题类型(诡计泄底过早 / 线索不公平 / 动机弱 / 节奏塌 / 尺度越线),再对照对应 reference 修订,改写后重跑
audit_case.py。