- QA-1 Backend API contract: APPROVE (minor type contract 2) - QA-2 Persona forget algorithm: APPROVE (math verified) - QA-3 Auth & security: REQUEST_CHANGES - email normalize missing / JWT revalidate / secret fallback / whitelist - QA-4 Frontend runtime: REQUEST_CHANGES - review double-submit race / subjects/[id] NaN / history error states / native alerts - QA-5 Prisma & transactions: REQUEST_CHANGES - reviews.submit snapshot outside tx / tag cascade data loss / iteration race - QA-6 Build & deploy: REQUEST_CHANGES - missing migrations, postinstall, lockfile, PM2 ecosystem Follow-up fix proposals saved to .claude/state/pending-fix-proposals.jsonl (18 tickets)
27 lines
1.1 KiB
JSON
27 lines
1.1 KiB
JSON
{
|
|
"task_id": "QA-5",
|
|
"title": "Prisma schema & transaction integrity",
|
|
"goal": "데이터 모델 제약, cascade, 동시성 경합 가능성 검증",
|
|
"checks": [
|
|
"schema.prisma의 모든 model: PK, FK, unique, index, default",
|
|
"ReviewSchedule status enum 전이 가능성 (pending → done/skipped/expired)",
|
|
"SkillSnapshot @@unique([userId, tagId]) 활용",
|
|
"onDelete 규칙 (User 삭제 시 cascade, Subject 삭제 시 StudyLog/tag 처리)",
|
|
"study-logs.service.ts create() transaction: log → snapshot upsert → schedule — 모두 tx 안인지",
|
|
"reviews.service.ts submit() transaction: snapshot upsert가 tx 바깥(race 가능성)",
|
|
"seed.ts가 idempotent한지 (reset 후 재실행 안전성)",
|
|
"StudyResult enum / Persona / ReviewIntensity가 Prisma와 frontend 모두 일치",
|
|
"ReviewSchedule iteration 증가 규칙",
|
|
"baseCorrectRate null 처리 일관성"
|
|
],
|
|
"non_goals": [
|
|
"DB 엔진 교체",
|
|
"마이그레이션 히스토리 재작성"
|
|
],
|
|
"runtime_validation": [],
|
|
"browser_validation": [],
|
|
"risk_flags": ["needs-spike"],
|
|
"reviewer_profile": "static",
|
|
"deliverable": ".qa/QA-5.md"
|
|
}
|