[M-AI-05-04] 实现 Feynman Projector 与复习产物原子写入 #307
Closed
opened 2026-06-21 15:53:34 +08:00 by wangdl
·
1 comment
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-05 Feynman 与 ReviewCard 可靠链路
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wangdl/api-server#307
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?
类型 / 标签
风险等级
P0(非原子写入会导致部分产物残留;幂等失效会导致重复 FocusItem/ReviewCard)
依赖
目标
将验证后的 Feynman 结果原子写入现有业务模型,并根据旧业务契约创建 FocusItem 和 ReviewCard。
Projector
新增
FeynmanProjector,输入:job、snapshot、validatedOutput、transactionClient。事务内容
在一个事务中完成:
如果旧业务还包含学习统计或其他副作用,仅实现 M-AI-05-01 已确认的内容。
Artifact
至少评估:
analysis_result、focus_item、review_card。每个真实业务实体必须有对应 Artifact。不得为未创建的实体写虚假 Artifact。幂等设计
重复执行同一 Job:Evaluation Result 数量不增加、FocusItem 数量不增加、ReviewCard 数量不增加、Artifact 数量不增加、学习统计不重复累计。
优先使用 deterministic ID、数据库唯一约束、upsert、createMany(skipDuplicates)、事务级幂等。禁止仅依赖
find → 没有 → create作为并发保证。失败回滚
必须验证:
兼容
确认旧查询接口可以读取 Unified Projector 写入的结果与复习产物。
影响范围
src/modules/ai-job/projector/、src/modules/feynman/、src/modules/review/、src/modules/focus-item/、src/modules/ai-job/artifact/验收标准
analysis_result、focus_item、review_card建议执行顺序
第 4 个执行(依赖 03)
开发完成评论
完成内容
FeynmanProjector(implementsResultProjector,key=feynman_evaluation_projector)fe_<jobId>(幂等)'unknown')RESULT_PROJECTORSmulti-provider(ProjectionExecutor自动发现)幂等策略
事务原子性
ProjectionExecutor在同一事务中调用修改文件
src/modules/ai-job/feynman-projector.ts(新增,178 行)src/modules/ai-job/feynman-projector.spec.ts(新增,340 行)src/modules/ai-job/ai-job.module.ts(修改,+3 行:1 import + 1 provider + RESULT_PROJECTORS 工厂扩展)代码证据
feynman-projector.ts:33— key ='feynman_evaluation_projector'feynman-projector.ts:35-57— 入口幂等检查(已有 Artifact → 直接返回)feynman-projector.ts:63-96— AiAnalysisResult upsert + Artifact(deterministic ID)feynman-projector.ts:102-143— FocusItem 创建循环(findFirst 去重 + knowledgeBaseId 修复 + knowledgeItemId)feynman-projector.ts:155-170—deterministicResultId()helper(fe_前缀)feynman-projector.ts:172-185—upsertArtifact()helper(P2002 幂等)测试覆盖(16 tests)
与 ActiveRecallProjector 的关键差异
focusItems结构化数组(title/reason/suggestion/priority)weaknesses字符串数组(仅 title)ar_fe_'unknown')未完成 / 风险
ai.analysis.completed事件)feynman_evaluationjobType 的执行分派(当前只支持active_recall+ 默认路径)是否建议进入 Review