15.3 规模告警
给规模定四条软告警阈值:可达状态数 > 1e7、单次 BFS > 120 秒、峰值内存 > 4 GB、单条路径步数 > 40。当前规格四条全未越(9895423 状态、58.6 秒、2147.1 MB、31 步);把 flag 放大到 30 后越过三条,而内存那条在两次复跑里一次越一次未越,脚本恒 exit 0。
tag
给规模定四条软告警阈值:可达状态数 > 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。
把 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;终点均值显示单条路径只是分布里的一个样本。
把节拍张力沿一条真实路径串成曲线:走确定性首选项策略,取出路径经过场景上的 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 章的节奏度量共用同一套口径。
两个不同选项在同一状态下推进出的状态逐字段相等,就是一对假选择。本节用完整 BFS 精确枚举 9895423 个可达 (节点,状态) 对,检出 3 对静态假与 10 对状态级假;其中 d_fg_3 的一对在全部 1036900 个可用状态下都相等,静态判据会漏掉它。再用三个合成规格证明检测器会开火。
后果可见性量的是:一个选项写下的状态差量,要隔几步才被下游的条件读到。本节把 115 个选项逐个算成整数距离——34 个立即可见、37 个延迟、28 个写进状态却永不被读到,另有 16 个根本没有差量;平均 2.42 步、最远 12 步。全程结构 BFS,不出现浮点,也不预测玩家感受。
回归的精确含义是「基线可达、改动后不可达」。本节用 BFS 精确口径枚举基线可达的 5 个结局,掐断真相的唯一入边后静态死条件分析报出回归;再把灯守的阈值门从 0 扫到 101,用 Y*=100 定位它由可达变不可达的临界点,软告警恒 exit 0。
20000 条路径逐边计数,把「分支被走得均不均匀」变成整数:分支覆盖率 1000‰、进入次数中位 4173、偏斜度 gini 373‰、头部集中度 29‰。再用偏置强度 b 从 0 扫到 1000 看相变——覆盖先掉、偏斜先抬、稀有结局先消失,软告警恒 exit 0。
结局熵有四个数,混在一起就错。本节把上界 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‰ 的目标。本节把随机、贪心、穷举三种采样策略放进同一路径预算对照,量出各自覆盖多少条对话边、到达几个结局,并解释为什么穷举是覆盖率的基准而不是一种采样。
本卷交付四类东西:真源与内核、度量工具链(S/P/W/B 共九件脚本)、可复算产物、六项代理指标口径。给出接手五步与「本套不做」清单——真人玩家测试、真实配音成本等需真实业务环境,命令行不可复现,逐处标 X,并列出后续可做的三个方向(多规格回归 / 度量反演 / 真人数据接入)。