From efce7b102f7d546684a71ee4b7f0ca4f0bc89c9f Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Thu, 17 Sep 2026 21:01:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E9=BD=90=E4=B8=BB=E7=BA=BF=E5=9B=BE?= =?UTF-8?q?=E9=9B=86=E5=A5=91=E7=BA=A6=E4=B8=8E=E7=AA=97=E5=8F=A3=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=B5=8B=E8=AF=95=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补齐图集切分声明与工具目录字段边界断言 更新原生HTTP权限守卫及稳定空快照发布次数期望 修正末尾空行并记录CI排查证据,保留待远程验证状态 --- .../src-tauri/src/tests/project.rs | 6 ++++- .../src-tauri/src/tests/provider.rs | 22 ++++++++++++++++++- .../resourceCanvasGenerationLanding.test.tsx | 2 -- .../tests/workspaceWindowSync.test.tsx | 14 ++++++++---- ...里程碑】画布验收问题统一修复-2026-09-17.md | 3 ++- scripts/check-native-shells.mjs | 1 - 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs index 4faf39ccc..64f552a15 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs @@ -806,7 +806,11 @@ async fn background_agent_runtime_can_generate_platform_art_asset() { "imageSize": "1K", "assetKind": "art-spritesheet", "assetLabel": "游戏首版核心美术素材", - "replaceExisting": false + "replaceExisting": false, + // 图集切分没有默认值:必须显式声明,且与平台回显的 sliceMode/gridX/gridY 一致。 + "sliceMode": "grid", + "gridX": 2, + "gridY": 2 } } ], diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs index dd4946ea4..d71500895 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs @@ -6916,9 +6916,29 @@ fn agent_native_function_catalog_exposes_each_runtime_tool_with_core_schemas() { "imageSize", "assetKind", "assetLabel", - "replaceExisting" + "replaceExisting", + "sliceMode", + "gridX", + "gridY", + "sliceCount" ]) ); + let canvas_properties = &canvas_asset.parameters["properties"]["input"]["properties"]; + assert_eq!( + canvas_properties["sliceMode"]["enum"], + serde_json::json!(["connected-components", "grid", null]) + ); + for field in ["gridX", "gridY", "sliceCount"] { + assert_eq!( + canvas_properties[field]["type"], + serde_json::json!(["integer", "null"]) + ); + assert_eq!(canvas_properties[field]["minimum"], 1); + assert_eq!( + canvas_properties[field]["maximum"], + if field == "sliceCount" { 256 } else { 32 } + ); + } assert_eq!( canvas_asset.parameters["properties"]["input"]["properties"]["aspectRatio"]["enum"], serde_json::json!(["1:1", "2:3", "3:2", "9:16", "16:9", null]) diff --git a/apps/ai-game-creator-shell/tests/resourceCanvasGenerationLanding.test.tsx b/apps/ai-game-creator-shell/tests/resourceCanvasGenerationLanding.test.tsx index a3d05ff94..a281f6150 100644 --- a/apps/ai-game-creator-shell/tests/resourceCanvasGenerationLanding.test.tsx +++ b/apps/ai-game-creator-shell/tests/resourceCanvasGenerationLanding.test.tsx @@ -502,5 +502,3 @@ describe('音频生成身份', () => { ); }, 20_000); }); - - diff --git a/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx b/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx index 457f61417..47471a79b 100644 --- a/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx +++ b/apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx @@ -84,8 +84,12 @@ it('真实窗口与工作台状态同步收敛,回调读取最新处理器且 await act(async () => { await Promise.resolve(); }); - // 无原生 invoke 时 active-turn Hook 会把初始快照归一为空数组一次。 - expect(publications).toHaveLength(2); + /* + * 无原生 invoke 时 active-turn Hook 只有「空态」这一种状态:空快照引用保持稳定 + * (不再 `setActiveTurns([])` 换新数组),`snapshotReadFailed` 也保持 false。 + * 依赖项一个都没变,工作台只应发布一次。 + */ + expect(publications).toHaveLength(1); expect(cleanups).toBe(0); expect(new Set(publications.map((item) => item.onOpenProject)).size).toBe( 1, @@ -94,13 +98,15 @@ it('真实窗口与工作台状态同步收敛,回调读取最新处理器且 const latestOpen = vi.fn(async () => undefined); homeProjectOverride.openProject = latestOpen; rendered.rerender(view('更改显示名')); - expect(publications).toHaveLength(2); + // 非依赖变化的重渲染不能让窗口面板重新发布。 + expect(publications).toHaveLength(1); act(() => openProject('/tmp/window-latest-project')); expect(latestOpen).toHaveBeenCalledWith( '/tmp/window-latest-project', 'open', ); - expect(publications).toHaveLength(2); + // 回调执行只换 ref 里的实现,发布次数与清理次数都不能变。 + expect(publications).toHaveLength(1); expect(cleanups).toBe(0); rendered.unmount(); expect(cleanups).toBe(1); diff --git a/docs/project-memory/plans/【里程碑】画布验收问题统一修复-2026-09-17.md b/docs/project-memory/plans/【里程碑】画布验收问题统一修复-2026-09-17.md index 63a984781..52b061cbc 100644 --- a/docs/project-memory/plans/【里程碑】画布验收问题统一修复-2026-09-17.md +++ b/docs/project-memory/plans/【里程碑】画布验收问题统一修复-2026-09-17.md @@ -42,4 +42,5 @@ - appSurface 两条异步轮询泄漏相关失败已通过用例内部等待后端阶段合并、任务终态及轮询退出修复,未修改生产逻辑或全局 harness。子 Agent 在集成工作树全量复验:450 项通过、20 项跳过、0 失败。 - 画布名称沿用正式落盘文件名,生成素材可能带时间戳前缀与扩展名;未新增另一套显示名状态。 - 在途落点失败且整理无变化时可能留下一个空撤销步骤,失败提示仍可见,不导致正式素材数据丢失;低优后续事项。 -- 需求记录与 Issue/PR 未写回;所有远程写入等待单独确认。 +- 已按确认创建 Issue #411、PR #412,并推送 `feat/agc-canvas-acceptance`;飞书未写回。用户另已授权合入 master、修复 CI 并持续推送到检查通过,不授权合并 PR 本身。 +- 合入 master 后的 CI 2439 暴露五类检查偏差:图集 mock 缺少显式切分参数、工具目录断言未包含新增切分字段、更新插件迁移后的 HTTP 白名单期望过期、窗口空快照稳定化后的发布次数期望过期、测试文件末尾多空行。修复保持现行生产合同和权限范围,补齐参数/边界断言;两个 Rust 失败用例、原生合同门禁及窗口/落点四项前端用例已定向通过,仍需新提交的远程 CI 全量结果。 diff --git a/scripts/check-native-shells.mjs b/scripts/check-native-shells.mjs index 6748f9628..7b5447faf 100644 --- a/scripts/check-native-shells.mjs +++ b/scripts/check-native-shells.mjs @@ -2582,7 +2582,6 @@ function assertAiGameCreatorShellUserDevBoundary() { JSON.stringify([ { url: 'https://dev.genarrative.world/api/*' }, { url: 'https://www.genarrative.world/api/*' }, - { url: 'https://agc-dev.oss-rg-china-mainland.aliyuncs.com/*' }, { url: 'https://*/api/*' }, { url: 'http://localhost:*/*' }, { url: 'http://127.0.0.1:*/*' },