From ab08ac0ac3f389e1b5b02550b0b5da5e98ab4173 Mon Sep 17 00:00:00 2001 From: kdletters Date: Tue, 4 Aug 2026 17:49:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E7=BD=AESupervisor=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E5=8D=8F=E4=BD=9C=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将Supervisor交互与最终回复身份合同迁入版本化Prompt Bundle 将isolated模板目录静态说明纳入manifest组合并仅在Rust注入动态节点ID 补齐构建期注册、源码回流门禁和运行期回归覆盖 同步协作graph配置化边界文档 --- .../build_support/runtime_prompt_bundle.rs | 8 +++++- .../isolated-template-catalog-intro.md | 1 + .../src-tauri/prompts/runtime/manifest.json | 8 ++++-- .../provider/supervisor-chat-system.md | 1 + .../src-tauri/src/agent/prompt.rs | 15 ++++++---- .../tests/runtime_prompt_bundle_build.rs | 28 +++++++++++++++++-- .../shared-memory/decision-log.md | 2 +- ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 2 +- 8 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 apps/ai-game-creator-shell/src-tauri/prompts/runtime/isolated-template-catalog-intro.md create mode 100644 apps/ai-game-creator-shell/src-tauri/prompts/runtime/provider/supervisor-chat-system.md diff --git a/apps/ai-game-creator-shell/src-tauri/build_support/runtime_prompt_bundle.rs b/apps/ai-game-creator-shell/src-tauri/build_support/runtime_prompt_bundle.rs index f02be5709..afdb61135 100644 --- a/apps/ai-game-creator-shell/src-tauri/build_support/runtime_prompt_bundle.rs +++ b/apps/ai-game-creator-shell/src-tauri/build_support/runtime_prompt_bundle.rs @@ -81,6 +81,7 @@ struct ProviderFragments { supervisor_delivery_convergence_repair: String, manifest_dag_wait_repair: String, delegated_playtest_repair: String, + supervisor_chat_system: String, } #[derive(Debug, Deserialize)] @@ -353,7 +354,7 @@ pub fn compile_manifest(manifest_path: &Path) -> Result [(&'static str, &'static str, &String); 8] { +) -> [(&'static str, &'static str, &String); 9] { [ ( "providerFragments.isolatedToolContract", @@ -395,6 +396,11 @@ fn provider_fragment_entries( "RUNTIME_PROMPT_PROVIDER_DELEGATED_PLAYTEST_REPAIR_SECTION", &fragments.delegated_playtest_repair, ), + ( + "providerFragments.supervisorChatSystem", + "RUNTIME_PROMPT_PROVIDER_SUPERVISOR_CHAT_SYSTEM_SECTION", + &fragments.supervisor_chat_system, + ), ] } diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/isolated-template-catalog-intro.md b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/isolated-template-catalog-intro.md new file mode 100644 index 000000000..631c1b4c3 --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/isolated-template-catalog-intro.md @@ -0,0 +1 @@ +agent.spawn_isolated 的合法 templateAgentId 仅限以下静态模板 taskId: diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/manifest.json b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/manifest.json index c3a8045f7..40c31e01b 100644 --- a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/manifest.json +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/manifest.json @@ -1,9 +1,10 @@ { "schemaVersion": 1, "id": "genarrative.agent-runtime", - "version": "2026-08-04.2", + "version": "2026-08-04.3", "sections": { "common": "common.md", + "isolatedTemplateCatalogIntro": "isolated-template-catalog-intro.md", "isolatedAgentContract": "isolated-agent-contract.md", "platformDefault": "platform/default.md", "platformLinux": "platform/linux.md", @@ -16,6 +17,7 @@ "providerSupervisorDeliveryConvergenceRepair": "provider/supervisor-delivery-convergence-repair.md", "providerManifestDagWaitRepair": "provider/manifest-dag-wait-repair.md", "providerDelegatedPlaytestRepair": "provider/delegated-playtest-repair.md", + "providerSupervisorChatSystem": "provider/supervisor-chat-system.md", "supervisorIntro": "supervisor/intro.md", "supervisorVisualWithoutEditor": "supervisor/visual-contract-without-editor.md", "supervisorVisualWithEditor": "supervisor/visual-contract-with-editor.md", @@ -27,6 +29,7 @@ "runtime": [ "$header", "common", + "isolatedTemplateCatalogIntro", "$isolatedAgentTemplates", "isolatedAgentContract", "$platform" @@ -65,7 +68,8 @@ "autonomousInitialCollaborationRepair": "providerAutonomousInitialCollaborationRepair", "supervisorDeliveryConvergenceRepair": "providerSupervisorDeliveryConvergenceRepair", "manifestDagWaitRepair": "providerManifestDagWaitRepair", - "delegatedPlaytestRepair": "providerDelegatedPlaytestRepair" + "delegatedPlaytestRepair": "providerDelegatedPlaytestRepair", + "supervisorChatSystem": "providerSupervisorChatSystem" }, "agentCatalog": { "supervisor": { diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/runtime/provider/supervisor-chat-system.md b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/provider/supervisor-chat-system.md new file mode 100644 index 000000000..899e7cc98 --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/prompts/runtime/provider/supervisor-chat-system.md @@ -0,0 +1 @@ +你是 Genarrative AI 游戏创作桌面 App 的 Project Supervisor,是项目中唯一默认面向用户的总控 Agent,并拥有最终回复权。你要持续围绕用户原始目标工作:需要时先澄清;能直接回答时直接回答;需要项目行动时使用白名单工具;需要专业判断时用验收标准和预期产物把边界清晰的任务委派给合适的专业 Agent,并在所有必需回执完成后统一汇总。缺失事实或产品取舍会实质改变执行结果时,使用 user.input_request 在未完成任务中提出结构化问题并等待回答,不要用最终回复提前结束任务。专业 Agent 的消息和回执只是原目标的证据,不能替换原目标;evidence-ready 只代表客观证据齐全,你仍须逐条完成语义验收;needs-repair 不得忽略,同一原委派最多发起一轮显式返工。稳定跨 Agent 决策写项目黑板,私有协调经验写自己的 Agent 记忆。不要泄露内部工具计划、动态 child 标识、密钥或开发调试细节;不要假装执行未执行的工具;不要输出 JSON;回复保持简洁、具体、中文优先。 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 83afd54e7..f08d7ad11 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 @@ -475,7 +475,7 @@ pub(crate) fn game_creator_role_agent_chat_system_prompt() -> &'static str { } pub(crate) fn game_creator_project_supervisor_chat_system_prompt() -> &'static str { - "你是 Genarrative AI 游戏创作桌面 App 的 Project Supervisor,是项目中唯一默认面向用户的总控 Agent,并拥有最终回复权。你要持续围绕用户原始目标工作:需要时先澄清;能直接回答时直接回答;需要项目行动时使用白名单工具;需要专业判断时用验收标准和预期产物把边界清晰的任务委派给合适的专业 Agent,并在所有必需回执完成后统一汇总。缺失事实或产品取舍会实质改变执行结果时,使用 user.input_request 在未完成任务中提出结构化问题并等待回答,不要用最终回复提前结束任务。专业 Agent 的消息和回执只是原目标的证据,不能替换原目标;evidence-ready 只代表客观证据齐全,你仍须逐条完成语义验收;needs-repair 不得忽略,同一原委派最多发起一轮显式返工。稳定跨 Agent 决策写项目黑板,私有协调经验写自己的 Agent 记忆。不要泄露内部工具计划、动态 child 标识、密钥或开发调试细节;不要假装执行未执行的工具;不要输出 JSON;回复保持简洁、具体、中文优先。" + required_runtime_prompt_section(RUNTIME_PROMPT_PROVIDER_SUPERVISOR_CHAT_SYSTEM_SECTION) } fn game_creator_design_foundation_tool_plan_prompt( @@ -635,9 +635,7 @@ fn game_creator_agent_runtime_tool_plan_system_prompt_for_platform(linux: bool) .flat_map(|group| group.roles.iter().map(|role| role.task_id)) .collect::>() .join(", "); - let isolated_agent_templates = format!( - "agent.spawn_isolated 的合法 templateAgentId 仅限以下静态模板 taskId:{isolated_template_ids}。" - ); + let isolated_agent_templates = format!("{isolated_template_ids}。"); let platform_section = runtime_prompt_platform_section_id(linux); render_runtime_prompt_composition(RUNTIME_PROMPT_RUNTIME_COMPOSITION, |marker| match marker { "$header" => Some(&prompt_header), @@ -674,12 +672,13 @@ mod tests { #[test] fn runtime_prompt_bundle_manifest_covers_all_embedded_sections() { assert_eq!(RUNTIME_PROMPT_BUNDLE_ID, "genarrative.agent-runtime"); - assert_eq!(RUNTIME_PROMPT_BUNDLE_VERSION, "2026-08-04.2"); + assert_eq!(RUNTIME_PROMPT_BUNDLE_VERSION, "2026-08-04.3"); assert_eq!( RUNTIME_PROMPT_RUNTIME_COMPOSITION, &[ "$header", "common", + "isolatedTemplateCatalogIntro", "$isolatedAgentTemplates", "isolatedAgentContract", "$platform" @@ -687,6 +686,7 @@ mod tests { ); for section_id in [ "common", + "isolatedTemplateCatalogIntro", "isolatedAgentContract", "platformDefault", "platformLinux", @@ -699,6 +699,7 @@ mod tests { "providerSupervisorDeliveryConvergenceRepair", "providerManifestDagWaitRepair", "providerDelegatedPlaytestRepair", + "providerSupervisorChatSystem", "supervisorIntro", "supervisorVisualWithoutEditor", "supervisorVisualWithEditor", @@ -747,6 +748,10 @@ mod tests { RUNTIME_PROMPT_PROVIDER_DELEGATED_PLAYTEST_REPAIR_SECTION, "向 code-prototype 创建一个新的后续修复委派", ), + ( + RUNTIME_PROMPT_PROVIDER_SUPERVISOR_CHAT_SYSTEM_SECTION, + "唯一默认面向用户的总控 Agent", + ), ] { assert!(required_runtime_prompt_section(section_id).contains(expected)); } diff --git a/apps/ai-game-creator-shell/src-tauri/tests/runtime_prompt_bundle_build.rs b/apps/ai-game-creator-shell/src-tauri/tests/runtime_prompt_bundle_build.rs index e12cbc7fb..215c19b30 100644 --- a/apps/ai-game-creator-shell/src-tauri/tests/runtime_prompt_bundle_build.rs +++ b/apps/ai-game-creator-shell/src-tauri/tests/runtime_prompt_bundle_build.rs @@ -9,6 +9,10 @@ use std::path::{Path, PathBuf}; const SECTION_FILES: &[(&str, &str)] = &[ ("common", "common.md"), + ( + "isolatedTemplateCatalogIntro", + "isolated-template-catalog-intro.md", + ), ("isolatedAgentContract", "isolated-agent-contract.md"), ("platformDefault", "platform/default.md"), ("platformLinux", "platform/linux.md"), @@ -57,6 +61,10 @@ const SECTION_FILES: &[(&str, &str)] = &[ "providerDelegatedPlaytestRepair", "provider/delegated-playtest-repair.md", ), + ( + "providerSupervisorChatSystem", + "provider/supervisor-chat-system.md", + ), ]; struct Fixture { @@ -115,6 +123,7 @@ fn valid_manifest() -> Value { "runtime": [ "$header", "common", + "isolatedTemplateCatalogIntro", "$isolatedAgentTemplates", "isolatedAgentContract", "$platform" @@ -153,7 +162,8 @@ fn valid_manifest() -> Value { "autonomousInitialCollaborationRepair": "providerAutonomousInitialCollaborationRepair", "supervisorDeliveryConvergenceRepair": "providerSupervisorDeliveryConvergenceRepair", "manifestDagWaitRepair": "providerManifestDagWaitRepair", - "delegatedPlaytestRepair": "providerDelegatedPlaytestRepair" + "delegatedPlaytestRepair": "providerDelegatedPlaytestRepair", + "supervisorChatSystem": "providerSupervisorChatSystem" }, "agentCatalog": { "supervisor": { @@ -219,7 +229,7 @@ fn compiles_manifest_in_declared_order_and_emits_all_dependencies() { let fixture = Fixture::new(); let compiled = fixture.compile().expect("compile valid manifest"); assert!(compiled.rust_source.contains( - "pub(crate) const RUNTIME_PROMPT_RUNTIME_COMPOSITION: &[&str] = &[\"$header\", \"common\", \"$isolatedAgentTemplates\", \"isolatedAgentContract\", \"$platform\"];" + "pub(crate) const RUNTIME_PROMPT_RUNTIME_COMPOSITION: &[&str] = &[\"$header\", \"common\", \"isolatedTemplateCatalogIntro\", \"$isolatedAgentTemplates\", \"isolatedAgentContract\", \"$platform\"];" )); assert!(compiled.rust_source.contains( "pub(crate) const RUNTIME_PROMPT_SUPERVISOR_COMPOSITION: &[&str] = &[\"$base\", \"supervisorIntro\", \"$visualContract\", \"supervisorPlaybook\", \"supervisorClaimGate\", \"supervisorRepair\"];" @@ -678,4 +688,18 @@ fn production_sources_cannot_restore_parallel_prompt_or_agent_catalog_truths() { "provider_request_builders.rs must consume generated fragment for {forbidden}" ); } + let prompt_source = + fs::read_to_string(crate_root.join("src/agent/prompt.rs")).expect("read prompt source"); + let prompt_production = prompt_source + .split_once("#[cfg(test)]") + .map(|(production, _)| production) + .unwrap_or(&prompt_source); + assert!( + !prompt_production.contains("唯一默认面向用户的总控 Agent"), + "prompt.rs must consume the generated Supervisor chat system fragment" + ); + assert!( + !prompt_production.contains("合法 templateAgentId 仅限以下静态模板 taskId"), + "prompt.rs must consume the generated isolated template catalog intro" + ); } diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index a2d50d0b9..d2eee36fb 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -5940,7 +5940,7 @@ - 决策:把 `prompt.rs` 中依赖长自然语言精确匹配的链式 `.replace()` 拆成仓库内版本化 Prompt Bundle;`build.rs` 读取、校验并生成静态 Rust 定义编译进 Tauri 二进制,生产源码不再直接引用 `prompts/runtime` 的单个 Markdown。 - 边界:Supervisor 的角色选择、并行委派、all-join、视觉返工、claim gate 和 repair 自然语言合同,以及 Supervisor / 六组专业 Agent 的编译期静态节点目录进入 Bundle。Bundle 不是完整可执行 graph,也不是生产 Skill;正式 DAG 依赖边、权限、安全门和完成合同继续由 Rust、`shared-contracts` 与校验后的项目协作策略掌控。 -- 一致性:manifest 是 section、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment 和静态节点目录的单一来源;isolated / all-join、autonomous 首轮、首批协作修复、delivery 收敛、manifest wait 与试玩后续委派文案不得在 Provider 源码中复制。构建期拒绝未知字段、非法 / 重复 / symlink 路径、孤立 Markdown、未知 / 重叠 selector、节点 / alias / 生成标识符冲突,并强制专业节点 taskId / group / role 与正式 seed DAG 一致。原生工具目录仍从 `agent_runtime_native_executable_tools()` 生成,`mcp.call` 不混入静态原生目录;MCP 工具只从当前请求的动态 catalog 暴露。 +- 一致性:manifest 是 section、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment 和静态节点目录的单一来源;isolated / all-join、autonomous 首轮、首批协作修复、delivery 收敛、manifest wait、试玩后续委派,以及 Supervisor interaction / final-reply 身份合同不得在 Provider 或 `prompt.rs` 源码中复制。构建期拒绝未知字段、非法 / 重复 / symlink 路径、孤立 Markdown、未知 / 重叠 selector、节点 / alias / 生成标识符冲突,并强制专业节点 taskId / group / role 与正式 seed DAG 一致。原生工具目录仍从 `agent_runtime_native_executable_tools()` 生成,`mcp.call` 不混入静态原生目录;MCP 工具只从当前请求的动态 catalog 暴露。 ## 2026-08-03 AI 游戏生成泥点不足使用确定性中断说明 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index db6a2bd9a..309a6b8bc 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -78,7 +78,7 @@ V1.11 的受保护仓库控制目录同时包含 `.git / .agent / .agents / .codex / .hermes`;其中 `.agent` 对项目命令隐藏,其余控制目录只读。 -2026-08-04 起,Runtime 的公共工具规划指令、Supervisor 协作编排 playbook、条件 overlay 和编译期静态 Agent 节点目录统一由版本化 Prompt Bundle 驱动,位于 `apps/ai-game-creator-shell/src-tauri/prompts/runtime/`。`manifest.json` 是 section 路径、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment,以及 Supervisor 与六组专业 Agent 静态目录的单一来源;`build.rs` 以失败关闭方式校验 schema、引用、路径 / symlink、孤立 Markdown、selector、节点身份、旧 alias 和生成标识符,再生成 `'static + Copy` Rust 定义并编译进发布二进制。生成的专业节点 taskId / group / role 还必须在构建期与 `shared-contracts::new_game_creation_app_seed_tasks()` 强一致,防止静态目录和正式 seed DAG 漂移。Bundle 承载公共指令、隔离 Agent 合同、平台差异、角色选择、并行委派、all-join、视觉返工、claim gate,以及首批协作、delivery 收敛、manifest wait、试玩后续委派等 repair 自然语言合同;`agent_runtime_native_executable_tools()` 仍是原生可执行工具的权威源列表,同时供 Prompt 工具目录与 native capability registry 使用,MCP 工具只从当前请求的动态 catalog 暴露。最终 Provider 请求必须通过生成的 section、composition、overlay 与 provider fragment API 构建,禁止恢复直接 `include_str!("prompts/runtime/...")`、在 Provider 源码中复制协作 graph 文案,或依赖自然语言精确 `.replace()` 注入工具合同、平台规则或角色规则。Bundle 不是完整可执行 graph:正式 DAG 依赖边、权限、沙箱、委派容量、持久 all-join 状态机、完成门和身份校验仍由 Rust、`shared-contracts` 与经校验的 `.agent/collaboration-policy.json` 强制执行,不允许通过 Skill、外部配置或任意运行时 Prompt 覆盖绕过。 +2026-08-04 起,Runtime 的公共工具规划指令、Supervisor 协作编排 playbook、条件 overlay 和编译期静态 Agent 节点目录统一由版本化 Prompt Bundle 驱动,位于 `apps/ai-game-creator-shell/src-tauri/prompts/runtime/`。`manifest.json` 是 section 路径、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment,以及 Supervisor 与六组专业 Agent 静态目录的单一来源;`build.rs` 以失败关闭方式校验 schema、引用、路径 / symlink、孤立 Markdown、selector、节点身份、旧 alias 和生成标识符,再生成 `'static + Copy` Rust 定义并编译进发布二进制。生成的专业节点 taskId / group / role 还必须在构建期与 `shared-contracts::new_game_creation_app_seed_tasks()` 强一致,防止静态目录和正式 seed DAG 漂移。Bundle 承载公共指令、隔离 Agent 合同、平台差异、角色选择、并行委派、all-join、视觉返工、claim gate,Supervisor interaction / final-reply 身份合同,以及首批协作、delivery 收敛、manifest wait、试玩后续委派等 repair 自然语言合同;`agent_runtime_native_executable_tools()` 仍是原生可执行工具的权威源列表,同时供 Prompt 工具目录与 native capability registry 使用,MCP 工具只从当前请求的动态 catalog 暴露。最终 Provider 请求必须通过生成的 section、composition、overlay 与 provider fragment API 构建,禁止恢复直接 `include_str!("prompts/runtime/...")`、在 Provider 或 `prompt.rs` 源码中复制协作 graph 文案,或依赖自然语言精确 `.replace()` 注入工具合同、平台规则或角色规则。Bundle 不是完整可执行 graph:正式 DAG 依赖边、权限、沙箱、委派容量、持久 all-join 状态机、完成门和身份校验仍由 Rust、`shared-contracts` 与经校验的 `.agent/collaboration-policy.json` 强制执行,不允许通过 Skill、外部配置或任意运行时 Prompt 覆盖绕过。 2026-07-12 起,通用开发能力的 Runtime V1.1 增量以 [`【技术方案】AI游戏创作Agent Runtime V1.1-2026-07-12.md`](./【技术方案】AI游戏创作Agent%20Runtime%20V1.1-2026-07-12.md) 为编码级事实源。它补充仓库启动上下文、同一发布二进制独立 Runner、受限本地预览浏览器验证、动态隔离子 Agent 和真实 Provider 全链路验收;本文件中“进程内 tokio task”“首轮不预加载项目内容”和“不创建动态执行实例”的旧口径由 V1.1 明确替代,未涉及能力继续沿用本文件。