{"record":{"id":"dfdfd2d0b94af09f","repo":"ruvnet/ruflo","slug":"daemon-name-is-disabled","errorCode":null,"errorMessage":"Daemon '${name}' is disabled","messagePattern":"Daemon '(.+?)' is disabled","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/hooks/src/daemons/index.ts","lineNumber":83,"sourceCode":"\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);\n\n      daemon.state.status = 'running';\n      daemon.state.pid = process.pid; // Use current process for in-process daemons\n\n      // Run initial execution\n      await this.executeDaemonTask(name);\n    } catch (error) {\n      daemon.state.status = 'error';","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/hooks/src/daemons/index.ts#L65-L101","documentation":"DaemonManager.start(name) throws this when the daemon exists and is not running, but its registered config has enabled: false. Disabled daemons refuse to start as a deliberate control — you must explicitly re-enable via manager.enable(name) (or register with enabled: true) before starting.","triggerScenarios":"Registering a daemon with { name, interval, enabled: false } (e.g. an opt-in daemon) and later calling start(name) without calling enable(name) first; or calling disable(name) at runtime and then start(name) again.","commonSituations":"Daemons registered disabled-by-default for feature-flag rollout where the flag flips but enable() is never invoked; shutdown logic that disables daemons and restart logic that only calls start(); config-driven enabled fields defaulting to false when omitted from partial config objects.","solutions":["Call manager.enable(name) before manager.start(name) for daemons registered disabled","Or register with enabled: true if the daemon should start with the manager","Centralize the enable+start sequence in one startDaemon(name) helper so they cannot diverge"],"exampleFix":"// before\nmanager.register({ name: 'metrics', interval: 60_000, enabled: false }, task);\nawait manager.start('metrics'); // throws: disabled\n\n// after\nmanager.enable('metrics');\nawait manager.start('metrics');","handlingStrategy":"validation","validationCode":"// Explicit enable+start keeps intent clear\nfunction startDaemon(manager: DaemonManager, name: string): Promise<void> {\n  if (manager.getState(name) === undefined) {\n    throw new Error(`daemon '${name}' not registered`);\n  }\n  manager.enable(name); // no-op style guard before start\n  return manager.start(name);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await manager.start(name);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('is disabled')) {\n    manager.enable(name);\n    await manager.start(name);\n    return;\n  }\n  throw e;\n}","preventionTips":["Default enabled: true in registration configs unless the daemon is deliberately opt-in","Gate opt-in daemons on a feature flag that drives enable() — not just start()","Log daemon states (getAllStates) at startup to spot disabled daemons early"],"tags":["daemons","hooks","disabled-resource","lifecycle","feature-flag"],"backgroundTag":"operation-on-disabled-resource","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"}