- 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)
73 lines
3.3 KiB
Markdown
73 lines
3.3 KiB
Markdown
# QA-6 Report — Build & Deploy Readiness
|
|
|
|
> Worker: Explore agent · Lead review: 승인
|
|
|
|
## Summary
|
|
- **verdict**: REQUEST_CHANGES
|
|
- critical: 4, major: 3, minor: 4
|
|
|
|
## Critical (배포 차단)
|
|
|
|
### [critical] C1 Prisma migrations 디렉토리 비어있음
|
|
- **Location**: `backend/prisma/migrations/`
|
|
- **Impact**: `prisma migrate deploy` 가 적용할 SQL 이 없다. Dev VM 새 DB 에 스키마 생성 불가.
|
|
- **Suggested fix**: 로컬에서 `pnpm prisma migrate dev --name init` 한 번 돌려서 `migrations/` 생성 + commit. 프로덕션에서는 `prisma migrate deploy` 만.
|
|
|
|
### [critical] C2 `postinstall` hook 부재 → Prisma Client 미생성
|
|
- **Location**: `backend/package.json`
|
|
- **Evidence**: scripts 에 `postinstall` 없음. Fresh `pnpm install` 후 `@prisma/client` import 가 비어있는 기본 client 로 연결.
|
|
- **Suggested fix**: `"postinstall": "prisma generate"` 추가. 또는 `prisma:deploy` 스크립트에서 generate 를 묶어 실행.
|
|
|
|
### [critical] C3 Lockfile 부재
|
|
- **Location**: repo 루트
|
|
- **Impact**: `pnpm install --frozen-lockfile` 불가. 재현 빌드 불가, 버전 drift.
|
|
- **Suggested fix**: 로컬에서 `pnpm install` 한 번 실행해서 `pnpm-lock.yaml` 생성 + commit. 또는 각 workspace 별로.
|
|
|
|
### [critical] C4 PM2 ecosystem 설정 파일 부재
|
|
- **Location**: repo 루트
|
|
- **Impact**: 이전 세션에서 언급한 `reloop-api` / `reloop-web` 프로세스 정의가 없다. 수동 기동 가능하지만 restart 정책 / env 경로 / working directory 미기록.
|
|
- **Suggested fix**: `ecosystem.config.js` 생성:
|
|
```js
|
|
module.exports = {
|
|
apps: [
|
|
{ name: 'reloop-api', cwd: './backend', script: 'dist/main.js',
|
|
env: { NODE_ENV: 'production' }, max_memory_restart: '512M' },
|
|
{ name: 'reloop-web', cwd: './frontend', script: 'node_modules/next/dist/bin/next',
|
|
args: 'start -p 3000', env: { NODE_ENV: 'production' } },
|
|
],
|
|
};
|
|
```
|
|
|
|
## Major
|
|
|
|
### [major] M1 `frontend/next.config.js` 에 `output: 'standalone'` 없음
|
|
- **Impact**: `.next/standalone/server.js` 경로 사용 불가 → PM2 에서 `next start` 호출해야 하므로 node_modules 전체 동반 필요.
|
|
- **Suggested fix**: `nextConfig.output = 'standalone'` 추가.
|
|
|
|
### [major] M2 `frontend/.env.example` 부재
|
|
- **Impact**: `NEXT_PUBLIC_API_URL` 이 build-time 변수라는 점이 문서화되지 않음.
|
|
- **Suggested fix**: `.env.example` 생성해서 key 와 의미 설명.
|
|
|
|
### [major] M3 root `README.md` + `packageManager` 필드 없음
|
|
- **Impact**: 신규 환경 셋업 방법이 기록 안 됨. pnpm 버전 drift.
|
|
- **Suggested fix**: README 에 bootstrap 순서 작성, `"packageManager": "pnpm@9.0.0"` pin.
|
|
|
|
## Minor
|
|
- backend/frontend `.eslintrc.json` 부재.
|
|
- `.env.example` 에 `NODE_ENV` 키가 있지만 런타임 미사용.
|
|
- `package.json` 에 `engines.node` 필드 부재.
|
|
- `frontend/next.config.js` 에 `compiler.styledComponents: true` 만 있고 `experimental` 플래그 정비 안 됨.
|
|
|
|
## PLAN.md Phase 5 교차 체크
|
|
|
|
| Phase 5 item | 상태 |
|
|
|---|---|
|
|
| 차트 (recharts ForgetCurveChart) | DONE |
|
|
| PWA manifest | PENDING |
|
|
| PM2 스왑 | PENDING (C4 로 차단됨) |
|
|
| QA | 진행 중 (본 실행) |
|
|
|
|
## Verdict
|
|
|
|
**REQUEST_CHANGES** — critical 4건 중 어느 하나라도 해결하지 않으면 Dev VM 배포 불가.
|