# workflow-chapter.md:单章正文工作流(Phase 4-5) 每章按本文件执行,日更批次见 `workflow-daily.md`。**缺文件先修,本轮不写**:`tracking_commit.py check` 不过、缺 `_tracking-state.json`、登记了对标却缺情绪模块/节奏/文风时,读 [stop-and-fix.md](stop-and-fix.md) 照做(作者定了不对标、或组装报告召回降档成立时不算缺);修好再从步骤 1 开始。 **缺细纲**:写指定章时按 workflow-outline.md 模板补建点名章细纲(目标情绪、主角目标/关键选择须明确,其余未知写 `[待补充]`),跑 `check-outline-contract.js` 验收再写,汇报里说补了什么;日更批内停在该章前问作者。旧细纲只缺字段时照旧字段写,不回写。 **工作目录**:本章临时文件(前组.md、后组.md、writer_prompt.md、tracking.json)只放书目录下 `.story/work/第NNN章/`,不写系统 `/tmp`、`正文/`、`大纲/` 或书根;提交成功后脚本自动删除。 --- ## 单章写作流程 新书还没有 `_tracking-state.json` 时先按 [tracking-initialization.md](tracking-initialization.md) 初始化。 1. **检查细纲**:读 `大纲/细纲_第{N}章.md` 全文,取「单元ID/位置」,跑 `outline_view.py --unit {单元ID} {卷纲路径}` 取卷契约、全卷常任裁定、当前剧情单元与终局底牌边界(日更同单元本批复用,不重跑)——**不整读卷纲**。缺细纲或缺字段见开头「缺细纲」。 2. **读取上下文**:`tracking_commit.py check`(取 `last_committed_chapter` / `state_revision`,完整 state 不进 prompt)→ `追踪/上下文.md` 全 7 栏 → 细纲点名的 `设定/势力/`、`设定/世界观/` 相关条目(为「必读设定」槽摘句);角色卡交给写手时只在「涉及角色」列名字、由写手读,主会话自己写时才读。上一章结尾由脚本代读,承接存疑才自己读。久别角色读 `追踪/角色状态/{名}.md`;更旧的信息按 workflow-daily「旧信息查找步骤」定点查。 3. **写前准备**: - **先跑组装脚本**:`{PYTHON} {skill 根}/scripts/build_writer_prompt.py --project {项目根} --chapter {N} --out`。`====` 以上是 prompt、以下是核对报告;退出码 2 =数据问题,修完重跑,不手拼绕过。 - **状态筛选**:从续写状态卡取本章在场角色、要碰/要避的伏笔、必须履行的下一章承诺与相关长期约束,写成本节速记。 - **召回**:核对报告写「召回降档:成立」时直接用脚本给的情绪/节奏;不成立时才完整读取 [benchmark-recall.md](benchmark-recall.md) 执行全量召回。 - **意图确认**:一句话写清本章意图(例:「快节奏打脸——账单暴露→逼问→反证→公开代价」)。对照:细纲是唯一剧情蓝图,新增物按「新增物三级」;底牌不因章尾钩子提前泄露;细纲重复的同一要求只兑现一次;爽点前有可指认的铺垫,打脸/揭露章写在场配角的差异反应。 - **契约风险**:细纲或单元卡标了需补强,把单元卡写的补强办法(交换、铺垫或成本)写进本章意图;标了契约破坏,先按 workflow-outline 补纲流程修纲再写;标契约安全的写前不重问,写后在步骤 9 核。 4. **资料研究**(按需):需查证外部事实时 spawn story-researcher 输出到 `参考资料/`,不可用则主会话查。 5. **标题预检**:看核对报告的重名结论;重名或明显重复才按核心事件改名,并同步细纲标题与正文文件名。 6. **写作准备**:交给写手时按 [agent-calls.md](agent-calls.md)「写一章」分前后两组交付;主会话自己写时也分两组:前组写到 `前组.md` 后跑一次 `storyctl.py wordcount checkpoint --file {前组} --project {项目根} --chapter {N}`,后组按 `remaining_user_range` 收、原文拼接;作者要一次成文才写全章。批准内容写完即停,不为字数加剧情;实际长度由步骤 8 收口。 7. **正文执行**:已部署 narrative-writer 时按 [agent-calls.md](agent-calls.md)「写一章」填槽交给它,交付后核对它只消费了批准情节点。未部署则主会话自己写:不填槽,按脚本输出与本节速记直接写,新增物自列申报表。写完逐段再看一遍检测器抓不住的三类 AI 腔:用工整对仗或金句替读者点题;叙述者跳出来总结情绪、解释动机、说出细纲的结论;章尾用感悟、升华或预告收。遇到就删,或改成人物的动作、对话、物件,让读者自己看出来。 8. **核情节点落点,再一次检测收口**: - 细纲每个情节点**至少出现一次**,漏即退回补写批准内容。不以字数为由。 - 运行 `{PYTHON} {skill 根}/scripts/storyctl.py chapter check --project {项目根} --chapter {N} --fix-punctuation`:一次整理标点并跑 AI 句式、`check-degeneration.js` 退化、细纲照搬与字数检测(去味管线:检测器 → 按检测器逐条提示的修法定点改写 → 复扫);文件改动后重跑,不再分别调各检测脚本。 - 按返回的 `status` 走:`ready` → 完成步骤 9-12 再提交。`blocked` / `invalid`(退出码 1)→ 就地修净再重跑。`needs_decision`(字数出带)→ 看 `available_actions`:欠字不补不重试,按字数问法请作者选;超字把删除区间随 `compress-once` 交 narrative-writer 一次净删、零新语义,复检仍带外也请作者选。`tool_unavailable`(退出码 3)→ 不提交,按 `quality.tool_errors` 说明具体原因;缺 Node 时提示安装 Node.js 18+。退出码 2(`status: error`)按 `error_code` 修命令。 9. **检查钩子、爽点与契约**:章尾有往下看的理由(低压/过场章留阶段目标即可);高压/推进章爽点到位;对着成稿过契约四问——主角是否靠自己的选择挣到本章结果?收益是否被配角、机构或巧合无交换地拿走?有没有提前动用后面的底牌?旧期待付利息、留新期待了吗?任一问不过就按问改:没挣到→让结果落在他的选择或判断上;收益被拿走→补交换或让他拿回控制点;提前用了底牌→换成本卷已解锁的手段;没付利息→给旧期待一个小兑现再留新钩。不达标只修批准内容,修后重跑步骤 8;需补强、契约破坏都在本章汇报里告诉作者。 10. **元信息扫描**:标题行以外清掉第X章、上一章、本章、前文、后文、伏笔、细纲、读者这类工程词,改成角色能感知的事件锚点(「比第一章那三秒开火更疼」→「比那三秒开火更疼」);角色真实读到「第X章」或本身是作者/读者的除外。 11. **检测结果处理**(按提示定点改写):严重度读作必须修 / 建议看 / 仅提示——检测器 blocking 与 checker 的 S1/S2 必须修,advisory 与 S3 建议看,S4 仅提示。`quality.blocking_findings` 就地改到净;`advisories` 逐条读原文判断,确属问题才改,不为归零机械改写。`formulaic-parallelism` 连同台词一起复核;细纲照搬里判定保留的补进细纲「复沓锚句」(这是登记,不算改大纲,不用暂停问作者)。禁用词表不整读,拿不准的二级词才查 `references/banned-words.md` 对应条目。改完只重跑步骤 8 复扫,不另安排全篇去味。 12. **更新追踪**:运行 `{PYTHON} {skill 根}/scripts/tracking_commit.py draft --project {项目根} --chapter {N}`,预填工作目录 `tracking.json`,并给出在场核心角色的当前快照和每类条目的样板(`shapes`)。只填 `delta` 与留空的本章结尾时间、场景:变化的核心角色(含本章首次进场的核心角色,草稿里没有就新建一份)把快照整份改好放进 `character_snapshots`;撤下的长期约束或风险从 `context` 删掉并把原文列进 `delta.retired_context_items`。不读脚本源码或 state 找格式;出错时才读 [tracking-transaction.md](tracking-transaction.md)。带内执行 `{PYTHON} {skill 根}/scripts/storyctl.py chapter commit --project {项目根} --chapter {N} --input {工作目录}/tracking.json`,作者接受当前长度把 `commit` 换成 `accept-current-length`。报错按提示改完重跑同一命令;体积超目标只是提醒,逐章记录写要点即可,不必为它删改。判为「登记」的申报项在这次事务里一并登记;有「先问作者」项时暂停提交与下一章。「本章没写成的」:细纲没给的追加进本单元排纲底稿「建纲追加」,先问作者的走下方处置表。 13. **提交后核对**:返回 `tracking_committed: true` 即本章完成。 ## 向作者汇报 按 SKILL.md「面向作者的汇报」,下列时机照模板说;`{}` 换成故事里的话,其余内部结论不说给作者。提交成功、本章完成后(日更批量改用 workflow-daily 批末汇报): ```md 第{N}章《{章名}》写好了,约 {字数} 字。 这章:{两三句讲发生了什么,停在哪个钩子上}。 {有需作者留意的新人物/新设定就一句话,如「加了个跑腿的小厮阿福,后面可能还会用」;没有就删掉此行} {这章主角的功劳被别人拿走、或提前用了后面的底牌时,一句话说哪里、怎么补或要不要改纲;没有就删掉此行} {自查结论一句话:「自查过设定和前文,没发现冲突」或「发现一处前后不一:{什么},已按前文改正」} {有习惯没带上就用原话说,核对报告拼好了就照说;没有就删掉此行} 下一章:第{N+1}章《{章名}》,要接着写吗? ``` 字数一次处理后仍不在范围内时,请作者选,不自行补写: ```md 第{N}章《{章名}》写完了,比目标{少/多}了约 {差额} 字(目标约 {目标} 字,现在 {实际} 字)。{一句原因,如「细纲的事写完就到这儿了,硬凑会注水」} 你想怎么处理? 1. 就按现在的长度收下(推荐) 2. 我改细纲或字数目标,再重写这章 3. 这章不要了 ``` 不到目标一半时选项 1 不标推荐。作者选 1 → `chapter accept-current-length`;选 2 → 等作者改完细纲/目标后回步骤 8;选 3 → 删本章正文与工作目录,不提交。收下被拒时:`BELOW_ACCEPT_FLOOR` 告诉作者差多少字,问补写还是就要这个长度;`COMPRESSION_REQUIRED` 先按 `compress-once` 删一次。作者知道原因仍坚持才加 `--force`。新增内容需要作者拍板(下方处置表「先问作者」)时: ```md 第{N}章{写的时候多出了一样东西 / 写到一半想加一样东西,还没写},需要你定:{用故事话说是什么}。 它会牵动{后面哪段剧情或哪个已定安排,如「原定第三卷才揭开的那封信」}。 1. {留下 / 加上},我把后面的大纲一起改过来 2. {删掉 / 不加},按原细纲写 我建议选 {1/2}:{一句理由}。 这章先不算写完,等你定了再往下。 ``` 写不下去、要停下时: ```md 第{N}章还没法写:{白话说缺什么,如「这一章还没有细纲」}。 建议{一个动作,如「我先按卷纲把这章细纲补出来给你看」},可以吗? ``` ## 质量检查 字数范围按 SKILL.md 写前必读第 4 条。查三个维度:**情绪交付**(目标情绪是否兑现)、**契约风险**(步骤 9 契约四问)、**技术质量**(一致性、格式、禁用词;排查具体问题时才读 [long-chapter-quality.md](long-chapter-quality.md))。 **写后同轮清零**:同一轮内完成步骤 8-11,blocking(含写后 hook 推回的毒句式)清零才算本章完成。**唯一豁免**:用户显式说"本章不去味/跳过检查"时,在该章标题行下加一行 ``(写后 hook 与下一章前的欠账拦截都认它)。退化类 blocking(复读、截断、拒绝语、工程词泄漏)只重写受影响段落,最多 2 次,仍失败按停下问法请作者定夺;故事内系统用语、弹幕、有功能的重复台词保留。 ### Agent 调用:consistency-checker **按需调用**:写手申报表非 `0`,或核对细纲时发现未申报的跨章事实(新证词、证据、承诺、关系变化)才在本章 spawn;否则日更批末核对时整批查一次(workflow-daily Step 3),非日更的单章写作在步骤 12 提交前对本章查一次。Prompt 见 [agent-calls.md](agent-calls.md)。不可用则主会话自己核:申报项与跨章事实是否与细纲、角色卡、已登记追踪冲突;承诺与伏笔有没有被遗忘或无推进;有没有突然塞进大量新设定。 **新增物处置(主会话)**(正文定稿、追踪未提交时做)。checker 只给事实证据,归哪一栏由主会话判: | 处置 | 判据 | 出口 | |---|---|---| | **登记** | 无必须修的冲突,也不属先问作者项 | 角色/势力按 workflow-outline.md「细纲后设定补全」补建静态档案、可复用设定补进 `设定/世界观/{主题}.md`,由主会话直接改设定文件(追踪事务不写设定);伏笔、关系、约束、下章承诺进步骤 12 事务的对应 delta 字段 | | **修复** | 有必须修的冲突 | 退回写手就地改正文或删掉该新增物,最多一次 | | **先问作者** | 先问作者项(SKILL.md「新增物三级」),或冲突要靠创作决策;「本章没写成的」里标先问作者的也走这行 | 按拍板问法问作者(已写的问留不留,没写的问「还没写,要不要加」);本章暂停提交及下一章。作者接受则按授权改卷纲/设定(没写的补写)后提交,不接受则删改后提交 | 申报为 `0` 仍做正文与细纲的正常核对,发现漏报照本表处置。 ### Agent 调用:narrative-writer(去AI味审查) **按需调用**:步骤 8 的 `quality.semantic_advisories`(语义类 advisory 条数)≥3,或 blocking 一次就地修改后仍未清零,才 spawn 一次;否则主会话按步骤 11 处理。Prompt 见 [agent-calls.md](agent-calls.md)。不可用(主会话自己写)时不读去味细则:逐条按检测器那条提示改,先判能否直接删(删后不丢伏笔、钩子、角色、情节和必要信息就删),会丢才改写;blocking 改到净,advisory 确属问题才改。语义提示仍多时照常收口,在汇报里建议作者之后另开对话用 `/story-deslop` 精修。 审查在本章提交前改的连续性事实直接进步骤 12 的事务;提交后再改,按 workflow-revision:`draft --chapter {N}` 预填 → 改 → `chapter commit`。