15.3 规模告警
给规模定四条软告警阈值:可达状态数 > 1e7、单次 BFS > 120 秒、峰值内存 > 4 GB、单条路径步数 > 40。当前规格四条全未越(9895423 状态、58.6 秒、2147.1 MB、31 步);把 flag 放大到 30 后越过三条,而内存那条在两次复跑里一次越一次未越,脚本恒 exit 0。
category
给规模定四条软告警阈值:可达状态数 > 1e7、单次 BFS > 120 秒、峰值内存 > 4 GB、单条路径步数 > 40。当前规格四条全未越(9895423 状态、58.6 秒、2147.1 MB、31 步);把 flag 放大到 30 后越过三条,而内存那条在两次复跑里一次越一次未越,脚本恒 exit 0。
量叙事引擎的单位成本:单次 eval_cond 求值中位数 169.9 ns,一次完整 BFS 32 层 9895423 状态、峰值 frontier 2498621、19121205 次求值、60.8 秒、峰值内存 2153 MB。给出求值次数与规格规模的比值,并声明所有耗时都是本机 proxy,只做相对比较。
把同一份规格沿 flag、好感度、物品、节点四条轴分别放大一档,量 20 层内可达状态数与枚举耗时的增长:flag 18→30 时声明空间上界涨 4096 倍,实测可达只涨 2.096 倍;好感度轴单位倍率最高也只有 1.1285,远低于声明域的 101。给出规模表、增长阶与一张纯 xml.etree 生成的 SVG 曲线。
卷三《叙事体验与路径度量》的附录:把度量侧的规格输入、六个代理指标的口径、五个定义式与本卷工作区的文件清单汇成一张可核对的总表,并给出可运行性命令与排错顺序。全部数字均来自本机实跑,随正文各章一并更新,便于在写新章节或修改叙事规格时随时对照、重跑与核对。
残差算出来了,可超过多少才算告警?本节把阈值写成一条显式策略:先算声明基数当分母,取它的四分之一作默认阈值,再把上一节的七种规格变异逐个判定;最后扫描阈值的取值区间,看清阈值过紧与过松各自把告警变成什么样。残差与残差率全部是代理指标,只做相对比较。
一致性残差只有能在规格改动后朝正确方向移动,才是可用的回归信号。本节在内存克隆上做七种规格变异——补声明域、给秘密与禁则加门、清掉立场提供者,以及一次故意的回归——把残差重算成一张回归表,再用修复阶梯与信任门两条扫描检查单调性。残差全部是代理指标,只做相对比较。
把「声明」与「行为」对齐后统计失配计数:声明来自角色的 affinity / secret、派系 stance 与规则,行为来自选项的 when / effects 与采样路径。本节把一致性残差量成四个整数——声明域 D、秘密 K、立场 S、规则 R,并沿 2000 条路径量路径实现率,全部显式声明为 proxy。
把每条「路径 × 变量」的曲线按整数规则分类成六种形状:平台型 / 单调上升 / 单调下降 / 先升后降 / 先降后升 / 震荡型。实测 5000 条路径 × 4 变量 = 20000 条曲线里,单调上升占 359‰ 最多、震荡型 181‰ 次之、单调下降只有 74‰。shen 的单调下降为 0 条、yan 的平台型为 0 条,这两处零值各有成因。
把 14 道好感度阈值门(13 条选项门 + 1 条结局门)抽平,定义路径触达为「变量沿路径最大值 >= 门限」。实测 5000 条采样路径里 18 条(3‰)从未触达任何门,yan>=25 的触达率最高 858‰。B 层把每道门限 ±10 后重走路径:14 道门全部改变了触达率,只打印软告警、exit 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,全程整数、不出现浮点。
本章的张力来自叙事节拍结构,不是机制动力学。本节把这条边界跑成可核对的数:递归展开真源,叙事侧词元命中 143 次,机制侧词元 hp、damage、resource、turn 等命中 0 次——机制张力在这份规格上根本无法计算。分工不是一句口号,而是输入清单的差集。
把节拍张力沿一条真实路径串成曲线:走确定性首选项策略,取出路径经过场景上的 11 个节拍,得到张力曲线 1 2 3 2 3 4 4 3 4 4 2,再切出上升段、平台段与回落段,定位峰值与谷值,并算它与目标曲线的 MAE。本节如实说明:当前规格下 MAE 恒为 0,因为标注与目标逐项相同。
张力在本卷里不是从机制里长出来的,而是作者在规格里标注的:真源的 beats 是 16 个节拍,每个带一个整数 1 到 5 的 tension。本节只读这份标注,不跑任何仿真,就把它按幕切开、算出分布直方图与峰值位置,并给出 beats 字段表与三条整数不变量,全部数字来自本机实跑。
选择密度量的是:一条路径上每隔多少节点出现一次有分量的选择。采样 500 条路径实测——选择密度 962 千分,有分量选择占 917 千分,相邻有分量选择的间隔均值 1.094 步、最大 3 步;三幕占比 433 / 296 / 270,第一夜最密。全程定点整数,与第 7 章的节奏度量共用同一套口径。