{ "environment": "test", "trigger": { "entry": "/ai/canvas/:projectId", "file": "stage-20m.obj", "sourceUnit": "m", "lightweight": true, "quality": "performance", "storage": "local presigned upload with optional headers omitted" }, "before": { "sourceUploadHTTP": 201, "headersPresent": false, "putAttempted": false, "completeAttempted": false, "exception": "TypeError: Cannot convert undefined or null to object", "uiMessage": "模型未能加载,当前场景保持不变。请检查文件后重试。", "screenshot": "import-failed.png" }, "cause": { "frontend": "Object.entries(upload.headers)", "api": "ModelConversionService.prepareSource returned optional storage headers without normalizing its required browser response field", "storageContract": "OssService.getPreSignedUrlS3 headers is optional; local storage intentionally omits it" }, "fix": { "backendSource": "be56a7e0ec79d1a1e7420d870709014ed4bf010a", "apiVersion": "3.23.0.20261003.1", "change": "Return upload.headers ?? {} in model-conversion source-upload API; leave supplied signature headers unchanged", "scope": "Model conversion upload plan only; generic storage behavior unchanged" }, "regression": { "before": { "tests": 2, "failed": 1, "passed": 1, "seconds": 0.579, "failure": "browserPlan.upload.headers expected {} but received undefined" }, "after": { "modelConversionTests": 13, "modelConversionSeconds": 0.84, "nxElapsedSeconds": 2.38, "storageTests": 27, "storageSeconds": 0.638, "storageNxElapsedSeconds": 1.87 }, "sharedBuildSeconds": 0.66, "apiNxBuildSeconds": 20.83 } }