{"record":{"id":"25ddedf258b35eab","repo":"koala73/worldmonitor","slug":"recoverfrompartialfailure-manual-finished-missin","errorCode":null,"errorMessage":"[recoverFromPartialFailure:manual-finished] missing required field(s): ${missing.join(\", \")}. Operator must supply (or rely on persisted pending* state from a prior runner). Persisted state: pendingBroadcastId=${row.pendingBroadcastId ?? \"-\"}, pendingSegmentId=${row.pendingSegmentId ?? \"-\"}, pendingAssigned=${row.pendingAssigned ?? \"-\"}, pendingWaveLabel=${row.pendingWaveLabel ?? \"-\"}.","messagePattern":"\\[recoverFromPartialFailure:manual-finished\\] missing required field\\(s\\): (.+?)\\. Operator must supply \\(or rely on persisted pending\\* state from a prior runner\\)\\. Persisted state: pendingBroadcastId=(.+?), pendingSegmentId=(.+?), pendingAssigned=(.+?), pendingWaveLabel=(.+?)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"convex/broadcast/rampRunner.ts","lineNumber":414,"sourceCode":"      const assigned = args.assigned ?? row.pendingAssigned;\n      const nextTier = row.currentTier + 1;\n      if (nextTier >= row.rampCurve.length) {\n        throw new Error(\n          `[recoverFromPartialFailure:manual-finished] currentTier=${row.currentTier} would advance past rampCurve.length=${row.rampCurve.length}. Curve is complete; nothing to recover.`,\n        );\n      }\n      const waveLabel =\n        args.waveLabel ??\n        row.pendingWaveLabel ??\n        `${row.waveLabelPrefix}-${nextTier + row.waveLabelOffset}`;\n\n      const missing: string[] = [];\n      if (!broadcastId) missing.push(\"broadcastId\");\n      if (!segmentId) missing.push(\"segmentId\");\n      if (assigned === undefined) missing.push(\"assigned\");\n      if (args.sentAt === undefined) missing.push(\"sentAt\");\n      if (missing.length > 0) {\n        throw new Error(\n          `[recoverFromPartialFailure:manual-finished] missing required field(s): ${missing.join(\", \")}. ` +\n            `Operator must supply (or rely on persisted pending* state from a prior runner). Persisted state: ` +\n            `pendingBroadcastId=${row.pendingBroadcastId ?? \"-\"}, pendingSegmentId=${row.pendingSegmentId ?? \"-\"}, ` +\n            `pendingAssigned=${row.pendingAssigned ?? \"-\"}, pendingWaveLabel=${row.pendingWaveLabel ?? \"-\"}.`,\n        );\n      }\n\n      await ctx.db.patch(row._id, {\n        currentTier: nextTier,\n        lastWaveLabel: waveLabel,\n        lastWaveBroadcastId: broadcastId,\n        lastWaveSegmentId: segmentId,\n        lastWaveAssigned: assigned,\n        lastWaveSentAt: args.sentAt,\n        lastRunStatus: `succeeded-via-manual-recovery: ${args.reason.slice(0, 200)}`,\n        lastRunAt: Date.now(),\n        lastRunError: undefined,\n        ...clearPending,","sourceCodeStart":396,"sourceCodeEnd":432,"githubUrl":"https://github.com/koala73/worldmonitor/blob/7d06c8633d256c18e38133030bc3613976a96ec9/convex/broadcast/rampRunner.ts#L396-L432","documentation":"Error \"[recoverFromPartialFailure:manual-finished] missing required field(s): ${missing.join(\", \")}. Operator must supply (or rely on persisted pending* state from a prior runner). Persisted state: pendingBroadcastId=${row.pendingBroadcastId ?? \"-\"}, pendingSegmentId=${row.pendingSegmentId ?? \"-\"}, pendingAssigned=${row.pendingAssigned ?? \"-\"}, pendingWaveLabel=${row.pendingWaveLabel ?? \"-\"}.\" thrown in koala73/worldmonitor.","triggerScenarios":"Thrown at convex/broadcast/rampRunner.ts:414 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Supply the missing fields explicitly (broadcastId, segmentId, assigned, waveLabel, sentAt) in the recoverFromPartialFailure call","If a prior runner persisted pending* markers, re-run recovery against that state instead of cleared state","Pull the missing values from the Resend dashboard / segment export records for the wave in question"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"7d06c8633d256c18e38133030bc3613976a96ec9","analyzedAt":"2026-08-21T16:51:25.751Z","contentChangedAt":"2026-08-21T16:51:25.751Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}