<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>互动叙事 on PlumePHP</title><link>https://plumephp.com/tags/%E4%BA%92%E5%8A%A8%E5%8F%99%E4%BA%8B/</link><description>Recent content in 互动叙事 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 16 Oct 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E4%BA%92%E5%8A%A8%E5%8F%99%E4%BA%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>1.1 一次通关的轨迹</title><link>https://plumephp.com/narr-metric-01-1-playthrough-trajectory/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-01-1-playthrough-trajectory/</guid><description>一次通关可以被拆成三种表示：玩家按下的选择序列、引擎走出的节点序列、以及每一步之后的完整状态轨迹。本节用《雾港夜航》的首选项确定性策略走完一条 25 步路径，逐步骤打印好感度、置位 flag、持有物品与 FNV-1a 状态摘要，并给出节点数等于选择数加一的整数不变量。</description></item><item><title>10.2 分支图的可视化</title><link>https://plumephp.com/narr-metric-10-2-branch-graph-visualization/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-10-2-branch-graph-visualization/</guid><description>把 48 个对话节点 / 56 条去重对话边按场景分层画成一张 SVG 分支图，边按是否被一条确定性路径走过着色：走过 25 条（446‰），未走过 31 条；随机采样 200 条即可铺满 56/56。布局坐标由场景序号与场景内序号直接算出，纯 xml.etree 建树、回读校验。</description></item><item><title>10.3 路径热力图</title><link>https://plumephp.com/narr-metric-10-3-path-heatmap/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-10-3-path-heatmap/</guid><description>把 96 条采样路径在各场景上的经过次数画成 14×96 的矩阵热力图，cell 为整数、颜色按整数档位查表（档位定义在 config/nm_10_3_heatmap.json，全程无浮点调色）。矩阵元素之和 2544 恰等于所有路径的节点数之和；按结局排序后同结局的路径聚成一块。</description></item><item><title>11.1 模拟玩家的策略</title><link>https://plumephp.com/narr-metric-11-1-simulated-player-strategy/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-11-1-simulated-player-strategy/</guid><description>给采样装上「策略」这个旋钮：随机（可播种 PRNG 选可用选项）、贪心（总是最大化好感度增量）、覆盖导向（优先走尚未覆盖的边）三种模拟玩家策略，在同一份规格下各走 10 与 200 条路径，对照覆盖率、结局数与路径长度区间。全部指标都是 proxy。</description></item><item><title>11.2 策略对路径分布的影响</title><link>https://plumephp.com/narr-metric-11-2-strategy-effect-on-path-distribution/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-11-2-strategy-effect-on-path-distribution/</guid><description>同一份规格、同一个种子，只换「怎么选」这一条规则：随机、贪心、覆盖导向各跑 5000 条路径，量结局分布、结局分布熵与路径长度分布。实测贪心 5000 条里一次都没走到「真相」，而随机与覆盖导向都到达全部 5 个结局；再把三种策略按 7 档混合比扫描，只有纯贪心丢结局。全部指标都是 proxy。</description></item><item><title>11.3 与玩家动因模型的分工</title><link>https://plumephp.com/narr-metric-11-3-motivation-model-division/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-11-3-motivation-model-division/</guid><description>本章的「模拟玩家」是采样器，不是玩家模型：它只做路径选择策略（随机 / 贪心 / 覆盖导向），不建模动因、不做玩家分型。本节把这条分工写成一份可 lint 的 D 层声明表，再用 S 层脚本做硬断言，并与 11.1、11.2 真跑产物交叉核对，证明声明与脚本做的是同一件事。</description></item><item><title>12.2 W 层路径批跑与断言</title><link>https://plumephp.com/narr-metric-12-2-w-layer-path-batch-run-assert/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-12-2-w-layer-path-batch-run-assert/</guid><description>把规格与内核内联进单文件 HTML，用 Playwright 无头注入 24 条选择序列真玩：逐条断言终局节点、结局与状态摘要与 Python 侧一致，两遍确定性 24/24，覆盖率 982‰，截图与批跑 JSON 落盘。真人玩家测试标 X。</description></item><item><title>12.3 从测试到决策</title><link>https://plumephp.com/narr-metric-12-3-test-to-decision/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-12-3-test-to-decision/</guid><description>假设被证伪之后必须二选一：改规格还是改假设。用样本量扫描 N=24/100/500/2000/8000 诊断 H4（结局分布熵）——熵在 N=100 起越过 1500 毫比特、N≥500 稳定在 1718–1747，判定为测试设计缺陷、改假设而非改规格，story_spec.json 一行不改；真人测试标 X。</description></item><item><title>14.1 规格演化的影响面</title><link>https://plumephp.com/narr-metric-14-1-spec-evolution-impact/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-14-1-spec-evolution-impact/</guid><description>改一处规格，哪些路径与指标会变？本节用集合差回答：拿卷二 4.3 的 500 条采样序列当基线，在改动后的规格上重放，逐项量被阻断路径数、终局状态集差、结局集差与边/节点/场景/节拍集差。五处小改动各自给出实测数字，并说明为什么影响面不能靠重跑穷举来算。</description></item><item><title>14.2 路径与指标的回归</title><link>https://plumephp.com/narr-metric-14-2-path-metric-regression/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-14-2-path-metric-regression/</guid><description>上一节算出了影响面，这一节把「改动前 / 改动后」做成一张回归对照表：分支覆盖率、结局分布熵、张力 MAE、一致性残差各一列，增量各一行，并对着写在 metrics 里的声明阈值逐格判越阈。五处改动全是「变了但未越阈」，表同时落成 JSON 与 CSV，供后续每次演化重跑比对。</description></item><item><title>14.3 演化的告警</title><link>https://plumephp.com/narr-metric-14-3-evolution-warning/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-14-3-evolution-warning/</guid><description>指标变了不等于指标变坏了。本节把 14.2 的增量按三级分类：OK（没变）、DRIFT（变了但未越声明阈值）、CROSS（越过阈值才判得动方向）。再以 B 层把两处规格参数连续扫一遍，扫出相变点，全程只发软告警、始终 exit 0——扰动不该让构建硬失败。</description></item><item><title>15.1 指标的定义与口径</title><link>https://plumephp.com/narr-metric-15-1-metric-definition-caliber/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-15-1-metric-definition-caliber/</guid><description>全卷七条代理指标第一次被收成一张总表：分支覆盖率、结局分布熵、张力曲线 MAE、好感度曲线 MAE、一致性残差、节奏密度偏差、整数不变量残差，每条给全定义、量纲、真源字段、实测值与首见小节。脚本从规格重算六条并与各章产物逐条对账，落 out/nm_15_1_metric_catalog.json。</description></item><item><title>15.2 指标的可比性与局限</title><link>https://plumephp.com/narr-metric-15-2-metric-comparability-limitation/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-15-2-metric-comparability-limitation/</guid><description>同一张指标表里的数不能随便比：量纲不同的指标不能相加，七条指标合成不出一个总分；同一份规格加删一条选项，覆盖率就从 446 漂到 438 / 454；熵对样本量敏感，n=50 缺最稀有结局反而算出更高的熵。本节用三个可复现实验把可比性的边界钉死。</description></item><item><title>15.3 指标不能声称什么</title><link>https://plumephp.com/narr-metric-15-3-what-metric-cannot-claim/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-15-3-what-metric-cannot-claim/</guid><description>命令行量不出玩家情绪，本卷七条指标全是 proxy。本节把「不能声称什么」写成可执行的 lint：八类禁声称（更感人、更好玩、玩家满意度、更优秀、玩家实际、读起来、绝对达标、提升 N 倍）、五条正面清单，以及 12 条候选结论的逐条判定与改写。指标能声称的只有相对变化与结构量。</description></item><item><title>16.1 三卷的装配检查表</title><link>https://plumephp.com/narr-metric-16-1-three-volume-assembly-checklist/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-16-1-three-volume-assembly-checklist/</guid><description>三卷共用一份真源。本节把「装起来能不能用」拆成四组共 17 条断言：真源字段齐、卷一结构过、卷二引擎三处消费一致（跨语言锚点摘要 4162796975 逐位相等）、卷三六项代理指标量得出。每条都给出本机实跑值与可重跑命令，任一 FAIL 即非零退出。</description></item><item><title>16.2 三种消费的总联调</title><link>https://plumephp.com/narr-metric-16-2-three-consumption-full-chain-integration/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-16-2-three-consumption-full-chain-integration/</guid><description>让穷举、执行、度量三种消费跑同一份规格并断言彼此不矛盾：BFS 穷举的可达集（9895423 个状态）包含全部采样路径，同一条选择序列在 Python / TS / 浏览器三处推进出逐位相同的状态摘要 4162796975。含 Playwright 无头真玩。</description></item><item><title>4.1 后果可见性</title><link>https://plumephp.com/narr-metric-04-1-consequence-visibility/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-04-1-consequence-visibility/</guid><description>后果可见性量的是：一个选项写下的状态差量，要隔几步才被下游的条件读到。本节把 115 个选项逐个算成整数距离——34 个立即可见、37 个延迟、28 个写进状态却永不被读到，另有 16 个根本没有差量；平均 2.42 步、最远 12 步。全程结构 BFS，不出现浮点，也不预测玩家感受。</description></item><item><title>4.2 假选择的检测</title><link>https://plumephp.com/narr-metric-04-2-fake-choice-detection/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-04-2-fake-choice-detection/</guid><description>两个不同选项在同一状态下推进出的状态逐字段相等，就是一对假选择。本节用完整 BFS 精确枚举 9895423 个可达 (节点,状态) 对，检出 3 对静态假与 10 对状态级假；其中 d_fg_3 的一对在全部 1036900 个可用状态下都相等，静态判据会漏掉它。再用三个合成规格证明检测器会开火。</description></item><item><title>4.3 选择密度与节奏</title><link>https://plumephp.com/narr-metric-04-3-choice-density-rhythm/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-04-3-choice-density-rhythm/</guid><description>选择密度量的是：一条路径上每隔多少节点出现一次有分量的选择。采样 500 条路径实测——选择密度 962 千分，有分量选择占 917 千分，相邻有分量选择的间隔均值 1.094 步、最大 3 步；三幕占比 433 / 296 / 270，第一夜最密。全程定点整数，与第 7 章的节奏度量共用同一套口径。</description></item><item><title>6.1 情感曲线的构造</title><link>https://plumephp.com/narr-metric-06-1-emotion-curve-construction/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-06-1-emotion-curve-construction/</guid><description>情感曲线不是凭感觉画的，它由一条路径唯一决定：路径经过的节点落到场景，场景命中作者标注的 beats[].tension（整数 1–5），序列即成曲线。本节把确定性路径的 26 个节点构造成 11 槽场景序列与 11 点张力曲线 1 2 3 2 3 4 4 3 4 4 2，全程整数、不出现浮点。</description></item><item><title>6.2 目标曲线与 MAE</title><link>https://plumephp.com/narr-metric-06-2-target-curve-mae/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-06-2-target-curve-mae/</guid><description>把 6.1 的曲线与真源 metrics.target_tension_curve 逐项比，按千分位整数地板除算 MAE（毫），阈值 1000 毫。真源里两条曲线当前逐项相同，故路径口径与全量口径的 MAE 都是 0；本节用反事实探针把目标挪动 1 得到 62 毫，证明这个 0 是自洽证据而非指标失效。</description></item><item><title>6.3 代理指标的口径声明</title><link>https://plumephp.com/narr-metric-06-3-proxy-metric-declaration/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-06-3-proxy-metric-declaration/</guid><description>张力曲线 MAE 是 proxy：它度量的是作者标注与设计目标的偏离，不是玩家实际感受到的情绪。本节把这条边界写成一份可机器检查的声明 config/nm_06_3_proxy_declaration.json，用 lint 钉死字段、口径类型、单位与禁声称清单，再把实测的 0 毫填进报告，落 out/nm_06_3_proxy.json。</description></item><item><title>7.1 叙事节奏的度量</title><link>https://plumephp.com/narr-metric-07-1-narrative-rhythm-metric/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-07-1-narrative-rhythm-metric/</guid><description>节奏是叙事推进的快慢：沿路径每单位节点推进了多少剧情量。本节给 16 个节拍量出三幕分布 5/6/5，用 500 条采样路径算出节奏 384 千分、首次进入场景的间隔均值 3.080 步、命中节拍的三幕占比 345/297/357，全程整数千分位并显式声明为 proxy。</description></item><item><title>7.2 叙事密度的控制</title><link>https://plumephp.com/narr-metric-07-2-narrative-density-control/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-07-2-narrative-density-control/</guid><description>密度是单位节点上新增了多少信息：新场景、新 flag、新物品、有意义选择各算一件。本节用滑窗 W=5 把 500 条路径切成 10680 个窗口，实测全局密度 409 千分、窗口区间 200~600 千分、偏疏窗口 62 个（5 千分）、偏密 0 个，可读区间 [250,750] 是设计参数，全程整数并声明 proxy。</description></item><item><title>7.3 节奏冲突的检测</title><link>https://plumephp.com/narr-metric-07-3-rhythm-conflict-detection/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-07-3-rhythm-conflict-detection/</guid><description>节奏冲突是密度与张力的错配：张力峰值处信息却极稀。本节用两条判据在 500 条路径上检出 4310 次节拍命中——峰值节拍处平均密度 373 千分、谷值处 502 千分、基线 406 千分；绝对错配仅 3 次，方向错配 2810 次（651 千分），全程整数千分并显式声明为 proxy。</description></item><item><title>8.1 好感度随路径的变化</title><link>https://plumephp.com/narr-metric-08-1-affinity-curve-over-path/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-08-1-affinity-curve-over-path/</guid><description>好感度不是一局战斗里的数值，而是沿玩家路径推进的整数序列。本节沿一条确定性路径把 4 个变量 yan/hui/shen/mu 的曲线画出来：起点值、增量点、峰值、终点值，再采样 2000 条路径给出终点值分布。实测确定性路径上 yan 从 20 升到 65、升了 5 次，shen 全程停在 50；终点均值显示单条路径只是分布里的一个样本。</description></item><item><title>8.3 关系曲线的形状分类</title><link>https://plumephp.com/narr-metric-08-3-relationship-curve-shape-classification/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-08-3-relationship-curve-shape-classification/</guid><description>把每条「路径 × 变量」的曲线按整数规则分类成六种形状：平台型 / 单调上升 / 单调下降 / 先升后降 / 先降后升 / 震荡型。实测 5000 条路径 × 4 变量 = 20000 条曲线里，单调上升占 359‰ 最多、震荡型 181‰ 次之、单调下降只有 74‰。shen 的单调下降为 0 条、yan 的平台型为 0 条，这两处零值各有成因。</description></item><item><title>附录 A 情感模型公式、参数表与数据集索引</title><link>https://plumephp.com/narr-metric-appendix-a/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-appendix-a/</guid><description>卷三《叙事体验与路径度量》的附录：把度量侧的规格输入、六个代理指标的口径、五个定义式与本卷工作区的文件清单汇成一张可核对的总表，并给出可运行性命令与排错顺序。全部数字均来自本机实跑，随正文各章一并更新，便于在写新章节或修改叙事规格时随时对照、重跑与核对。</description></item><item><title>11.3 快照的向前兼容</title><link>https://plumephp.com/narr-sys-11-3-snapshot-forward-compatibility/</link><pubDate>Fri, 16 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-11-3-snapshot-forward-compatibility/</guid><description>规格演化后（新增 flag、新增物品、新增好感度变量、新增节点），旧存档必须仍能读。本节实跑兼容性矩阵：四种新规格下旧存档全部读入成功并给出补默认值规则；迁移函数三条判据——缺失字段补默认、多余字段丢弃并报告、类型不符拒绝——逐条在本机实跑验证。</description></item><item><title>1.1 状态、事件、转移</title><link>https://plumephp.com/narr-sys-01-1-state-event-transition/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-01-1-state-event-transition/</guid><description>叙事引擎可以被抽象成一个三元组：状态（节点、好感度、flag、物品、路径）、事件（一次选项点击）、转移（纯函数 step）。本节把《雾港夜航》的引擎压到这三个词上，并用一份 S 层脚本打印一条 25 步路径的逐步骤状态轨迹与每一步之后的 FNV-1a 摘要。</description></item><item><title>1.3 引擎与规格的同源</title><link>https://plumephp.com/narr-sys-01-3-engine-spec-same-origin/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-01-3-engine-spec-same-origin/</guid><description>同源的意思是同一份规格在 Python 与 TypeScript 两侧推进同一选择序列，整数状态摘要逐位相同。本节用四种确定性策略各走一条路径：Python 侧落出四条路径的选择序列与 FNV-1a 摘要，TypeScript 侧读回产物原样重放，断言规范串与摘要两侧完全一致。</description></item><item><title>10.1 注入选择序列真玩</title><link>https://plumephp.com/narr-sys-10-1-playwright-inject-choice-path/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-10-1-playwright-inject-choice-path/</guid><description>用 Playwright 无头打开 web/dist/ne10.html，靠 data-choice-id 选择器契约注入一条 25 步的完整选择序列真玩一遍：逐步记录节点 id 与当前好感度读数，并断言每一步注入的选项都落在规格该节点的可用集合里，终局摘要 4162796975。</description></item><item><title>10.2 断言终局状态与结局</title><link>https://plumephp.com/narr-sys-10-2-assert-final-state-ending/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-10-2-assert-final-state-ending/</guid><description>把 25 步序列走完后的终局状态读回来断言四件事：终局节点 e_lit、结局 灯守、终局摘要 4162796975（与 Python 与 TS 侧逐位一致）、同一序列跑两遍摘要不变；再截图到 out/shots/ 并给出 PNG 字节数。只对整数状态写逐位一致。</description></item><item><title>11.1 存档的序列化</title><link>https://plumephp.com/narr-sys-11-1-save-serialization/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-11-1-save-serialization/</guid><description>存档是状态的规范序序列化：键按字典序、值全是整数、无浮点、无时间戳、无随机。本节把一条 25 步路径的终局状态写成 795 字节的存档 JSON，验证字段与 canonical 串一一对应，并让序列化到反序列化再序列化两次字节完全相同；同时点明临时 UI 状态、派生量、绝对时间不能进存档。</description></item><item><title>11.2 读档与状态恢复</title><link>https://plumephp.com/narr-sys-11-2-load-state-restore/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-11-2-load-state-restore/</guid><description>读档后从存档点继续推进，必须与从头一次走完得到逐位相同的终局状态。本节沿 25 步路径在第 1、5、10、15、20、25 步分别存档读档，终局规范串全部相同；并给出负例：把存档里的好感度篡改成 999，宽松读档钳位到 100 并记录修复，严格读档直接拒绝，检测器抓得到。</description></item><item><title>12.1 文本表与键</title><link>https://plumephp.com/narr-sys-12-1-text-table-and-key/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-12-1-text-table-and-key/</guid><description>文本是规格的一种渲染产物，而键是文本表与规格之间唯一的连接点。本节从 dialogue 段抽出全部文本键——48 条 line、1 条 else、115 条选项文本，共 164 键——给出键命名规则与漏键 / 悬空键检测，并各给一条负例。只做文本的结构一致性，不评价译文质量。</description></item><item><title>12.2 变体与复数</title><link>https://plumephp.com/narr-sys-12-2-variant-and-plural/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-12-2-variant-and-plural/</guid><description>同一条键在不同状态下要渲染不同文本，这是条件变体；同一句话在不同数量下要选不同形式，这是复数。本节给出 2 个带条件变体节点的覆盖矩阵（1 完整、1 欠声明），并给出 zh-CN 与 en-US 的最小复数规则对照——中文退化为单类，复数只在对照语言上有意义。</description></item><item><title>12.3 文本的一致性校验</title><link>https://plumephp.com/narr-sys-12-3-text-consistency-validation/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-12-3-text-consistency-validation/</guid><description>四类文本一致性校验一次算齐：漏键、悬空键、变体覆盖、占位符。前两类残差为 0；变体覆盖报出 d_lt_2 欠声明（有 line_when 无 line_else，按规则回落，只报不判失败）；占位符残差 0，并给一条负例。本章只做结构一致性，译文质量与字体覆盖需真实业务环境，命令行不可复现。</description></item><item><title>13.1 跨语言摘要与 digest</title><link>https://plumephp.com/narr-sys-13-1-cross-language-digest/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-13-1-cross-language-digest/</guid><description>摘要用 FNV-1a 32 位，只对 canonical 规范串（状态）做，不对台词文本做。本节实测同一批 500 条路径（seed=20261016）在 Python 与 TypeScript 两侧逐位相同 500 / 500，前 3 条摘要为 3976226298、3848604931、1198029437，并与卷一同种子采样逐位相同，证明卷二未另立真源。</description></item><item><title>13.2 同源不同宿主</title><link>https://plumephp.com/narr-sys-13-2-same-origin-different-host/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-13-2-same-origin-different-host/</guid><description>同一条确定性策略路径（总是选第一个可用选项，25 个事件）在 Python、Node 内核与浏览器内联三个宿主上推进，终局节点 e_lit、结局 灯守、FNV-1a 摘要 4162796975 三侧逐位相同。本节给出宿主差异清单：整数运算、取模、Math.imul 与大整数、对象键序、Unicode 归一化，逐条说明为何不影响状态摘要。</description></item><item><title>13.3 偏差与容差</title><link>https://plumephp.com/narr-sys-13-3-deviation-tolerance/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-13-3-deviation-tolerance/</guid><description>什么必须逐位相同、什么允许不同，本节写成一张容差表：整数状态（好感度、flag、item、节点 id、路径）必须逐位；浮点派生量、对象键序、文本渲染、时间戳允许不同。负例把好感度钳位上限从 100 改成 99，实测 12 / 500 条路径摘要改变，首个分歧点定位到路径 #13 第 20 步 c_fg_1a 的 shen。</description></item><item><title>14.1 属性测试与不变量</title><link>https://plumephp.com/narr-sys-14-1-property-test-invariant/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-14-1-property-test-invariant/</guid><description>属性测试不问「跑一遍对不对」，而问「一条命题是否对所有输入都成立」。本节把第 3 / 6 / 8 章的不变量写成六条属性：好感度恒在 [0,100]、set 类算子幂等、add 故意不幂等、静态死路 0、5 个结局全可达、每状态至少一个可用选项，并给每条属性配一个必须 fail 的注入式负例。</description></item><item><title>14.2 随机路径的模糊测试</title><link>https://plumephp.com/narr-sys-14-2-random-path-fuzz/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-14-2-random-path-fuzz/</guid><description>把随机路径当模糊测试的输入：用自实现可播种 PRNG 跑 20000 条路径，断言全部终止于 5 个结局之一、无卡死、无越界。实测分布为离港 10074、沉没 5507、缄默 3223、灯守 1018、真相 178，最稀有的真相仅 178 条。Python 与 TypeScript 两侧对同一批路径的终局状态摘要逐位一致。</description></item><item><title>16.2 三处消费的联调</title><link>https://plumephp.com/narr-sys-16-2-three-consumption-integration/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-16-2-three-consumption-integration/</guid><description>把同一份规格上的三处消费串成一次联调：穷举给出完整可达状态数与结局分布，执行让确定性策略 first 走到底并算出整数摘要 4162796975，度量给出覆盖率与张力曲线残差。P 层用 TypeScript 内核重放同一条路径，摘要与 S 层逐位相同，验证引擎与规格同源。</description></item><item><title>2.2 短路与复杂度</title><link>https://plumephp.com/narr-sys-02-2-short-circuit-complexity/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-02-2-short-circuit-complexity/</guid><description>短路是求值器的一条优化纪律：and 左假即停、or 左真即停，但它绝不能改变结果。本节给出短路与不短路两种实现的节点访问步数对照——本规格 57 个位点在 16 个代表状态下 eager 1008 步、短路 992 步——并声明复杂度上界：树内 n 个节点时短路步数恒不超过 n。</description></item><item><title>3.2 确定性与幂等</title><link>https://plumephp.com/narr-sys-03-2-determinism-idempotence/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-03-2-determinism-idempotence/</guid><description>确定性是同一输入同一输出，幂等是重复应用结果不变，两者常被混为一谈。本节把状态推进拆成三条可断言判据：函数性、set 类算子幂等、add 故意不幂等，并说明全书那句「同输入确定性违例 0」指的是同一状态到同一后继状态，而不是「重复 add 不累加」。</description></item><item><title>3.3 状态快照与差量</title><link>https://plumephp.com/narr-sys-03-3-state-snapshot-delta/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-03-3-state-snapshot-delta/</guid><description>快照是某一刻的完整状态，差量是相邻两快照间真正改变的字段。本节沿一条 25 步的确定性路径输出逐步骤差量表，并点出 7 个 flag 与 1 个物品被写却从未被任何条件读取——这类「只增不减的信息」按声明未用=报告处理，不判 FAIL，只如实报出。</description></item><item><title>4.2 同种子同回放</title><link>https://plumephp.com/narr-sys-04-2-same-seed-same-replay/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-04-2-same-seed-same-replay/</guid><description>随机路径采样只用自实现的 Lehmer MINSTD，种子一固定，回放就必然复现。本节实测同一 (seed=20261016, n=500) 采样两次 500 条选择序列逐条相同，而换到 seed=20261017 后逐条相同数为 0、结局分布也整体改变。</description></item><item><title>4.3 回放的逐位一致</title><link>https://plumephp.com/narr-sys-04-3-replay-bitwise-identity/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-04-3-replay-bitwise-identity/</guid><description>对同一串选择序列，Python 与 TypeScript 各自推进一遍，比较 canonical 串与 FNV-1a 32 位摘要。本节实测 500 条路径全部逐位相同，并给出前 3 条摘要值对照表；FNV-1a 的 Math.imul 与 Python 的 &amp; 0xFFFFFFFF 是两侧一致的关键。</description></item><item><title>6.1 死路检测</title><link>https://plumephp.com/narr-sys-06-1-dead-end-detection/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-06-1-dead-end-detection/</guid><description>死路是一个节点在当前状态下没有任何可用选项、且不是结局节点，玩家就卡死了。本节把静态死路与动态死路分开查：静态 0 个；动态用投影状态上的完整 BFS 与 20000 条采样，实测卡死 0 条。再用三组注入负例证明检测器确实会开火，而不是一个永远返回空的摆设。</description></item><item><title>6.2 汇流的合法性</title><link>https://plumephp.com/narr-sys-06-2-merge-legality/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-06-2-merge-legality/</guid><description>汇聚本身不是缺陷——115 条选项去重后只剩 56 条唯一跳转。真正的非法汇流是汇聚之后状态不可区分：两条不同入边到达同一节点后，下游全部条件的求值完全一致，信息被丢弃。本节给出可判定口径 D(M)，实测 34 个汇聚节点里 22 个冗余、3 个跨源冗余，并用合成规格负例证明检测器会开火。</description></item><item><title>6.3 结局的可达性</title><link>https://plumephp.com/narr-sys-06-3-ending-reachability/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-06-3-ending-reachability/</guid><description>5 个结局（灯守 / 离港 / 真相 / 缄默 / 沉没）全部可达，但可达不等于易达。本节为每个结局给出一条真实可回放的到达路径，再用 20000 条均匀随机采样算分布：离港 10074、沉没 5507、缄默 3223、灯守 1018、真相仅 178。并厘清 endings 的 id 与 dialogue 的 ending 两个口径。</description></item><item><title>7.2 剪枝与采样上界</title><link>https://plumephp.com/narr-sys-07-2-pruning-sampling-bound/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-07-2-pruning-sampling-bound/</guid><description>路径数有两层上界：朴素乘积上界 5 的 31 次方约 4.66×10 的 21 次方，真实结构路径数 450208471680，剪枝后 BFS 可达边 115/115 即 1000‰。本节推导优惠券收集器的采样上界（覆盖 115 条边约 613 条路径），并实测随机与贪心两种策略在 N=100/1000/10000/20000 下的覆盖率收敛曲线。</description></item><item><title>7.3 组合爆炸的控制</title><link>https://plumephp.com/narr-sys-07-3-combinatorial-explosion-control/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-07-3-combinatorial-explosion-control/</guid><description>把分支宽度与深度当两条扰动轴：宽度因子 k 把每个有选项节点的出度乘以 2、3、4，路径数从约 4.50×10 的 11 次方一路涨到 10 的 30 次方量级，而去重跳转覆盖率始终 1000‰ 纹丝不动；深度预算 L 把探索限制在 L 步内，可达覆盖率随 L 上升、在 L=22 触顶。B 层只打印软告警，恒 exit 0。</description></item><item><title>9.1 规格内联进单文件 HTML</title><link>https://plumephp.com/narr-sys-09-1-spec-inline-single-file-html/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-09-1-spec-inline-single-file-html/</guid><description>把 config/story_spec.json 与 core/src/inkwell/engine.ts 一起内联进一个单文件 HTML，产出 web/dist/ne09.html。本节实测产物 41641 字节、script src 0、外部 http(s) 链接 0，给出零外部依赖的自检口径与双击即玩的最小交付形态。</description></item><item><title>9.2 选择界面与状态显示</title><link>https://plumephp.com/narr-sys-09-2-choice-ui-state-display/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-09-2-choice-ui-state-display/</guid><description>给可玩原型挂一套稳定的 data-* 选择器契约：当前节点、每个选择按钮、四个好感度、已置位 flag、持有物品各有一个可寻址的属性。再用 Playwright 无头打开这页单文件 HTML，断言 DOM 已绘制、按钮数等于当前可用选项数、点击后节点推进。</description></item><item><title>9.3 原型与内核的同源</title><link>https://plumephp.com/narr-sys-09-3-prototype-kernel-same-origin/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-09-3-prototype-kernel-same-origin/</guid><description>浏览器里走完同一条确定性策略路径（总是选第一个可用选项，共 25 个事件），读出终局状态，与 Python 侧产物比对 canonical 串与 FNV-1a 摘要。三侧锚点一致：摘要 4162796975、节点 e_lit、结局 灯守。只对整数状态写逐位一致。</description></item><item><title>1.1 世界、角色、事件、选择</title><link>https://plumephp.com/narr-arch-01-1-world-character-event-choice/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-01-1-world-character-event-choice/</guid><description>叙事可以被拆成四个最小构成：世界（派系、地点、设定、规则）、角色（目标、恐惧、秘密、弧光）、事件（幕、节拍、场景、对话节点）、选择（选项与跳转）。本节用《雾港夜航》的 story_spec.json 把四者逐项清点：4 个派系与 14 个地点、6 个角色、16 个节拍与 48 个对话节点、115 个选项，并跑通一份 S 层清点脚本。</description></item><item><title>1.3 文本是渲染：规格与文本的分工</title><link>https://plumephp.com/narr-arch-01-3-text-as-rendering-spec-text-division/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-01-3-text-as-rendering-spec-text-division/</guid><description>本套的核心主张：台词文本不是规格的输入端，而是规格的一种渲染产物。同一条 dialogue 记录（line 加 line_when 加 line_else）在不同状态下渲染出不同台词。本节给出四分支渲染规则、用 d_tc_2 做最小演示、反向断言文本不进状态，并写死边界——只做文本的结构，不评价文本质量。</description></item><item><title>10.3 好感度曲线的形状</title><link>https://plumephp.com/narr-arch-10-3-affinity-curve-shape/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-10-3-affinity-curve-shape/</guid><description>把好感度沿采样路径画成曲线后，「形状」也成了一个可分类的量：单调上升 / 先升后平 / 单调下降 / 波动 / 全程不变，五类互斥。S 层统计 2000 条路径的形状占比并用纯 xml.etree 出图，B 层把初始值整体上下扰动 ±10，观察门限跨越率的相变——−10 档新增 9 条死门，全程只软告警不硬失败。</description></item><item><title>11.1 对话节点、选项与跳转</title><link>https://plumephp.com/narr-arch-11-1-dialogue-node-choice-goto/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-11-1-dialogue-node-choice-goto/</guid><description>对话节点是字段化的记录：节点层八个字段、选项层五个字段，其中 goto 是选项的独立字段而非效果算子。本节给出两张字段表，用 S 层脚本校验 115 条跳转全部命中已声明节点并输出节点度数表，再用 P 层测试断言未知选项被拒绝、推进是纯函数。</description></item><item><title>11.2 台词的条件渲染</title><link>https://plumephp.com/narr-arch-11-2-conditional-line-rendering/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-11-2-conditional-line-rendering/</guid><description>同一节点在不同状态下渲染出不同台词，靠的是 line_when 与 line_else 两个字段。本节把渲染规则写成四分支表，用 S 层脚本枚举全部 50 个渲染分支：48 个节点里只有 2 个带 line_when，其中 d_lt_2 声明了条件却没给 line_else，属规格层面的欠声明，回落到 line。</description></item><item><title>12.1 模板与变量</title><link>https://plumephp.com/narr-arch-12-1-template-and-variable/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-12-1-template-and-variable/</guid><description>台词里出现的角色名与地点名，在规格里其实是一次变量查找。本节给出文本模板的唯一文法（占位、转义与未知占位回落），由规格三段拼出 24 个绑定的命名实体表，并渲染全部 48 条 line 与 115 条选项文本统计占位出现次数：行内占位 0 处、字段级占位 48 处、可模板化点 33 处。只做文本的结构，不评价文本质量。</description></item><item><title>12.2 条件文本与变体</title><link>https://plumephp.com/narr-arch-12-2-conditional-text-variant/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-12-2-conditional-text-variant/</guid><description>同一条台词记录在不同状态下渲染出不同变体，这是条件文本的全部含义。本节枚举两个条件节点的整个定义域：d_tc_2 两分支两条文本；d_lt_2 声明了 line_when 却没写 line_else，101 个状态枚举下来只得到一条文本——结构分流了，文本没分流。变体退化因此成了一个可数的缺口，修法是在规格里补声明，而不是改台词。</description></item><item><title>12.3 文本表与单页预览</title><link>https://plumephp.com/narr-arch-12-3-text-table-single-page-preview/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-12-3-text-table-single-page-preview/</guid><description>把全部 48 条台词与 115 个选项渲染成一张 163 行的文本表，每行一个键，内联进单文件 HTML，再用 Playwright 无头打开，断言台词条数、选项条数、空文本行数与键指纹，截图到 out/shots/，并验两遍渲染确定性。末尾重申本章的做 / 不做边界：本套只做文本的结构，不评价文本质量。</description></item><item><title>14.2 设定与行为的对齐检验</title><link>https://plumephp.com/narr-arch-14-2-setting-behavior-alignment-check/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-14-2-setting-behavior-alignment-check/</guid><description>设定说「教会不承认灯塔之光」，规格里却可能允许玩家请执事去点灯。本节逐条检验 4 条 rule 与 6 条 lore 是否被行为兑现：lore 的 reveal_flag 是否真被选项置位并被条件读取，rule 是否有兑现它的门。S 层脚本输出对齐表，如实报告对不上的项——本案例 6 条 lore 全对齐，rule_curfew 未兑现。</description></item><item><title>15.3 协作与版本管理</title><link>https://plumephp.com/narr-arch-15-3-collaboration-version-management/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-15-3-collaboration-version-management/</guid><description>叙事策划与程序在规格上分工：策划写结构与条件，程序写内核与门禁，规格是两者唯一的接口。本节给出规格变更的机器可读 diff 与影响面评审（本机可复现），并把真实团队的评审会、冻结窗口与排期逐处标注为需真实业务环境、命令行不可复现，把能算与不能算的分开。</description></item><item><title>16.2 卷一消费的预演</title><link>https://plumephp.com/narr-arch-16-2-volume-one-consumption-rehearsal/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-16-2-volume-one-consumption-rehearsal/</guid><description>把卷一的三处消费——穷举、执行、度量——在同一份规格上串成一次预演：穷举给出覆盖率与结局可达性，执行把 seed 采样的第一条路径推进到底并算出整数 digest，度量给出张力 MAE 与结局分布熵。S 层与 P 层对同一路径复算，digest 逐位相同。</description></item><item><title>3.3 设定的暴露节奏</title><link>https://plumephp.com/narr-arch-03-3-setting-exposure-rhythm/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-03-3-setting-exposure-rhythm/</guid><description>设定不是一次倒完的：lore[].reveal_flag 把「揭示时机」写成状态，某条设定何时被玩家知道，取决于它的 flag 在哪一步被置 1。本节沿 20000 条采样路径统计 6 条 lore 的首次揭示位置分布，并用纯 xml.etree 出一张暴露节奏 SVG——网格给每条 lore 落在哪一夜，折线给平均已揭示条数。</description></item><item><title>4.1 角色的字段：目标、恐惧、秘密</title><link>https://plumephp.com/narr-arch-04-1-character-fields-goal-fear-secret/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-04-1-character-fields-goal-fear-secret/</guid><description>目标、恐惧、秘密在叙事规格里都是自由文本，机器读不懂。本节给出一层可校验的锚点表，把每个字段锚到具体的场景、flag 与条件，再用 S 层脚本回规格做交叉引用检查：30 个字段锚点里 21 个可检查，并定位出 18 个 flag 里 7 个从不参与任何条件。</description></item><item><title>4.2 关系矩阵</title><link>https://plumephp.com/narr-arch-04-2-relationship-matrix/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-04-2-relationship-matrix/</guid><description>故事里谁对谁是什么态度，规格里只有派系立场这一层。本节把 6 个角色之间的关系写成 6×6 整数矩阵，校验形状、值域与对角线，再用派系立场推出先验做一致性交叉检查：30 个非对角格里 2 个偏离先验，15 对里有 13 对不对称，而派系立场本身却完全对称。</description></item><item><title>5.2 弧光与行为的对齐</title><link>https://plumephp.com/narr-arch-05-2-arc-behavior-alignment/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-05-2-arc-behavior-alignment/</guid><description>弧光的每一段要对到一个好感度门限上。本节把《雾港夜航》六个角色按 cold/warm/trust 三门限做对齐，用「乐观最早跨越节拍」当上界：连把正向选项全选一遍都没能在声明转折节拍前越过门限的，就一定是错位。18 条里查出 4 条错位——砚的阶段①落后 4 拍，林与孩的 trust 门在乐观路径上都够不到。</description></item><item><title>6.2 节拍表：把结构写成 beat 序列</title><link>https://plumephp.com/narr-arch-06-2-beat-sheet-structure-sequence/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-06-2-beat-sheet-structure-sequence/</guid><description>节拍表把结构写成一行一拍的 beat 序列，于是「顺序」变成可校验的约束：act 必须单调不减、scene 必须存在于 scene_graph、节点所属幕必须与节拍所属幕一致、每个场景节点至少被一拍覆盖。本节用可跑的 S 层脚本逐条校验并打印《雾港夜航》的 16 行节拍表。</description></item><item><title>7.1 场景图：节点、边与入口条件</title><link>https://plumephp.com/narr-arch-07-1-scene-graph-node-edge-entry-condition/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-07-1-scene-graph-node-edge-entry-condition/</guid><description>场景图把 14 个场景写成一张图：节点带 enter_when，16 条边里 11 条无条件、5 条带条件。本节做结构校验（每条边两端都在 nodes 里）与邻接表，并用纯 xml.etree 出一张按幕分列的场景图 SVG；其中 5 个场景只有带条件的入口边，可达性完全取决于状态。</description></item><item><title>7.3 顺序约束与解锁</title><link>https://plumephp.com/narr-arch-07-3-ordering-constraint-unlock/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-07-3-ordering-constraint-unlock/</guid><description>带条件的边是顺序约束：lighthouse_base 到 tide_cave 要先有 knows_tide_rule。本节把 5 条约束折成一张表，做两项判定——环检测（DFS 三色法加 Kahn 拓扑序，实测无环）与「不可达的解锁条件」（钥匙会不会锁在门后，实测 0 条），并输出约束表 CSV。</description></item><item><title>8.3 假选择与真后果的判定</title><link>https://plumephp.com/narr-arch-08-3-fake-choice-real-consequence/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-08-3-fake-choice-real-consequence/</guid><description>一个选项是假选择，当且仅当它不改变任何状态，且与其他选项在终局可达集上不可区分。判据写死在脚本里，不按结果调参。本节用 S 层脚本对《雾港夜航》的 115 个选项逐个判定：空效果选项 16 个，其中 12 个仍判真后果，真正判为假选择的只有 4 个。</description></item><item><title>9.3 条件与状态的闭包检验</title><link>https://plumephp.com/narr-arch-09-3-condition-state-closure-check/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-09-3-condition-state-closure-check/</guid><description>闭包检验问三件事：条件引用的名字是否都声明过、是否都在某条可达路径上被写过、每个条件位点是否都在至少一个可达状态上取真。S 层脚本重跑一次完整枚举给出报告：52 个条件位点全部取真过，死条件 0 个；另附敏感性自检，证明检验器对注入的静态与动态缺陷都会报警。</description></item><item><title>电子书籍</title><link>https://plumephp.com/posts/books/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0800</pubDate><guid>https://plumephp.com/posts/books/</guid><description>按领域与学习阶段整理的在线电子书与创作手记。覆盖 Rust、Lua、TypeScript、Python、Java（Spring Boot）、Go、AI Agent、MMO 服务器开发（Go 主线 + Java 21 双栈对照，四卷本 180 篇）、游戏开发（含 Cocos 四卷本与《游戏引擎实现原理》四卷本）、SLG 游戏产品设计（产品架构与经济系统 + 数值平衡与商业化运营，两卷本 100 篇）、小游戏开发实战（市场品类与产品设计 + 引擎实现与体验打磨 + 上线变现与长线运营 + 商业运营实战 + 跨平台发行与出海，五卷本 250 篇）、游戏美术与技术美术（美术制作与视觉规范 + 技术美术与管线工程 + 风格与品类美术实战，三卷本 150 篇）、游戏设计（玩法机制与可执行规格 + 策略、涌现与体验度量 + 原型、可玩性与品类，三卷本 150 篇）、计算机图形学（几何、变换与光栅化 + 着色、光照与纹理 + 光线追踪与全局光照，三卷本 150 篇）、叙事策划与叙事工艺（叙事结构与可执行规格 + 叙事引擎与分支系统 + 叙事体验与路径度量，三卷本 150 篇）与文学创作，从阅读指南进入，或按全书目录查找章节。</description></item></channel></rss>