AGC 画布验收问题修复与栏目画布底部工具栏
Project CI / Repository checks (pull_request) Successful in 2m55s
Project CI / Frontend tests (pull_request) Successful in 3m59s
Project CI / Backend tests (pull_request) Successful in 6m50s
Project CI / Native shell tests (pull_request) Failing after 14m3s

- 合并资源画布命名筛选与条件筛选为单一筛选浮层,Dock 只留放大镜入口
- 修复「编辑素材标签」面板标签多时不可见且不可滚:加高度上界与标签区独立滚动
- 替换素材新增点选替换模式,并在资源卡标注会话内替换血缘
- 新增栏目画布底部工具栏,按功能画布分流图片类生成、音频生成与上传入口
- 新增 Tauri IPC generate_local_project_asset,收口图片类无源生成的 kind 与提示词目录
- 同步 PRD、AGC 验收用例、决策日志、踩坑记录与待解决事项文档
This commit is contained in:
2026-09-13 14:07:03 +08:00
parent aa0fcc1d71
commit 55fab1776a
33 changed files with 4898 additions and 544 deletions
@@ -22,6 +22,15 @@
- 关联文档:相关 PRD、技术文档、提交或 Issue
```
## 2026-09-13 AGC 资源替换补「会话内血缘标注」:只保留当前有效的一条 A→B,不假装持久
- 背景:用户验收指出「当前版本使用素材替换后,一个标为当前版本素材一个不是,替换关系不明」。核实后的边界:①光环(`currentVersionBindingIds` → DOM `is-current-version` / `data-used-by-current-version`)本身同源、不会两处打架,替换后光环从源素材 A 移到替换素材 B 是**设计内**的既定变化;②替换关系在客户端**任何一层都不存在** —— 宿主只消费替换结果的 `result.versionId` 与 `result.committedProjectRevision`,`ProjectVersionResourceReplacement` 里的 `sourceResourceId` / `replacementResourceId` / `warning` 无人消费,审计 `asset.version_binding.replace` 只有写侧;③manifest 的 `.previous` 不能当数据源 —— 它只是原子安装的崩溃兜底副本,装盘成功即删,正常项目里根本不存在。
- 决策:只在**宿主会话内**记一条血缘(源素材 A → 替换素材 B,两端都是 manifest 资产 id),并把它标回画布:源素材卡「已被 <B 显示名> 替换」、替换素材卡「替换自 <A 显示名>」,稳定 DOM 判据 `data-resource-replaced-by` / `data-resource-replacement-of`(值是对面资源的 manifest 资产 id,不是显示名)。同一会话内再次替换**整条覆盖**上一条,只保留当前有效的一条,不做历史链(与 PRD §7.8「只展示当前有效关系」同口径)。
- 生命周期(本方案的天花板,UI 与 PRD 都已写明):**只在本次会话有效** —— 切换项目 / 关闭工作台 / 重新加载 manifest 都不保留,也不写盘,不假装持久。要让关系跨会话可查,必须先有读侧事实源(例如让替换审计可从客户端读取,或新建一份替换血缘 sidecar),那是另一个切片。
- 影响范围:`apps/ai-game-creator-shell` 前端(`features/resource-canvas/resourceVersionReplacementModel.ts` 新增纯函数、`view/project-development/index.tsx` 宿主状态与卡面、`styles.css` 角标样式、`tests/resourceVersionReplacement.test.tsx` 与 `tests/appSurface/project-development.suite.ts` 行为断言);不改 Rust、不改版本绑定口径、不改 `game_iteration_resource_bindings`,也**不碰**并行的「点选替换」态。
- **遗留(独立事项,本轮未修)**:版本绑定存在口径冲突 —— 版本追加会把绑定重写成「当时全部 manifest assets」(`src-tauri/src/project/manifest.rs:727-738`,由每个成功 Agent 回合 `src-tauri/src/agent/direct_runtime.rs:3818-3821` 触发),而替换把绑定改窄(`version_resource_replacement.rs:409-440`);`activeVersionId` 为 null 时取最后一版(`src/features/project-workspace/resourceReferences.ts:226-241`),于是下一次版本追加后**被替换掉的源素材 A 会重新带上「当前版本使用」光环**。该项已由用户确认单独立项,本次不动。
- 关联文档:[项目开发工作台 PRD §5.3 / §7.8](../../prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md)。
## 2026-09-11 素材类型(功能分类)重新提供用户入口;资源卡角标改显示资源类型而非媒体类型
- 背景:`6bdc8bbd9` 把「分类与标签」面板收敛为纯标签面板,并明确记下「随之的事实是:**「用户手动设置 `category`」这项能力就此移除**」(本文件 2026-09-11 那条以「用户给出的目标样式截图里,这个面板标题是「编辑素材标签」…」开头的条目,其决策一行即该结论)。用户随后要求「用户可以自己变更素材类型」,并追加要求把资源卡右上角角标从"文件/媒体类型"(图片 / 视频 / 文档 …)改成"资源类型"(功能分类中文名)。现状核实:写入链路本来就是完整的 —— `update_local_project_resource_classification`(`src-tauri/src/commands.rs:2162`)→ `update_manifest_asset_classification_at`(`src-tauri/src/project/manifest.rs:1112`)已接受任意合法 `category` 并校验 6 个合法值,**本次不需要改 Rust**;缺的只有 UI 入口与角标口径。本条**只回收「面板不再编辑分类」这一项**,「面板标题仍是「编辑素材标签」、删除资源入口仍在选中工具条」等其余结论不变。
@@ -68,6 +77,7 @@
- 未落地(截至本条记录时):`index.tsx` 的 3 处接线(①`visibleResources` 内联过滤换成调用纯函数;②新增 `resourceFilterOpen` state + Dock 筛选按钮 + 浮层挂载,并把区域接到 `openResourceBookChild`;③新增 `activeTags` state)**尚未提交**——当时该文件正被另一条线(美术画布「生成动画」接线)占用。已落地的部分(外壳、纯函数、AGC 侧组件与样式)各自独立提交,接线完成后本条应补记。
- 验证方式:`packages/shared/src/components/PlatformFilterPanel.test.tsx` 覆盖 `dialog` 语义与关闭转发、字段逐个渲染、外壳不自带「状态」占位字段、`controlId` 字段名关联、宿主定位类注入且组件不自带 `absolute` / `fixed`;`apps/ai-game-creator-shell/tests/resourceCanvasFilterModel.test.ts` 覆盖区域选项顺序与逐个中文显示名、空筛选不重排、区域恒等比较、关键词四字段与空白归一、标签 AND 语义、无标签事实源资源的口径、三维度叠加、标签库计数与 `zh-CN` 排序、筛选生效判据;`apps/ai-game-creator-shell/tests/resourceFilterPanel.test.tsx` 覆盖三字段渲染且无「状态」占位、区域选项取值与显示名、关键词回显与回调、区域切换只回调、标签受控多选与 `aria-pressed`、空标签库隐藏该字段、关闭键 / `Escape` / 点外部 / 点触发按钮四种关闭口径、`Escape` 后焦点回触发按钮。**变异验证实测**:把区域判据改成恒 `true` → `4 failed`;去掉关键词判据 → `3 failed`;去掉标签判据 → `4 failed`;三处还原后复跑 `13 passed`。既有断言零放宽(`PlatformResourceFilterBar.test.tsx` 与主站弹窗测试一字未改,同跑 `9 passed`)。
- 关联文档:`docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`(§5.2.4 资源筛选浮层条款)、本条上一条 2026-09-11 决策、`docs/project-memory/shared-memory/pitfalls.md`(常驻筛选条移除那条)。
- 后续(2026-09-13):画布搜索浮层合并进本浮层——Dock 只留放大镜按钮、`Ctrl/Cmd+F` 与它叫出同一个面板,上面那条「两个入口读写同一个关键词」收敛为**唯一入口**,纯搜索浮层及其 state / ref / CSS 与两处手写互斥一并删除。三个字段、区域派生、「状态」字段不做、关闭与焦点口径(Esc 关闭不清条件、焦点回触发按钮)均未变,见本文件 2026-09-13 一条。
## 2026-09-11 资源画布 sidecar 的读时归并保持写回,但不再静默,并公开丢弃口径
@@ -8547,3 +8557,33 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 影响范围:`apps/ai-game-creator-shell/src/App.tsx`(新增跟随 effect + `manifestRef`)、`apps/ai-game-creator-shell/tests/resourceTagStatsRefresh.test.tsx`(新增真宿主链路用例)。manifest 契约、Rust、SpacetimeDB 均不动。
- 验证方式:`npm run test -- apps/ai-game-creator-shell/tests/resourceTagStatsRefresh.test.tsx`(先红:`expected [] to deeply equal ['主角1']`;修复后 2 条绿)+ 11 个资源相关套件 124 条 + `appSurface.test.ts` 415 条 + `npm run typecheck` + `npm --prefix apps/ai-game-creator-shell run typecheck` + `npm run check:encoding` + `git diff --check`。变异验证(已实测并还原):把跟随 effect 改回「不跟随壳快照」→ 新增用例第一条变红(`expected [] to deeply equal ['主角1']`)。
- 关联文档:无(本轮不涉及跨端契约、PRD 或后端口径变化)。
## 2026-09-13 AGC 资源画布「搜索」与「筛选」合并为单一筛选浮层
- 背景:右下角 Dock 上并排两颗按钮——放大镜开 `.game-resource-search` 纯搜索浮层,滑块开 `.game-resource-filter-panel` 筛选浮层;两者共用同一份 `searchText`(筛选面板的第一个字段就是同一个关键词),却各存一套开合状态,互斥逻辑在两个 `onClick` 里各写一遍且无测试守护。同一个功能两个入口,本身就是两处随时会漂移的状态。
- 决策:**状态不合并、只收敛 UI 入口。** 删除纯搜索浮层的 JSX、`resourceSearchOpen` / `resourceSearchId` / `resourceSearchRef` / `resourceSearchTriggerRef` / `resourceSearchPopoverRef`、它的共享 dismiss hook 调用与 `.game-resource-search` 两条 CSS;Dock 只留放大镜按钮(`aria-controls` → `resourceFilterId`,`is-active` → `resourceFilterActive`),`Ctrl/Cmd+F` 与它打开同一个面板。面板的「点外部 + Esc、Esc 后焦点还给触发按钮」继续沿用它自己那套手写实现(不改成共享 hook,共享 hook 判据用 `.image-canvas-editor__portal-menu`,会把焦点还错地方)。关键词字段改由 `autoFocus` 承接既有「浮层打开后焦点落到搜索框」,并保留 `type=search` 原生 Esc 清空的 `preventDefault`(关闭 ≠ 清条件)。
- 原因:`searchText`、`resourceFilterTags` 与派生 region 的语义一行未改,「条件生效只隐藏卡片、不重排坐标」与 Dock 高亮判据(关键词 ∨ 标签,**不含区域**)因此不可能跟着变;真正多余的只是那颗只看关键词的浮层和它那份开合状态。`filterCanvasResources` 的过滤链路与 `resourceCanvasFocusModel` 里 `.game-resource-filter-panel` 的滚轮归属登记一并保留(删了面板内滚轮会带动画布)。
- 验证:`appSurface.test.ts` 全量 416 passed(含改写后的 4 条:CSS/Dock 锚定几何、DOM 归属并列、两视图关键词过滤、快捷键开合与不清条件/焦点回按钮);`resourceFilterPanel.test.tsx` 8 passed;`projectResourceLiveIntegration.test.tsx` 25 passed;`npm run check:encoding` 与 `git diff --check` 干净。
- 影响范围:`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`.../ResourceFilterPanel.tsx`、`apps/ai-game-creator-shell/src/styles.css`、`apps/ai-game-creator-shell/tests/appSurface/{harness.ts,project-development.suite.ts}`、`apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx`、PRD §5.2.4、`docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md` 的 S8。
## 2026-09-13 AGC 资源画布替换素材增加「点选替换」入口
- 背景:用户验收报告诉求「替换弹窗里增加一个『点选替换』按钮,进入后直接在画布上点选目标素材 B 完成替换,避免在面板里筛选」。原实现只有一条路:工具条「替换素材」→ 候选弹窗(`ImageCanvasProjectAssetPickerDialog`,全仓唯一共享副本)里筛/选/确认。
- 决策:候选弹窗加一个 **opt-in** prop `onPickFromCanvas`(不传就不渲染该按钮,网页端美术画布参考图多选行为逐字不变,`packages/` 不动);AGC 侧新增 `resourceReplacementPickMode`,与弹窗互斥但**不重置**冻结的 `source` / `candidates` —— 点选的合法性判据与写入载荷用的还是那一份权威候选。点选落点(卡片左键 pointerdown)走新增纯函数 `resolveResourceReplacementPick`(源素材本身 / 不在候选里 / 硬门禁不过 / 合法四类),合法即调既有 `confirmResourceVersionReplacement`(与弹窗确认**同一条**写入链路,不新开一条),非法则把原因写进提示条并留在点选态。弹窗必须卸载(`UnifiedModal` 是全屏遮罩,留着它画布点不到);提示条 `.game-resource-canvas-pick-hint` 渲染在 `.game-resource-book-manager` 里(不在会随视口缩放/平移的场景内,也不随「收起资源」卸载),文案含「在画布上点选要替换成的素材」「点击空白处不会退出」与「取消」。
- 原因:替换的合法性判据在 Rust、前端只呈现(PRD §5.3),所以点选不能自己重算一套兼容性;复用同一份候选 + 同一个 `confirm` 是唯一不会分叉的写法。点选态下卡片单击不参与选中,但**只靠一次性抑制**(`skipNextResourceCardClickRef`,与卡片拖拽后抑制误点同一机制;pointerup 处 `deferSkippedResourceCardClickCleanup` 收尾、会话结束时再兜底清一次),而不是全局关掉单击——非点选态的单击语义(选中/浮出工具条)因此一行未改。Esc 挂 `document` 并 `stopPropagation`:资源画布自己的 Esc 挂 `window`(清画布焦点 = 清选中 + 收浮层),不截断就会「退出点选顺带丢选中」。空白处左键在点选态下不起框选、也不清焦点(中键 / 空格平移与滚轮平移缩放照常)。点选会话只在资源画布可见时存在:切运行态 / 进 UI 编辑器即结束,避免留下没有提示条也没有 Esc 的死会话。
- 验证:`apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx` 14 passed(新增 4 条:入口关弹窗且零写入、合法点选提交一次且载荷与弹窗一致并自动退出、非法四种目标零写入留态且点空白不退出、Esc 退出不清选中),`appSurface.test.ts` 416 条 415 passed(唯一失败是 `keeps project policy deny and confirm command lists mutually exclusive` 5s 超时,单跑 3.2s 通过,与本次改动无关),`npm run agc:typecheck` 的 `tsc -p tsconfig.json --noEmit` 通过(其后的 `check-config.mjs` 因并发改动新增 `generate_local_project_asset` 未登记而报错,与本轮无关)。变异验证(已实测并还原):删掉点选里的一次性抑制 → 合法点选用例的「源素材仍选中」断言变红;删掉 Esc 的 `stopPropagation` → Esc 用例的 window 监听器收不到断言变红;删掉空白处门禁 → 非法目标用例的「点空白不清选中」断言变红。
- 影响范围:`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`.../features/resource-canvas/resourceVersionReplacementModel.ts`、`.../features/resource-canvas/resourceCanvasChrome.css`、`src/components/image-editor/ImageCanvasProjectAssetPickerDialog.tsx`、`apps/ai-game-creator-shell/tests/resourceVersionReplacement.test.tsx`、PRD §5.3 / §7.8 第 8 条、`docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md` 的 S15a。
- 已知未覆盖:点选只能点当前画布上可见的卡(目标在别的栏目要先切栏目,会话跨栏目存活);资源面板列表与 `@` 选择器在点选态下仍走各自的选中/插入语义,不参与点选。
## 2026-09-13 AGC 资源栏目页落地功能画布底部工具栏(工具矩阵 + 图片类 / 音频 / 上传接线)
- 背景:用户当日拍板「功能画布 = 资源栏目,按栏目分流底部工具栏」的工具矩阵,并明确不做生成视频 / 宣发素材 / 生成游戏场景(游戏场景本轮不做)与画布级「选择工具 / 抓手工具」(AGC 现无画布级工具模式)。本地 IPC `generate_local_project_asset` 当时已实现并通过 Rust 单测(含 `spec → icon-spec` 收口、图集缺规范图失败、比例 / 尺寸 / 长度边界),但**前端零调用方** —— `check-config.mjs` 的「App invoke 或显式 native-only 白名单」门禁因此一直报它未登记(本日前一条记录已把它记成"与本轮无关的报错"),本轮落地调用方后自然转绿,这正是本任务的验收项之一。
- 决策(矩阵):`ui-interaction` = 生成图片 / 生成规范(图标规范、自定义规范)/ 生成图标素材 / 生成 UI 设计图 / 上传;`character` = 生成图片 / 生成规范(角色规范、自定义规范)/ 生成角色形象 / 上传;`scene` = 生成图片 / 生成规范(自定义规范)/ 上传;`audio` = 生成背景音乐 / 生成音效 / 上传。文档、待归类、项目版本、「所有资源」展开态与资源总览**不渲染**工具栏(`resolveResourceCanvasBottomTools` 返回空数组,渲染判据 `resourceBookState.view === 'child'` 且 category 命中四个栏目)。工具项与顺序是纯数据表,事实源落在 `resourceCanvasBottomToolbarModel.ts`。
- 决策(落点与几何):工具栏是 `.game-resource-book-manager` 的**直接子节点**(与画本场景、右下 Dock、通知条并列,不进带 `scale()` 的场景层),锚在**左下角**(`left/bottom: 14px; z-index: 40`)——右下角是既有缩放 / 撤销 Dock,左下角是画布上唯一两者都不占的稳定空位;外壳消费共享 `packages/image-canvas-react` 的 `CanvasToolbar / CanvasToolbarGroup / CanvasChromeButton`(AGC 侧第一次真正消费这组共享 chrome)。一处必要覆盖:共享 `.genarrative-image-canvas__toolbar` 是横向滚动容器,会裁掉它自己弹出的二级菜单,消费端改成 `overflow: visible` + `flex-wrap: wrap`。
- 决策(接线与收敛):图片类入口 `generate_local_project_asset`(kind 映射:图片 `image` / 角色形象 `character` / 图标规范 `icon-spec` / 角色规范与自定义规范 `spec` / 图标素材 `art-spritesheet` / UI 设计图 `ui-prototype`);音频入口复用既有 `derive_local_project_resource` 无源生成链路(**不另写一份音频生成**);上传复用 `upload_local_asset`。两者成功后的刷新形状统一为「**配对读 `(revision, manifest)`** → `onManifestChange` → `pendingResourceFocusRef` 定位新卡」,不重算依赖图、不另写布局。**音频入口收敛**:既有「生成素材」浮层入口改为只保留视频(`ResourceCanvasGenerationPanelView` 新增 `kinds` prop,单类型入口不再渲染类型选择器,面板标题与提交文案跟类型走),视频能力不删只是不进工具栏。
- 决策(参数口径,避免假控件):比例 / 尺寸选项与默认值复用网页端纯模型 `ImageCanvasGenerationModel.ts`,但按本地 IPC 白名单收窄(本地通道明确拒绝 `4:3`,照搬就是一个点了必失败的选项);提示词上限复用 `resourceEditPromptMaxLength`(32000,与 Rust `LOCAL_PROJECT_ASSET_MAX_PROMPT_CHARS` 同口径);**面板不渲染模型选择器**(本地 IPC 没有 `model` 入参)。规范入口是固定档:只读展示规格,不给点了不生效的比例控件。
- 决策(前置规范图,本轮的关键设计):`ui-prototype` 与 `art-spritesheet` 在 Rust 侧要求项目里已有登记并绑定当前账号的 `assets/art-spec.png`(`local_path` 精确匹配 + `kind == icon-spec` + 图片媒体类型 + 画布来源)。前端判据 `projectHasIconSpecReference` 与它逐字对齐;缺前置时入口**保持可点击**并给可执行原因(`aria-disabled` 而非原生 `disabled`,文案含 `assets/art-spec.png` 与「生成规范 → 图标规范」),且零生成请求。**同时**把「图标规范」入口在缺前置时按 `assets/art-spec.png` 落盘(`outputPath`),否则那两条入口会被前置条件永久锁死、工具栏自身无法满足自己的前置;已有权威规范图时不再传 `outputPath`(Rust `replace_existing` 固定 `false`,指向已存在文件会被硬拒),改为生成一张新的普通图标规范资产。这条是**前端策略**,不扩接口。
- 已知能力缺口(用户口径是「缺参数就停下汇报,不自行扩接口」,记账备查):本地 IPC 没有 ① `model` ② `specType` ③ `replaceExisting` 入参。后果:面板不给模型选择;**角色规范与自定义规范共用 `spec` 通道**(靠 `assetName` / 提示词区分),因此「角色规范」不是真正的角色设定板通道;权威规范图存在时无法重写它。另:网页端 composer 子视图(含 `ImageCanvasSpecGenerationPanelView` 直连 `/api/editor/llm/icon-specs/*`)**没有复用**,因为 AGC 无该 BFF 通道且本地 IPC 不接受模型 / 参考图入参,照搬会渲染改不了请求的控件——本轮只把**纯模型**接进来。
- 影响范围:`apps/ai-game-creator-shell/src/features/resource-canvas/{resourceCanvasBottomToolbarModel.ts,ResourceCanvasBottomToolbarView.tsx,ResourceCanvasAssetGenerationPanelView.tsx,ResourceCanvasGenerationPanelView.tsx,resourceCanvasChrome.css}`、`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、测试 `apps/ai-game-creator-shell/tests/{resourceCanvasBottomToolbar.test.tsx(新增),resourceCanvasGenerationEntry.test.tsx,projectResourceLiveIntegration.test.tsx,appSurface/project-development.suite.ts}`、PRD §3.10 / §7.9 / §8、`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md`(新增)、验收用例 S11 / S11a。**未动**:Rust、external v1 / OpenAPI、`packages/`(只消费共享 chrome)、SpacetimeDB。
- 验证方式:`npx vitest run apps/ai-game-creator-shell/tests/appSurface.test.ts`(423 passed,含新增 6 条:栏目分流与总览不渲染、UI 栏 5 个入口载荷、前置缺失可点击说明且零请求、角色栏 2 个入口、音频入口走既有链路、上传 + 配对读清单,另 1 条工具栏与 Dock 的 CSS 几何契约);`resourceCanvasBottomToolbar.test.tsx` 15 passed(新增);`resourceCanvasGenerationEntry.test.tsx` 11 passed(新增单类型用例 1 条);`projectResourceLiveIntegration.test.tsx` 25 passed(「生成素材」面板改名断言同步更新);`npm run agc:typecheck` 全绿(**其中的 `check-config.mjs` 报错已因本轮落地调用方而消失**)、`npm run check:encoding`、`git diff --check` 干净。未 commit。
- 关联文档:`docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`(§3.10 / §7.9 / §8)、`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md`、`docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md`(S11 / S11a / §7.3)。
@@ -5203,6 +5203,7 @@
- 处理:搜索框恢复 `display: flex`,常态 `align-self: center` 居中(总览态标题在左上、分页态栏目标题栏左右两端都有内容,只有中段是空的),与缩放 Dock 同级 `z-index: 40`;提示条同样抬到场景之上。
- 同批修复(大纲):栏目大纲常态是 `opacity: 0.68` + `scale(0.86)` + 全透明底 + `svg { width: 0 }`,常态只剩 11px 文字,用户认不出那是分区入口;现在常态就给 Dock 底板、14px 栏目图标和 12px 栏目文字并高亮当前栏目,悬停/键盘聚焦只做同一套 token 的加强。同批把 `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md` 的「操作边界」与「验收」两条一起改成"常态即可读可点",不留描述旧收起态的文档。
- 关联:`apps/ai-game-creator-shell/src/styles.css`、`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx`。
- 后续(2026-09-13):搜索浮层与筛选浮层合并成唯一的 `.game-resource-filter-panel`,`.game-resource-search` 的两条规则连同 Dock 上那颗滑块按钮一起删除。本条教训(可见性只能在 CSS 声明层断言)继续成立,同口径断言现在钉 `.game-resource-filter-panel`(`display: none` / `position: absolute` / z-index / Dock 锚定),见 `decision-log.md` 2026-09-13 一条。
## AGC 复用共享画布组件时要自己渲染 `.genarrative-image-canvas` 根类(2026-09-10)
@@ -5271,6 +5272,7 @@
- 浮层必须钉住的两条:① 提示层容器整层 `pointer-events: none`、只有提示条自己 `pointer-events: auto`(横跨整行的透明盒子吃点击正是上面那条 bug);② 搜索条件不随浮层收起而清除(`searchText` 是画布状态,`type=search` 的原生 Esc 清空已被 `preventDefault` 挡掉),"当前有搜索"由 Dock 按钮的 `.is-active` 高亮表达。
- 门禁为什么抓不到:jsdom 不做布局命中判定,`getByLabelText` 也不校验可见性;可见性与重叠只能钉声明(`tests/appSurface/project-development.suite.ts` 的 `styleRuleBody` 口径),入口另用真实 DOM 用例覆盖——`tests/appSurface/harness.ts` 的 `openResourceSearch()` 先按产品入口打开浮层,浮层没打开时 `getByLabelText` 直接抛错,堵掉"元素在但点不到"的假绿。
- 关联:`apps/ai-game-creator-shell/src/styles.css`、`apps/ai-game-creator-shell/src/view/project-development/index.tsx`、`apps/ai-game-creator-shell/tests/appSurface/harness.ts`、`src/components/image-editor/useImageCanvasFloatingOptionDismiss.ts`。
- 后续(2026-09-13):搜索浮层与筛选浮层合并成唯一的 `.game-resource-filter-panel`(关键词 / 所在区域 / 自定义标签),Dock 只留放大镜按钮、`.game-resource-search` 已删除,关闭改用面板自己的「点外部 + Esc」;条目里的 `right: 14px` + `bottom: 58px`(= Dock 14px + 34px + 10px 间隙、刻意不写 `top`)与「条件不随浮层收起而清除」两条口径原样沿用,harness 的 `openResourceSearch()` 现名 `openResourceFilterPanel()`,见 `decision-log.md` 2026-09-13 一条。
## AGC 画布侧分类筛选条已按用户要求移除,共享筛选条组件保留(2026-09-11)