3.1 结局分布的熵
结局熵有四个数,混在一起就错。本节把上界 2321 毫比特、单路径 0 毫比特、路径采样 1714 毫比特、状态枚举 1888 毫比特分开报,并讲清「上界不是实测值」——一条路径只到一个结局,它的熵恒为 0。全部整数、毫比特取整,seed=20261016 可复现。
tag
结局熵有四个数,混在一起就错。本节把上界 2321 毫比特、单路径 0 毫比特、路径采样 1714 毫比特、状态枚举 1888 毫比特分开报,并讲清「上界不是实测值」——一条路径只到一个结局,它的熵恒为 0。全部整数、毫比特取整,seed=20261016 可复现。
覆盖率给一个总数,缺口给一张名单。本节对随机采样 N=100 条路径逐边计数,定位那条从未被走过的边——门条件为 bell_rung 的真相结局入口,源节点访问了 100 次却没选中它;再用采样规模与种子的参数扰动给出软告警口径,低于 850‰ 只记 WARN、恒 exit 0。
分支覆盖率是一个整数千分比:走过的对话边 × 1000 整除全部对话边。本节先声明两层分母口径(去重边 56 与选项 115),再把单条确定性路径、采样 N 条、BFS 穷举三个来源放进同一张表,量出边、节点、场景三层覆盖,并给出 446‰ 与 1000‰ 的口径来源。
一张 48 节点、115 个选项的故事图,一条确定性路径只走 25 条边(446‰),远低于 850‰ 的目标。本节把随机、贪心、穷举三种采样策略放进同一路径预算对照,量出各自覆盖多少条对话边、到达几个结局,并解释为什么穷举是覆盖率的基准而不是一种采样。
解集有多大是一回事,稳不稳是另一回事。本节用两条轴量反推的稳健性:把目标曲线的 b10 从 5 挪到 4,在可枚举的预算上精确求新旧解集的交集与 Jaccard 千分;再把 MAE 阈值从 0 毫扫到 2000 毫看解集规模的相变。结论是解集近稳但规模巨大,曲线达标推不出唯一标注。
给定一条目标张力曲线,反过来能求出哪些节拍标注?本节把「MAE 不超阈值」化成 sum 绝对值不超过 16 的整数约束,用逐位 DP 精确计数:达标解集有 6072047140 个,占全空间 5 的 16 次方的 39.8 千分。随机搜索 200000 次的经验命中率与精确比例吻合,而收紧到 62 毫时随机搜索一次都命不中。
曲线偏离目标时,怎么把它落到具体的节拍下标与场景?本节用残差向量做定位,造三个漂移场景:在路径上的单点、两个异常点,以及离路径的隐藏点。实测发现路径口径看不见没经过的节拍——b10 从 5 降到 4 时路径 MAE 仍为 0 毫,全曲线 MAE 才抬到 62 毫。可观测性决定了可识别性。
《叙事策划与叙事工艺》卷三《叙事体验与路径度量》目录:16 章 48 节,把玩家路径变成可度量的对象——路径的表示与采样、分支覆盖率与缺口、结局分布熵、张力曲线与 MAE、后果可见性、节奏密度、好感度曲线形状、一致性残差,以及反推与演化回归。本页给出分工说明、六档可运行性口径与全书 16 章 48 节完整清单。
《叙事策划与叙事工艺》卷三《叙事体验与路径度量》全 50 篇,也是三卷本的收官卷。卷一回答「一个故事能不能先被写成一份规格」,卷二回答「这份规格能不能被一台机器确定性地执行」,卷三回答「执行出来的那些路径能不能被度量,而且度量得诚实」。全书围绕虚构的三夜悬疑叙事《雾港夜航》与工具链 inkwell 展开,只读卷二交付的真源与内核、不新造字段:config/story_spec.json 的 beats(16 个节拍与整数张力)与 metrics(目标张力曲线、覆盖率目标 850‰、结局熵下限 1500 毫比特、两个 MAE 阈值)是本卷两个新的度量输入。第一部分(第 1–4 章)做路径、覆盖与平衡:一次通关的轨迹怎么编码成可回放的路径、随机/贪心/穷举三种采样策略、分支覆盖率的千分比口径与缺口定位、结局分布熵与分支偏斜、结局可达性的回归、后果可见性与假选择检测、选择密度与节奏;第二部分(第 5–9 章)做曲线、张力与一致性:张力从哪里来(叙事节拍而非机制动力学)、张力与释放的节拍计算、情感曲线的构造与目标曲线 MAE、代理指标的口径声明、叙事节奏与密度、节奏冲突检测、好感度随路径的变化与阈值触达分布、关系曲线形状分类、一致性残差与设定-行为对齐回归、失调告警阈值;第三部分(第 10–12 章)做可视化、模拟与测试:纯 xml.etree 出张力曲线、分支图与路径热力图、模拟玩家的路径策略与它对分布的影响、W 层 Playwright 路径批跑与断言、从测试到决策;第四部分(第 13–16 章)做反推、演化与收官:曲线异常点定位、参数到曲线的反推与其稳健性、规格演化的影响面与指标回归、叙事质量代理指标总表与「指标不能声称什么」,最后把三卷装配成一份规格三种消费的完整链路。按章节提供仿真、逻辑内核与原型;当前试点阶段已有复核记录,完整项目的配置、共享模块和交付验收仍在补齐。全书数字均来自本机实跑:单条确定性路径覆盖对话边 446‰、覆盖场景 9/14、覆盖节拍 11/16、只到达 1/5 结局,而 BFS 口径下 115 条对话边全部可达(1000‰),可达状态 9895423 个;全部指标均为 proxy,只做相对比较。
四条必须恒为 0 的残差:钳位(可达状态与转移后都在 [0,100] 内)、初值(每个声明角色的 init 落在自身 range 内)、累积口径(新值恒等于 clamp(旧值 + add),set 不写好感度)、门限可达性(15 条门限均可跨过)。四条残差合计 0;lin 与 hai 有 affinity 声明却不在 state.vars,按「声明未用=报告,用了未声明=FAIL」报告。
好感度的分段在规格里就是一串 [aff, 名, >=, 整数] 阈值门,长在选项 when、节点 line_when、结局 when 三处。本节把 15 条门限全抽出来,再逐条扰动 ±5,在同一采样口径下重算覆盖率与可达结局集合,找出 4 条临界门限;并如实说明为什么放宽 5 点不起作用而收紧 5 点才起作用——基线覆盖率已饱和在 1000‰。B 层只打印 WARN,退出码 0。
好感度是一台受钳位约束的整数状态机:状态 = 节点 + 4 个好感度整数 + 18 个 flag + 9 个物品。本节把《雾港夜航》的完整状态空间 BFS 一遍,实测四个变量的可达值域分别是 yan 21、hui 35、shen 12、mu 16,值域之积 141120,而真正可达的好感度四元组只有 87190——四个变量之间并不独立。P 层用同一批选项断言初值来源、add 累加与钳位。
宽度就是一个节点的出度:同时摆在玩家面前的选项数。本节给 48 个对话节点量出度,实测直方图是 5 个 0 出度、16 个 2 出度、26 个 3 出度、1 个 5 出度,最宽的一步是 d_dq_2 的 5 个选项;再按边距离分 23 层看每层宽度,并把 115 个选项去重成 56 条唯一跳转、47 个不同目标。
把「不可达」拆成两种口径:节点不可达(BFS 从未落到它)与选项不可达(它的 when 在任何可达状态下都不成立)。实测两者都是 0,5 个结局全部可达、孤儿结局 0、分支覆盖率 1000‰。另报告规格层面的一处欠声明:节点 d_lt_2 声明了 line_when 却没有 line_else。
逐层 BFS 把 9895423 个可达状态一层层展开:给出每一层的新增与累计、峰值 frontier,以及 4 个好感度变量的实际值域。去重键是状态的规范串,层号就是最短步数。本节贴出 32 层完整输出,并给出预算 12000000 与峰值内存 3132.8 MB 的口径。
一个状态等于节点乘以 4 个好感度、18 个 flag、9 个物品。本节先算出朴素上界 48 × 101 的四次方 × 2 的 18 次方 × 2 的 9 次方约 6.70×10 的 17 次方,再用 BFS 完整枚举跑出真实可达的 9895423 个状态,并把两者相差约 11 个数量级的来源拆成好感度值域、flag 与物品位图、变量相关性三层。
卷二交付给卷三《叙事体验与路径度量》的五类接口:规格段、内核函数、仿真产物、原型产物、判据与容差。本节用自检脚本逐项核对磁盘上的段、函数、产物与阈值,再用 W 层脚本在浏览器里复算 16.2 的锚点摘要,并声明边界——本卷只交结构量,体验度量归卷三。
《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》目录:16 章 48 节,把 story_spec.json 变成可执行的对话状态机——条件求值、效果应用、确定性回放、状态空间穷举、可玩原型与跨语言摘要。本页给出分工说明、六档可运行性口径与全书 16 章 48 节完整清单。
《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》全 50 篇。卷一回答「一个故事能不能先被写成一份规格」,卷二回答「这份规格能不能被一台机器可复现地、可断言地、可跨语言地执行」。全书围绕虚构的三夜悬疑叙事《雾港夜航》与工具链 inkwell 展开,唯一真源仍是 config/story_spec.json 的十段字段:meta(三幕)、world(4 派系 stance 矩阵、14 个地点的解锁条件、6 条 lore 的揭示旗标)、characters(6 个角色的目标/恐惧/秘密/好感度/弧光)、beats(16 个节拍与整数张力)、scene_graph(14 个节点与 16 条边,其中 5 条带条件)、dialogue(48 个对话节点、115 个选项、5 个结局)、conditions(嵌套数组文法,6 种形式)、state(18 个 flag、4 个好感度、9 个物品)、endings 与 metrics。第一部分(第 1–4 章)搭引擎内核:状态/事件/转移的三元组、规格驱动的对话状态机、引擎与规格的同源、条件求值器与短路、可满足性判定、效果应用、确定性与 set 类幂等、状态快照与差量、确定性回放与逐位一致;第二部分(第 5–8 章)算分支状态空间:990 万可达状态的 BFS 枚举、不可达节点与孤儿结局、死路检测与汇流合法性、结局可达性、分支宽度与采样上界、组合爆炸的控制、好感度状态机与阈值门扰动、整数不变量;第三部分(第 9–12 章)做可玩原型与持久化:把规格内联进单文件 HTML、选择界面与状态显示、Playwright 注入选择序列真玩、断言终局状态与结局、多路径批跑、存档序列化与读档恢复、快照向前兼容、文本表与键的一致性;第四部分(第 13–16 章)做一致、回归与装配:跨语言摘要与 digest、同源不同宿主、偏差与容差、属性测试与随机路径模糊、规模与性能扫描,最后装配成一份规格三处消费的完整链路并交付卷三。按章节提供仿真、逻辑内核与原型;当前试点阶段已有复核记录,完整项目的配置、共享模块和交付验收仍在补齐。全书数字均来自本机实跑:可达状态 9895423 个,分支覆盖率 1000‰,死路节点 0,跨语言摘要 500/500 一致,同输入确定性违例 0。
《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》附录 A:把全卷 16 章 48 节散落的叙事规格九段字段、嵌套数组条件文法与十一条整数不变量汇成索引表,给出卷内文件命名约定、S/P/W 三层完整复现命令与排错顺序,并附一段 Python 与 TypeScript 逐位一致的跨语言状态摘要,作为「文本是规格的渲染」的可验证落点。