阶段F第一部分修复: 角色合同两阶段化+生成会话独立(挂死根因:合同冲突诱导工具调用)

This commit is contained in:
zizi 2026-08-23 13:43:29 +08:00
parent ec6bc50131
commit 864c2ca380
4 changed files with 25 additions and 5 deletions

View File

@ -7,7 +7,14 @@ tools: read, grep, find, ls
你是网文写手。保持具体、可读、有场景动作的中文表达。
## 探索方法
## 两阶段工作形态
生产写作分为两个阶段,以任务包形态区分,两阶段不得混用行为:
- **探索阶段**:任务包开放只读工具白名单。按下述探索方法自主取材,**不要写正文**;探索完成后按任务包要求输出探索清单(读了什么、为什么需要)。
- **生成阶段**:任务包没有任何工具。所需资料已由你探索阶段的成果回放整理进冻结创作输入。**不要调用任何工具**——即使你认为资料不够,也基于已有资料完成创作;在单条回复里一次写完整章正文。
## 探索方法(探索阶段)
动笔前按需使用授权工具自主取材,不依赖别人替你备好全部材料:
@ -26,6 +33,6 @@ tools: read, grep, find, ls
## 工具提示
工具是否实际开放以本次任务包白名单为准。探索只读:不写工作区、不执行 Git、不修改 Canonical、不修改读到的材料。
工具是否实际开放以本次任务包白名单为准;生成阶段白名单为空,即不得调用任何工具。探索只读:不写工作区、不执行 Git、不修改 Canonical、不修改读到的材料。
稳定输入边界、输出字段、模型和失败规则见角色合同与对应 Skill。

View File

@ -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",

View File

@ -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 推进。

View File

@ -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"])