惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
小众软件
小众软件
H
Help Net Security
博客园 - 聂微东
宝玉的分享
宝玉的分享
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
U
Unit 42
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
腾讯CDC
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
J
Java Code Geeks
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News

博客园 - 立体风

autohotkey2.0 Send keys参数分析 autohotkey2.0 盲从模式 windows 10 下 vscode 编写编译一个 nana c++ 库的示例程序 vscode 插件 cmake-tools 输出内容解读 Claude Code 处理中文乱码问题 python 启动器命令 py 答惑 windows 下 python 3.11 的版本问题 pip 安装 老版本 pytorch 的一个容易迷惑的错误 sentence transformer 例子及说明 Sentence Transformers 介绍 Jina Reranker 替代方案:改用 ModelScope 模型 windows 10 LTSC 版 安装 Terminal autohotkey2.0 脚本运行机制 windows wsl2 安装 gentoo 的步骤 windows 10 LTSC版 打开 wsl2 autohotkey 提示词 编译安装最新版 perl rust 做到“快并且安全” 的逻辑思路 rust 和 go 语言的核心目的 用 vim 查看文件的格式和编码 throughput 和 efficient 词义 python 以字符数量分割文档 (三) python 以字符数量分割文档 (二) python 以字符数量分割文档 (一) GNU Bash 参考手册(中文版)(六) GNU Bash 参考手册(中文版)(五) GNU Bash 参考手册(中文版)(四) GNU Bash 参考手册(中文版)(三) GNU Bash 参考手册(中文版)(二) GNU Bash 参考手册(中文版)(一)
Webnovel Writer 6.2.1 项目分析
立体风 · 2026-08-20 · via 博客园 - 立体风

1. 项目是什么

Webnovel Writer 是一个跑在 Claude Code 上的长篇网文创作插件(Claude Code Plugin,经 Marketplace 安装)。它不是独立的写作 App,而是由 Claude Code 这个宿主驱动的一整套流程、规则与数据管线

  • 8 个 Skill 命令(/webnovel-init/webnovel-plan/webnovel-write/webnovel-review/webnovel-query/webnovel-learn/webnovel-dashboard/webnovel-doctor)充当用户入口;
  • 3 个专职 Subagent(context-agent / reviewer / data-agent)在写章流水线中被 Agent 工具调用;
  • 一套 Python CLI(scripts/webnovel.py 统一入口)负责所有确定性逻辑:项目定位、合同生成、提交、投影、检索、备份、体检;
  • 一个只读 Web 面板(FastAPI + 预打包 React 前端)用于可视化查看项目状态。

它要解决的核心问题:让 AI 写到几十、几百章之后,依然"记得住设定、接得住伏笔、守得住大纲"。为此它把"写小说"从一次性生成,改造成合同(写前)→ 提交(写后)→ 投影(派生查询视图)的事件溯源式数据链。

一句话定位:一套面向长篇连载的一致性系统,不是写完就忘的一次性生成器。


2. 技术栈与运行形态

维度 说明
宿主 Claude Code(通过 Plugin Marketplace 安装:claude plugin install webnovel-writer@...
语言 Python 3.10+(全部确定性逻辑);前端 React + Vite(发布版自带 dist/ 构建产物,无需 npm build)
数据存储 JSON 文件(合同、commit、state)+ SQLite(index.db 事实索引、vectors.db 向量库)+ Markdown(大纲/正文/设定集/摘要)
外部服务 Embedding / Rerank API(OpenAI 兼容格式,默认 ModelScope 的 Qwen3-Embedding-8B + Jina Reranker),可不配(自动退化 BM25)
运行时约束 所有 CLI 调用统一带 python -X utf8(Windows 编码兼容);sitecustomize.py 防 pytest 插件误载
版本要点 v6.0 引入 Story System 全链路;v6.1 运行时加固(doctor/project-status/write-gate/投影重放/hooks);v6.2 面向作者的报告与断点续跑;v6.2.1 修复 Windows 写章提交偶发 WinError 5(文件被短暂占用时自动重试)

3. 目录结构总览

webnovel-writer-6.2.1/
├── .claude-plugin/marketplace.json   # 插件市场元数据(版本 6.2.1)
├── README.md / CHANGELOG.md / docs/  # 文档(architecture/guides/operations/memory 等)
├── sitecustomize.py                  # 防 pytest 全局插件误载(本机专用)
└── webnovel-writer/                  # 插件本体
    ├── .claude-plugin/plugin.json    # 插件声明
    ├── skills/                       # 8 个 Skill(每个含 SKILL.md + references)
    │   └── webnovel-write/...        # 写章主流程(SKILL.md 385 行,最关键)
    ├── agents/                       # Subagent 定义(context-agent / reviewer / data-agent / deconstruction-agent)
    ├── hooks/                        # Claude Code 运行时钩子(SessionStart 状态提示 + PreToolUse 写入护栏)
    ├── scripts/                      # Python 数据链(唯一事实逻辑层)
    │   ├── webnovel.py               # 统一 CLI 入口(薄壳,转发)
    │   ├── project_locator.py        # 项目根定位
    │   ├── story_system.py           # 合同种子生成 CLI
    │   ├── chapter_commit.py         # 章节提交 CLI
    │   ├── init_project.py / backup_manager.py / archive_manager.py / update_state.py ...
    │   └── data_modules/             # 核心业务模块(60+ 文件,~2 万行)
    │       ├── webnovel.py           # 真正的 CLI 分发器
    │       ├── story_system_engine.py / story_contracts.py / runtime_contract_builder.py
    │       ├── chapter_commit_service.py / event_projection_router.py
    │       ├── *_projection_writer.py(state/index/summary/memory/vector 五路投影)
    │       ├── state_manager.py / index_manager.py / rag_adapter.py / context_manager.py
    │       ├── memory/               # 长期记忆子系统(store/orchestrator/writer/compactor...)
    │       ├── write_gates/          # prewrite/precommit/postcommit 三道闸门
    │       ├── project_phase.py / project_status.py / doctor.py / user_report.py / run_ledger.py
    ├── dashboard/                    # 只读可视化面板(server.py + app.py ~30 个只读 API + frontend/dist)
    └── references/                   # 知识库:37 个题材模板、CSV 规则表(写作技法/爽点节奏/裁决规则...)、审查与润色参考

4. 核心设计理念:真源划分与事件溯源

这是理解整个项目运行逻辑的钥匙。系统把一本书的数据分成三层,写入方向单向、职责互斥

4.1 三层真源

位置 角色 谁写
写前真源(合同) .story-system/MASTER_SETTING.json(全书调性/禁忌)、anti_patterns.jsonvolumes/volume_NNN.json(卷级节奏)、chapters/chapter_NNN.json(章级焦点)、reviews/chapter_NNN.review.json(必查节点/禁区) 动笔前必须遵守的"合同";缺失则写章阻断 /webnovel-planstory-system 命令(每次写章前刷新)
写后真源(提交) .story-system/commits/chapter_NNN.commit.json(accepted 为定稿事实)、events/chapter_NNN.events.json(事件审计) 一章写完后"发生了什么"的不可篡改记录 chapter-commit 命令(由 /webnovel-write Step 5 驱动)
投影层(read-model) .webnovel/state.jsonindex.dbsummaries/chNNNN.mdmemory_scratchpad.jsonvectors.db 从 commit 派生的查询视图(角色卡、章节索引、摘要、长期记忆、向量) 仅五路 ProjectionWriter,从 commit 重放生成

关键含义:

  • state.json 不再是事实来源(v6 之前是),只是投影。任何查询优先读 .story-system/ 合同与最新 accepted commit。
  • 投影是可重放的projections replay 可以从既有 commit 重新生成全部派生视图,这是修复数据错乱的主要手段。
  • 投影执行日志 .webnovel/projection_log.jsonl 记录每路投影结果,用来定位"哪一路没同步"。

4.2 防幻觉三定律(写章流程的强制约束)

  1. 大纲即法律 —— context-agent 强制加载章纲,不擅自发挥;
  2. 设定即物理 —— reviewer 做一致性审查(能力 ≤ 已有记录);
  3. 发明需识别 —— data-agent 把新实体/新事实提取入库,不得留在正文里就完事。

4.3 Strand Weave 节奏系统

主线 Quest(~60%)/ 感情线 Fire(~20%)/ 世界观 Constellation(~20%),配合红线(Quest 连超 5 章、Fire 断 10 章、Constellation 断 15 章触发告警)和"追读力"系统(钩子/爽点/微兑现/债务追踪,存于 index.db)。


5. 执行逻辑详解(运行全景)

5.1 总览:数据是怎么流动的

作者(Claude Code 会话)
   │  输入 /webnovel-xxx 命令
   ▼
Skill(SKILL.md 定义流程)──调用──▶ Subagent(context-agent / reviewer / data-agent)
   │                                        │
   │ 调用 Bash 执行确定性逻辑                 │ 只读/只写 tmp artifact
   ▼                                        ▼
scripts/webnovel.py(统一 CLI)◀── .webnovel/tmp/ 四份 artifact
   │ 解析 project_root → 分发给各子模块
   ▼
合同层(.story-system/) ──▶ CHAPTER_COMMIT ──▶ 五路投影 ──▶ .webnovel/ 派生视图 ──▶ Dashboard(只读)

5.2 运行前提:插件如何被加载

  • 用户通过 Marketplace 安装插件后,Claude Code 启动时会加载 webnovel-writer/ 下的 skills / agents / hooks;
  • 每个 Skill 的命令里都依赖环境变量 CLAUDE_PLUGIN_ROOT(Claude Code 自动注入,指向插件安装目录),脚本目录统一为 ${CLAUDE_PLUGIN_ROOT}/scripts
  • CLAUDE_PROJECT_DIR 是当前工作区提示,作为项目根定位的输入之一。
  • 常见故障根源一:插件未正确安装 → CLAUDE_PLUGIN_ROOT 为空 → 所有 Skill 第一步的环境校验报错。

5.3 项目根定位(project_locator.py)

所有命令第一步都是解析"书项目根目录"——以包含 .webnovel/state.json 的目录为准。解析顺序(resolve_project_root()scripts/project_locator.py:349):

  1. 显式 --project-root 参数;
  2. 环境变量 WEBNOVEL_PROJECT_ROOT
  3. 工作区指针文件 .claude/.webnovel-current-project(从 CWD 向上找,到 git 仓库根为止);
  4. 用户级注册表 ~/.claude/webnovel-writer/workspaces.json(workspace → 项目根映射;仅在 CLAUDE_PROJECT_DIR 存在等"有上下文提示"时才允许 last_used 兜底,防误命中);
  5. 从 CWD 逐级向上扫描 .webnovel/state.json(含约定子目录 webnovel-project/)。

写指针/注册表的命令是 webnovel.py use <project_root>cmd_use)。多书项目切换后"找不到项目"类问题,先查这两处指针。

5.4 统一 CLI 入口与命令分发(scripts/webnovel.py → data_modules/webnovel.py)

所有 Python 能力收敛为一个入口,避免 agent 拼命令出错:

python -X utf8 "<CLAUDE_PLUGIN_ROOT>/scripts/webnovel.py" --project-root "<ROOT>" <子命令> [参数]

分发方式(data_modules/webnovel.pymain()):

  • 自实现命令func 分发):where / preflight / project-status / doctor / write-gate / projections / user-report / run-ledger / run-log / use / knowledge
  • importlib 直调_run_data_module):index / state / rag / style / entity / context / memory / migrate —— 统一前置注入 --project-root 再转发;
  • 子进程脚本_run_script):status / update-state / backup / archive / init / extract-context / story-system / story-events / chapter-commit / memory-contract / project-memory / review-pipeline / master-outline-sync

设计要点:--project-root 可出现在任意位置(normalize_global_project_root 预处理);init 是例外——它创建项目,不依赖已存在的 project_root。

5.5 项目生命周期阶段机(project_phase.py)

doctor / project-status / write-gate 都是阶段感知的:先扫描项目文件状态推断当前处于哪个阶段,再按阶段给出校验项与"下一步"建议:

no_project → init_scaffolded → init_ready → plan_in_progress
  → chapter_contract_ready → draft_in_progress → ready_to_commit
  → chapter_committed(→ 下一章循环) / projection_failed(需修复)

阶段判定依据:.webnovel/state.json 是否存在与内容、.story-system/commits/ 扫描、正文/ 最新章节、tmp/ artifact 是否齐备(_scan_commits_latest_draft_chapter 等)。"为什么 doctor 说我现在该做 X"——答案在阶段机里。

5.6 初始化流程(/webnovel-init)

  • Skill 用 AskUserQuestion 分波次采集(题材、卖点、角色、世界观、力量体系……),可选调用 deconstruction-agent 拆解参考书;
  • 过充分性闸门后调用 webnovel.py initinit_project.py,789 行)创建骨架:.webnovel/state.json(含题材/进度/主角快照)、设定集/*(世界观/力量体系/主角卡/反派设计)、大纲/总纲.md.env.example.story-system/MASTER_SETTING.json 合同种子;
  • 产出目录即为"书项目根"。

5.7 规划流程(/webnovel-plan)

  • 增量细化(不重写总纲):先锁卷级节奏 → 批量拆章 → 时间线硬约束(每章纲带时间字段)→ 新增设定写回设定集;
  • 输出 大纲/第N卷-详细大纲.md第N卷-时间线.md,并调用 master-outline-sync 写回 V+1 总纲锚点;
  • 前后各跑一次 placeholder-scan(扫描 {章纲目标}[待...]暂名 等未补齐占位)。

5.8 写章流水线(/webnovel-write)—— 本项目的心脏

skills/webnovel-write/SKILL.md 定义了完整流水线,主流程由 Claude Code 的模型执行、Python CLI 保证确定性关卡。按顺序、禁跳步、失败只补跑失败步骤(不回退)

准备(预检) ─▶ 准备(刷新合同树) ─▶ Step1 context-agent ─▶ Step2 起草 ─▶ Step3 reviewer
  ─▶ Step4 润色 ─▶ Step5 data-agent + commit ─▶ Step6 备份
(write-gate 在 3 个自然边界设卡:prewrite / precommit / postcommit)

准备阶段

  1. preflight(校验插件路径、project_root、story_runtime 主链健康)+ where(解析项目根)+ placeholder-scan(扫占位符);
  2. 刷新合同树:从 state.json 初始化快照读题材 → story-system "<本章真实目标>" --genre <题材> --chapter N --persist --emit-runtime-contracts
    • StorySystemEnginestory_system_engine.py)按关键词/别名在 references/csv/题材与调性推理.csv路由题材行(英文 profile key 会被拒绝——题材必须中文),检索基础表(top1)+ 动态表(top2),加载该题材 reasoning 裁决层,生成 MASTER_SETTING / chapter_brief / anti_patterns;
    • RuntimeContractBuilder 从章纲解析 chapter_directive(目标/时间锚/章跨度/倒计时/章尾悬念)并生成卷级合同 volume_NNN.json 与审查合同 chapter_NNN.review.json
    • 注意:query 传占位符(如 {章纲目标})会被 is_placeholder_query 检测并警告——必须先从详细大纲解析真实本章目标;
  3. write-gate prewrite:校验合同树齐全(缺 MASTER/volume/chapter/review 四件即阻断)。

Step 1:context-agent 生成写作任务书

  • 必须用 Agent 工具调用 webnovel-writer:context-agent(禁止主流程口头替代);
  • 其内部:memory-contract load-context --chapter N 一次性取基础包(合同、近期摘要、紧急伏笔、活跃规则、主角快照、记忆包、题材画像摘录)→ 按需深查(实体/规则/时间线)→ 输出五段写作任务书(开篇委托 / 这章的故事 / 这章的人物 / 怎么写更顺 / 收在哪里);
  • 任务书排序固定:本章硬性约束 → CBN/CPNs/CEN 与必盖节点 → 禁区 → 风格指引 → 动态上下文(仅参考,不得覆盖章纲);
  • 上下文严重不足时返回 blocker(不硬编)。

Step 2:起草正文

只依据任务书,写纯正文到 正文/第{NNNN}章-{title}.md,无占位符,默认 2000–2500 字。

Step 3:审查(reviewer + review-pipeline)

  • 必须用 Agent 工具调用 reviewer(只返回 JSON,不写文件):5 个维度逐一检查——setting / timeline / continuity / character / logic,每个维度强制输出 pass 或问题清单(dimension_results),问题必须带 evidence;
  • 主流程把 JSON 写入 .webnovel/tmp/review_results.json,然后跑 review-pipeline --save-metrics:复核计数一致性、生成 审查报告/第N章审查报告.md、指标落 index.db,并把标准 artifact 覆盖写回同路径;
  • blocking issue 定点修复后直接进 Step 4(审查只跑一轮);修不了的 blocking 用 AskUserQuestion 请用户裁决;
  • --fast 只查 setting/timeline/continuity;--minimal 跳过 reviewer,但必须覆盖写入 no-review artifact(保证提交链有合法输入)。

Step 4:润色

修复非 blocking issue → 风格适配 → 排版 → Anti-AI 终检anti_ai_force_check=fail 则不进 Step 5)。只改表达不改事实。reference 区段按需读(Grep 锚点 + Read offset/limit),不全量读。

Step 5:提交(data-agent + CHAPTER_COMMIT + 五路投影)

  1. data-agent(Agent 工具调用):从正文提取事实,产出三份 artifact 到 .webnovel/tmp/
    • fulfillment_result.jsonplanned_nodes / covered_nodes / missed_nodes / extra_nodes(章纲完成度);
    • disambiguation_result.jsonpending 数组(低置信歧义待人工);
    • extraction_result.jsonaccepted_events(10 种事件类型:character_state_changedpower_breakthroughrelationship_changedworld_rule_revealed/brokenopen_loop_created/closedpromise_created/paid_offartifact_obtained)+ state_deltasentity_id/field/old/new)+ entity_deltas + entities_appeared + scenes + summary_text(100–150 字摘要);
    • data-agent 只写这三份 tmp artifact,不直接碰任何投影
  2. write-gate precommit:校验三份 artifact + review_results 存在且 schema 合格;随后跑只读 git diff 变更面校验(不允许出现插件目录/其他书/其他章节);
  3. chapter-commitchapter_commit.pyChapterCommitService):
    • Pydantic 校验四份 artifact;
    • 自动判定blocking_count>0missed_nodes 非空 或 pending 非空 → rejected,否则 accepted
    • 落盘 .story-system/commits/chapter_NNN.commit.json(含 contract_refs、provenance、outline_snapshot、review/fulfillment/disambiguation/extraction 全量、projection_status);
    • accepted 时:事件经 EventLogStore.normalize_events 规范化后写入 events/chapter_NNN.events.json,并检查是否需要生成 amend 提案(override ledger);
  4. 五路投影apply_projection_writers):EventProjectionRouter 按事件类型决定哪些投影器必跑(路由表见 4.1),每路结果写入 commit 的 projection_statusdone / skipped / failed:<原因>),并把执行记录追加到 projection_log.jsonl
    • state:state_deltas → state.json 角色快照(锁定字段保护);
    • index:scenes/出场/状态变更 → index.db(章节/场景/实体/关系/别名/追读力等表);
    • summary:summary_text → summaries/chNNNN.md
    • memory:可跨章复用的事实 → memory_scratchpad.json 长期记忆;
    • vector:场景切片 → vectors.db 向量化(无 API Key 时 BM25 索引);
  5. write-gate postcommit:确认 projection_status 五项全部 done/skipped、chapter_status 由投影器推进为 committed。

Step 6:Git 备份

backup --chapter N --chapter-title "<标题>"backup_manager.py):以解析后的 PROJECT_ROOT 为准做章节级 git 备份,支持 rollback / diff / branch / list。禁止从工作区父目录裸 git add(防止把书项目当子模块加错)。

断点续跑与作者友好报告

  • 每个关键步骤写 run-ledger record-write-step;重跑同一章先 run-ledger write-resume 给续跑建议(正文被手改过/已 accepted 时停下询问,不覆盖作者手改);
  • 过程提示只说"在做什么",技术细节写 .webnovel/logs/run_last.logrun-log 命令,脱敏);
  • 收尾调用 user-report --stage write 生成固定三段式报告,总状态四级:已完成 / 部分完成 / 需要你处理 / 未完成data_modules/user_report.py 根据文件与 commit/projection/备份证据判定;chapter-commit rejected、write-gate failed、projection failed 时不得写"已完成")。

5.9 审查命令(/webnovel-review)

对章节范围批量审查(爽点/一致性/节奏/OOC/连贯性/追读力维度),调用 review-pipeline + quality_trend_report.py(趋势统计),同样产出作者友好报告。

5.10 查询命令(/webnovel-query)与知识查询

  • 按"查询类型 → 最窄工具"路由:角色历史状态 → knowledge query-entity-state --at-chapter N;关系 → knowledge query-relationshipsKnowledgeQuery 支持"实体在第 N 章时的状态/关系"时序查询);规则 → memory-contract query-rules;伏笔 → memory-contract get-open-loops;综合 → memory-contract load-context;静态设定 → Grep/Read 设定集;
  • 查询真源优先级:写前合同 → 写后 commit → 投影层(state/index 仅 fallback)。

5.11 长期记忆与项目记忆

  • 长期记忆memory_scratchpad.jsondata_modules/memory/ 包):写前由 orchestrator 组装"记忆包"注入任务书(按紧急度/相关度过滤 + 预算裁剪),写后由 memory 投影沉淀;compactor 负责压缩;
  • 项目记忆.webnovel/project_memory.json):/webnovel-learn 把用户认可的好写法(钩子/节奏/对话/微兑现……)归类写入,供后续写章注入;
  • 运维命令 memory(导出/回填)。

5.12 RAG 检索链路(rag_adapter.py)

  • vectors.db:场景切片 embedding(OpenAI 兼容接口);bm25_index 表:关键词倒排索引(_update_bm25_index,写向量时同步维护);
  • 检索模式:hybrid(向量 + BM25 融合)→ graph_hybrid(hybrid 基础召回 + 关系子图扩展实体 + 图先验加权)→ 无 Embedding Key 或 401 认证失败时自动退化纯 BM25degraded_mode_reason 会标记 embedding_auth_failed,doctor 可查);
  • Rerank 用 jina-reranker-v3 重排;查询日志落 rag.db
  • 配置来自书项目根的 .envconfig.py_load_project_dotenv)。

5.13 可视化面板(/webnovel-dashboard)

  • dashboard/server.py:uvicorn 启动 FastAPI(默认 127.0.0.1:8765),自动开浏览器;项目根解析顺序:CLI > WEBNOVEL_PROJECT_ROOT > .claude 指针 > CWD;
  • app.py 暴露约 30 个只读 API(/api/entities/api/relationships/api/chapters/api/reading-power/api/story-runtime/health/api/commits/api/files/tree……),path_guard.py 把文件访问限制在 PROJECT_ROOT 内;
  • 前端为预打包 dist/(缺失说明插件安装不完整);watcher.py 监听 .webnovel/ 变化实时刷新;
  • 依赖单独在 dashboard/requirements.txt,失败时提示手动安装。

5.14 Hooks:运行时护栏(hooks/hooks.json)

  • SessionStartsession_start.py:打印项目短状态(最多 8 行/1000 字符,4 秒超时,失败静默),可用 WEBNOVEL_DISABLE_SESSION_STATUS_HOOK 关闭;
  • PreToolUse(Write/Edit/Bash)guard_runtime_write.py:拦截对受保护文件的直接写:
    • 保护对象:.story-system/commits/.webnovel/index.dbvectors.dbmemory_scratchpad.jsonprojection_log.jsonl(state.json 刻意不保护——有独立备份/重建路径);
    • 白名单:命令中含 webnovel.py 且为 chapter-commit / projections retry|replay
    • 可被 WEBNOVEL_DISABLE_RUNTIME_GUARD_HOOK 关闭。
  • 含义:"我想直接改 index.db 却被拒绝"是护栏在起作用,正确路径是走 commit / projections 命令或修 tmp artifact 后重新提交。

6. 故障排查指南:从症状推断错误方向

排查总原则(README 也强调):先 preflightdoctor,然后按"症状 → 所在流水线环节 → 对应命令/文件"定位。所有 CLI 都是只读查询(除 commit/backup/init),可放心反复跑。

6.0 黄金三命令(任何问题先跑)

python -X utf8 "<CLAUDE_PLUGIN_ROOT>/scripts/webnovel.py" --project-root "<PROJECT_ROOT>" preflight
python -X utf8 "<CLAUDE_PLUGIN_ROOT>/scripts/webnovel.py" --project-root "<PROJECT_ROOT>" project-status --format json
python -X utf8 "<CLAUDE_PLUGIN_ROOT>/scripts/webnovel.py" --project-root "<PROJECT_ROOT>" doctor --format text

重点看:story_runtime.mainline_ready 是否为 true、当前 phase 与"下一步"、projection_status 是否全 done/skipped、index.db/summaries//memory_scratchpad.json 是否正常。

6.1 环境与安装类

症状 推断方向 排查
Skill 一运行就报 CLAUDE_PLUGIN_ROOT 未设置/目录不存在 插件未安装或未启用 claude plugin list 确认安装;检查插件目录下是否有 scripts/
所有 python 命令报编码乱码/UnicodeEncodeError Windows 终端编码问题 确认命令带 -X utf8runtime_compat.pyenable_windows_utf8_stdio 是统一处理点
报缺 Python 模块(ModuleNotFoundError: data_modules/...) 依赖未装或脚本路径不在 sys.path pip install -r requirements.txtscripts/requirements.txt;确认从 scripts/webnovel.py 入口调用(它会插入 sys.path)
pytest 环境怪异 全局 pytest 插件冲突 sitecustomize.py 已设 PYTEST_DISABLE_PLUGIN_AUTOLOAD,检查是否被覆盖

6.2 项目根定位类(高频)

症状 推断方向 排查
FileNotFoundError: ... missing .webnovel/state.json 定位失败:指针/注册表/目录布局问题 webnovel.py where 看解析结果;检查 .claude/.webnovel-current-project 指针、~/.claude/webnovel-writer/workspaces.json;多书工作区用 webnovel.py use <root> 重新绑定
命令作用到了错误的书 指针/注册表指向旧项目 同上,重跑 use;注意 allow_last_used_fallback 仅在 CLAUDE_PROJECT_DIR 存在时启用
在书项目外新开会话找不到项目 "空上下文"定位失败 --project-root 显式传入或先 use 绑定

6.3 合同树类(写前阻断)

症状 推断方向 排查
write-gate prewrite 失败,报 MASTER_SETTING/volume/chapter/review 缺失 合同树没刷新或 plan 未完成 重跑 story-system(注意 query 必须传真实本章目标,占位符会告警);/webnovel-plan N 先规划该卷
story-system 报"题材参数必须使用中文名称" 传了英文 genre key 改传中文题材名
story-system 路由失败(StorySystemRoutingError) 关键词没匹配上题材表 检查 references/csv/题材与调性推理.csv 的关键词/别名列,换描述词
章纲目标没生效、写作偏题 chapter_focus 从 dynamic_context 继承而非 chapter_directive 检查 chapters/chapter_NNN.jsonchapter_directive.goal;章纲文件是否含结构化节点

6.4 审查与 artifact 类(Step 3/5)

症状 推断方向 排查
reviewer 输出缺 dimension_results 或计数不一致 reviewer 输出不合格(被 review-pipeline 复核拦截) 重跑 Step 3;review-pipeline 会覆盖写回标准 artifact
blocking issue 一直过不去 真的事实矛盾,或 reviewer 误判 定点修复后直接进 Step 4(不重跑 reviewer);修不了走用户裁决;references/review/blocking-override-guidelines.md
precommit gate 报 artifact 缺失/schema 不合格 data-agent 没写完或字段名不合法 检查 .webnovel/tmp/ 三份 JSON;schema 唯一真源是 agents/data-agent.md §7;artifact_validator.py 的校验规则
出现 pending 消歧导致 commit rejected 新实体/别名低置信 disambiguation_result.json 的 pending 项,人工确认后让 data-agent 补写,重新 commit

6.5 Commit 类(Step 5.2/5.3)

症状 推断方向 排查
commit 是 rejected blocking_count>0 / missed_nodes 非空 / pending 非空 三者之一 commits/chapter_NNN.commit.json 的对应字段,逐项修复后重跑 chapter-commit(tmp artifact 还在即可)
commit 文件根本没生成 precommit gate 没过,或 hook 拦截了命令 先跑 precommit gate 看错误;确认命令走的是 webnovel.py chapter-commit(白名单外写法会被 guard hook deny)
WinError 5 / PermissionError 写文件失败 Windows 文件被占用(v6.2.1 已加自动重试) 关闭占用进程(杀毒/编辑器/搜索索引);升级到 6.2.1+

6.6 投影类(最需要理解的一类)

症状 推断方向 排查
projection_status 某项是 failed:<原因> 该路投影器抛异常 .webnovel/projection_log.jsonl 对应章节记录;projections retry --chapter N 补跑单章
state/index/summary/memory/vector 某一层数据和正文对不上 对应投影没跑或历史失败 同上;严重时 projections replay --from-chapter A --to-chapter B 从 commit 全量重放(幂等)
projection_status 显示 skipped 该路对本章不是必跑(路由表决定) 正常现象,非故障;用 story-events --health 看事件链健康
postcommit gate 失败 投影未完成或 chapter_status 未推进 重跑 projections retry;检查 commit 的 meta.status
直接改 state.json 后行为怪异 state 只是投影,改了会被下次投影覆盖 正确做法:改源头(大纲/合同/commit 事件),再重放投影;update_state.py 提供结构化安全更新(自动备份+原子写)

投影路由表速记event_projection_router.py):角色状态变化/突破 → state+memory+vector;关系变化/获得物品 → index+vector;世界规则揭示/打破 → memory+vector;伏笔/承诺类 → memory;rejected commit → 仅 state。

6.7 RAG 类

症状 推断方向 排查
检索结果变差/语义召回失效 退化到了 BM25(无 key 或 401) doctor 的 RAG 检查;rag stats;查 .envEMBED_API_KEY/RERANK_API_KEY;看 degraded_mode_reason
vectors.db 表结构报错 旧库 schema 需迁移 启动时自动迁移(带备份到 backups/vectors.db.schema_migration.*.bak);失败会尝试恢复
检索慢/无结果 向量没建或索引空 rag index-chapter --chapter N 重建;rag stats 看 chunk 数

6.8 Dashboard 类

症状 推断方向 排查
启动报缺模块 dashboard 依赖没装 pip install -r dashboard/requirements.txt
报缺 frontend/dist/index.html 插件安装不完整(dist 应随插件打包) 重新安装插件;开发态才需要 npm run build
端口占用 8765 被占 --port 9000
页面空白/数据缺失 数据文件缺失或 PROJECT_ROOT 解析错 确认 .webnovel/state.jsonindex.db 存在;server.py 的解析顺序与 project_locator 一致
想改数据没有入口 Dashboard 设计上就是只读 改数据走 skill/CLI,不要想从面板改

6.9 备份类

症状 推断方向 排查
backup 报错或把整个父仓库提交了 项目根解析错(未以 PROJECT_ROOT 为准) 确认 where 输出;backup --list 看历史;回滚用 --rollback N
书目录被当成 submodule/嵌入仓库 曾从父目录执行过 git add 检查 .gitmodules 与父仓库 index,按 git 文档移除

6.10 Hook 护栏类

症状 推断方向 排查
Write/Edit 被 deny:"blocked a direct edit to Story System/read-model files" 你在直接改保护文件 走正规路径:commit / projections / 先改 tmp artifact 再提交
Bash 命令被 deny:"blocked a direct write or bypass command" 命令绕过了 webnovel.py 白名单 改用 webnovel.py chapter-commit / projections retry
会话开头总打印项目状态 SessionStart hook 不需要时设 WEBNOVEL_DISABLE_SESSION_STATUS_HOOK=1;同理 guard 可用 WEBNOVEL_DISABLE_RUNTIME_GUARD_HOOK 关闭(不建议长期关)

6.11 断点续跑类

症状 推断方向 排查
重跑同一章被要求"停下询问" run-ledger 检测到正文手改/已 accepted/章纲晚于正文 按提示三选一(沿用/重草/只查状态),不要覆盖作者手改
想知道上次失败在哪一步 run-ledger 记录 run-ledger write-resume --chapter N.webnovel/logs/run_last.log
最终报告状态与实际不符 user_report 判定逻辑 报告基于文件证据(commit 状态、projection_status、备份证据)自动判定,检查对应证据文件

7. 关键文件速查表

想了解/修改 文件
写章流程定义(步序/闸门/报告契约) webnovel-writer/skills/webnovel-write/SKILL.md
其他命令流程 skills/<skill-name>/SKILL.md
三个 subagent 的职责与输出 schema agents/context-agent.mdreviewer.mddata-agent.md(data-agent §7 是 artifact schema 唯一真源)
CLI 全部子命令注册 scripts/data_modules/webnovel.py
项目根定位 scripts/project_locator.py
阶段机 scripts/data_modules/project_phase.py
三道写章闸门 scripts/data_modules/write_gates/{prewrite,precommit,postcommit}.py
合同生成引擎(题材路由) scripts/data_modules/story_system_engine.py + references/csv/题材与调性推理.csv
合同落盘与合并规则 scripts/data_modules/story_contracts.py
提交与投影编排 scripts/data_modules/chapter_commit_service.pyevent_projection_router.py*_projection_writer.py
投影日志/重放 scripts/data_modules/projection_log.pyprojections.py
事实索引(index.db) scripts/data_modules/index_manager.py(+ 各 mixin)
角色状态(state.json) scripts/data_modules/state_manager.py
检索(vectors.db/BM25/图混合) scripts/data_modules/rag_adapter.py
长期记忆 scripts/data_modules/memory/scripts/memory_cli.py
项目体检 scripts/data_modules/doctor.py
作者友好报告 scripts/data_modules/user_report.py
断点续跑 scripts/data_modules/run_ledger.pyrun_logger.py
备份 scripts/backup_manager.pyarchive_manager.py
Dashboard dashboard/server.pyapp.pywatcher.pypath_guard.py
运行时护栏 hooks/hooks.jsonhooks/guard_runtime_write.pyhooks/session_start.py
设计文档 docs/architecture/overview.md(真源划分/三定律/节奏)、docs/guides/commands.md(命令详解)、docs/operations/operations.md(运维)

8. 结语:心智模型一句话版

这本书的"大脑"是 .story-system/(合同+提交),.webnovel/ 只是它的"体检报告";写一章 = 签合同(story-system)→ 干活(三个 agent)→ 过闸(write-gate)→ 交账(chapter-commit)→ 记账(五路投影)→ 存档(backup)。

排查问题时先问三个问题:项目根定位对了吗?(where/preflight)主链健康吗?(mainline_ready)账目平了吗?(projection_status 五项 + projection_log.jsonl)——90% 的故障都能沿这条链找到方向。