{"record":{"id":"4fdd412f96912b17","repo":"ruvnet/ruflo","slug":"daemon-name-not-found","errorCode":null,"errorMessage":"Daemon '${name}' not found","messagePattern":"Daemon '(.+?)' not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/hooks/src/daemons/index.ts","lineNumber":75,"sourceCode":"    }\n\n    const state: DaemonState = {\n      name: config.name,\n      status: 'stopped',\n      executionCount: 0,\n      failureCount: 0,\n    };\n\n    this.daemons.set(config.name, { config, state, task });\n  }\n\n  /**\n   * Start a daemon\n   */\n  async start(name: string): Promise<void> {\n    const daemon = this.daemons.get(name);\n    if (!daemon) {\n      throw new Error(`Daemon '${name}' not found`);\n    }\n\n    if (daemon.state.status === 'running') {\n      return; // Already running\n    }\n\n    if (!daemon.config.enabled) {\n      throw new Error(`Daemon '${name}' is disabled`);\n    }\n\n    daemon.state.status = 'starting';\n    daemon.state.startedAt = new Date();\n\n    try {\n      // Start interval timer\n      daemon.timer = setInterval(async () => {\n        await this.executeDaemonTask(name);\n      }, daemon.config.interval);","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/hooks/src/daemons/index.ts#L57-L93","documentation":"DaemonManager.start(name) throws when no daemon with that name was registered — the internal daemons Map lookup returns undefined. The manager has no auto-registration, so starting is only valid for names previously passed to register(). Note the ordering of checks in start(): an unknown name throws, a known-but-running daemon is a silent no-op, and a known-but-disabled daemon throws a different error.","triggerScenarios":"Calling await manager.start('metrics') when 'metrics' was never registered — typo in the name, registration code path not executed (conditional import, early return), or starting before the registration module ran.","commonSituations":"Name strings duplicated between registration and start sites drifting apart (renames); feature-gated registration while start is unconditional; race where start is invoked during bootstrap before registration completes.","solutions":["Register the daemon first: manager.register({ name, interval, enabled: true }, task) before start(name)","Probe existence with manager.getState(name) and fail loudly at startup if expected daemons are missing","Define daemon names as shared constants used by both register and start to prevent drift"],"exampleFix":"// before\nawait manager.start('metrics'); // throws: never registered\n\n// after\nif (manager.getState('metrics') === undefined) {\n  manager.register({ name: 'metrics', interval: 60_000, enabled: true }, task);\n}\nawait manager.start('metrics');","handlingStrategy":"validation","validationCode":"function assertDaemon(manager: DaemonManager, name: string): void {\n  if (manager.getState(name) === undefined) {\n    throw new Error(`daemon '${name}' not registered; check registration order`);\n  }\n}\nassertDaemon(manager, 'metrics');\nawait manager.start('metrics');","typeGuard":"function isRegistered(manager: DaemonManager, name: string): name is string {\n  return manager.getState(name) !== undefined;\n}","tryCatchPattern":"try {\n  await manager.start(name);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('not found')) {\n    logger.error(`daemon '${name}' never registered — startup order bug`);\n  }\n  throw e;\n}","preventionTips":["Run a startup assertion over the full expected daemon list before starting any of them","Define daemon names as constants shared by register/start/stop sites","Ensure registration code is unconditional before startAll()/start() in bootstrap"],"tags":["daemons","hooks","entity-not-found","lifecycle"],"backgroundTag":"entity-not-found","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}