80 lines
11 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: read-context
description: 组装智能体上下文包——统一创作数据读取器(专题-06 §7)的阶段一实现。任何智能体要作品上下文,必须经这套流程;按 schema 的 aiContext 逐字段裁剪并落回显。
---
# 组装上下文(统一读取器)
SoT 对齐:包结构=专题-03 §4.2 **四层上下文**;字段级 aiContext 裁剪=专题-06 §7 统一读取器。
**输入**:作品名、功能(scenario,专题-03 §4.1:continuation/rewrite/expansion/polish/extraction/full_parse/planning/fine_outline/validation/consistency_check/quality_gate)、目标(如"写第7章")。**用途(purpose)由 scenario 映射**——生成类→`generation`,抽取类→`extraction`,规划类(`planning`/`fine_outline`)→`planning`,检测→`detection`,quality_gate→基线包即 writer 视图;purpose 定字段可见集(aiContext),scenario 定功能指令段(`meta/chains/`)与 L0 形态,两者不混。
## 步骤
正文 `continuation` 的 v1 流程在通用四层裁剪之前先执行以下可信读取链,禁止跳步:
1. **固定检索计划**:从已确认细纲的人物、关系、物品、地点、力量体系和硬事件生成 `RetrievalPlan`;计划身份排除 `runId`,查询范围在写手启动前冻结。
2. **卡索引**:生产只调用 search skill 的 `work` 授权面,只读 active Canonical entity 和有效 binding;参考作品回放只读预注册 `upgrade_book` 评测卡,固定 `productionRetrievalEligible=false`。
3. **原文回读**:抽取卡只保留 `sourceVersion/sourceRefs/stateAsOf` 索引。每条历史事实必须顺着块级来源指针,在 `REPEATABLE READ READ ONLY` 快照内读取 `chapter <= asOf` 的原文;缺少指针的卡只记 `unverifiedIndexHint`,不能单独进入事实证据。
4. **双证据组装**:连续前四章全文先进入 `proseEvidence` 基线,再按卡指针补充历史原文并去重;`factEvidence` 只接收冻结历史原文、正式设定、Canonical 状态和细纲声明的新事实。正式设定、Canonical 状态、细纲新事实必须保留各自不可变权威引用,不强造历史原文。
5. **冻结与回显**:按 `score DESC, sourceVersion ASC, sourceId ASC, sourceOffset ASC` 稳定排序,生成 JSON `WriterContext v1` 和 Markdown `RetrievalManifest`。清单与上下文身份排除运行 ID、时间戳和执行节点;预算裁剪必须回显来源与 `token_budget` 原因。
对应实现:`scripts/writer_contract.py`、`scripts/retrieve_writer_sources.py`、`scripts/assemble_writer_context.py`。写手只能接收最终冻结的 `WriterContext v1`,不得直接接收卡片全文,也不得自行搜索或回读文件。
1. 读 `works/<书>/装配.yaml`:拿槽位绑定与知识绑定。**未绑定的 `knowledge/` 内容一律不读**(=Layer 3 的授权门)。
2. 读 `meta/schemas/` 相关型的 `aiContext`,得出本用途的可见字段集:`true` 可见;`false` 不可见;`[用途…]` 仅列出的用途可见。
3. 按**四层**取数并逐字段裁剪——层是分组骨架,取数规则按**来源**逐条执行:
- **Layer 0 当前输入**(不可省略,每回合必变):
- 用户本回合意图:指令原文,不改写不转述;
- 操作对象:作品/章号/选区与 expectedRevision(改写场景必带);
- 本章细纲:出自大纲当前章条目;
- 输出合同:字数区间/frontmatter 要求/新设定申报块等(按 agent 的产出合同);
- L0 内部同按稳定度排:细纲在前(同章多轮重生成不变),本回合修改意见最后。
- **Layer 1 近邻正文**(正文 continuation v1 不可省略):
- 目标章之前连续四章**全文**作为已验证基线;作品不足四章时从第一章开始,不重复;
- 卡索引命中的来源原文作为补充,按不可变来源引用去重并稳定排序;
- `状态.md` **全文**(伏笔台账/时间线/角色最新状态)——"叙事现在时"快照,归近邻层。
- **Layer 2 作品事实**(一致性/规划不可省略;只读已确认):
- **设定**:`设定.md` 四节;`generation` 用途裁掉「谜底与真相」「结局方向」「弃案记录」等非 generation 字段;
- **大纲**:`generation` 只取主线一句话+当前卷细纲+近三章细纲;「未来卷粗纲」仅 `planning` 可见;
- **知识卡**:只取本章细纲出场清单涉及的人物/关系卡,及其**关联的地点/势力/功法/物品/事件卡**,**不整库倾倒**(planner/detector/extractor 按差异矩阵取全量索引);卡内字段同按 aiContext 裁——「创作备忘」永不进包,「成长弧线」续写不进(仅 planning/detection);**「演变历程」(各实体型完整历史层的里程碑数组)续写不进(仅 detection/extraction)**——对续写关闭不是防剧透(台阶都已发生),而是怕上万字明细撑爆上下文;续写只需当前态+「演变概括」一句梗概,一致性检查才读全历史查跳级穿帮。
- **Layer 3 授权资料**(按场景可省):
- **公共范式**:仅 `装配.yaml` 已绑定的库;按本章场景类型选卡(如打斗章带打斗卡),不整库带入;extractor/judge 此层关闭(见差异矩阵)。
4. 产出**上下文包**——两个顺序必须分开:
- **预算序**(谁不许被裁,对齐专题-03 §4.2):L0 必须完整保留;超长先摘要化 L3→L2,再截 L1,永不动 L0;
- **拼装序**(物理顺序,按稳定度递减,吃 prompt 前缀缓存):**通用系统位**(一句极简声明,全 agent 相同) → **章级基线包**(跨 agent 共享缓存段)=L2 作品事实+L1 近邻正文+L0 稳定部(本章细纲),**按 writer 的 generation 可见集组装**(最保守视图:底牌全闭) → **agent 身份段**(角色指令=agent prompt 正文,后置于基线包) → **功能指令段**(本次 scenario 的功能 skill,其余功能的指令不进上下文;同功能多回合稳定) → **agent 增量段**(差异矩阵的增量,**只加不减**:detector 补底牌+知识全集/extractor 补 schema 合同+既有知识/judge 补 rubric/planner 补底牌+未来粗纲;L3 授权资料/检索结果;待检待评对象) → **L0 易变部**=用户本回合意图/修改意见(每回合必变,**绝对尾置**,亦是遵循度最优位)。
- 跨 agent 复用机理:同章流水线(writer→detector→judge→extractor)基线包**字节一致**(本 skill 必须确定性渲染:同序、无时间戳),首跑写缓存(+25%),后续 agent 读缓存(1/10 价)。安全性两头锁死:基线=writer 视图保证**无人多看**(writer 基线 ⊆ 其余各 agent 可见面);增量只加不减保证**无人少看**。同一 agent 的重生成/复评环在此之上再吃更长前缀。
- 缓存注记:L3 检索查询尽量从本章细纲构造,意图只在用户点名新参考时追加——使 L3 章内趋稳,同章 n=5 重生成环吃到更长前缀。
- 归属判据(什么进身份段,什么进层):**换作品也不变**的进 agent 身份段(角色/方法论/agent 级输出合同/红线);**随作品变**的进 L2(文风画像/设定——身份段不得硬编任何作品专属内容,这是「换绑写手不动链」的前提);**随回合变**的进 L0 易变部。**种子=prompt 文本,位置=装配层决定**。
- 落地口径:阶段一 Claude Code 子代理机制把 agent `.md` 钉在系统位、各 agent tools 也不同,跨 agent 共享物理上不成立——实验量小,不为省缓存把五个角色并成通用执行器;**阶段二 muse Context Assembly 完全控制消息布局,按本条共享前缀设计落**。「预算序≠拼装序+章级基线包共享前缀」整体列为回填专题-03 候选。
包尾附**裁剪回显**两段:字段级=被 aiContext 挡掉的字段名与原因;来源级=omittedSources(未绑定跳过的库、出场无关未选的卡数,原因对齐 `not_authorized`/`not_relevant`/`token_budget` 枚举)。
5. 回显落盘:`works/<书>/评审/上下文-第NNN章-<用途>.md`(运行噪音,gitignore 已挡,不提交)。
## 按 agent 的差异矩阵(骨架四层不变;差异=字段可见集 × 每层取数范围 × 层必省性)
| agent(scenario) | L0 当前输入 | L1 近邻正文 | L2 作品事实 | L3 授权资料 |
|---|---|---|---|---|
| writer(generation) | 本章细纲+任务 | **必**:上章尾 1–2 场景原文+前章摘要+状态 | 必:设定(裁底牌)+近三章细纲+**仅出场卡** | 按本章场景类型选绑定范式卡 |
| planner(planning) | 规划任务+范围 | 可省:近章摘要即可 | **必**:可见度最高——底牌字段开+未来卷粗纲开+知识卡**全量索引** | trope/公式类范式优先 |
| planner(fine_outline) | 目标章细纲任务+未知项纪律 | 可省:只读冻结视图中的近章结构摘要 | **必**:当前大纲、叙事现在时、截至冻结点的安全设定/卡索引;回放时关闭目标章及未来来源 | 仅使用已授权且通过冻结审计的资料 |
| extractor(extraction) | 抽取任务+目标型清单 | 待处理章**全文**(是处理对象,不截尾) | schema 字段合同+既有知识**全集**(判重/判冲突) | **关**:防外部范式诱导脑补 |
| detector(detection) | 检测任务+待检候选全文 | 必:近邻正文(连续性比对) | **必**:知识全集+状态台账+**底牌开**(查提前泄底必须知道谜底) | 范式卡「失效风险」字段可选 |
| judge(quality_gate) | 待评候选+rubric | 随基线包 | **=writer 基线**(共享前缀;评设定一致性需同一基准,不另加底牌) | **关**:不拿范式当标准答案 |
方向性规律(统合策略的魂):
- **生成向防剧透**(writer):底牌闭——知道结局的作者写不出"不知道结局"的叙述;
- **规划向看全局**(planner):底牌全开——规划正是管理底牌的地方;
- **抽取向忠于原文**(extractor):参考关闭——给参考就会把参考抄进抽取结果;
- **检测向持有基准**(detector):比对基准要全,与 writer 互补——writer 看不见的它必须看见;
- **评审向同证独立**(judge):**可见面=writer 基线,不多不少**——多于 writer,会拿写手看不见的信息"合理化脑补";少于 writer,评不了设定一致性。
落地与演进:阶段一矩阵写死在本 skill;PG 版随功能链节点配置入库(矩阵本身是元数据,不散进各 agent prompt)。此矩阵是实验设计稿——SoT(专题-03 §4.2)只给到 scenario 级可省略性,逐 agent 策略由这里试出来,验证后回填;「四层序=预算序、物理拼装序=稳定度递减(L2→L1→L0稳→L3→L0变,易变尾置吃缓存)」这一区分 SoT 亦未言明,同为回填候选。
PG 版(闭环 C4)只换 L2/L3 取数方式(search skill 召回+授权过滤),层结构与回显合同不变。
## 红线
- 不得绕过裁剪把整文件塞给智能体;
- 裁剪清单必须如实——它是场景 A3/A7 的验收证据;
- 本 skill 是唯一取数通道:智能体缺什么上下文,改这里或改 schema,不许智能体自己翻仓库。