171 lines
7.2 KiB
Markdown
171 lines
7.2 KiB
Markdown
# 커뮤니티 댓글 직접 답글 Phase 1 리뷰
|
|
|
|
## 1. 리뷰 정보
|
|
|
|
| 항목 | 내용 |
|
|
|---|---|
|
|
| 리뷰 대상 | Phase 1 / `P1-T1`, `P1-R1`, `P1-GATE` |
|
|
| 기준 commit 또는 working tree | `e82e209300d2c30843b6a2ef2c9e126ade6bba63` 기반 working tree |
|
|
| 리뷰 일자 | 2026-08-06 |
|
|
| 리뷰어 | Sisyphus, 독립 goal·품질·보안·컨텍스트·visual QA reviewer |
|
|
| 기준 문서 | [prd.md](../prd.md), [api-contract.md](../api-contract.md), [plan-task.md](../plan-task.md) |
|
|
| 리뷰 상태 | 판정 완료 |
|
|
|
|
## 2. 리뷰 목적과 범위
|
|
|
|
### 목적
|
|
|
|
- `CCR-001~006`과 Community 첫·추가 직접 답글 journey가 구현됐는지 확인한다.
|
|
- API·schema·application mock·dependency 변경 없이 기존 2단계 댓글 경계와 권한을 유지하는지 확인한다.
|
|
- TDD, 자동 Gate, 실제 Chromium과 문서 기록이 완료 조건과 일치하는지 판정한다.
|
|
|
|
### 포함 범위
|
|
|
|
- 코드: `src/features/comments/components/CommentThread.tsx`
|
|
- 테스트: `src/features/comments/tests/comment-thread.test.tsx`, `tests/e2e/comments.spec.ts`
|
|
- 문서: `CCR-001~006`, Community 댓글 API Contract, `P1-T1`, `P1-R1`, `P1-GATE`
|
|
- 수동 검증: Chromium mock mode, keyboard-only, 1280px, 320px, 200% zoom, CJK·수평 overflow
|
|
|
|
### 제외 범위
|
|
|
|
- 실제 개발 API integration, 새 endpoint·schema·mock store, 답글 수정·삭제·pagination 정책 변경
|
|
- 3단계 댓글, optimistic update, form 상시 노출
|
|
|
|
## 3. 판정 기준
|
|
|
|
### 심각도
|
|
|
|
| 심각도 | 기준 |
|
|
|---|---|
|
|
| Blocker | 보안·데이터 손실 위험, 핵심 journey 불능, 완료 판정 무효 |
|
|
| High | 확정 요구사항·API Contract 위반 또는 주요 회귀 |
|
|
| Medium | 제한 조건의 기능·접근성·복구 문제 |
|
|
| Low | 비핵심 유지보수성·문서 정합성 문제 |
|
|
|
|
### 상태
|
|
|
|
| 상태 | 의미 | 후속 처리 |
|
|
|---|---|---|
|
|
| 후보 | 근거를 발견했지만 판정 전 | 재현 후 상태 변경 |
|
|
| 확정 | 코드·test·문서로 문제 확인 | 회귀 Task 전환 |
|
|
| 오탐 | 실제 실행 경로나 요구사항 위반이 아님 | 판정 근거를 보존하고 종료 |
|
|
| 보류 | 외부 계약·환경·제품 결정 필요 | 담당·재개 조건 기록 |
|
|
| 수정 완료 | 수정과 관련 검증 완료 | 검증 결과 누적 |
|
|
|
|
## 4. 검토한 근거
|
|
|
|
### 문서와 코드
|
|
|
|
- 요구사항: `CCR-001~006`
|
|
- API Contract: 직접 답글 GET, Community 댓글 POST, 2단계 불변식
|
|
- 계획: `P1-T1`, `P1-R1`, `P1-GATE`
|
|
- 코드: `CommentThread.tsx`의 `replyActionLabel`, `toggleReplies()`, `createReply()`
|
|
- 테스트: `CommentThread creates a first Community reply...`, `Community sheet comments keep two-level controls usable at 320px`
|
|
|
|
### 실행 환경
|
|
|
|
```text
|
|
OS: macOS
|
|
Node: v24.12.0
|
|
npm: 11.7.0
|
|
Browser/viewport: Playwright Chromium, 1280x900, 320x640, CSS zoom 200%
|
|
환경 변수: VITE_API_MODE=mock
|
|
```
|
|
|
|
### 실행한 검증
|
|
|
|
| 명령 또는 수동 검증 | 결과 | 핵심 증거 |
|
|
|---|---|---|
|
|
| `npm run test:run -- src/features/comments/tests/comment-thread.test.tsx` | 성공 | `8/8` |
|
|
| `npm run test:run -- src/features/comments` | 성공 | `15/15` |
|
|
| `npm run e2e:mock -- tests/e2e/comments.spec.ts --project=chromium` | 성공 | `3/3`; 2102 빈 reply, 첫·두 답글, payload, 2단계 경계 |
|
|
| `npm run typecheck` | 성공 | exit 0 |
|
|
| `npm run lint` | 성공 | exit 0 |
|
|
| `npm run build:dev` | 성공 | Vite build exit 0; 기존 500kB chunk warning만 발생 |
|
|
| `git diff --check` | 성공 | 출력 없음 |
|
|
| 실제 Chromium keyboard journey | 성공 | 답글 action·textarea keyboard 진입, 첫·두 답글 표시, input 초기화, 중첩 action 0건 |
|
|
| 1280px·320px·200% visual QA | 성공 | 수평 overflow 없음, CJK clipping·고아줄 없음, 독립 visual reviewer PASS |
|
|
|
|
## 5. 발견 사항 요약
|
|
|
|
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|
|
|---|---|---|---|---|---|
|
|
| `CCR-REV-P1-001` | High | 오탐 | E2E route fixture가 root 2102 답글을 잘못 분류한다 | `P1-R1` | 없음 |
|
|
|
|
확정 발견 사항 없음.
|
|
|
|
## 6. 발견 사항 상세
|
|
|
|
### CCR-REV-P1-001 — E2E route fixture root 분류 후보
|
|
|
|
- **심각도:** High
|
|
- **상태:** 오탐
|
|
- **관련 요구사항:** `CCR-002`, `CCR-004~005`
|
|
- **관련 계약:** Community 직접 답글 GET·POST, 2단계 불변식
|
|
- **소유 Task:** `P1-R1`
|
|
|
|
**관찰 내용**
|
|
|
|
`tests/e2e/comments-test-support.ts`는 단일 `replyRootId`만 replies로 분류하지만,
|
|
필수 mock E2E에서는 이 Playwright route fixture가 응답을 소유하지 않는다.
|
|
|
|
**근거**
|
|
|
|
- `playwright.config.ts`는 mock E2E를 `VITE_API_MODE=mock`으로 실행한다.
|
|
- 앱은 렌더 전에 `src/shared/mocks/browser.ts`의 `setupWorker(...)`를 시작한다.
|
|
- Browser MSW handler·store는 `commentId`와 `parentId`로 root 2102 답글을 분리한다.
|
|
- 기존 E2E route fixture를 변경하지 않은 상태에서 2102 초기 reply region의 root 댓글 0건, 첫·두 답글 각 1건, 중첩 action 0건과 Chromium `3/3`을 반복 확인했다.
|
|
- 별도 브라우저 probe에서 `page.route` 호출 0회와 Community mock 요청 9회를 관찰했다.
|
|
|
|
**재현 또는 검증 절차**
|
|
|
|
1. `VITE_API_MODE=mock`으로 `comments.spec.ts` Chromium을 실행한다.
|
|
2. root 2102의 답글 영역을 열고 다른 root 댓글이 없음을 확인한다.
|
|
3. 같은 root에 첫·두 번째 답글을 등록하고 Sheet를 다시 연다.
|
|
4. 두 답글이 region에 각 1건 표시되고 중첩 답글 action이 없음을 확인한다.
|
|
|
|
**영향**
|
|
|
|
필수 mock E2E와 제품 동작에는 영향이 없다. Server-mode 전용 test route helper의
|
|
일반화는 이번 기능 범위와 실행 경로 밖이다.
|
|
|
|
**권장 조치**
|
|
|
|
없음. 실행되지 않는 fixture를 speculative하게 변경하지 않는다.
|
|
|
|
**판정 기록**
|
|
|
|
- 2026-08-06 — 코드 형태만 근거로 확정 후보로 분류했다.
|
|
- 2026-08-06 — mock 요청 소유권, 기존 fixture 상태의 E2E, 실제 브라우저를 대조해 오탐으로 정정했다.
|
|
|
|
## 7. 확정 항목의 plan·goal 전환
|
|
|
|
전환 항목 없음. `CCR-REV-P1-001`은 `P1-R1`에서 오탐으로 판정됐다.
|
|
|
|
## 8. 리뷰 종료 판정
|
|
|
|
| 판정 항목 | 결과 | 근거 |
|
|
|---|---|---|
|
|
| 리뷰 범위 전체 확인 | 충족 | 요구사항·계약·코드·test·실제 Chromium·visual QA 확인 |
|
|
| 후보 항목 판정 완료 | 충족 | `CCR-REV-P1-001` 오탐 판정 |
|
|
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
|
|
| 보류 항목의 담당·재개 조건 기록 | 해당 없음 | 보류 없음 |
|
|
| 검증 명령과 결과 기록 | 충족 | 자동·수동 검증 표와 `plan-task.md` Progress 기록 |
|
|
|
|
**최종 결론:** 확정 발견 사항 없음
|
|
|
|
**남은 항목:** 실제 개발 API integration은 이번 mock 기능 Gate 범위 밖이다.
|
|
|
|
## 9. 수정 후 검증 기록
|
|
|
|
### 1차 리뷰 후보 검증 — 2026-08-06
|
|
|
|
- 무엇을: `CCR-REV-P1-001`의 실제 mock E2E 영향 여부를 검증했다.
|
|
- 왜: 실행되지 않는 route fixture를 수정하면 범위를 불필요하게 확장할 수 있다.
|
|
- 어떻게:
|
|
- 기존 fixture 상태의 Chromium E2E — `3/3` 성공
|
|
- Comments Vitest — `15/15` 성공
|
|
- typecheck·lint·`git diff --check` — exit 0
|
|
- 실제 Chromium·visual QA — 첫·추가 답글, keyboard, 1280px·320px·200% PASS
|
|
- 남은 항목: 없음
|