Fix/动作 前端展示下载+后端数据结构+精选 的问题 #117

Merged
kdletters merged 50 commits from fix/action-drag-to-canva-and-download into master 2026-08-06 16:57:38 +08:00
Member

原问题

历史角色动作是一个兼容例外:
后端允许它没有 editor_project_resource 资源行,只要布局自身保存了完整图片序列帧。
  • 把生成动作的原视频asstetkind改为 video, 只把图片序列作为action

  • db asset新增字段image_sequence_frames_json image_seq_duration_ms等, (原来动作的这些数据存在generation-input中,并不合适)
    修改了externaljob,把这部分数据正确填写到数据库中。

  • 为避免到处fallback,做了数据库迁移, 脚本: scripts/spacetime-normalize-editor-character-actions.mjs 手动进行过画布+素材库中动作序列帧+原始视频 迁移的测试

  • 移除preview_video_path字段, reason:

preview video
→ separate resource/asset with assetKind="video"
final transparent action
→ assetKind="character-animation"
→ source_resource_id points to the preview-video resource
→ image_sequence_frames_json contains the actual playable result

So preview_video_path on the final action duplicates the source video resource’s image_src.

  • 移除每个frame的index字段 原因: 这个只用于后端内部处理时有一个并发请求, 每个赋一个index方便收集, 后续没有再用到,且与数组本身重复

  • 清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造

仍存在的共性问题: #134

  • 导出:
    下载改为完整序列帧, 封面不再作为fallback, 部分帧读取失败时行为:仍生成 ZIP,并记录失败帧, 不变

画布放置:
before:
shotmd-1785207959-compressed.webp
after:
shotmd-1785231365-compressed.webp
精选模块: 主页展示, 审核部分UI:
shotmd-1785500046-compressed.webp
shotmd-1785499780-compressed.webp
这两处序列帧们的加载设计为惰式的, 只有hover和单独preview才会全部加载

原问题 ``` 历史角色动作是一个兼容例外: 后端允许它没有 editor_project_resource 资源行,只要布局自身保存了完整图片序列帧。 ``` - 把生成动作的原视频asstetkind改为 video, 只把图片序列作为action - db asset新增字段image_sequence_frames_json image_seq_duration_ms等, (原来动作的这些数据存在generation-input中,并不合适) 修改了externaljob,把这部分数据正确填写到数据库中。 - 为避免到处fallback,做了数据库迁移, 脚本: `scripts/spacetime-normalize-editor-character-actions.mjs` 手动进行过画布+素材库中动作序列帧+原始视频 迁移的测试 - 移除preview_video_path字段, reason: >preview video → separate resource/asset with assetKind="video" final transparent action → assetKind="character-animation" → source_resource_id points to the preview-video resource → image_sequence_frames_json contains the actual playable result > > So preview_video_path on the final action duplicates the source video resource’s image_src. - 移除每个frame的index字段 原因: 这个只用于后端内部处理时有一个并发请求, 每个赋一个index方便收集, 后续没有再用到,且与数组本身重复 - 清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造 仍存在的共性问题: #134 - 导出: 下载改为完整序列帧, 封面不再作为fallback, 部分帧读取失败时行为:仍生成 ZIP,并记录失败帧, 不变 画布放置: before: ![shotmd-1785207959-compressed.webp](/attachments/e56454f0-49a3-4a8a-951f-c21960975f99) after: ![shotmd-1785231365-compressed.webp](/attachments/886f07df-c25b-4ecc-acc9-160e1795a991) 精选模块: 主页展示, 审核部分UI: ![shotmd-1785500046-compressed.webp](/attachments/9ec3b679-0045-494a-9f20-134f7e73fecf) ![shotmd-1785499780-compressed.webp](/attachments/42396e63-5f26-4853-a367-0f3c15111add) 这两处序列帧们的加载设计为惰式的, 只有hover和单独preview才会全部加载
k88936 added this to the 美术画布 project 2026-07-28 16:09:56 +08:00
k88936 self-assigned this 2026-07-29 10:25:25 +08:00
k88936 requested review from kdletters 2026-07-29 10:43:25 +08:00
k88936 marked the pull request as ready for review 2026-07-29 10:49:07 +08:00
k88936 removed review request for kdletters 2026-07-29 15:16:44 +08:00
k88936 marked the pull request as work in progress 2026-07-29 15:16:48 +08:00
k88936 force-pushed fix/action-drag-to-canva-and-download from 7075c3ddb1 to 1b8344540d 2026-07-31 12:06:41 +08:00 Compare
Author
Member

整理历史,补充commit正文

整理历史,补充commit正文
k88936 changed title from WIP: Fix/动作从素材库下载/拖动到画布上 结果是张静止的图片 to WIP: Fix/动作资源 前端展示下载,后端数据结构,精选模块 的问题 2026-07-31 17:00:28 +08:00
k88936 force-pushed fix/action-drag-to-canva-and-download from 1b8344540d to 48b05be1a1 2026-08-03 11:51:51 +08:00 Compare
k88936 force-pushed fix/action-drag-to-canva-and-download from 48b05be1a1 to 104891823e 2026-08-04 10:57:17 +08:00 Compare
k88936 marked the pull request as ready for review 2026-08-05 10:24:07 +08:00
k88936 changed title from Fix/动作资源 前端展示下载,后端数据结构,精选模块 的问题 to Fix/动作资源 前端展示下载+后端数据结构+精选 的问题 2026-08-05 15:43:46 +08:00
k88936 changed title from Fix/动作资源 前端展示下载+后端数据结构+精选 的问题 to Fix/动作 前端展示下载+后端数据结构+精选 的问题 2026-08-05 15:43:58 +08:00
kdletters requested changes 2026-08-05 18:00:33 +08:00
Dismissed
kdletters left a comment
Member

本轮审查结论:请求修改。已将 4 个 PR 引入的 blocker 绑定到对应代码行;修复后请基于新 head 重新请求 review。

另有无法绑定到单一代码行的仓库门禁:当前 PR 历史包含 abdb7492043e1b63 两个英文且空正文的 Merge remote-tracking branch... 提交,不符合 AGENTS.md 的中文标题和逐行正文要求。请清理历史,或确认通过仓库明确允许的 squash 策略交付。

审查基于 head 89c017bb6154fe6078328b6be67c49d1edd6995a。当前 Gitea 显示 4 组 CI 全绿、无冲突且 mergeable=true;这些状态不消除下述数据恢复、外部契约和签名 URL 生命周期问题。

本轮审查结论:请求修改。已将 4 个 PR 引入的 blocker 绑定到对应代码行;修复后请基于新 head 重新请求 review。 另有无法绑定到单一代码行的仓库门禁:当前 PR 历史包含 `abdb7492`、`043e1b63` 两个英文且空正文的 `Merge remote-tracking branch...` 提交,不符合 `AGENTS.md` 的中文标题和逐行正文要求。请清理历史,或确认通过仓库明确允许的 squash 策略交付。 审查基于 head `89c017bb6154fe6078328b6be67c49d1edd6995a`。当前 Gitea 显示 4 组 CI 全绿、无冲突且 `mergeable=true`;这些状态不消除下述数据恢复、外部契约和签名 URL 生命周期问题。
@@ -165,0 +445,4 @@
key: string;
};
type AdminImageSequenceFrameCacheEntry = {
Member

[P2] 这个缓存没有保存签名 URL 的过期时间。下游固定请求 expireSeconds=300,但 entry 只保存 URL 和状态;预览打开超过 5 分钟后仍会复用已过期地址,浏览器重新取帧时会逐帧 403,最终只能依赖用户手动“重试失败帧”。请缓存 expiresAt 并在安全窗口前自动重新换签,或复用已有带过期窗口的读取缓存,并覆盖跨 5 分钟回绕播放测试。

[P2] 这个缓存没有保存签名 URL 的过期时间。下游固定请求 `expireSeconds=300`,但 entry 只保存 URL 和状态;预览打开超过 5 分钟后仍会复用已过期地址,浏览器重新取帧时会逐帧 403,最终只能依赖用户手动“重试失败帧”。请缓存 `expiresAt` 并在安全窗口前自动重新换签,或复用已有带过期窗口的读取缓存,并覆盖跨 5 分钟回绕播放测试。
k88936 marked this conversation as resolved
@@ -2054,0 +2063,4 @@
"assetKind"
]
},
"then": {
Member

[P2] 这里的条件 schema 与运行时不一致。assetKind=character-animation 时,SpacetimeDB 必须同时收到 imageSequenceFramesimageSequenceDurationMs,但该 then 只约束 generationInputs;镜像的 project-resource schema(约 2191 行)也一样。反向情况下,非动作 kind 携带序列字段能通过 OpenAPI,却会被运行时拒绝。请在两个 schema 中补齐 required/forbidden 条件,并增加正反向契约测试,保证代码生成客户端能在提交前构造出真正合法的请求。

[P2] 这里的条件 schema 与运行时不一致。`assetKind=character-animation` 时,SpacetimeDB 必须同时收到 `imageSequenceFrames` 和 `imageSequenceDurationMs`,但该 `then` 只约束 `generationInputs`;镜像的 project-resource schema(约 2191 行)也一样。反向情况下,非动作 kind 携带序列字段能通过 OpenAPI,却会被运行时拒绝。请在两个 schema 中补齐 required/forbidden 条件,并增加正反向契约测试,保证代码生成客户端能在提交前构造出真正合法的请求。
k88936 marked this conversation as resolved
@@ -7031,0 +7152,4 @@
return None;
}
let mut normalized = serde_json::Map::from_iter([
("imageSrc".to_string(), Value::String(image_src.to_string())),
Member

[P2] 正式序列帧不能原样持久化临时签名 URL。当前每帧只要求非空 imageSrcobjectKey/assetObjectId 都可缺省;后续持久化检查也只拒绝 Blob/Data URL,因此两个即将过期的 signed URL 可以成为正式动作真相,过期后无法播放或恢复。请要求每帧具备稳定对象引用,并从稳定引用生成持久路径;显式拒绝仅含临时签名 URL 的帧,同时补 External v1 负向测试。

[P2] 正式序列帧不能原样持久化临时签名 URL。当前每帧只要求非空 `imageSrc`,`objectKey`/`assetObjectId` 都可缺省;后续持久化检查也只拒绝 Blob/Data URL,因此两个即将过期的 signed URL 可以成为正式动作真相,过期后无法播放或恢复。请要求每帧具备稳定对象引用,并从稳定引用生成持久路径;显式拒绝仅含临时签名 URL 的帧,同时补 External v1 负向测试。
k88936 marked this conversation as resolved
@@ -731,1 +753,4 @@
!resource && isSelfContainedLegacyLocalImageSequence(snapshot);
const isFormalCharacterAnimation =
assetKind === 'character-animation' && !isSelfContainedLocalResource;
if (
Member

[P1] 不要让合法的标签操作在重载后静默删除图层。素材标签菜单允许普通图片选择 character-animation,保存时会写入 assetKindOverride;这里随后把 override 当作正式动作,但底层 resource 仍是普通图片,于是直接 return null。复现路径是:普通图层改标为“动作” → 保存 → 刷新,持久层仍有该图层但前端完全不渲染。请限制这种转换,或在恢复时保留图层并给出明确校验反馈,同时补保存/重载回归测试。

[P1] 不要让合法的标签操作在重载后静默删除图层。素材标签菜单允许普通图片选择 `character-animation`,保存时会写入 `assetKindOverride`;这里随后把 override 当作正式动作,但底层 resource 仍是普通图片,于是直接 `return null`。复现路径是:普通图层改标为“动作” → 保存 → 刷新,持久层仍有该图层但前端完全不渲染。请限制这种转换,或在恢复时保留图层并给出明确校验反馈,同时补保存/重载回归测试。
k88936 marked this conversation as resolved
k88936 force-pushed fix/action-drag-to-canva-and-download from 89c017bb61 to 52d4e97a5d 2026-08-06 11:03:22 +08:00 Compare
Author
Member

增加了数据库迁移的一个改动: 清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造

已再次测试迁移
shotmd-1785994707.jpg

增加了数据库迁移的一个改动: 清除副产品preview video的generation_input_json, 因为会影响改造功能, 迁移后预览视频不提供改造(参数), 只有序列帧动作有改造 已再次测试迁移 ![shotmd-1785994707.jpg](/attachments/e51f7f84-d275-4d5c-8c68-8e19fc16edb6)
k88936 force-pushed fix/action-drag-to-canva-and-download from af0a57706e to 564f376b39 2026-08-06 13:55:34 +08:00 Compare
kdletters requested changes 2026-08-06 16:07:43 +08:00
Dismissed
kdletters left a comment
Member

基于当前 master b63923eb 与 head ba682a7a 复审。旧 review 123 的四项代码问题已修复,当前四组 CI 全绿且合并树无冲突;但后台角色动作预览仍有一项刷新失败边界,详见 inline comment。另外,PR 独有历史仍有 5 个空正文提交,另有 7 个正文使用字面量反斜杠 n 代替真实逐行换行,不符合仓库提交规范。请修复刷新失败路径、补回归测试并整理提交历史后请求复审。

基于当前 master b63923eb 与 head ba682a7a 复审。旧 review 123 的四项代码问题已修复,当前四组 CI 全绿且合并树无冲突;但后台角色动作预览仍有一项刷新失败边界,详见 inline comment。另外,PR 独有历史仍有 5 个空正文提交,另有 7 个正文使用字面量反斜杠 n 代替真实逐行换行,不符合仓库提交规范。请修复刷新失败路径、补回归测试并整理提交历史后请求复审。
@@ -165,0 +590,4 @@
status: refreshReadyFrame ? 'refreshing' : 'loading',
}));
})
.catch(() => {
Member

[P2] 刷新失败时不要丢弃仍有效的帧缓存。refreshReadyFrame 为 true 时,这次请求只是提前换签,旧 resolvedUrl 在真实过期前仍可使用;但这里无条件清空 URL 并标记为 failed,播放器随后会永久跳过该帧且不再自动重试,直到管理员手动点击重试。请在提前换签失败时保留当前可用 URL 并安排有界重试;只有不存在可用 URL 或图片解码失败时才标记 failed,同时补充“提前换签失败仍保持已就绪帧可见”的回归测试。

[P2] 刷新失败时不要丢弃仍有效的帧缓存。`refreshReadyFrame` 为 true 时,这次请求只是提前换签,旧 `resolvedUrl` 在真实过期前仍可使用;但这里无条件清空 URL 并标记为 `failed`,播放器随后会永久跳过该帧且不再自动重试,直到管理员手动点击重试。请在提前换签失败时保留当前可用 URL 并安排有界重试;只有不存在可用 URL 或图片解码失败时才标记 `failed`,同时补充“提前换签失败仍保持已就绪帧可见”的回归测试。
k88936 marked this conversation as resolved
k88936 added 50 commits 2026-08-06 16:33:32 +08:00
为项目资源、账号素材和精选快照新增正式图片序列帧与毫秒时长字段。
统一 Rust DTO、SpacetimeDB 表、迁移默认值、typed client mapper 与生成绑定。
数组顺序作为唯一帧序,不持久化 frameIndex、frameCount、fps 或通用媒体时长。
新增 migration operator 专用 asset、project-resource、showcase、canvas 四阶段 procedure。
顶层旧字段仅在动作身份已证明后解释,正式与旧版冲突形成 blocker。
apply 绑定同批 dry-run SHA-256,并在结束后执行零匹配与零 blocker 复核。
新增迁移脚本、SATS 解析测试、生成绑定和生产制品门禁。
角色动作生成只持久化并返回正式 project resource 与 account asset。
删除 API、后台 mapper 对 generationInputs 和布局动作结果的运行时回退。
动作 generationInputs 旧运行字段、screenColorHex 与正式帧 frameIndex 明确拒绝。
动作画布完成项只写资源引用与 placement,普通 layer 响应移除顶层 mediaType。
前端只从正式 resource 或 asset 的图片序列字段恢复、复用、播放和导出角色动作。
动作 layout 只保存资源引用与 placement,不复制帧、时长、生成输入或 mediaType。
项目生成必须绑定正式资源,无项目放置必须绑定正式账号素材,缺失时失败关闭。
补齐素材库拖放、序列 ZIP、画布播放、保存恢复与生成工作流测试。
精选与后台素材查询透传正式序列帧和毫秒时长。
列表仅加载首帧,激活预览后再逐帧换签并按完整时长播放。
创作首页与后台复用各自现有媒体组件,损坏动作不回退普通图片。
补齐精选模型、公开卡片和后台审核预览测试。
外部接口返回正式 resource 与 asset,并以数组顺序表达动作帧。
helper 只调用一次动作生成接口并直接消费正式结果,不再二次创建资源或兼容旧运行字段。
同步 OpenAPI、接口选择说明与 helper 自测。
记录正式图片序列数据契约、placement-only 布局边界和无运行时 fallback 约束。
补充四阶段迁移执行顺序、blocker 处理、批次哈希门禁和发布维护窗口。
同步项目记忆中的长期决策与排障经验。
补充非角色动作 generationInputs 顶层 frames、fps 与 durationSeconds 保持原样的回归测试。
将上传目录切换延后到素材图层构建成功之后。
构建失败时保持原目录并展示错误,补充回归测试。
使用序列总时长除以帧数计算真实播放间隔。
删除四十毫秒下限,保持高帧率动画的实际节奏。
生成端把每帧已确认的 objectKey 与 assetObjectId 写入正式序列载荷。
精选公开授权按稳定对象引用逐帧核验,避免仅首帧可读。
补充后端、SpacetimeDB 回归测试和契约文档。
新增后台序列帧强类型共享载荷,缺失可选引用时保持原 JSON 线格式。

后台素材与精选映射统一输出经过规范化的强类型帧数组。

补充共享契约与后台映射序列化回归测试。
通用 JSON 解析辅助函数改用准确命名并与 active mapper 保持一致。

持久化序列帧时直接消费输入字段,避免深拷贝完整帧数组。
后台和创作主页播放器只挂载当前帧与有界预读帧,避免一次换签全部序列。

浏览器播放间隔限制在定时器安全上限,不恢复已移除的最低帧间隔。

创作主页分别跟踪悬停和焦点,并遵循系统减少动态效果偏好。

后台播放按钮扩展为触控友好的四十四像素点击区域。

补充预读窗口、交互状态和减少动态效果回归测试与项目记忆。
无项目生成返回正式账号素材时沿用素材记录的直接来源资源。

序列帧导出失败提示只按帧源是否存在分类,不把可选时长误报为缺帧。

补充账号素材独立返回时的动作血缘回归测试和角色动作方案说明。
非角色动作图层继续从画布布局恢复音频和视频运行时秒数。

账号素材转图层时保留前端临时媒体时长,不写入角色动作正式字段。

补充音频图层时长恢复回归测试。
后台和创作主页序列播放器识别换签失败与图片解码失败并跳过故障帧。

全部帧失败时停止播放,弹窗显示失败帧数量并允许重新换签加载。

卡片全帧失败时引导打开预览重试,避免嵌套交互按钮。

补充故障帧跳过、手动重试和预读窗口恢复回归测试与项目记忆。
按生成绑定使用 expected_batch_sha_256 SATS 字段调用规范化 procedure。
同步更新 dry-run、apply 哈希绑定和批次顺序测试断言。
保留外部生成异步提交、幂等轮询与托管MCP能力

融合角色动作正式序列帧资源与素材持久化契约

保留内部处理元数据脱敏与图集批量持久化门禁

补齐画布资源权威恢复、测试与Skill文档
迁移按计划态分类排除同任务预览视频并区分零候选与多候选。

历史画布迁移忽略复制的来源链,正式生成继续保持严格血缘校验。

逐帧核验登记对象并补齐对象路径与对象 ID,支持前置 scope 的安全 dry-run。

补充迁移 HTTP 调用、撤权能力、回归测试和长期数据契约。
保留角色动作资源表作为正式序列结果的权威来源

融合图层素材类型覆盖与资源持久化状态

兼容并严格校验历史本地自包含图片序列

补齐前后端回归测试与后端契约文档
合入主分支的游戏创作生成任务、续写来源匹配与运行进度修复。
保留角色动作正式序列字段、后台预览与迁移门禁。
融合画布资源持久化回归测试与文档。
- preview MP4 规划为 video,且 layout 是普通 video:跳过动作清理。
- layout 明确是 image-sequence 却指向 video:继续 blocker。
- 原始动作资源本身规划失败:继续 blocker,不静默跳过。
- 正式图片序列:正常清理 legacy layout 字段。
- apply 仍要求前置 scope 已物理落库。
同步主分支的游戏创作硬截止恢复测试修正。
保留角色动作素材分支的现有实现。
统一 HTTP 对象与 CLI tuple 的批次哈希字段

拒绝迁移 procedure 返回重复分页游标

补充对象返回和循环游标回归测试
在来源解析和预扣泥点前拒绝缺少项目的画布完成请求

补充校验顺序回归测试
在缺少权威素材类型时保留历史音视频媒体类型

拆分图层恢复中的嵌套状态判定

补充旧音视频恢复回归测试
将角色动作提交计划构建纳入失败状态处理

仅在计划校验通过后切换生成中状态

补充损坏动作来源的用户错误回归测试
显式拒绝将图片序列映射为普通图片素材

补充上传媒体类型映射回归测试
保留登录失效处理并显式展示其它保存错误

避免角色动作素材创建成功后校验失败被静默吞掉
删除未被资源读取链消费的 refreshKey

保留现有对象键导出读取行为
删除调用方未消费的 isResolving 状态

减少签名地址解析过程中的无效渲染
允许后台窄屏播放与重试控件换行

补齐主站播放按钮的移动端触控宽度
记录画布完成请求的计费前项目校验

记录迁移返回归一化和循环游标拒绝规则
复用按素材类型校验的生成输入序列化器,提前拒绝角色动作旧运行字段。

同步 External v1 OpenAPI 条件约束、契约测试和外部接入文档。

确认站内 Web、AI Game Creator 与 Python helper 无需调用迁移。
将序列帧 signed URL、解析与加载状态统一上移到预览父组件。

按当前序列限制缓存并在序列、token 或弹窗生命周期结束时清理在途请求。

新增跨三帧窗口延迟换签与回绕复用的回归测试,并同步架构文档。
删除 EditorAsset、CanvasLayer 与画布布局中的通用 durationSeconds 链路。
将上传及生成请求时长统一写入 generationInputs.fields,并由服务端去重补齐。
音频播放只使用 loadedmetadata,素材详情、导出和精选成本读取展示字段。
补充前后端回归测试并同步架构文档与共享决策。
同步主分支的 Runner GUI owner 修复与托管 MCP 开发访问支持。
保留角色动作素材分支的现有实现。
更新画布素材导出测试,缺少展示字段时不再期待时长占位值。
明确素材详情与 ZIP 元数据只透传 generationInputs.fields 中实际存在的时长。
同步后端架构文档与共享决策记录。
缓存序列帧换签响应的过期时间并复用统一安全窗口
临近过期时自动换签并保持已就绪帧可见
补充跨五分钟回绕播放与缓存边界回归测试
同步后台素材预览架构约束修复 migration blocker。
角色动作素材与项目资源创建请求强制提交完整序列字段
非角色动作类型禁止携带图片序列字段
增加两类请求的正反向 OpenAPI 契约测试
正式序列帧强制携带 objectKey 与 assetObjectId,并按 objectKey 重建持久路径

同步收紧 External v1 OpenAPI 并补充签名 URL 负向测试

保留异步生成紧凑结果中的逐帧 assetObjectId 并更新架构文档
后端按图片、动作、视频和音频媒体族校验图层素材类型覆盖。

不兼容覆盖清空并回退资源默认类型,保存请求继续成功。

动作资源回退时清理布局媒体副本并补充结构化画布回归测试。

同步更新后端数据契约中的兼容与降级规则。
前端按媒体族禁用不兼容标签,并在更新入口再次校验。

重载历史非法覆盖时保留图层、回退资源默认类型并显示提示。

只重写命中的布局项并自动保存清理后的覆盖,保留其他历史项。

补充标签矩阵、菜单限制及保存重载回归测试并同步架构决策文档。
清理角色动作预览视频生成输入,并确保正式序列字段仅在最终资源上持久化;新增相关单测并同步更新数据契约和架构文档。
合入 origin/master 的游戏创作、完美像素、资源依赖和工程守卫更新

融合角色动作正式序列字段与完美像素只读预检和原子持久化

保留外部编辑器输入清理、画布占位恢复和素材标签修复契约
合并游戏创作条件任务图路由与恢复逻辑
保留正式角色动作序列契约并融合逐帧稳定引用
移除 frameIndex 缺失式断言并保留正向契约验证
修正后台动作预览测试中的过期签名地址
合并画布素材导出分片读取修复
为完美像素项目资源快照补齐正式序列字段
为完美像素账号素材快照补齐正式序列字段
合入主分支的智能体根任务可观测性、队列恢复与前端状态更新。
保留角色动作正式序列、后台预览换签和画布导出修复。
完成合并树验证并保持现有契约测试。
修复后台动作预览提前换签失败
Project CI / Repository checks (pull_request) Successful in 1m10s
Project CI / Backend tests (pull_request) Successful in 4m10s
Project CI / Native shell tests (pull_request) Successful in 12m47s
Project CI / Frontend tests (pull_request) Successful in 2m37s
f52947d771
提前换签失败时保留真实过期前的已就绪帧并执行有界退避重试
仅在无可用缓存或图片解码失败时标记失败
补充后台角色动作回归测试并同步数据契约文档
k88936 force-pushed fix/action-drag-to-canva-and-download from ba682a7a05 to f52947d771 2026-08-06 16:33:32 +08:00 Compare
kdletters started working 2026-08-06 16:49:24 +08:00
kdletters approved these changes 2026-08-06 16:57:21 +08:00
kdletters merged commit a03f13d0a5 into master 2026-08-06 16:57:38 +08:00
kdletters worked for 8 minutes 2026-08-06 16:57:39 +08:00
kdletters deleted branch fix/action-drag-to-canva-and-download 2026-08-06 16:57:39 +08:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Total Time Spent: 8 minutes
kdletters
8 minutes
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#117