zizi b9ff4d0b40 修复: 阻断历史单窗重跑破坏成长链
以正文证据校验实体出场章,补齐失败恢复和参数边界;历史窗口重跑在写入前失败关闭,仅保留末窗安全重试。记录 work8 全书前滚重建的 P0/P1 边界。
2026-07-21 16:08:15 +08:00

85 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: parse-book
description: 全书解析/拆书的功能合同(scenario: full_parse,分析槽位)。存量作品→规划逆向(大纲/细纲)+实体;参考书再加范式拆取(脱敏)。逐章内环复用 extract-knowledge。
disable-model-invocation: true
---
# 全书解析/拆书(scenario: full_parse | purpose: extraction | 槽位: 分析→extractor)
何时用:**没拆过的完整/存量作品**。与章后抽取(extraction)的分工:那边是"已有大纲细纲、写新章后抽增量";这边是"什么都没有,从全文逆向解析出规划层与知识面"。
## 两个子场景(产出归属不同)
| 子场景 | 产出 | 归属与确认 |
|---|---|---|
| 2a 用户存量作品(U7/C8) | 章节结构+逐章细纲+全书大纲+实体/关系/事件+末章 narrative_state | 全为候选,**按章审阅确认**(产品-03 §3.7);确认后成正式规划与 Local KB,作品才可续写;脱敏红线不适用自有稿 |
| 2b 系统参考书(G3/B1-B2,如封神演义) | 同上解析产物作**中间脚手架**(拆书证据链,留档、不需逐章确认)+在脚手架上拆**范式五型** | 范式卡(脱敏)入 Global,管理员确认=G3 门;脚手架标 internal |
范式五型也是 entity-scope 的型,但与作品实体分两批:作品实体归 Local、范式归 Global 且吃脱敏红线。
## 元数据驱动
- 规划逆向的结构=`outline`/`chapter`/`scene`/`narrative_state` 字段合同;实体=各实体型字段合同;范式=五型字段合同+「判据」归型——schema 加字段,解析产出立刻多一列。
- 「细纲」是本仓先行的规划粒度层级(SoT 只有"正式规划项"),连同**规划逆向本身都是对产品-03 §3.7 的增补**(SoT 全书解析只列章节/实体/关系/事件)——待回填。
## 编排形态(拆书不是"一个 agent 跑到底")
一本完整的书=成百上千次顺序调用,单个 agent 的上下文装不下也不该装。分层:**编排层是 workflow**(确定性:分章循环/断点续跑/入库/进度统计——阶段一由主会话或 Workflow 工具驱动,阶段二=muse 功能链+任务调度);**循环体才是 agent**(extractor 的一次有界任务:输入=第 N 章原文+库里积累的脚手架,输出=本章细纲+实体增量,写回库)。关键约束:
- **状态全在库,不在会话**:前 N-1 章的细纲/实体是第 N 章的上下文,必须从库读——这正是 PG 基座先行的原因;
- **断点续跑与幂等**:已处理章号落库,重跑某章=按章号覆盖其 draft 行,随时可停可续;
- **顺序性只来自增量判重**(新实体要对着已积累实体判重合并),细纲逆推本身章间独立——先顺序跑保正确,并行化留作后续优化;
- 进度每 10 章报一行(章号/新实体数/累计分型统计)。
**M3 直调形态(创始人 2026-07-13 拍板,现行)**:循环体不再派 opus/haiku 子代理,改为 `scripts/parse_llm.py` 直调 New-API `MiniMax-M3`(经 llm skill)。
**出卡权上移窗级(B4-S3 重构,现行)**:章级逐章出卡有三同根病(同功撞车/单章证不成跨章公式/间隔数字伪精确),治法=章级只产「范式候选线索」(并入脚手架 pass,正文只过一遍),出卡在窗级聚类归并——同一手法多章多次出现归并成一张母卡+实例章号,**间隔章数由实例章号差机械计算**(M3 禁自报数字)。跨窗/跨书同手法靠**嵌入判重**(初筛 ≥0.85 → M3 归并终判 merge/keep,拿不准保留)。大纲窗行(example_parse_outline,幂等键=窗起始章)是出卡窗的唯一切分依据。
**放量全流程(每书五步,均 M3)**:
```bash
# ① 章级 pass(细纲+实体+范式候选线索;断点续跑,重跑自动补失败章)
.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py chapters --work-id 4 --from 1 --to 50
# ② 窗级大纲聚合(每 5–10 万字:多章细纲+正文→阶段大纲;书末残窗无论大小必成窗)
.venv/bin/python .claude/skills/parse-book/scripts/parse_outline.py window --work-id 4
# ③ 窗级聚类出卡(窗=②的窗行;线索+细纲+阶段大纲→母卡;守卫+判重在 parse_ingest cards)
.venv/bin/python .claude/skills/parse-book/scripts/parse_llm.py cards --work-id 4
# ④ 全书拆完:终检(逐窗细纲对账大纲 + 跨段连贯性纵览)
.venv/bin/python .claude/skills/parse-book/scripts/parse_outline.py check --work-id 4
# ⑤ 公共卡三角色审核(番茄作家/起点作家/主编,M3 常设步骤;见 review-cards skill)
.venv/bin/python .claude/skills/review-cards/scripts/review_cards.py review --batch <批次> --work-id 4
# 进度
.venv/bin/python .claude/skills/parse-book/scripts/parse_ingest.py progress
```
审核纪律:常设审核=M3(已用 opus 金标准校准,偏差 0.45 达标);fable/opus 只做起量前校准与起量后一次总审核(门禁与优化,不进流程循环)。
试拆实测病理档(放量前须知):M3 细纲按比例会写超(治=绝对字数上限+压缩重试);type 一律标 craft 且串型混填(治=合同动态渲染+字段指纹改型+窗级聚类);重跑自噬(治=窗级幂等软删+0 卡不软删,章级判重名录已随 S3 废除);source 偷懒(治=出处由实例机械生成)。parse_ingest 的 patterns 命令是 S3 前章级出卡入口,仅留作回滚保险。
**窗行陷阱(放量首日实测)**:`--window` 参数变化后重切,旧窗行会按 from_order 占位,新的大窗被「已有大纲跳过」→ 中间章域永远漏出卡(验收期 1–3 章小窗占住 from_order=1,放量 1–34 章大窗被跳过)。**换窗参数重切前必须先删该书全部窗行**(窗行是可再生中间产物;卡挂「窗起」,cards 重出时按窗软删重出)。
**作品面升格执行器 `scripts/parse_upgrade.py`(与上面范式拆书管线并行的另一条线,命令 `windows`/`run`/`status`)**:把参考书正文按窗抽成「会随剧情长大的实体卡」(升格卡,`source_type=upgrade_book`),设计见 `docs/2026-07-16-升格卡改造设计.md`。里程碑除真实章号外,模型输出必须临时携带所标章节正文短引;系统机械核验后删除证据,错章、缺证据或改写证据均拒收入库并留审计。模型给出的顶层出场章也必须由实体规范名或合法别名在对应章节正文中的实际出现机械证明;合法别名集合同时取卡内 payload 与独立 alias 表,单字规范名禁作章证据,规范名和别名均禁止通用称谓/关系称呼(如队长、舰长)作证据,常规二至四字专名保持精确子串命中。未命中章不得参与立卡、登场兜底或既有卡追加,无实证章时不补登场里程碑;既有卡每窗新增出场章必须审计完整旧值,redo/undo 精确恢复后再按新正文重算。显式 redo **仅允许当前 active 末窗**:执行前机械校验窗口号连续、章域合法且首尾相接,并校验目标窗逐章正文齐全且非空;任一失败必须在快照、undo 与任何写入前非零退出。历史窗修正必须全书前滚重建;后缀级联重算属于 P1,当前不支持。合法末窗 redo 仍须在撤销事务中清除所有 active `upgrade_book` 卡的本窗章域,保留窗外章并为历史无审计数据补旧值审计;redo 前建立完整恢复点(卡 payload/revision/deleted、别名、presence、水位、审计与窗状态),首次失败重新清理再试,最终失败完整恢复且重试初建卡软删。`--max-calls` 不得截断已经开始的即时重试,非显式 redo 不做该全局清理。`run` 默认**不发嵌入**;加 `--semantic-dedup` 开语义判重(治改名/跨型漏并)时,每窗按**读→算→写三段式短连接**跑——观察/近邻召回/M3 终判都在**无长连接**段发 LLM 与嵌入 HTTP(不再持窗级连接跨调用存活),写段只查预判结果落库;并**边抽边嵌**:本窗新建/更新卡在窗事务提交后增量嵌入落库(软删旧向量+upsert 新行),**后窗即可语义召回前窗刚长成的卡**,不再依赖"同书须预先全量 embed"。嵌段失败只告警、不牵连已 done 的窗。
**范式线失败关闭(2026-07-21 假绿复盘后现行)**:`parse_outline.py window`、`parse_llm.py cards`、`parse_outline.py check` 是同一本作品的顺序流水线。普通网络/429/5xx 由 `chat_governed` 在单模型内短重试后沿 `MiniMax-M3 → MiniMax-M2.7 → glm-5.2 → deepseek-v4-flash` 降级;整条链耗尽,或功能层结构输出有限重试仍失败,必须**立即停止当前作品并保留断点**,禁止跳窗/跳型继续。`cards` 和 `check` 开始前机械验证大纲窗对全书章域无头部、中部、尾部缝隙;任一缝隙非零退出。补插窗后所有终检按 `from_order/to_order` 绝对章号排序并重新编号阶段,`window_no` 只作运行展示号,不得参与时序判断。
## 步骤(自底向上,与创作期规划的自顶向下互为镜像)
1. 静态分章:import skill(规则,LLM 不参与);
2. **逐章内环——复用 `extract-knowledge` 的字段 checklist**:逆推本章细纲(章目标/关键事件/出场/伏笔动作/钩子)+抽实体增量;上下文=前 N-1 章已积累的细纲与实体(知识库从空增量生长,`作品+元数据+知识库+当前章`公式在此逐章成立);
3. 自底向上聚合:章细纲→卷粗纲→主线一句话;伏笔跨章连线(哪章埋哪章收)在聚合时补;
4. 2a 补末章 narrative_state;2b 在脚手架上跑范式拆取(判据归型/字段成卡/判重合并例证);
5. 汇报:分章数/细纲覆盖率/实体分型统计/(2b)范式分型统计+设计发现。
## 比例约束(防"摘要化伪装成结构化";创始人已拍板@2026-07-09,权威值在 outline schema 字段说明)
- 章细纲/章正文 ≈ 3–5%(3000 字章→100–150 字);卷粗纲/卷正文 ≈ 0.3–0.5%;主线一句话 ≤50 字。
- **细纲是结构骨架,不是缩写**:超比例=机械退回重解析的判据——比例约束的价值不只是省 token,是防解析退化成压缩复述。
## 脱敏红线(仅 2b 系统级)
只写抽象结构与手法归纳,严禁抄录原文;**≥15 连续字与原文重合=违规**;每卡带出处(书名+回目+一句话情节定位)。
## 输出合同
文件版:2a 落 `works/<书>/`(候选);2b 脚手架落参考书目录、范式卡入 `knowledge/范式/`(草稿)。PG 版(B2):结构化清单经主会话 db skill 写入(draft)+embed 嵌入。均不提交/不自确认。