<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》· 全书目录与章节索引（50 篇） on PlumePHP</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><description>Recent content in 《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》· 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 16 Oct 2026 10:00:00 +0800</lastBuildDate><atom:link href="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/index.xml" rel="self" type="application/rss+xml"/><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.1 好感度的初始化与增减</title><link>https://plumephp.com/narr-arch-10-1-affinity-init-delta/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-10-1-affinity-init-delta/</guid><description>好感度只有两个动作：从 characters[].affinity.init 起一个整数，之后每次写入都走 add 再夹回 [0,100]。S 层静态清点出 4 个变量共 66 次写入、8 种增量，并点出声明了却从不推进的 lin 与 hai；P 层用 300 条采样路径断言值域恒定，并以「把某个 add 放大到百万级仍被夹回」的负例证明 clamp 不是冗余算子。</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>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>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>14.3 一致性的残差与告警</title><link>https://plumephp.com/narr-arch-14-3-consistency-residual-warning/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-14-3-consistency-residual-warning/</guid><description>把一致性写成一个整数：残差 = 规则失配 R + 立场失配 S + 秘密失配 K + 对齐缺口 A，本案例基线为 7。本节是 B 层：对门有效阈值、好感度初值、节拍密度做扰动，观察残差与覆盖率的相变——残差在阈值越过 60 时阶跃（7→9），覆盖率随初值连续下滑（−10 时 895‰），输出 3 条软告警但 exit 0。</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>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.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.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>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.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>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.1 条件表达式：旗标、数值、持有</title><link>https://plumephp.com/narr-arch-09-1-condition-expression-flag-value-possession/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/narr-arch-09-1-condition-expression-flag-value-possession/</guid><description>条件是嵌套数组写成的表达式树：三种叶子（旗标 / 好感度比较 / 物品持有）与三种组合（and / or / not）构成完整文法。本节给出文法表，并用 node --test 逐条验证六种形式的正例与负例。实测全规格 58 个条件节点，实际用到 5 种形式——or 声明了却一次没用。</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>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>附录 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></channel></rss>