{"record":{"id":"bae51334061958b2","repo":"thedotmack/claude-mem","slug":"unknown-server-generation-job-kind-kind","errorCode":null,"errorMessage":"unknown server generation job kind: ${kind}","messagePattern":"unknown server generation job kind: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/server/runtime/ActiveServerQueueManager.ts","lineNumber":51,"sourceCode":"  private closed = false;\n\n  constructor(\n    private readonly config: RedisQueueConfig,\n    queues?: Map<ServerGenerationJobKind, ServerJobQueue<ServerGenerationJobPayload>>,\n  ) {\n    if (config.engine !== 'bullmq') {\n      throw new Error(\n        `ActiveServerQueueManager requires CLAUDE_MEM_QUEUE_ENGINE=bullmq (got ${config.engine}); ` +\n          'do not instantiate when bullmq is not selected.',\n      );\n    }\n    this.queues = queues ?? this.buildQueues(config);\n  }\n\n  getQueue(kind: ServerGenerationJobKind): ServerJobQueue<ServerGenerationJobPayload> {\n    const queue = this.queues.get(kind);\n    if (!queue) {\n      throw new Error(`unknown server generation job kind: ${kind}`);\n    }\n    return queue;\n  }\n\n  start(kind: ServerGenerationJobKind, processor: Processor<ServerGenerationJobPayload>): void {\n    this.getQueue(kind).start(processor);\n  }\n\n  getHealth(): ServerBoundaryHealth {\n    if (this.closed) {\n      return { status: 'errored', reason: 'queue-manager closed' };\n    }\n    const lanes = QUEUE_KINDS.map((kind) => ({ kind, name: SERVER_JOB_QUEUE_NAMES[kind] }));\n    return {\n      status: 'active',\n      reason: 'BullMQ-backed queue manager wired',\n      details: {\n        engine: this.config.engine,","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/d8bc9755e74915e5c3b999181e10a67c889bce2a/src/server/runtime/ActiveServerQueueManager.ts#L33-L69","documentation":"getQueue looks up a ServerJobQueue by ServerGenerationJobKind and throws when the kind has no registered queue in the manager's queues map. The map is built from the known job kinds, so an unrecognized or unconfigured kind cannot be started or accessed.","triggerScenarios":"Calling manager.getQueue(kind) or manager.start(kind, processor) with a ServerGenerationJobKind value that was never added to buildQueues — e.g. a newly added enum kind not wired into buildQueues, or a stale/typo kind string.","commonSituations":"Adding a new generation job kind to the type but forgetting to register it in buildQueues; passing a kind read from stale persisted data produced by a different version; deserializing job kinds from a DB or queue payload without validating them.","solutions":["Register the missing kind in ActiveServerQueueManager.buildQueues so a queue exists for it","Validate the kind against the known kinds before calling getQueue/start","Migrate or filter stale job records whose kinds no longer exist"],"exampleFix":"// before\nmanager.start('newKind' as ServerGenerationJobKind, processor); // not registered -> throws\n// after\nif (!SUPPORTED_KINDS.has(kind)) return; // or register 'newKind' in buildQueues\nmanager.start(kind, processor);","handlingStrategy":"type-guard","validationCode":"const KNOWN_KINDS = new Set<string>(Object.values(ServerGenerationJobKind));\nif (!KNOWN_KINDS.has(kind)) throw new Error(`unregistered job kind: ${kind}`);\nmanager.getQueue(kind);","typeGuard":"function isRegisteredKind(kind: string, queues: Map<ServerGenerationJobKind, unknown>): kind is ServerGenerationJobKind {\n  return queues.has(kind as ServerGenerationJobKind);\n}","tryCatchPattern":"try {\n  manager.getQueue(kind).start(processor);\n} catch (e) {\n  if (String(e.message).startsWith('unknown server generation job kind')) {\n    logger.error(`job kind ${kind} is not registered in buildQueues`);\n  } else throw e;\n}","preventionTips":["When adding a ServerGenerationJobKind, register it in buildQueues in the same change","Validate kinds read from persisted data/queue payloads against the current enum","Use exhaustive switch/Record<ServerGenerationJobKind, ...> maps so the compiler flags missing kinds","Filter or migrate old job rows after kind renames"],"tags":["queue","enum","job"],"backgroundTag":"invalid-enum-value","analyzedSha":"d8bc9755e74915e5c3b999181e10a67c889bce2a","analyzedAt":"2026-09-17T16:40:26.182Z","contentChangedAt":"2026-09-17T16:40:26.182Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}