现象
生成任务跑到 completed、产物齐全,但角色的资产树里什么都没有 。
2026-08-05 在一台已部署的实例上实测(真实后端 + 真实对象存储):
POST /generation/action(action_type: walk, num_frames: 16)
轮询到 status: completed,result.frames 有 16 帧 ,index 0–15 连续,每帧 image_url 均可公网访问、duration_ms: 125
紧接着 GET /characters/{id} → character_data.outfits[0].actions 长度为 0
也就是说:产物只活在 task.result 里,没有进入角色资产树。
为什么值得单独提
前端的 quick-start 流程里第 5 步是「保存」,由前端在任务完成后自己写回 character_data。所以走完整前端流程时看起来是正常的——只有绕过前端直接调 API 才暴露 。
这带来两个后果:
契约上"生成完成"与"成为资产"是两件事 ,但接口层没有任何地方写明这一点。任何第三方(另一个前端、脚本、将来的 Agent / MCP 调用方)按"任务完成即资产入库"的直觉来用,都会拿到一个空资产树,且不报错。
与产品主张有张力。项目策划案(Windup 产品策划案:面向国产小游戏的 2D 角色素材生成资产工作台 #37 )反复强调「交付的是资产,而不是图片」,而当前实现里,让产物成为资产 的那一步落在前端,后端只负责产出。前端崩了、网络断了、用户关掉页面,产物就停在 task.result 里,角色资产树永远缺这个动作。
需要确认的是设计意图
不预设这是 bug——有可能是有意为之(例如"生成结果需用户确认后才入库",配合产物审核与节点回退)。若是,建议:
在生成接口的响应或文档里明写 "产物不自动入库,需调用方确认后写入";
并给出确认入库的接口 ,而不是让每个调用方自己拼 character_data 整树再 PATCH 回去(现在前端就是这么做的,整树替换在并发下会互相覆盖)。
若不是有意为之,那么在任务转 completed 时由后端写入 character_data 更符合"交付资产"的定位,也能顺带解决并发覆盖。
顺带的一处观察
同一轮实测里,POST /characters 携带 name 字段返回 200 但落库为 null(需要再 PATCH 一次才写得进去)。这条已在 #75 的评审里单独报过,不在本 Issue 展开。
现象
生成任务跑到
completed、产物齐全,但角色的资产树里什么都没有。2026-08-05 在一台已部署的实例上实测(真实后端 + 真实对象存储):
POST /generation/action(action_type: walk,num_frames: 16)status: completed,result.frames有 16 帧,index0–15 连续,每帧image_url均可公网访问、duration_ms: 125GET /characters/{id}→character_data.outfits[0].actions长度为 0也就是说:产物只活在
task.result里,没有进入角色资产树。为什么值得单独提
前端的 quick-start 流程里第 5 步是「保存」,由前端在任务完成后自己写回
character_data。所以走完整前端流程时看起来是正常的——只有绕过前端直接调 API 才暴露。这带来两个后果:
task.result里,角色资产树永远缺这个动作。需要确认的是设计意图
不预设这是 bug——有可能是有意为之(例如"生成结果需用户确认后才入库",配合产物审核与节点回退)。若是,建议:
character_data整树再PATCH回去(现在前端就是这么做的,整树替换在并发下会互相覆盖)。若不是有意为之,那么在任务转
completed时由后端写入character_data更符合"交付资产"的定位,也能顺带解决并发覆盖。顺带的一处观察
同一轮实测里,
POST /characters携带name字段返回 200 但落库为null(需要再PATCH一次才写得进去)。这条已在 #75 的评审里单独报过,不在本 Issue 展开。