{"record":{"id":"25fac08d29d8aa00","repo":"remotion-dev/remotion","slug":"renderer-s3-status-has-invalid-progress-fields","errorCode":null,"errorMessage":"Renderer S3 status has invalid progress fields","messagePattern":"Renderer S3 status has invalid progress fields","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/serverless-client/src/renderer-transport.ts","lineNumber":121,"sourceCode":"\tif (status.schema !== 1) {\n\t\tthrow new Error(\n\t\t\t`Unsupported renderer S3 status schema: ${String(status.schema)}`,\n\t\t);\n\t}\n\n\tif (status.chunk !== expectedChunk || status.attempt !== expectedAttempt) {\n\t\tthrow new Error(\n\t\t\t`Renderer S3 status identifies chunk ${String(status.chunk)}, attempt ${String(status.attempt)}; expected chunk ${expectedChunk}, attempt ${expectedAttempt}`,\n\t\t);\n\t}\n\n\tif (\n\t\ttypeof status.lambdaInvoked !== 'boolean' ||\n\t\t!isNumber(status.renderedFrames) ||\n\t\t!isNumber(status.encodedFrames) ||\n\t\t!isNumber(status.startedAt)\n\t) {\n\t\tthrow new Error('Renderer S3 status has invalid progress fields');\n\t}\n\n\tif (status.state === 'running') {\n\t\treturn status as S3RendererStatus;\n\t}\n\n\tif (status.state === 'completed') {\n\t\tif (\n\t\t\tstatus.lambdaInvoked !== true ||\n\t\t\t!isNumber(status.completedAt) ||\n\t\t\t!(typeof status.videoKey === 'string' || status.videoKey === null) ||\n\t\t\t!(typeof status.audioKey === 'string' || status.audioKey === null) ||\n\t\t\t!Array.isArray(status.artifacts)\n\t\t) {\n\t\t\tthrow new Error('Renderer S3 completed status is invalid');\n\t\t}\n\n\t\tfor (const artifact of status.artifacts) {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/remotion-dev/remotion/blob/10db9de07356446fb0edb3c3ae211369b693d18b/packages/serverless-client/src/renderer-transport.ts#L103-L139","documentation":"The base fields of every renderer status are validated: lambdaInvoked must be a boolean, and renderedFrames, encodedFrames, startedAt must be finite numbers (the isNumber helper rejects NaN, Infinity, and non-numbers). Missing fields (undefined) or numbers serialized as strings fail this check.","triggerScenarios":"A truncated or corrupted status.json upload; a status written by a version-skewed renderer using different field names; NaN leaking into frame counters from a broken renderer build.","commonSituations":"Interrupted multipart uploads of small objects; mixed Remotion versions between renderer and orchestrator; exotic S3-compatible storage corrupting objects under load.","solutions":["Inspect the status.json body - confirm the four fields exist with the correct primitive types.","Delete the render's transport prefix and retry with a fresh renderId.","Align @remotion/* versions and redeploy the renderer functions/image.","If reproducible, capture the body and report it as a Remotion bug."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"# Inspect the field types the parser rejected\naws s3 cp \"s3://$BUCKET/renders/$RENDER_ID/transport/chunks/$CHUNK/attempt-$ATTEMPT/status.json\" - \\\n  | jq '{lambdaInvoked, renderedFrames, encodedFrames, startedAt}'","typeGuard":null,"tryCatchPattern":"try {\n  await renderMediaOnCloudRun({...input, renderId: makeRenderId()});\n} catch (err) {\n  if (err.message.includes('Renderer S3 status has invalid progress fields')) {\n    // corrupt status payload - sweep prefix, retry with fresh renderId\n    await renderMediaOnCloudRun({...input, renderId: makeRenderId()});\n  } else {\n    throw err;\n  }\n}","preventionTips":["Use real S3 or a well-tested S3-compatible provider; exotic storage can corrupt small status objects under load.","Keep renderer and orchestrator versions aligned so the status field set never drifts.","Retry transport-validation failures with a fresh renderId rather than reusing the poisoned prefix."],"tags":["serverless","s3","validation","status-json","transport"],"backgroundTag":"schema-validation-failed","analyzedSha":"10db9de07356446fb0edb3c3ae211369b693d18b","analyzedAt":"2026-08-22T21:45:17.748Z","contentChangedAt":"2026-08-22T21:45:17.748Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}