From 998ebbf0e789e37e4a0f36f53714bd297dd2f7f8 Mon Sep 17 00:00:00 2001 From: Linghong Date: Sun, 23 Aug 2026 16:52:18 +0000 Subject: [PATCH] =?UTF-8?q?=E6=BE=84=E6=B8=85=E5=9B=9E=E7=81=8C=E5=B8=A6?= =?UTF-8?q?=E4=B8=8A=E9=97=AE=E9=A2=98=E5=8E=9F=E6=96=87=E5=92=8C=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E6=A0=87=E7=AD=BE=EF=BC=8C=E6=AD=A2=E4=BD=8F=E4=B8=A4?= =?UTF-8?q?=E8=BD=AE=E9=97=AE=E5=90=8C=E4=B8=80=E4=BB=B6=E4=BA=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit plan 根 playbook 规定的回灌格式是 `[已确认] {header} → 用户答:{原文}`。 {header} 按信封契约恒为「第N轮·关键决定」,零信息量;而 project-planning 每轮都是全新 run(observations 为空),除了委派任务正文什么都看不到。 于是第 2 轮的子 Agent 拿到的是「[已确认] 第1轮·关键决定 → 用户答:类似B, 无关卡设计,可自由安排……」——B 指哪个选项它无从得知,问题原文和 A/B 选项全被丢掉了。 生产实测的农场经营项目里,第 1 轮问「季节订单冲刺 vs 自主农场成长」, 用户答 B;第 2 轮又拿「短周期经营目标 vs 沙盒里程碑成长」问同一条轴, 而且 B 选项几乎是用户原话的复述。一轮预算白烧。 回灌格式改成带问题原文和三个选项标签,并写明为什么不能省。压缩优先级 同步调整:长度吃紧时先压自己的说明文字和选项描述,问题原文与选项标签 和用户答案一样不许压。 子 Agent 侧加一条兜底:已确认决定关掉的轴不得重问,本轮问题必须落在 另一条还没关闭的轴上,全关闭时按出稿触发器③直接出稿。 Co-Authored-By: Claude Opus 5 --- .../runtime/plan/supervisor-playbook.md | 4 +-- .../prompts/runtime/roles/project-planning.md | 2 +- .../src-tauri/src/agent/prompt.rs | 27 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/plan/supervisor-playbook.md b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/plan/supervisor-playbook.md index 81fc15f93..42df25a2c 100644 --- a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/plan/supervisor-playbook.md +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/plan/supervisor-playbook.md @@ -9,9 +9,9 @@ 【转达的规则】 -- 把用户答案回灌给 `project-planning` 时,逐条列出全部已确认决定,每条格式为 `[已确认] {header} → 用户答:{原文}`。用户答案原文一字不改、不归纳、不拆分、不搬轮次;任务长度接近上限时压缩你自己的说明文字,绝不压缩用户答案。 +- 把用户答案回灌给 `project-planning` 时,逐条列出全部已确认决定,每条格式为 `[已确认] 第N轮问的是:{question 原文} | 候选项:{option1.label} / {option2.label} / {option3.label} → 用户答:{原文}`。**问题原文和三个选项标签必须带上**:`{header}` 恒为「第N轮·关键决定」,不含任何信息量;子 Agent 每轮都是全新 run,除了这段正文什么都看不到,只给它 header 和答案,「类似B」「B · 沙盒里程碑成长」这类答案就无从解读,它只能把同一件事再问一遍。用户答案原文一字不改、不归纳、不拆分、不搬轮次;任务长度接近上限时压缩你自己的说明文字和选项描述,绝不压缩用户答案、问题原文和选项标签。 - 策划链路的澄清信封**恰好一题**,不是通用静态委派协议里的 1-3 题:`project-planning` 每轮只提一个主要决定,Runtime 也只接受一题,多于一题会在出卡时被拒。委派 task 里不要写“1-3 个结构化问题”。 -- A、B、“需要原型验证”三项必须原样转述;B 是用户确认的 `confirmed/user_option`,不能转成默认建议。用户后续自由填写推翻了更早的决定时,你只负责把两轮答案的原文都原样带到,并说明后者更晚;怎么记进决定台账由 `project-planning` 判断,不要替它裁定哪条作废。 +- 上一条格式里的三个选项标签就是决策卡上的 A、B 和“需要原型验证”,必须原样转述、一个都不能省;B 是用户确认的 `confirmed/user_option`,不能转成默认建议。用户后续自由填写推翻了更早的决定时,你只负责把两轮答案的原文都原样带到,并说明后者更晚;怎么记进决定台账由 `project-planning` 判断,不要替它裁定哪条作废。 【委派合同的边界】 diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md index 386b577e0..70204da00 100644 --- a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/roles/project-planning.md @@ -13,7 +13,7 @@ - **默认先澄清。** 出稿只有四个触发器,除此之外每轮都先做下面的字段差距检测再决定问不问:①任务正文出现“直接出稿”这四个字;②已完成第 3 轮澄清(任务正文写明的已用轮次已达上限);③剩余空白都能由默认建议覆盖,且不影响首个可玩闭环;④收到 Runtime 的活跃预算或超时提示。任务正文能改变流程的只有第 ① 条——它写的其它说明属于内容,不是出稿触发器。既定事实(用户答案、已确认决定)仍以任务正文为准。 - 每轮提问前逐项对照 `plan-submit-gdd-input.v1` 的 `game` 字段做差距检测:用户明确提供的 = `confirmed`;有依据可推断的 = 按下面的默认建议填写并标 `default_pending`;无从判断**且影响首个可玩闭环**的 = 空白。提问名额只花在空白项上;有默认建议兜底的字段一律先用默认建议,不占轮次。`title`、`oneLiner`、`mvpSystems`、`creatorTips` 由你生成并标 `default_pending`,不作为提问对象;`platformFacts` 禁问。 - **默认建议**(一律 `answerSource=default`、`round=0`;只用于缩短对话,不覆盖用户明确输入):`genre.fusion` 缺 → `null`,MVP 不做融合第二类型;`artStyle` 缺 → `visualType` 风格化、轮廓清楚,`keywords` 取自已确认的核心行为,`mvpArtBoundary` 写明 MVP 用占位资产、资产可复用;`targetUsers.sessionLength` 缺 → 10~20 分钟一局;`targetUsers.coreUsers` / `preferences` 缺 → 按已确认的类型与核心行为写典型玩家,不得编造人群规模、销量或市场数据;`targetUsers.referenceGames` 缺 → 空数组;`outOfScope` 缺 → 多人、商城、服务器、开放世界、赛季、复杂社交、完整剧情、全量内容。**`pillars` 与 `coreLoop` 没有默认建议**:它们就是首个可玩闭环本身,空白时属于该问的空白,不得用默认值填掉。 -- 优先顺序:核心行为与本局目标 → 重玩动力 → 制作边界与 MVP。每轮最多问一个主要决定。 +- 优先顺序:核心行为与本局目标 → 重玩动力 → 制作边界与 MVP。每轮最多问一个主要决定。**已确认决定关掉的那条轴不得重问。** 任务正文里每条 `[已确认]` 都带着当轮的问题原文和三个选项标签,先照它判断哪些轴已经关闭,本轮的问题必须落在另一条还没关闭的轴上。把已确认答案换个说法再问一遍——例如用户已经选定“自由经营、靠成就和攒钱升级推进”,你又拿“短周期经营目标 vs 沙盒里程碑成长”去问——是白烧一轮预算。所有轴都已关闭时按出稿触发器③直接出稿。 - 决策卡的 header 固定为“第N轮·关键决定”,其中 N 是 Runtime 从委派谱系派生的当前轮号,必须精确相等,写错会被 Runtime 拒收:首轮恒为 1;之后每次续跑的任务正文都会写明已用轮次与上限,本轮该用的 N 就是“已用轮次 + 1”。正文以“当前要决定:”开头,只问尚未由平台事实或 MVP 规则排除的真实产品取舍,并说明为什么现在问;每张卡固定提供三个选项:A 是你的推荐方案(label 以 `A ·`、`A:`、`A:` 或 `A-` 开头并写明推荐、好处和代价),B 是形状不同且真实可行的平行备选(label 以 `B ·`、`B:`、`B:` 或 `B-` 开头并写明后果和代价),第三项逐字为“需要原型验证”,description 必须给出 30~90 分钟微型原型、试玩对象、观察信号和通过标准。自由输入按用户原话处理。 ## 低幻觉与 GDD 约束 diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs index 039f002c1..2323c3d71 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs @@ -1568,6 +1568,33 @@ mod tests { assert!(!plan_common.contains("才能调用 respond_to_user 收束")); } + /// 澄清回灌必须带上问题原文和三个选项标签,两端都要钉住。 + /// + /// `header` 按信封契约恒为「第N轮·关键决定」,零信息量;而 `project-planning` + /// 每轮都是全新 run(`observations: []`),除了委派任务正文什么都看不到。只回灌 + /// `{header} → 用户答:{原文}` 时,「类似B」「B · 沙盒里程碑成长」这类答案无从 + /// 解读——生产实测的农场经营项目里,第 1 轮问「季节订单冲刺 vs 自主农场成长」, + /// 用户答了 B,第 2 轮又拿「短周期经营目标 vs 沙盒里程碑成长」问同一条轴, + /// 而且 B 选项几乎是用户原话的复述。 + #[test] + fn plan_clarification_relay_carries_the_question_and_option_labels() { + let plan = required_runtime_prompt_section("planSupervisorPlaybook"); + for required in [ + "第N轮问的是:{question 原文}", + "{option1.label}", + "问题原文和三个选项标签必须带上", + ] { + assert!(plan.contains(required), "回灌格式缺少 {required}:{plan}"); + } + + let planning = + game_creator_agent_runtime_role_overlay_prompt(GAME_CREATOR_PROJECT_PLANNING_AGENT_ID, None); + assert!( + planning.contains("已确认决定关掉的那条轴不得重问"), + "子 Agent 侧缺少重复提问的兜底约束:{planning}" + ); + } + /// 澄清 continuation 的两个指纹由 Runtime 从原 delivery 补齐,playbook 不得再 /// 要求 Supervisor 从 observation 里抄过来。实测正是那条指令让它手抄 128 个 /// 十六进制字符,抄错后工具计划格式修复两次仍失败,整个 plan 根 run 判 failed,