附录 A 情感模型公式、参数表与数据集索引
卷三《叙事体验与路径度量》的附录:把度量侧的规格输入、六个代理指标的口径、五个定义式与本卷工作区的文件清单汇成一张可核对的总表,并给出可运行性命令与排错顺序。全部数字均来自本机实跑,随正文各章一并更新,便于在写新章节或修改叙事规格时随时对照、重跑与核对。
tag
卷三《叙事体验与路径度量》的附录:把度量侧的规格输入、六个代理指标的口径、五个定义式与本卷工作区的文件清单汇成一张可核对的总表,并给出可运行性命令与排错顺序。全部数字均来自本机实跑,随正文各章一并更新,便于在写新章节或修改叙事规格时随时对照、重跑与核对。
把每条「路径 × 变量」的曲线按整数规则分类成六种形状:平台型 / 单调上升 / 单调下降 / 先升后降 / 先降后升 / 震荡型。实测 5000 条路径 × 4 变量 = 20000 条曲线里,单调上升占 359‰ 最多、震荡型 181‰ 次之、单调下降只有 74‰。shen 的单调下降为 0 条、yan 的平台型为 0 条,这两处零值各有成因。
好感度不是一局战斗里的数值,而是沿玩家路径推进的整数序列。本节沿一条确定性路径把 4 个变量 yan/hui/shen/mu 的曲线画出来:起点值、增量点、峰值、终点值,再采样 2000 条路径给出终点值分布。实测确定性路径上 yan 从 20 升到 65、升了 5 次,shen 全程停在 50;终点均值显示单条路径只是分布里的一个样本。
节奏冲突是密度与张力的错配:张力峰值处信息却极稀。本节用两条判据在 500 条路径上检出 4310 次节拍命中——峰值节拍处平均密度 373 千分、谷值处 502 千分、基线 406 千分;绝对错配仅 3 次,方向错配 2810 次(651 千分),全程整数千分并显式声明为 proxy。
密度是单位节点上新增了多少信息:新场景、新 flag、新物品、有意义选择各算一件。本节用滑窗 W=5 把 500 条路径切成 10680 个窗口,实测全局密度 409 千分、窗口区间 200~600 千分、偏疏窗口 62 个(5 千分)、偏密 0 个,可读区间 [250,750] 是设计参数,全程整数并声明 proxy。
节奏是叙事推进的快慢:沿路径每单位节点推进了多少剧情量。本节给 16 个节拍量出三幕分布 5/6/5,用 500 条采样路径算出节奏 384 千分、首次进入场景的间隔均值 3.080 步、命中节拍的三幕占比 345/297/357,全程整数千分位并显式声明为 proxy。
张力曲线 MAE 是 proxy:它度量的是作者标注与设计目标的偏离,不是玩家实际感受到的情绪。本节把这条边界写成一份可机器检查的声明 config/nm_06_3_proxy_declaration.json,用 lint 钉死字段、口径类型、单位与禁声称清单,再把实测的 0 毫填进报告,落 out/nm_06_3_proxy.json。
把 6.1 的曲线与真源 metrics.target_tension_curve 逐项比,按千分位整数地板除算 MAE(毫),阈值 1000 毫。真源里两条曲线当前逐项相同,故路径口径与全量口径的 MAE 都是 0;本节用反事实探针把目标挪动 1 得到 62 毫,证明这个 0 是自洽证据而非指标失效。
情感曲线不是凭感觉画的,它由一条路径唯一决定:路径经过的节点落到场景,场景命中作者标注的 beats[].tension(整数 1–5),序列即成曲线。本节把确定性路径的 26 个节点构造成 11 槽场景序列与 11 点张力曲线 1 2 3 2 3 4 4 3 4 4 2,全程整数、不出现浮点。
选择密度量的是:一条路径上每隔多少节点出现一次有分量的选择。采样 500 条路径实测——选择密度 962 千分,有分量选择占 917 千分,相邻有分量选择的间隔均值 1.094 步、最大 3 步;三幕占比 433 / 296 / 270,第一夜最密。全程定点整数,与第 7 章的节奏度量共用同一套口径。
两个不同选项在同一状态下推进出的状态逐字段相等,就是一对假选择。本节用完整 BFS 精确枚举 9895423 个可达 (节点,状态) 对,检出 3 对静态假与 10 对状态级假;其中 d_fg_3 的一对在全部 1036900 个可用状态下都相等,静态判据会漏掉它。再用三个合成规格证明检测器会开火。
后果可见性量的是:一个选项写下的状态差量,要隔几步才被下游的条件读到。本节把 115 个选项逐个算成整数距离——34 个立即可见、37 个延迟、28 个写进状态却永不被读到,另有 16 个根本没有差量;平均 2.42 步、最远 12 步。全程结构 BFS,不出现浮点,也不预测玩家感受。
让穷举、执行、度量三种消费跑同一份规格并断言彼此不矛盾:BFS 穷举的可达集(9895423 个状态)包含全部采样路径,同一条选择序列在 Python / TS / 浏览器三处推进出逐位相同的状态摘要 4162796975。含 Playwright 无头真玩。
三卷共用一份真源。本节把「装起来能不能用」拆成四组共 17 条断言:真源字段齐、卷一结构过、卷二引擎三处消费一致(跨语言锚点摘要 4162796975 逐位相等)、卷三六项代理指标量得出。每条都给出本机实跑值与可重跑命令,任一 FAIL 即非零退出。
命令行量不出玩家情绪,本卷七条指标全是 proxy。本节把「不能声称什么」写成可执行的 lint:八类禁声称(更感人、更好玩、玩家满意度、更优秀、玩家实际、读起来、绝对达标、提升 N 倍)、五条正面清单,以及 12 条候选结论的逐条判定与改写。指标能声称的只有相对变化与结构量。
同一张指标表里的数不能随便比:量纲不同的指标不能相加,七条指标合成不出一个总分;同一份规格加删一条选项,覆盖率就从 446 漂到 438 / 454;熵对样本量敏感,n=50 缺最稀有结局反而算出更高的熵。本节用三个可复现实验把可比性的边界钉死。
全卷七条代理指标第一次被收成一张总表:分支覆盖率、结局分布熵、张力曲线 MAE、好感度曲线 MAE、一致性残差、节奏密度偏差、整数不变量残差,每条给全定义、量纲、真源字段、实测值与首见小节。脚本从规格重算六条并与各章产物逐条对账,落 out/nm_15_1_metric_catalog.json。
指标变了不等于指标变坏了。本节把 14.2 的增量按三级分类:OK(没变)、DRIFT(变了但未越声明阈值)、CROSS(越过阈值才判得动方向)。再以 B 层把两处规格参数连续扫一遍,扫出相变点,全程只发软告警、始终 exit 0——扰动不该让构建硬失败。
上一节算出了影响面,这一节把「改动前 / 改动后」做成一张回归对照表:分支覆盖率、结局分布熵、张力 MAE、一致性残差各一列,增量各一行,并对着写在 metrics 里的声明阈值逐格判越阈。五处改动全是「变了但未越阈」,表同时落成 JSON 与 CSV,供后续每次演化重跑比对。
改一处规格,哪些路径与指标会变?本节用集合差回答:拿卷二 4.3 的 500 条采样序列当基线,在改动后的规格上重放,逐项量被阻断路径数、终局状态集差、结局集差与边/节点/场景/节拍集差。五处小改动各自给出实测数字,并说明为什么影响面不能靠重跑穷举来算。