fix(home): 홈 추천 후속 검증을 반영한다
This commit is contained in:
@@ -41,6 +41,28 @@
|
||||
- 신규 필요 후보: 최근 활동 카드, 최근 데뷔 크리에이터 카드, 장르별/응원 크리에이터 profile grid, 모두 팔로우 버튼, 사업자 정보 접기 영역.
|
||||
- 검증: PRD의 Section Mapping 표와 구현 대상/제외 대상이 일치하는지 문서 체크한다.
|
||||
|
||||
#### Task R1.1: HomeMainFragment 현재 경로 추적성 복구
|
||||
|
||||
**Goal 실행 `P1-R1`:** 현재 `HomeMainFragment` 경로와 PRD·계획의 활성 경로 안내를 일치시켜 후속 작업이 존재하지 않는 과거 경로를 기준으로 삼지 않게 한다.
|
||||
|
||||
- **시작 조건:** `REV-P1-001` 확정 및 `reviews/phase1-existing-boundary-review.md` 판정 완료.
|
||||
- **완료 증거:** 현재 파일 존재/과거 파일 미존재 재현, PRD 활성 제약과 Phase 1 현재 경로 안내 정정, 문서 검색과 `git diff --check` 성공.
|
||||
- **범위 밖:** 완료된 과거 Task의 파일 이력 삭제, production 패키지 이동, 관련 없는 홈 구조 리팩터링.
|
||||
- **TDD 예외 사유:** production 동작을 바꾸지 않는 문서 경로 추적성 정정이므로 실패 test 대신 파일 존재와 문서 검색을 대체 검증으로 사용한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase1-existing-boundary-review.md`
|
||||
|
||||
- [x] `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt` 존재와 과거 `v2/main/HomeMainFragment.kt` 미존재를 재현한다.
|
||||
- [x] PRD Technical Constraints와 Phase 1에 현재 canonical 경로를 명시하되 기존 완료 이력은 삭제하지 않는다.
|
||||
- [x] `rg` 경로 검색과 `git diff --check`를 실행하고 결과를 Task 검증 기록에 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `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"`를 실행해 현재 파일 존재와 과거 파일 미존재를 확인했다. 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`를 명시하고 과거 경로 미존재를 덧붙였다.
|
||||
- 검증 기록: 2026-07-31 `rg -n "v2\.main\.HomeMainFragment|v2/main/HomeMainFragment|v2/main/home/HomeMainFragment|kr\.co\.vividnext\.sodalive\.v2\.main\.home\.HomeMainFragment|kr\.co\.vividnext\.sodalive\.v2\.main\.HomeMainFragment"`로 PRD, 계획, Phase 1 리뷰의 현재/과거 경로 참조를 확인했다. `git diff --check`는 출력 없이 성공했다.
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: API DTO, Repository, DI 추가
|
||||
@@ -409,6 +431,79 @@
|
||||
- Kotlin `clipToOutline`/`ViewOutlineProvider.setRoundRect(...)` clipping 계약 유지
|
||||
- 검증: 인기 커뮤니티 이미지 영역이 화면 폭에 맞춰 계산되어 고정 폭 때문에 잘리지 않는다.
|
||||
|
||||
#### Task R7.1: 유료 미구매 원본 이미지 로드 회귀 수정
|
||||
|
||||
**Goal 실행 `P7-R1`:** 유료 미구매 게시물에서 원본 `imageUrl`을 다시 로드하는 회귀를 막고, 원본 미로드 상태에서도 기존 lock overlay와 가격 표시를 유지하며 요구사항·코드·테스트·검증 기록을 일치시킨다.
|
||||
|
||||
- **시작 조건:** `REV-P7-001` 확정 및 `reviews/phase7-popular-community-review.md` 판정 완료.
|
||||
- **완료 증거:** 현재 코드에서 실패하는 원본 미로드 회귀 테스트, 최소 수정 후 focused test와 home 회귀·compile·ktlint 성공, PRD/plan 정합성 정정, 리뷰 보고서 수정 후 검증 기록 누적.
|
||||
- **범위 밖:** API·DTO에 서버 preview 필드 추정 추가, 구매 권한 판정 변경, `FeedCommunityView` 공통 레이아웃 리팩터링, 기존 완료 기록 삭제 또는 덮어쓰기.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePopularCommunityAdapter.kt`
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase7-popular-community-review.md`
|
||||
|
||||
- [x] **RED:** 유료 미구매 item의 원본 URL을 image loader에 전달하지 않고 기존 요청·drawable을 비우며 lock overlay/가격은 유지하는 회귀 테스트를 먼저 추가해 현재 구현에서 의도한 실패를 확인한다.
|
||||
- [x] **GREEN:** `HomePopularCommunityAdapter`만 최소 수정해 무료·구매 완료 이미지는 기존대로 로드하고 유료 미구매 원본 이미지는 로드하지 않도록 복구한다.
|
||||
- [x] 현재 PRD의 blur 문구를 원본 미로드 보안 결정과 일치시키고, commit `2d58a876`에서 발생한 회귀 및 이번 복구 이력을 기존 기록을 삭제하지 않은 채 PRD와 `Verification Log`에 누적한다.
|
||||
- [x] focused test, `HomeMainFragmentLayoutTest` 전체, `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check`를 실행한다.
|
||||
- [x] `REV-P7-001` 보고서의 `수정 후 검증 기록`에 변경 파일, 검증 명령, 결과와 남은 항목을 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 RED는 `HomeMainFragmentLayoutTest.home popular community adapter does not load original image for locked paid post`를 먼저 추가하고 focused test를 실행해 `HomeMainFragmentLayoutTest.kt:1032` assertion 실패로 확인했다. GREEN은 `HomePopularCommunityAdapter`에서 잠금 유료 게시물일 때 `imageUrl`을 전달하지 않고 `BlurTransformation` 경로를 제거하는 최소 변경으로 동일 focused test BUILD SUCCESSFUL을 확인했다. `FeedCommunityView.bind(item.item)` 호출은 유지해 lock overlay와 가격 capsule은 기존 View 계약을 따른다.
|
||||
- 검증 기록: 2026-07-31 후속 검증으로 `./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은 기존 경고다. `REV-P7-001` 보고서의 `수정 후 검증 기록`에 변경 파일, 검증 명령, 결과, 남은 항목 없음 상태를 누적했다.
|
||||
|
||||
#### Task R7.2: 인기 커뮤니티 회귀 테스트 이름 규칙 정정
|
||||
|
||||
**Goal 실행 `P7-R2`:** `REV-P7-002`의 현재 영문 테스트명을 한글 문장으로 정정하고 원본 미로드 회귀 assertion을 그대로 유지한다.
|
||||
|
||||
- **시작 조건:** `REV-P7-002` 확정 및 `P7-R1` 수정 검증 완료.
|
||||
- **완료 증거:** 테스트명을 `유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다`로 정정, 동일 focused test·`ktlintCheck`·`git diff --check` 성공, 리뷰 보고서 검증 기록 누적.
|
||||
- **범위 밖:** production adapter 동작, assertion 완화, 다른 기존 영문 테스트명 일괄 정리.
|
||||
- **TDD 예외 사유:** 기존 회귀 테스트의 표현만 정정하는 코드 품질 Task이므로 RED/GREEN 대신 정정 전·후 동일 assertion 성공을 검증한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase7-popular-community-review.md`
|
||||
|
||||
- [x] 현재 테스트명과 `code-style.md` 규칙 위반을 검색으로 재현한다.
|
||||
- [x] assertion과 production code는 바꾸지 않고 대상 테스트명만 한글로 정정한다.
|
||||
- [x] 변경된 메서드 focused test, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행하고 결과를 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `rg -n "home popular community adapter does not load original image for locked paid post|cheer creator follow all opens confirm dialog before api request|follow all confirm strings are localized" app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt docs/agent-guides/code-style.md`로 신규 영문 테스트명과 `code-style.md` 한글 테스트명 규칙 위반을 재현했다. Production code와 assertion은 바꾸지 않고 대상 테스트명을 `유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다`로 정정했다.
|
||||
- 검증 기록: 2026-07-31 변경된 메서드 focused test `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.모두 팔로우 확인창 문자열은 다국어로 제공한다"`, 직접 영향 회귀 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest"`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행했고 모두 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다.
|
||||
|
||||
#### Task R7.3: 유료 미구매 이미지 미로드 실행형 회귀 테스트 보강
|
||||
|
||||
**Goal 실행 `P7-R3`:** `REV-P7-003`의 소스 문자열 검사를 실제 adapter bind 동작 회귀 테스트로 대체해, 유료 미구매 이미지의 원본 미로드·기존 요청 해제·drawable 제거·lock overlay·가격 표시 계약을 실행 결과로 보호한다.
|
||||
|
||||
- **시작 조건:** `REV-P7-003` 확정 및 `reviews/phase7-popular-community-review.md` 판정 완료.
|
||||
- **완료 증거:** 잠금 유료 item을 `HomePopularCommunityAdapter` ViewHolder에 bind하는 실행형 테스트, 기존 image request/drawable 제거와 overlay/가격 유지 assertion, 무료·구매 완료 이미지 경로 회귀, focused·home·compile·ktlint·diff 검증 성공, 리뷰 보고서 결과 누적.
|
||||
- **범위 밖:** production 보안 정책 변경, 서버 preview 필드 추정, `FeedCommunityView` 공통 레이아웃 리팩터링, 기존 테스트 전체 재구성.
|
||||
- **TDD 예외 사유:** production 보안 회귀는 `P7-R1`에서 이미 RED/GREEN으로 수정됐고 이번 항목은 완료 증거의 실행성 보강이다. 현재 정상 동작에서 새 테스트가 통과하는 것을 기준으로 하며, 실행형 테스트가 추가 결함을 드러낸 경우에만 production 수정용 RED/GREEN으로 전환한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt` 또는 동일 패키지의 전용 adapter test
|
||||
- Modify only if RED 재현이 production 결함을 확정할 때: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePopularCommunityAdapter.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase7-popular-community-review.md`
|
||||
|
||||
- [x] **TEST:** 잠금 유료 item bind 전 image view에 기존 drawable/request가 있는 상태를 만들고 bind 후 원본 로드 미실행, 요청 해제, drawable 제거, lock overlay 표시, 가격 유지를 실행형 assertion으로 검증한다.
|
||||
- [x] **FIX IF NEEDED:** 실행형 테스트가 production 결함을 재현한 경우에만 별도 RED/GREEN 기록 후 adapter를 최소 수정하고, 현재 동작이 이미 계약을 충족하면 production은 변경하지 않는다.
|
||||
- [x] 무료·구매 완료 item의 이미지 로드 경로와 잠금 유료 item의 overlay/가격 표시 회귀를 함께 검증한다.
|
||||
- [x] focused test, `HomeMainFragmentLayoutTest` 또는 전용 adapter test 전체, `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check`를 실행한다.
|
||||
- [x] `REV-P7-003` 보고서에 변경 파일, 실행형 테스트 결과, 필요 시 RED/GREEN 결과, 검증 명령, 남은 항목을 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 기존 `HomeMainFragmentLayoutTest`의 production source 문자열 검사를 제거하고 `HomePopularCommunityAdapterTest`를 추가했다. 잠금 유료 item은 실제 adapter/ViewHolder bind에서 원본 URL `loadUrl` 호출 0회, 재사용 image view의 기존 Coil `Disposable` 해제, drawable 제거, lock overlay `VISIBLE`, 가격 `30`을 검증한다. 무료와 구매 완료 item은 각각의 원본 URL이 loader 경계에 정확히 1회 전달되는지 검증한다. 외부 이미지 로딩만 MockK static 경계로 차단하고 adapter, ViewHolder, `FeedCommunityView`, Coil 요청 해제는 실제 구현을 실행했다.
|
||||
- 검증 기록: 2026-07-31 테스트 효과 확인을 위해 `HomePopularCommunityAdapter`의 보안 분기를 일시적으로 `item.item.imageUrl` 직접 전달로 변경한 뒤 잠금 focused test를 실행했고, `HomePopularCommunityAdapterTest.kt:72`의 원본 `loadUrl` 호출 0회 assertion에서 1건 실패했다. 즉시 `takeIf { !item.item.isLockedPaidPost() }` 분기를 복구한 뒤 전용 test class 2건이 BUILD SUCCESSFUL로 다시 통과했다. 최종 production 동작은 `P7-R1` 상태와 같아 이번 Task에서 추가 production 수정은 남기지 않았다.
|
||||
- 검증 기록: 2026-07-31 `HomePopularCommunityAdapterTest`와 `HomeMainFragmentLayoutTest`, `:app:compileDebugKotlin`, `:app:ktlintCheck` 결합 명령은 BUILD SUCCESSFUL이었다. 전체 `./gradlew :app:testDebugUnitTest --no-parallel --console=plain`도 162 suites, 1,198 tests, 실패 0, error 0으로 BUILD SUCCESSFUL이었다. ktlint의 `.editorconfig disabled_rules`와 Gradle deprecation warning은 기존 경고다. 코드 재검토에서 추가 production 결함이나 신규 회귀 Task 전환 항목은 확인되지 않았다.
|
||||
|
||||
---
|
||||
|
||||
### Phase 8: 사업자 정보 접기/더보기 구현
|
||||
@@ -582,7 +677,7 @@
|
||||
- 실행: `./gradlew :app:ktlintCheck`
|
||||
- 기대 결과: 모두 성공.
|
||||
|
||||
- [ ] **Task 12.2: 수동 확인** `[blocked: 연결된 Android 기기 없음]`
|
||||
- [x] **Task 12.2: 수동 확인**
|
||||
- 확인 항목:
|
||||
- 추천 tab 선택 상태
|
||||
- tab 전환은 글자 터치로만 동작하고 swipe 전환은 없음
|
||||
@@ -590,7 +685,7 @@
|
||||
- 섹션 순서가 PRD 도식과 일치
|
||||
- 제외 섹션 미노출
|
||||
- 빈 리스트 섹션 숨김
|
||||
- 첫 오디오 태그 조건
|
||||
- Phase 12B에서 제거된 첫 오디오 섹션과 관련 태그 미노출
|
||||
- activity type 다국어 문자열
|
||||
- 방금 활동한 크리에이터 목적지별 클릭 이동
|
||||
- AI 캐릭터 item 크리에이터 채널 클릭 이동
|
||||
@@ -606,6 +701,48 @@
|
||||
- 구현 내용: 실행 명령, 결과, 실패 시 원인과 후속 조치를 문서 하단 `검증 기록`에 누적한다.
|
||||
- 주의: 기존 검증 기록은 삭제하거나 덮어쓰지 않는다.
|
||||
|
||||
#### Task R12.1: 연결 기기 확인 후 수동 검증 재개
|
||||
|
||||
**Goal 실행 `P12-R1`:** `REV-P12-001`의 오래된 `연결된 Android 기기 없음` blocker를 현재 환경에 맞게 정정하고 Task 12.2 수동 확인을 재개한다.
|
||||
|
||||
- **시작 조건:** `REV-P12-001` 확정, `adb devices`에서 사용 가능한 기기 1대 확인, Task 12.1 자동 검증 성공.
|
||||
- **완료 증거:** Task 12.2의 홈 추천 항목을 실제 기기에서 확인, 항목별 결과·불가 사유·캡처 또는 로그 등 근거 누적, Phase 12 리뷰 판정 갱신.
|
||||
- **범위 밖:** 수동 Gate 통과를 위한 production 변경, 서버 추천 데이터 임의 조작, 다른 홈 tab 기능 수정.
|
||||
- **TDD 예외 사유:** 실기기 UI·상호작용 확인 Task이므로 기존 자동 검증을 선행 조건으로 사용하고 항목별 수동 증거로 완료를 판정한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase12-final-verification-review.md`
|
||||
|
||||
- [x] `adb devices`를 재실행해 기기 연결 상태를 기록하고 Task 12.2의 기존 blocker 문구를 현재 상태로 정정한다.
|
||||
- [x] Task 12.2 추천 tab·스크롤·섹션·라우팅·사업자 정보 항목을 실기기에서 확인하고 각 항목의 결과를 누적한다.
|
||||
- [x] 수동 확인 결과에 따라 Task 12.2와 Phase 12 리뷰 종료 판정을 갱신하되 기존 기록은 삭제하지 않는다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `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 추천 tab·스크롤·섹션·라우팅·사업자 정보 실기기 항목은 홈 추천 화면 접근 불가로 계속 blocked 처리한다.
|
||||
- 검증 기록: 2026-07-31 재검증에서 `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 화면으로 판독됐다. 홈 추천 화면과 Phase 17 확인창까지 접근하지 못해 Task 12.2 및 P17-GATE 수동 항목은 계속 blocked로 유지한다.
|
||||
- 검증 기록: 2026-07-31 사용자 수동 확인으로 추천 tab 선택, tab 터치 전환과 swipe 미전환, title/tab bar 고정과 content 스크롤, 제외 섹션 미노출, 빈 리스트 섹션 숨김, first audio 섹션/태그 미노출, 최근 활동/AI 캐릭터/배너 라우팅, 인기 커뮤니티 이미지 상태, 사업자 정보 더보기/접기가 모두 동작함을 확인했다.
|
||||
|
||||
#### Task R12.2: 수동 확인의 first audio 제거 계약 동기화
|
||||
|
||||
**Goal 실행 `P12-R2`:** `REV-P12-002`의 미완료 Task 12.2가 제거된 first audio 표시 계약을 요구하지 않고 Phase 12B의 미노출 계약을 검증하도록 정정한다.
|
||||
|
||||
- **시작 조건:** `REV-P12-002` 확정, `P12B-T1`·`P12B-T2` production 제거 완료 유지, Task 12.2 수동 확인 blocked 상태.
|
||||
- **완료 증거:** Task 12.2의 `첫 오디오 태그 조건`을 `첫 오디오 섹션과 관련 태그 미노출`로 정정, production 금지 참조 및 문서 활성 항목 검색, `git diff --check` 성공, 리뷰 보고서 검증 기록 누적.
|
||||
- **범위 밖:** Task 12.2 수동 항목 실행, production·resource·test 변경, 과거 Phase 6·9 이력 삭제.
|
||||
- **TDD 예외 사유:** 이미 완료된 production 제거에 대한 미완료 수동 체크리스트만 정정하므로 `rg` 대조와 문서 diff를 대체 검증으로 사용한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase12-final-verification-review.md`
|
||||
|
||||
- [x] Task 12.2의 활성 first audio 표시 확인 항목과 Phase 12B 제거 계약의 불일치를 `rg`로 재현한다.
|
||||
- [x] 과거 검증 이력은 보존하고 Task 12.2 활성 항목만 first audio 미노출 검증으로 정정한다.
|
||||
- [x] production 금지 참조 및 문서 활성 항목 검색과 `git diff --check`를 실행하고 결과를 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `rg -n "firstAudioContents|HomeFirstAudioContentItem|releaseDate|첫 오디오|처음부터 함께 성장" docs/20260601_메인_홈_추천_UI와_API_연동/prd.md docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md app/src/main/java/kr/co/vividnext/sodalive/v2/main/home app/src/main/res/values app/src/main/res/layout`로 Task 12.2의 활성 `첫 오디오 태그 조건`과 Phase 12B 제거 계약이 추돌함을 재현했다. 해당 항목을 `Phase 12B에서 제거된 첫 오디오 섹션과 관련 태그 미노출`로 정정했고 production/resource 제거 계약은 유지됨을 확인했다. `git diff --check`는 출력 없이 성공했다.
|
||||
|
||||
---
|
||||
|
||||
## 확인 완료 사항
|
||||
@@ -721,6 +858,16 @@
|
||||
|
||||
### Phase 12: `처음부터 함께 성장!` 섹션 제거
|
||||
|
||||
#### Phase 12B 식별자 별칭
|
||||
|
||||
기존 완료 이력의 제목과 체크박스는 보존한다. 이후 리뷰·회귀 수정·검증 기록에서 이 두 번째 Phase 12를 참조할 때는 아래 고유 별칭을 사용한다.
|
||||
|
||||
| 역사적 식별자 | 고유 별칭 | 이후 참조 규칙 |
|
||||
|---|---|---|
|
||||
| 두 번째 `Phase 12: 처음부터 함께 성장! 섹션 제거` | `P12B` | first audio 제거 Phase는 `P12B`로 표기한다. |
|
||||
| 두 번째 Phase 12의 `Task 10.1` | `P12B-T1` | 홈 추천 Response/UI first audio 제거 항목은 `P12B-T1`로 표기한다. |
|
||||
| 두 번째 Phase 12의 `Task 10.2` | `P12B-T2` | first audio 전체보기와 리소스 제거 항목은 `P12B-T2`로 표기한다. |
|
||||
|
||||
- [x] **Task 10.1: 홈 추천 Response와 UI에서 firstAudio 제거**
|
||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/data/HomeRecommendationModels.kt`
|
||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt`
|
||||
@@ -737,6 +884,49 @@
|
||||
- 수정: `app/src/main/res/values/strings.xml`, `values-en/strings.xml`, `values-ja/strings.xml`
|
||||
- 검증 기록: 2026-06-29 `ContentOverviewType.FIRST_AUDIO_CONTENT`와 `home_recommendation_section_first_audio_contents` production 참조를 제거하고, `NEW_AND_HOT_AUDIO` 경로는 유지했다.
|
||||
|
||||
#### Task R12B.1: 중복 Phase·Task 식별자 추적성 복구
|
||||
|
||||
**Goal 실행 `P12B-R1`:** 두 번째 `Phase 12`와 그 안의 `Task 10.1`·`Task 10.2`를 기존 완료 이력을 보존한 채 고유 별칭으로 식별할 수 있게 해 리뷰·회귀 Task 연결의 모호성을 제거한다.
|
||||
|
||||
- **시작 조건:** `REV-P12B-001` 확정 및 `reviews/phase12-first-audio-removal-review.md` 판정 완료.
|
||||
- **완료 증거:** 역사적 식별자와 신규 고유 별칭 대응표 추가, 이후 참조 규칙 명시, 중복 식별자 검색 결과와 `git diff --check` 성공, 리뷰 보고서 수정 후 검증 기록 누적.
|
||||
- **범위 밖:** 기존 완료 Phase·Task 체크박스 재개방, 기존 식별자 삭제, first audio production 코드 또는 리소스 변경.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase12-first-audio-removal-review.md`
|
||||
|
||||
- [x] **문서 검증 예외:** production 동작 변경이 없는 추적성 정정이므로 실패 재현 테스트 대신 `Phase 12` 및 `Task 10.*` 중복 검색 결과를 재현 근거로 사용한다.
|
||||
- [x] 기존 제목과 완료 기록은 유지하고, 두 번째 Phase 12 및 하위 Task에 `P12B`, `P12B-T1`, `P12B-T2` 고유 별칭 대응표와 이후 참조 규칙을 추가한다.
|
||||
- [x] Phase별 리뷰·회귀 문서가 고유 별칭으로 연결되는지 `rg`로 확인하고 `git diff --check`를 실행한다.
|
||||
- [x] `REV-P12B-001` 보고서의 `수정 후 검증 기록`에 변경 파일, 검증 명령, 결과와 남은 항목을 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 문서 검증 예외로 `rg -n "^(### Phase 12:|## Phase 12:|#### Task 10\.|- \[x\] \*\*Task 10\.)" "docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md"`를 실행해 첫 번째 `Phase 12`, 두 번째 `Phase 12`, Phase 10 `Task 10.1`, 두 번째 Phase 12의 `Task 10.1`·`Task 10.2` 충돌을 재현했다. 기존 완료 제목과 체크박스는 유지하고 `P12B`, `P12B-T1`, `P12B-T2` 별칭 표와 이후 참조 규칙만 추가했다.
|
||||
- 검증 기록: 2026-07-31 `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`는 출력 없이 성공했다. `REV-P12B-001` 보고서의 `수정 후 검증 기록`에 변경 파일, 검증 명령, 결과, 남은 항목 없음 상태를 누적했다.
|
||||
|
||||
#### Task R12B.2: PRD 활성 영역의 first audio 제거 계약 동기화
|
||||
|
||||
**Goal 실행 `P12B-R2`:** `REV-P12B-002`에서 확인한 PRD 활성 섹션 도식·Metrics·Open Questions의 first audio 잔존 문구를 Phase 12B 제거 계약과 일치시킨다.
|
||||
|
||||
- **시작 조건:** `REV-P12B-002` 확정, `P12B-T1`·`P12B-T2` production 제거 완료 유지.
|
||||
- **완료 증거:** PRD의 현재 Problem·섹션 도식·Metrics·Open Questions에서 제거된 `firstAudioContents`·`HomeFirstAudioContentItem`·`releaseDate` 활성 계약 제거, 2026-06-01 구현 이력과 2026-06-29 제거 기록 보존, production 금지 참조 검색과 `git diff --check` 성공.
|
||||
- **범위 밖:** 과거 검증 이력 삭제, `NEW_AND_HOT_AUDIO` 기능, production·resource·test 변경.
|
||||
- **TDD 예외 사유:** production 제거는 이미 완료되었고 현재 PRD 정합성만 정정하므로 `rg` 금지 참조 검색과 문서 재독을 대체 검증으로 사용한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase12-first-audio-removal-review.md`
|
||||
|
||||
- [x] PRD 활성 영역에 남은 first audio 참조와 production 미존재를 `rg`로 재현한다.
|
||||
- [x] Problem·섹션 도식·Metrics·Open Questions를 제거 계약에 맞게 정정하고 과거 이력은 그대로 보존한다.
|
||||
- [x] `rg -n "firstAudioContents|HomeFirstAudioContentItem|releaseDate"` 결과를 과거 기록과 활성 계약으로 분류하고 `git diff --check` 결과를 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `rg -n "firstAudioContents|HomeFirstAudio|FIRST_AUDIO_CONTENT|AudioContentCardView|releaseDate|첫 오디오|처음부터 함께 성장" "docs/20260601_메인_홈_추천_UI와_API_연동/prd.md" app/src/main`로 PRD 활성 영역의 first audio 잔존 참조와 production 미존재를 재현했다. 활성 Problem, 섹션 도식, Metrics, Open Questions에서는 first audio 완료 조건을 제거했고, 2026-06-01 과거 기록 및 2026-06-29 제거 기록은 보존했다.
|
||||
- 검증 기록: 2026-07-31 `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 과거 기록 및 2026-06-29 제거 기록만 반환하고, v2 home production/resource 제거 대상 참조는 반환하지 않았다. `git diff --check`는 출력 없이 성공했다.
|
||||
|
||||
### Phase 13: 커뮤니티 상세 라우팅 변경
|
||||
|
||||
- [x] **Task 13.1: 방금 활동한 크리에이터 COMMUNITY 라우팅 변경**
|
||||
@@ -891,7 +1081,180 @@ git diff --check
|
||||
- 2026-07-30: 사용자의 `진행`은 production 구현이 아니라 `plan-task.md` 반영을 의미한다는 설명에 따라 Phase 16 구현을 중단했다. 설명을 받기 전에 `HomeMainFragmentLayoutTest`에 `creatorId` DTO/UI model 보존, `LIVE + targetId`의 `LiveRoom`, `LIVE + targetId == null`의 `CreatorChannel`, `creatorId <= 0L` no-op RED 계약을 추가했고, `HomeMainFragmentLoginGuardSourceTest`에 최근 활동 route가 기존 Live/Creator Action을 사용하는 계약을 추가했다. 사용자가 이미 작성된 코드는 삭제하지 않도록 요청해 두 테스트 변경은 유지한다. focused test 명령은 실행 중 사용자 중단으로 종료되어 성공·실패 출력이 없으므로 `RED 확인`은 미완료 상태로 남긴다. `git diff --name-only` 기준 변경은 PRD, 계획 문서, 위 두 테스트 파일뿐이며 `app/src/main` production 코드는 변경되지 않았다. 커밋은 생성하지 않았다.
|
||||
- 2026-07-30: Phase 16 구현을 재개해 기존 RED 계약을 실행했다. focused RED는 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest"`에서 `HomeActiveCreatorItem.creatorId`, `HomeRecommendationRecentlyActiveCreatorUiModel.creatorId`, `LiveRoom`, `CreatorChannel` 미정의 컴파일 실패로 확인했다. GREEN 구현으로 `HomeActiveCreatorItem.creatorId`를 DTO에 추가하고 최근 활동 UI model까지 보존했으며, `CreatorActivityType.Live` route를 `targetId > 0L`이면 `LiveRoom(roomId)`, `targetId == null && creatorId > 0L`이면 `CreatorChannel(creatorId)`, 그 외에는 `null`로 분기했다. 리뷰에서 `targetId <= 0L`일 때 creator fallback이 실행될 수 있는 차단 이슈가 확인되어 `targetId = 0L/-1L + creatorId > 0L` RED 테스트를 추가했고, `CreatorActivityType.Live`는 `targetId == null`일 때만 creator fallback을 허용하도록 보완했다. `HomeMainFragment.onRecentActivityClick()`은 `LiveRoom`을 `liveActionCoordinator.enterLiveRoom(route.roomId)`로, `CreatorChannel`을 `handleCreatorAction(CreatorActionCommand.Profile(route.creatorId))`로 전달해 공통 접근 정책을 재사용한다. focused GREEN, 직접 영향 회귀(`HomeMainFragmentLayoutTest`, `HomeMainFragmentLoginGuardSourceTest`, `v2.live.action.*`, `v2.creator.action.*`), `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 모두 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다. `./gradlew :app:installDebug`는 SM-G960N 기기에 설치 성공했고, `adb shell monkey -p kr.co.vividnext.sodalive.debug -c android.intent.category.LAUNCHER 1`로 debug 앱 런처 실행을 확인했다. 실제 추천 LIVE item 터치는 서버 데이터/로그인 상태가 필요한 경로라 이번 검증에서는 자동 route test와 source 계약으로 대체했다. 커밋은 생성하지 않았다.
|
||||
|
||||
## Phase 17: 모두 팔로우 확인 절차
|
||||
|
||||
**Phase 결과:** 여러 크리에이터를 한 번에 팔로우하는 공통 동작은 API 호출 전에 기존 `V2ModalDialog` 확인창을 거치고, 현재 노출 중인 `최근 응원이 많은 크리에이터` 섹션에서는 사용자가 `팔로우 하기`를 선택한 경우에만 기존 모두 팔로우 API가 실행된다.
|
||||
|
||||
**선행 조건:** `prd.md`의 `2026-07-31 변경: 모두 팔로우 확인 절차` 승인, 기존 `V2ModalDialog`의 취소·확인 2버튼 및 중복 클릭 방지 계약 유지.
|
||||
|
||||
**Phase 완료 조건:** `P17-T1`과 `P17-GATE` 완료, Task 검증 기록과 `Verification Log`에 실제 결과 누적.
|
||||
|
||||
### 구현 항목
|
||||
|
||||
#### Task 17.1: 응원 크리에이터 모두 팔로우 확인창 연결
|
||||
|
||||
**Goal 실행 `P17-T1`:** `최근 응원이 많은 크리에이터`의 기본 상태 모두 팔로우 버튼은 확인창만 열고, 취소에서는 요청하지 않으며, 확인에서만 기존 `creatorIds`로 팔로우 API를 정확히 한 번 요청한다.
|
||||
|
||||
- **시작 조건:** Phase 17 선행 조건 충족.
|
||||
- **완료 증거:** RED/GREEN 체크박스 완료, 한국어·영어·일본어 resource 및 확인/취소/API 호출 시점 자동 검증, focused 회귀와 수동 확인 결과 누적.
|
||||
- **범위 밖:** 모두 팔로우 API·request/response·ViewModel 로딩/성공/실패 처리 변경, `V2ModalDialog` 공통 구현·layout 변경, 숨겨진 `genreCreators` UI 복원, 신규 범용 wrapper 또는 dependency 추가, 로그인 정책 변경.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- Modify: `app/src/main/res/values/strings.xml`
|
||||
- Modify: `app/src/main/res/values-en/strings.xml`
|
||||
- Modify: `app/src/main/res/values-ja/strings.xml`
|
||||
- Test: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- Verify without modification: `app/src/test/java/kr/co/vividnext/sodalive/v2/components/modal/V2ModalDialogTest.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: `HomeCheerCreatorAdapter(onFollowAllClick: (List<Long>) -> Unit)`, `V2ModalDialog`, `HomeRecommendationViewModel.followCreators(sectionKey: String, creatorIds: List<Long>)`, `SECTION_KEY_CHEER_CREATORS`, `screenWidth`.
|
||||
- Produces: `HomeMainFragment.showCheerCreatorsFollowAllConfirmDialog(creatorIds: List<Long>)`과 한국어·영어·일본어 `home_recommendation_follow_all_confirm_title`, `home_recommendation_follow_all_confirm_description`, `home_recommendation_follow_all_confirm_button` string resource.
|
||||
|
||||
- [x] **RED:** `HomeMainFragmentLayoutTest`에 다음 실패 계약을 추가한다.
|
||||
- 응원 크리에이터 adapter callback은 `followCreators()`를 직접 호출하지 않고 `showCheerCreatorsFollowAllConfirmDialog(creatorIds)`를 호출한다.
|
||||
- 확인창은 `V2ModalDialog`를 사용하고 title/desc/confirm에 신규 resource, cancel에 기존 `R.string.cancel`을 전달한다.
|
||||
- `confirmButtonClick`만 `homeRecommendationViewModel.followCreators(SECTION_KEY_CHEER_CREATORS, creatorIds)`를 호출하며 cancel callback은 API를 호출하지 않는다.
|
||||
- 한국어·영어·일본어 `strings.xml`에 PRD의 resource key와 확정 번역이 모두 존재한다.
|
||||
- 기존 완료 상태와 빈 `creatorIds` no-op은 `HomeFollowAllButtonBinder` 및 adapter 회귀 계약으로 유지된다.
|
||||
- [x] **RED 확인:** 아래 focused test를 실행해 신규 resource와 `showCheerCreatorsFollowAllConfirmDialog()`가 없고 adapter callback이 `followCreators()`를 직접 호출하므로 의도한 실패를 확인한다.
|
||||
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest \
|
||||
--tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"
|
||||
```
|
||||
|
||||
- [x] **GREEN:** RED를 통과시키는 최소 구현을 작성한다.
|
||||
- 세 locale에 PRD에서 확정한 title/description/confirm string resource만 추가하고 취소는 기존 `cancel`을 재사용한다.
|
||||
- `HomeMainFragment`의 응원 크리에이터 adapter callback을 `showCheerCreatorsFollowAllConfirmDialog(creatorIds)` 호출로 변경한다.
|
||||
- `showCheerCreatorsFollowAllConfirmDialog()`는 기존 `V2ModalDialog`의 2버튼 구성을 표시하며 `confirmButtonClick`에서만 `followCreators(SECTION_KEY_CHEER_CREATORS, creatorIds)`를 호출한다.
|
||||
- Dialog는 `show(screenWidth)`로 표시하고, 취소·바깥 영역·시스템 뒤로가기 및 빠른 중복 확인 동작은 `V2ModalDialog`의 기존 계약을 그대로 사용한다.
|
||||
- 기존 `HomeFollowAllButtonBinder`의 완료 상태·빈 목록 no-op과 `HomeRecommendationViewModel`의 로딩·성공·실패 처리는 변경하지 않는다.
|
||||
- [x] **GREEN 확인:** RED 확인과 같은 focused test를 다시 실행해 직접 API 호출 제거, Dialog 연결과 세 locale resource가 모두 성공하는지 확인한다.
|
||||
- [x] **REFACTOR:** 이번 Task가 만든 중복만 정리하고 아래 직접 영향 회귀와 품질 검증 결과를 Task 검증 기록 및 `Verification Log`에 누적한다. 공통 모달 구현과 API/ViewModel 계약을 변경하지 않으므로 전체 unit test는 생략하고 home focused test, 기존 modal test, resource merge와 compile로 영향 범위를 검증한다.
|
||||
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest \
|
||||
--tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" \
|
||||
--tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest"
|
||||
./gradlew :app:mergeDebugResources
|
||||
./gradlew :app:compileDebugKotlin
|
||||
./gradlew :app:ktlintCheck
|
||||
git diff --check
|
||||
```
|
||||
|
||||
#### Task R17.1: 모두 팔로우 회귀 테스트 이름 규칙 정정
|
||||
|
||||
**Goal 실행 `P17-R1`:** `REV-P17-001`의 신규 영문 테스트명 2건을 한글 문장으로 정정하고 Dialog 선행·다국어 assertion을 그대로 유지한다.
|
||||
|
||||
- **시작 조건:** `REV-P17-001` 확정 및 `P17-T1` 자동 검증 완료.
|
||||
- **완료 증거:** 대상 테스트명을 한글 문장으로 정정, `HomeMainFragmentLayoutTest`·`V2ModalDialogTest`·`ktlintCheck`·`git diff --check` 성공, 리뷰 보고서 검증 기록 누적.
|
||||
- **범위 밖:** production Dialog·ViewModel·API 동작, assertion 완화, 다른 기존 영문 테스트명 일괄 정리.
|
||||
- **TDD 예외 사유:** 신규 회귀 테스트의 표현 규칙만 정정하므로 RED/GREEN 대신 정정 전·후 동일 assertion 성공을 검증한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase17-follow-all-confirmation-review.md`
|
||||
|
||||
- [x] `cheer creator follow all opens confirm dialog before api request`, `follow all confirm strings are localized` 테스트명을 규칙 위반 근거로 기록한다.
|
||||
- [x] 각 테스트명을 `응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다`, `모두 팔로우 확인창 문자열은 다국어로 제공한다`로 정정한다.
|
||||
- [x] `HomeMainFragmentLayoutTest`·`V2ModalDialogTest`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행하고 결과를 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 `rg -n "home popular community adapter does not load original image for locked paid post|cheer creator follow all opens confirm dialog before api request|follow all confirm strings are localized|유료 미구매 인기 커뮤니티는 원본 이미지를 로드하지 않는다|응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다|모두 팔로우 확인창 문자열은 다국어로 제공한다" app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`로 영문 테스트명 제거와 한글 테스트명 반영을 확인했다. Production Dialog·ViewModel·API 동작과 assertion은 변경하지 않았다.
|
||||
- 검증 기록: 2026-07-31 직접 영향 회귀 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest"`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행했고 모두 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다.
|
||||
|
||||
#### Task R17.2: 모두 팔로우 확인창 로그인 가드 순서 수정
|
||||
|
||||
**Goal 실행 `P17-R2`:** `최근 응원이 많은 크리에이터` 모두 팔로우 터치 시 미로그인 상태에서는 확인 Dialog보다 기존 로그인 가드가 먼저 동작하도록 순서를 복구한다.
|
||||
|
||||
- **시작 조건:** 수동 확인에서 `모두 팔로우` 터치 시 로그인 가드보다 확인 Dialog가 먼저 표시되는 버그 확인.
|
||||
- **완료 증거:** 로그인 가드가 Dialog 표시보다 먼저 호출되는 RED/GREEN source regression, 기존 Dialog 선행/API confirm-only 계약 회귀, compile·ktlint·`git diff --check` 성공.
|
||||
- **범위 밖:** `V2ModalDialog` 공통 구현 변경, 모두 팔로우 API/ViewModel 변경, 신규 로그인 정책·공통 abstraction 추가.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- Test: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt`
|
||||
- Test: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||
- Modify: `docs/20260601_메인_홈_추천_UI와_API_연동/reviews/phase17-follow-all-confirmation-review.md`
|
||||
|
||||
- [x] **RED:** `onCheerFollowAllClick` source에서 `ensureV2Access(AccessRequirement.Login)`이 `showCheerCreatorsFollowAllConfirmDialog(creatorIds)`보다 먼저 호출되어야 함을 테스트로 추가하고 현재 구현 실패를 확인한다.
|
||||
- [x] **GREEN:** `onCheerFollowAllClick`만 최소 수정해 로그인 가드 통과 후 확인 Dialog를 표시한다.
|
||||
- [x] 기존 확인 Dialog resource, 취소 no-op, confirm-only API 호출 계약 테스트와 `compileDebugKotlin`, `ktlintCheck`, `git diff --check`를 실행하고 결과를 누적한다.
|
||||
|
||||
- 검증 기록: 2026-07-31 RED는 `HomeMainFragmentLoginGuardSourceTest.HomeMainFragment 응원 크리에이터 모두 팔로우는 확인창보다 로그인 가드를 먼저 실행한다`와 `HomeMainFragmentLayoutTest.응원 크리에이터 모두 팔로우는 API 요청 전에 확인창을 연다`를 추가·수정한 뒤 focused test에서 각각 `HomeMainFragmentLoginGuardSourceTest.kt:283`, `HomeMainFragmentLayoutTest.kt:1309` assertion 실패로 확인했다. GREEN은 `onCheerFollowAllClick`에서 `ensureV2Access(AccessRequirement.Login) { showCheerCreatorsFollowAllConfirmDialog(creatorIds) }`로 감싸는 최소 변경 후 동일 focused test BUILD SUCCESSFUL로 확인했다.
|
||||
- 검증 기록: 2026-07-31 직접 영향 회귀 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행했고 모두 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다.
|
||||
|
||||
### 완료 조건
|
||||
|
||||
- [x] 기본 상태 모두 팔로우 버튼 터치 직후 API 호출 없이 `V2ModalDialog`가 표시된다.
|
||||
- [x] `취소`는 Dialog만 닫고 API 호출과 버튼 상태 변경을 발생시키지 않는다.
|
||||
- [x] `팔로우 하기`는 Dialog를 닫은 뒤 기존 `cheerCreators.creatorId` 목록으로 API를 정확히 한 번 호출한다.
|
||||
- [x] API 성공·실패·로딩과 완료 버튼 상태는 기존 동작을 유지한다.
|
||||
- [x] 확인창 문구가 한국어·영어·일본어 resource로 제공되고 UI 문자열이 Kotlin에 하드코딩되지 않는다.
|
||||
- [x] 완료 상태·빈 목록에서는 Dialog와 API가 실행되지 않는다.
|
||||
- [x] `genreCreators` 섹션은 계속 숨김 상태이고 신규 공통 abstraction을 추가하지 않는다.
|
||||
|
||||
### 검증 방법
|
||||
|
||||
#### Phase 17 Gate
|
||||
|
||||
**Goal 실행 `P17-GATE`:** Phase 17의 확인 전 요청 금지, 취소 no-op, 확인 후 단일 요청, 다국어와 기존 회귀를 최종 판정한다.
|
||||
|
||||
- **시작 조건:** `P17-T1` 체크박스와 검증 기록 완료.
|
||||
- **완료 증거:** Task 17.1 REFACTOR 명령이 모두 성공하고 아래 수동 확인을 완료한다.
|
||||
- **범위 밖:** Gate 통과를 위한 test 삭제·완화, API/ViewModel/공통 모달 계약 변경, 관련 없는 홈 코드 정리.
|
||||
|
||||
수동 확인:
|
||||
|
||||
- [x] 한국어·영어·일본어 각각에서 확인창 title/description/confirm/cancel 문구가 잘림이나 하드코딩 없이 표시된다.
|
||||
- [x] 기본 상태 버튼 터치 시 확인창만 표시되고 loading 및 API 요청이 시작되지 않는다.
|
||||
- [x] `취소` 선택 시 Dialog가 닫히고 버튼이 기본 상태로 유지된다.
|
||||
- [x] `팔로우 하기` 선택 시 Dialog가 닫히고 loading 후 기존 성공 또는 실패 feedback이 표시된다.
|
||||
- [x] 완료 상태 버튼과 빈 creator 목록에서는 확인창이 표시되지 않는다.
|
||||
- [x] Git diff가 Phase 17 Files와 승인된 PRD 범위 안에 있고 커밋이 생성되지 않았다.
|
||||
|
||||
계획 기록:
|
||||
|
||||
- 2026-07-31: 사용자 인터뷰에서 모든 `모두 팔로우` 동작에 확인 절차를 적용하되 현재 구현은 `최근 응원이 많은 크리에이터` 섹션만 대상으로 하는 B안을 확정했다. 기존 `HomeMainFragment`의 직접 API 호출 경로와 `V2ModalDialog`의 취소·확인·중복 클릭 방지 계약을 확인해 Phase 17을 작성했다. 이번 요청 범위에 따라 production·test·resource 구현은 시작하지 않았으며 모든 구현 및 Gate 체크박스는 미완료로 유지한다.
|
||||
- 2026-07-31: Phase 17 구현으로 `HomeMainFragment`의 응원 크리에이터 모두 팔로우 callback을 기존 즉시 `followCreators()` 호출에서 `V2ModalDialog` 확인창 표시로 변경했다. 확인 버튼에서만 기존 `homeRecommendationViewModel.followCreators(SECTION_KEY_CHEER_CREATORS, creatorIds)`를 호출하고, 취소 버튼은 기존 `R.string.cancel`과 `V2ModalDialog` 기본 닫기 동작을 재사용한다. 한국어·영어·일본어 `home_recommendation_follow_all_confirm_title`, `home_recommendation_follow_all_confirm_description`, `home_recommendation_follow_all_confirm_button` resource를 추가했다.
|
||||
|
||||
## Decision Log
|
||||
|
||||
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 |
|
||||
|---|---|---|---|---|---|
|
||||
| 2026-07-31 | `DEC-017` | 확정 | 모든 `모두 팔로우` 동작은 공통 확인 절차를 사용하고, 현재 구현은 노출 중인 응원 크리에이터 섹션으로 제한한다. 신규 공통 abstraction 없이 기존 `V2ModalDialog`를 재사용한다. | 사용자 `deep-interview`의 B안 선택과 현재 `genreCreators` 숨김 정책 | `P17-T1`, `P17-GATE`, `prd.md`의 `2026-07-31 변경` |
|
||||
| 2026-07-31 | `DEC-018` | 확정 | Phase 7의 2026-06-05 보안 재리뷰에서 승인된 유료 미구매 원본 이미지 미로드 정책을 기준으로 삼고, commit `2d58a876`에서 재도입된 client-side blur 원본 로드를 회귀로 수정한다. | 보안 재리뷰·검증 기록, 현재 `HomePopularCommunityAdapter`와 반대 방향의 test 변경 이력 교차 검토 | `REV-P7-001`, `P7-R1` |
|
||||
| 2026-07-31 | `DEC-019` | 확정 | 두 번째 `Phase 12`와 그 하위 `Task 10.*`는 기존 기록을 보존하면서 `P12B` 계열 고유 별칭을 추가해 이후 리뷰와 회귀 작업에서 사용한다. | `work-plan-docs.md`의 Goal/Task 추적성 규칙과 현재 문서의 중복 식별자 | `REV-P12B-001`, `P12B-R1` |
|
||||
|
||||
## Verification Log
|
||||
- 2026-07-31: `REV-P7-003` 후속 `Task R7.3` / `P7-R3`를 실행했다. `HomeMainFragmentLayoutTest`의 source 문자열 검사를 제거하고 `HomePopularCommunityAdapterTest`에 실제 adapter/ViewHolder bind 회귀 2건을 추가해 잠금 유료 원본 미로드·기존 Coil 요청 해제·drawable 제거·overlay/가격 유지와 무료·구매 완료 URL 전달을 검증했다. 보안 분기 mutation에서는 잠금 test가 `HomePopularCommunityAdapterTest.kt:72`에서 의도대로 실패했고 원상 복구 후 다시 통과했다. 직접 영향 test·compile·ktlint와 전체 162 suites/1,198 tests가 실패 0·error 0으로 성공했고, 문서 반영 후 `./gradlew tasks --all --console=plain`도 BUILD SUCCESSFUL이었다. 최종 production 코드는 이번 Task에서 추가 변경하지 않았다. Phase별 리뷰를 재검색한 결과 새 확정 항목은 확인되지 않았다.
|
||||
- 2026-07-31: Phase별 리뷰 리포트 최종 문서 검증으로 `git diff --check`를 실행해 출력 없이 성공했고, `reviews/` 아래 Phase 1~17 및 별도 이력 Phase 12B 보고서 18개 존재와 `REV-P7-003` ↔ `Task R7.3` ↔ `P7-R3` 연결을 확인했다. `./gradlew tasks --all --console=plain` 최초 sandbox 실행은 사용자 Gradle cache lock 접근 제한으로 실패했으며, 승인된 동일 명령 재실행은 BUILD SUCCESSFUL로 완료되어 프로젝트 task 인식 문제와 분리했다.
|
||||
- 2026-07-31: 현재 working tree를 Phase별 리뷰 보고서와 다시 대조했다. 신규 확정 항목은 Phase 7의 유료 미구매 원본 이미지 미로드 테스트가 실제 adapter bind, 기존 request/drawable 제거, lock overlay와 가격 유지를 실행하지 않고 production source 문자열만 검사하는 회귀 보호 공백(`REV-P7-003`) 1건이다. 이를 `Task R7.3` / `P7-R3`의 미완료 실행형 회귀 테스트 보강 Task로 Phase 7에 추가했으며 production 코드는 변경하지 않았다. Task 12.2는 사용자 수동 확인 완료 상태로 Phase 5·6·8·9·10·11·12·13 리포트의 오래된 blocker/남은 항목을 현재 상태와 동기화했다.
|
||||
- 2026-07-31: 최신 자동 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest" :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck --no-parallel --console=plain`을 실행해 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`의 비결정적 creator channel/preferences 실패 이력은 삭제하지 않고 동일 실패 재현 시 별도 격리 범위로 재개한다.
|
||||
- 2026-07-31: 사용자 수동 확인 결과 Task 12.2 홈 추천 화면 항목과 Phase 17 모두 팔로우 확인창 항목은 모두 동작함을 확인했다. 단, `모두 팔로우` 터치 시 로그인 가드보다 확인 Dialog가 먼저 표시되는 버그가 발견되어 `Task R17.2` / `P17-R2`로 전환했다.
|
||||
- 2026-07-31: `Task R17.2`로 모두 팔로우 확인창 로그인 가드 순서를 복구했다. RED는 source regression 2건 실패로 확인했고, GREEN은 `onCheerFollowAllClick`에서 기존 `ensureV2Access(AccessRequirement.Login)` 통과 후 확인 Dialog를 표시하도록 최소 수정했다. 직접 영향 회귀, compile, ktlint, `git diff --check`는 모두 성공했다.
|
||||
- 2026-07-31: 수동 Gate blocker를 재검증했다. `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`는 `MainV2Activity` foreground를 반환했지만 캡처 `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_manual_gate_20260731/screen.png`는 검은 배경의 splash/voice on 화면으로 판독되어 홈 추천 화면과 Phase 17 확인창 수동 검증은 계속 blocked다.
|
||||
- 2026-07-31: Phase별 리뷰 보고서와 `Task R12.2` 문서 변경 후 `./gradlew tasks --all --console=plain`을 실행해 BUILD SUCCESSFUL을 확인했다. `reviews/`에는 Phase 1~17 각각의 보고서와 별도 이력 Phase 12B 보고서가 존재하며, 확정 항목의 review ID·신규 Task·검증 기록 연결 및 `git diff --check` 성공을 확인했다.
|
||||
- 2026-07-31: 현재 working tree 최종 회귀로 `./gradlew :app:testDebugUnitTest --no-parallel`을 두 차례 실행했고, 각각 1,196개 중 `CreatorChannelHomeViewModelTest`의 `SharedPreferenceManager.can` assertion 2건과 1건이 실패했다. 실패 class 19개 test를 격리 재실행하면 모두 통과했고, 실패 지점은 비동기 DataStore observer/write를 공유하는 `SharedPreferenceManager.can`이 차감 후 이전 값으로 돌아온 assertion으로 좁혀졌다. 현재 diff에 `v2.creator.channel`, `SharedPreferenceManager`, `AppPreferencesDataStoreProvider` 변경은 없고 홈 추천·모달 focused 159 tests와 resource merge·compile·ktlint는 성공했다. 이 항목은 `REV-P12-003` 보류로 기록하고, 해당 공유 저장소/테스트 격리 범위가 별도로 승인되면 재현 test부터 재개한다.
|
||||
- 2026-07-31: `REV-P12-002` 후속 `Task R12.2`로 미완료 Task 12.2에 남은 `첫 오디오 태그 조건` 표시 계약을 Phase 12B의 제거 결과와 대조했다. 과거 이력은 보존하고 활성 수동 항목만 `제거된 첫 오디오 섹션과 관련 태그 미노출`로 정정했다. production/resource 금지 참조 검색과 `git diff --check`는 성공했으며 production·test·resource는 변경하지 않았다.
|
||||
- 2026-07-31: Task R1.1, R7.2, R12.1, R12B.2, R17.1 후속 보완을 진행했다. R1.1은 현재 `HomeMainFragment` canonical 경로를 PRD에 반영하고 파일 존재/미존재 및 문서 경로 검색을 확인했다. R7.2와 R17.1은 신규 영문 테스트명 3건을 한글 문장으로 정정하고 focused/direct 영향 테스트를 통과시켰다. R12B.2는 PRD 활성 영역의 first audio 완료 조건을 제거하고 과거 기록/제거 기록은 보존했다. R12.1은 연결 기기와 설치·런처 실행은 확인했지만 `SplashActivity` 검은 화면 캡처만 재현되어 Task 12.2 수동 확인은 홈 추천 화면 접근 불가로 blocked 상태를 갱신했다. 검증으로 focused 3개 테스트, `HomeMainFragmentLayoutTest`·`V2ModalDialogTest`, `./gradlew :app:ktlintCheck`, `git diff --check`가 성공했다.
|
||||
- 2026-07-31: Phase 재리뷰 최종 자동 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest" :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck --no-parallel`을 실행해 BUILD SUCCESSFUL, 159 tests, 실패 0, error 0을 확인했다. 최초 sandbox 실행은 사용자 Gradle cache lock 접근 제한으로 실패했고, 승인된 동일 명령 재실행으로 코드 결함과 분리했다. `adb devices`에서 사용 가능한 기기 1대를 확인했지만, 이번 리뷰 범위에서 앱 설치나 수동 UI 검증은 실행하지 않았다.
|
||||
- 2026-07-31: Phase별 리뷰 초안을 코드·test·PRD·현재 기기 상태와 재대조했다. 추가 확정 항목은 현재 `HomeMainFragment` 경로와 활성 문서 경로의 불일치(`REV-P1-001`), Phase 7 회귀 테스트의 신규 영문 테스트명(`REV-P7-002`), 연결 기기가 현재 존재하지만 `연결된 Android 기기 없음` 상태로 남은 Phase 12 수동 검증 blocker(`REV-P12-001`), 제거된 first audio가 PRD 활성 영역에 남은 정합성 문제(`REV-P12B-002`), Phase 17 신규 영문 테스트명 2건(`REV-P17-001`)이다. 각각 `Task R1.1`·`Task R7.2`·`Task R12.1`·`Task R12B.2`·`Task R17.1`로 전환했고, 이번 리뷰 요청의 코드 수정 범위가 아니므로 미완료 체크박스로 남겼다. 기존 `REV-P7-001`과 `REV-P12B-001`은 현재 working tree에서 수정·검증까지 완료된 상태로 재판정했다.
|
||||
- 2026-07-31: `plan-task.md` 전체 Phase를 현재 working tree와 대조해 독립 리뷰했다. Phase 7에서 2026-06-05 보안 재리뷰로 제거했던 유료 미구매 원본 이미지 로드가 commit `2d58a876`에서 client-side blur 방식으로 재도입된 회귀를 `REV-P7-001`로, 두 번째 `Phase 12` 및 그 안의 `Task 10.1`·`Task 10.2` 중복 식별자를 `REV-P12B-001`로 확정해 각각 `Task R7.1`/`P7-R1`, `Task R12B.1`/`P12B-R1`로 전환했다. 그 밖의 Phase에는 확정 코드 결함이 없었고, Phase 12 최종 수동 확인과 Phase 17 수동 Gate는 기존 blocker를 유지한다. 직접 영향 검증 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest" :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck --no-parallel`은 159 tests, 실패 0으로 성공했다. 전체 `./gradlew :app:testDebugUnitTest --no-parallel` 최초 실행은 범위 밖 `CreatorChannelHomeViewModelTest`의 비동기 `SharedPreferenceManager.can` assertion 1건이 실패했으나 해당 클래스 격리 재실행과 전체 1,196 tests 재실행은 모두 성공해 이번 Phase 변경 회귀와 분리했다. Phase별 결과는 `reviews/phase1-*.md`부터 `reviews/phase17-*.md`까지 기록했으며 기존 Phase 16 보고서는 재검토 기록을 누적했다.
|
||||
- 2026-07-31: Phase 17 독립 리뷰 게이트를 수행했다. 리뷰 결과는 PASS이며 blocking finding은 없었다. 리뷰에서 `onCheerFollowAllClick`이 확인창 helper만 호출하는 점, 확인 버튼에서만 `followCreators(SECTION_KEY_CHEER_CREATORS, creatorIds)`가 실행되는 점, 취소는 `V2ModalDialog`의 null cancel callback으로 dismiss만 수행하는 점, `HomeFollowAllButtonBinder`의 완료/빈 목록 no-op이 유지되는 점, 한국어·영어·일본어 문자열이 PRD와 일치하는 점, 수동 시각 검증 blocker가 문서에 정직하게 남은 점을 확인했다.
|
||||
- 2026-07-31: Phase 17 RED/GREEN 검증을 수행했다. RED는 `HomeMainFragmentLayoutTest`에 확인창 연결과 다국어 문자열 계약을 먼저 추가한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`에서 신규 `home_recommendation_follow_all_confirm_*` resource 미정의 컴파일 실패로 확인했다. GREEN 구현 후 동일 focused test는 BUILD SUCCESSFUL을 확인했다. 이후 직접 영향 회귀로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialogTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행했고 모두 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고다. 표면 확인으로 `adb devices`에서 `2cec640c34017ece device`를 확인했고 `./gradlew :app:installDebug`, `adb shell monkey -p kr.co.vividnext.sodalive.debug -c android.intent.category.LAUNCHER 1`, `adb shell screencap`/`adb pull`을 실행했다. 설치와 런처 실행은 성공했지만 `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive_phase17_home.png` 캡처는 완전 검은 화면으로 확인되어 실제 확인창 육안 확인은 blocked로 남긴다. 커밋은 생성하지 않았다.
|
||||
- 2026-07-31: Task R7.1 RED/GREEN을 진행했다. RED는 `HomeMainFragmentLayoutTest.home popular community adapter does not load original image for locked paid post`를 추가한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home popular community adapter does not load original image for locked paid post"`에서 `HomeMainFragmentLayoutTest.kt:1032` assertion 실패로 확인했다. GREEN은 `HomePopularCommunityAdapter`에서 유료 미구매 item의 `imageUrl`을 image loader에 전달하지 않도록 바꾸고 `BlurTransformation` client-side blur 경로를 제거한 뒤 동일 focused test BUILD SUCCESSFUL을 확인했다. PRD의 blur 문구는 원본 미로드 보안 결정과 일치하도록 갱신했다. 남은 검증은 `HomeMainFragmentLayoutTest` 전체, compile, ktlint, `git diff --check`, 리뷰 보고서 후속 기록이다.
|
||||
- 2026-07-31: Task R7.1 최종 검증으로 `./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은 기존 경고다. `reviews/phase7-popular-community-review.md` 수정 후 검증 기록까지 누적해 `REV-P7-001` 후속 항목을 완료했다.
|
||||
- 2026-07-31: Task R12B.1 문서 추적성 복구를 완료했다. 중복 재현 명령 `rg -n "^(### Phase 12:|## Phase 12:|#### Task 10\.|- \[x\] \*\*Task 10\.)" "docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md"`로 첫 번째 `Phase 12`, 두 번째 `Phase 12`, Phase 10 `Task 10.1`, 두 번째 Phase 12의 `Task 10.1`·`Task 10.2` 충돌을 확인했다. 기존 완료 제목과 체크박스는 보존하고 두 번째 Phase 12에 `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`는 성공했고, 리뷰 보고서 후속 기록까지 누적해 `REV-P12B-001` 후속 항목을 완료했다.
|
||||
- 2026-07-31: 최종 전체 회귀로 `./gradlew :app:testDebugUnitTest`를 실행했고 BUILD SUCCESSFUL을 확인했다. Gradle deprecation warning은 기존 경고다.
|
||||
- 2026-07-31: Phase 17 문서 준비 검증으로 PRD의 공통 정책·현재 적용 범위·다국어 문구·Non-Goal을 `P17-T1` 및 `P17-GATE`에 대조했고 누락된 확정 요구사항이 없음을 확인했다. 신규 Phase의 구현·Gate 체크박스는 모두 미완료이며 production·test·resource 구현을 시작하지 않았다. `git status --short`는 변경 파일이 `prd.md`, `plan-task.md` 두 문서뿐임을 표시했고, placeholder 검색과 `git diff --check`는 출력 없이 성공했다. `./gradlew tasks --all`은 최초 sandbox 실행에서 사용자 Gradle cache lock 접근 제한으로 실패했으나 승인된 동일 명령 재실행은 `BUILD SUCCESSFUL`로 완료됐다.
|
||||
- 2026-07-30: Phase 16 방금 활동한 크리에이터 LIVE 라우팅 검증으로 focused RED/GREEN과 직접 영향 회귀를 수행했다. RED는 `creatorId`, `LiveRoom`, `CreatorChannel` 미정의 컴파일 실패로 확인했고, GREEN 후 focused home tests와 `v2.live.action.*`, `v2.creator.action.*` 회귀, `compileDebugKotlin`, `ktlintCheck`, `git diff --check`가 모두 통과했다. 리뷰에서 `targetId <= 0L`일 때 creator fallback이 실행될 수 있는 차단 이슈가 확인되어 `0L/-1L` 회귀 테스트와 null 전용 fallback 분기를 추가했고, 재검증과 재리뷰에서 blocking finding 없음으로 승인받았다. 수동 표면 확인으로 `adb devices`에서 `2cec640c34017ece device`를 확인하고 `installDebug` 및 launcher monkey 실행을 성공시켰다. 실제 LIVE item 터치는 추천 데이터 조건이 필요해 자동 route/source 테스트로 대체했다.
|
||||
- 2026-07-12: Phase 15 추천 섹션 타이틀 chevron 숨김 변경 검증으로 `HomeMainFragmentSourceTest`에 `홈 추천 최근 데뷔와 AI 캐릭터 섹션 타이틀은 chevron을 숨긴다`를 추가했고, 구현 전 `HomeMainFragmentSourceTest.kt:40` assertion 실패로 RED를 확인했다. `HomeMainFragment.setUpSectionTitles()`에서 `viewHomeRecentDebutTitle`, `viewHomeAiCharacterTitle`의 `showMore = true`를 제거한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentSourceTest" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeFollowingFragmentSourceTest"`, `./gradlew :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck`, `git diff --check`가 통과했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning은 기존 설정 경고다. `./gradlew :app:testDebugUnitTest` 전체 실행은 `CreatorChannelActivitySourceTest > 팬Talk 섹션은 Figma ListComment layout과 bind로 렌더링한다`, `CreatorChannelHomeViewModelTest > 채널 후원 성공은 기존 후원 API를 호출하고 홈을 다시 로드한다` 실패 후 타임아웃됐으며, 실패 영역은 이번 변경 파일과 무관한 `v2.creator.channel` 범위다. `adb devices`는 처음 1대를 표시했으나 `:app:installDebug` 시점에는 `No connected devices!`로 실패했고 이후 `adb devices`가 빈 목록을 반환해 실기기 수동 확인은 수행하지 못했다.
|
||||
- 2026-07-12: `genreCreators` UI 미표시 변경 검증으로 targeted RED/GREEN 테스트를 수행했다. 리뷰에서 PRD 앞부분의 장르별 크리에이터 표시/모두 팔로우 문구와 `HomeRecommendationUiState.Content.isEmpty`의 `genreCreators.groups` 포함이 차단 이슈로 확인되어, PRD 문구를 미표시 정책으로 정리하고 `isEmpty`는 실제 표시 섹션만 기준으로 판단하도록 수정했다. `home recommendation empty state ignores hidden genre creators` 테스트는 수정 전 `HomeMainFragmentLayoutTest.kt:180` assertion 실패로 RED를 확인했고, 수정 후 GREEN 전환을 확인했다. 추가 재검토에서 plan-task 과거 Task 6.4/6.12와 코드/테스트에 남은 `genreCreators` follow-all 및 pager UI 활성 계약이 차단 이슈로 확인되어, 과거 Task 문구는 현재 미사용 정책으로 정리하고 `HomeMainFragment`의 genre follow-all 연결, `HomeRecommendationViewModel`의 genre follow 완료 상태 갱신, 활성 UI/follow-all 테스트 계약을 제거했다. 이후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest" :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck`를 실행해 BUILD SUCCESSFUL을 확인했다. `ktlintCheck` 최초 재실행은 테스트 파일 불필요한 빈 줄로 실패했고 해당 줄만 제거한 뒤 재실행해 성공했다. `git diff --check` 출력 없음도 확인했다. `ktlintCheck`에서는 기존 `.editorconfig disabled_rules` deprecation warning만 출력됐고 lint 실패는 없었다. `adb devices` 결과 연결된 기기/에뮬레이터가 없어 실기기 수동 확인은 수행하지 못했다.
|
||||
|
||||
Reference in New Issue
Block a user