6d6b09b7a0
两处评审都成立,且都源自同一个毛病:修复时选错了作用范围/抽象层级。 一、数组元素的 null 不该跟着放宽 上一版把「无差别删 null」整体改成「只删本次抹掉的内联媒体」,连数组元素一起放宽了。 布局数组是唯一没有元素级 shape 校验的写入口(legacy layout_storage_version=0 是新画布的 默认状态,写侧 serialize_editor_layers 只挡内联媒体、不校验元素形状),读回的 null 元素会让 前端 canvasLayoutItemId / isCanvasSettingsLayoutItem 抛 TypeError,整次项目套用被 Promise catch 吞成静默失败;generationInputs 的 fields / references 里混进 null 元素也会让整份元数据 被 isRecord 判非法丢弃——与本来要修的 SFX 症状同类。现在数组元素照旧过滤 null,放宽严格 限定在对象字段(requestedDurationSeconds 这种有意义的空值)。 二、Task 判据从资源分类换成生成模型 assetKind 是 assetKindOverride ?? resourceAssetKind,用户改一次「素材标签」就翻转;换成 resolveLayerResourceAssetKind 仍不够:legacy 布局快照没有 assetKindOverride 键时,旧的 assetKind 会被水合成 override 而 resourceAssetKind 落成 null,资源行查不到时同样是 null—— 恰恰是元数据缺失最常伴随的形态。判据要回答的是「这个 taskId 由谁生成」,所以落在 model 上: 资源行权威字段,registered 图层的 serializeLayer 不回写,改标签不影响,后端 canonicalize_editor_sound_effect_model 只接受 eleven_text_to_sound_v2 一个取值。 - 新增后端回归:布局数组与 fields 数组里的 null 元素被过滤,对象字段的 null 原样保留 - 新增前端回归:资源类型不可解析(resourceAssetKind 为 null)的音效层仍显示完整 taskId - 既有的「改标签」两向回归保持不变,在新判据下同样成立 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>