ruvnet/ruflo · error · Error
Rollout ${rolloutId} not found
Error message
Rollout ${rolloutId} not found What it means
FirmwareOrchestrationService keeps rollouts in an in-memory map; getExistingRollout() throws for any follow-up operation whose rolloutId is not in that map. The ID must have been created by this same service instance within its lifetime.
Source
Thrown at v3/@claude-flow/plugin-iot-cognitum/src/domain/services/firmware-orchestration-service.ts:217
private async deployToDevices(
rollout: FirmwareRollout,
deviceIds: string[],
version: string,
): Promise<void> {
for (const deviceId of deviceIds) {
const result = await this.deps.deployFirmware(deviceId, version);
if (result.success) {
rollout.completedDeviceIds.push(deviceId);
} else {
rollout.failedDeviceIds.push(deviceId);
}
}
}
private getExistingRollout(rolloutId: string): FirmwareRollout {
const rollout = this.rollouts.get(rolloutId);
if (!rollout) {
throw new Error(`Rollout ${rolloutId} not found`);
}
return rollout;
}
}
View on GitHub (pinned to fa13ee4ad6)
Solutions
- Use the rollout ID returned by the same service instance that created it, within that instance's lifetime
- Re-create the rollout after a restart instead of reusing the old ID
- Persist rollout IDs externally if follow-up operations must survive restarts
Example fix
// before
await fwService.advanceRollout(rolloutIdFromLastDeploy); // map empty after restart -> throws
// after
const { rolloutId } = await fwService.createRollout(spec); // fresh, same instance
await fwService.advanceRollout(rolloutId); Defensive patterns
Strategy: validation
Validate before calling
const active = new Set<string>(); // rolloutIds created by THIS service instance
const { rolloutId } = await fwService.createRollout(spec);
active.add(rolloutId);
if (!active.has(rolloutId)) throw new Error('rollout not created here; refusing follow-up');
await fwService.advanceRollout(rolloutId); Try / catch
try {
await fwService.advanceRollout(rolloutId);
} catch (e) {
if (e instanceof Error && e.message.endsWith('not found')) {
// rollout map lost (restart or other instance): re-create the rollout from spec
} else throw e;
} Prevention
- Treat rollouts as session-scoped state; recreate rather than resume across restarts
- Keep the creating call and follow-up calls on the same coordinator instance
- Store rollout IDs together with the identity of the instance that created them
When it happens
Trigger: Referencing a rollout ID created before a service restart, by another process or replica, or a mistyped ID; or the createRollout call failed so no entry exists under that ID.
Common situations: Long-running fleet campaigns that span deploys (the restart loses the map); horizontally scaled coordinators where the rollout lives on a different instance; rollout IDs copied between environments.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- Fleet ${fleetId} not found
- SSRF guard: only HTTPS URLs are permitted, got ${parsed.prot
- SSRF guard: private/loopback host rejected — ${host}
- SSRF guard: private/loopback host rejected — ${host}
- User not found
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/c4cb974eca6259ac.
Report an issue: GitHub.