Webnovel Writer write-gate 实现解析:prewrite、precommit、postcommit 三道闸的代码逻辑

Webnovel Writer write-gate 实现解析:prewrite、precommit、postcommit 三道闸的代码逻辑 Webnovel Writer write-gate 实现解析prewrite、precommit、postcommit 三道闸的代码逻辑【免费下载链接】webnovel-writer基于 Claude Code 的长篇网文辅助创作系统解决 AI 写作中的「遗忘」和「幻觉」问题支持 200 万字量级 连载创作。项目地址: https://gitcode.com/GitHub_Trending/we/webnovel-writerWebnovel Writer 是面向长篇网文连载的 AI 辅助创作系统其write-gate子系统用prewrite、precommit、postcommit 三道闸把住一章小说从动笔前到提交后的全部关键节点防止 AI 在 200 万字量级连载中遗忘设定、幻觉出剧情。本文带你读懂这三道闸各自的代码逻辑与协作方式。为什么需要三道写前/写后闸门 长篇网文连载最大的风险是AI 写第 200 章时已经忘了第 3 章埋的伏笔。webnovel-writer 的解法是给写作流程设置自然边界检查点——不是等出错了再修而是在错误能造成的影响最小的地方拦截闸门时机一句话职责prewrite动笔前确认写作输入可信合同、消歧、占位符都齐了precommit提交前确认正文和四项审查产物都合格postcommit提交后确认commit 被接受且五项投影全部落盘三阶段常量定义在包入口STAGES对应的 CLI 子命令为write-gate --stage prewrite|precommit|postcommit。统一骨架一次调用一份标准报告 三道闸共享同一套报告骨架这是整个 write-gate 设计最简单的部分。issue()构造单条问题错误码、严重级、影响、修复建议gate_report()组装成带ok标志的报告——只要有一条blocker级错误ok就是falserun_write_gate()按 stage 分发到具体实现def run_write_gate(project_root, *, chapter: int, stage: str) - dict: if stage prewrite: ... if stage precommit: ... if stage postcommit: ...入口逻辑见 run_write_gate报告里每条 error 都附带impact影响和repair修复建议字段——这是刻意设计方便作者或 Agent直接照做。CLI 侧由 cmd_write_gate 接住支持--format json|text输出。三道闸还共享同一个项目阶段判断器 project_phase.py它会扫描项目目录把当前状态归一成chapter_contract_ready、draft_in_progress、ready_to_commit、projection_failed等阶段值闸门只需回答一个问题——当前阶段允不允许我这件事。第一道闸 prewrite动笔前先确认输入可信 ✍️实现见 prewrite.py逻辑分三步阶段门槛当前阶段必须在允许集合ALLOWED_PREWRITE_PHASES合同已就绪、草稿进行中、可提交之内否则报phase_not_ready_for_prewrite——骨架都没建好就动笔写出来的东西没有约束。合同与剧情结构从运行时加载 master/volume/chapter/review 四份合同并从中提取mandatory_nodes本章节必须覆盖的剧情节点和prohibitions禁止区组装成 plot_structure。PrewriteValidator 深层校验真正干活的是 PrewriteValidator.build它会检查三类输入不可信信号state.json里存在高优先级disambiguation_pending消歧未完成比如一个人名到底指哪个角色缺少 Story System 合同master/chapter/volume/review 任一为空本章关键实体对应的设定文件里还有未补齐的占位符_related_placeholders 会拿章节指令里的key_entities去全局扫描占位符三者任一命中即blockingtrue闸门报prewrite_validator_blocking并拒绝放行。另外若运行时依赖的是兜底来源比如第一章没有上一章 accepted commit只降级为 warning不阻断。第二道闸 precommit提交前检查正文与四项产物 实现见 precommit.py同样先做阶段门槛no_project、init_scaffolded、plan_in_progress、projection_failed等阶段直接报phase_not_ready_for_precommit——上一轮投影失败时不允许写下一章避免固化不可靠事实。接着是两组硬检查正文文件用 find_chapter_file 在正文/目录下定位本章文件找不到报chapter_file_missing内容为空报chapter_file_empty。四项提交产物按 COMMIT_ARTIFACT_FILES 校验.webnovel/tmp/下的review_results.json、fulfillment_result.json、disambiguation_result.json、extraction_result.json交给 validate_commit_artifact_files 做结构校验。产物校验是缺字段即拒绝的严格模式测试用例 test_write_gates.py 清楚地演示了三类拒绝fulfillment 缺missed_nodes字段、disambiguation 缺pending字段、extraction 缺accepted_events字段都会报artifact.schema_error。第三道闸 postcommit提交后确认落盘成功 ✅实现见 postcommit.py是三道闸里检查项最多的一道分四步commit 文件结构校验读取.story-system/commits/chapter_XXX.commit.json用validate_chapter_commit做结构检查。accepted 状态强制commit 的meta.status必须是accepted否则报commit_not_accepted——只有被接受的 commit 才能进入备份和下一章。五项投影状态巡检state / index / summary / memory / vector五个投影read-model 写入器的状态必须齐全且只接受done或skipped。状态来源优先取 projection_log 最新一条运行记录比 commit 文件里的快照更实时failed:前缀报projection_failurepending报projection_pending。声称完成但文件不存在的交叉验证summary 投影标了done但summaries/chXXXX.md不存在、index 投影标了done但index.db不存在都会直接报错——状态与实际文件必须对得上。这套设计回答了一个实际问题AI 系统里写成功最容易在最后一米悄悄失败postcommit 就是专门盯这最后一米的。三道闸如何串进实际写作流程 ⚙️在写作技能 webnovel-write/SKILL.md 中write-gate被编进标准流程的三个位置开始写之前跑 prewrite、提交章节前跑 precommit、chapter-commit之后跑 postcommit且三道闸全部通过才允许把本章标记为已完成。还有一层兜底hooks/guard_runtime_write.py 会在 Agent 试图绕过webnovel.py直接改写 Story System / read-model 文件时拦截提示走write-gate、chapter-commit、projections retry/replay的正路。也就是说闸门不仅会检查还管得住。小结 prewrite管输入阶段、合同、消歧、占位符四关全过才动笔precommit管产出正文非空 四项审查产物结构完整postcommit管落盘commit 被接受 五项投影状态与真实文件一致。三道闸共用一份报告骨架、一个阶段判定器错误一律附带影响与修复建议配合 hook 拦截构成 webnovel-writer 防遗忘与幻觉的核心工程手段。想深入细节可直接阅读 write-gates 目录 与配套测试 test_write_gates.py。【免费下载链接】webnovel-writer基于 Claude Code 的长篇网文辅助创作系统解决 AI 写作中的「遗忘」和「幻觉」问题支持 200 万字量级 连载创作。项目地址: https://gitcode.com/GitHub_Trending/we/webnovel-writer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考