完善 Game Agent 资源画布与图片精修生成事务 #181

Merged
kdletters merged 28 commits from codex/game-agent-resource-section-pages into master 2026-08-24 20:42:58 +08:00
Member

背景

本合并请求整合 Game Agent 资源管理的栏目分页自由画布,以及图片持续精修、候选生成和本地恢复事务。

当前远端比较基线:

  • base:master @ b00a3f80576949567bf3320f0c6c92b4ed0a649d
  • head:codex/game-agent-resource-section-pages @ 5795d2f9b8797c342dcf2920ccefec2a3ff3f472
  • 相对 base:28 commits、33 files(+3746 / -1333

主要改动

资源管理分页自由画布

  • 固定展示“设计文档 → 美术资源 → 音乐音效 → 游戏代码 → 项目版本”五个栏目;空栏目仍可从悬浮 Dock 打开空画布。
  • 按依赖按类型 共用栏目分页画布;每个“排序模式 + 栏目”组合独立保存 viewport。
  • 普通滚轮使用有界意图队列切换栏目;Ctrl/Meta + 滚轮以指针为锚点缩放;空白拖拽可沿 x/y 无限平移,不以资源 extent 作为导航边界。
  • 资源卡支持拖拽布局与一次 CAS 持久化;切页、排序切换和卸载会统一取消拖拽及 pointer capture。
  • 资源详情为非模态独立卡片:打开、切换或关闭详情不卸载背景画布、资源卡或依赖连线,也不重置 viewport、搜索或排序状态。
  • 顶部已移除“生成视频 / 生成音效 / 生成背景音乐 / 新增 UI 设计”的手动入口;保留播放、未完成编辑恢复、排序和画布复位,以及资源详情中的既有编辑动作。

图片持续精修与生成事务

  • 图片资源可进入唯一活动精修草稿,支持原生批量导入、图片下方快速编辑卡、候选图层、任务侧栏和“设为最终图”。
  • 生成成功只合并候选图层和 generation 权威事实,不以全量 hydrate 覆盖生成期间的本地编辑。
  • 候选媒体、图层和公开 generation 记录写入并回读成功后,才推进私有 candidate-ready
  • 候选确认接入 Surface 保存 FIFO 与重新打开 hydrate;revision-sensitive 操作等待确认屏障。
  • 失败归档和正式图提交采用可恢复中间态,避免中断后出现幽灵任务、重复 revision 或不一致的正式资产。

合同与文档

  • acknowledgeCandidateLayersimportLocalImagesarchiveFailedGeneration 为必选 Host Port;不支持的宿主返回结构化 unsupported-capability
  • 同步更新 TypeScript / Rust 合同、Tauri command 可达性、PRD、技术方案与项目共享记忆。
  • 明确资源栏目无限画布合同:普通平移不夹取;资源 extent、图片测量、布局变更和 resize 不得重置用户 viewport;仅首次可测量布局与显式复位按真实卡片包围盒适配内容。

验证

CI run #1290 针对当前 head 已完成且四项均成功:

  • Repository checks
  • Frontend tests(235 test files、3166 tests passed;App Surface 410 tests)
  • Backend tests
  • Native shell tests

另有本地定向检查:

  • npm run agc:typecheck
  • 资源画布、App Surface、Asset Canvas 与资源实时集成定向回归
  • Rust 候选确认、候选中断恢复、失败归档与恢复定向测试
  • cargo fmt --check
  • npm run check:encoding
  • git diff --check

评审 provenance

  • review #247、#248、#252 都针对旧 head,当前在 Gitea 中均标记为 stale;不将其写作“已处理 #247”或当前 head 的评审结论。
  • review #253 针对旧 5456a1d… head,提出 PRD 退役入口、共享 pitfalls 的 extent 旧合同和 PR 正文事实更新三项 P2;对应文档已在 5795d2f… head 修复并推送。
  • 早期由 PR #176 引入的候选持久化、归档、Host Port 与快速编辑卡问题,当前已在 base/head 中具备对应修复,不作为本轮重复阻断项。
  • 当前 head 仍需新的、针对最新提交的审批;历史 stale review 不能替代当前 head approval。

影响范围

  • 修改 AI 游戏创作 App 的资源管理、图片精修、Tauri 本地持久化与恢复语义,以及共享合同和权威文档。
  • 会调整本地资源布局、精修 draft 和私有 generation ledger 的状态机。
  • 不修改 SpacetimeDB schema,不新增或变更 /api/external/v1 路由。
## 背景 本合并请求整合 Game Agent 资源管理的栏目分页自由画布,以及图片持续精修、候选生成和本地恢复事务。 当前远端比较基线: - base:`master` @ `b00a3f80576949567bf3320f0c6c92b4ed0a649d` - head:`codex/game-agent-resource-section-pages` @ `5795d2f9b8797c342dcf2920ccefec2a3ff3f472` - 相对 base:28 commits、33 files(`+3746 / -1333`) ## 主要改动 ### 资源管理分页自由画布 - 固定展示“设计文档 → 美术资源 → 音乐音效 → 游戏代码 → 项目版本”五个栏目;空栏目仍可从悬浮 Dock 打开空画布。 - `按依赖` 与 `按类型` 共用栏目分页画布;每个“排序模式 + 栏目”组合独立保存 viewport。 - 普通滚轮使用有界意图队列切换栏目;Ctrl/Meta + 滚轮以指针为锚点缩放;空白拖拽可沿 x/y 无限平移,不以资源 extent 作为导航边界。 - 资源卡支持拖拽布局与一次 CAS 持久化;切页、排序切换和卸载会统一取消拖拽及 pointer capture。 - 资源详情为非模态独立卡片:打开、切换或关闭详情不卸载背景画布、资源卡或依赖连线,也不重置 viewport、搜索或排序状态。 - 顶部已移除“生成视频 / 生成音效 / 生成背景音乐 / 新增 UI 设计”的手动入口;保留播放、未完成编辑恢复、排序和画布复位,以及资源详情中的既有编辑动作。 ### 图片持续精修与生成事务 - 图片资源可进入唯一活动精修草稿,支持原生批量导入、图片下方快速编辑卡、候选图层、任务侧栏和“设为最终图”。 - 生成成功只合并候选图层和 generation 权威事实,不以全量 hydrate 覆盖生成期间的本地编辑。 - 候选媒体、图层和公开 generation 记录写入并回读成功后,才推进私有 `candidate-ready`。 - 候选确认接入 Surface 保存 FIFO 与重新打开 hydrate;revision-sensitive 操作等待确认屏障。 - 失败归档和正式图提交采用可恢复中间态,避免中断后出现幽灵任务、重复 revision 或不一致的正式资产。 ### 合同与文档 - `acknowledgeCandidateLayers`、`importLocalImages`、`archiveFailedGeneration` 为必选 Host Port;不支持的宿主返回结构化 `unsupported-capability`。 - 同步更新 TypeScript / Rust 合同、Tauri command 可达性、PRD、技术方案与项目共享记忆。 - 明确资源栏目无限画布合同:普通平移不夹取;资源 extent、图片测量、布局变更和 resize 不得重置用户 viewport;仅首次可测量布局与显式复位按真实卡片包围盒适配内容。 ## 验证 CI run [#1290](https://git.genarrative.world/git/GenarrativeAI/Genarrative/actions/runs/1290) 针对当前 head 已完成且四项均成功: - [x] Repository checks - [x] Frontend tests(235 test files、3166 tests passed;App Surface 410 tests) - [x] Backend tests - [x] Native shell tests 另有本地定向检查: - [x] `npm run agc:typecheck` - [x] 资源画布、App Surface、Asset Canvas 与资源实时集成定向回归 - [x] Rust 候选确认、候选中断恢复、失败归档与恢复定向测试 - [x] `cargo fmt --check` - [x] `npm run check:encoding` - [x] `git diff --check` ## 评审 provenance - review #247、#248、#252 都针对旧 head,当前在 Gitea 中均标记为 stale;不将其写作“已处理 #247”或当前 head 的评审结论。 - review #253 针对旧 `5456a1d…` head,提出 PRD 退役入口、共享 pitfalls 的 extent 旧合同和 PR 正文事实更新三项 P2;对应文档已在 `5795d2f…` head 修复并推送。 - 早期由 PR #176 引入的候选持久化、归档、Host Port 与快速编辑卡问题,当前已在 base/head 中具备对应修复,不作为本轮重复阻断项。 - 当前 head 仍需新的、针对最新提交的审批;历史 stale review 不能替代当前 head approval。 ## 影响范围 - 修改 AI 游戏创作 App 的资源管理、图片精修、Tauri 本地持久化与恢复语义,以及共享合同和权威文档。 - 会调整本地资源布局、精修 draft 和私有 generation ledger 的状态机。 - 不修改 SpacetimeDB schema,不新增或变更 `/api/external/v1` 路由。
suzmii added 16 commits 2026-08-23 18:51:42 +08:00
新增 AssetCanvasSurface 点击重构前备份。

新增素材画布样式点击重构前备份。
图片预览返回并透传像素宽高。

统一计算图片卡边界并让布局碰撞、自动位置和分区范围消费实际尺寸。

依赖连线按逐资源矩形计算端点并补充模型与预览测试。
将资源依赖视图改为统一自由画板,并增加真实比例卡片和隐藏导航边界。

复用素材画布实现图片快速编辑、候选生成、导入、失败任务归档和正式图提交。

补齐原生事务恢复、服务身份确认、全屏失败遮罩及任务列表交互。

同步资源投影、布局、预览、前后端测试和技术文档。
保留资源自由画板、详情卡与图片精修交互。

接入主分支UI设计资源创建与编辑入口。

合并主分支凭据目录权限和画布相关更新。
美术资源与恢复结果提交后发送manifest失效事件。

直连回合失败或超时后仍对账已提交资源。

完善UI编辑器与资源工作台的返回和布局边界。

补充实时刷新回归测试与技术决策文档。
在资源画板根节点禁用文本选择,覆盖依赖与类型视图。

保留详情卡与资源编辑表单的文本交互。

补充资源工作台样式回归测试。
将上下文、参考图和首次提交阶段的401账本保留为可恢复状态。

区分401鉴权失效与403权限拒绝,刷新后复用原生成身份和幂等请求。

补充持久化账本重放回归测试与登录刷新验收合同。
统一解析精修素材名并剥离历史提交后缀

将候选提交参数校验前移到零副作用阶段

严格识别被后续提交取代的旧事务并增加并发提交门禁

支持生成占位卡拖动和精修候选唯一提交

补充素材画布回归测试与合同文档
合入master的直连Codex、受控Skill、工具桥与首页创作入口改造

保留资源画布精修、生成占位拖动与失败任务归档链路

修正三项内置AGC Skill内容指纹并保持审核包版本

对齐master合入后的Rust格式与项目开发前端测试
为生成账本增加候选层首次确认修订记录

未确认候选在普通草稿保存中被后端合并保留

恢复画布时从私有账本重建未确认候选层

前端水合后同步运行时引用并立即确认保存
提交精修后刷新游戏引用的稳定入口字节

记录运行入口并在幂等重放与恢复中修复

补充稳定入口回归测试与技术合同
保留master的npm workspaces与内置Skill指纹修复

恢复并保留双方项目决策记录

补记精修最终图稳定运行入口决策
用Prettier忽略保持根锁路径声明单行

恢复check-native-shells精确源码守卫匹配
修复旧精修事务稳定入口迁移
Project CI / Frontend tests (pull_request) Successful in 4m36s
Project CI / Repository checks (pull_request) Successful in 4m57s
Project CI / Backend tests (pull_request) Successful in 5m43s
Project CI / Native shell tests (pull_request) Successful in 16m22s
52a58f7514
从已校验旧事务快照推导原稳定入口路径

允许稳定入口缺失时在下一次提交重建

补充旧事务连续精修回归测试与文档
调整资源分页画布 viewport 与复位按钮交互

允许资源元素使用 -1,000,000 到 1,000,000 的持久化坐标

同步 TypeScript、Rust 合同、布局校验与负坐标回归测试

更新资源画布 PRD 与技术方案

保留本地 .env 未提交
优化资源栏目悬浮分页交互
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / Frontend tests (pull_request) Successful in 3m39s
Project CI / Native shell tests (pull_request) Successful in 14m42s
d1e2daace7
将资源栏目大纲改为不占画布宽度的悬浮 Dock,并统一栏目名称。

实现有界滚轮分页队列,显式切页和拖动时取消待处理跳转。

补充栏目切换、拖动取消和资源实时集成回归测试。

同步更新资源自由画板技术方案与验收口径。
suzmii marked the pull request as work in progress 2026-08-23 18:51:55 +08:00
suzmii added 2 commits 2026-08-23 19:10:44 +08:00
吸收master的客户端主界面、模态焦点与鉴权恢复改动。

保留资源生成候选确认、精修恢复与稳定引用修复流程。

解决配置门禁和Direct Codex状态清理冲突。

补齐融合后的候选恢复回归断言。
合并master的Agent消息气泡优化
Project CI / Repository checks (pull_request) Successful in 2m29s
Project CI / Frontend tests (pull_request) Successful in 4m28s
Project CI / Backend tests (pull_request) Successful in 6m58s
Project CI / Native shell tests (pull_request) Successful in 16m13s
c97130f093
合入Agent对话用户消息气泡样式调整。

合入工作台主题对比度与项目开发界面回归测试。

同步项目开发工作台PRD说明。
suzmii marked the pull request as ready for review 2026-08-23 19:11:59 +08:00
suzmii requested review from kdletters 2026-08-23 19:12:15 +08:00
kdletters requested changes 2026-08-23 19:39:24 +08:00
Dismissed
kdletters left a comment
Member

当前 head c97130f0934 仍有 12 个 P1 和 1 个 P2,需要请求更改:其中 5 个是本次栏目分页/拖拽增量问题,5 个是 PR 181 随仍开放的 PR 176 一并带入的生成持久化与 Host Port 问题,另有 2 个权威文档合同冲突。实际 diff 为 18 commits、45 files、+12,329/-2,537,包含 Rust、共享合同与持久化坐标语义,不符合正文“仅 UI、不修改持久化”的范围声明;请修复行内问题,并同步重写标题、正文、权威文档和验证范围。当前精确 head 的本地 typecheck、AppSurface 390/390、布局与资源实时集成 49/49、编码检查和 diff-check 已通过,但现有测试没有覆盖这些触发路径。

当前 head `c97130f0934` 仍有 12 个 P1 和 1 个 P2,需要请求更改:其中 5 个是本次栏目分页/拖拽增量问题,5 个是 PR 181 随仍开放的 PR 176 一并带入的生成持久化与 Host Port 问题,另有 2 个权威文档合同冲突。实际 diff 为 18 commits、45 files、+12,329/-2,537,包含 Rust、共享合同与持久化坐标语义,不符合正文“仅 UI、不修改持久化”的范围声明;请修复行内问题,并同步重写标题、正文、权威文档和验证范围。当前精确 head 的本地 typecheck、AppSurface 390/390、布局与资源实时集成 49/49、编码检查和 diff-check 已通过,但现有测试没有覆盖这些触发路径。
@@ -2482,3 +3362,3 @@
root,
&mut ledger,
GenerationLedgerPhase::AssetDurableCommitted,
GenerationLedgerPhase::CandidateReady,
Member

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] CandidateReady 不能早于候选事实落盘。这里先把私有 ledger 写成恢复逻辑会直接视为终态的 CandidateReady,下一步 persist_generation_candidate_at 仍可能因草稿写入、revision 或 I/O 失败退出;重启后恢复入口会跳过重放并直接读取尚不存在的候选,形成无法自动收敛的终态账本。请先以幂等方式持久化候选草稿/图层并回读成功,再推进终态,或增加可重放的中间 phase;补在两次写之间故障注入并重启恢复的测试。

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] `CandidateReady` 不能早于候选事实落盘。这里先把私有 ledger 写成恢复逻辑会直接视为终态的 `CandidateReady`,下一步 `persist_generation_candidate_at` 仍可能因草稿写入、revision 或 I/O 失败退出;重启后恢复入口会跳过重放并直接读取尚不存在的候选,形成无法自动收敛的终态账本。请先以幂等方式持久化候选草稿/图层并回读成功,再推进终态,或增加可重放的中间 phase;补在两次写之间故障注入并重启恢复的测试。
suzmii marked this conversation as resolved
@@ -2575,0 +3496,4 @@
}
ledger.phase = GenerationLedgerPhase::Archived;
ledger.archived_at = Some(asset_canvas_now());
write_generation_ledger(root, &mut ledger)?;
Member

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 归档终态写在草稿删除之前会留下永久半归档。此处 ledger 已写成 Archived 后,草稿移除 generation 的写入仍可能失败;恢复扫描会跳过 Archived,而再次归档又受调用方持有的旧 revision/公开记录状态影响,导致任务在草稿中残留且无法可靠收敛。请使用可恢复的中间 phase/事务 journal,确保草稿删除成功并回读后才发布 Archived,且重放保持幂等;补 ledger 写成功、draft 写失败后的重启恢复测试。

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 归档终态写在草稿删除之前会留下永久半归档。此处 ledger 已写成 `Archived` 后,草稿移除 generation 的写入仍可能失败;恢复扫描会跳过 Archived,而再次归档又受调用方持有的旧 revision/公开记录状态影响,导致任务在草稿中残留且无法可靠收敛。请使用可恢复的中间 phase/事务 journal,确保草稿删除成功并回读后才发布 Archived,且重放保持幂等;补 ledger 写成功、draft 写失败后的重启恢复测试。
suzmii marked this conversation as resolved
@@ -1751,0 +2360,4 @@
createdAt: Date.now(),
updatedAt: Date.now(),
};
const initialGenerationRecord: ImageCanvasGenerationRecord = {
Member

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 不要在宿主接受生成前持久化无法收敛的 running 记录。这里把 generation-running 先塞进 draft 并由后续 persistDraft() 落盘;如果 generateImage 在创建私有 ledger 前失败或抛错,下面只更新内存 task/lifecycle,没有移除或持久化失败后的 generation。刷新后公开记录会永久显示运行中,恢复又找不到对应私有账本。请让占位与宿主创建生成形成可恢复事务:失败时以当前 revision CAS 删除/终结该记录并持久化,或由后端原子创建权威记录后再 hydrate;补“草稿保存成功、生成调用失败/抛错、刷新恢复后无幽灵 running 任务”的回归。

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 不要在宿主接受生成前持久化无法收敛的 running 记录。这里把 `generation-running` 先塞进 draft 并由后续 `persistDraft()` 落盘;如果 `generateImage` 在创建私有 ledger 前失败或抛错,下面只更新内存 task/lifecycle,没有移除或持久化失败后的 generation。刷新后公开记录会永久显示运行中,恢复又找不到对应私有账本。请让占位与宿主创建生成形成可恢复事务:失败时以当前 revision CAS 删除/终结该记录并持久化,或由后端原子创建权威记录后再 hydrate;补“草稿保存成功、生成调用失败/抛错、刷新恢复后无幽灵 running 任务”的回归。
suzmii marked this conversation as resolved
@@ -1769,0 +2489,4 @@
result.value.images.forEach((image) =>
URL.revokeObjectURL(image.previewUrl),
);
await hydrateDraft(result.value.draft, epoch);
Member

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 不要用生成返回的整份 draft 覆盖生成期间仍可编辑的本地画布。当前生成开始后没有进入 canvas.generating 或锁住画布交互,拖动、视口和选择修改仍可能进入 180ms autosave/save queue;这里的 hydrateDraft 会直接替换 layers、viewport、selection,清空 history,并把 document version 归零,尚未落盘或晚于生成快照的本地修改会被静默丢失。请在 hydrate 前等待并校验保存屏障,或只把候选/generation 权威事实合并进当前 dirty 画布并重放本地修改;补生成进行中编辑且 autosave 与生成完成交错的回归。

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 不要用生成返回的整份 draft 覆盖生成期间仍可编辑的本地画布。当前生成开始后没有进入 `canvas.generating` 或锁住画布交互,拖动、视口和选择修改仍可能进入 180ms autosave/save queue;这里的 `hydrateDraft` 会直接替换 layers、viewport、selection,清空 history,并把 document version 归零,尚未落盘或晚于生成快照的本地修改会被静默丢失。请在 hydrate 前等待并校验保存屏障,或只把候选/generation 权威事实合并进当前 dirty 画布并重放本地修改;补生成进行中编辑且 autosave 与生成完成交错的回归。
suzmii marked this conversation as resolved
@@ -1923,0 +2706,4 @@
quickEditOpen && quickEditSourceLayerId
? (layers.find((layer) => layer.id === quickEditSourceLayerId) ?? null)
: null;
const quickEditPanelStyle: CSSProperties | null = quickEditSourceLayer
Member

[P2][继承自 PR #176 的早期提交,非 PR #181 本次增量] 快速编辑卡位置需要按 viewport 四边钳制或自动翻转。当前直接用图层底部中心作为 left/top,卡片自身宽高没有参与计算;图片靠近右侧/底部(移动端也包括左侧)时,卡片会被 viewport 的 overflow 裁掉,输入框和操作按钮不可达。请在测得/约束卡片尺寸后选择上/下方并 clamp 到可视区域,滚动、缩放/resize 时同步更新;补四边及窄 viewport 的交互回归。

[P2][继承自 PR #176 的早期提交,非 PR #181 本次增量] 快速编辑卡位置需要按 viewport 四边钳制或自动翻转。当前直接用图层底部中心作为 `left/top`,卡片自身宽高没有参与计算;图片靠近右侧/底部(移动端也包括左侧)时,卡片会被 viewport 的 overflow 裁掉,输入框和操作按钮不可达。请在测得/约束卡片尺寸后选择上/下方并 clamp 到可视区域,滚动、缩放/resize 时同步更新;补四边及窄 viewport 的交互回归。
suzmii marked this conversation as resolved
@@ -676,2 +748,4 @@
'--resource-card-height': `${cardSize.height}px`,
} as CSSProperties
}
onPointerDown={(event) => onPointerDown(event, resource, x, y)}
Member

[P1] 卡片内的媒体播放按钮只在 onClick 阶段 stopPropagation,pointerdown 已经先冒泡到这里并启动卡片拖动。用户点播放/暂停时只要轻微移动超过阈值,pointerup 就会提交一次资源坐标 CAS。请在开始拖动前过滤交互控件,或在媒体按钮的 pointerdown 阶段阻止冒泡;补播放/暂停不触发布局写入的回归。

[P1] 卡片内的媒体播放按钮只在 onClick 阶段 stopPropagation,pointerdown 已经先冒泡到这里并启动卡片拖动。用户点播放/暂停时只要轻微移动超过阈值,pointerup 就会提交一次资源坐标 CAS。请在开始拖动前过滤交互控件,或在媒体按钮的 pointerdown 阶段阻止冒泡;补播放/暂停不触发布局写入的回归。
suzmii marked this conversation as resolved
@@ -1439,2 +1774,4 @@
};
const wheel = (event: WheelEvent) => {
const target = event.target instanceof Element ? event.target : null;
if (target?.closest('button, input, textarea, select, a')) {
Member

[P1] 这里把所有按钮和表单控件上的 wheel 提前放行,但资源卡的详情按钮覆盖整张卡,栏目 Dock、复位和下一页入口也都是 button。鼠标位于这些区域时,普通滚轮不能切换栏目,Ctrl/Meta+滚轮也不会缩放画布,而且默认滚动/缩放没有被阻止。请只排除确实需要原生滚动的控件,或先识别画布手势并统一 preventDefault;补资源卡和 Dock/复位按钮上的 wheel 回归。

[P1] 这里把所有按钮和表单控件上的 wheel 提前放行,但资源卡的详情按钮覆盖整张卡,栏目 Dock、复位和下一页入口也都是 button。鼠标位于这些区域时,普通滚轮不能切换栏目,Ctrl/Meta+滚轮也不会缩放画布,而且默认滚动/缩放没有被阻止。请只排除确实需要原生滚动的控件,或先识别画布手势并统一 preventDefault;补资源卡和 Dock/复位按钮上的 wheel 回归。
suzmii marked this conversation as resolved
@@ -2084,0 +2627,4 @@
}
if (!drag.captured) {
drag.captured = true;
event.currentTarget.setPointerCapture?.(event.pointerId);
Member

[P1] pointer capture 直到越过拖动阈值后才建立;鼠标在阈值内移出卡片并在外部释放时,卡片收不到 pointerup/pointercancel,resourceCardDragRef 会残留。栏目点击和排队滚轮切页也只清理 canvas pan,没有统一释放卡片 capture、drag ref 与 preview,切页卸载卡片时同样会留下半截拖动。请在 pointerdown 建立可靠所有权,或增加统一 cancel 并在切页/卸载调用;补移出释放和拖动中切页回归。

[P1] pointer capture 直到越过拖动阈值后才建立;鼠标在阈值内移出卡片并在外部释放时,卡片收不到 pointerup/pointercancel,resourceCardDragRef 会残留。栏目点击和排队滚轮切页也只清理 canvas pan,没有统一释放卡片 capture、drag ref 与 preview,切页卸载卡片时同样会留下半截拖动。请在 pointerdown 建立可靠所有权,或增加统一 cancel 并在切页/卸载调用;补移出释放和拖动中切页回归。
suzmii marked this conversation as resolved
@@ -3434,0 +3893,4 @@
/>
) : mode === 'resources' ? (
<>
{focusedResource ? (
Member

[P1] 这里已经把详情改成浮层并继续渲染下方资源画布,但上面的 wheel effect 仍在 focusedResourceId 非空时直接退出。因此详情打开后,背景虽然还能点击和拖拽,却不能滚轮切栏目或 Ctrl/Meta+滚轮缩放,不符合“非模态、背景画布仍可操作”的契约。请让画布 listener 在详情态继续存在,仅隔离详情面板自身的滚动,并补详情打开时的背景交互回归。

[P1] 这里已经把详情改成浮层并继续渲染下方资源画布,但上面的 wheel effect 仍在 focusedResourceId 非空时直接退出。因此详情打开后,背景虽然还能点击和拖拽,却不能滚轮切栏目或 Ctrl/Meta+滚轮缩放,不符合“非模态、背景画布仍可操作”的契约。请让画布 listener 在详情态继续存在,仅隔离详情面板自身的滚动,并补详情打开时的背景交互回归。
suzmii marked this conversation as resolved
@@ -966,1 +1265,3 @@
position.x + RESOURCE_CANVAS_CARD_WIDTH + RESOURCE_CANVAS_COLUMN_GAP,
...positions.map((position) =>
Math.ceil(
position.x +
Member

[P1] 本次已允许手动位置为负数,但 extent 仍只计算 x + width / y + height,调用方又把导航 bounds 的 x、y 固定为 0。卡片拖到左侧或上方后不会进入 fit bounds,复位或重新进入栏目可能无法找回该资源。请按所有卡片计算 minX/minY/maxX/maxY 并把非零原点传给 fit,补负坐标资源的复位与栏目重进回归。

[P1] 本次已允许手动位置为负数,但 extent 仍只计算 x + width / y + height,调用方又把导航 bounds 的 x、y 固定为 0。卡片拖到左侧或上方后不会进入 fit bounds,复位或重新进入栏目可能无法找回该资源。请按所有卡片计算 minX/minY/maxX/maxY 并把非零原点传给 fit,补负坐标资源的复位与栏目重进回归。
suzmii marked this conversation as resolved
@@ -345,3 +345,3 @@
### 5.3 资源类型与替换兼容性(P1)
实现状态(2026-08-10):当前资源投影已收口到固定的“文档 -> 项目版本 -> 美术资源 -> 音乐音效资源”四区。文档接收受支持的 UTF-8 文档/代码和合法 Agent 文本回执;项目版本只接收显式 `ProjectVersionResourceSummary` read model,未知任务产物不得兜底为版本;美术接收图片、SVG、动画和视频类产物;音频接收 manifest 资产、上传登记资产和已完成任务 `artifacts` 明确声明的音频产物。无法识别的二进制任务产物和附件不进入资源画布。受控读取、中央聚焦、失败空态与媒体播放不改变 manifest 真相;编辑成功后只追加新的 asset 或版本子记录。
实现状态(2026-08-22):当前资源投影与栏目页顺序收口为“文档 -> 美术资源 -> 音乐音效资源 -> 游戏代码 -> 项目版本”。文档接收受支持的 UTF-8 文档代码资产中的文档类型和合法 Agent 文本回执;项目版本只接收显式 `ProjectVersionResourceSummary` read model,未知任务产物不得兜底为版本;美术接收图片、SVG、动画和视频类产物;音频接收 manifest 资产、上传登记资产和已完成任务 `artifacts` 明确声明的音频产物;游戏代码接收 Direct Codex / 任务产物登记的 HTML、CSS 和 JavaScript。无法识别的二进制任务产物和附件不进入资源画布。受控读取、中央聚焦、失败空态与媒体播放不改变 manifest 真相;编辑成功后只追加新的 asset 或版本子记录。
Member

[P1] 这里新增了“游戏代码”栏目,但权威描述仍写成“文档 / 音乐音效资源”,与同一变更中的正式标签“设计文档 / 音乐音效”不一致;紧接着的 ProjectResourceDescriptor.category 仍只有 document/version/art/audio,也缺少实际合同中的 code。请先统一栏目名和类型合同,再让代码、测试与文档共同消费同一组枚举,避免 PRD 继续成为过期接口。

[P1] 这里新增了“游戏代码”栏目,但权威描述仍写成“文档 / 音乐音效资源”,与同一变更中的正式标签“设计文档 / 音乐音效”不一致;紧接着的 `ProjectResourceDescriptor.category` 仍只有 document/version/art/audio,也缺少实际合同中的 `code`。请先统一栏目名和类型合同,再让代码、测试与文档共同消费同一组枚举,避免 PRD 继续成为过期接口。
suzmii marked this conversation as resolved
@@ -0,0 +13,4 @@
### 栏目分页投影与设计文档缺失边界
- 非空栏目页只由当前权威资源投影构造:manifest assets、已完成任务的 artifacts、用户已导入附件和持久化 Agent 文本回执。前端不得扫描项目目录自行发明资源。
- 设计文档栏因此只有在上述来源存在 Markdown / TXT / JSON / YAML 等文档类条目,或存在 Agent 文本回执时才出现。若 manifest 没有文档资产、任务 artifacts 未完成且没有附件 / 回执,资源页不显示设计文档页;这是生成或登记缺失,不由 UI 补假数据。
Member

[P1] 本文档在这里规定“无文档时不显示设计文档页”,但第 84 行和验收第 111 行又规定分页 Dock 展示全部栏目、空栏目可打开空画布;实现采用后者。请确定唯一产品合同并同步改写全文、PRD 与测试,不能让同一份权威方案同时要求隐藏和展示空栏目。

[P1] 本文档在这里规定“无文档时不显示设计文档页”,但第 84 行和验收第 111 行又规定分页 Dock 展示全部栏目、空栏目可打开空画布;实现采用后者。请确定唯一产品合同并同步改写全文、PRD 与测试,不能让同一份权威方案同时要求隐藏和展示空栏目。
suzmii marked this conversation as resolved
@@ -193,6 +200,11 @@ export interface ImageCanvasProjectPort {
}
export interface ImageCanvasAssetPort {
importLocalImages?(input: {
Member

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 保持冻结 Host Port 的“方法始终存在”合同。把 importLocalImages(以及下方 archiveFailedGeneration)声明成可选后,共享 UI 开始靠方法是否缺失分支能力,和合同规定的“能力不可用时返回结构化 unsupported-capability”冲突,也会让不同 adapter 静默漂移。请把两个方法都改为必选,由不支持的宿主返回 unsupportedImageCanvasCapability(...),并增加对所有 Host adapter 的方法存在性与 unsupported 结果测试。

[P1][继承自 PR #176 的早期提交,非 PR #181 本次增量] 保持冻结 Host Port 的“方法始终存在”合同。把 `importLocalImages`(以及下方 `archiveFailedGeneration`)声明成可选后,共享 UI 开始靠方法是否缺失分支能力,和合同规定的“能力不可用时返回结构化 `unsupported-capability`”冲突,也会让不同 adapter 静默漂移。请把两个方法都改为必选,由不支持的宿主返回 `unsupportedImageCanvasCapability(...)`,并增加对所有 Host adapter 的方法存在性与 unsupported 结果测试。
suzmii marked this conversation as resolved
kdletters reviewed 2026-08-23 19:58:36 +08:00
kdletters left a comment
Member

更正 review 247 的归属说明:原正文中的“5 个由 PR 176 带入”只统计了 P1,且行内没有逐条标识;准确归属如下。

继承自 PR 176 的早期提交、并非 PR 181 本次栏目分页 / Dock 增量(共 6 条):

  • #2320AssetCanvasSurface.tsx:2363:失败后遗留 running 公开记录(P1)
  • #2323AssetCanvasSurface.tsx:2492:全量 hydrate 覆盖生成期间并发编辑(P1)
  • #2321generation.rs:3364CandidateReady 早于候选事实落盘(P1)
  • #2322generation.rs:3499Archived 早于公开 generation 删除(P1)
  • #2324ports.ts:203:冻结 Host Port 方法被改成可选(P1)
  • #2325AssetCanvasSurface.tsx:2709:快速编辑卡未做 viewport 四边钳制(P2)

PR 181 本次栏目分页 / Dock 增量自身的问题是 #2315、#2316、#2317、#2318、#2319;权威文档合同问题是 #2326、#2327。

这里的“继承自 PR 176”描述的是 PR 181 所包含的早期提交来源;PR 176 当前 head 已继续推进,不能据此断言上述问题仍全部存在于 PR 176 当前 head。

更正 review `247` 的归属说明:原正文中的“5 个由 PR 176 带入”只统计了 P1,且行内没有逐条标识;准确归属如下。 继承自 PR 176 的早期提交、并非 PR 181 本次栏目分页 / Dock 增量(共 6 条): - #2320 — `AssetCanvasSurface.tsx:2363`:失败后遗留 running 公开记录(P1) - #2323 — `AssetCanvasSurface.tsx:2492`:全量 hydrate 覆盖生成期间并发编辑(P1) - #2321 — `generation.rs:3364`:`CandidateReady` 早于候选事实落盘(P1) - #2322 — `generation.rs:3499`:`Archived` 早于公开 generation 删除(P1) - #2324 — `ports.ts:203`:冻结 Host Port 方法被改成可选(P1) - #2325 — `AssetCanvasSurface.tsx:2709`:快速编辑卡未做 viewport 四边钳制(P2) PR 181 本次栏目分页 / Dock 增量自身的问题是 #2315、#2316、#2317、#2318、#2319;权威文档合同问题是 #2326、#2327。 这里的“继承自 PR 176”描述的是 PR 181 所包含的早期提交来源;PR 176 当前 head 已继续推进,不能据此断言上述问题仍全部存在于 PR 176 当前 head。
suzmii marked the pull request as work in progress 2026-08-23 20:26:37 +08:00
suzmii added 1 commit 2026-08-23 20:47:31 +08:00
修复资源分页与图片生成事务
Project CI / Repository checks (pull_request) Failing after 3m4s
Project CI / Frontend tests (pull_request) Successful in 5m15s
Project CI / Backend tests (pull_request) Successful in 5m19s
Project CI / Native shell tests (pull_request) Successful in 15m46s
c01dc006f9
修复资源画布滚轮、拖拽取消、负坐标与快速编辑卡边界

修复生成占位、候选持久化、归档恢复与并发保存顺序

收紧 Host Port 合同并补齐回归测试

统一栏目合同并更新权威文档与项目记忆
suzmii changed title from WIP: 优化 Game Agent 资源管理页面UI to 完善 Game Agent 资源画布与图片精修生成事务 2026-08-23 20:52:09 +08:00
suzmii marked the pull request as work in progress 2026-08-23 21:03:43 +08:00
suzmii added 1 commit 2026-08-24 10:52:13 +08:00
完善素材创作画布候选确认与资源画布
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
60b1e52d74
新增候选图层独立幂等确认命令与前端 FIFO 屏障

补齐生成候选恢复、JPEG EXIF 尺寸和资源依赖线视口处理

调整资源画布布局同步并更新定向测试、技术文档与排障记忆
suzmii added 1 commit 2026-08-24 11:04:25 +08:00
合并主分支最新改动
Project CI / Repository checks (pull_request) Failing after 1m30s
Project CI / Native shell tests (pull_request) Failing after 3m21s
Project CI / Frontend tests (pull_request) Failing after 2m53s
Project CI / Backend tests (pull_request) Successful in 4m16s
f231a7e8ef
同步运行视窗内容自适应、资源生成入口与动画编辑能力

融合素材画布精修事务、资源分页布局和依赖视口合同

保留双方测试、技术文档与项目长期决策记录
suzmii added 4 commits 2026-08-24 16:46:47 +08:00
切换资源布局时复用现有预览与尺寸状态
精修提交后仅失效对应素材的卡片预览
避免资源编辑状态下显示运行不可用提示
补充资源预览与项目工作台回归测试
合并主分支 External Editor 账号绑定与幂等接口实现
保留项目资源预览刷新与运行提示修复
适配素材画布生成器到新的 External Editor 调用契约
合并并保留双方项目决策记录
合并主分支并重放资源栏目改动
Project CI / Repository checks (pull_request) Successful in 4m15s
Project CI / Frontend tests (pull_request) Successful in 4m47s
Project CI / Backend tests (pull_request) Successful in 5m49s
Project CI / Native shell tests (pull_request) Successful in 12m8s
f9bca1f9ad
合入已审查修复的 Game Agent 资源画板主线基线

保留资源栏目分页、悬浮导航与无限坐标交互

保留项目资源预览刷新与生成入口回归覆盖
suzmii marked the pull request as ready for review 2026-08-24 17:17:57 +08:00
kdletters requested changes 2026-08-24 17:33:42 +08:00
Dismissed
kdletters left a comment
Member

当前 head f9bca1f9adc74d60a8cea235b633a3485e29df72(base 15a524e6e0026c1ae0f5a82e90781e3d49fa3f8b)复核结论:REQUEST_CHANGES。

证据:

  • 当前三点 diff 为 25 个提交、31 个文件,git diff --check 通过;git merge-tree --write-tree 无冲突。
  • 当前 head 的 CI run 1285 四个必需 context 全部 success;Repository checks 为 AppSurface 409/409,Frontend tests 为 3163/3163,Backend / Native shell 也通过。
  • Gitea 当前 mergeable=true,但 master 保护要求至少 1 个 approval;review 247/248 都是旧 head c97130f0934 的 stale review,当前 head 没有 approval。

当前 head 的阻断项:

  1. [P1] 候选确认操作没有接上线。generation.rs:1575-1614 的普通 update 现在只保护尚未确认的 CandidateReady 图层,真正解除保护需要 acknowledge_candidate_layers_atgeneration.rs:1617)。但 AssetCanvasSurface.tsx:2758-2761 生成成功后仍只调用 persistDraft(),仓库里没有任何 acknowledgeCandidateLayers 调用;新建的 Tauri adapter 方法只是 dead code。结果是用户删除候选后,下一次普通保存会被后端把候选重新加回,候选无法按合同被删除。请把独立确认接入保存 FIFO,并让设为最终图、导入、生成、归档、放弃等 revision-sensitive 操作等待确认屏障;补 generate -> delete candidate -> save 不复活的集成回归。

  2. [P1] 新增的 ImageCanvasProjectPort.acknowledgeCandidateLayerspackages/image-canvas-core/src/ports.ts:202-205 仍是 optional,而 Tauri adapter 又在 tauriImageCanvasHostAdapter.ts:157-158 强制 Required;这与本 PR 新增的 docs/project-memory/shared-memory/pitfalls.md 候选确认“独立幂等宿主操作 / 所有宿主方法始终存在”合同不一致。应统一为必选方法(不支持宿主返回结构化 unsupported),并覆盖 adapter 与 Surface 调用。

  3. [P1] 权威文档仍自相矛盾:PRD :260 说当前界面不会因指针操作新增 manuallyPlaced=true,但同文件 :315-316 又规定拖动释放提交 manuallyPlaced=true;PRD :56/GameAgent 方案 :88-90 已切换到非空分页无限画布,但 PRD :321:529-536 仍要求分区高度、内部滚动、内容倍率和旧验收。请选择唯一合同并同步代码、测试、PRD、技术方案与 project-memory。

继承项(本轮明确不重复请求):

  • PR176 已在 master 15a524e6e 合并;review 247 的 #2320/#2321/#2322/#2323/#2324/#2325 明确标注为“继承自 PR176”,当前 head 已包含对应修复,未再作为当前 blocker。
  • PR181 自身旧 #2315/#2316/#2317/#2318/#2319/#2326/#2327 也已在后续 head 修复,当前没有按旧 head 重报。

PR 正文仍需刷新:正文的 19 commits / 45 files、499/499(AppSurface 390/390)和“已处理 review #247”均不是当前 head 的事实;请改成当前 25 commits / 31 files、run 1285 的验证结果,并保留上述 PR176 继承 provenance。

当前 head `f9bca1f9adc74d60a8cea235b633a3485e29df72`(base `15a524e6e0026c1ae0f5a82e90781e3d49fa3f8b`)复核结论:REQUEST_CHANGES。 证据: - 当前三点 diff 为 25 个提交、31 个文件,`git diff --check` 通过;`git merge-tree --write-tree` 无冲突。 - 当前 head 的 CI run 1285 四个必需 context 全部 success;Repository checks 为 AppSurface 409/409,Frontend tests 为 3163/3163,Backend / Native shell 也通过。 - Gitea 当前 `mergeable=true`,但 master 保护要求至少 1 个 approval;review 247/248 都是旧 head `c97130f0934` 的 stale review,当前 head 没有 approval。 当前 head 的阻断项: 1. [P1] 候选确认操作没有接上线。`generation.rs:1575-1614` 的普通 update 现在只保护尚未确认的 CandidateReady 图层,真正解除保护需要 `acknowledge_candidate_layers_at`(`generation.rs:1617`)。但 `AssetCanvasSurface.tsx:2758-2761` 生成成功后仍只调用 `persistDraft()`,仓库里没有任何 `acknowledgeCandidateLayers` 调用;新建的 Tauri adapter 方法只是 dead code。结果是用户删除候选后,下一次普通保存会被后端把候选重新加回,候选无法按合同被删除。请把独立确认接入保存 FIFO,并让设为最终图、导入、生成、归档、放弃等 revision-sensitive 操作等待确认屏障;补 generate -> delete candidate -> save 不复活的集成回归。 2. [P1] 新增的 `ImageCanvasProjectPort.acknowledgeCandidateLayers` 在 `packages/image-canvas-core/src/ports.ts:202-205` 仍是 optional,而 Tauri adapter 又在 `tauriImageCanvasHostAdapter.ts:157-158` 强制 Required;这与本 PR 新增的 `docs/project-memory/shared-memory/pitfalls.md` 候选确认“独立幂等宿主操作 / 所有宿主方法始终存在”合同不一致。应统一为必选方法(不支持宿主返回结构化 unsupported),并覆盖 adapter 与 Surface 调用。 3. [P1] 权威文档仍自相矛盾:PRD `:260` 说当前界面不会因指针操作新增 `manuallyPlaced=true`,但同文件 `:315-316` 又规定拖动释放提交 `manuallyPlaced=true`;PRD `:56`/GameAgent 方案 `:88-90` 已切换到非空分页无限画布,但 PRD `:321`、`:529-536` 仍要求分区高度、内部滚动、内容倍率和旧验收。请选择唯一合同并同步代码、测试、PRD、技术方案与 project-memory。 继承项(本轮明确不重复请求): - PR176 已在 master `15a524e6e` 合并;review 247 的 #2320/#2321/#2322/#2323/#2324/#2325 明确标注为“继承自 PR176”,当前 head 已包含对应修复,未再作为当前 blocker。 - PR181 自身旧 #2315/#2316/#2317/#2318/#2319/#2326/#2327 也已在后续 head 修复,当前没有按旧 head 重报。 PR 正文仍需刷新:正文的 19 commits / 45 files、499/499(AppSurface 390/390)和“已处理 review #247”均不是当前 head 的事实;请改成当前 25 commits / 31 files、run 1285 的验证结果,并保留上述 PR176 继承 provenance。
suzmii marked the pull request as work in progress 2026-08-24 17:34:56 +08:00
suzmii added 1 commit 2026-08-24 19:35:30 +08:00
修复资源画布视口与生成恢复
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / Frontend tests (pull_request) Successful in 3m30s
Project CI / Native shell tests (pull_request) Successful in 12m52s
a5cdd7f936
统一资源详情操作样式并恢复空态页面滚动

按排序模式和栏目记忆视口并改进复位适配算法

完善候选确认屏障与连续提交恢复对账

补充前后端回归测试并同步产品和技术文档
suzmii added 1 commit 2026-08-24 19:50:49 +08:00
合并主分支并修复资源画布合同
Project CI / Repository checks (pull_request) Successful in 4m21s
Project CI / Frontend tests (pull_request) Successful in 4m57s
Project CI / Backend tests (pull_request) Successful in 6m13s
Project CI / Native shell tests (pull_request) Successful in 14m31s
5456a1d868
合并 origin/master 的资源画布入口收敛改动

统一手动布局与分页画布文档合同

保留栏目画布与候选生成事务回归
suzmii marked the pull request as ready for review 2026-08-24 19:57:26 +08:00
kdletters requested changes 2026-08-24 20:12:12 +08:00
kdletters left a comment
Member

当前 head 5456a1d86812c1679453c9ac5beaf4ed594c03e9(base b00a3f80576949567bf332f0c6c92b4ed0a649d)复核结论:REQUEST_CHANGES。本轮不重复旧 head 的代码问题,只保留当前 head 仍真实存在的合同与追踪问题。

证据:

  • 当前三点 diff 为 27 个提交、33 个文件,git diff --check 通过,git merge-tree --write-tree 无冲突(b4145673e367b97dda2f312c94f04ca5c8c19efd)。
  • 当前 head 的 CI run 1289 四个必需 context 全部 success:Repository checks、Frontend tests、Backend tests、Native shell tests。
  • Gitea 当前 mergeable=true,但 master 保护要求至少 1 个当前 head approval;review #247/#248/#252 均为旧 head 的 stale review,当前没有 approval。

当前仍需处理:

  1. [P2] PRD 仍残留已退役入口的旧合同。当前 head 的 docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md:55 仍写“打开详情不得卸载新增资源 / 按依赖 / 按类型”,但本 head 的技术方案 docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md:101 和 2026-08-24 decision-log 已明确顶部移除“新增资源”手动入口;当前 PRD 的分页无限画布验收也只保留按依赖、按类型、复位等画布级动作。请把该处改成当前仍存在的动作,或明确标注为历史合同,避免后续按权威 PRD 把已删除入口重新接回。

  2. [P2] docs/project-memory/shared-memory/pitfalls.md:4830-4833 仍要求所有 viewport 经过资源 extent 的隐藏边界函数,并在 extent 变化时重新约束;当前 head 的技术方案 :90-91 明确栏目 viewport 可沿 x/y 任意方向平移、不以资源 extent 作为导航边界,PRD :320-321 也采用同一无限画布合同。请在原坑条目上明确 superseded / 替换为当前语义,而不是只在 decision-log 追加新结论,否则后续 Agent 仍会按旧坑实现回归。

  3. [P2] PR 正文已过期:正文仍写 19 commits / 45 files、前端 499/499(AppSurface 390/390)以及“已处理 review #247”;当前事实是 27 commits / 33 files,run 1289 四项全绿,且 #247/#248/#252 都已因 head 更新变 stale。请刷新验证数字、当前 head/base、CI run 和评审 provenance。

已确认闭环、这次不重复请求:

  • 候选确认已接入 Surface 保存 FIFO 与重启 hydrate,Tauri Host Port / Rust command 已必选且有回归覆盖。
  • 顶部“生成视频 / 生成音效 / 生成背景音乐 / 新增 UI 设计”入口已移除,Agent 生成、已有资源编辑、图片生成动画和精修修改入口仍保留。
  • PR176 已合入 master;早期 review #2320/#2321/#2322/#2323/#2324/#2325 属于继承项且当前对应修复已在 base/head 生效,不作为本轮 blocker。
  • PR181 自身旧 #2315/#2316/#2317/#2318/#2319/#2326/#2327 也不按旧 head 重报。
当前 head `5456a1d86812c1679453c9ac5beaf4ed594c03e9`(base `b00a3f80576949567bf332f0c6c92b4ed0a649d`)复核结论:REQUEST_CHANGES。本轮不重复旧 head 的代码问题,只保留当前 head 仍真实存在的合同与追踪问题。 证据: - 当前三点 diff 为 27 个提交、33 个文件,`git diff --check` 通过,`git merge-tree --write-tree` 无冲突(`b4145673e367b97dda2f312c94f04ca5c8c19efd`)。 - 当前 head 的 CI run 1289 四个必需 context 全部 success:Repository checks、Frontend tests、Backend tests、Native shell tests。 - Gitea 当前 `mergeable=true`,但 master 保护要求至少 1 个当前 head approval;review #247/#248/#252 均为旧 head 的 stale review,当前没有 approval。 当前仍需处理: 1. [P2] PRD 仍残留已退役入口的旧合同。当前 head 的 `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md:55` 仍写“打开详情不得卸载新增资源 / 按依赖 / 按类型”,但本 head 的技术方案 `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md:101` 和 2026-08-24 decision-log 已明确顶部移除“新增资源”手动入口;当前 PRD 的分页无限画布验收也只保留按依赖、按类型、复位等画布级动作。请把该处改成当前仍存在的动作,或明确标注为历史合同,避免后续按权威 PRD 把已删除入口重新接回。 2. [P2] `docs/project-memory/shared-memory/pitfalls.md:4830-4833` 仍要求所有 viewport 经过资源 extent 的隐藏边界函数,并在 extent 变化时重新约束;当前 head 的技术方案 `:90-91` 明确栏目 viewport 可沿 x/y 任意方向平移、不以资源 extent 作为导航边界,PRD `:320-321` 也采用同一无限画布合同。请在原坑条目上明确 superseded / 替换为当前语义,而不是只在 decision-log 追加新结论,否则后续 Agent 仍会按旧坑实现回归。 3. [P2] PR 正文已过期:正文仍写 19 commits / 45 files、前端 499/499(AppSurface 390/390)以及“已处理 review #247”;当前事实是 27 commits / 33 files,run 1289 四项全绿,且 #247/#248/#252 都已因 head 更新变 stale。请刷新验证数字、当前 head/base、CI run 和评审 provenance。 已确认闭环、这次不重复请求: - 候选确认已接入 Surface 保存 FIFO 与重启 hydrate,Tauri Host Port / Rust command 已必选且有回归覆盖。 - 顶部“生成视频 / 生成音效 / 生成背景音乐 / 新增 UI 设计”入口已移除,Agent 生成、已有资源编辑、图片生成动画和精修修改入口仍保留。 - PR176 已合入 master;早期 review #2320/#2321/#2322/#2323/#2324/#2325 属于继承项且当前对应修复已在 base/head 生效,不作为本轮 blocker。 - PR181 自身旧 #2315/#2316/#2317/#2318/#2319/#2326/#2327 也不按旧 head 重报。
kdletters added 1 commit 2026-08-24 20:21:19 +08:00
同步资源画布当前文档合同
Project CI / Repository checks (pull_request) Successful in 3m46s
Project CI / Frontend tests (pull_request) Successful in 4m34s
Project CI / Backend tests (pull_request) Successful in 5m16s
Project CI / Native shell tests (pull_request) Successful in 14m59s
5795d2f9b8
修正 PRD 详情态保留的现役画布动作

更新自由画板 viewport 与资源 extent 的无限画布语义
kdletters merged commit 532c6d51fd into master 2026-08-24 20:42:58 +08:00
kdletters deleted branch codex/game-agent-resource-section-pages 2026-08-24 20:42:58 +08:00
k88936 reviewed 2026-08-31 13:05:37 +08:00
@@ -56,2 +55,2 @@
2. 阶段二“分区独立缩放”(已完成)只适用于 `type` 模式,同时包含互不替代的分区可视高度和内容倍率。文档、项目版本、美术资源、音乐音效资源的标题栏分别保留高度减小 / 恢复 / 增大,并新增 `50%..200%` 内容缩放减小 / 百分比复位 / 增大;触摸板捏合、`Ctrl/Cmd + wheel` 与按钮使用同一倍率模型,普通双指滚动仍只滚动。高度与倍率都以 `projectId + type + category` 隔离并只保留在当前会话内存;倍率以分区 viewport 中的手势中心为锚点,逻辑 `x / y` 和媒体比例不变;非图片资源维持 `180×128`,美术图片按真实比例和统一边界计算本体矩形。最小高度固定容纳标题操作与至少一排卡片,最大高度以中央资源画布当前可用高度为上限。分区保持正常文档流,后续分区由外层资源画布滚动访问,单区内容在缩放后仍只在该区内部滚动。两类表现态都不修改 manifest、`game-creator-resource-layout.v1`、布局 CAS 或资源身份,不重建媒体控件、不抢走焦点,也不恢复卡片拖动。`dependency` 模式使用统一世界自由画板,不展示这些分区滚动与缩放操作
3. 阶段三“依赖布局聚类”(已完成):仅在 `dependency` 模式中,按固定资源分类对当前 Rust 只读图返回的同类型精确引用边和同类型聚合任务流做弱连通分组;任务流以流节点连接其成员,绝不展开成资源笛卡尔积,但只作为布局邻近提示,不绘制虚线、不进入画布关系说明。`dependencyDepth` 是唯一横向层级权威;每个相关簇先按“最小深度 -> 最小稳定资源 ID”排序,再在同层进行固定两轮由左至右、由右至左的中位数扫描,平局回退稳定资源 ID;同 SCC/环成员保持连续,环后资源继续按 Rust 深度推进。孤立资源是稳定单例组,紧凑排在相关簇之后,簇之间保持固定留白。跨分类精确引用不参与前端布局邻接,但会在统一世界 SVG 中显示并进入同源的无障碍关系说明;搜索只隐藏卡片及任一端点被隐藏的橙色精确引用边,不重算组或压缩坐标。历史 `manuallyPlaced=true` 坐标继续原样保留并参与自动坐标避让。聚类是可派生表现,不新增 manifest 字段、sidecar schema、SpacetimeDB 表或第二套依赖真相
1. 阶段一“资源卡本体化”:`dependency / type` 两种布局共用同一个资源卡组件和预览调度器。图片与安全 SVG 直接显示主体并保留透明棋盘底;图片卡按真实纵横比在统一边界计算展示矩形,视频、音频、文档和项目版本继续使用稳定固定卡片。资源详情是叠加在原画板上的非模态独立卡片,以元数据、Rust 权威依赖关系和版本信息为主;打开详情不得卸载“按依赖 / 按类型 / 复位”等现役画布级动作、资源卡、依赖连线或重置 viewport、搜索和排序模式
2. 阶段二“分区独立缩放”是历史实现;2026-08-22 起仅在项目完全没有任何资源投影时保留“按类型式分区展览”作为空态。任一栏目出现资源后,`dependency / type` 两种模式均切换为栏目分页画布,默认停留在固定栏目顺序中的第一个非空栏目;大纲展示全部栏目,空栏目计数为 0 且可打开空画布,不再提供分区高度、分区滚动和分区倍率操作
Member

1

1
Sign in to join this conversation.