diff --git a/.agent/agents/writer.md b/.agent/agents/writer.md index b045de4..190b296 100644 --- a/.agent/agents/writer.md +++ b/.agent/agents/writer.md @@ -7,7 +7,14 @@ tools: read, grep, find, ls 你是网文写手。保持具体、可读、有场景动作的中文表达。 -## 探索方法 +## 两阶段工作形态 + +生产写作分为两个阶段,以任务包形态区分,两阶段不得混用行为: + +- **探索阶段**:任务包开放只读工具白名单。按下述探索方法自主取材,**不要写正文**;探索完成后按任务包要求输出探索清单(读了什么、为什么需要)。 +- **生成阶段**:任务包没有任何工具。所需资料已由你探索阶段的成果回放整理进冻结创作输入。**不要调用任何工具**——即使你认为资料不够,也基于已有资料完成创作;在单条回复里一次写完整章正文。 + +## 探索方法(探索阶段) 动笔前按需使用授权工具自主取材,不依赖别人替你备好全部材料: @@ -26,6 +33,6 @@ tools: read, grep, find, ls ## 工具提示 -工具是否实际开放以本次任务包白名单为准。探索只读:不写工作区、不执行 Git、不修改 Canonical、不修改读到的材料。 +工具是否实际开放以本次任务包白名单为准;生成阶段白名单为空,即不得调用任何工具。探索只读:不写工作区、不执行 Git、不修改 Canonical、不修改读到的材料。 稳定输入边界、输出字段、模型和失败规则见角色合同与对应 Skill。 diff --git a/.agent/skills/write-next-chapter/scripts/two_phase_writer.py b/.agent/skills/write-next-chapter/scripts/two_phase_writer.py index ecf9e73..599ee40 100644 --- a/.agent/skills/write-next-chapter/scripts/two_phase_writer.py +++ b/.agent/skills/write-next-chapter/scripts/two_phase_writer.py @@ -43,6 +43,7 @@ EXPLORATION_SCHEMA_VERSION = "writer-exploration-manifest-v1" EXPLORATION_MAX_MATERIALS = 20 EXPLORATION_MAX_DURATION_SECONDS = 1200 EXPLORATION_SESSION_LABEL = "writer-explore" +GENERATION_SESSION_LABEL = "writer-gen" EXPLORATION_OUTPUT_SCHEMA: dict[str, Any] = { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -328,7 +329,7 @@ def run_two_phase_writer( task_prompt=generation_task_prompt, creative_input=creative_input, enable_read_tools=False, - session_label="writer", + session_label=GENERATION_SESSION_LABEL, spec_path=spec_root / f"{run_id}-writer-task-v{candidate_version}-gen.json", launcher=launcher, connect_factory=connect_factory, @@ -351,6 +352,7 @@ __all__ = [ "EXPLORATION_OUTPUT_SCHEMA", "EXPLORATION_SCHEMA_VERSION", "EXPLORATION_SESSION_LABEL", + "GENERATION_SESSION_LABEL", "ExplorationError", "build_exploration_spec", "build_generation_creative_input", diff --git a/docs/plans/2026-08-22-阶段F-第一部分-两阶段写手-探索与生成分离.md b/docs/plans/2026-08-22-阶段F-第一部分-两阶段写手-探索与生成分离.md index 85ee67b..3df5de4 100644 --- a/docs/plans/2026-08-22-阶段F-第一部分-两阶段写手-探索与生成分离.md +++ b/docs/plans/2026-08-22-阶段F-第一部分-两阶段写手-探索与生成分离.md @@ -53,7 +53,18 @@ - 全量离线门禁:82 个标准 `OK` + 19 个自定义输出通过(逐一核实无真失败),0 失败;桥扩展未破坏既有用例。 - 真实验证留待下一步:`produce_next_chapter.py 3 --two-phase --provider catproxy-anthropic --model claude-opus-5 --thinking high`。 -## 5. 未决(下一阶段) +## 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 推进。 diff --git a/tests/skills/write-next-chapter/test_two_phase_writer.py b/tests/skills/write-next-chapter/test_two_phase_writer.py index 4f6bf63..1c8e662 100644 --- a/tests/skills/write-next-chapter/test_two_phase_writer.py +++ b/tests/skills/write-next-chapter/test_two_phase_writer.py @@ -211,7 +211,7 @@ class OrchestrationTest(unittest.TestCase): # 生成阶段:无工具、输入为探索整理 self.assertFalse(captured["enable_read_tools"]) - self.assertEqual(captured["session_label"], "writer") + self.assertEqual(captured["session_label"], "writer-gen") self.assertEqual(captured["creative_input"]["inputMode"], "two-phase-generation-v1") self.assertEqual(captured["creative_input"]["explorationMaterials"][0]["tool"], "read_fine_outline") self.assertIn("不要再调用工具", captured["task_prompt"])