<?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/%E5%8F%99%E4%BA%8B%E7%BB%93%E6%9E%84/</link><description>Recent content in 叙事结构 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 16 Oct 2026 23:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E5%8F%99%E4%BA%8B%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>15.3 规模告警</title><link>https://plumephp.com/narr-sys-15-3-scale-warning/</link><pubDate>Fri, 16 Oct 2026 23:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-15-3-scale-warning/</guid><description>给规模定四条软告警阈值：可达状态数 &gt; 1e7、单次 BFS &gt; 120 秒、峰值内存 &gt; 4 GB、单条路径步数 &gt; 40。当前规格四条全未越（9895423 状态、58.6 秒、2147.1 MB、31 步）；把 flag 放大到 30 后越过三条，而内存那条在两次复跑里一次越一次未越，脚本恒 exit 0。</description></item><item><title>15.2 求值与遍历的开销</title><link>https://plumephp.com/narr-sys-15-2-eval-traversal-cost/</link><pubDate>Fri, 16 Oct 2026 22:30:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-15-2-eval-traversal-cost/</guid><description>量叙事引擎的单位成本：单次 eval_cond 求值中位数 169.9 ns，一次完整 BFS 32 层 9895423 状态、峰值 frontier 2498621、19121205 次求值、60.8 秒、峰值内存 2153 MB。给出求值次数与规格规模的比值，并声明所有耗时都是本机 proxy，只做相对比较。</description></item><item><title>15.1 规格规模的增长</title><link>https://plumephp.com/narr-sys-15-1-spec-scale-growth/</link><pubDate>Fri, 16 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-15-1-spec-scale-growth/</guid><description>把同一份规格沿 flag、好感度、物品、节点四条轴分别放大一档，量 20 层内可达状态数与枚举耗时的增长：flag 18→30 时声明空间上界涨 4096 倍，实测可达只涨 2.096 倍；好感度轴单位倍率最高也只有 1.1285，远低于声明域的 101。给出规模表、增长阶与一张纯 xml.etree 生成的 SVG 曲线。</description></item><item><title>《叙事策划与叙事工艺》卷三《叙事体验与路径度量》· 全书目录与章节索引（50 篇）</title><link>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E4%BD%93%E9%AA%8C%E4%B8%8E%E8%B7%AF%E5%BE%84%E5%BA%A6%E9%87%8F/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E4%BD%93%E9%AA%8C%E4%B8%8E%E8%B7%AF%E5%BE%84%E5%BA%A6%E9%87%8F/</guid><description>《叙事策划与叙事工艺》卷三《叙事体验与路径度量》全 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，只做相对比较。</description></item><item><title>《叙事策划与叙事工艺》卷三《叙事体验与路径度量》目录</title><link>https://plumephp.com/narr-metric-toc/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-toc/</guid><description>《叙事策划与叙事工艺》卷三《叙事体验与路径度量》目录：16 章 48 节，把玩家路径变成可度量的对象——路径的表示与采样、分支覆盖率与缺口、结局分布熵、张力曲线与 MAE、后果可见性、节奏密度、好感度曲线形状、一致性残差，以及反推与演化回归。本页给出分工说明、六档可运行性口径与全书 16 章 48 节完整清单。</description></item><item><title>13.1 曲线的异常点定位</title><link>https://plumephp.com/narr-metric-13-1-curve-anomaly-localization/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-13-1-curve-anomaly-localization/</guid><description>曲线偏离目标时，怎么把它落到具体的节拍下标与场景？本节用残差向量做定位，造三个漂移场景：在路径上的单点、两个异常点，以及离路径的隐藏点。实测发现路径口径看不见没经过的节拍——b10 从 5 降到 4 时路径 MAE 仍为 0 毫，全曲线 MAE 才抬到 62 毫。可观测性决定了可识别性。</description></item><item><title>13.2 参数到曲线的反推</title><link>https://plumephp.com/narr-metric-13-2-parameter-to-curve-inversion/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-13-2-parameter-to-curve-inversion/</guid><description>给定一条目标张力曲线，反过来能求出哪些节拍标注？本节把「MAE 不超阈值」化成 sum 绝对值不超过 16 的整数约束，用逐位 DP 精确计数：达标解集有 6072047140 个，占全空间 5 的 16 次方的 39.8 千分。随机搜索 200000 次的经验命中率与精确比例吻合，而收紧到 62 毫时随机搜索一次都命不中。</description></item><item><title>13.3 反推的稳健性</title><link>https://plumephp.com/narr-metric-13-3-inversion-robustness/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-13-3-inversion-robustness/</guid><description>解集有多大是一回事，稳不稳是另一回事。本节用两条轴量反推的稳健性：把目标曲线的 b10 从 5 挪到 4，在可枚举的预算上精确求新旧解集的交集与 Jaccard 千分；再把 MAE 阈值从 0 毫扫到 2000 毫看解集规模的相变。结论是解集近稳但规模巨大，曲线达标推不出唯一标注。</description></item><item><title>2.1 采样策略：随机、贪心、穷举</title><link>https://plumephp.com/narr-metric-02-1-sampling-strategy-random-greedy-exhaustive/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-02-1-sampling-strategy-random-greedy-exhaustive/</guid><description>一张 48 节点、115 个选项的故事图，一条确定性路径只走 25 条边（446‰），远低于 850‰ 的目标。本节把随机、贪心、穷举三种采样策略放进同一路径预算对照，量出各自覆盖多少条对话边、到达几个结局，并解释为什么穷举是覆盖率的基准而不是一种采样。</description></item><item><title>2.2 分支覆盖率的度量</title><link>https://plumephp.com/narr-metric-02-2-branch-coverage-metric/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-02-2-branch-coverage-metric/</guid><description>分支覆盖率是一个整数千分比：走过的对话边 × 1000 整除全部对话边。本节先声明两层分母口径（去重边 56 与选项 115），再把单条确定性路径、采样 N 条、BFS 穷举三个来源放进同一张表，量出边、节点、场景三层覆盖，并给出 446‰ 与 1000‰ 的口径来源。</description></item><item><title>2.3 覆盖的缺口与告警</title><link>https://plumephp.com/narr-metric-02-3-coverage-gap-warning/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-02-3-coverage-gap-warning/</guid><description>覆盖率给一个总数，缺口给一张名单。本节对随机采样 N=100 条路径逐边计数，定位那条从未被走过的边——门条件为 bell_rung 的真相结局入口，源节点访问了 100 次却没选中它；再用采样规模与种子的参数扰动给出软告警口径，低于 850‰ 只记 WARN、恒 exit 0。</description></item><item><title>3.1 结局分布的熵</title><link>https://plumephp.com/narr-metric-03-1-ending-distribution-entropy/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-03-1-ending-distribution-entropy/</guid><description>结局熵有四个数，混在一起就错。本节把上界 2321 毫比特、单路径 0 毫比特、路径采样 1714 毫比特、状态枚举 1888 毫比特分开报，并讲清「上界不是实测值」——一条路径只到一个结局，它的熵恒为 0。全部整数、毫比特取整，seed=20261016 可复现。</description></item><item><title>3.2 分支的平衡与偏斜</title><link>https://plumephp.com/narr-metric-03-2-branch-balance-skew/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-03-2-branch-balance-skew/</guid><description>20000 条路径逐边计数，把「分支被走得均不均匀」变成整数：分支覆盖率 1000‰、进入次数中位 4173、偏斜度 gini 373‰、头部集中度 29‰。再用偏置强度 b 从 0 扫到 1000 看相变——覆盖先掉、偏斜先抬、稀有结局先消失，软告警恒 exit 0。</description></item><item><title>3.3 结局可达性的回归</title><link>https://plumephp.com/narr-metric-03-3-ending-reachability-regression/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-03-3-ending-reachability-regression/</guid><description>回归的精确含义是「基线可达、改动后不可达」。本节用 BFS 精确口径枚举基线可达的 5 个结局，掐断真相的唯一入边后静态死条件分析报出回归；再把灯守的阈值门从 0 扫到 101，用 Y*=100 定位它由可达变不可达的临界点，软告警恒 exit 0。</description></item><item><title>5.1 张力从哪里来：叙事节拍</title><link>https://plumephp.com/narr-metric-05-1-tension-source-narrative-beat/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-05-1-tension-source-narrative-beat/</guid><description>张力在本卷里不是从机制里长出来的，而是作者在规格里标注的：真源的 beats 是 16 个节拍，每个带一个整数 1 到 5 的 tension。本节只读这份标注，不跑任何仿真，就把它按幕切开、算出分布直方图与峰值位置，并给出 beats 字段表与三条整数不变量，全部数字来自本机实跑。</description></item><item><title>5.2 张力与释放的节拍计算</title><link>https://plumephp.com/narr-metric-05-2-tension-release-beat-computation/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-05-2-tension-release-beat-computation/</guid><description>把节拍张力沿一条真实路径串成曲线：走确定性首选项策略，取出路径经过场景上的 11 个节拍，得到张力曲线 1 2 3 2 3 4 4 3 4 4 2，再切出上升段、平台段与回落段，定位峰值与谷值，并算它与目标曲线的 MAE。本节如实说明：当前规格下 MAE 恒为 0，因为标注与目标逐项相同。</description></item><item><title>5.3 与机制张力的分工</title><link>https://plumephp.com/narr-metric-05-3-mechanic-tension-division/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-05-3-mechanic-tension-division/</guid><description>本章的张力来自叙事节拍结构，不是机制动力学。本节把这条边界跑成可核对的数：递归展开真源，叙事侧词元命中 143 次，机制侧词元 hp、damage、resource、turn 等命中 0 次——机制张力在这份规格上根本无法计算。分工不是一句口号，而是输入清单的差集。</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.2 阈值触达的分布</title><link>https://plumephp.com/narr-metric-08-2-threshold-hit-distribution/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-08-2-threshold-hit-distribution/</guid><description>把 14 道好感度阈值门（13 条选项门 + 1 条结局门）抽平，定义路径触达为「变量沿路径最大值 &gt;= 门限」。实测 5000 条采样路径里 18 条（3‰）从未触达任何门，yan&gt;=25 的触达率最高 858‰。B 层把每道门限 ±10 后重走路径：14 道门全部改变了触达率，只打印软告警、exit 0。</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>9.1 一致性残差的度量</title><link>https://plumephp.com/narr-metric-09-1-consistency-residual-metric/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-09-1-consistency-residual-metric/</guid><description>把「声明」与「行为」对齐后统计失配计数：声明来自角色的 affinity / secret、派系 stance 与规则，行为来自选项的 when / effects 与采样路径。本节把一致性残差量成四个整数——声明域 D、秘密 K、立场 S、规则 R，并沿 2000 条路径量路径实现率，全部显式声明为 proxy。</description></item><item><title>9.2 设定-行为对齐的回归</title><link>https://plumephp.com/narr-metric-09-2-setting-behavior-alignment-regression/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-09-2-setting-behavior-alignment-regression/</guid><description>一致性残差只有能在规格改动后朝正确方向移动，才是可用的回归信号。本节在内存克隆上做七种规格变异——补声明域、给秘密与禁则加门、清掉立场提供者，以及一次故意的回归——把残差重算成一张回归表，再用修复阶梯与信任门两条扫描检查单调性。残差全部是代理指标，只做相对比较。</description></item><item><title>9.3 失调的告警阈值</title><link>https://plumephp.com/narr-metric-09-3-dissonance-warning-threshold/</link><pubDate>Fri, 16 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/narr-metric-09-3-dissonance-warning-threshold/</guid><description>残差算出来了，可超过多少才算告警？本节把阈值写成一条显式策略：先算声明基数当分母，取它的四分之一作默认阈值，再把上一节的七种规格变异逐个判定；最后扫描阈值的取值区间，看清阈值过紧与过松各自把告警变成什么样。残差与残差率全部是代理指标，只做相对比较。</description></item><item><title>《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》· 全书目录与章节索引（50 篇）</title><link>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E5%BC%95%E6%93%8E%E4%B8%8E%E5%88%86%E6%94%AF%E7%B3%BB%E7%BB%9F/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E5%BC%95%E6%93%8E%E4%B8%8E%E5%88%86%E6%94%AF%E7%B3%BB%E7%BB%9F/</guid><description>《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》全 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。</description></item><item><title>《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》目录</title><link>https://plumephp.com/narr-sys-toc/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-toc/</guid><description>《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》目录：16 章 48 节，把 story_spec.json 变成可执行的对话状态机——条件求值、效果应用、确定性回放、状态空间穷举、可玩原型与跨语言摘要。本页给出分工说明、六档可运行性口径与全书 16 章 48 节完整清单。</description></item><item><title>16.3 交付卷三</title><link>https://plumephp.com/narr-sys-16-3-deliverable-handoff-volume3/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-16-3-deliverable-handoff-volume3/</guid><description>卷二交付给卷三《叙事体验与路径度量》的五类接口：规格段、内核函数、仿真产物、原型产物、判据与容差。本节用自检脚本逐项核对磁盘上的段、函数、产物与阈值，再用 W 层脚本在浏览器里复算 16.2 的锚点摘要，并声明边界——本卷只交结构量，体验度量归卷三。</description></item><item><title>5.1 状态空间的规模</title><link>https://plumephp.com/narr-sys-05-1-state-space-scale/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-05-1-state-space-scale/</guid><description>一个状态等于节点乘以 4 个好感度、18 个 flag、9 个物品。本节先算出朴素上界 48 × 101 的四次方 × 2 的 18 次方 × 2 的 9 次方约 6.70×10 的 17 次方，再用 BFS 完整枚举跑出真实可达的 9895423 个状态，并把两者相差约 11 个数量级的来源拆成好感度值域、flag 与物品位图、变量相关性三层。</description></item><item><title>5.2 可达状态的枚举</title><link>https://plumephp.com/narr-sys-05-2-reachable-state-enumeration/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-05-2-reachable-state-enumeration/</guid><description>逐层 BFS 把 9895423 个可达状态一层层展开：给出每一层的新增与累计、峰值 frontier，以及 4 个好感度变量的实际值域。去重键是状态的规范串，层号就是最短步数。本节贴出 32 层完整输出，并给出预算 12000000 与峰值内存 3132.8 MB 的口径。</description></item><item><title>5.3 不可达节点与孤儿结局</title><link>https://plumephp.com/narr-sys-05-3-unreachable-node-orphan-ending/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-05-3-unreachable-node-orphan-ending/</guid><description>把「不可达」拆成两种口径：节点不可达（BFS 从未落到它）与选项不可达（它的 when 在任何可达状态下都不成立）。实测两者都是 0，5 个结局全部可达、孤儿结局 0、分支覆盖率 1000‰。另报告规格层面的一处欠声明：节点 d_lt_2 声明了 line_when 却没有 line_else。</description></item><item><title>7.1 分支宽度的度量</title><link>https://plumephp.com/narr-sys-07-1-branch-width-metric/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-07-1-branch-width-metric/</guid><description>宽度就是一个节点的出度：同时摆在玩家面前的选项数。本节给 48 个对话节点量出度，实测直方图是 5 个 0 出度、16 个 2 出度、26 个 3 出度、1 个 5 出度，最宽的一步是 d_dq_2 的 5 个选项；再按边距离分 23 层看每层宽度，并把 115 个选项去重成 56 条唯一跳转、47 个不同目标。</description></item><item><title>8.1 好感度的状态机</title><link>https://plumephp.com/narr-sys-08-1-affinity-state-machine/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-08-1-affinity-state-machine/</guid><description>好感度是一台受钳位约束的整数状态机：状态 = 节点 + 4 个好感度整数 + 18 个 flag + 9 个物品。本节把《雾港夜航》的完整状态空间 BFS 一遍，实测四个变量的可达值域分别是 yan 21、hui 35、shen 12、mu 16，值域之积 141120，而真正可达的好感度四元组只有 87190——四个变量之间并不独立。P 层用同一批选项断言初值来源、add 累加与钳位。</description></item><item><title>8.2 阈值门与门限扰动</title><link>https://plumephp.com/narr-sys-08-2-threshold-gate-perturbation/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-08-2-threshold-gate-perturbation/</guid><description>好感度的分段在规格里就是一串 [aff, 名, &gt;=, 整数] 阈值门，长在选项 when、节点 line_when、结局 when 三处。本节把 15 条门限全抽出来，再逐条扰动 ±5，在同一采样口径下重算覆盖率与可达结局集合，找出 4 条临界门限；并如实说明为什么放宽 5 点不起作用而收紧 5 点才起作用——基线覆盖率已饱和在 1000‰。B 层只打印 WARN，退出码 0。</description></item><item><title>8.3 好感度的不变量</title><link>https://plumephp.com/narr-sys-08-3-affinity-invariant/</link><pubDate>Fri, 16 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/narr-sys-08-3-affinity-invariant/</guid><description>四条必须恒为 0 的残差：钳位（可达状态与转移后都在 [0,100] 内）、初值（每个声明角色的 init 落在自身 range 内）、累积口径（新值恒等于 clamp(旧值 + add)，set 不写好感度）、门限可达性（15 条门限均可跨过）。四条残差合计 0；lin 与 hai 有 affinity 声明却不在 state.vars，按「声明未用=报告，用了未声明=FAIL」报告。</description></item><item><title>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》· 全书目录与章节索引（50 篇）</title><link>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E7%BB%93%E6%9E%84%E4%B8%8E%E5%8F%AF%E6%89%A7%E8%A1%8C%E8%A7%84%E6%A0%BC/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/posts/books/%E5%8F%99%E4%BA%8B%E7%BB%93%E6%9E%84%E4%B8%8E%E5%8F%AF%E6%89%A7%E8%A1%8C%E8%A7%84%E6%A0%BC/</guid><description>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》全 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 章）把故事还原成结构：四个最小构成、九段骨架、文本是渲染的分工、字段全表与版本迁移、世界观与角色的形式化；第二部分（第 5–8 章）把结构还原成图与曲线：弧光的可达性、节拍与三种结构模型、场景图的可达性与解锁、分支拓扑与假选择判定；第三部分（第 9–12 章）把条件与数值写透：条件文法与写入域、状态变量的闭包检验、好感度阈值门与曲线形状、对话树的遍历与校验、文本模板与条件变体；第四部分（第 13–16 章）做校验与装配：结构/语义/一致性三层校验、叙事失调的形式化、工具链的目录分工与流水线，最后装配成一份规格三处消费的完整链路并交付卷二。按章节提供仿真、逻辑内核与原型；当前试点阶段已有复核记录，完整项目的配置、共享模块和交付验收仍在补齐。全书数字均来自本机实跑：可达状态 9895423 个，分支覆盖率 1000‰，不可达节点与不可达选项均为 0。</description></item><item><title>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》目录</title><link>https://plumephp.com/narr-arch-toc/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-toc/</guid><description>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》目录：16 章 48 节，把一个故事写成可执行规格 story_spec.json，让同一份规格被 S 层穷举、P 层确定性内核与 B 层参数扰动三处消费，产出逐位一致的状态摘要。本页给出七处分工说明、六档可运行性口径、《雾港夜航》规格总览与全书 16 章 48 节完整清单。</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.2 从故事到结构：叙事规格的骨架</title><link>https://plumephp.com/narr-arch-01-2-story-to-structure-spec-skeleton/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-01-2-story-to-structure-spec-skeleton/</guid><description>一份散文大纲要变成可执行的规格，中间隔着一层「骨架」：meta 头部加九段内容字段。本节给出散文语句到字段的逐句映射表，列出 world、characters、beats、scene_graph、dialogue、conditions、state、endings、metrics 九段各自承载什么，并用一份 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.2 阈值门</title><link>https://plumephp.com/narr-arch-10-2-threshold-gate/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-10-2-threshold-gate/</guid><description>阈值门就是条件里的 ['aff', 名, '&gt;=', 整数]：它可能长在选项的 when、节点的 line_when 或结局的 when 上。S 层把全规格 15 条门限抽成一张表，在 20000 条采样路径上给出每条门限的跨越率、最高到达与缺口，基线 0 条死门；P 层断言门限未达时选项不可选、恰好达到时可选的边界行为。</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>11.3 对话树的遍历与校验</title><link>https://plumephp.com/narr-arch-11-3-dialogue-tree-traversal-validation/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-11-3-dialogue-tree-traversal-validation/</guid><description>把 48 个对话节点当成一张有向图，环、不可达节点、死路三类缺陷就都成了可判定的性质。本节用 DFS 三色标记找环、BFS 从起点算可达性与层号，实测三类缺陷均为 0：115 条选项去重后只有 56 条唯一跳转，5 个无出口节点全是结局，与 na_00 的 BFS 状态空间穷举口径互证。</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>13.1 结构校验：孤儿节点与断链</title><link>https://plumephp.com/narr-arch-13-1-structure-validation-orphan-broken-link/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-13-1-structure-validation-orphan-broken-link/</guid><description>结构校验只问图的形状：孤儿（无人指向且非起点）、断链（goto 指向不存在的节点）、死路（无选项且无结局标记）。S 层脚本对对话图与场景图逐类检测，实测三类缺陷均为 0；P 层用人为注入的三个负例断言检测器真的会开火，而不是只会返回空列表，起点则是唯一的豁免。</description></item><item><title>13.2 语义校验：可满足性与死条件</title><link>https://plumephp.com/narr-arch-13-2-semantic-validation-satisfiability-dead-condition/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-13-2-semantic-validation-satisfiability-dead-condition/</guid><description>死条件 = 条件引用的状态量在到达该节点前不可能取到所需值。判定用对话图上的可达区间前向不动点：区间过近似、不按条件剪枝，故「过近似都说够不着」才是真死条件。S 层复跑显示当前 0 个死条件；正文如实交代曾经有过的 4 个、各自的成因与修法。</description></item><item><title>13.3 一致性校验</title><link>https://plumephp.com/narr-arch-13-3-consistency-validation/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-13-3-consistency-validation/</guid><description>一致性 = 声明域与使用域的差集。S 层脚本输出一张一致性报告表：14 项逐项给出声明数、使用数、两个方向的差集与判定。实测「使用未声明」为 0；真实发现是 lin/hai 声明了 affinity 却不在 state.vars、d_lt_2 有 line_when 无 line_else，以及 7 个 flag 与 fog_glass 被写却从未被读。</description></item><item><title>14.1 叙事失调的形式化</title><link>https://plumephp.com/narr-arch-14-1-ludonarrative-dissonance-formalization/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-14-1-ludonarrative-dissonance-formalization/</guid><description>「叙事失调」通常是主观说法：故事说一套、玩法做一套。本节把它形式化为可判定的失配——设定声明的规则、立场与秘密，与规格实际允许玩家做的事之间的差集，给出 R / S / K 三类判定口径，并在《雾港夜航》上实跑得到残差 6。这是代理指标，只做相对比较，不声称「更协调」。</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.1 规格、仿真、内核、原型的目录分工</title><link>https://plumephp.com/narr-arch-15-1-spec-sim-kernel-prototype-directory-division/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-15-1-spec-sim-kernel-prototype-directory-division/</guid><description>《雾港夜航》的工具链分成五层：config/ 是唯一真源，sim/ 用 Python 穷举与校验，core/ 是 TypeScript 确定性内核并被 sim 的产物交叉验证，web/ 把内核内联进单文件 HTML，out/ 收三层产物。本节给出实测目录清单、每层的读写边界，以及「改一个文件会影响谁」的影响面反查。</description></item><item><title>15.2 从规格到校验的流水线</title><link>https://plumephp.com/narr-arch-15-2-spec-to-validation-pipeline/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-15-2-spec-to-validation-pipeline/</guid><description>从改规格到产物核对是一条五环流水线：结构校验与语义校验、规格解析、跨语言摘要、内核门禁、产物核对。本节给出逐条本机真跑过的命令，用一个 S 层驱动把五环串成一次执行，再用一个 P 层门禁断言这份报告不是过期快照，并给出各环的时间账与取舍口径。</description></item><item><title>16.1 叙事规格的装配检查表</title><link>https://plumephp.com/narr-arch-16-1-narrative-spec-assembly-checklist/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-16-1-narrative-spec-assembly-checklist/</guid><description>装配检查表把前面十五节的判定收成十项可断言的检查：九段字段齐备、引用完整、写入域合法、整数不变量残差 0、规模对账、结局节点一致、死条件 0、覆盖率达目标、结局全部可达、卡死路径 0。S 层脚本逐项跑出 PASS/FAIL 表，十项全绿才算装配完成。</description></item><item><title>16.3 交付卷二</title><link>https://plumephp.com/narr-arch-16-3-deliverable-handoff-volume2/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-16-3-deliverable-handoff-volume2/</guid><description>卷一交付给卷二《叙事引擎与分支系统》的四类接口：规格段、内核函数、仿真产物、判据与容差。本节用一份自检脚本逐项核对磁盘上的段、函数、产物与阈值，给出交付清单表与验收口径的迁移表，并声明边界——卷二接住执行，不重写条件文法、不重算穷举、不另立真源。</description></item><item><title>2.1 story_spec.json 的字段全表</title><link>https://plumephp.com/narr-arch-02-1-story-spec-field-table/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-02-1-story-spec-field-table/</guid><description>把《雾港夜航》的 story_spec.json 逐段摊开：顶层十个键里九段承载数据、conditions 只声明文法。给出字段名、类型、必填与消费方，再用 S 层脚本审计每个声明项是否真被引用、P 层类型声明是否与 JSON 逐项对齐，两边都不留未对齐字段。</description></item><item><title>2.2 模式校验与语义校验</title><link>https://plumephp.com/narr-arch-02-2-schema-and-semantic-validation/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-02-2-schema-and-semantic-validation/</guid><description>模式校验挡「字段写错了」，语义校验挡「字段写对了却指向不存在的东西」。本节把这两类失效分开处理，给出六项校验的 Python 实现与真源 0 违规的实测结果，再对真源做三处定向破坏，确认对应校验会开火且无连带误报，TS 侧复用同一套判据求值。</description></item><item><title>2.3 规格的版本与迁移</title><link>https://plumephp.com/narr-arch-02-3-spec-version-migration/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-02-3-spec-version-migration/</guid><description>meta.spec_version 是迁移的判据。本节给出字段增删的兼容性规则，并用一个迁移脚本演示 v1 到 v2 的向前兼容：读 v1 规格、补默认值、产出 v2，再用 v1 投影摘要断言旧字段语义不变，且 Python 与 TS 两侧摘要一致。</description></item><item><title>3.1 派系、地点与规则</title><link>https://plumephp.com/narr-arch-03-1-faction-location-rule/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-03-1-faction-location-rule/</guid><description>世界观在规格里是三组可校验的字段：4×4 的派系 stance 矩阵表达谁与谁对立，地点 unlock_when 表达空间解锁，rules 表达可检查的约束。本节用一个 S 层脚本把三者都读成可判定的量，逐对检验 stance 矩阵的反对称性，校验 14 个地点的解锁条件与提供者，并把 4 条自然语言规则整理成待绑定的清单。</description></item><item><title>3.2 设定的一致性：冲突检测</title><link>https://plumephp.com/narr-arch-03-2-setting-consistency-conflict-detection/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-03-2-setting-consistency-conflict-detection/</guid><description>设定冲突不是「感觉」，而是三种可判定的结构问题：立场失衡（带符号环的符号积为负）、地点解锁成环（互相依赖）、同一条规则被两个来源反证。本节用一个 S 层脚本各写一个检测器，在真规格上得到 0 死锁 / 0 失衡环 / 0 双源反证，再用三份注入式坏规格证明检测器真的会报错，而不是恒返回「无冲突」。</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.3 关系的不对称与变化</title><link>https://plumephp.com/narr-arch-04-3-relationship-asymmetry-change/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-04-3-relationship-asymmetry-change/</guid><description>关系有两副面孔：一副是矩阵里静态的不对称，一副是沿路径动态的变化。本节用自实现 MINSTD 采样 20000 条路径，输出 4 个好感度变量的「初始值 → 终局值」分布表，断言整数不变量残差为 0，并统计出 15 对关系里 13 对不对称、2 对差距达到 20。</description></item><item><title>5.1 弧光的阶段与转折</title><link>https://plumephp.com/narr-arch-05-1-arc-stages-turning-points/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-05-1-arc-stages-turning-points/</guid><description>弧光在规格里就是两个数组：三个 stages 阶段名，加三个 beats 转折节拍号。本节把《雾港夜航》六个角色的弧光写成阶段表，并用 S 层脚本校验三阶段、三节拍号、严格递增、落在 1..16 的范围内；顺带暴露 b12 与 b16 被两个角色同时声明为转折点的结构拥挤。</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>5.3 弧光的可达性</title><link>https://plumephp.com/narr-arch-05-3-arc-reachability/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-05-3-arc-reachability/</guid><description>乐观上界只说明「够得到」，不等于「走得到」。本节真的跑两万条采样路径，逐条记录六个角色的好感度峰值，看它是否越过 stages 对应的三个门限。结果是 15/18 可达、3 条不可达（全部落在林与孩身上）；更耐读的是「可达」内部的落差——砚的 trust 只有 4‰ 的路径走到，沈的有 112‰。</description></item><item><title>6.1 三幕、五幕与起承转合</title><link>https://plumephp.com/narr-arch-06-1-three-act-five-act-kishotenketsu/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-06-1-three-act-five-act-kishotenketsu/</guid><description>三幕、五幕与起承转合不是三种故事，而是对同一份 beats[].act 的三套分段规则：三幕按 act 直接分组得 3 段，五幕把首尾两幕各对半切得 5 段，起承转合把第二幕对半切得 4 段。本节用可跑的 S 层脚本把《雾港夜航》16 个节拍映射到三种模型，逐条对比分段边界。</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>6.3 结构与节奏的比例检验</title><link>https://plumephp.com/narr-arch-06-3-structure-rhythm-proportion-check/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-06-3-structure-rhythm-proportion-check/</guid><description>比例检验把「三段差不多长」「后面更紧张」这类印象换成整数：各幕拍数 5/6/5 折成千分比 312/375/312，张力均值 2000/3666/4000‰，峰值位置落在第 4、10、13/14 拍。本节给出可跑的 S 层脚本与纯 xml.etree 的各幕张力分布 SVG，并断言第三幕峰值不低于前两幕。</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.2 场景的可达性</title><link>https://plumephp.com/narr-arch-07-2-scene-reachability/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-07-2-scene-reachability/</guid><description>把带条件的边当作「可能通」后，场景图上的 BFS 给出结构可达性：14 个场景全部可达，但 5 个场景（counting_house、watch_post、tide_cave、harbor_office、drowned_bell）的入口边全部带条件，可达性完全取决于状态。本节给出入度、出度、最少跳数与最早出现幕四列。</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.1 分支拓扑：分叉、汇聚、并行</title><link>https://plumephp.com/narr-arch-08-1-branch-topology-fork-merge-parallel/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-08-1-branch-topology-fork-merge-parallel/</guid><description>分支拓扑把对话图读成三种原语：分叉是一出多、汇聚是多入一、并行是两条互不可达的去向。本节用 S 层脚本对 48 个节点统计出度与入度，找出全部 9 个分叉点与 8 个汇聚点，再用支配点算法分离出 4 个「所有路径必经」的强制汇流点，最后落出一张 48 行的拓扑表。</description></item><item><title>8.2 宽度与深度</title><link>https://plumephp.com/narr-arch-08-2-width-and-depth/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-08-2-width-and-depth/</guid><description>宽度是一个节点同时可选的选项数，深度是从起点到终局走过的边数。本节用 S 层脚本量出《雾港夜航》的平均宽度 2.67、最大宽度 5，并用两条口径量深度：全部 450208471680 条结构路径的长度只取 22/25/28/31 四个值，而采样 20000 次的均值是 25.41 步。</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.2 状态变量</title><link>https://plumephp.com/narr-arch-09-2-state-variables/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-09-2-state-variables/</guid><description>三类状态（flag 布尔 18 个、好感度整数 4 个、物品 9 个）与四个效果算子的写入域一一对应：set 只写 flag、add 只写好感度、grant 与 revoke 只写物品。S 层脚本逐条校验越域并统计每个变量的被写次数，实测 138 条写入全部落在域内，revoke 一次未被使用。</description></item><item><title>附录 A 叙事规格字段表、条件文法与数据集索引</title><link>https://plumephp.com/narr-arch-appendix-a/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-appendix-a/</guid><description>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》附录 A：把全卷 16 章 48 节散落的叙事规格九段字段、嵌套数组条件文法与十一条整数不变量汇成索引表，给出卷内文件命名约定、S/P/W 三层完整复现命令与排错顺序，并附一段 Python 与 TypeScript 逐位一致的跨语言状态摘要，作为「文本是规格的渲染」的可验证落点。</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>