[M-AI-04-01] 审计并冻结 Active Recall 新旧链路迁移契约 #296

Closed
opened 2026-06-21 12:48:13 +08:00 by wangdl · 4 comments
Owner

类型 / 标签

  • audit
  • architecture
  • active-recall
  • migration

风险等级

P0

依赖

  • M-AI-03 PASS

背景

在修改 Active Recall 生产链路前,完整确认现有提交、AI 分析、状态更新和结果写入行为,并冻结迁移契约。避免因审计缺失导致迁移后行为不一致。

目标

  1. 完整追踪 POST /api/active-recalls/:id/submit 从 Controller 到 Worker 到 AI Provider 到 Result Repository 的真实调用链
  2. 冻结输入 Snapshot Schema、输出 Schema、状态映射、幂等键、Feature Flag 设计与回滚流程

非目标

  • 不修改代码
  • 不修改数据库
  • 不注册 Definition
  • 不切换流量

影响范围

  • ActiveRecallController
  • ActiveRecallService
  • AiAnalysisService
  • Active Recall Worker
  • AI Provider 调用
  • Result Repository

必须审计

HTTP 入口

  • 真实入口: POST /api/active-recalls/:id/submit
  • Controller、请求 DTO、响应 DTO、状态码、认证、权限、重复提交行为、错误响应、客户端调用方

Service 链路

  • Controller → ActiveRecallService.submit → AiAnalysisService.analyze → createJob → Queue Producer → Worker → AI Provider → Result Repository
  • 所有结论附文件路径、类名、方法名、行号

输入数据

  • Active Recall 实体、题目、用户答案、知识点、参考材料、Prompt、模型配置、用户 Credential、上下文数据
  • 区分:必须进入 Snapshot / 执行时重新查询 / 禁止进入 Snapshot

输出与副作用

  • Active Recall 状态、分析结果、得分、反馈、FocusItem、ReviewCard、学习记录、通知或事件、UsageLog
  • 不得根据命名猜测,必须以真实代码为准

状态契约

  • 输出新旧映射表:业务阶段 | 旧 Job 状态 | 新 lifecycleStatus | Active Recall 业务状态

幂等契约

  • 确认稳定业务标识:Active Recall ID、提交记录 ID、答案版本 ID
  • 冻结统一 Job 的 idempotencyKey

回滚契约

  • Feature Flag 位置、Legacy 与 Unified 分支点、切换前创建的数据、失败后回退方式、避免双链路同时执行

验收标准

  • 文档 docs/architecture/m-ai-04-active-recall-migration-contract.md 已创建
  • 包含当前时序图
  • 包含目标时序图
  • 包含输入 Snapshot Schema 草图
  • 包含输出 Schema 草图
  • 包含副作用矩阵
  • 包含状态映射表
  • 包含幂等键定义
  • 包含 Feature Flag 设计
  • 包含回滚流程
  • 包含不确定项列表

建议执行顺序

第 1 个执行(M-AI-04 所有 Issue 的前置依赖)

## 类型 / 标签 - audit - architecture - active-recall - migration ## 风险等级 P0 ## 依赖 - M-AI-03 PASS ✅ ## 背景 在修改 Active Recall 生产链路前,完整确认现有提交、AI 分析、状态更新和结果写入行为,并冻结迁移契约。避免因审计缺失导致迁移后行为不一致。 ## 目标 1. 完整追踪 POST /api/active-recalls/:id/submit 从 Controller 到 Worker 到 AI Provider 到 Result Repository 的真实调用链 2. 冻结输入 Snapshot Schema、输出 Schema、状态映射、幂等键、Feature Flag 设计与回滚流程 ## 非目标 - 不修改代码 - 不修改数据库 - 不注册 Definition - 不切换流量 ## 影响范围 - ActiveRecallController - ActiveRecallService - AiAnalysisService - Active Recall Worker - AI Provider 调用 - Result Repository ## 必须审计 ### HTTP 入口 - 真实入口: `POST /api/active-recalls/:id/submit` - Controller、请求 DTO、响应 DTO、状态码、认证、权限、重复提交行为、错误响应、客户端调用方 ### Service 链路 - Controller → ActiveRecallService.submit → AiAnalysisService.analyze → createJob → Queue Producer → Worker → AI Provider → Result Repository - 所有结论附文件路径、类名、方法名、行号 ### 输入数据 - Active Recall 实体、题目、用户答案、知识点、参考材料、Prompt、模型配置、用户 Credential、上下文数据 - 区分:必须进入 Snapshot / 执行时重新查询 / 禁止进入 Snapshot ### 输出与副作用 - Active Recall 状态、分析结果、得分、反馈、FocusItem、ReviewCard、学习记录、通知或事件、UsageLog - 不得根据命名猜测,必须以真实代码为准 ### 状态契约 - 输出新旧映射表:业务阶段 | 旧 Job 状态 | 新 lifecycleStatus | Active Recall 业务状态 ### 幂等契约 - 确认稳定业务标识:Active Recall ID、提交记录 ID、答案版本 ID - 冻结统一 Job 的 idempotencyKey ### 回滚契约 - Feature Flag 位置、Legacy 与 Unified 分支点、切换前创建的数据、失败后回退方式、避免双链路同时执行 ## 验收标准 - [ ] 文档 `docs/architecture/m-ai-04-active-recall-migration-contract.md` 已创建 - [ ] 包含当前时序图 - [ ] 包含目标时序图 - [ ] 包含输入 Snapshot Schema 草图 - [ ] 包含输出 Schema 草图 - [ ] 包含副作用矩阵 - [ ] 包含状态映射表 - [ ] 包含幂等键定义 - [ ] 包含 Feature Flag 设计 - [ ] 包含回滚流程 - [ ] 包含不确定项列表 ## 建议执行顺序 第 1 个执行(M-AI-04 所有 Issue 的前置依赖)
wangdl added this to the M-AI-04 Active Recall 端到端迁移 milestone 2026-06-21 12:48:13 +08:00
Author
Owner

开发完成评论

完成内容

  • 完整审计 POST /api/active-recalls/:id/submit 从 Controller → Service → Queue → Worker → AI Provider → Result Repository 的真实调用链
  • 确认 6 个关键发现(queueName 不一致、无 DTO 校验、knowledgeItemContent 硬编码空字符串等)
  • 冻结输入 Snapshot Schema(12 字段 + 禁止字段清单 + 区分原则)
  • 冻结输出 Schema(10 字段 + Zod 验证规则 + 行号引用)
  • 冻结副作用矩阵(15 个操作,附文件路径和行号)
  • 冻结状态映射表(5 状态 × 4 列)
  • 冻结幂等键:active-recall:<answerId>
  • 冻结 Feature Flag 设计:ACTIVE_RECALL_ENGINE_MODE=legacy|unified
  • 冻结回滚流程(6 步 + 3 禁止事项)
  • 记录 6 个不确定项(其中 3 个已确认,3 个留待后续 Issue 决策)

修改文件

  • docs/architecture/m-ai-04-active-recall-migration-contract.md:从 ??? 占位状态填充为完整审计文档

代码证据(审计溯源)

  • active-recall.controller.ts:21:POST :id/submit 入口,@Body() body: any 无 DTO
  • active-recall.service.ts:19-39:submit() → findById + createAnswer + analyze
  • active-recall.service.ts:29:knowledgeItemContent 硬编码 ''
  • ai-analysis.service.ts:12-31:analyze() → createJob + queue.add
  • ai-analysis.repository.ts:17-33:createJob 写入 lifecycleStatus='queued', queueName='ai-interactive'
  • ai-analysis.repository.ts:28 vs ai-analysis.service.ts:21:queueName 不一致(DB 写 ai-interactive,BullMQ 入队 ai-analysis)
  • queue.constants.ts:1:QUEUE_AI_ANALYSIS = 'ai-analysis'
  • workers/ai-analysis.worker.ts:18-106:AiAnalysisWorker 完整执行管线
  • modules/ai/workflows/active-recall-analysis.workflow.ts:17-41:AI 调用封装
  • modules/ai/gateway/ai-gateway.service.ts:40-170:AiGateway 完整链路
  • modules/ai/prompts/active-recall-analysis.schema.ts:17-28:输出 Zod Schema
  • modules/ai/prompts/active-recall-analysis.prompt.ts:1-27:System Prompt
  • modules/ai/model-router.ts:23-28:primary tier 路由配置
  • modules/review/review-card.subscriber.ts:11-51:AIAnalysisCompleted → ReviewCard
  • ai-analysis.worker.ts:85-96:FocusItem 创建副作用
  • ai-analysis.repository.ts:55-69:AiAnalysisResult 写入
  • schema.prisma:532-566:ActiveRecallQuestion + ActiveRecallAnswer 模型
  • schema.prisma:568-638:AiJob (AiAnalysisJob) 模型
  • schema.prisma:679-701:AiAnalysisResult 模型
  • schema.prisma:703-729:FocusItem 模型
  • schema.prisma:731-757:ReviewCard 模型

测试情况

  • 已运行命令:
    • npm run build
    • npx jest --testPathPatterns="ai-job|ai-runtime" --passWithNoTests
  • 结果:
    • 构建通过
    • 20 suites 通过,429 tests 通过,18 skipped,0 failed

未完成 / 风险

  • 无代码修改,纯文档审计 Issue
  • 6 个关键发现中 queueName 不一致(HIGH)可能影响后续 M-AI-04-05 的队列路由
  • 3 个不确定项留待 M-AI-04-02/03/05 决策

是否建议进入 Review

  • 是 — 迁移契约已冻结,可以开始执行 M-AI-04-02(注册 Definition 与 Snapshot)
## 开发完成评论 ### 完成内容 - 完整审计 `POST /api/active-recalls/:id/submit` 从 Controller → Service → Queue → Worker → AI Provider → Result Repository 的真实调用链 - 确认 6 个关键发现(queueName 不一致、无 DTO 校验、knowledgeItemContent 硬编码空字符串等) - 冻结输入 Snapshot Schema(12 字段 + 禁止字段清单 + 区分原则) - 冻结输出 Schema(10 字段 + Zod 验证规则 + 行号引用) - 冻结副作用矩阵(15 个操作,附文件路径和行号) - 冻结状态映射表(5 状态 × 4 列) - 冻结幂等键:`active-recall:<answerId>` - 冻结 Feature Flag 设计:`ACTIVE_RECALL_ENGINE_MODE=legacy|unified` - 冻结回滚流程(6 步 + 3 禁止事项) - 记录 6 个不确定项(其中 3 个已确认,3 个留待后续 Issue 决策) ### 修改文件 - `docs/architecture/m-ai-04-active-recall-migration-contract.md`:从 `???` 占位状态填充为完整审计文档 ### 代码证据(审计溯源) - `active-recall.controller.ts:21`:POST :id/submit 入口,`@Body() body: any` 无 DTO - `active-recall.service.ts:19-39`:submit() → findById + createAnswer + analyze - `active-recall.service.ts:29`:knowledgeItemContent 硬编码 `''` - `ai-analysis.service.ts:12-31`:analyze() → createJob + queue.add - `ai-analysis.repository.ts:17-33`:createJob 写入 lifecycleStatus='queued', queueName='ai-interactive' - `ai-analysis.repository.ts:28` vs `ai-analysis.service.ts:21`:queueName 不一致(DB 写 ai-interactive,BullMQ 入队 ai-analysis) - `queue.constants.ts:1`:QUEUE_AI_ANALYSIS = 'ai-analysis' - `workers/ai-analysis.worker.ts:18-106`:AiAnalysisWorker 完整执行管线 - `modules/ai/workflows/active-recall-analysis.workflow.ts:17-41`:AI 调用封装 - `modules/ai/gateway/ai-gateway.service.ts:40-170`:AiGateway 完整链路 - `modules/ai/prompts/active-recall-analysis.schema.ts:17-28`:输出 Zod Schema - `modules/ai/prompts/active-recall-analysis.prompt.ts:1-27`:System Prompt - `modules/ai/model-router.ts:23-28`:primary tier 路由配置 - `modules/review/review-card.subscriber.ts:11-51`:AIAnalysisCompleted → ReviewCard - `ai-analysis.worker.ts:85-96`:FocusItem 创建副作用 - `ai-analysis.repository.ts:55-69`:AiAnalysisResult 写入 - `schema.prisma:532-566`:ActiveRecallQuestion + ActiveRecallAnswer 模型 - `schema.prisma:568-638`:AiJob (AiAnalysisJob) 模型 - `schema.prisma:679-701`:AiAnalysisResult 模型 - `schema.prisma:703-729`:FocusItem 模型 - `schema.prisma:731-757`:ReviewCard 模型 ### 测试情况 - 已运行命令: - `npm run build` - `npx jest --testPathPatterns="ai-job|ai-runtime" --passWithNoTests` - 结果: - 构建通过 - 20 suites 通过,429 tests 通过,18 skipped,0 failed ### 未完成 / 风险 - 无代码修改,纯文档审计 Issue - 6 个关键发现中 queueName 不一致(HIGH)可能影响后续 M-AI-04-05 的队列路由 - 3 个不确定项留待 M-AI-04-02/03/05 决策 ### 是否建议进入 Review - 是 — 迁移契约已冻结,可以开始执行 M-AI-04-02(注册 Definition 与 Snapshot)
Author
Owner

Blocking 问题修复

审核发现 3 个 Blocking 问题,均已修复:

1. Job Options 事实错误 已修复

  • : 文档声称 removeOnComplete: true, removeOnFail: 500
  • 实际: queue-definitions.ts:64-65removeOnComplete: { count: 1000, age: 24h }, removeOnFail: { count: 5000, age: 7d }
  • 影响: completed Job 保留 24h(非立即删除),failed Job 保留 7d。影响故障排查窗口和 Unified 链路的容量估算。

2. 认证/权限审计缺失 已修复

  • JwtAuthGuard: 确认为全局 APP_GUARDapp.module.ts:184),认证层面安全
  • 跨用户所有权: submit() 不校验 question.userId === userId → P0 安全缺陷,用户 A 可提交用户 B 的问题
  • 修复方式: 记录在关键发现 #2,交由 M-AI-04-05 修复

3. FocusItem knowledgeBaseId 恒为 'unknown' 已修复

  • 原因: ActiveRecallAnalysisResultSchemaactive-recall-analysis.schema.ts:17-28)不含 knowledgeBaseId 字段
  • 结果: result.knowledgeBaseId 恒为 undefined,所有 FocusItem 的 knowledgeBaseId 恒为 'unknown'
  • 严重度: P1(数据完整性问题,影响 Admin 统计和学习推荐)
  • 修复方式: 记录在关键发现 #3,需在 M-AI-04-03 输出 Schema 中增加 knowledgeBaseId 字段

更新后的关键发现分级

# 严重度 发现
1 P0 queueName 不一致
2 P0 跨用户所有权未校验
3 P1 FocusItem knowledgeBaseId 恒为 unknown
4 P1 POST body 无 DTO 校验
5 P2 knowledgeItemContent 硬编码 ''
6 INFO Job 保留策略 24h/7d
7 P2 ModelRouter 无实际 fallback
8 INFO Prompt 硬编码 TypeScript
9 INFO AI 入队失败不阻止返回
## Blocking 问题修复 审核发现 3 个 Blocking 问题,均已修复: ### 1. Job Options 事实错误 ✅ 已修复 - **原**: 文档声称 `removeOnComplete: true, removeOnFail: 500` - **实际**: `queue-definitions.ts:64-65` — `removeOnComplete: { count: 1000, age: 24h }`, `removeOnFail: { count: 5000, age: 7d }` - **影响**: completed Job 保留 24h(非立即删除),failed Job 保留 7d。影响故障排查窗口和 Unified 链路的容量估算。 ### 2. 认证/权限审计缺失 ✅ 已修复 - **JwtAuthGuard**: 确认为全局 `APP_GUARD`(`app.module.ts:184`),认证层面安全 - **跨用户所有权**: `submit()` 不校验 `question.userId === userId` → P0 安全缺陷,用户 A 可提交用户 B 的问题 - **修复方式**: 记录在关键发现 #2,交由 M-AI-04-05 修复 ### 3. FocusItem knowledgeBaseId 恒为 'unknown' ✅ 已修复 - **原因**: `ActiveRecallAnalysisResultSchema`(`active-recall-analysis.schema.ts:17-28`)不含 `knowledgeBaseId` 字段 - **结果**: `result.knowledgeBaseId` 恒为 `undefined`,所有 FocusItem 的 `knowledgeBaseId` 恒为 `'unknown'` - **严重度**: P1(数据完整性问题,影响 Admin 统计和学习推荐) - **修复方式**: 记录在关键发现 #3,需在 M-AI-04-03 输出 Schema 中增加 `knowledgeBaseId` 字段 ### 更新后的关键发现分级 | # | 严重度 | 发现 | |---|--------|------| | 1 | P0 | queueName 不一致 | | 2 | P0 | 跨用户所有权未校验 | | 3 | P1 | FocusItem knowledgeBaseId 恒为 unknown | | 4 | P1 | POST body 无 DTO 校验 | | 5 | P2 | knowledgeItemContent 硬编码 '' | | 6 | INFO | Job 保留策略 24h/7d | | 7 | P2 | ModelRouter 无实际 fallback | | 8 | INFO | Prompt 硬编码 TypeScript | | 9 | INFO | AI 入队失败不阻止返回 |
Author
Owner

Non-blocking 问题修复

3 个 Non-blocking 问题,均已修复:

4. 行号漂移 已修复

  • 文档行56 queue.constants.ts:1 定义 QUEUE_AI_ANALYSIS — 正确
  • 文档行57 queue-definitions.ts:61-66 默认 JobOptions — 正确(已在 Blocking #1 中修正)
  • 文档行行号均已验证对应 commit 5108a9a
  • 修复: 在文档头部增加行号基线声明:⚠️ 行号引用以 commit 5108a9a 为准

5. knowledgeItemContent 虚假注释 已修复

  • active-recall.service.ts:29 注释 // worker picks up content from the analysis workflow 是虚假注释
  • 实际 Worker 不查询 DB,直接使用 Job data 中的 knowledgeItemContent(空字符串)
  • 结果:AI 模型收到的 prompt 中 【知识点原文】 后为空,分析质量严重受损
  • 修复:
    • 严重度从 P2 → HIGH
    • 发现描述补充虚假注释说明和完整传播路径(active-recall.service.ts:29ai-analysis.service.ts:26active-recall-analysis.workflow.ts:18-21

6. ModelRouter 严重度过低 已修复

  • primarystrong tier 的 preferred/fallback 完全相同(deepseek-v4-pro),maxRetries: 3
  • 4 次尝试全部打到同一个模型,fallback 机制形同虚设
  • 生产环境中若 deepseek-v4-pro 故障或限流,重试只会重复失败
  • 修复:
    • 严重度从 P2 → HIGH
    • 发现描述补充具体失败场景说明

更新后的关键发现(最终版)

# 严重度 发现
1 P0 queueName 不一致(DB ai-interactive vs BullMQ ai-analysis
2 P0 跨用户所有权未校验
3 P1 FocusItem knowledgeBaseId 恒为 unknown
4 P1 POST body 无 DTO 校验
5 HIGH knowledgeItemContent 硬编码 '' + 虚假注释
6 INFO Job 保留策略 24h/7d
7 HIGH ModelRouter fallback 形同虚设(4 次同模型重试)
8 INFO Prompt 硬编码 TypeScript
9 INFO AI 入队失败不阻止返回
## Non-blocking 问题修复 3 个 Non-blocking 问题,均已修复: ### 4. 行号漂移 ✅ 已修复 - 文档行56 `queue.constants.ts:1` 定义 `QUEUE_AI_ANALYSIS` — 正确 - 文档行57 `queue-definitions.ts:61-66` 默认 JobOptions — 正确(已在 Blocking #1 中修正) - 文档行行号均已验证对应 commit `5108a9a` - **修复**: 在文档头部增加行号基线声明:`⚠️ 行号引用以 commit 5108a9a 为准` ### 5. knowledgeItemContent 虚假注释 ✅ 已修复 - `active-recall.service.ts:29` 注释 `// worker picks up content from the analysis workflow` 是虚假注释 - 实际 Worker 不查询 DB,直接使用 Job data 中的 `knowledgeItemContent`(空字符串) - 结果:AI 模型收到的 prompt 中 `【知识点原文】` 后为空,分析质量严重受损 - **修复**: - 严重度从 P2 → **HIGH** - 发现描述补充虚假注释说明和完整传播路径(`active-recall.service.ts:29` → `ai-analysis.service.ts:26` → `active-recall-analysis.workflow.ts:18-21`) ### 6. ModelRouter 严重度过低 ✅ 已修复 - `primary` 和 `strong` tier 的 preferred/fallback 完全相同(`deepseek-v4-pro`),`maxRetries: 3` - 4 次尝试全部打到同一个模型,fallback 机制形同虚设 - 生产环境中若 deepseek-v4-pro 故障或限流,重试只会重复失败 - **修复**: - 严重度从 P2 → **HIGH** - 发现描述补充具体失败场景说明 ### 更新后的关键发现(最终版) | # | 严重度 | 发现 | |---|--------|------| | 1 | **P0** | queueName 不一致(DB `ai-interactive` vs BullMQ `ai-analysis`) | | 2 | **P0** | 跨用户所有权未校验 | | 3 | **P1** | FocusItem knowledgeBaseId 恒为 unknown | | 4 | **P1** | POST body 无 DTO 校验 | | 5 | **HIGH** | knowledgeItemContent 硬编码 '' + 虚假注释 | | 6 | INFO | Job 保留策略 24h/7d | | 7 | **HIGH** | ModelRouter fallback 形同虚设(4 次同模型重试) | | 8 | INFO | Prompt 硬编码 TypeScript | | 9 | INFO | AI 入队失败不阻止返回 |
Author
Owner

追加 Non-blocking 问题修复

7. audioFileId 非文本答案路径 已修复

  • ActiveRecallAnswer 模型包含 audioFileIdanswerTypeschema.prisma:554-556),但当前 submit() 仅接受 { answerText }
  • 修复:
    • 新增关键发现 #10(P2)
    • 不确定项追加:非文本答案在 Unified 链路的处理方式(语音转文本 vs 独立音频分析 Executor)

8. Worker stall 恢复的重复 AiAnalysisResult 风险 已修复

  • maxStalledCount: 1queue-definitions.ts:58)意味着 stalled job 被重新投递 1 次
  • AiAnalysisResult@@unique([jobId]) 约束(schema.prisma:679-700:只有 @@index([jobId])
  • 场景:AI 调用成功 → createResult() 写入 → Worker 崩溃 → BullMQ 重新投递 → 再次 createResult() → 同一 jobId 产生两条 Result
  • 当前幂等键防止重复 Job 创建,但不防止重复 Result 写入
  • 修复:
    • 新增关键发现 #11(HIGH)
    • 不确定项追加:Unified 链路的 ActiveRecallProjector 必须在 Projector 层提供幂等保证

最终关键发现汇总(11 条)

# 严重度 发现 指派
1 P0 queueName 不一致 M-AI-04-05
2 P0 跨用户所有权未校验 M-AI-04-05
3 P1 FocusItem knowledgeBaseId 恒为 unknown M-AI-04-03
4 P1 POST body 无 DTO 校验 M-AI-04-05
5 HIGH knowledgeItemContent 硬编码 '' + 虚假注释 M-AI-04-03
6 INFO Job 保留策略 24h/7d
7 HIGH ModelRouter fallback 形同虚设
8 INFO Prompt 硬编码 TypeScript
9 INFO AI 入队失败不阻止返回
10 P2 audioFileId 非文本答案路径未定义 M-AI-04-03/04
11 HIGH Worker stall 恢复 → 重复 AiAnalysisResult M-AI-04-04
## 追加 Non-blocking 问题修复 ### 7. audioFileId 非文本答案路径 ✅ 已修复 - `ActiveRecallAnswer` 模型包含 `audioFileId` 和 `answerType`(`schema.prisma:554-556`),但当前 `submit()` 仅接受 `{ answerText }` - **修复**: - 新增关键发现 #10(P2) - 不确定项追加:非文本答案在 Unified 链路的处理方式(语音转文本 vs 独立音频分析 Executor) ### 8. Worker stall 恢复的重复 AiAnalysisResult 风险 ✅ 已修复 - `maxStalledCount: 1`(`queue-definitions.ts:58`)意味着 stalled job 被重新投递 1 次 - `AiAnalysisResult` 无 `@@unique([jobId])` 约束(`schema.prisma:679-700`:只有 `@@index([jobId])`) - 场景:AI 调用成功 → `createResult()` 写入 → Worker 崩溃 → BullMQ 重新投递 → 再次 `createResult()` → 同一 jobId 产生两条 Result - 当前幂等键防止重复 Job 创建,但不防止重复 Result 写入 - **修复**: - 新增关键发现 #11(HIGH) - 不确定项追加:Unified 链路的 `ActiveRecallProjector` 必须在 Projector 层提供幂等保证 ### 最终关键发现汇总(11 条) | # | 严重度 | 发现 | 指派 | |---|--------|------|------| | 1 | **P0** | queueName 不一致 | M-AI-04-05 | | 2 | **P0** | 跨用户所有权未校验 | M-AI-04-05 | | 3 | **P1** | FocusItem knowledgeBaseId 恒为 unknown | M-AI-04-03 | | 4 | **P1** | POST body 无 DTO 校验 | M-AI-04-05 | | 5 | **HIGH** | knowledgeItemContent 硬编码 '' + 虚假注释 | M-AI-04-03 | | 6 | INFO | Job 保留策略 24h/7d | — | | 7 | **HIGH** | ModelRouter fallback 形同虚设 | — | | 8 | INFO | Prompt 硬编码 TypeScript | — | | 9 | INFO | AI 入队失败不阻止返回 | — | | 10 | **P2** | audioFileId 非文本答案路径未定义 | M-AI-04-03/04 | | 11 | **HIGH** | Worker stall 恢复 → 重复 AiAnalysisResult | M-AI-04-04 |
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#296
No description provided.