koala73/worldmonitor · error · Error
[recoverFromPartialFailure:manual-finished] missing…
Error message
[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 ?? "-"}. What it means
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.
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
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at convex/broadcast/rampRunner.ts:414 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of koala73/worldmonitor@7d06c8633d (2026-08-21).
Data as JSON: /api/errors/25ddedf258b35eab.
Report an issue: GitHub.
Appendix: source
Thrown at convex/broadcast/rampRunner.ts:414
const assigned = args.assigned ?? row.pendingAssigned;
const nextTier = row.currentTier + 1;
if (nextTier >= row.rampCurve.length) {
throw new Error(
`[recoverFromPartialFailure:manual-finished] currentTier=${row.currentTier} would advance past rampCurve.length=${row.rampCurve.length}. Curve is complete; nothing to recover.`,
);
}
const waveLabel =
args.waveLabel ??
row.pendingWaveLabel ??
`${row.waveLabelPrefix}-${nextTier + row.waveLabelOffset}`;
const missing: string[] = [];
if (!broadcastId) missing.push("broadcastId");
if (!segmentId) missing.push("segmentId");
if (assigned === undefined) missing.push("assigned");
if (args.sentAt === undefined) missing.push("sentAt");
if (missing.length > 0) {
throw new 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 ?? "-"}.`,
);
}
await ctx.db.patch(row._id, {
currentTier: nextTier,
lastWaveLabel: waveLabel,
lastWaveBroadcastId: broadcastId,
lastWaveSegmentId: segmentId,
lastWaveAssigned: assigned,
lastWaveSentAt: args.sentAt,
lastRunStatus: `succeeded-via-manual-recovery: ${args.reason.slice(0, 200)}`,
lastRunAt: Date.now(),
lastRunError: undefined,
...clearPending,View on GitHub (pinned to 7d06c8633d)