52 lines
1.6 KiB
Markdown
52 lines
1.6 KiB
Markdown
# 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 |
|