muse-agent-example/docs/plans/2026-08-22-阶段F-第一部分-两阶段写手-探索与生成分离.md

5.0 KiB
Raw Blame History

阶段 F 第一部分:两阶段写手(探索与生成分离)

日期:2026-08-22 状态:已完成(离线绿) 上游证据:两次生产烟测(run-prod-work12-ch3-e7829416 / run-prod-work12-ch3-59f43855)

1. 问题(烟测实证)

单阶段派发下,多回合探索循环与长篇一次性产出合同冲突:

  • 第一次烟测(medium,带元标签指令):写手 0 次工具调用(预组装上下文让探索冗余),正文复读细纲原句「链接加深」,机械门 OUTLINE_PHRASE_LEAKED 拦截。
  • 第二次烟测(high,指令留空):写手真实探索(26 次工具调用、6 回合、依赖清单落盘),但正文碎片散落在中间回合,最终消息只剩 909 字残稿,机械门 CANDIDATE_LENGTH_OUT_OF_RANGE + HARD_EVENT_MISSING 拦截。

结论:探索与生成必须分离——探索走多回合框架循环,生成走单次成稿。

2. 设计

阶段一(探索):派发写作智能体(只读工具,独立探索会话)
  产出 = 探索清单(小结构化 JSON,writer-exploration-manifest-v1)
  独立派发运行记账(事件、raw、依赖清单)
        ↓
确定性回放:按清单逐条重放只读工具(无模型参与)
  产出 = 写手实际依赖的资料(含来源工具与参数)
        ↓
阶段二(生成):派发写作智能体(无工具,写作会话)
  冻结生成输入 = 探索资料 + 篇幅/文风合同(来自冻结上下文投影)
  单条回复一次写完本章全部正文
        ↓
信封绑定:复用 dispatch_writer_bridge(身份、哈希、版本由桥绑定)

关键取舍:

  • 生成输入不含预组装(细纲/基线/事实摘录/范式卡不进生成输入);写手事实只来自它探索到的资料。合同部分(篇幅、文风约束)仍由生产编排冻结注入。
  • 探索清单回放是确定性的:同一清单重放得到同一份资料;资料与清单一并构成链路透视数据。
  • 探索失败、清单非法、回放失败、生成失败一律失败关闭,不产生半绑定候选。
  • 探索会话(writer-explore-work{W}-ch{T})与生成会话(writer-work{W}-ch{T})分离:探索历史不混入生成上下文,写作连续性跨版本保留。
  • 证据归属不变:探索运行与生成运行各自记模型事件/raw;生产运行只绑候选与质量证据;writer_raw_ref 指向生成运行。

3. 改动台账(逐项)

文件 动作 原因
.agent/skills/write-next-chapter/scripts/two_phase_writer.py 新增 两阶段编排:探索任务包装配、清单严格校验、确定性回放、生成输入装配、两阶段派发编排
.agent/skills/write-next-chapter/scripts/dispatch_writer_bridge.py 修改 增加覆盖位(任务提示词、冻结创作输入、工具开关、会话标签);缺省行为完全不变
.agent/skills/write-next-chapter/scripts/produce_next_chapter.py 修改 新增 --two-phase 旗标(隐式派发模式);探索摘要落工件与终端
tests/skills/write-next-chapter/test_two_phase_writer.py 新增 17 项离线测试:清单校验 7、回放 2、生成输入 2、编排 3、任务包 1、桥扩展 2

4. 验证

  • 新增测试 17/17 通过。
  • 全量离线门禁:82 个标准 OK + 19 个自定义输出通过(逐一核实无真失败),0 失败;桥扩展未破坏既有用例。
  • 真实验证留待下一步:produce_next_chapter.py 3 --two-phase --provider catproxy-anthropic --model claude-opus-5 --thinking high。

5. 生产验证问题与修复(2026-08-22/23)

第三次真实烟测(run-prod-work12-ch3-142d6cf0)在生成阶段挂死,失败关闭收口。根因与修复:

问题 根因 修复
生成阶段模型发起探索工具调用,--no-tools 下无法解析导致挂死 写手角色合同写“动笔前按需使用授权工具自主取材”,与生成阶段“无工具”冲突;模型非确定性服从 writer.md 改写为两阶段形态:探索阶段(白名单非空,只探索不写作)/ 生成阶段(白名单为空,禁止工具调用,单条成稿)
生成会话被旧单阶段运行(带工具的探索+碎片写作)污染,诱导探索行为 生成复用旧会话 writer-work{W}-ch{T} 生成会话独立标签 writer-gen(探索为 writer-explore)
挂死不能无限阻塞 看门狗已存在(绝对超时 maxDurationSeconds,到点杀进程,FRAMEWORK_TIMEOUT) 无需新增;本次人工提前清理仅为节省等待
令牌经命令行传入在进程表可见 tmux 命令串内嵌环境变量赋值 运行结束后轮换 MUSE_AI_NEW_API_TOKEN;后续用环境文件或进程内注入,不进命令行

6. 未决(下一阶段)

  • 两阶段真实烟测通过后:两阶段成为生产默认形态,单阶段派发降级为对照模式;角色合同与领域文档同步改写(写手 = 探索阶段 + 生成阶段)。
  • 评委与抽取智能体的框架派发接入、直调链终态裁决仍按总 plan 阶段 F 推进。