补全协作Prompt增量构建监听

递归登记Prompt Bundle各级目录为构建依赖
确保嵌套目录新增孤立Markdown触发失败关闭
补充深层目录依赖回归并同步架构文档
This commit is contained in:
2026-08-04 18:34:32 +08:00
parent 07a18d516b
commit 9c978f00cb
4 changed files with 26 additions and 13 deletions
@@ -185,10 +185,10 @@ pub fn compile_manifest(manifest_path: &Path) -> Result<CompiledPromptBundle, St
.ok_or_else(|| "Prompt Bundle manifest 缺少父目录".to_string())?;
let canonical_base = fs::canonicalize(base)
.map_err(|error| format!("解析 Prompt Bundle 根目录失败:{error}"))?;
// Watch the Bundle root as well as known files so that adding an unregistered
// Markdown section invalidates Cargo's build-script cache and reaches the
// fail-closed orphan-section validation below.
let mut dependencies = vec![base.to_path_buf(), manifest_path.to_path_buf()];
// Watch every Bundle directory as well as known files so that adding an
// unregistered Markdown section at any nesting depth invalidates Cargo's
// build-script cache and reaches the fail-closed orphan-section validation.
let mut dependencies = BTreeSet::from([manifest_path.to_path_buf()]);
let mut section_paths = BTreeSet::new();
let mut sections = BTreeMap::new();
if manifest.sections.is_empty() {
@@ -220,10 +220,10 @@ pub fn compile_manifest(manifest_path: &Path) -> Result<CompiledPromptBundle, St
if content.trim().is_empty() {
return Err(format!("Prompt section 不能为空:{section_id}"));
}
dependencies.push(path);
dependencies.insert(path);
sections.insert(section_id.clone(), content);
}
validate_registered_markdown_files(base, &section_paths)?;
validate_registered_markdown_files(base, &section_paths, &mut dependencies)?;
validate_composition(
"runtime",
@@ -397,7 +397,7 @@ pub fn compile_manifest(manifest_path: &Path) -> Result<CompiledPromptBundle, St
.collect();
Ok(CompiledPromptBundle {
rust_source,
dependencies,
dependencies: dependencies.into_iter().collect(),
specialist_nodes,
})
}
@@ -538,9 +538,10 @@ fn portable_section_path_key(path: &str) -> String {
fn validate_registered_markdown_files(
base: &Path,
registered_paths: &BTreeSet<String>,
dependencies: &mut BTreeSet<PathBuf>,
) -> Result<(), String> {
let mut discovered_paths = BTreeSet::new();
collect_markdown_files(base, base, &mut discovered_paths)?;
collect_markdown_files(base, base, &mut discovered_paths, dependencies)?;
for path in discovered_paths {
if !registered_paths.contains(&path) {
return Err(format!(
@@ -555,7 +556,9 @@ fn collect_markdown_files(
base: &Path,
directory: &Path,
discovered_paths: &mut BTreeSet<String>,
dependencies: &mut BTreeSet<PathBuf>,
) -> Result<(), String> {
dependencies.insert(directory.to_path_buf());
let entries =
fs::read_dir(directory).map_err(|error| format!("扫描 Prompt Bundle 目录失败:{error}"))?;
for entry in entries {
@@ -570,7 +573,7 @@ fn collect_markdown_files(
));
}
if metadata.is_dir() {
collect_markdown_files(base, &path, discovered_paths)?;
collect_markdown_files(base, &path, discovered_paths, dependencies)?;
continue;
}
if !metadata.is_file()
@@ -59,7 +59,7 @@ const SECTION_FILES: &[(&str, &str)] = &[
),
(
"providerDelegatedPlaytestRepair",
"provider/delegated-playtest-repair.md",
"provider/repairs/delegated-playtest-repair.md",
),
(
"supervisorIdentityContract",
@@ -284,10 +284,20 @@ fn compiles_manifest_in_declared_order_and_emits_all_dependencies() {
}
})
.collect::<BTreeSet<_>>();
let expected = std::iter::once("manifest.json".to_string())
let mut expected = std::iter::once("manifest.json".to_string())
.chain(SECTION_FILES.iter().map(|(_, path)| (*path).to_string()))
.chain(std::iter::once(".".to_string()))
.collect::<BTreeSet<_>>();
for (_, path) in SECTION_FILES {
let mut parent = Path::new(path).parent();
while let Some(directory) = parent {
if directory.as_os_str().is_empty() {
break;
}
expected.insert(directory.to_string_lossy().replace('\\', "/"));
parent = directory.parent();
}
}
assert_eq!(dependencies, expected);
}
@@ -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 和静态节点目录的单一来源;role overlay 只接受 `rootSourceKind` 强类型语义 selector,构建期拒绝未知 kind,运行期再把权威 source 常量映射为生成的 kind,禁止在 manifest 中复制易漂移的 durable source 字符串。isolated / all-join、autonomous 首轮、首批协作修复、delivery 收敛、manifest wait、试玩后续委派,以及 Supervisor interaction / background planning / final-reply 身份合同不得在 Provider 或 `prompt.rs` 源码中复制。Supervisor 共享核心身份与最终回复专属规则拆成两个 sectionbackground planning 的 system composition 必须复用核心身份 sectioninteraction / final-reply 的 system prompt 按 manifest composition 组合核心身份与最终回复两段,所有 user context 都不重复注入 Supervisor 身份。构建脚本同时监听 Bundle 目录、manifest 和已登记 section,拒绝未知字段、非法 / 重复 / symlink 路径、孤立 Markdown、未知 / 重叠 selector、节点 / alias / 生成标识符冲突,并强制 Supervisor planning composition 复用 chat identity、专业节点 taskId / group / role 与正式 seed DAG 一致。原生工具目录仍从 `agent_runtime_native_executable_tools()` 生成,`mcp.call` 不混入静态原生目录;MCP 工具只从当前请求的动态 catalog 暴露。
- 一致性:manifest 是 section、组合顺序、平台 / Editor 变体、role overlay、Provider 协作 fragment 和静态节点目录的单一来源;role overlay 只接受 `rootSourceKind` 强类型语义 selector,构建期拒绝未知 kind,运行期再把权威 source 常量映射为生成的 kind,禁止在 manifest 中复制易漂移的 durable source 字符串。isolated / all-join、autonomous 首轮、首批协作修复、delivery 收敛、manifest wait、试玩后续委派,以及 Supervisor interaction / background planning / final-reply 身份合同不得在 Provider 或 `prompt.rs` 源码中复制。Supervisor 共享核心身份与最终回复专属规则拆成两个 sectionbackground planning 的 system composition 必须复用核心身份 sectioninteraction / final-reply 的 system prompt 按 manifest composition 组合核心身份与最终回复两段,所有 user context 都不重复注入 Supervisor 身份。构建脚本同时监听 Bundle 每一级目录、manifest 和已登记 section保证任意嵌套目录新增孤立 Markdown 都会触发增量构建并失败关闭;同时拒绝未知字段、非法 / 重复 / symlink 路径、未知 / 重叠 selector、节点 / alias / 生成标识符冲突,并强制 Supervisor planning composition 复用 chat identity、专业节点 taskId / group / role 与正式 seed DAG 一致。原生工具目录仍从 `agent_runtime_native_executable_tools()` 生成,`mcp.call` 不混入静态原生目录;MCP 工具只从当前请求的动态 catalog 暴露。
## 2026-08-03 AI 游戏生成泥点不足使用确定性中断说明
@@ -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 静态目录的单一来源;role overlay 只允许 `rootSourceKind` 强类型语义 selector,构建期拒绝未知 kind,运行期把权威 source 常量映射为生成 kind。`build.rs` 同时监听 Bundle 目录、manifest 和已登记 section,并以失败关闭方式校验 schema、引用、路径 / symlink、孤立 Markdown、selector、节点身份、旧 alias 和生成标识符,再生成 `'static + Copy` Rust 定义并编译进发布二进制。生成的 Supervisor planning composition 必须复用 `supervisorChat.identity`,专业节点 taskId / group / role 还必须在构建期与 `shared-contracts::new_game_creation_app_seed_tasks()` 强一致,防止身份合同、静态目录和正式 seed DAG 漂移。Bundle 承载公共指令、隔离 Agent 合同、平台差异、角色选择、并行委派、all-join、视觉返工、claim gateSupervisor 共享核心身份、interaction / final-reply 专属合同及其组合,以及首批协作、delivery 收敛、manifest wait、试玩后续委派等 repair 自然语言合同;background planning 在 system composition 复用核心身份,所有 user context 都不再重复注入 Supervisor 身份。`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-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 静态目录的单一来源;role overlay 只允许 `rootSourceKind` 强类型语义 selector,构建期拒绝未知 kind,运行期把权威 source 常量映射为生成 kind。`build.rs` 同时监听 Bundle 每一级目录、manifest 和已登记 section保证任意嵌套目录新增孤立 Markdown 都会触发增量构建,并以失败关闭方式校验 schema、引用、路径 / symlink、孤立 Markdown、selector、节点身份、旧 alias 和生成标识符,再生成 `'static + Copy` Rust 定义并编译进发布二进制。生成的 Supervisor planning composition 必须复用 `supervisorChat.identity`,专业节点 taskId / group / role 还必须在构建期与 `shared-contracts::new_game_creation_app_seed_tasks()` 强一致,防止身份合同、静态目录和正式 seed DAG 漂移。Bundle 承载公共指令、隔离 Agent 合同、平台差异、角色选择、并行委派、all-join、视觉返工、claim gateSupervisor 共享核心身份、interaction / final-reply 专属合同及其组合,以及首批协作、delivery 收敛、manifest wait、试玩后续委派等 repair 自然语言合同;background planning 在 system composition 复用核心身份,所有 user context 都不再重复注入 Supervisor 身份。`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 明确替代,未涉及能力继续沿用本文件。