{"record":{"id":"9cdb8695d8eaf87a","repo":"thedotmack/claude-mem","slug":"worker-already-running","errorCode":null,"errorMessage":"Worker already running","messagePattern":"Worker already running","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/supervisor/index.ts","lineNumber":41,"sourceCode":"class Supervisor {\n  private readonly registry: ProcessRegistry;\n  private started = false;\n  private stopPromise: Promise<void> | null = null;\n  private signalHandlersRegistered = false;\n  private shutdownInitiated = false;\n  private shutdownHandler: (() => Promise<void>) | null = null;\n\n  constructor(registry: ProcessRegistry) {\n    this.registry = registry;\n  }\n\n  async start(): Promise<void> {\n    if (this.started) return;\n\n    this.registry.initialize();\n    const pidStatus = validateWorkerPidFile({ logAlive: false });\n    if (pidStatus === 'alive') {\n      throw new Error('Worker already running');\n    }\n\n    this.started = true;\n\n    startHealthChecker();\n  }\n\n  configureSignalHandlers(shutdownHandler: () => Promise<void>): void {\n    this.shutdownHandler = shutdownHandler;\n\n    if (this.signalHandlersRegistered) return;\n    this.signalHandlersRegistered = true;\n\n    const handleSignal = async (signal: string): Promise<void> => {\n      if (this.shutdownInitiated) {\n        logger.warn('SYSTEM', `Received ${signal} but shutdown already in progress`);\n        return;\n      }","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/d768ba364302d12b76e69e4f021f0bb1d2d50ed6/src/supervisor/index.ts#L23-L59","documentation":"Error \"Worker already running\" thrown in thedotmack/claude-mem.","triggerScenarios":"Fires when starting the worker while a supervisor instance is already active: a second `claude-mem` start, a stale process from a previous terminal session, or a double-invoked installer/launcher. Defensive guard in src/supervisor/index.ts:41 prevents two supervisors from competing for the same SQLite database, worker port, and Chroma writer lock.","commonSituations":"See trigger scenarios.","solutions":["Stop the existing worker before starting a new one (`npx claude-mem stop` or `worker-service stop`), or use `restart`.","Check for a stale PID file: if the recorded PID is dead, remove the stale pid file and start again."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"d768ba364302d12b76e69e4f021f0bb1d2d50ed6","analyzedAt":"2026-08-12T23:52:55.241Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}