{"record":{"id":"84d9cb91ea634b7a","repo":"ruvnet/ruflo","slug":"device-deviceid-not-registered-with-coordinator","errorCode":null,"errorMessage":"Device ${deviceId} not registered with coordinator","messagePattern":"Device (.+?) not registered with coordinator","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/plugin-iot-cognitum/src/application/iot-coordinator.ts","lineNumber":578,"sourceCode":"\n  // -------------------------------------------------------------------------\n  // Internals\n  // -------------------------------------------------------------------------\n\n  /**\n   * Resolve a SeedClient by device ID (or temporary endpoint key).\n   * Throws when the device has not been registered.\n   */\n  private resolveClient(deviceId: string): SeedClient {\n    return this.requireEntry(deviceId).client;\n  }\n\n  private requireEntry(\n    deviceId: string,\n  ): { agent: DeviceAgent; client: SeedClient } {\n    const entry = this.devices.get(deviceId);\n    if (!entry) {\n      throw new Error(`Device ${deviceId} not registered with coordinator`);\n    }\n    return entry;\n  }\n}\n","sourceCodeStart":560,"sourceCodeEnd":583,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/plugin-iot-cognitum/src/application/iot-coordinator.ts#L560-L583","documentation":"Internal guard in IoTCoordinator: resolveClient()/requireEntry() look a device up in the coordinator's devices map and throw when it is absent, meaning the device was never registered with this coordinator (or its registration no longer exists in this instance). Every coordinator operation that needs the Seed client funnels through it.","triggerScenarios":"Calling coordinator operations (telemetry ingest, mesh topology, lifecycle actions) with a device-id that was never registered via the registration flow, was unregistered, or whose registration was lost because the coordinator's in-memory registry did not survive a restart.","commonSituations":"Running ingest or mesh commands right after coordinator startup before re-registering devices; a typo'd device ID; a device registered against a different coordinator instance; tests sharing coordinator state incorrectly.","solutions":["Register the device first (the iot register CLI flow or the registration API) and confirm it appears in the registry","Double-check the device-id string for typos or stale values","If the coordinator restarted and the registry is not persisted, re-register devices before resuming operations"],"exampleFix":"// before\nawait coordinator.ingestDeviceTelemetry('seed-42', vectors); // seed-42 never registered\n\n// after\nawait coordinator.registerDevice('seed-42', endpoint); // or run `iot register`\nawait coordinator.ingestDeviceTelemetry('seed-42', vectors);","handlingStrategy":"validation","validationCode":"const registered = new Set<string>(loadRegisteredDeviceIds());\nif (!registered.has(deviceId)) {\n  throw new Error(`device ${deviceId} unknown to this coordinator; register it first`);\n}\nawait coordinator.ingestDeviceTelemetry(deviceId, vectors);","typeGuard":null,"tryCatchPattern":"try {\n  await coordinator.ingestDeviceTelemetry(deviceId, vectors);\n} catch (e) {\n  if (e instanceof Error && e.message.endsWith('not registered with coordinator')) {\n    await registerDevice(deviceId);\n    await coordinator.ingestDeviceTelemetry(deviceId, vectors); // retry once\n  } else throw e;\n}","preventionTips":["Make registration the first step of device onboarding; no telemetry operations before it","Store device IDs from the registration result rather than typing them","After a coordinator restart, re-register devices before resuming pipelines"],"tags":["iot","device-registry","precondition","claude-flow"],"backgroundTag":"device-not-registered","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}