{
"issueNumber": 457,
"branchName": "feat/457-bullmq-job-queue",
"generatedAt": "2026-04-13T12:00:00Z",
"stories": [
{
"id": "S1",
"title": "Add JOB_QUEUE_DRIVER to config schema and create BullMQJobQueue implementation",
"priority": 1,
"dependsOn": [],
"acceptanceCriteria": [
"JOB_QUEUE_DRIVER added to config.schema.ts with valid values 'sqlite'|'bullmq', default 'sqlite'",
"BullMQJobQueue class implements JobQueue interface (enqueue + onJob)",
"Uses BullMQ Queue for enqueuing, Worker for consuming",
"Redis connection uses REDIS_HOST/REDIS_PORT/REDIS_DB from ConfigService",
"Per-issue concurrency control prevents parallel processing of same issue",
"Stalled jobs auto-retried by BullMQ (no manual recovery in onModuleInit)",
"Invalid JOB_QUEUE_DRIVER value rejected by Joi at startup"
],
"passes": false,
"completedAt": null
},
{
"id": "S2",
"title": "Update QueueModule for conditional driver registration and add unit tests",
"priority": 2,
"dependsOn": [
"S1"
],
"acceptanceCriteria": [
"QueueModule reads JOB_QUEUE_DRIVER from ConfigService",
"JOB_QUEUE token resolves to BullMQJobQueue when driver=bullmq",
"JOB_QUEUE token resolves to SqliteJobQueue when driver=sqlite (default)",
"BullModule imported only when driver=bullmq",
"Unit tests cover: enqueue, onJob handler, per-issue dedup, error handling, cleanup",
"npm run build passes",
"npm run test passes",
"npm run lint passes with zero warnings"
],
"passes": false,
"completedAt": null
}
]
}