fix(home): 홈 추천 후속 검증을 반영한다

This commit is contained in:
2026-07-31 16:29:06 +09:00
parent a106548f87
commit d592038edd
28 changed files with 1986 additions and 33 deletions

View File

@@ -0,0 +1,88 @@
# Phase 1 기존 구조·구현 경계 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 1 / 기존 구조 확인과 구현 경계 고정 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 1 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: Phase 1에서 확정한 v2 화면·공용 위젯·DI 경계가 후속 구현에서도 유지됐는지 확인한다.
- 포함: `v2/main`, `v2/widget`, `AppDI.kt`, 관련 레이아웃과 현재 파일 배치.
- 제외: 후속 Phase의 상세 UI 동작과 실기기 시각 검증.
## 3. 판정 기준
`sample-review.md`의 심각도와 상태 기준을 적용하고, 현재 경로가 후속 리팩터링으로 이동한 경우에는 기능·참조가 함께 보존됐는지로 판정했다.
## 4. 검토한 근거
- 계획: Phase 1의 기존 `HomeMainFragment`, 재사용 widget, DI 경계 확인 항목.
- 코드: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`, `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`.
- 검증: v2 home focused test, resource merge, compile, ktlint 성공. 최신 전체 1,198 tests 중 실패 0·error 0.
- 환경: macOS, Android Gradle 프로젝트, 연결 기기 기반 수동 확인 제외.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P1-001` | Low | 수정 완료 | 활성 문서의 HomeMainFragment 경로가 현재 파일과 다르다 | `Task R1.1` | `P1-R1` |
## 6. 발견 사항 상세
### REV-P1-001 — 활성 문서의 HomeMainFragment 경로가 현재 파일과 다르다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** v2 홈 구현 경계·파일 추적성
- **소유 Task:** `Task R1.1` / `P1-R1`
**관찰 내용**
현재 Fragment는 `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`에 있고 계획의 초기 `app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt`는 존재하지 않는다. 과거 Task 이력은 보존 대상이지만 PRD Technical Constraints도 과거 패키지를 현재 제약으로 안내하고 있어 활성 경로 안내는 정정이 필요하다.
**근거·재현**
1. `test -f app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`는 성공한다.
2. `test -f app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt`는 실패한다.
3. `prd.md:387``plan-task.md` Phase 1·5의 활성 안내/경로가 과거 위치를 사용한다.
**영향**
런타임 회귀는 없지만 후속 작업이 미존재 파일을 근거로 범위를 잡거나 리뷰 근거 경로를 잘못 인용할 수 있다.
**권장 조치**
기존 완료 이력은 삭제하지 않고 PRD와 Phase 1에 현재 canonical 경로를 명시한다.
**판정 기록**
- 2026-07-31 — 파일 존재 검사와 문서 검색으로 활성 경로 불일치를 확정했다.
- 2026-07-31 — `P1-R1` 문서 정정과 경로 검색, `git diff --check` 성공으로 수정 완료 판정했다.
## 7. 확정 항목의 plan·goal 전환
`plan-task.md` Phase 1에 `Task R1.1` / `P1-R1`을 추가했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 구조·의존성 경계 대조 완료 |
| 후보 항목 판정 완료 | 충족 | `REV-P1-001` 수정 완료 |
| 확정 항목 plan 반영 | 충족 | `Task R1.1` / `P1-R1` 추가 |
| 검증 명령과 결과 기록 | 충족 | `plan-task.md` Verification Log 연결 |
**최종 결론:** 승인
**남은 항목:** 없음
## 9. 수정 후 검증 기록
- 2026-07-31 — `Task R1.1` 실행으로 PRD Technical Constraints에 현재 canonical 경로 `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`와 package `kr.co.vividnext.sodalive.v2.main.home.HomeMainFragment`를 명시하고 과거 경로 미존재를 덧붙였다. `test -f "app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt"``test ! -f "app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt"`로 파일 상태를 확인했고, `rg` 경로 검색 및 `git diff --check`는 성공했다. 남은 항목은 없다.

View File

@@ -0,0 +1,57 @@
# Phase 10 배너 라우팅 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 10 / 배너 이동 정책 연결 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 10 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: event→creator→series→link 우선순위와 web/internal link 안전 처리를 확인한다.
- 포함: 배너 route model/intent 생성, Fragment callback, 관련 tests.
- 제외: 외부 브라우저·딥링크 목적 앱의 실제 실행 결과.
## 3. 판정 기준
우선순위 보존, blank/malformed/허용하지 않은 scheme no-op, 기존 extra 계약과 로그인 정책 유지로 판정했다.
## 4. 검토한 근거
- 코드: `HomeRecommendationUiModels.kt` 배너 route, `HomeMainFragment` 배너 callback.
- 테스트: `HomeMainFragmentLayoutTest` 배너 route/intent 계약.
- 검증: home/modal focused test·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 여러 payload 우선순위와 링크 분류 guard가 현재 테스트로 고정되어 있다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | route·intent·callback 검토 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12의 배너 목적지별 클릭 이동은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 11 크리에이터 item 라우팅 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 11 / 최근 활동·AI 캐릭터 터치 액션 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 11 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: activity type별 route와 AI 캐릭터의 creator channel 이동이 유효 ID만 사용하도록 구성됐는지 확인한다.
- 포함: recent activity route, AI creatorId mapper/route, adapter callback과 tests.
- 제외: COMMUNITY와 LIVE의 후속 목적지 변경은 Phase 13·16에서 별도 판정.
## 3. 판정 기준
표시 ID와 route ID 분리, invalid ID no-op, 목적지 extra, 후속 승인 변경 반영으로 판정했다.
## 4. 검토한 근거
- 코드: `HomeRecommendationUiModels.kt`, `HomeAiCharacterAdapter.kt`, `HomeRecentActivityCreatorAdapter.kt`, `HomeMainFragment.kt`.
- 테스트: `HomeMainFragmentLayoutTest`의 recent activity/AI mapper·route·intent 계약.
- 검증: home/modal focused test 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 초기 COMMUNITY/LIVE 동작은 Phase 13·16에서 승인된 목적지로 대체됐으며 AI characterId 표시와 creatorId 이동 계약은 분리되어 있다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | mapper·route·intent 검토 완료 |
| 후보 항목 판정 완료 | 충족 | 후속 Phase 변경 분리 완료 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | 자동 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12의 최근 활동·AI 캐릭터 이동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,136 @@
# Phase 12 최종 검증·문서 기록 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | 첫 번째 Phase 12 / Task 12.1~12.3 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` 첫 번째 Phase 12 |
| 리뷰 상태 | 수정·수동 검증 완료, 최신 전체 1,198 tests 성공, 과거 test isolation 관찰 보류 |
## 2. 리뷰 목적과 범위
- 목적: 자동 검증 완료 기록과 수동 확인 blocker가 실제 상태와 일치하는지 확인한다.
- 포함: Gradle test/compile/resource/ktlint, 문서 Verification Log, Task 12.2 상태.
- 제외: Codex가 직접 수행하지 않은 실제 UI 조작. Task 12.2 수동 항목은 사용자 확인 결과를 증거로 판정한다.
## 3. 판정 기준
실행 결과의 재현 가능성, 실패 원인 분리, 미완료 수동 항목의 명시와 기존 기록 보존으로 판정했다.
## 4. 검토한 근거
- 계획: Task 12.1~12.3 완료. Task 12.2는 2026-07-31 사용자 수동 확인 결과를 누적해 완료 상태다.
- 실행: home/modal focused test·resource merge·compile·ktlint 성공. 최신 `./gradlew :app:testDebugUnitTest --no-parallel --console=plain`은 162 suites, 1,198 tests 중 실패 0·error 0으로 성공했다. 과거 전체 suite 2회의 `CreatorChannelHomeViewModelTest` 2건/1건 실패와 해당 class 격리 19 tests 성공 기록은 `REV-P12-003` 관찰 이력으로 보존한다.
- 수동 검증: Codex 직접 기기 조작은 홈 추천 화면 접근 제약으로 완료하지 못했지만, 사용자가 Task 12.2의 홈 추천 화면 항목이 모두 동작함을 확인했다.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P12-001` | Low | 수정 완료 | Task 12.2의 기기 미연결 blocker가 현재 환경과 다르다 | `Task R12.1` | `P12-R1` |
| `REV-P12-002` | Low | 수정 완료 | Task 12.2가 제거된 first audio 표시 계약을 요구한다 | `Task R12.2` | `P12-R2` |
| `REV-P12-003` | Low | 보류 | 전체 unit suite에서 공유 `can` 상태 assertion이 비결정적으로 실패한다 | 별도 creator channel/preferences 테스트 격리 작업 | 범위 승인 후 정의 |
## 6. 발견 사항 상세
### REV-P12-001 — Task 12.2의 기기 미연결 blocker가 현재 환경과 다르다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** Task 12.2 수동 확인·리뷰 검증 상태 정확성
- **소유 Task:** `Task R12.1` / `P12-R1`
**관찰 내용·근거**
`plan-task.md` Task 12.2는 `[blocked: 연결된 Android 기기 없음]`으로 남아 있지만 2026-07-31 재검사한 `adb devices``device` 상태 기기 1대를 반환했다. 수동 항목은 아직 미실행이므로 Task 12.2를 완료로 판정할 수는 없으나 blocker 사유와 재개 조건은 갱신해야 한다.
**영향·권장 조치**
기능 결함은 확인되지 않았으나 현재 실행 가능한 검증을 외부 조건 대기로 남겨 Phase 종료 판정을 지연시킨다. 기기 연결 상태를 다시 기록하고 Task 12.2 수동 확인을 재개한다.
**판정 기록**
- 2026-07-31 — escalated `adb devices` 결과로 기존 미연결 blocker가 현재 상태와 다름을 확정했다.
- 2026-07-31 — `P12-R1` 실행으로 기기 연결, 설치, 런처 실행, 스크린샷을 재확인했고 blocker를 `SplashActivity` 검은 화면으로 갱신해 당시 상태를 정정했다.
- 2026-07-31 — 이후 사용자 수동 확인으로 Task 12.2 홈 추천 화면 항목이 모두 동작함을 확인해 현재 blocker는 해소됐다.
전체 테스트 최초 실패는 이번 Phase 대상이 아닌 `CreatorChannelHomeViewModelTest`의 기존 비동기 preference 경쟁 조건으로 좁혀졌고 격리·전체 재실행이 성공해 현재 변경 회귀로 판정하지 않았다.
### REV-P12-002 — Task 12.2가 제거된 first audio 표시 계약을 요구한다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** `P12B-T1`·`P12B-T2` first audio production/UI/resource 제거
- **소유 Task:** `Task R12.2` / `P12-R2`
**관찰 내용·근거**
두 번째 Phase 12(`P12B`)에서 first audio 섹션·DTO·adapter·resource를 제거했지만, 아직 미완료인 첫 번째 Phase 12의 Task 12.2 수동 확인 목록은 `첫 오디오 태그 조건`을 현재 표시 계약으로 유지했다. `rg`로 v2 home production/resource에 제거 대상 참조가 없고 해당 수동 항목만 활성 계약으로 남은 상태를 확인했다.
**영향·권장 조치**
실행하려는 수동 검증이 이미 제거된 UI를 요구해 항목 완료가 불가능하고 Phase 12B 제거 계약과도 모순된다. 과거 이력은 보존하고 Task 12.2의 활성 항목만 first audio 섹션과 관련 태그 미노출 확인으로 정정한다.
**판정 기록**
- 2026-07-31 — `plan-task.md` Task 12.2의 활성 항목과 Phase 12B 제거 Task·production 검색을 대조해 문서 정합성 문제로 확정했다.
- 2026-07-31 — `P12-R2`로 Task 12.2 활성 항목을 미노출 검증으로 정정하고 production 금지 참조 검색과 `git diff --check`를 통과해 수정 완료로 판정했다.
### REV-P12-003 — 전체 unit suite에서 공유 `can` 상태 assertion이 비결정적으로 실패한다
- **심각도:** Low
- **상태:** 보류
- **관련 요구사항:** Task 12.1 전체 `:app:testDebugUnitTest` 성공 검증
- **소유 Task:** 현재 계획 범위 밖 `CreatorChannelHomeViewModelTest` / `SharedPreferenceManager` 테스트 격리
**관찰 내용**
`./gradlew :app:testDebugUnitTest --no-parallel`을 두 차례 실행했을 때 첫 실행은 1,196개 중 `CreatorChannelHomeViewModelTest` 2건, 두 번째 실행은 동일 class 1건이 실패했다. 실패 테스트는 채널 후원 성공 후 `SharedPreferenceManager.can``200 -> 150`, `30 -> 0`으로 차감되어야 하지만 각각 `200`, `30`으로 남은 assertion이다. 해당 class 19개를 격리 재실행하면 모두 통과했다.
**근거**
- 현재 diff에 `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel`, `CreatorChannelHomeViewModelTest.kt`, `SharedPreferenceManager.kt`, `AppPreferencesDataStoreProvider.kt` 변경은 없다.
- `채널 후원 성공은 기존 후원 API를 호출하고 홈을 다시 로드한다` 테스트는 repository success callback 후 두 번째 `getHome()` 검증까지 통과했지만, 직후 `can` 값은 설정 전 값으로 관찰됐다.
- `SharedPreferenceManager` reset은 observer job을 cancel하지만 전역 `appScope(Dispatchers.IO)`와 DataStore write/collect를 사용하고, 전체 suite의 여러 test class가 같은 저장소를 init/reset한다. 이 구조는 격리 성공·전체 실패 패턴과 일치하지만, 결정적 재현 test와 수정 범위는 이번 홈 추천 리뷰에서 추가하지 않았다.
**영향·권장 조치**
홈 추천 focused 회귀는 green이지만 Task 12.1의 전체 suite를 현재 시점에서 안정적인 green gate로 사용할 수 없다. `CreatorChannelHomeViewModelTest`와 공유 preferences 테스트 격리를 별도 PRD/계획 범위로 승인하면, 순서와 관계없이 재현되는 실패 test를 먼저 고정한 뒤 최소 수정한다.
**판정 기록**
- 2026-07-31 — 전체 suite 2회 실패, 실패 class 격리 성공, 변경 범위 대조로 홈 추천 회귀와 분리했다.
- 2026-07-31 — 수정은 현재 문서의 Phase 범위를 넘고 공유 preferences 테스트 구조를 변경할 수 있어 보류했다. 사용자가 별도 범위를 승인하면 재현 test부터 재개한다.
## 7. 확정 항목의 plan·goal 전환
`plan-task.md` 첫 번째 Phase 12의 `Task R12.1` / `P12-R1`은 기기 상태·blocker 정정과 이후 사용자 수동 확인까지, `Task R12.2` / `P12-R2`는 first audio 제거 후 수동 확인 기준 동기화까지 완료했다. `REV-P12-003`은 현재 Phase 범위 밖이므로 plan Task로 전환하지 않고, 비결정적 실패가 다시 재현될 때 별도 creator channel/preferences 테스트 격리 범위로 재개한다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 자동·문서·수동 상태 확인 |
| 후보 항목 판정 완료 | 충족 | `REV-P12-001`, `REV-P12-002` 수정 완료, `REV-P12-003` 보류 조건 기록 |
| 확정 항목 plan 반영 | 충족 | `Task R12.1` / `P12-R1`, `Task R12.2` / `P12-R2` 완료 |
| 보류 항목의 담당·재개 조건 기록 | 충족 | `REV-P12-003`은 비결정적 실패 재현 시 creator channel/preferences 테스트 격리 범위로 재개 |
| 검증 명령과 결과 기록 | 충족 | focused 성공·최신 전체 1,198 tests 성공·과거 격리 관찰을 Verification Log에 누적 |
**최종 결론:** 자동·사용자 수동 검증 승인, 과거 test isolation 관찰 보류
**남은 항목:** 현재 Phase 수정 항목은 없음. `REV-P12-003`은 전체 suite에서 동일 실패가 다시 재현될 때 별도 테스트 격리 범위로 재개한다.
## 9. 수정 후 검증 기록
- 2026-07-31 — `P7-R3` 실행형 회귀 테스트 보강 후 전체 `:app:testDebugUnitTest`를 재실행했고 162 suites, 1,198 tests, 실패 0, error 0으로 BUILD SUCCESSFUL을 확인했다. `REV-P12-003`의 과거 비결정적 관찰은 재현되지 않았으며 기존 재개 조건을 유지한다.
- 2026-07-31 — 현재 working tree에서 home/modal focused test·`:app:mergeDebugResources`·`:app:compileDebugKotlin`·`:app:ktlintCheck`를 함께 실행해 BUILD SUCCESSFUL을 확인했다. 이어 `./gradlew :app:testDebugUnitTest --no-parallel --console=plain`을 실행했고, test result XML 161 suites의 1,197 tests에서 실패 0·error 0으로 BUILD SUCCESSFUL을 확인했다. 이 결과는 `REV-P12-003`의 과거 비결정적 관찰을 삭제하지 않으며, 동일 실패 재현 시 재개 조건을 유지한다.
- 2026-07-31 — 사용자 수동 확인 결과 Task 12.2의 추천 tab·스크롤·섹션·라우팅·인기 커뮤니티 상태·사업자 정보 항목이 모두 동작함을 확인해 이전 화면 접근 blocker를 해소된 이력으로 갱신했다.
- 2026-07-31 — Phase별 리뷰 보고서와 계획 문서 반영 후 `./gradlew tasks --all --console=plain`을 실행해 BUILD SUCCESSFUL을 확인했다. `reviews/`의 Phase 1~17 및 별도 이력 Phase 12B 보고서 존재 여부, 확정 지적과 신규 회귀 Task의 연결, `git diff --check`를 다시 확인했다.
- 2026-07-31 — `Task R12.1` 실행으로 `adb devices`에서 `2cec640c34017ece device`를 확인해 기존 `연결된 Android 기기 없음` blocker가 현재 상태와 다름을 재확인했다. `./gradlew :app:installDebug`는 SM-G960N 기기에 설치 성공했고, `adb shell monkey -p kr.co.vividnext.sodalive.debug -c android.intent.category.LAUNCHER 1`도 성공했다. 그러나 `adb shell dumpsys window`는 foreground가 `kr.co.vividnext.sodalive.debug/kr.co.vividnext.sodalive.splash.SplashActivity`임을 반환했고, `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_r12_manual.png`와 retry `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_r12_manual_retry.png`는 모두 검은 화면으로 판독됐다. Task 12.2 수동 항목은 홈 추천 화면 접근 불가로 계속 blocked다.
- 2026-07-31 — 수동 Gate 재검증에서 `adb devices``2cec640c34017ece device`를 반환했고 `./gradlew :app:installDebug`, `adb shell monkey -p kr.co.vividnext.sodalive.debug -c android.intent.category.LAUNCHER 1`는 성공했다. `adb shell dumpsys window`는 foreground가 `kr.co.vividnext.sodalive.debug/kr.co.vividnext.sodalive.v2.main.MainV2Activity`임을 반환했지만, `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_manual_gate_20260731/screen.png`는 검은 배경의 splash/voice on 화면으로 판독됐다. Task 12.2 수동 항목은 홈 추천 화면 접근 불가로 계속 blocked다.
- 2026-07-31 — `Task R12.2` 실행으로 Task 12.2의 `첫 오디오 태그 조건``Phase 12B에서 제거된 첫 오디오 섹션과 관련 태그 미노출`로 정정했다. 과거 검증 이력은 보존했고 v2 home production/resource의 제거 대상 참조가 없음을 `rg`로 확인했으며 `git diff --check`는 출력 없이 성공했다. 수동 확인은 기존 `SplashActivity` 검은 화면 blocker로 인해 계속 미완료다.
- 2026-07-31 — 현재 working tree에서 `./gradlew :app:testDebugUnitTest --no-parallel`을 두 차례 실행했고 1,196개 중 `CreatorChannelHomeViewModelTest` 2건/1건 실패로 모두 `BUILD FAILED`를 확인했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest" --no-parallel`은 19개 모두 통과했다. 실패는 현재 diff 범위 밖의 공유 preferences 비동기 상태와 일치해 `REV-P12-003` 보류로 기록했고 해당 코드는 변경하지 않았다.

View File

@@ -0,0 +1,123 @@
# Phase 12B first audio 제거 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | 두 번째 Phase 12 / 역사적 Task 10.1~10.2 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` 두 번째 Phase 12 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: first audio 제거 완료 여부와 Phase/Task 식별자의 추적 가능성을 확인한다.
- 포함: recommendation DTO/model/state/Fragment, content overview, string/layout/adapter 참조와 계획 문서 식별자.
- 제외: `NEW_AND_HOT_AUDIO` 등 유지 대상 오디오 기능.
## 3. 판정 기준
production 참조 완전 제거, 유지 대상 비회귀, Phase·Task·Goal의 고유 추적 가능성으로 판정했다.
## 4. 검토한 근거
- 코드 검색: `app/src/main`에서 `firstAudioContents`, `HomeFirstAudio`, `FIRST_AUDIO_CONTENT`, 제거 string/layout production 참조 확인.
- 문서: `plan-task.md`의 두 `Phase 12` 제목과 두 번째 Phase의 `Task 10.1`·`Task 10.2`.
- 검증: home/content overview focused 검증 기록, 현재 home/modal focused test 성공 및 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P12B-001` | Low | 수정 완료 | Phase와 Task 식별자가 다른 완료 항목과 중복된다 | `Task R12B.1` | `P12B-R1` |
| `REV-P12B-002` | Low | 수정 완료 | 제거된 first audio가 PRD 활성 계약에 남아 있다 | `Task R12B.2` | `P12B-R2` |
## 6. 발견 사항 상세
### REV-P12B-001 — Phase와 Task 식별자가 다른 완료 항목과 중복된다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** first audio 제거 자체에는 위반 없음
- **관련 계약:** `work-plan-docs.md` Goal/Task 추적성 규칙
- **소유 Task:** `Task R12B.1` / `P12B-R1`
**관찰 내용**
문서에 `Phase 12`가 두 번 있고, second Phase 12의 완료 항목은 `Task 10.1`·`Task 10.2`로 기록되어 Phase 10 및 첫 번째 Phase 12와 참조가 충돌한다. 실제 first audio 제거는 완료됐지만 리뷰 보고서와 후속 회귀 Task에서 소유 Phase를 고유하게 지정할 수 없다.
**근거**
- 문서: `plan-task.md``Phase 12: 최종 검증과 문서 기록``Phase 12: 처음부터 함께 성장! 섹션 제거` 제목.
- 문서: 두 번째 Phase 12 안의 `Task 10.1`·`Task 10.2`.
- 코드: 제거 대상 production 참조가 없어 기능 결함은 확인되지 않았다.
**재현 또는 검증 절차**
1. `rg -n '^### Phase 12|Task 10\\.' plan-task.md`를 실행한다.
2. 서로 다른 결과가 같은 Phase/Task 식별자를 공유함을 확인한다.
3. first audio production 참조 제거 여부를 별도 검색해 기능 완료와 문서 추적성 문제를 분리한다.
**영향**
런타임 영향은 없지만 향후 리뷰, 회귀 수정, goal 완료 증거가 잘못된 Phase에 연결될 수 있다.
**권장 조치**
기존 완료 기록을 재작성하지 않고 두 번째 Phase 12와 하위 Task에 `P12B` 계열 고유 별칭 대응표를 추가하고 이후 참조에 사용한다.
**판정 기록**
- 2026-07-31 — 문서 검색과 current tree 대조로 추적성 문제를 확정했다.
- 2026-07-31 — `P12B-R1` 별칭 표·이후 참조 규칙 추가와 `rg`·`git diff --check` 성공으로 수정 완료 판정했다.
### REV-P12B-002 — 제거된 first audio가 PRD 활성 계약에 남아 있다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** 2026-06-29 `firstAudioContents`·`HomeFirstAudioContentItem` 제거
- **소유 Task:** `Task R12B.2` / `P12B-R2`
**관찰 내용**
production에서 first audio 섹션·adapter·resource는 제거됐지만 PRD의 현재 Problem, 섹션 구성 도식, Metrics, Open Questions에 `첫 오디오 콘텐츠`, `firstAudioContents`, `AudioContentCardView`, `releaseDate` 계약이 아직 남아 있다.
**근거·재현**
1. `rg -n "firstAudioContents|HomeFirstAudio|FIRST_AUDIO_CONTENT|AudioContentCardView|releaseDate" prd.md`는 PRD 활성 영역의 잔존 참조를 반환한다.
2. 동일 패턴을 `app/src/main`에서 검색하면 제거 대상 production 참조가 없다.
3. PRD의 `2026-06-29 변경`은 해당 필드·UI·resource 제거를 명시한다.
**영향·권장 조치**
런타임 결함은 없지만 요구사항과 Metrics가 이미 삭제된 기능을 현재 완료 조건으로 제시한다. 과거 이력은 보존하고 PRD 활성 영역만 Phase 12B 계약에 맞게 정정한다.
**판정 기록**
- 2026-07-31 — PRD 활성 영역과 production 금지 참조 검색으로 문서 정합성 문제를 확정했다.
- 2026-07-31 — `P12B-R2` PRD 활성 계약 정정과 production/resource 참조 검색, `git diff --check` 성공으로 수정 완료 판정했다.
## 7. 확정 항목의 plan·goal 전환
`Task R12B.1` / `P12B-R1``Task R12B.2` / `P12B-R2`는 수정 검증까지 완료했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 제거 코드·문서 식별자 검토 완료 |
| 후보 항목 판정 완료 | 충족 | `REV-P12B-001`, `REV-P12B-002` 수정 완료 |
| 확정 항목 plan 반영 | 충족 | `Task R12B.2` / `P12B-R2` 완료 |
| 보류 항목의 담당·재개 조건 기록 | 해당 없음 | 보류 없음 |
| 검증 명령과 결과 기록 | 충족 | Verification Log 연결 |
**최종 결론:** 승인
**남은 항목:** 없음
## 9. 수정 후 검증 기록
- 2026-07-31 — `P12B-R1` 실행으로 두 번째 `Phase 12`와 하위 `Task 10.1`·`Task 10.2`에 고유 별칭을 추가했다. 변경 파일은 `plan-task.md`와 이 리뷰 보고서다. 중복 재현은 `rg -n "^(### Phase 12:|## Phase 12:|#### Task 10\.|- \[x\] \*\*Task 10\.)" "docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md"`로 확인했고, 기존 완료 제목과 체크박스는 보존한 채 `P12B`, `P12B-T1`, `P12B-T2` 별칭 표와 이후 참조 규칙만 추가했다. 연결 확인은 `rg -n "P12B|P12B-T1|P12B-T2|P12B-R1|REV-P12B-001" "docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md" "docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase12-first-audio-removal-review.md"`로 수행했고, `git diff --check`는 출력 없이 성공했다. 남은 항목은 없다.
- 2026-07-31 — `P12B-R2` 실행으로 PRD 활성 Problem, 섹션 도식, Metrics, Open Questions에서 제거된 first audio 완료 조건을 정리했다. 2026-06-01 과거 기록과 2026-06-29 제거 기록은 보존했다. `rg -n "firstAudioContents|HomeFirstAudioContentItem|releaseDate|첫 오디오|처음부터 함께 성장" "docs/20260601_메인_홈_추천_UI와_API_연동/prd.md" app/src/main/java/kr/co/vividnext/sodalive/v2/main/home app/src/main/res/values app/src/main/res/layout` 결과는 PRD 과거 기록 및 제거 기록만 반환하고 v2 home production/resource 제거 대상 참조는 반환하지 않았다. `git diff --check`는 출력 없이 성공했다. 남은 항목은 없다.

View File

@@ -0,0 +1,58 @@
# Phase 13 커뮤니티 상세 라우팅 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 13 / Task 13.1~13.2 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 13 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 최근 활동 COMMUNITY와 인기 커뮤니티 item이 `postId` 기반 상세 화면으로 이동하는지 확인한다.
- 포함: route·공통 `CommunityAction` 연결, Fragment login guard, 기존 목록 route 제거와 tests.
- 제외: 상세 화면 내부 기능과 API 조회.
## 3. 판정 기준
유효 `postId` 전달, invalid 값 no-op, 로그인 가드 순서, 기존 `CreatorCommunityAllActivity` extra 제거로 판정했다.
## 4. 검토한 근거
- 코드: `HomeRecommendationUiModels.kt`, `HomeMainFragment.kt` 커뮤니티 callback.
- 테스트: `HomeMainFragmentLayoutTest`, `HomeMainFragmentLoginGuardSourceTest`.
- 검색: v2 home production의 이전 커뮤니티 전체 목록 route 잔존 여부.
- 검증: home/modal focused test·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 두 진입점 모두 현재 `postId``CommunityActionCommand.PostDetail`로 전달하고 공통 handler가 `CreatorChannelCommunityDetailActivity`로 이동하며 invalid 값은 이동하지 않는다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | route·guard·금지 참조 검토 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12 관련 수동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 14 장르 크리에이터 미표시 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 14 / genreCreators UI 미표시 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 14 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 응답·mapper 계약은 유지하면서 추천 탭에서 genre section과 follow-all 동작이 노출되지 않는지 확인한다.
- 포함: Fragment visibility/binding, `HomeRecommendationUiState.isEmpty`, ViewModel follow 상태와 tests.
- 제외: 장르 섹션 재도입 설계.
## 3. 판정 기준
항상 `GONE`, hidden section 기준 empty 오판 방지, genre follow callback 미연결, 응답 파싱 유지로 판정했다.
## 4. 검토한 근거
- 코드: `HomeMainFragment.bindGenreCreatorSection()`, `HomeRecommendationUiState.kt`, recommendation mapper.
- 테스트: `HomeMainFragmentLayoutTest`의 hidden genre/empty 계약.
- 검증: home/modal focused test 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 숨겨진 genre data만 존재하는 경우도 Empty로 판정하며 Fragment가 해당 섹션을 노출하거나 모두 팔로우를 연결하지 않는다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | UI·state·mapper 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | 자동 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 15 추천 섹션 chevron 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 15 / 추천 섹션 타이틀 chevron 숨김 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 15 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 홈 추천의 최근 데뷔와 AI 캐릭터 섹션 제목에 더보기 chevron이 노출되지 않는지 확인한다.
- 포함: `HomeMainFragment.setUpSectionTitles()`와 source/layout tests.
- 제외: 다른 홈 tab과 섹션 전체보기 기능 설계.
## 3. 판정 기준
대상 두 제목의 `showMore` 미지정과 다른 tab/section에 대한 비의도 변경 없음으로 판정했다.
## 4. 검토한 근거
- 코드: `HomeMainFragment.setUpSectionTitles()`.
- 테스트: `HomeMainFragmentSourceTest`, `HomeMainFragmentLayoutTest`, `HomeFollowingFragmentSourceTest`.
- 검증: home/modal focused test·compile/resource/ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 대상 제목에 chevron 활성 계약이 남아 있지 않고 다른 홈 tab source test도 통과한다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | source와 test 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -140,8 +140,16 @@ Phase 16 요구사항 위반, 공통 접근 정책 우회, 다른 activity type
**최종 결론:** 확정 발견 사항 없음.
**남은 항목:** Phase 16 수정 항목은 없다. 전체 unit suite는 범위 밖의 비결정적 `v2.creator.channel` 실패로 완전한 green 상태가 아니며, 해당 영역을 별도 리뷰할 때 테스트 격리성과 `SharedPreferenceManager` 전역 상태 사용을 재현 조건으로 점검할 수 있다.
**남은 항목:** Phase 16 수정 항목은 없다. 이전 `v2.creator.channel` 비결정적 실패는 관찰 이력으로 보존하고, 동일 실패 재현 시 별도 테스트 격리 범위로 재개한다.
## 9. 수정 후 검증 기록
수정 항목이 없어 해당 없음.
## 10. 2026-07-31 전체 계획 기준 재검토
- 기준: `a106548f` 기반 현재 working tree와 `plan-task.md` 전체 Phase를 다시 대조했다.
- 범위: LIVE route의 `targetId` 우선, null일 때만 `creatorId` fallback, invalid ID no-op, 공통 Live/Creator action 경로와 기존 activity type 회귀.
- 검증: v2 home 및 `V2ModalDialog` focused test·resource merge·compile·ktlint가 성공했고, 최신 전체 1,198 tests는 실패 0·error 0으로 성공했다.
- 판정: Phase 16 확정 발견 사항 없음. 신규 회귀 Task 전환 항목 없음.
- 참고: 전체 테스트 최초 실행의 범위 밖 `CreatorChannelHomeViewModelTest` 1건 실패는 격리 및 전체 재실행에서 통과해 기존 보고서의 비결정적 suite 관찰과 같은 범주로 유지한다.

View File

@@ -0,0 +1,113 @@
# Phase 17 모두 팔로우 확인 절차 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 17 / Task 17.1, P17-GATE |
| 기준 commit 또는 working tree | `a106548f` 기반 Phase 17 미커밋 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 17 |
| 리뷰 상태 | 수정 검증 완료 |
## 2. 리뷰 목적과 범위
- 목적: 응원 크리에이터 모두 팔로우가 확인 전 요청하지 않고 취소 no-op, 확인 후 단일 요청과 다국어 계약을 지키는지 확인한다.
- 포함: `HomeMainFragment`, `HomeCheerCreatorAdapter`, `HomeFollowAllButtonBinder`, `V2ModalDialog`, 세 locale resource와 tests.
- 제외: 모두 팔로우 API/ViewModel 계약 변경, 숨겨진 genre UI, 공통 Dialog 리팩터링.
## 3. 판정 기준
Dialog 선행, confirm callback 단독 API 호출, cancel dismiss-only, 중복 confirm 방지, 완료·빈 목록 no-op, locale resource 분리로 판정했다.
## 4. 검토한 근거
- 코드: `HomeMainFragment.showCheerCreatorsFollowAllConfirmDialog()`, `HomeFollowAllButtonBinder`, `V2ModalDialog`.
- 리소스: `values`, `values-en`, `values-ja``home_recommendation_follow_all_confirm_*`.
- 테스트: `HomeMainFragmentLayoutTest`, `V2ModalDialogTest`.
- 검증: home/modal focused test·resource merge·compile·ktlint 성공. 최신 전체 1,198 tests 중 실패 0·error 0.
- 수동 검증: 사용자 수동 확인으로 P17-GATE의 시각·상호작용 항목은 동작 확인. 추가 발견된 미로그인 로그인 가드 순서 회귀는 `P17-R2`로 수정.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P17-001` | Low | 수정 완료 | 신규 모두 팔로우 테스트명 2건이 영문이다 | `Task R17.1` | `P17-R1` |
| `REV-P17-002` | Medium | 수정 완료 | 모두 팔로우 미로그인 터치에서 확인 Dialog가 로그인 가드보다 먼저 표시된다 | `Task R17.2` | `P17-R2` |
사용자 수동 확인과 `P17-R2` 회귀 수정 후 Phase 17 기능 계약은 충족한다.
## 6. 발견 사항 상세
### REV-P17-001 — 신규 모두 팔로우 테스트명 2건이 영문이다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** `code-style.md` 신규 Kotlin 테스트명 한글 문장 규칙
- **소유 Task:** `Task R17.1` / `P17-R1`
**관찰 내용·근거**
Phase 17에서 신규 추가한 `cheer creator follow all opens confirm dialog before api request`, `follow all confirm strings are localized` 테스트명이 영문이고 한글 검증 의도 주석도 없다. Dialog 선행·다국어 assertion 자체는 focused test에서 성공했다.
**재현 절차**
1. current diff에서 위 두 신규 `fun \`...\`` 메서드를 확인한다.
2. `code-style.md` §5 테스트 관례와 대조한다.
**영향·권장 조치**
런타임 영향은 없으나 신규 테스트가 저장소 표현 규칙과 다르다. assertion은 바꾸지 않고 두 테스트명만 한글 문장으로 정정한다.
**판정 기록**
- 2026-07-31 — current diff와 테스트 네이밍 규칙 대조로 확정했다.
- 2026-07-31 — `P17-R1` 테스트명 정정과 direct 영향 회귀, `ktlintCheck`, `git diff --check` 성공으로 수정 완료 판정했다.
기능 판정은 변경 없음. `onCheerFollowAllClick`은 Dialog helper만 호출하고 `confirmButtonClick`에서만 기존 section key와 creator ID 목록으로 ViewModel을 호출한다. 취소 callback은 전달하지 않아 공통 Dialog의 dismiss-only 동작을 사용한다.
### REV-P17-002 — 모두 팔로우 미로그인 터치에서 확인 Dialog가 로그인 가드보다 먼저 표시된다
- **심각도:** Medium
- **상태:** 수정 완료
- **관련 요구사항:** 기존 MainV2 로그인 가드 우선 정책, `P17-T1` 확인 전 요청 금지
- **소유 Task:** `Task R17.2` / `P17-R2`
**관찰 내용·근거**
사용자 수동 확인에서 `모두 팔로우` 터치 시 미로그인 로그인 가드보다 `V2ModalDialog` 확인창이 먼저 표시되는 버그가 확인됐다. 현재 `onCheerFollowAllClick``showCheerCreatorsFollowAllConfirmDialog(creatorIds)`를 직접 호출한다.
**영향·권장 조치**
미로그인 사용자에게 follow 확인 UI를 먼저 보여 기존 접근 정책과 맞지 않는다. 신규 공통 abstraction 없이 기존 `ensureV2Access(AccessRequirement.Login)`를 Dialog 표시 전에 적용한다.
**판정 기록**
- 2026-07-31 — 사용자 수동 확인으로 로그인 가드 순서 회귀를 확정했다.
- 2026-07-31 — `P17-R2` RED/GREEN과 직접 영향 회귀, compile, ktlint, `git diff --check` 성공으로 수정 완료 판정했다.
## 7. 확정 항목의 plan·goal 전환
`plan-task.md` Phase 17의 `Task R17.1` / `P17-R1``Task R17.2` / `P17-R2`는 수정 검증까지 완료했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 코드·resource·test·Gate 상태 대조 완료 |
| 후보 항목 판정 완료 | 충족 | `REV-P17-001`, `REV-P17-002` 수정 완료 |
| 확정 항목 plan 반영 | 충족 | `Task R17.1` / `P17-R1`, `Task R17.2` / `P17-R2` 완료 |
| 보류 항목의 담당·재개 조건 기록 | 충족 | 보류 없음 |
| 검증 명령과 결과 기록 | 충족 | focused/full 검증 기록 연결 |
**최종 결론:** 승인
**남은 항목:** 없음
## 9. 수정 후 검증 기록
- 2026-07-31 — `Task R17.1` 실행으로 신규 영문 테스트명 2건을 `응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다`, `모두 팔로우 확인창 문자열은 다국어로 제공한다`로 정정했다. Production Dialog·ViewModel·API 동작과 assertion은 변경하지 않았다. `HomeMainFragmentLayoutTest`·`V2ModalDialogTest`, `./gradlew :app:ktlintCheck`, `git diff --check`가 모두 성공했다. 당시 `P17-GATE`의 실제 확인창 시각·상호작용 4항목은 정상 화면 캡처·조작이 가능한 기기 환경에서 재개하는 상태였다.
- 2026-07-31 — 수동 Gate 재검증에서 `adb devices``2cec640c34017ece device`를 반환했고 `./gradlew :app:installDebug`, `adb shell monkey -p kr.co.vividnext.sodalive.debug -c android.intent.category.LAUNCHER 1`는 성공했다. `adb shell dumpsys window`는 foreground가 `kr.co.vividnext.sodalive.debug/kr.co.vividnext.sodalive.v2.main.MainV2Activity`임을 반환했지만, `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_manual_gate_20260731/screen.png`는 검은 배경의 splash/voice on 화면으로 판독됐다. 당시 실제 확인창 시각·상호작용 4항목은 홈 추천 화면 접근 불가로 blocked였다.
- 2026-07-31 — 사용자 수동 확인에서 Task 12.2와 P17-GATE 수동 항목은 모두 동작함을 확인했지만, 모두 팔로우 미로그인 터치 시 로그인 가드보다 확인 Dialog가 먼저 표시되는 회귀가 발견되어 `REV-P17-002` / `P17-R2`로 전환했다.
- 2026-07-31 — `Task R17.2` 실행으로 `onCheerFollowAllClick`에서 기존 `ensureV2Access(AccessRequirement.Login)` 통과 후 `showCheerCreatorsFollowAllConfirmDialog(creatorIds)`를 호출하도록 수정했다. RED는 `HomeMainFragmentLoginGuardSourceTest.HomeMainFragment 응원 크리에이터 모두 팔로우는 확인창보다 로그인 가드를 먼저 실행한다``HomeMainFragmentLayoutTest.응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다` focused test 실패로 확인했고, GREEN 후 동일 focused test는 성공했다. 직접 영향 회귀 `HomeMainFragmentLoginGuardSourceTest`, `HomeMainFragmentLayoutTest`, `V2ModalDialogTest`, `compileDebugKotlin`, `ktlintCheck`, `git diff --check`도 모두 성공했다. `ktlintCheck``.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다.

View File

@@ -0,0 +1,58 @@
# Phase 2 추천 데이터 계층 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 2 / API DTO, Repository, DI 추가 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 2 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 추천 조회·모두 팔로우 계약과 DI 연결이 PRD 범위에 맞는지 확인한다.
- 포함: `HomeRecommendationApi`, DTO, Repository, `AppDI` 등록.
- 제외: 서버 실제 응답과 네트워크 E2E.
## 3. 판정 기준
API path/method, request 필드, auth header 전달, repository 책임, v2 패키지 경계를 기준으로 판정했다.
## 4. 검토한 근거
- 코드: `v2/main/home/data/HomeRecommendationApi.kt`, `HomeRecommendationModels.kt`, `HomeRecommendationRepository.kt`, `di/AppDI.kt`.
- 테스트: `HomeRecommendationViewModelTest`, home source/layout tests.
- 검증: home/modal focused test 및 compile/resource/ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
- 환경: 실제 서버 호출 없음.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 후속 응답 스키마 변경과 first audio 제거가 현재 DTO·mapper에 반영되어 초기 Phase 계약과의 역사적 차이는 후속 승인 변경으로 확인했다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | API·DTO·Repository·DI 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 후속 계약 변경 이력 확인 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | `plan-task.md` Verification Log 연결 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 실제 서버 E2E는 이번 리뷰 범위 밖이다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 3 활동 타입·mapper 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 3 / 순수 mapper와 unit test 작성 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 3 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 추천 응답의 UI model 변환과 활동 타입 다국어 fallback 계약을 확인한다.
- 포함: `CreatorActivityType`, 추천 mapper/UI model, 문자열 리소스와 mapper 테스트.
- 제외: 카드 레이아웃과 클릭 라우팅.
## 3. 판정 기준
null/unknown 안전성, 필드 보존, locale resource 분리, 후속 공용 타입 전환 시 회귀 여부로 판정했다.
## 4. 검토한 근거
- 코드: `v2/common/CreatorActivityType.kt`, `HomeRecommendationMappers.kt`, `HomeRecommendationUiModels.kt`.
- 테스트: `HomeCreatorActivityTypeLabelResTest`, `HomeMainFragmentLayoutTest` mapper 계약.
- 검증: home/modal focused test 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 계획의 초기 `RecommendedActivityType` 명칭은 후속 commit에서 공용 `CreatorActivityType`으로 전환됐고 production과 테스트가 함께 갱신되어 현재 결함이 아니다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | mapper·공용 타입·다국어 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 명칭 변경의 후속 이력 확인 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | 자동 테스트 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 4 추천 상태·ViewModel 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 4 / ViewModel과 화면 상태 구성 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 4 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: loading/content/empty/error와 모두 팔로우 상태 갱신이 계획과 일치하는지 확인한다.
- 포함: `HomeRecommendationUiState`, `HomeRecommendationViewModel`, DI와 unit test.
- 제외: Fragment 표시와 실제 네트워크 E2E.
## 3. 판정 기준
상태 전이, 성공 여부 판정, 표시하지 않는 genre 제외 empty 정책, 오류·토스트 처리와 기존 API 계약 유지 여부로 판정했다.
## 4. 검토한 근거
- 코드: `HomeRecommendationUiState.kt`, `HomeRecommendationViewModel.kt`, `AppDI.kt`.
- 테스트: `HomeRecommendationViewModelTest`, `HomeMainFragmentLayoutTest`의 empty/mapper 계약.
- 검증: 관련 focused test 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 숨겨진 genre를 empty 판정에서 제외하는 후속 Phase 14 정책과 Phase 17의 Dialog 선행 절차가 현재 상태 계층과 충돌하지 않는다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 상태·ViewModel·DI 검토 완료 |
| 후보 항목 판정 완료 | 충족 | 후속 정책 포함 판정 완료 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused/full test 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 5 홈 shell·상단 UI 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 5 / HomeMainFragment 레이아웃과 상단 UI 구현 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 5 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: title bar, text tab bar, 추천 content scroll shell과 섹션 container 구성이 유지되는지 확인한다.
- 포함: `fragment_v2_main_home.xml`, `HomeMainFragment`, title/tab/section source tests.
- 제외: Figma 실기기 pixel 비교와 후속 섹션 내부 상세.
## 3. 판정 기준
추천 tab 선택, swipe 미사용, 고정 상단과 하단 content 스크롤 분리, 섹션 기본 visibility를 기준으로 판정했다.
## 4. 검토한 근거
- 코드: `fragment_v2_main_home.xml`, `HomeMainFragment.onViewCreated()`의 tab bar 설정, `setUpSectionTitles()`.
- 테스트: `HomeMainFragmentLayoutTest`, `HomeMainFragmentSourceTest`, `HomeMainTitleBarActionSourceTest`.
- 검증: home/modal focused test·resource merge·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 현재 Fragment 경로는 후속 패키지 정리 결과이며 레이아웃 binding과 source test가 현 경로를 기준으로 통과한다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | XML·Fragment·source test 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | merge/compile/test/ktlint 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12 관련 수동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 6 추천 섹션 adapter·widget 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 6 / Task 6.1~6.13 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 6 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 각 추천 섹션 adapter/binder, 빈 목록 숨김, Figma 후속 조정과 공용 widget 재사용을 확인한다.
- 포함: `v2/main/home/ui`, 홈 레이아웃, `HomeMainFragment` section binding.
- 제외: 인기 커뮤니티 상세는 Phase 7, first audio 제거와 genre 숨김은 후속 Phase에서 별도 판정.
## 3. 판정 기준
섹션별 단일 책임, 기존 widget 재사용, 빈 목록 `GONE`, 표시 개수·간격·클릭 callback, 후속 승인 변경 반영으로 판정했다.
## 4. 검토한 근거
- 코드: `HomeLiveAdapter`, `HomeRecentActivityCreatorAdapter`, `HomeRecentDebutCreatorAdapter`, `HomeAiCharacterAdapter`, `HomeCheerCreatorAdapter`, 관련 binder.
- 테스트: `HomeMainFragmentLayoutTest`, `HomeCreatorProfileImageLoaderTest`.
- 검증: home/modal focused test·resource merge·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. first audio와 genre의 초기 구현 기록은 Phase 12B와 Phase 14의 승인된 후속 변경으로 현재 UI에서 제거·숨김 처리되어 있다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 섹션 adapter/binder와 후속 변경 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 후속 Phase 소유 항목 분리 완료 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12 관련 수동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,149 @@
# Phase 7 인기 커뮤니티 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 7 / Task 7.1~7.5 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 7 |
| 리뷰 상태 | 수정 검증 완료 |
## 2. 리뷰 목적과 범위
- 목적: 추천 커뮤니티의 데이터 보존, 이미지·유료 상태, 동적 비율과 검증 기록 정합성을 확인한다.
- 포함: `FeedItem.Community`, `FeedCommunityView`, `HomePopularCommunityAdapter`, mapper, 관련 XML/test/문서.
- 제외: 커뮤니티 상세 화면 자체와 서버 구매 권한 판정.
## 3. 판정 기준
PRD의 시각 계약과 이후 보안 재리뷰 결정, 현재 코드·회귀 테스트, 변경 이력을 함께 대조하고 유료 원본의 네트워크·cache 노출 가능성을 기준으로 판정했다.
## 4. 검토한 근거
- 요구사항: `prd.md` FeedCommunityView Requirements와 UX의 유료 미구매 blur/lock 항목.
- 코드: `HomePopularCommunityAdapter.kt:53-79`, `FeedCommunityView.kt`, `FeedItem.kt`.
- 테스트: `HomePopularCommunityAdapterTest`, `HomeMainFragmentLayoutTest`, `FeedViewTest`.
- 이력: commit `2d58a876`에서 원본 미로드 방식을 blur 변환 로드 방식으로 변경.
- 후속 승인 계약: `docs/20260712_v2_크리에이터_커뮤니티_게시글_이미지_원본비율/` 문서와 commit `9244a007`이 홈 추천을 포함한 커뮤니티 이미지를 원본 비율·`fitCenter`로 변경했다. 따라서 Phase 7의 초기 `346:236` 비율과 다른 현재 이미지 크기 계산은 결함으로 판정하지 않는다.
- 검증: `HomePopularCommunityAdapterTest`·home focused test·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P7-001` | High | 수정 완료 | 유료 미구매 원본 이미지 로드가 다시 도입됐다 | `Task R7.1` | `P7-R1` |
| `REV-P7-002` | Low | 수정 완료 | 회귀 수정에서 변경한 테스트명이 영문이다 | `Task R7.2` | `P7-R2` |
| `REV-P7-003` | Medium | 수정 완료 | 원본 미로드 회귀 테스트가 adapter bind 동작을 검증하지 않는다 | `Task R7.3` | `P7-R3` |
## 6. 발견 사항 상세
### REV-P7-001 — 유료 미구매 원본 이미지 로드가 다시 도입됐다
- **심각도:** High
- **상태:** 수정 완료
- **관련 요구사항:** 유료 미구매 커뮤니티 이미지 blur/lock 표시
- **관련 계약:** 별도 API Contract 없음
- **소유 Task:** `Task R7.1` / `P7-R1`
**관찰 내용**
2026-06-05 보안 재리뷰에서 유료 미구매 item의 원본 `imageUrl`을 로드하지 않고 기존 Coil 요청과 drawable을 비우도록 수정했다. commit `2d58a876`에서 이 원본 URL을 다시 로드한 뒤 client-side `BlurTransformation`을 적용하도록 바뀌었다. 현재 working tree에서는 `P7-R1` 수정으로 원본 미로드 계약이 복구됐다.
**근거**
- 수정 전 코드: commit `2d58a876``HomePopularCommunityAdapter.kt``imageUrl`을 로드하고 잠금 상태에서 blur를 적용한다.
- 현재 코드: `HomePopularCommunityAdapter.kt`는 잠금 유료 게시물의 `imageUrl`을 image loader에 전달하지 않는다.
- 문서: `prd.md` 2026-06-05 이력과 `plan-task.md`의 보안 재리뷰 기록은 원본 미로드와 기존 Coil 요청 취소를 성공 결과로 적는다.
- 변경 이력: commit `2d58a876`이 원본 미로드 구현과 회귀 테스트를 client-side blur 로드 방식으로 함께 변경했다.
**재현 또는 검증 절차**
1. PRD 현재 요구사항과 2026-06-05 변경 이력을 대조한다.
2. adapter의 `imageUrl`/`BlurTransformation`과 회귀 테스트를 확인한다.
3. `git show 2d58a876 -- HomePopularCommunityAdapter.kt HomeMainFragmentLayoutTest.kt`로 후속 정책 변경을 확인한다.
4. 보안 재리뷰에서 제거한 원본 로드가 후속 승인 기록 없이 다시 도입됐음을 확인한다.
**영향**
유료 미구매 원본 URL이 client network 요청과 image cache에 전달되므로 화면 blur와 무관하게 원본 콘텐츠 접근 가능성이 생긴다. 또한 현재 PRD의 시각 blur 문구와 보안 결정이 충돌해 후속 구현 판단도 불안정하다.
**권장 조치**
원본 미로드를 검증하는 실패 테스트를 먼저 복구하고 adapter를 최소 수정한다. 무료·구매 완료 이미지는 기존대로 유지하고, 유료 미구매 item은 원본 요청을 취소·비우되 lock overlay와 가격을 유지한다. PRD도 이 보안 결정과 일치시키며 서버가 별도 안전 preview를 제공한다는 계약은 추정하지 않는다.
**판정 기록**
- 2026-07-31 — 현재 코드·테스트·git 이력과 2026-06-05 보안 재리뷰 기록을 교차 확인해 보안 정책 회귀로 확정했다.
- 2026-07-31 — `P7-R1` 수정과 focused·home·compile·ktlint·diff 검증 성공으로 수정 완료 판정했다.
### REV-P7-002 — 회귀 수정에서 변경한 테스트명이 영문이다
- **심각도:** Low
- **상태:** 수정 완료
- **관련 요구사항:** `code-style.md` 신규 Kotlin 테스트명 한글 문장 규칙
- **소유 Task:** `Task R7.2` / `P7-R2`
**관찰 내용·근거**
`P7-R1`에서 기존 영문 테스트명을 `home popular community adapter does not load original image for locked paid post`로 변경했다. 신규/변경 Kotlin 테스트명은 한글 문장을 사용해야 하며 외부 API명 등으로 영문을 유지할 경우에는 한글 주석이 필요하지만 두 조건 모두 충족하지 않는다.
**재현 절차**
1. `git diff -- HomeMainFragmentLayoutTest.kt`로 테스트명 변경을 확인한다.
2. `code-style.md` §5 테스트 관례와 대조한다.
**영향·권장 조치**
런타임 영향은 없으나 신규 테스트 규칙과 리뷰 완료 증거가 불일치한다. assertion과 production code는 유지하고 테스트명만 한글 문장으로 정정한다.
**판정 기록**
- 2026-07-31 — current diff와 코드 스타일 규칙 대조로 확정했다.
- 2026-07-31 — `P7-R2` 테스트명 정정과 focused/direct 영향 테스트, `ktlintCheck`, `git diff --check` 성공으로 수정 완료 판정했다.
### REV-P7-003 — 원본 미로드 회귀 테스트가 adapter bind 동작을 검증하지 않는다
- **심각도:** Medium
- **상태:** 수정 완료
- **관련 요구사항:** 유료 미구매 원본 미로드·기존 Coil 요청 해제·drawable 제거·lock overlay/가격 유지
- **소유 Task:** `Task R7.3` / `P7-R3`
**관찰 내용·근거**
`P7-R3` 수정 전 `HomeMainFragmentLayoutTest.유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다``HomePopularCommunityAdapter.kt`를 문자열로 읽어 특정 코드 조각과 `BlurTransformation` 미존재만 확인했다. ViewHolder를 실제로 bind하지 않아 기존 image request가 해제되는지, 재활용된 view의 drawable가 비워지는지, lock overlay와 가격이 유지되는지를 증명하지 못했다. 특히 `P7-R1` 완료 증거가 이 동작들을 명시했고, 같은 보안 계약이 commit `2d58a876`에서 이미 한 차례 회귀했으므로 소스 문자열 검사만으로는 회귀 방지 강도가 부족했다.
**영향·권장 조치**
현재 production 코드에서는 잠금 유료 item의 URL이 loader로 전달되지 않고 blank 경로에서 `dispose()``setImageDrawable(null)`을 호출하므로 즉시 production 결함은 확인되지 않았다. 다만 재활용된 image view 상태를 포함한 adapter bind 실행형 테스트로 보안 계약을 고정하고, 무료·구매 완료 경로가 기존대로 이미지를 로드하는지도 함께 검증한다.
**판정 기록**
- 2026-07-31 — production bind 코드와 현재 테스트 assertion, `P7-R1` 완료 증거를 대조해 실행형 회귀 검증 부재를 확정했다.
- 2026-07-31 — `P7-R3`에서 source 문자열 검사를 제거하고 실제 adapter/ViewHolder bind 회귀 테스트 2건으로 교체했다. 잠금 유료 원본 미로드·이전 요청 해제·drawable 제거·overlay/가격 유지와 무료·구매 완료 URL 전달을 검증했고, 보안 분기 mutation 실패와 원상 복구 후 성공을 확인해 수정 완료로 판정했다.
## 7. 확정 항목의 plan·goal 전환
`Task R7.1` / `P7-R1`, `Task R7.2` / `P7-R2`, `Task R7.3` / `P7-R3`은 모두 수정 검증까지 완료했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 코드·test·문서·git 이력 대조 완료 |
| 후보 항목 판정 완료 | 충족 | `REV-P7-001`, `REV-P7-002`, `REV-P7-003` 수정 완료 |
| 확정 항목 plan 반영 | 충족 | `Task R7.3` / `P7-R3` 실행·검증 완료 |
| 보류 항목의 담당·재개 조건 기록 | 해당 없음 | 보류 없음 |
| 검증 명령과 결과 기록 | 충족 | focused/full 검증 기록 연결 |
**최종 결론:** 승인
**남은 항목:** 없음
## 9. 수정 후 검증 기록
- 2026-07-31 — `P7-R1` 실행으로 `HomePopularCommunityAdapter`의 유료 미구매 원본 이미지 로드 회귀를 복구했다. 변경 파일은 `HomePopularCommunityAdapter.kt`, `HomeMainFragmentLayoutTest.kt`, `prd.md`, `plan-task.md`, 이 리뷰 보고서다. RED는 `HomeMainFragmentLayoutTest.home popular community adapter does not load original image for locked paid post`를 추가한 뒤 focused test에서 `HomeMainFragmentLayoutTest.kt:1032` assertion 실패로 확인했다. GREEN은 유료 미구매 item의 `imageUrl`을 image loader에 전달하지 않고 `BlurTransformation` 경로를 제거하는 최소 수정 후 동일 focused test BUILD SUCCESSFUL로 확인했다. `FeedCommunityView.bind()` 호출은 유지하므로 lock overlay와 가격 표시는 기존 계약을 따른다. 후속 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`를 순차 실행했고 모두 성공했다. `ktlintCheck``.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다.
- 2026-07-31 — `P7-R2` 실행으로 `HomeMainFragmentLayoutTest`의 테스트명을 `유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다`로 정정했다. Production code와 assertion은 변경하지 않았다. focused test, `HomeMainFragmentLayoutTest`·`V2ModalDialogTest` 직접 영향 회귀, `./gradlew :app:ktlintCheck`, `git diff --check`가 모두 성공했다. 남은 항목은 없다.
- 2026-07-31 — `P7-R3` 실행으로 `HomeMainFragmentLayoutTest`의 source 문자열 검사를 제거하고 `HomePopularCommunityAdapterTest.kt`를 추가했다. 실제 adapter/ViewHolder bind와 외부 이미지 loader 경계만 차단하는 테스트 2건으로 잠금 유료 원본 미로드·기존 Coil 요청 해제·drawable 제거·lock overlay/가격 유지, 무료·구매 완료 원본 URL 전달을 검증했다. 보안 분기를 일시적으로 직접 URL 전달로 바꾼 mutation 실행은 잠금 test 1건이 `HomePopularCommunityAdapterTest.kt:72`에서 실패했고, 원상 복구 후 전용 class 2건이 성공했다. 직접 영향 test·compile·ktlint가 성공했으며 전체 unit suite는 162 suites, 1,198 tests, 실패 0, error 0으로 성공했다. 최종 production 코드는 이번 Task에서 추가 변경하지 않았고 남은 항목은 없다.

View File

@@ -0,0 +1,57 @@
# Phase 8 사업자 정보 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 8 / 사업자 정보 접기·더보기 |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 8 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: 3줄 접힘, inline 더보기·접기, 짧은 본문 처리와 레이아웃 안정성을 확인한다.
- 포함: `HomeBusinessInfoBinder`, 홈 Fragment/XML, 관련 Robolectric test.
- 제외: 사업자 정보 문구의 제품·법무 검토.
## 3. 판정 기준
짧은 문구 no-action, 긴 문구 접힘/펼침 복귀, clickable span 범위와 별도 toggle View 미사용으로 판정했다.
## 4. 검토한 근거
- 코드: `HomeBusinessInfoBinder.kt`, `HomeMainFragment.setUpBusinessInfo()`, `fragment_v2_main_home.xml`.
- 테스트: `HomeMainFragmentLayoutTest`의 사업자 정보 inline action 계약.
- 검증: home/modal focused test·resource merge·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 초기 별도 toggle 계획은 승인된 후속 inline action 변경으로 대체됐고 현재 테스트가 해당 계약을 검증한다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | binder·XML·test 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | focused 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12의 사업자 정보 수동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.

View File

@@ -0,0 +1,57 @@
# Phase 9 상태 바인딩·기본 라우팅 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 9 / 상태 observe, schema, 라우팅·안정성 후속 Task |
| 기준 commit 또는 working tree | `a106548f` 기반 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | `prd.md`, `plan-task.md` Phase 9 |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
- 목적: sample 제거, 실제 ViewModel 상태 바인딩, loading/toast, 최신 schema, 이미지·배너 안정성 후속 조치를 확인한다.
- 포함: `HomeMainFragment`, recommendation data/model/state, `HomeBannerBinder`, image loader와 관련 tests.
- 제외: 목적지별 확정 라우팅은 Phase 10·11·13·16에서 별도 판정.
## 3. 판정 기준
임시 데이터 미사용, 표시 상태 일관성, invalid data no-op, 중복 배너 식별, 캐시·대량 notify 회귀 방지로 판정했다.
## 4. 검토한 근거
- 코드: `HomeMainFragment.kt`, `HomeRecommendationModels.kt`, `HomeRecommendationMappers.kt`, `HomeBannerBinder.kt`, `ImageLoaderProvider`.
- 테스트: `HomeMainFragmentLayoutTest`, `BannerViewTest`, `ImageLoaderProviderTest`.
- 검증: home/modal focused test·merge·compile·ktlint 성공, 최신 전체 1,198 tests 중 실패 0·error 0.
## 5. 발견 사항 요약
확정 발견 사항 없음.
## 6. 발견 사항 상세
없음. 계획에 누적된 schema·cache·banner 후속 수정이 현재 코드와 테스트에 남아 있으며 sample content 경로는 production에서 제거됐다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | 상태·schema·안정성 코드 대조 완료 |
| 후보 항목 판정 완료 | 충족 | 확정 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 검증 명령과 결과 기록 | 충족 | 자동 검증 성공 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 없음. Phase 12 화면 수동 항목은 사용자 확인으로 완료됐다.
## 9. 수정 후 검증 기록
수정 항목 없음.