# SPRINT-004 QA Review — Iteration 1 - **검증일시:** 2026-04-04 03:16 UTC - **검증자:** 다랑이 (Evaluator) - **결과:** ❌ FAILED (blocking 3건) ## 검증 항목 | 항목 | 결과 | |------|------| | npm install | ✅ | | prisma generate | ✅ | | npm test (backend) | ✅ 22/22 pass | | npm run build (backend) | ✅ | | npm run build (frontend) | ✅ 11 routes | ## Sprint 003 non-blocking 수정 확인 | 항목 | 상태 | |------|------| | API Key Guard (passport-http-bearer) | ✅ | | Helmet 적용 | ✅ | | SisterNamePipe (name 검증) | ✅ | | lib/sisters.ts 공통 함수 추출 | ✅ | ## 🔴 Blocking 이슈 ### B1: UpdateHarnessDto class-validator 미적용 - **파일:** `admin/admin.controller.ts` - **문제:** `@IsString() @IsNotEmpty()` 없음 → 빈 content로 하네스 파일 삭제 가능 - **수정:** `@IsString() @IsNotEmpty() @MaxLength(50000)` 추가 ### B2: getSisterLogs lines 파라미터 상한 없음 - **파일:** `admin/admin.service.ts` - **문제:** `lines=999999999` → journalctl/tail 메모리 폭발 - **수정:** `Math.min(Math.max(parseInt(lines, 10) || 100, 1), 500)` clamp ### B3: CORS methods에 PUT 누락 - **파일:** `main.ts` - **문제:** `PUT /api/admin/harness/:name/:file`가 preflight 차단 - **수정:** methods 배열에 `'PUT'` 추가 ## Non-blocking 이슈 | ID | 이슈 | 심각도 | |----|------|--------| | N1 | 셸 escape에서 null byte 미처리 | Medium | | N2 | localStorage 평문 API Key | Medium | | N3 | CORS 에러에 origin 노출 | Low | | N4 | resetSisterSession catch에서 activity.log 누락 | Low | | N5 | /api/sisters 비인증 노출 (config/sessions 포함) | Low |