From a532b5163baba7a1a4ff38dfa5e8caa2001e7a5e Mon Sep 17 00:00:00 2001 From: wangdl Date: Sun, 21 Jun 2026 15:45:33 +0800 Subject: [PATCH] fix(P2-06): remove @Optional() silent skip from AiInteractive/Background workers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine is now a hard dependency — DI resolution failure prevents Worker startup (fail-fast) instead of silently skipping all Unified Jobs. Changes: - ai-interactive.worker.ts: remove @Optional(), silent return guard - ai-background.worker.ts: remove @Optional(), silent return guard - docs: mark P2-06 as fixed Co-Authored-By: Claude --- docs/architecture/m-ai-04-gate-audit.md | 2 +- src/workers/ai-background.worker.ts | 15 +++------------ src/workers/ai-interactive.worker.ts | 16 ++++------------ 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/docs/architecture/m-ai-04-gate-audit.md b/docs/architecture/m-ai-04-gate-audit.md index ce58b45..267c052 100644 --- a/docs/architecture/m-ai-04-gate-audit.md +++ b/docs/architecture/m-ai-04-gate-audit.md @@ -288,7 +288,7 @@ E2E 场景 12 验证通过。 | P2-03 | FocusItem `knowledgeBaseId` 恒为 `unknown`(M-AI-04-01 #3) | 否 | | P2-04 | ModelRouter preferred/fallback 相同(M-AI-04-01 #7) | 否 | | P2-05 | ReviewCard 无 `jobId` 关联字段(表结构限制) | 否 | -| **P2-06** | **`@Optional()` 静默吞任务** — `AiInteractiveJobWorker` 中 `if (!this.engine) return` 会在模块依赖再次出错时静默跳过 Unified Job,而非启动失败 | **生产 Unified 前移除** | +| **P2-06** | **`@Optional()` 静默吞任务** — ✅ 已修复 (`4f74c09`):`AiInteractiveJobWorker` + `AiBackgroundJobWorker` 移除 `@Optional()` 和 `if (!this.engine) return`。Engine 缺失时 DI 直接抛错阻止启动 | ✅ | | **P2-07** | **Engine 硬编码 `active_recall`** — 通用 Engine 中 4 处 `if (job.jobType === 'active_recall')` 分支,应重构为 Definition Hook 或 Observer 模式 | 否(不阻塞 M-AI-05) | ### P3 diff --git a/src/workers/ai-background.worker.ts b/src/workers/ai-background.worker.ts index 0c4cddd..e5576c9 100644 --- a/src/workers/ai-background.worker.ts +++ b/src/workers/ai-background.worker.ts @@ -1,5 +1,5 @@ import { Processor, WorkerHost } from '@nestjs/bullmq'; -import { Logger, Inject, Optional } from '@nestjs/common'; +import { Logger, Inject } from '@nestjs/common'; import type { Job } from 'bullmq'; import { QUEUE_AI_BACKGROUND, @@ -25,11 +25,11 @@ export class AiBackgroundJobWorker extends WorkerHost { private readonly logger = new Logger(AiBackgroundJobWorker.name); constructor( - @Optional() @Inject(AI_JOB_EXECUTION_ENGINE) - private readonly engine?: any, + private readonly engine: any, ) { super(); + // P2-06: Engine 是硬依赖。DI 解析失败 → Worker 启动 crash(fail-fast)。 } async process(job: Job<{ jobId: string }>): Promise { @@ -40,15 +40,6 @@ export class AiBackgroundJobWorker extends WorkerHost { throw new Error('Invalid job payload: missing jobId'); } - if (!this.engine) { - // M-AI-03-05~07 阶段 Engine 尚未实现,暂记日志并标记完成 - this.logger.warn( - `Engine not available — skipping jobId=${jobId}. ` + - `Will be handled after M-AI-03-08 (#291).`, - ); - return; - } - const context = { jobId: job.id ?? '', attemptMade: job.attemptsMade, diff --git a/src/workers/ai-interactive.worker.ts b/src/workers/ai-interactive.worker.ts index 9349f4a..e62ddb0 100644 --- a/src/workers/ai-interactive.worker.ts +++ b/src/workers/ai-interactive.worker.ts @@ -1,5 +1,5 @@ import { Processor, WorkerHost } from '@nestjs/bullmq'; -import { Logger, Inject, Optional } from '@nestjs/common'; +import { Logger, Inject } from '@nestjs/common'; import type { Job } from 'bullmq'; import { QUEUE_AI_INTERACTIVE, @@ -25,11 +25,12 @@ export class AiInteractiveJobWorker extends WorkerHost { private readonly logger = new Logger(AiInteractiveJobWorker.name); constructor( - @Optional() @Inject(AI_JOB_EXECUTION_ENGINE) - private readonly engine?: any, + private readonly engine: any, ) { super(); + // P2-06: Engine 是硬依赖。若 DI 解析失败,Worker 启动即 crash(fail-fast), + // 不复静默跳过 Unified Job。Kubernetes/systemd 负责重启。 } async process(job: Job<{ jobId: string }>): Promise { @@ -40,15 +41,6 @@ export class AiInteractiveJobWorker extends WorkerHost { throw new Error('Invalid job payload: missing jobId'); } - if (!this.engine) { - // M-AI-03-05~07 阶段 Engine 尚未实现,暂记日志并标记完成 - this.logger.warn( - `Engine not available — skipping jobId=${jobId}. ` + - `Will be handled after M-AI-03-08 (#291).`, - ); - return; - } - const context = { jobId: job.id ?? '', attemptMade: job.attemptsMade,