docs(content): 전체 탭 Phase 4-6 검증을 기록한다

This commit is contained in:
2026-06-25 11:54:58 +09:00
parent f4a32086b0
commit 33e137bc22

View File

@@ -307,7 +307,7 @@
### Phase 4: ViewModel 페이징, 타입, 정렬, 요일 상태 구현 ### Phase 4: ViewModel 페이징, 타입, 정렬, 요일 상태 구현
- [ ] **Task 4.1: ViewModel RED 테스트 작성** - [x] **Task 4.1: ViewModel RED 테스트 작성**
- 생성: - 생성:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModelTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModelTest.kt`
- 테스트 케이스: - 테스트 케이스:
@@ -323,8 +323,9 @@
- 검증: - 검증:
- Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"` - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"`
- Expected: ViewModel 미구현으로 RED 실패. - Expected: ViewModel 미구현으로 RED 실패.
- 2026-06-25: RED 확인. `ContentAllTabViewModel` 미구현 상태에서 unresolved reference 실패를 확인했다.
- [ ] **Task 4.2: ContentAllTabViewModel 구현** - [x] **Task 4.2: ContentAllTabViewModel 구현**
- 생성: - 생성:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModel.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModel.kt`
- 작업: - 작업:
@@ -341,12 +342,13 @@
- 검증: - 검증:
- Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"` - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"`
- Expected: PASS. - Expected: PASS.
- 2026-06-25: PASS. `ContentAllTabViewModel``AppDI.kt` 등록 구현 후 `ContentAllTabViewModelTest`가 성공했다.
--- ---
### Phase 5: Layout, adapter, Fragment 연결 ### Phase 5: Layout, adapter, Fragment 연결
- [ ] **Task 5.1: 전체 탭 layout과 source test 추가** - [x] **Task 5.1: 전체 탭 layout과 source test 추가**
- 수정: - 수정:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt`
- 테스트 케이스: - 테스트 케이스:
@@ -360,8 +362,9 @@
- 검증: - 검증:
- Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- Expected: layout/Fragment 연결 전 RED 실패. - Expected: layout/Fragment 연결 전 RED 실패.
- 2026-06-25: RED 확인. layout/Fragment 연결 전 `@+id/layout_content_all_surface` 누락으로 source test 실패를 확인했다.
- [ ] **Task 5.2: 전체 탭 item layout과 adapter 구현** - [x] **Task 5.2: 전체 탭 item layout과 adapter 구현**
- 생성: - 생성:
- `app/src/main/res/layout/item_content_all_series_card.xml` - `app/src/main/res/layout/item_content_all_series_card.xml`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt`
@@ -377,8 +380,9 @@
- Expected: 신규 item layout binding class가 생성된다. - Expected: 신규 item layout binding class가 생성된다.
- Run: `./gradlew :app:compileDebugKotlin` - Run: `./gradlew :app:compileDebugKotlin`
- Expected: 신규 adapter가 컴파일된다. - Expected: 신규 adapter가 컴파일된다.
- 2026-06-25: PASS. adapter와 item layout 구현 후 `mergeDebugResources`, `compileDebugKotlin`이 성공했다.
- [ ] **Task 5.3: fragment_v2_main_content.xml에 전체 탭 surface 추가** - [x] **Task 5.3: fragment_v2_main_content.xml에 전체 탭 surface 추가**
- 수정: - 수정:
- `app/src/main/res/layout/fragment_v2_main_content.xml` - `app/src/main/res/layout/fragment_v2_main_content.xml`
- 작업: - 작업:
@@ -394,8 +398,9 @@
- 검증: - 검증:
- Run: `./gradlew :app:mergeDebugResources` - Run: `./gradlew :app:mergeDebugResources`
- Expected: layout resource merge가 성공한다. - Expected: layout resource merge가 성공한다.
- 2026-06-25: PASS. 전체 탭 surface XML 추가 후 `mergeDebugResources`가 성공했다.
- [ ] **Task 5.4: ContentMainFragment 전체 탭 연결** - [x] **Task 5.4: ContentMainFragment 전체 탭 연결**
- 수정: - 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt`
- 작업: - 작업:
@@ -418,12 +423,13 @@
- Expected: PASS. - Expected: PASS.
- Run: `./gradlew :app:compileDebugKotlin` - Run: `./gradlew :app:compileDebugKotlin`
- Expected: Fragment/ViewBinding/adapter 연결이 컴파일된다. - Expected: Fragment/ViewBinding/adapter 연결이 컴파일된다.
- 2026-06-25: PASS. Fragment 전체 탭 연결 후 `ContentMainFragmentSourceTest``compileDebugKotlin`이 성공했다.
--- ---
### Phase 6: 통합 검증과 수동 확인 ### Phase 6: 통합 검증과 수동 확인
- [ ] **Task 6.1: 단위 테스트 실행** - [x] **Task 6.1: 단위 테스트 실행**
- 실행: - 실행:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
@@ -431,9 +437,10 @@
- 전체 탭 mapper/day/ViewModel/source test가 PASS한다. - 전체 탭 mapper/day/ViewModel/source test가 PASS한다.
- 시리즈 카드 성인 배지 test가 PASS한다. - 시리즈 카드 성인 배지 test가 PASS한다.
- 검증 기록: - 검증 기록:
- 구현 후 실행 결과를 여기에 누적한다. - 2026-06-25: PASS. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` 성공.
- 2026-06-25: PASS. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` 성공.
- [ ] **Task 6.2: 리소스/컴파일/스타일 검증** - [x] **Task 6.2: 리소스/컴파일/스타일 검증**
- 실행: - 실행:
- `./gradlew :app:mergeDebugResources` - `./gradlew :app:mergeDebugResources`
- `./gradlew :app:compileDebugKotlin` - `./gradlew :app:compileDebugKotlin`
@@ -442,9 +449,12 @@
- 기대 결과: - 기대 결과:
- resource merge, Kotlin compile, ktlint, whitespace 검증이 모두 성공한다. - resource merge, Kotlin compile, ktlint, whitespace 검증이 모두 성공한다.
- 검증 기록: - 검증 기록:
- 구현 후 실행 결과를 여기에 누적한다. - 2026-06-25: PASS. `./gradlew :app:mergeDebugResources` 성공.
- 2026-06-25: PASS. `./gradlew :app:compileDebugKotlin` 성공.
- 2026-06-25: PASS. `./gradlew :app:ktlintCheck` 성공.
- 2026-06-25: PASS. `git diff --check` 성공.
- [ ] **Task 6.3: 수동 화면 검증** - [x] **Task 6.3: 수동 화면 검증**
- 확인: - 확인:
- 콘텐츠 탭 진입 후 `추천`이 기존처럼 표시된다. - 콘텐츠 탭 진입 후 `추천`이 기존처럼 표시된다.
- `랭킹`이 기존처럼 표시된다. - `랭킹`이 기존처럼 표시된다.
@@ -459,7 +469,14 @@
- 하단 스크롤 시 다음 페이지가 append된다. - 하단 스크롤 시 다음 페이지가 append된다.
- 시리즈 성인 콘텐츠는 `SeriesContentCardView` 우측 상단에 성인 배지를 표시한다. - 시리즈 성인 콘텐츠는 `SeriesContentCardView` 우측 상단에 성인 배지를 표시한다.
- 검증 기록: - 검증 기록:
- 구현 후 수동 확인 결과를 여기에 누적한다. - 2026-06-25: PARTIAL PASS. 디바이스 `2cec640c34017ece`에서 `kr.co.vividnext.sodalive.debug/kr.co.vividnext.sodalive.splash.SplashActivity` 실행 성공.
- 2026-06-25: PASS. 콘텐츠 탭 진입 후 `추천`이 기존처럼 표시됨을 캡처 `sodalive_phase6_content_recommend.png`와 hierarchy로 확인했다.
- 2026-06-25: PASS. `랭킹`이 기존처럼 표시됨을 캡처 `sodalive_phase6_content_ranking.png`와 hierarchy로 확인했다.
- 2026-06-25: PASS. `전체` 선택 시 `오디오` type이 기본 선택되고, type chip은 `오디오`, `시리즈`, `오리지널`, `무료`, `포인트`만 표시됨을 캡처 `sodalive_phase6_all_audio.png`와 hierarchy로 확인했다.
- 2026-06-25: PASS. type chip에 Figma의 `전체`, `연재`가 표시되지 않음을 hierarchy로 확인했다.
- 2026-06-25: PASS. `SERIES` 선택 시에만 요일 필터가 표시되고, `RANDOM` 요일 한국어 라벨 `기타`가 표시됨을 캡처 `sodalive_phase6_all_series.png`와 hierarchy로 확인했다.
- 2026-06-25: PASS. sort popup이 기존 `CreatorChannelSortPopup` 형태로 열리고 `ContentSort` 옵션 `최신순`, `인기순`, `소장순`, `높은 가격순`, `낮은 가격순`이 표시됨을 캡처 `sodalive_phase6_sort_popup.png`와 hierarchy로 확인했다.
- 2026-06-25: BLOCKED. `GET /api/v2/audio/contents`가 수동 검증 환경에서 `HTTP 404`를 반환해 실제 오디오/시리즈 카드 3열 grid 데이터 표시, 하단 스크롤 append, 시리즈 성인 배지의 실데이터 표시는 확인하지 못했다. 해당 항목은 단위 테스트와 source/layout 검증으로 대체 확인했다.
--- ---
@@ -484,3 +501,110 @@
- PASS: `./gradlew :app:ktlintCheck` - PASS: `./gradlew :app:ktlintCheck`
- PASS: `git diff --check` - PASS: `git diff --check`
- 참고: `./gradlew :app:mergeDebugResources`는 최초 실행 시 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다. - 참고: `./gradlew :app:mergeDebugResources`는 최초 실행 시 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다.
- 2026-06-25 Phase 4~5 구현 검증:
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 실행할 수 없었고, Gradle compile/tests로 대체 검증했다.
- 2026-06-25 Phase 4~5 review-fix 재검증:
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 범위: Empty display-list 처리, sort popup 정리, 현재 탭 guard, 전체 탭 empty/error UI review fix를 포함해 재검증했다.
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 실행할 수 없었고, Gradle compile/tests로 대체 검증했다.
- 2026-06-25 Phase 4~5 review-blocker 수정 재검증:
- 수정 범위: `Loading`/`Empty`/`Error` 상태가 `selectedType`, `selectedSort`, `selectedDayOfWeek`, `totalCount` metadata를 보존하도록 수정한 내용을 포함한다.
- 수정 범위: `ContentMainFragment`가 최신 전체 탭 state를 캐시하고, ALL 탭 재진입 시 캐시된 state를 다시 렌더링하도록 수정한 내용을 포함한다.
- 수정 범위: Empty/Error/Loading 상태에서도 공통 control을 bind해 type/sort/day/count UI가 stale 상태로 남지 않도록 수정한 내용을 포함한다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentAllTabViewModelTest"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 여전히 실행할 수 없었다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 4~5 코드 리뷰 및 검증:
- 리뷰 결과: `rvContentAllItems`는 3열 grid인데 `addContentGridItemSpacing()` 내부 `ContentGridItemDecoration`이 2열 기준 `GRID_SPAN_COUNT`를 사용해 첫 행/열 spacing이 어긋나는 이슈를 발견했다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck`
- PASS: `git diff --check`
- 참고: `./gradlew :app:mergeDebugResources`는 최초 실행 시 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다.
- 2026-06-25 Phase 4~5 3열 spacing 코드 리뷰 수정 및 재검증:
- 수정 완료: `addContentGridItemSpacing(spanCount)`로 item spacing helper를 parameterize하고, `rvContentAllItems`에는 `CONTENT_ALL_GRID_SPAN_COUNT`를 전달해 전체 탭 3열 grid spacing 이슈를 수정했다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 여전히 실행할 수 없었다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 4~5 코드 리뷰 및 검증:
- 리뷰 결과: Phase 5 Figma 노드 `35:5857`, `24:6909`, `24:9105`와 대조했다.
- 수정 필요: `SERIES` 요일 필터는 Figma에서 어두운 rounded 컨테이너와 선택 요일의 흰 배경/검은 텍스트가 표시되지만, 현재 `layout_content_all_day_filter``createAllDayFilterView()`는 텍스트 색상만 변경해 선택 배경/컨테이너 스타일이 반영되지 않는다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck`
- PASS: `git diff --check`
- 참고: `./gradlew :app:mergeDebugResources`는 최초 일반 실행에서 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 4~5 day-filter/sort-bar Figma 수정 및 재검증:
- 수정 완료: `SERIES` 요일 필터를 Figma 기준의 36dp rounded pill 컨테이너와 선택 요일 흰 배경/검은 텍스트 구조로 조정했다.
- 수정 완료: sort-bar를 Figma `24:6927` 기준의 52dp 높이, 좌측 `전체 n` count, 우측 `ContentSort` label + `ic_new_sort` 아이콘 구조로 조정했다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 여전히 실행할 수 없었다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 4~5 sort count 색상/요일 필터 중앙 정렬 수정 및 재검증:
- 수정 완료: Figma `24:6909` 기준으로 sort-bar의 `전체` 라벨은 흰색, count 숫자는 `gray_500`으로 분리 표시하도록 조정했다.
- 수정 완료: 요일 필터 컨테이너를 parent start/end 양쪽에 constraint하고 `layout_constraintHorizontal_bias="0.5"`를 적용해 화면 중앙 정렬로 조정했다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck` (`.editorconfig disabled_rules` deprecation warning만 출력)
- PASS: `git diff --check`
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 여전히 실행할 수 없었다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 4~5 코드 리뷰 및 검증:
- 리뷰 결과: Phase 4 ViewModel paging/type/sort/day 상태와 stale response guard를 테스트 및 구현과 대조했고, 추가 차단 이슈는 발견하지 않았다.
- 리뷰 결과: Phase 5 layout/adapter/Fragment 연결을 Figma `35:5857`, `24:6909`, `24:9105` 및 source와 대조했고, type tab 제외 범위(`전체`, `연재` 미구현), day filter, sort-bar, 3열 grid, routing 연결에서 추가 차단 이슈는 발견하지 않았다.
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck`
- PASS: `git diff --check`
- 참고: `./gradlew :app:mergeDebugResources`는 최초 일반 실행에서 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다.
- 확인: Phase 6 작업(`Task 6.1`, `Task 6.2`, `Task 6.3`)은 모두 `[ ]` 상태를 유지한다.
- 2026-06-25 Phase 6 통합 검증과 수동 확인:
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`
- PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"`
- PASS: `./gradlew :app:mergeDebugResources`
- PASS: `./gradlew :app:compileDebugKotlin`
- PASS: `./gradlew :app:ktlintCheck`
- PASS: `git diff --check`
- PASS: Figma 기준 노드 `35:5857`, `24:6909`, `24:9105`의 design context와 screenshot을 확보해 화면 기준과 대조했다.
- PASS: 디바이스 `2cec640c34017ece`에서 debug 앱 실행 후 콘텐츠 `추천`, `랭킹`, `전체 > 오디오`, `전체 > 시리즈`, sort popup을 실제 화면으로 확인했다.
- PARTIAL: 수동 검증 환경에서 `GET /api/v2/audio/contents``HTTP 404`를 반환해 실제 API 데이터 기반 3열 카드, 페이징 append, 실데이터 성인 배지 표시는 확인하지 못했다. 관련 로직은 Phase 6.1 단위 테스트와 Phase 6.2 컴파일/리소스 검증으로 대체 확인했다.
- 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 이번 Phase 6에서도 `lsp_diagnostics`를 실행하지 못했고, Gradle compile/tests로 대체 검증했다.