89914b2255
对账用 Promise.all 同时等项目快照与 refreshAssetLibrary,而 loadEditorAssetLibrary 没有 timeoutMs。catch 也接不住永不 settle:await 不返回则 finally 永远不执行, 占位归属登记与源图层锁都释放不掉,而到期清理又豁免已登记的占位,页面永久停在 generating。这个洞是上一条留下的——给 loadEditorProject 加界时只覆盖了同一个 Promise.all 里两个 await 中的一个。 改为给整段对账设 75 秒上界,往里加新的 await 自动受约束。超时解析为 null 而不 拒绝:这段在 catch 内,抛出会穿出 async 函数变成未处理 rejection;null 则落进 既有的「快照读取失败」分支。 前置预算原先只是 Promise.race,超时后上传继续跑到 confirm 并注册对象。把同一个 AbortSignal 贯穿凭证、直传与 confirm 三步,由预算到期时 abort——只停其中一步会 留下半成品。未做重试等待与 flush 的贯穿:收益是少产生不可见的存储孤儿,而 flush 已有 60 秒上界。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>