7.9 KiB
7.9 KiB
Phase 3 리뷰 보고서
1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 3 / Task 3.1~3.5 |
| 기준 commit 또는 working tree | 구현 commit 4f348c36, 보정 commit 6da2378b, 현재 5123494e 기준 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | PRD Feature A~C, plan-task.md Phase 3 |
| 리뷰 상태 | 보완 완료 |
2. 리뷰 목적과 범위
- 최근 7일 UTC half-open window, 후원·팬Talk 집계, DB-side 점수·부스트, 후보·정렬·limit 구현을 확인한다.
- 완료 처리된 Task의 테스트 증거가 명시된 경계 조건을 직접 고정하는지 확인한다.
3. 판정 기준
- 구현 결함과 완료 증거 누락을 구분한다. 이번 발견은 현재 코드 동작 위반이 아니라 회귀 테스트 근거 누락으로 Low다.
4. 검토한 근거
- 코드:
RecommendationSnapshotRefreshService.kt,RecommendationSnapshotWindowPolicy.kt,DefaultHomeRecommendationQueryRepository.kt - 테스트:
RecommendationSnapshotRefreshServiceTest,DefaultHomeRecommendationQueryRepositoryTest,RecommendationSnapshotPersistenceAdapterTest - 이력:
git show 4f348c36,git show 6da2378b - 사용자 지시에 따라 Gradle compile/test는 실행하지 않았다.
5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
REV-P3-001 |
Low | 보완 완료 | Task 3.5의 일부 후보·상위 16개·동점 정렬 완료 증거가 직접 테스트로 고정되지 않았다 | Task R3.1 | P3-R1 |
6. 발견 사항 상세
REV-P3-001 — Task 3.5의 일부 완료 증거가 직접 테스트로 고정되지 않았다
- 심각도: Low
- 상태: 확정
- 관련 요구사항: Feature A·C Edge Cases, Task 3.5
- 소유 Task: Task R3.1
관찰 내용
현재 테스트는 donation 종류·상태·half-open 경계, distinct 후원 수, 점수/부스트, 데뷔 이력 없음과 limit = 1 점수 우선순위를 검증한다. 그러나 Task 3.5에 명시된 다음 계약의 직접 테스트는 확인되지 않았다.
- 실제 데뷔 이력은 있으나 후원·팬Talk가 모두 0인 후보 제외
- 미래 데뷔 이력만 있는 후보와 비활성 크리에이터 제외
- 17개 이상 후보의 상위 16개 제한
CHEER_CREATOR저장 row의 동점randomTieBreaker오름차순 조회
코드는 해당 조건을 구현하고 있어 현재 런타임 결함으로 판정하지 않는다.
영향
후속 native SQL 수정에서 후보 조건·저장 수·동점 순서가 회귀해도 focused test가 이를 직접 잡지 못할 수 있다.
권장 조치
프로덕션 코드를 선제 변경하지 않고 누락된 경계 테스트를 먼저 추가하며, 실제 실패가 드러나는 조건만 최소 수정한다.
판정 기록
- 2026-07-31 — 테스트명·fixture·assertion과 Task 3.5 체크리스트를 대조해 확정했다.
- 2026-07-31 — 후보 제외, 상위 16개 제한,
CHEER_CREATOR동점randomTieBreaker오름차순 조회 테스트를 추가했다. focused repository/persistence test는BUILD SUCCESSFUL, 관련git diff --check는 출력 없음으로 보완 완료했다.
7. 확정 항목의 plan·goal 전환
plan-task.mdPhase 3에 Task R3.1 /P3-R1을 추가했다.
8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | query·window·정책·테스트 대조 완료 |
| 후보 항목 판정 완료 | 충족 | REV-P3-001 확정 |
| 확정 항목 plan 반영 | 충족 | Task R3.1 |
| 검증 명령과 결과 기록 | 충족 | 정적 검색·구현 이력 확인 |
최종 결론: 보완 완료
남은 항목: 없음
9. 2차 리뷰 기록 — 2026-07-31
리뷰 정보·범위
- 기준:
5123494e기준 미커밋 working tree, PRD Feature A~C,plan-task.mdPhase 3, 선행 홈 추천 PRD Feature E. - 목적: 최종 SQL의 7일 window·집계·점수·데뷔일·후보 조건을 현재 요구사항과 다시 대조한다.
- 검증:
findCheerCreatorSnapshots(...)SQL과 관련 repository 테스트,075ca88f종료 라이브 데뷔 판정 보강 이력을 정적 추적했다. Gradle compile/test는 실행하지 않았다.
발견 사항
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
REV-P3-002 |
High | 보완 완료 | 종료된 라이브가 CHEER_CREATOR 데뷔 이력에서 제외된다 |
Task R3.2 | P3-R2 |
REV-P3-002 — 종료된 라이브가 CHEER_CREATOR 데뷔 이력에서 제외된다
- 심각도: High
- 상태: 보완 완료
- 관련 요구사항: PRD Feature C, Task 3.4
- 근거: 현재 PRD는 데뷔일을 선행 홈 추천 PRD와 동일하게 계산하도록 한다(
prd.md:102-109). 선행 PRD는channel_name이 있는 종료 라이브도 데뷔 이력으로 인정하고live_room.is_active를 조건으로 사용하지 않도록 확정한다(docs/20260529_메인_홈_추천_API/prd.md:157-159). 그러나DefaultHomeRecommendationQueryRepository.kt:589-594의CHEER_CREATOR데뷔 CTE는lr.is_active = true를 요구한다. 관련 스냅샷 테스트는 빈 채널명과 활성 라이브만 검증하고 종료 라이브 경계를 고정하지 않는다. - 재현 경로: 활성 콘텐츠는 없고 채널명이 있는
is_active = false종료 라이브와 최근 7일 응원 활동만 있는 활성 크리에이터를 준비한다. 현재 SQL에서는creator_debutrow가 생성되지 않아 후보에서 제외된다. - 영향: 정상적으로 라이브를 종료한 크리에이터가 응원 점수가 있어도 스냅샷 후보에서 누락되고, 더 늦은 활성 콘텐츠가 있으면 실제 최초 데뷔일보다 높은 신규 부스트를 받을 수 있다.
- 권장 조치:
CHEER_CREATORCTE의 라이브 branch에서lr.is_active = true만 제거하고, 종료 라이브·빈 채널명 경계를 repository 회귀 테스트로 고정한다. - 판정 기록: 2026-07-31 — 요구사항·SQL·선행 보강 commit·테스트 누락을 정적 대조해 확정했다.
- 보완 기록: 2026-07-31 — 채널명이 있는 종료 라이브와 최근 7일 응원 활동만 있는 크리에이터가
CHEER_CREATOR후보에 포함되는 RED 테스트를 추가했고, 빈channel_name종료 라이브 제외 경계를 함께 고정했다. RED 확인에서shouldIncludeEndedLiveWithChannelNameAsCheerCreatorDebut가AssertionFailedError로 실패했고,findCheerCreatorSnapshots(...)라이브 branch의lr.is_active = true만 제거한 뒤 repository focused test가BUILD SUCCESSFUL로 통과했다../gradlew ktlintCheck도BUILD SUCCESSFUL로 통과했으며,git diff --check는 출력 없이 통과했다.
plan·goal 전환과 종료 판정
plan-task.mdPhase 3에 Task R3.2 /P3-R2를 추가했다.- 최종 결론: 보완 완료.
- 남은 항목: 없음.
10. 3차 리뷰 기록 — 2026-07-31
- 리뷰 대상: Phase 3 / Task 3.1
3.5·Task R3.1R3.2,5123494e기준 미커밋 working tree. - 검토 근거:
RecommendationSnapshotWindowPolicy.kt:7-34,DefaultHomeRecommendationQueryRepository.kt:573-647,1185-1227,RecommendationSnapshotRefreshService.kt:91-127, 산식·half-open 경계·후원 distinct·후보 상한·종료 라이브·동점 정렬 repository/persistence 테스트. - 검증 방법: 최근 7일 UTC half-open window,
CHANNEL_DONATION·DONATION,UseCanCalculate.useCandistinct 후원 수, active 팬Talk, DB-side 점수·부스트, 미래/데뷔 없음/비활성 후보 제외, 종료 라이브 데뷔 이력, 점수순 상위 16개와 저장 정렬을 정적으로 추적했다. Gradle compile/test는 실행하지 않았다. - 발견 사항: 확정 발견 사항 없음.
- plan·goal 전환: 전환 항목 없음.
- 최종 결론: 확정 발견 사항 없음.
- 남은 항목: 없음.