[M-AI-02-02] 冻结 AiJob Expand Schema 与迁移契约 #274
Closed
opened 2026-06-19 23:30:03 +08:00 by wangdl
·
4 comments
Labels
Clear labels
adr
Area: adr
architecture
Area: architecture
area:activity
活动/统计
area:admin
管理后台
area:admin-api
area:ai
AI/RAG
area:ai-runtime
AI Runtime / AI 分析体系相关
area:analytics
area:api
API 接口
area:auth
认证与授权
area:cos
对象存储
area:database
数据库/Migration
area:import
文件导入/解析
area:knowledge
知识库/知识点
area:learning-info
area:learning-session
area:quiz
测验/自测
area:reading-event
area:reading-progress
area:review
复习系统
area:security
安全相关
audit
Area: audit
audit:api-admin-info
audit:api-info
audit:planned
已完成宏观规划,尚未代码审查
audit:reviewed
backend
Area: backend
billing
Area: billing
blocked-by:api-info-aggregation
blocked-by:api-info-core
blocked-by:api-info-ops
blocked-by:api-info-schema
blocked-by:processor
blocked-by:schema
compatibility
Area: compatibility
gate
Area: gate
infrastructure
Area: infrastructure
priority:p0
最高优先级,阻塞发布
priority:p1
高优先级,里程碑必需
priority:p2
中优先级,后续版本
prisma
Area: prisma
release
Area: release
repo:api
API 仓库 Issue
status:blocked
被阻塞
status:done
已完成
status:partial
status:todo
type:aggregation
type:bug
缺陷修复
type:design
设计
type:docs
文档
type:feature
新功能
type:migration
type:refactor
重构
type:test
work:admin-api
work:aggregation
work:api
work:artifact
题目/卡片产物
work:audit
work:circuit-breaker
熔断
work:contract
work:design
架构/协议设计工作
work:docs
work:export
work:extend-existing
work:internal-api
Runtime 内部接口
work:job
Job 调度相关
work:new-module
work:new-table
work:ops
work:query
work:quota
额度/限流
work:schema
Prisma Schema 设计
work:security
work:service
Service 层实现
work:snapshot
Snapshot 构建
work:test
Milestone
No items
No Milestone
M-AI-02 统一 AiJob 数据库 Expand
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wangdl/api-server#274
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
依赖
目标
根据真实审计冻结本批最终 Schema,后续 Issue 不得自行新增字段、状态、表或索引。
输出文档
新增:
必须冻结
1. 物理表策略
AiJob的@@map;2. 新字段定义
逐字段冻结:
计划字段至少覆盖:
字段可根据 01 审计调整,但调整必须在 ADR 中解释。
3. 索引
至少评估:
4. 删除策略
明确:
5. Migration 策略
验收
ADR 合并后,后续 Issue 只能按 ADR 实现。
[M-AI-02] 冻结 AiJob Expand Schema 与迁移契约to [M-AI-02-02] 冻结 AiJob Expand Schema 与迁移契约开发完成评论
完成内容
AiJobPrisma model 的完整 Schema(34 个字段),基于@@map("AiAnalysisJob")保持物理表名不变lifecycleStatus状态映射表(pending/locked/running/succeeded/failed/cancelled)关键设计决策
AiAnalysisJob:避免 rename 风险和 37 处测试 SQL 同步AiJob:@@map映射物理表completedAt→finishedAt:语义统一(与startedAt配对)errorMessage→internalErrorMessage:与新增publicErrorMessage区分retryCount→attemptCount+maxRetryCount→maxAttempts:命名一致性timeoutSeconds→timeoutMs:与其他毫秒级字段统一修改文件
docs/architecture/adr-002-ai-job-database-expand.md(新增,386 行)测试情况
npx jest --testPathPatterns="ai-analysis|ai-runtime" --passWithNoTests未完成 / 风险
是否建议进入 Review
N1 修复:状态映射
processing → locked已修正为processing → running修正内容
processing→lockedprocessing→running;locked单独成行标注「旧系统无对应」WHEN 'processing' THEN 'locked'WHEN 'processing' THEN 'running'shadowMap/reverseShadowMap双向映射语义依据
processing:AiAnalysisWorker.process()第 48 行updateJobStatus(jobId, 'processing')→ Worker 正在执行running:heartbeat 确认后 → Runtime 正在执行locked:Runtime POST /lock 成功但尚未 heartbeat → 已被 claim 但未开始执行(旧系统由 BullMQ 内部管理,无显式对应)Reaper 安全
若映射为
locked,JobReaperService 会将旧 Worker 正在执行的任务视为「无 heartbeat」而在lockUntil过期后错误清扫回pending(重复执行)。映射为running可避免此问题。N2 修复:"不 rename" 声明已精确化
修正
原声明「不 drop、不 rename、不重建」已修正为:
两处列重命名的安全保证
completedAt→finishedAtstartedAt配对统一;旧名 "completed" 与lifecycleStatus='succeeded'语义冲突errorMessage→internalErrorMessagepublicErrorMessage列,需区分内部/对外错误什么不变
AiAnalysisJob不变(PrismaAiJob+@@map映射)sessionId/answerId保留但标记废弃)N3 修复:过渡期
status列已加入 Prisma 模型修正
三处修改:
status String? @db.VarChar(32),标注@deprecated+ M-AI-05 移除status是物理表已有列,旧代码AiAnalysisRepository.updateJobStatus()直接读写,Shadow Write(§4)依赖此字段在 Prisma 层面的暴露status行,标注「过渡期保留(Shadow Write 必需)」实现路径