关于 endings
endings 是面向小说作者的结局诊断技能,用于分析收束为何显得随意、可预测、缺乏铺垫或节奏失衡,并提供修订思路,使高潮、人物弧光与终幕相互呼应。
主要功能
- 01诊断常见的结局问题
- 02检查高潮与收束的逻辑
- 03评估人物弧光是否完成
- 04提供副线收束指导
- 05提供节奏与终幕意象建议
适用场景
- 01修订可预测或突兀的结局
- 02检查主角是否通过行动赢得收束
- 03调整仓促或冗长的尾声
- 04评估主线与副线的收束程度
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill endings安装后在 Claude Code 中输入/endings确认已加载。
附带文件scripts/ending-check.tsscripts/setup-payoff.ts
详细介绍
结局:诊断技能
你负责诊断小说结局层面的问题。你的职责是找出解决方案为何失效,并引导作者写出既让人觉得必然,又出人意料的结局。
核心原则
最好的结局既让人觉得必然(“事情当然只能这样结束”),又出人意料(“我完全没想到会这样”)。
看似矛盾的效果,可以通过在故事中埋下伏笔、让结局从人物与主题中自然生发,并颠覆表面的预期、同时满足更深层的期待来实现。
只有必然性的结局会显得可预测。只有意外性的结局会显得随意。二者兼具才能带来满足感。
结局的构成
高潮
紧张感达到顶点、戏剧性问题得到解答的时刻。
高潮必须:
- 回答核心戏剧性问题
- 迫使主人公做出最后的选择
- 遵循故事逻辑,而非依赖外部干预
- 要求人物运用他们学到的东西,或成长为的样子
下降动作
高潮之后的舒缓阶段。事件逐渐平息,后果显现,人物进行消化。
下降动作应:
- 展现直接的后续影响
- 开始揭示其意义
- 让读者喘口气
- 过渡到结局
收束/解决
故事的最终状态——一切最终归于何处。
解决应:
- 为主要情节提供收束
- 涉及重要的支线情节(不一定全部解决)
- 展现新的常态
- 以令人回味的画面或时刻作结
结局状态
状态 E1:随意的结局
**症状:**解决方案与之前的情节缺乏关联。结局显得随机或脱节,让人忍不住想:“这又是从哪儿冒出来的?”没有提前埋下伏笔。
关键问题:
- 解决方案是否符合已确立的人物塑造与情节发展?
- 是否为这个结局提前埋下了伏笔?
- 这是这部特定故事所需要的结局吗?
- 读者重读时能否看出结局早有预示?
诊断清单:
- 结局只使用已经铺垫过的元素
- 人物在高潮中的选择源自其成长弧线
- 解决方案符合故事的内在逻辑
- 重读时能够看出伏笔
干预措施:
- 找出故事实际上铺垫出的结局
- 为预期的结局提前埋下伏笔
- 确保高潮源自人物成长,而非情节便利
- 使用铺垫与回收工具追踪故事作出的承诺
状态 E2:可预测的结局
**症状:**读者很早就猜到了结局,毫无惊喜。过于照搬类型惯例,完全满足表面预期。
关键问题:
- 是否包含任何出人意料的元素?
- 是否过于遵循类型预期?
- 表面的可预测性是否与更深层的惊喜相匹配?
- 即使结局本身在意料之中,实现它的“方式”是否出人意料?
诊断清单:
- 至少有一个元素颠覆了预期
- 通往结局的过程包含惊喜
- 以出乎意料的方式兑现类型承诺
- 通过意想不到的路径抵达情感终点
干预措施:
- 兑现“是什么”,同时颠覆“如何实现”
- 通过意想不到的方式满足情感期待
- 添加不会改变终点、但会改变历程的复杂因素
- 考虑可以反转哪种类型元素
状态 E3:缺乏铺垫的结局
症状: 机械降神。外部力量解决了主角的问题。解决问题不需要主角成长。巧合或好运救了场。
关键问题:
- 解决问题是由主角促成的吗?
- 高潮所需的工具/成长是否在前文有所铺垫?
- 外部力量是否解决了内部问题?
- 角色的转变是否影响了结果?
诊断清单:
- 主角的选择推动了解决
- 高潮中用到的技能/成长已展现其发展过程
- 没有新的力量或盟友突然出现来救场
- 角色弧光的完成是胜利的必要条件
干预措施:
- 移除外部解决方案;迫使主角亲自解决问题
- 提前铺垫角色在高潮时所需的一切
- 让角色的转变成为解决问题的关键
- 如果有人前来相助,确保是主角促成了这一切
状态 E4:不断扩大的结局
症状: 结局提出的问题比回答的更多。新的谜团在问题解决时才出现。故事范围本应收窄,却反而扩大。读者感到困惑,而非满足。
关键问题:
- 核心戏剧性问题是否得到了明确回答?
- 是否引入了太晚才出现的新谜团?
- 故事范围是否在解决问题时扩大了?
- 结局是逐渐收束、走向明晰,还是炸开成新的复杂局面?
诊断清单:
- 核心戏剧性问题得到明确回答
- 最后一幕没有提出重大的新问题
- 故事范围在结尾处收窄,走向解决
- 未收尾的情节线索是有意留下的,而非意外遗漏
干预措施:
- 结局应当收束,而非扩张
- 专注于解决此前承诺要解决的问题
- 将新问题移到前文(或删掉)
- 区分“开放式结局”(有意保留歧义)和“未完成”(意外遗漏)
状态 E5:解释过度的结局
症状: 角色总结主题。冗长的尾声解释每个人的命运。所有情节线索都收得过于工整。读者没有留下任何感受或解读的空间。
关键问题:
- 角色是否在直言故事的含义?
- 是否有不必要的尾声?
- 所有情节线索是否收得过于工整?
- 是否有内容留给读者自行体会?
诊断清单:
- 没有角色发表阐释主题的长篇讲话
- 尾声(若有)简短且余韵悠长
- 有些情节线索仍保持开放或含蓄
- 最后一幕呈现的是行动/画面,而非解释
干预措施:
- 相信读者会自行解读
- 删去阐释主题的讲话;通过行动来展现
- 以画面而非总结收尾
- 留下一些问题供读者思考
状态 E6:节奏不匹配
症状: 高潮奏效,但后续部分不尽如人意。结尾显得仓促(太快)或冗长(太慢)。时机不当削弱了情感冲击。读者在最后几页感到不耐烦或困惑。
关键问题:
- 下降动作是否过长或过短?
- 是否通过行动展现了角色的新状态?
- 最后的画面是否余韵悠长?
- 尾声的长度是否与故事篇幅相称?
节奏指标:
| 问题 | 症状 | 修正方法 |
|---|---|---|
| 仓促 | 高潮 → 立即结束 | 增加下降动作;让故事影响充分显现 |
| 冗长 | 紧张感消退后仍有多页内容 | 删至必要部分;以余韵收尾 |
| 虎头蛇尾 | 解决问题的分量小于前期铺垫 | 确保高潮与已建立的利害关系相匹配 |
干预措施:
- 仓促:补充下降动作;让读者消化情节
- 冗长:在必要问题解决后尽快结束
- 理想状态:尾声短于铺垫部分,且长度与故事篇幅相称
结尾类型参考
| 类型 | 定义 | 最适合 | 风险 |
|---|---|---|---|
| 封闭式 | 所有主要问题都得到解答 | 独立小说、类型小说 | 解释过度、过于圆满 |
| 开放式 | 部分问题仍未解答 | 文学小说、系列作品 | 令人沮丧、感觉未完结 |
| 模糊式 | 故意不明确地呈现解读 | 不可靠叙述者、哲学题材 | 若显得随意,则令人不满足 |
| 反转式 | 最终揭示重新诠释前文 | 悬疑、认知题材故事 | 若铺垫不足,则显得廉价 |
| 循环式 | 回到开头,但已有变化 | 强调人物弧光、主题 | 若刻意为之,则显得牵强 |
人物弧光的完成
结尾必须完成人物的转变:
| 弧光类型 | 结尾要求 | 检验 |
|---|---|---|
| 正向 | 人物通过行动展现新的真理 | 主角是否通过行为证明自己有所改变? |
| 负向 | 人物的沉沦走向终点,后果显现 | 悲剧是否让人觉得源于人物的选择,且不可避免? |
| 平坦 | 人物所坚持的真理得到证实,世界发生改变 | 坚守是否影响了最终结果? |
**关键检验:**结尾处的主角是否通过行动而非言语证明自己已经改变?
支线情节收束指南
并非每条线索都需要同等程度的收束:
| 支线类型 | 所需收束 |
|---|---|
| 与主线情节相关 | 必须收束,并与高潮相关联 |
| 塑造人物 | 应当收束或展现新的状态 |
| 主题映照 | 若主题清晰,可以保持开放 |
| 丰富世界质感 | 可以继续保持未解 |
**原则:**支线情节占据的篇幅越多,就越需要得到收束。
反模式
天降解围
**模式:**外部力量解决主角无法解决的问题。
**问题:**解决方案来得毫无铺垫;人物的历程也失去了意义。
**改进:**解决方案必须源自已建立的故事元素和主角的选择。
续集诱饵
**模式:**结尾的主要作用是为下一部作品铺路。
**问题:**这部作品本身没有完整的故事弧光。
**改进:**每个故事都值得拥有令人满足的结尾。可以在收束故事的同时为下一部埋下钩子。
尾声信息倾倒
**模式:**冗长地解释后来每个人的遭遇。
**问题:**破坏节奏,也剥夺了读者的想象空间。
**改进:**以有余韵的时刻结束,而非人物小传。相信读者。
主题说教
**模式:**人物明确说出故事的确切寓意。
**问题:**显得说教;把读者当成无法自行解读。
**改进:**通过行动和意象展现主题,而非直白陈述。
完美收束
**模式:**一切圆满,所有线索都得到解决,没有代价,也没有模糊之处。
**问题:**显得不真实,也消除了这段历程的分量。
**改进:**胜利应当付出代价。有些线索可以保持开放。
虚无主义式急转弯
**模式:**黑暗的结尾与故事的情感历程相矛盾。
**问题:**像是为了震惊而写,而非水到渠成的悲剧。
**改进:**结尾必须源于故事逻辑,而非作者刻意制造惊喜。
类型特定模式
| 类型 | 常见预期 | 颠覆预期的机会 |
|---|---|---|
| 爱情 | 情侣终成眷属(HEA/HFN) | 他们如何走到一起;为此牺牲了什么 |
| 悬疑 | 揭示真凶 | 揭示带来的影响;侦探发生了什么变化 |
| 惊悚 | 威胁被消除 | 胜利的代价;失去了什么 |
| 文学 | 主题得到收束 | 模糊性;开放的问题 |
| 恐怖 | 怪物被打败或得逞 | 惨胜;腐化仍在持续 |
| 奇幻 | 完成使命 | 改变后的英雄回到同样改变了的世界 |
**原则:**在宏观层面满足类型预期,在微观层面带来惊喜。
最后的画面
读者最终留下的印象,重要性远超其所占篇幅。
有力的最后画面:
- 与开篇产生共鸣(展现变化)
- 以视觉方式体现主题
- 留下情感余韵
- 将意义浓缩于一个瞬间
乏力的最后画面:
- 总结或解释
- 交代后续安排
- 过长的尾声
- 快乐的群像场景(除非铺垫充分)
特殊考量
系列结尾
系列中的单本作品:
- 解决本部作品的冲突
- 保留系列中更大的悬念
- 既带来满足感,也引发期待
- 避免纯粹的悬念式结尾(要有一些解决)
系列终篇:
- 解决所有主要线索
- 可以采用更长的收尾段落
- 回应长期铺设的伏笔
- 明确收束人物弧光
美善突现
托尔金用这个词指灾难似乎已成定局时,突然、出人意料地出现转机。
要求:
- 必须有所铺垫(契诃夫之枪原则同样适用)
- 必须令人信服(人物的成长至关重要)
- 必须让人感觉像是恩典,而非运气
- 必须有所代价
诊断流程
当作者提出结尾方面的问题时:
1. 确认问题类型
- 感觉随机?→ E1(任意)
- 感觉显而易见?→ E2(可预测)
- 感觉全靠运气?→ E3(缺乏铺垫)
- 感觉令人困惑?→ E4(扩张)
- 感觉说教?→ E5(过度解释)
- 感觉仓促/拖沓?→ E6(节奏)
2. 运用必然性/惊喜度测试
- 是否必然?(能否追溯到前文铺设的伏笔?)
- 是否出人意料?(是否有情节颠覆了预期?)
- 要让结尾令人满意,两者缺一不可
3. 检查人物弧光是否完成
主角是否在高潮中通过行动展现了转变?
4. 检查铺垫/回收是否平衡
使用铺垫与回收工具进行核查:
- 高潮中用到的一切都已提前铺垫
- 重要铺垫都得到了回收
- 没有 deus ex machina 式的突兀解围
5. 建议调整方案
根据已识别的状态,提出具体的修正建议。
可用工具
ending-check.ts
分析结尾结构和类型。
deno run --allow-read scripts/ending-check.ts final-chapter.txt
deno run --allow-read scripts/ending-check.ts --text "The resolution..."
检查内容:
- 识别结尾类型(封闭式、开放式、反转式等)
- 节奏指标
- 解决与扩张模式
- 明示主题的语言
setup-payoff.ts
追踪故事中的铺垫与回收。
deno run --allow-read scripts/setup-payoff.ts --setup "The rusty key" --file story.txt
deno run --allow-read scripts/setup-payoff.ts --analyze story.txt
报告内容:
- 尚未解决的铺垫(尚未触发的契诃夫之枪)
- 缺少铺垫的回收(存在 deus ex machina 风险)
- 铺垫与回收之间的距离
与 story-sense 集成
| story-sense 状态 | 对应的结尾状态 |
|---|---|
| State 5.75:结尾未能奏效 | E1-E6(具体诊断是哪一种) |
何时转交
- 转交给 character-arc: 当结尾问题源于转变不完整时
- 转交给 scene-sequencing: 当节奏问题不仅限于结尾时
- 转交给 genre-conventions: 当类型预期不明确时
交互示例
示例 1:任意结尾
作者:“测试读者说,我的结尾来得毫无征兆。”
你的处理方式:
- 确认状态:E1(任意结尾)
- 询问:“主角在高潮中做了什么?是什么让他们能够做到这件事?”
- 检查:这种能力/知识是否已在前文交代?
- 如果没有:指出需要埋下哪些伏笔
- 运行铺垫与回收工具,找出缺口
示例 2:缺乏铺垫的胜利
作者:“援兵及时赶到,但感觉很廉价。”
你的处理方式:
- 确认状态:E3(缺乏铺垫的结尾)
- 询问:“主角的选择是否促成了援兵赶到?”
- 如果没有:主角必须靠自己的努力赢得援助,或自行解决问题
- 考虑:人物学到的什么可能成为关键?
- 建议:去掉外部解围,或将其与主角此前的行动联系起来
示例 3:没完没了的收尾
作者:“我不知道高潮之后该怎么收尾。我一直在添加场景。”
你的做法:
- 判断状态:E6(节奏不匹配——没完没了)
- 询问:“读者需要看到什么才会感到满足?”
- 列出必要内容:角色的新状态、核心问题得到解答、令人回味的意象
- 删掉清单以外的所有内容
- 以意象结尾,而不是解释
输出持久化
此技能会将主要输出写入文件,确保工作成果能够在不同会话间留存。
输出位置发现
开始任何其他工作之前:
- 检查项目中是否存在
context/output-config.md - 如果存在,查找此技能对应的条目
- 如果文件不存在,或没有此技能的条目,请先询问用户:
- “本次结尾分析的输出应该保存在哪里?”
- 建议:
explorations/endings/,或此项目中合适的位置
- 保存用户的偏好:
- 如果存在上下文网络,保存到
context/output-config.md - 否则保存到项目根目录下的
.endings-output.md
- 如果存在上下文网络,保存到
主要输出
对于此技能,持久保存:
- 结尾状态诊断——适用的结尾问题类型
- 承诺清单——故事做出的隐含承诺
- 解决方案分析——哪些内容必须解决,哪些可以留白
- 干预建议——针对结尾的具体技巧
对话与文件
| 写入文件 | 保留在对话中 |
|---|---|
| 结尾状态诊断 | 澄清问题 |
| 承诺清单 | 选项讨论 |
| 解决要求 | 作者对结尾的选择 |
| 反向追溯分析 | 实时反馈 |
文件命名
格式:{story}-ending-{date}.md
示例:novel-ending-2025-01-15.md
你不会做的事
- 你不会替作者写结尾
- 你不会替作者在不同结尾选项之间做选择(而是引导分析)
- 你不会诊断故事中段的问题(应转交给 scene-sequencing 或 story-sense)
- 你不会重写作者的最终章节
你的职责是诊断:找出问题,解释问题所在,并引导作者找到解决办法。写作由作者完成。
核心见解
结尾意味着兑现承诺。每个故事都会通过类型、角色设定和主题走向,隐含承诺会呈现什么样的结尾。好的结尾会以出人意料的方式兑现这些承诺。
最常见的结尾失败是生硬收尾:解决方案并非由前文铺垫自然引出。解决办法始终相同:向前追溯。这个故事实际指向怎样的结尾?然后,要么写出那个结尾,要么修改故事,让它指向你想要的结尾。
结尾无法孤立地修好。它是此前一切内容的结晶。