71 lines
5.0 KiB
Markdown
71 lines
5.0 KiB
Markdown
# 阶段 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. 设计
|
||
|
||
```text
|
||
阶段一(探索):派发写作智能体(只读工具,独立探索会话)
|
||
产出 = 探索清单(小结构化 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 推进。
|