{"record":{"id":"a85cf120b4db8bcd","repo":"ruvnet/ruflo","slug":"witness-chain-gap-on-deviceid-epoch-fromepoc","errorCode":null,"errorMessage":"Witness chain gap on ${deviceId}: epoch ${fromEpoch} → ${toEpoch}","messagePattern":"Witness chain gap on (.+?): epoch (.+?) → (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/plugin-iot-cognitum/src/plugin.ts","lineNumber":134,"sourceCode":"\n    const firmwareWatchIntervalMs = (config['firmwareWatchIntervalMs'] as number) ?? 300_000;\n    this.firmwareWatch = new FirmwareWatchWorker(this.coordinator, {\n      intervalMs: firmwareWatchIntervalMs,\n      onVersionMismatch: (deviceId, expected, actual) => {\n        context.logger.warn(`Firmware mismatch on ${deviceId}: expected ${expected}, got ${actual}`);\n        context.eventBus.emit('iot:firmware-mismatch', { deviceId, expected, actual });\n      },\n      onWatchError: (deviceId, error) => {\n        context.logger.warn(`Firmware watch error for ${deviceId}: ${error.message}`);\n      },\n    });\n    this.firmwareWatch.start();\n\n    const witnessAuditIntervalMs = (config['witnessAuditIntervalMs'] as number) ?? 600_000;\n    this.witnessAudit = new WitnessAuditWorker(this.coordinator, {\n      intervalMs: witnessAuditIntervalMs,\n      onGapDetected: (deviceId, fromEpoch, toEpoch) => {\n        context.logger.warn(`Witness chain gap on ${deviceId}: epoch ${fromEpoch} → ${toEpoch}`);\n        context.eventBus.emit('iot:witness-gap', { deviceId, fromEpoch, toEpoch });\n      },\n      onAuditError: (deviceId, error) => {\n        context.logger.warn(`Witness audit error for ${deviceId}: ${error.message}`);\n      },\n    });\n    this.witnessAudit.start();\n\n    context.logger.info('IoT Cognitum plugin initialized');\n  }\n\n  async shutdown(): Promise<void> {\n    if (this.witnessAudit) {\n      this.witnessAudit.stop();\n      this.witnessAudit = null;\n    }\n    if (this.firmwareWatch) {\n      this.firmwareWatch.stop();","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/plugin-iot-cognitum/src/plugin.ts#L116-L152","documentation":"Warning raised by a witness-chain audit worker during initialize(): the chain of witness attestations for a device is missing entries between fromEpoch and toEpoch, meaning tamper-evidence for that epoch range is incomplete.","triggerScenarios":"Thrown at v3/@claude-flow/plugin-iot-cognitum/src/plugin.ts:134 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Investigate the witness chain gap on the named device; missing epochs indicate downtime or tampering — re-sync the witness log."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}