# 三层灵感库管道 story-long-analyze 的可选后置管道:把 Stage 3 已抽象好的 EM 机制卡组织成可跨书检索的资料。不重新拆文,不写新故事;**单书拆文不自动入库**——只在用户提出「灵感库 / 提炼灵感 / 跨书灵感聚合 / 更新灵感库」时运行。 ## 复用优先(第一原则) 机制与案例分析在拆文主管道已完成一次:`剧情/情绪模块.md` 的 EM 卡是机制全文的**唯一维护位置**,剧情单元是案例的唯一维护位置。本管道只做登记(IA)、单书归并(NM)、跨书聚合与打标(CBA),任何一层都**不复制** EM 卡正文;卡内来源引用使用裸 ID;跨书引用带书名前缀,如 `书名/EM-xxx`,需要读原文时按 ID 经 `灵感索引.csv` 回查(或用 `resolve` 子命令),禁止在卡里堆路径链接——`validate` 会机械拒绝。 ## 输入边界 只读:各书 `剧情/情绪模块.md`(EM 完整卡+其他机制索引)、按 EM 卡「关联节奏/证据来源」定点查证的 `剧情/节奏.md` 与剧情单元、现有 `灵感库/灵感索引.csv` 与 NM/CBA 卡。 **禁止读取 `原文/`、`chapter_index.csv` 与逐章摘要正文。** 入库前先对每本书跑一次只读检查器(SKILL.md「Phase 1」),看 `classification`、`current_capabilities`、`conflicts` 和覆盖范围。缺 `剧情/情绪模块.md` 或完整卡字段不全(`check-atoms` 报 error)时停下,请作者回拆文主流程:缺文件补 Stage 3,卡不全按 SKILL.md「Phase 2」末段修卡,都不读原文;不得在灵感层代写机制卡,也不得把旧资料概括成伪造的主产物。原文追加或局部变化后,先由主管道重建索引、补齐分析,并按请求更新 EM 卡,再重跑登记;`validate` 的 `ia_em_set_mismatch` 会指出未重登记的书。 各层引用拆文产物的约定:单书案例以 `剧情/*.md` 的剧情单元为准,可迁移机制以 `剧情/情绪模块.md` 的 `EM-*` 为准,`拆文报告.md` 只是阅读入口,不作第二份事实来源。客观事件、披露节点和三维节奏分别用 `EV-*`、`RV-*`、`AX-*`,机制卡通过 ID 引用,不跨层复制全文。 ## 公共目录 从当前工作区向上定位最近的现有 `灵感库/`;没有时在工作区根创建: ```text 灵感库/ ├── 灵感索引.csv # 三层统一索引,也是 ID → 位置的唯一解析表 ├── 单小说灵感合并/{书名}/NM-001.md # 仅在确有合并时创建 └── 跨书灵感聚合/CBA-001_{机制名}.md ``` - 原子灵感 = Inspiration Atom,ID `IA-001`。**只是索引行,没有文件**——对一张 EM 卡的登记,编号镜像 EM 编号。 - 单小说灵感合并 = Single-Novel Merge,ID `NM-001`。 - 跨书灵感聚合 = Cross-Book Aggregation,ID `CBA-001`。 ## 管道三步 ### 1. 原子灵感登记(确定性机械步骤) ```text {PYTHON} "{story-long-analyze skill 根}/scripts/inspiration_index.py" register-atoms --root "{灵感库}" --module "{拆文目录}/剧情/情绪模块.md" --book "{书名}" ``` - 完整卡(读者想看什么/情绪链/戏剧单元/可替换项/不可照搬 五字段齐)登记为 `grade=full`;「其他机制索引」条目登记为 `grade=index`。 - 先用只读的 `check-atoms`(与 register-atoms 同参数)自检:输出卡数、索引数、角色名单规模与全部问题,不写文件。所有卡的问题一次报全,有任一 error 就整体不写盘。 - 一次原子写入、重跑逐字节幂等;多本书逐本串行登记,不要并行跑 `register-atoms`。本步不得调用模型重新概括机制。 - 专名检查的角色名单取自 `拆文库/{书}/角色/`;从 `--root` 向上查找含 `拆文库/` 的工作区,输出恒带 `character_roster` 数。 报错处理:error 都回 Stage 3 改 `剧情/情绪模块.md` 再登记,warning 由人工复核。 | 报错 | 意思 | 怎么修 | |---|---|---| | `em_fields_missing` / `em_field_value_empty` | 五个必填字段缺失或值空 | 补齐;表格写法把整段值写进格子,`- **字段**:` 列表写法的值可以接在字段名行之后多行写 | | `em_title_missing` / `em_header_unrecognized` / `em_field_duplicate` | 卡头不是 `### EM-xxx 名称`、标题行认不出、同卡字段重复 | 多半是卡被截断或并进了上一张,按模板重写卡头 | | `source_specific_name_in_mechanism` / `replaceable_antipattern` | 本卡「不可照搬」点名的专名又出现在标题、读者想看什么、情绪链、戏剧单元或可替换项里,或可替换项写成「专名→任意X」 | 改成功能位;「不可照搬」字段本身点名专名是它的职责,不算 | | `leak_suspect`(warning) | 只是角色卡文件名子串命中,没有佐证 | 人工看命中字段,确认不是专名就保留 | | `character_roster_missing`(warning) | 书目录在但没有 `角色/` | 人工确认卡里没有专名 | | `workspace_not_located` | 找不到含 `拆文库/` 的工作区 | 加 `--workspace` 指定,不得用空名单放行 | | `module_book_mismatch` | `--module` 不在 `拆文库/{--book}/` 下 | 改对书名或路径 | ### 2. 单小说灵感合并 只在一本书内确有 ≥2 张 EM 卡同构时创建 NM;同构须满足触发、情绪链与兑现机制相同,孤立机制不建 NM。卡内容是**合并增量**,机制链不抄写: ```markdown # NM-001:{簇名} - 合并对象:EM-001、EM-003 - 合并理由:{为何同构,一两句} - 差异形态:{各卡触发物/场合/规模的不同} - 本书特有偏置: - 共同反例/边界: ``` ### 3. 跨书灵感聚合 把各书 IA/NM 与现有 CBA 索引摘要比较,只读可能匹配的 active CBA。已建库后的增量先跑只读的 `coverage`:它列出尚未进入任何 active CBA 闭包的原子与现存单书假设卡——聚合比较只对 uncovered 原子做,顺带复核单书假设卡是否因新证据升级为「跨书重复验证」;uncovered 为空时不再比较已覆盖的 EM 卡;仍复核已有单书假设卡的验证状态。CBA 是**唯一供写作反复读取的卡**,必须自包含跨书归纳的抽象(聚合新产出,不是 EM 原文复制): ```markdown # CBA-001:{机制名} - 验证状态:{单书假设/跨书重复验证} - 来源:{甲书/EM-001、甲书/NM-002、乙书/EM-003}(溯源按 ID 查 灵感索引.csv 或用 resolve) ## 共同机制链 {触发 → 读者认知/情绪变化 → 持续阅读动力 → 兑现} ## 可变参数 - 人物功能位:/关系动作:/冲突载体:/兑现规模:/节奏位置: ## 可能适用于 - 题材:/读者需求:/情绪:/关系动作(可空):/剧情功能:/节奏位置(可空):/适用阶段:/风险: ## 条件、反例与边界 - 成立条件:/反例:/不可照搬:/误用风险: ``` `novel_count`/`atom_count` 不手写进卡——由索引 `source_ids` 闭包自动核算并校验。只有一部书支持时,最多激活 3 张最有写作复用价值的 CBA 并标 `单书假设`;两部及以上独立来源才标 `跨书重复验证`。标签只表达适用性,一本书来源不能写成市场定论。 ## 索引与受控标签 `灵感索引.csv` 表头严格为: ```csv item_id,layer,title,source_book,path,source_ids,novel_count,atom_count,grade,tags,status ``` - IA 行 `path` 为空、`grade` 取 `full/index`;NM/CBA 行 `grade` 留空;IA/NM 的 `tags` 留空,避免写作绕过聚合层。 - `source_ids` 来源图:IA 行=单个 `EM-xxx`;NM 行=同书 ≥2 个 `EM-xxx`(`|` 分隔);CBA 行=`书名/EM-xxx` 与 `书名/NM-xxx` 混合列表(必须带书名前缀)。引用 NM 时其成员 EM 自动并入闭包,**不需要也不应该再展开列出**;`novel_count`=闭包内不同小说数,`atom_count`=闭包内不同 EM 数。 - 标签序列化为 `轴=值1|值2;轴=值`。CBA 必填轴:题材、读者需求、情绪、剧情功能、适用阶段、风险;可选轴:关系动作、节奏位置。同义值先归一;不用「好看/有趣/高级」等不可执行词。 - **标签值受控于库内 `灵感库/标签词表.md`**(每轴一节 `## 轴`、一行一值 `- 值`):建库首轮聚合把用到的值落盘成首版,此后打标先读词表。扩表走同义判定——候选新值逐一与该轴现有值语义比对,重合或从属就用现有值,确属新维度才追加一行;query 命中靠值的精确匹配,写入侧与查询侧共用这一张表。 - `validate` 校验:表头、ID 前缀、EM↔IA 集合一致、NM/CBA 闭包与计数、必填标签轴、单书 active CBA ≤3、验证状态标记、**卡内无路径引用**;词表存在时另拒表外值(`tag_value_not_in_vocabulary`)与缺必填轴的词表(`vocabulary_axis_missing`)——词表缺失时这两项不查(旧库兼容),应尽快补建;同义值靠扩表时的人工比对,不做机械子串判定。列数不对的索引行报 `column_count_mismatch`。 - `query --tag 轴=值 …` 只筛 `layer=跨书灵感聚合` 且 `status=active`,核心轴(题材/读者需求/情绪/剧情功能/适用阶段)2 分、其余 1 分,无核心轴命中不返回,按分数/来源数/ID 稳定排序取 Top 3–8。返回值另带 `unmatched_tags`(请求值在全库该轴零出现)与 `axis_inventory`(所查各轴现存值):零命中先按它们纠词重查一次,仍零命中才算「库里没有」。 - `resolve --ref 书名/EM-xxx --ref CBA-001` 把裸 ID 解析为可读位置——需要时才查,不预先展开进任何卡。 ## 写作侧消费约定 写作模块只读标签命中的 active CBA 全卡(Top 3–8),不沿来源下钻 EM/NM;CBA 不作文风样本,也不触发原文读取;同一 CBA 最多派生 2 个候选变化。消费入口只在 story-long-write 的开书、卷纲、细纲三处(适用阶段=设定/卷纲/细纲);逐章写前召回和写手 prompt 不读灵感库,灵感经细纲进入正文。 ## 断点与禁止事项 不设进度文件——索引与卡片现状就是状态;中断后重跑登记(幂等),用 `validate` 报错清单定位未完成层。禁止:回读原文、二次逐块语义分析、任何层复制 EM 卡机制全文、卡内路径链接、自动生成故事种子/角色组合/成稿桥段、复制原作专名与原句(跨书层连角色名都不得出现)、为凑数硬并语义不同的机制。