Files
sodalive-ios/docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md

192 KiB

메인 홈 추천 탭 UI와 API 연동 구현 계획

기준 문서

  • PRD: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
  • Figma 추천 화면: 24:5514
  • Figma FeedCommunityView 유료 미구매: 309:19774
  • Figma FeedCommunityView 유료 구매함 또는 무료: 309:19775
  • 코드 스타일: docs/agent-guides/code-style.md
  • 빌드/검증: docs/agent-guides/build-test-verification.md

재분류 원칙

  • 2026-06-26 기준으로 기존 Phase와 완료 체크 상태는 구현 순서 판단에 사용하지 않는다.
  • 이전 검증 기록은 하단에 보존하되, 새 체크리스트는 신규 PRD 요구사항 기준으로 다시 작성한다.
  • 화면 UI는 섹션당 하나의 Phase로 나누어 작게 작업한다.
  • MainHomeView는 홈 상단 공통 shell과 추천/랭킹/팔로잉 탭 전환만 담당한다.
  • 추천/랭킹/팔로잉 탭 아래 콘텐츠는 각각 Recommendation, Ranking, Following 하위 폴더에 별도 View로 배치한다.
  • 기존에 이미 생성된 widget과 파일이 있으면 새로 만들지 않고 확인/보완한다.
  • 추천 필모그래피, 또 다른 모습, 사업자 정보 외 추가 하단 정보 섹션은 만들지 않는다.
  • 기존 SodaLive/Sources/Home/HomeApi.swift에는 /api/v2/home/recommendations를 추가하지 않는다.
  • 외부 라이브러리는 추가하지 않는다.

2026-08-03 현재 라이브 전체보기 입장 로딩 표시 완료

  • 목적: LiveNowAllView에서 라이브 항목 탭 후 방 상세 조회/입장 통신 중 멈춘 것처럼 보이지 않도록 기존 로딩 UI 표시
  • TDD 예외 사유:
    • SwiftUI 화면 내부 입장 흐름이며 앱 테스트 번들 타깃 검색 결과가 없어 production View를 직접 import하는 영구 UI/unit test를 이번 Task에서 추가할 수 없다.
  • 수행 내용:
    • LiveNowAllView가 기존 LiveViewModel.enterLiveRoom(roomId:)를 직접 호출하도록 변경
    • BaseView(isLoading: $viewModel.isLoading)를 통해 방 상세 조회/입장 요청 중 기존 LoadingView 표시
    • 입장 전 결제 확인 dialog, 비밀방 password dialog, 입장 실패 toast를 LiveNowAllView에 연결
    • AppStep.liveNowAllSectionLiveNowView에서 더 이상 필요 없는 입장 콜백을 제거
  • 검증:
    • rg -n "PBXNativeTarget.*Test|UITests|Tests|xctest|SodaLiveTests|SodaLiveUITests" SodaLive.xcodeproj/project.pbxproj 실행, 테스트 타깃 없음 확인
    • rg -n "liveNowAll\(|liveNowAll\)|case \.liveNowAll|LiveNowAllView\(|onClickParticipant: onClickParticipant|let onClickParticipant" SodaLive/Sources 실행
    • rg -n "BaseView\(isLoading: \$viewModel\.isLoading\)|viewModel\.enterLiveRoom\(roomId: roomId\)|LivePaymentDialog\(|LiveRoomPasswordDialog\(|sodaToast\(isPresented: \$viewModel\.isShowPopup" SodaLive/Sources/Live/Now/All/LiveNowAllView.swift 실행
    • git diff --check 실행
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행

2026-08-03 현재 라이브 전체보기 즉시 입장 변경 완료

  • 목적: 추천 탭 전체 진입 화면에서 라이브 항목 탭 시 상세 오버레이를 거치지 않고 기존 라이브 입장 흐름으로 바로 연결
  • TDD 예외 사유:
    • SwiftUI 화면 내부 탭/가드 흐름이며 앱 테스트 번들 타깃이 없어 production View를 직접 import하는 영구 UI/unit test를 이번 Task에서 추가할 수 없다.
  • 수행 내용:
    • LiveNowAllView의 로그인 guard, 한국 사용자 본인인증 guard, 성인 콘텐츠 설정 guard는 유지
    • guard 통과 후 LiveDetailView 표시 대신 onClickParticipant(roomId)를 직접 호출하도록 변경
    • 기존 상세 Join 버튼 경로와 동일하게 직접 입장 직전 AppState.shared.isShowPlayer = false 처리 유지
  • 검증:
    • 변경 전 rg -n "openLiveDetail\(roomId: roomId\)|LiveDetailView\(|liveAllViewModel|onClickParticipant\(liveAllViewModel.selectedRoomId\)" SodaLive/Sources/Live/Now/All/LiveNowAllView.swift 실행, 상세 오버레이 경유 상태 확인
    • 변경 후 rg -n "LiveDetailView\(|liveAllViewModel|openLiveDetail\(" SodaLive/Sources/Live/Now/All/LiveNowAllView.swift 실행, 출력 없음으로 상세 오버레이 경유 제거 확인
    • 변경 후 rg -n "enterLiveRoom\(roomId: roomId\)|onClickParticipant\(roomId\)|setAppStep\(step: \.login\)|contentViewSettings|isShowAuthConfirmView|pendingAction = \{ handleLiveNowItemTap" SodaLive/Sources/Live/Now/All/LiveNowAllView.swift 실행, 즉시 입장 호출과 guard 유지 확인
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED

2026-08-03 현재 라이브 전체보기 리스트 UI 보정 완료

  • 목적: 추천 탭 전체 진입 화면을 Figma 185:4509 기준의 On Air 리스트 UI로 표시
  • 수행 내용:
    • I18n.LiveNow.allTitleOn Air로 변경
    • LiveNowAllView의 2열 LiveNowItemView 그리드를 단일 LazyVStack + LiveNowAllItemView 리스트로 변경
    • LiveNowAllItemView75x75 원형 프로필, LIVE 태그, HH:mm 시작 시간, 18pt bold 제목, 14pt regular 크리에이터명, 우측 가격 영역 구조로 보정
    • 유료 라이브는 ic_bar_cash와 가격, 무료 라이브는 가격/캔 아이콘 대신 무료만 표시
  • 검증:
    • rg -n "LiveNowItemView\\(|LiveNowAllItemView\\(|DetailNavigationBar\\(title: I18n\\.LiveNow\\.allTitle\\)|static var allTitle|ic_bar_cash|ic_can_white" SodaLive/Sources/Live/Now SodaLive/Sources/I18n/I18n.swift 실행, 변경 전 전체보기 화면의 2열 카드/기존 아이콘 상태 확인
    • rg -n "pick\\(ko: \\"On Air\\"|LazyVStack|LiveNowAllItemView\\(item: item|Image\\(\\"ic_bar_cash\\"\\)|I18n.CreateContent.free|frame\\(width: 75, height: 75\\)|appFont\\(size: 18, weight: \\.bold\\)|DateParser.parse" SodaLive/Sources/I18n/I18n.swift SodaLive/Sources/Live/Now/All 실행, 변경 후 제목/리스트/유료/무료/시간/타이포그래피 근거 확인
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED

2026-08-03 Phase 8.2 현재 라이브 전체 항목 스타일 보정 완료

  • 목적: 메인 홈 추천 탭 현재 라이브 섹션 마지막 전체 항목을 요청한 텍스트 전용 스타일로 표시
  • 수행 내용:
    • MainHomeLiveAllItemView에서 Color.gray800 원형 배경을 제거
    • 전체 텍스트를 기존 .appFont(.body5) medium 14, Color.soda400, 70x102 중앙 정렬 프레임으로 표시
    • 기존 현재 라이브 아이템과 onTapAll 액션 연결은 변경하지 않음
  • 검증:
    • rg -n "Circle\(\)|\.fill\(Color\.gray800\)|foregroundColor\(\.white\)|foregroundColor\(Color\.soda400\)|appFont\(\.body4\)" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift 실행, 변경 전 MainHomeLiveAllItemView의 원형 배경/흰 글자 존재 확인
    • rg -n "MainHomeLiveAllItemView|Color\.gray800|foregroundColor\(Color\.soda400\)|appFont\(\.body5\)|alignment: \.center" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift 실행, 변경 후 MainHomeLiveAllItemView.appFont(.body5), Color.soda400, .center 정렬을 사용하고 해당 뷰 내부 원형 배경이 제거됐음을 확인
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED

2026-07-12 장르 크리에이터 섹션 미표시 반영

  • 목적: 메인 홈 추천 탭에서 서버 응답의 genreCreators 기반 장르(카테고리)별 크리에이터 UI를 표시하지 않는다.
  • 수행 내용:
    • MainHomeRecommendationView의 추천 탭 섹션 조립에서 MainHomeGenreCreatorSection 호출을 제거한다.
    • HomeRecommendationResponse.genreCreators 모델 필드는 API 응답 디코딩을 위해 유지한다.
  • 검증:
    • MainHomeRecommendationView에서 genreCreatorsMainHomeGenreCreatorSection 참조가 없어야 한다.
    • 추천 탭의 인접 섹션인 AI 캐릭터, 응원 크리에이터, 인기 커뮤니티, 사업자 정보 섹션은 기존 순서로 유지되어야 한다.

주요 대상 파일

확인/보완

  • SodaLive/Sources/V2/Main/Home/MainHomeView.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationApi.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationRepository.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift
  • SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
  • SodaLive/Sources/V2/Component/Text/V2ExpandableTextView.swift
  • SodaLive/Sources/I18n/I18n.swift
  • SodaLive.xcodeproj/project.pbxproj

생성 후보

없는 경우에만 생성한다.

  • SodaLive/Sources/V2/Main/Home/MainHomeView.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBannerSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeRecentDebutCreatorSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeGenreCreatorSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCheerCreatorSection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift
  • SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBusinessInfoSection.swift
  • SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift
  • SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift

TASK 체크리스트

Phase 1: 기준 스펙과 기존 구현 점검

  • Task 1.1: 문서/코드 기준점 확인

    • 대상 파일:
      • 확인: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 확인: SodaLive/Sources/V2/Main/Home/**
      • 확인: SodaLive/Sources/V2/Component/**
    • 작업 내용:
      • PRD의 신규 API 응답 필드와 현재 Swift 모델 필드 차이를 확인한다.
      • 현재 SodaLive/Sources/V2/Main/Home 바로 아래에 있는 추천 전용 파일을 Recommendation 하위 폴더로 이동/이름 변경할 대상을 확인한다.
      • Figma 기준으로 재사용 가능한 기존 widget을 확인한다.
      • 이미 생성된 파일은 유지하고 필요한 보완만 계획한다.
    • 검증 기준:
      • 실행 명령: find SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component -maxdepth 4 -type f | sort
      • 기대 결과: 현재 생성된 V2 홈/공용 컴포넌트 목록을 확인할 수 있다.
  • Task 1.2: 제외 범위 점검

    • 대상 파일:
      • 확인: SodaLive/Sources/V2/Main/Home/**
      • 확인: SodaLive/Sources/V2/Component/**
    • 작업 내용:
      • 추천 필모그래피, 또 다른 모습 섹션 파일이나 View를 만들지 않는다.
      • Figma URL이나 localhost asset URL이 앱 코드에 직접 들어가지 않도록 확인한다.
    • 검증 기준:
      • 실행 명령: rg "추천 필모그래피|또 다른 모습|figma.com|localhost:3845" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component
      • 기대 결과: 검색 결과가 없어야 한다.

Phase 2: 신규 API와 응답 모델

  • Task 2.1: 추천 API endpoint 확인/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationApi.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationRepository.swift
      • 이동/정리: SodaLive/Sources/V2/Main/Home/Repository/MainHomeApi.swift
      • 이동/정리: SodaLive/Sources/V2/Main/Home/Repository/MainHomeRepository.swift
      • 확인: SodaLive/Sources/Home/HomeApi.swift
    • 작업 내용:
      • GET /api/v2/home/recommendations를 신규 API 타입에만 둔다.
      • 추천 API 타입/Repository는 Recommendation/Repository 아래에 둔다.
      • 기존 HomeApi에는 endpoint를 추가하지 않는다.
      • 인증 헤더는 기존 token 패턴을 따른다.
    • 검증 기준:
      • 실행 명령: rg "/api/v2/home/recommendations|getRecommendations" SodaLive/Sources/V2/Main/Home/Recommendation/Repository SodaLive/Sources/Home
      • 기대 결과: 신규 경로는 SodaLive/Sources/V2/Main/Home/Recommendation/Repository에서만 검색된다.
  • Task 2.2: 신규 Response 모델 보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
      • 이동/정리: SodaLive/Sources/V2/Main/Home/Models/MainHomeRecommendationResponse.swift
    • 작업 내용:
      • HomeRecommendationResponse 필드를 PRD와 맞춘다.
      • 추천 응답 모델은 Recommendation/Models 아래에 둔다.
      • banners 타입은 RecommendationBannerResponse 또는 Swift 대응 타입으로 명확히 한다.
      • HomeLiveItem.roomId, creatorProfileImage, HomeActiveCreatorItem.targetId, HomeAiCharacterItem.totalChatCount, originalWorkTitle, HomePopularCommunityPostItem.audioUrl 누락 여부를 확인한다.
      • 과거 추정 필드는 실제 사용 경로가 없으면 제거하거나 호환 필요 시 명확히 분리한다.
    • 검증 기준:
      • 실행 명령: rg "roomId|creatorProfileImage|targetId|totalChatCount|originalWorkTitle|audioUrl" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
      • 기대 결과: PRD 핵심 필드가 모델에 반영되어야 한다.
  • Task 2.3: PRD 응답 계약에 없는 필수 디코딩 필드 제거

    • Goal 실행 P2-R1: REV-P2-001을 수정해 PRD 기준 추천 응답이 firstAudioContents 없이도 정상 디코딩되게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase2-recommendation-api-response-model.md
      • 확정 항목: REV-P2-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 production 모델을 직접 import하는 영구 unit test를 이번 Task에서 추가할 수 없다.
    • 대체 검증 방법:
      • PRD의 필수 필드만 포함하고 firstAudioContents가 없는 JSON으로 디코딩 회귀를 확인하고, 정적 검색과 앱 빌드를 실행한다.
    • 작업 내용:
      • 현재 모델이 기준 JSON에서 keyNotFound(firstAudioContents)로 실패하는 것을 재현한다.
      • 실제 사용 경로와 PRD 계약이 없는 firstAudioContentsHomeFirstAudioContentItem을 제거한다.
      • 기준 JSON 디코딩, rg "firstAudioContents|HomeFirstAudioContentItem" SodaLive/Sources/V2/Main/Home/Recommendation, git diff --check, SodaLive-dev Debug 빌드를 통과한다.
      • 수정 결과와 실제 명령을 검증 기록에 누적한다.

Phase 3: 활동 타입과 I18n

  • Task 3.1: RecommendedActivityType 변환 보완
    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift
      • 이동/정리: SodaLive/Sources/V2/Main/Home/Models/RecommendedActivityType.swift
      • 확인/보완: SodaLive/Sources/I18n/I18n.swift
    • 작업 내용:
      • LIVE, LIVE_REPLAY라이브 계열 문구로 표시한다.
      • AUDIO오디오, COMMUNITY커뮤니티 계열 문구로 표시한다.
      • 알 수 없는 값은 서버 코드를 그대로 표시하지 않는다.
      • ko/en/ja 문구를 I18n에 둔다.
    • 검증 기준:
      • 실행 명령: rg "LIVE_REPLAY|activityLive|activityAudio|activityCommunity|ライブ|オーディオ|コミュニティ" SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift SodaLive/Sources/I18n/I18n.swift
      • 기대 결과: enum 변환과 I18n 문구가 확인된다.

Phase 4: 추천 데이터 상태 계층 정리

  • Task 4.1: 추천 ViewModel 데이터 로딩 계층 정리

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift
      • 이동/정리: SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationRepository.swift
    • 작업 내용:
      • 추천 API 로딩/에러/섹션 상태는 MainHomeRecommendationViewModel에서 담당한다.
      • 기존 MainHomeViewModel이 추천 전용 상태만 가진다면 MainHomeRecommendationViewModel로 이동/이름 변경한다.
      • 추천 API 응답 데이터가 섹션별 View에서 바로 사용할 수 있는 상태로 노출되는지 확인한다.
      • UI 섹션 구현은 이 Phase에서 진행하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "final class MainHomeRecommendationViewModel|fetchRecommendations|HomeRecommendationResponse|MainHomeRecommendationRepository|isLoading|errorMessage" SodaLive/Sources/V2/Main/Home
      • 기대 결과: 추천 API 로딩/에러/응답 상태가 MainHomeRecommendationViewModel 중심으로 정리되어야 한다.
  • Task 4.2: 추천 응답 디코딩 오류 로그를 프로젝트 로깅 규칙에 맞춤

    • Goal 실행 P4-R1: REV-P4-001을 수정해 신규 추천 ViewModel의 디코딩 오류가 print가 아니라 프로젝트 오류 로그 경로로 기록되게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase4-recommendation-state-layer.md
      • 확정 항목: REV-P4-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift
    • TDD 예외 사유:
      • 사용자 동작을 바꾸지 않는 오류 로그 호출 교체이며 앱 테스트 번들 타깃이 없다.
    • 대체 검증 방법:
      • 현재 print(error) 사용을 정적 재현하고 프로젝트 ERROR_LOG 관례와 대조한 뒤 정적 검색과 앱 빌드로 확인한다.
    • 작업 내용:
      • 추천 응답 디코딩 catchprint(error)를 실패 근거로 확인한다.
      • 기존 toast·loading 처리는 유지하고 오류 기록만 ERROR_LOG(error.localizedDescription)로 교체한다.
      • 추천 범위의 print( 미사용, ERROR_LOG 사용, git diff --checkSodaLive-dev Debug 빌드를 확인한다.
      • 수정 결과와 실제 명령을 이 문서와 Phase 4 리뷰 리포트에 누적한다.

Phase 5: 추천 상세 진입 데이터/라우팅 guard

  • Task 5.1: 추천 탭 상세 진입 guard 적용

    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 확인: SodaLive/Sources/Main/Home/HomeView.swift
      • 확인: SodaLive/Sources/Home/HomeTabView.swift
    • 작업 내용:
      • 신규 추천 탭의 API 호출과 섹션 노출 자체는 막지 않고, 라이브/크리에이터/오디오 콘텐츠/AI 캐릭터/커뮤니티 등 상세 진입 탭 액션 앞에서 guard를 적용한다.
      • MainHomeViewMainHomeRecommendationView는 직접 로그인/본인인증/민감 콘텐츠 설정 로직을 복사하지 않고, MainView에서 전달받은 callback으로 탭 이벤트만 올린다.
      • MainView에 이미 있는 token, auth, isShowAuthView, isShowAuthConfirmView, pendingAction, authConfirmDialog, authView 인프라를 재사용한다.
      • 토큰이 비어 있으면 AppState.shared.setAppStep(step: .login)으로 이동한다.
      • 민감/성인 콘텐츠 진입이 필요한 항목은 한국 사용자이고 auth == false이면 pendingAction에 원래 이동 액션을 저장하고 isShowAuthConfirmView = true로 본인인증 dialog를 띄운다.
      • 민감 콘텐츠 보기 설정이 꺼져 있으면 AppState.shared.setPendingContentSettingsGuideMessage(I18n.Settings.adultContentEnableGuide)AppState.shared.setAppStep(step: .contentViewSettings)로 이동한다.
      • guard 통과 후에만 liveDetail, creatorDetail, contentDetail, characterDetail 등 실제 상세 이동을 실행한다.
      • 라이브 항목에 성인 여부 guard를 적용하려면 HomeLiveItem 응답에 isAdult 또는 동등한 필드가 필요하므로, 필드가 없으면 서버 필터링 전제인지 확인하고 임의 판단하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "pendingAction|isShowAuthConfirmView|setPendingContentSettingsGuideMessage|adultContentEnableGuide|contentViewSettings|MainHomeView\\(|MainHomeRecommendationView\\(" SodaLive/Sources/V2/Main/MainView.swift SodaLive/Sources/V2/Main/Home
      • 기대 결과: 신규 추천 탭 상세 진입 callback이 기존 인증/민감 콘텐츠 guard 인프라를 재사용한다.
      • 수동 확인: MainHomeView, MainHomeRecommendationView 내부에 Bootpay 인증 UI를 중복 구현하지 않아야 한다.
  • Task 5.2: AI 캐릭터 상세 라우팅과 guard 연결

    • Goal 실행 P5-R1: REV-P5-001을 수정해 추천 AI 캐릭터 callback이 로그인·민감 콘텐츠 guard를 거쳐 characterDetail(characterId:)로 이동하게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase5-detail-routing-guards.md
      • 확정 항목: REV-P5-001
      • Task 12.2characterId 전달 보정과 함께 검증한다.
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
      • 확인: SodaLive/Sources/Home/HomeTabView.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없고 SwiftUI callback에서 전역 AppState route까지 확인하는 테스트 인프라 추가는 이번 회귀 수정 범위를 벗어난다.
    • 대체 검증 방법:
      • callback 연결 정적 검색, SodaLive-dev 빌드, creatorId != characterId인 항목의 수동 탭으로 검증한다.
    • 작업 내용:
      • onTapCharacterhandleRecommendationCreatorTap에 연결되어 크리에이터 상세로 이동하는 현재 실패 경로를 확인한다.
      • 양수 characterId를 검증하고 기존 추천 상세 guard를 재사용해 .characterDetail(characterId:)를 실행하는 전용 handler를 연결한다.
      • rg "onTapCharacter:|handleRecommendationCharacterTap|characterDetail\\(characterId:" SodaLive/Sources/V2/Main/MainView.swift, git diff --check, SodaLive-dev Debug 빌드를 통과한다.
      • 비로그인·본인인증·민감 콘텐츠 설정·정상 진입 흐름은 기존 guard 재사용 정적 검색과 빌드로 확인하고, 실제 기기 수동 확인은 잔여 확인 사항으로 검증 기록에 남긴다.
  • Task 5.3: 본인인증 후 민감 콘텐츠 설정 guard 재검사

    • Goal 실행 P5-R2: REV-P5-002를 수정해 한국 사용자의 본인인증 성공 후에도 민감 콘텐츠 보기 설정을 확인한 뒤 AI 캐릭터 상세로 이동하게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase5-detail-routing-guards.md
      • 확정 항목: REV-P5-002
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없고 Bootpay 본인인증 callback과 전역 AppState route를 직접 실행하는 영구 통합 test 인프라는 이번 회귀 수정 범위를 벗어난다.
    • 대체 검증 방법:
      • token != empty, 한국 사용자, auth == false, isAdultContentVisible == false 상태 전이를 최소 Swift self-check로 재현하고, 정적 callback 추적·앱 빌드·수동 상태 조합 확인으로 검증한다.
    • 작업 내용:
      • RED: 본인인증 전 저장한 pendingAction이 인증 성공 callback에서 상세 route를 직접 실행해 민감 콘텐츠 설정 화면을 건너뛰는 현재 실패를 재현한다.
      • GREEN: 인증 성공 후 보류 action이 상세 route를 직접 실행하지 않고 기존 performRecommendationDetailAction(requiresAdultContent: true)의 남은 설정 guard를 다시 통과하도록 최소 수정한다.
      • REFACTOR: 기존 로그인, 비한국 사용자, 이미 본인인증된 사용자, 민감 콘텐츠 설정 활성 사용자 흐름은 변경하지 않고 중복 guard를 추가하지 않는다.
      • 한국 사용자 기준 auth=false/설정=false, auth=false/설정=true, auth=true/설정=false, auth=true/설정=true 조합과 취소·오류 시 보류 action 미실행을 확인한다.
      • git diff --check, plutil -lint SodaLive.xcodeproj/project.pbxproj, SodaLive-dev Debug 빌드를 실행하고 결과를 이 문서와 Phase 5 리뷰 리포트에 누적한다.
  • Task 5.4: 활성 민감 콘텐츠 진입 경로의 인증 후 설정 guard 재검사

    • Goal 실행 P5-R3: REV-P5-003을 수정해 라이브 전체 화면의 성인 라이브와 크리에이터 채널 AI 대화도 본인인증 성공 후 민감 콘텐츠 보기 설정을 다시 확인하게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase5-detail-routing-guards.md
      • 확정 항목: REV-P5-003
    • 대상 파일:
      • 수정: SodaLive/Sources/Live/Now/All/LiveNowAllView.swift
      • 수정: SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift
      • 확인: SodaLive/Sources/ContentView.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없고 Bootpay 본인인증 callback과 전역 route를 직접 실행하는 영구 통합 test 인프라는 이번 회귀 수정 범위를 벗어난다.
    • 대체 검증 방법:
      • 두 활성 화면의 auth=false, 민감 콘텐츠 설정 비활성 상태 전이를 최소 Swift self-check로 재현하고, callback 추적·앱 빌드·수동 상태 조합으로 확인한다.
    • 작업 내용:
      • RED: LiveNowAllView.handleLiveNowItemTapCreatorChannelView.handleTalkTap이 인증 성공 후 설정 화면 없이 보호 route를 직접 실행하는 상태를 재현한다.
      • GREEN: 각 화면의 pendingAction이 최종 route가 아니라 기존 진입 함수를 다시 호출해 남은 설정 guard를 통과하도록 최소 수정한다.
      • REFACTOR: 공용 계층을 새로 만들지 않고 기존 로그인·국가·본인인증·설정 분기와 route를 유지한다.
      • 두 화면에서 auth=false/설정=false, auth=false/설정=true, auth=true/설정=false, auth=true/설정=true 조합과 인증 취소·오류를 확인한다.
      • git diff --check, plutil -lint SodaLive.xcodeproj/project.pbxproj, SodaLive-devSodaLive Debug 빌드를 실행하고 결과를 이 문서와 Phase 5 리뷰 리포트에 누적한다.

Phase 6: 홈 탭 shell과 탭별 루트 연결

  • Task 6.1: 추천/랭킹/팔로잉 하위 폴더와 루트 View 준비

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift
    • 작업 내용:
      • 추천 탭 콘텐츠 조립은 MainHomeRecommendationView에서 담당한다.
      • 랭킹/팔로잉 탭은 이번 추천 API 범위 밖이므로 placeholder 또는 최소 루트 View만 준비하고 추천 섹션 코드를 넣지 않는다.
      • 섹션별 UI 구현은 이후 섹션 UI Phase에서 진행한다.
    • 검증 기준:
      • 실행 명령: find SodaLive/Sources/V2/Main/Home -maxdepth 3 -type f | sort
      • 기대 결과: Recommendation, Ranking, Following 하위 폴더의 루트 View 파일이 확인된다.
  • Task 6.2: MainHomeView 탭 shell 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 확인: SodaLive/Sources/V2/Component/HomeTitleBar.swift
    • 작업 내용:
      • MainHomeViewHomeTitleBar, 추천/랭킹/팔로잉 상단 탭, 선택된 탭 콘텐츠 조합만 담당한다.
      • 추천 탭 섹션 조립과 추천 API 호출을 MainHomeView에 직접 넣지 않는다.
      • 하단 MainTabBarView는 기존 MainView 구조에서 유지하고 MainHomeView 내부에 중복 생성하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "struct MainHomeView|HomeTitleBar|MainHomeRecommendationView|MainHomeRankingView|MainHomeFollowingView|MainTabBarView|fetchRecommendations" SodaLive/Sources/V2/Main/Home/MainHomeView.swift SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: MainHomeView는 탭별 루트 View를 조합하고, fetchRecommendations를 직접 호출하지 않으며, 탭바 중복 생성은 없어야 한다.
  • Task 6.3: MainView 홈 탭 연결

    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
    • 작업 내용:
      • .home 분기에서 placeholder 대신 MainHomeView()를 표시한다.
      • 다른 탭 분기와 기존 이벤트 팝업/회원 정보 초기화 흐름은 변경하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "case \\.home|MainHomeView|MainPlaceholderTabView" SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: .homeMainHomeView()를 표시하고, 다른 탭은 기존 동작을 유지한다.
  • Task 6.4: 홈 상단 탭 제목 현지화 연결

    • Goal 실행 P6-R1: REV-P6-001을 수정해 추천/랭킹/팔로잉 탭 제목이 앱 언어 ko/en/ja에 맞게 표시되도록 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase6-home-tab-shell.md
      • 확정 항목: REV-P6-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 확인: SodaLive/Sources/I18n/I18n.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 SwiftUI 탭 제목의 언어별 렌더링을 직접 검증하는 영구 UI test를 이번 Task에서 추가할 수 없다.
    • 대체 검증 방법:
      • 기존 I18n.MainContentRecommendation.tabTitle, I18n.MainContentRanking.tabTitle, I18n.HomeFollowing.tabTitle 재사용 여부를 정적 검색하고 ko/en/ja 화면과 앱 빌드로 확인한다.
    • 작업 내용:
      • MainHomeView의 탭 제목에 남은 한글 문자열 리터럴을 기존 I18n 키로 교체한다.
      • 새 문자열이나 별도 매핑 계층을 추가하지 않는다.
    • 검증 기준:
      • 실행 명령: rg '"추천"|"랭킹"|"팔로잉"|MainContentRecommendation\.tabTitle|MainContentRanking\.tabTitle|HomeFollowing\.tabTitle' SodaLive/Sources/V2/Main/Home/MainHomeView.swift SodaLive/Sources/I18n/I18n.swift
      • 기대 결과: MainHomeView는 기존 I18n 탭 제목만 사용하고 한글 탭 제목 리터럴은 없어야 한다.
      • 수동 확인: 앱 언어 ko/en/ja에서 세 탭 제목이 각 언어로 표시되어야 한다.

Phase 7: 데이터 기반 프로젝트 포함과 중간 빌드 검증

  • Task 7.1: 데이터 기반 신규 Swift 파일 프로젝트 포함 여부 확인
    • 대상 파일:
      • 확인/보완: SodaLive.xcodeproj/project.pbxproj
      • 확인: SodaLive/Sources/V2/Main/Home/**
    • 작업 내용:
      • Phase 4~6에서 생성/이동한 데이터 상태, 라우팅, 탭 루트 Swift 파일이 빌드 대상에 포함되는지 확인한다.
      • 파일 시스템 동기화 방식으로 자동 포함되면 프로젝트 파일을 수정하지 않는다.
      • 프로젝트 파일 수정이 필요한 경우에만 최소 변경한다.
    • 검증 기준:
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED

Phase 8: 현재 라이브 섹션 UI

  • Task 8.1: 현재 라이브 섹션 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift
    • 작업 내용:
      • HomeLiveItem.roomId, creatorNickname, creatorProfileImage로 라이브 아이템을 표시한다.
      • roomId는 응답 스펙상 항상 존재하는 값으로 취급한다.
      • 섹션 제목은 표시하지 않는다.
      • 데이터가 비어 있으면 섹션 제목과 컨테이너를 표시하지 않는다.
      • 아이템 터치 시 기존 LiveViewModel.enterLiveRoom(roomId:) 흐름을 재사용해 로그인 guard 이후 입장 전 결제 확인, 비밀방 비밀번호 dialog, LiveRoomViewV2 입장을 처리한다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage|enterLiveRoom|LivePaymentDialog|LiveRoomPasswordDialog" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: 라이브 섹션이 신규 응답 필드를 기준으로 구성되고, 추천 라이브 탭이 기존 라이브 입장 흐름을 재사용한다.
  • Task 8.2: 현재 라이브 전체 항목 스타일 보정

    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift
    • 작업 내용:
      • MainHomeLiveAllItemView의 원형 배경을 제거한다.
      • 전체 텍스트는 기존 .appFont(.body5)를 사용해 medium 14로 표시한다.
      • 전체 텍스트 색상은 Color.soda400으로 표시한다.
      • 전체 텍스트는 기존 항목 높이 안에서 세로 가운데 정렬한다.
    • TDD 예외 사유: 현재 프로젝트 문서 기준 테스트 번들 타깃이 확인되지 않는 SwiftUI 단일 스타일 변경이다.
    • 대체 검증 방법:
      • 실행 명령: rg -n "MainHomeLiveAllItemView|Color\.gray800|foregroundColor\(Color\.soda400\)|appFont\(\.body5\)|alignment: \.center" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift
      • 기대 결과: MainHomeLiveAllItemViewColor.gray800 원형 배경이 없고, .appFont(.body5), Color.soda400, 세로 가운데 정렬 근거가 확인되어야 한다.

Phase 9: 배너 섹션 UI

  • Task 9.1: BannerCarousel 현재 구현과 Figma 요구사항 고정

    • 대상 파일:
      • 확인/보완: SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
    • 작업 내용:
      • Figma 기준 노드는 24:5525로 고정한다.
      • BannerCarousel이 현재 TabView(.page) 기반 단일 페이지 노출 구조인지 확인한다.
      • RecommendationBannerResponseimageUrl, eventItem, creatorId, seriesId, link가 표시와 이동에 매핑 가능한지 확인한다.
      • 배너 이동 규칙은 미확정이면 탭 액션을 임의 구현하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "struct BannerCarousel|BannerCarouselItem|RecommendationBannerResponse|eventItem|creatorId|seriesId|link|imageUrl" SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
      • 기대 결과: 기존 캐러셀 구조와 배너 응답 모델 필드를 확인할 수 있다.
  • Task 9.2: BannerCarousel을 Figma와 동일한 수평 캐러셀로 보완

    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift
    • 작업 내용:
      • 배너 width는 device width - 40으로 계산한다.
      • 배너 이미지 영역은 1:1 비율을 유지한다.
      • 배너 사이 간격은 8로 둔다.
      • 현재 배너 좌우에 이전/다음 배너가 조금씩 보이도록 수평 inset과 item 배치를 조정한다.
      • 배너가 2개 이상이면 무한 스크롤이 가능하도록 첫/마지막 경계에서 자연스럽게 이어지게 처리한다.
      • 배너 corner radius는 Figma 기준 14를 유지한다.
      • Figma처럼 우측 상단에 현재/전체 페이지 인디케이터를 표시한다.
      • 인디케이터는 01 / 20 형식으로 두 자리 current/total을 표시하고, 배경은 반투명 검정 pill 형태로 둔다.
      • 로컬 Figma asset URL(localhost:3845)은 앱 코드에 넣지 않는다.
    • 검증 기준:
      • 실행 명령: rg "SodaSpacing.s8|SodaSpacing.s14|BannerCarousel|GeometryReader|ScrollView|TabView|01|current|total|localhost:3845" SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift
      • 기대 결과: 간격 8, radius 14, 페이지 인디케이터, 무한/수평 캐러셀 구현 근거가 확인되고 localhost:3845는 검색되지 않아야 한다.
      • 수동 확인: iPhone 15 기준 현재 배너 폭이 화면 폭보다 40 작고, 좌우에 이전/다음 배너 일부가 보여야 한다.
      • 수동 확인: 이미지 영역이 정사각형으로 표시되고 배너 간 간격이 8로 보여야 한다.
  • Task 9.3: 추천 홈 배너 섹션 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBannerSection.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
    • 작업 내용:
      • HomeRecommendationResponse.bannersBannerCarouselItem 배열로 변환한다.
      • eventItem, creatorId, seriesId, link, imageUrl 순서로 안정적인 carousel id를 만든다.
      • imageUrl이 비어 있는 배너는 이미지 placeholder 정책을 기존 BannerCarousel 동작과 맞춘다.
      • 데이터가 비어 있으면 배너 섹션 자체를 표시하지 않는다.
      • 기존 MainHomeRecommendationView 섹션 순서를 유지하면서 현재 라이브 섹션 다음 위치에 배너 섹션을 배치한다.
      • 배너 이동 규칙은 미확정이면 탭 액션을 임의 구현하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeBannerSection|BannerCarouselItem|BannerCarousel|banners|RecommendationBannerResponse" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Banner
      • 기대 결과: 추천 응답의 banners가 홈 배너 섹션을 통해 BannerCarousel에 연결되어야 한다.
  • Task 9.4: 배너 섹션 빌드 및 시각 회귀 검증

    • 대상 파일:
      • 확인: SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift
      • 확인: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBannerSection.swift
      • 확인: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 확인: SodaLive.xcodeproj/project.pbxproj
    • 작업 내용:
      • 새로 만든 MainHomeBannerSection.swift가 빌드 대상에 포함되는지 확인한다.
      • 파일 시스템 동기화 방식으로 자동 포함되면 프로젝트 파일을 수정하지 않는다.
      • 프로젝트 파일 수정이 필요한 경우에만 최소 변경한다.
    • 검증 기준:
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED
      • 수동 확인: 추천 홈에서 배너가 Figma 노드 24:5525처럼 좌우 배너 일부 노출, 간격 8, 1:1 이미지, 우측 상단 인디케이터 형태로 표시되어야 한다.
  • Task 9.5: 무한 캐러셀 경계 연속 스와이프를 안전하게 처리

    • Goal 실행 P9-R1: REV-P9-001을 수정해 첫·마지막 복제 배너 전환 중 연속 스와이프가 발생해도 표시 index가 유효 범위를 벗어나지 않게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase9-banner-section.md
      • 확정 항목: REV-P9-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 SwiftUI gesture와 지연 animation을 직접 실행하는 영구 UI test를 이번 Task에서 추가할 수 없다.
    • 대체 검증 방법:
      • 마지막 실데이터 index에서 지연 reset 전에 같은 방향과 반대 방향 스와이프를 각각 적용하는 상태 전이, 첫 index의 대칭 상태 전이와 데이터 변경 중 예약된 reset을 재현하고, 수동 경계 연속 스와이프와 앱 빌드로 확인한다.
    • 작업 내용:
      • displayIndex == items.count에서 두 번 연속 증가하면 items.count + 2가 되고 현재 wrapIfNeeded()가 이를 복구하지 못하는 실패를 재현한다.
      • 전환 지연 중 추가 gesture·timer 전이가 index를 유효 복제 범위 밖으로 보내지 않도록 최소 상태/guard만 추가한다.
      • 배너 크기, 간격, 페이지 형식, 5초 자동 스크롤과 탭 callback은 변경하지 않는다.
      • 경계에서 예약한 지연 reset이 사용자의 반대 방향 이동 또는 items 변경 뒤 현재 정상 index를 덮어쓰지 않도록, reset 실행 시점에 여전히 같은 복제 경계인지 확인한다.
      • 마지막·첫 경계에서 같은 방향/반대 방향 입력과 예약 reset 실행 순서를 포함한 상태 전이 self-check를 통과한다.
      • 첫·마지막 경계의 빠른 양방향 연속 스와이프, 자동 스크롤, 페이지 표시를 수동 확인하고 git diff --checkSodaLive-dev Debug 빌드를 실행한다.
      • 수정 결과와 실제 명령을 이 문서와 Phase 9 리뷰 리포트에 누적한다.

Phase 10: 최근 활동 크리에이터 섹션 UI

  • Task 10.1: 최근 활동 크리에이터 섹션 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
    • 작업 내용:
      • creatorNickname, creatorProfileImage, activityType, activityAt, targetId를 사용한다.
      • activityTypeRecommendedActivityType 변환 결과를 표시한다.
      • 데이터가 비어 있으면 섹션을 표시하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeActiveCreatorSection|activityType|activityAt|targetId|RecommendedActivityType" SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 최근 활동 섹션이 신규 응답 필드와 활동 타입 변환을 사용한다.
  • Task 10.2: 최근 활동 상대 시간 계산을 공용 DateParser로 단일화

    • Goal 실행 P10-R1: REV-P10-001을 수정해 최근 활동 섹션의 중복 상대 시간 계산을 제거하고 공용 DateParser.relativeTimeText를 재사용한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase10-active-creators.md
      • 확정 항목: REV-P10-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
      • 확인: SodaLive/Sources/Common/DateParser.swift
    • TDD 예외 사유:
      • 사용자 동작을 바꾸지 않고 공용 함수와 동일한 중복 계산만 제거하는 구조 정리 Task이며 앱 테스트 번들 타깃이 없다.
    • 대체 검증 방법:
      • 두 구현의 분기와 반환 I18n을 대조하고, 공용 함수 연결 정적 검색 및 앱 빌드로 동작 보존을 확인한다.
    • 작업 내용:
      • relativeActivityAtText(now:)DateParser.relativeTimeText(fromUTC:fallback:now:)가 동일한 연/월/일/시/분 분기와 fallback을 구현하는 현재 중복을 확인한다.
      • 최근 활동 표시를 공용 DateParser.relativeTimeText 호출로 교체하고 이번 섹션의 중복 계산만 제거한다.
      • rg "dateComponents|timeIntervalSince|relativeTimeText" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift SodaLive/Sources/Common/DateParser.swift, git diff --check, SodaLive-dev Debug 빌드를 실행한다.
      • 수정 결과와 실제 명령을 이 문서와 Phase 10 리뷰 리포트에 누적한다.

Phase 11: 최근 데뷔한 크리에이터 섹션 UI

  • Task 11.1: 최근 데뷔 크리에이터 섹션 작성/보완
    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeRecentDebutCreatorSection.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Creator/CreatorProfileGrid.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Creator/CreatorProfileItem.swift
    • 작업 내용:
      • HomeCreatorItem.creatorId, creatorNickname, creatorProfileImage를 사용한다.
      • 기존 CreatorProfileGridCreatorProfileItem을 우선 검토하되, Figma 직사각형 카드 형태를 충족하지 못하면 페이지 전용 MainHomeRecentDebutCreatorItemView를 사용한다.
      • 데이터가 비어 있으면 섹션을 표시하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeRecentDebutCreatorSection|MainHomeRecentDebutCreatorItemView|CreatorProfileGrid|CreatorProfileItem|creatorProfileImage" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Creator
      • 기대 결과: 최근 데뷔 섹션이 신규 응답 필드를 사용하고, 공용 원형 widget으로 충족할 수 없는 Figma 직사각형 카드는 페이지 전용 View를 사용한다.

Phase 12: AI 캐릭터 섹션 UI

  • Task 12.1: AI 캐릭터 섹션 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Card/AiCharacterCard.swift
    • 작업 내용:
      • characterId, creatorId, name, description, profileImage, totalChatCount, originalWorkTitle를 사용한다.
      • 기존 AiCharacterCard로 충분하면 재사용한다.
      • 데이터가 비어 있으면 섹션을 표시하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeAiCharacterSection|AiCharacterCard|totalChatCount|originalWorkTitle|profileImage" SodaLive/Sources/V2
      • 기대 결과: AI 캐릭터 섹션이 신규 응답 필드를 기준으로 구성된다.
  • Task 12.2: AI 캐릭터 탭 식별자를 characterId로 보정

    • Goal 실행 P12-R1: REV-P12-001을 수정해 AI 캐릭터 카드가 creatorId가 아니라 characterId를 상세 callback으로 전달하게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase12-ai-character-section.md
      • 확정 항목: REV-P12-001
      • Task 5.2의 최종 character route가 준비되어야 한다.
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 SwiftUI Button callback을 직접 실행하는 영구 unit test를 추가할 수 없다.
    • 대체 검증 방법:
      • Preview처럼 characterId != creatorId인 fixture의 callback 값을 수동 확인하고 정적 검색과 앱 빌드를 실행한다.
    • 작업 내용:
      • 현재 onTapCharacter(item.creatorId) 전달을 실패 근거로 확인한다.
      • 최소 수정으로 onTapCharacter(item.characterId)를 전달한다.
      • rg "onTapCharacter\\(item\\.(characterId|creatorId)\\)" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift, git diff --check, SodaLive-dev Debug 빌드를 통과한다.
      • creatorId != characterId인 항목은 characterId callback과 characterDetail(characterId:) 정적 연결로 확인하고, 실제 탭 수동 확인은 잔여 확인 사항으로 검증 기록에 남긴다.

Phase 13: 장르의 크리에이터 섹션 UI

  • Task 13.1: 장르 크리에이터 그룹 섹션 작성/보완
    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeGenreCreatorSection.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCreatorGroupSection.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Creator/CreatorProfileGrid.swift
    • 작업 내용:
      • HomeGenreCreatorGroupItem.genreNamecreators를 사용한다.
      • 그룹별 크리에이터 목록은 기존 Creator widget을 재사용한다.
      • 모두 팔로우 API가 이번 범위에 남아 있다면 현재 섹션의 creatorId 목록으로만 호출한다.
      • 데이터가 비어 있으면 섹션을 표시하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeGenreCreatorSection|MainHomeCreatorGroupSection|genreName|creators|followAll" SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 장르 그룹 섹션과 그룹 재사용 구조가 확인된다.

Phase 14: 최근 응원이 많은 크리에이터 섹션 UI

  • Task 14.1: 응원 크리에이터 섹션 작성/보완
    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCheerCreatorSection.swift
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCreatorGroupSection.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Creator/CreatorProfileGrid.swift
    • 작업 내용:
      • cheerCreatorscreatorId, creatorNickname, creatorProfileImage를 사용한다.
      • 장르 섹션과 같은 그룹 UI를 재사용한다.
      • 모두 팔로우 API가 이번 범위에 남아 있다면 응원 섹션의 creatorId 목록으로만 호출한다.
      • 데이터가 비어 있으면 섹션을 표시하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeCheerCreatorSection|cheerCreators|MainHomeCreatorGroupSection|CreatorProfileGrid" SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 응원 섹션이 장르 그룹 UI를 재사용한다.

Phase 15: 인기 커뮤니티 섹션 UI와 FeedCommunityView

  • Task 15.1: FeedCommunityView/CommunityPostCard 요구 보완

    • 대상 파일:
      • 확인/보완: SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift
    • 작업 내용:
      • 키워드 영역을 제거한다.
      • imageUrl이 있으면 이미지를 표시한다.
      • price > 0 && existOrdered == false이면 유료 미구매 UI를 표시한다.
      • price <= 0 || existOrdered == true이면 일반 이미지로 표시한다.
      • 구매완료 버튼은 표시하지 않는다.
      • creatorProfileImage, createdAt, likeCount, commentCount를 표시한다.
      • 반응 정보는 댓글 아이콘/댓글 수를 먼저, 좋아요 아이콘/좋아요 수를 뒤에 표시한다.
      • audioUrl이 있으면 이미지 중앙 재생 UI를 표시한다.
      • 기존 커뮤니티 구매 API를 재사용해 유료 미구매 포스트 구매를 지원한다.
      • createdAt은 UTC로 파싱해 디바이스 Timezone 기준 상대 날짜로 표시한다.
    • 검증 기준:
      • 실행 명령: rg "MainHomePopularCommunitySection|CommunityPostCard|imageUrl|audioUrl|existOrdered|구매완료|purchaseCommunityPost|communityPostLike|toggleContent|relativeTimeText" SodaLive/Sources/V2 SodaLive/Sources/Common SodaLive/Sources/Explorer/Profile/CreatorCommunity
      • 기대 결과: 커뮤니티 섹션과 카드 조건 분기, 오디오 재생, 구매/좋아요 연결, UTC 상대 날짜 변환이 확인되고 구매완료 표시 구현은 없어야 한다.
  • Task 15.2: 무료 커뮤니티 게시물 가격 경계 보정

    • Goal 실행 P15-R1: REV-P15-001을 수정해 PRD의 price <= 0 || existOrdered 조건과 카드 접근 가능 상태를 일치시킨다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase15-popular-community-feed.md
      • 확정 항목: REV-P15-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 private SwiftUI 계산 프로퍼티의 영구 unit test를 추가할 수 없다.
    • 대체 검증 방법:
      • price가 음수·0·양수인 상태와 existOrdered 조합을 Preview/수동 확인하고 정적 검색과 앱 빌드를 실행한다.
    • 작업 내용:
      • price < 0 && existOrdered == false에서 현재 isAccessiblePost == false가 되는 경계를 확인한다.
      • isAccessiblePost를 PRD의 price <= 0 || existOrdered 조건과 일치시키는 최소 수정만 적용한다.
      • rg "price (==|<=) 0 \\|\\| existOrdered" SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift, git diff --check, SodaLive-dev Debug 빌드를 통과한다.
      • 무료·유료 미구매·구매 완료 상태 조건은 정적 검색과 빌드로 확인하고, 실제 화면 수동 확인은 잔여 확인 사항으로 검증 기록에 남긴다.
  • Task 15.3: 이미지 없는 유료 미구매 게시물 구매 진입 보완

    • Goal 실행 P15-R2: REV-P15-002를 수정해 imageUrl == nil && price > 0 && existOrdered == false인 게시물에서도 기존 구매 API로 진입할 수 있게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase15-popular-community-feed.md
      • 확정 항목: REV-P15-002
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift
    • TDD 예외 사유:
      • 앱 테스트 번들 타깃이 없어 private SwiftUI 상태와 구매 Button action을 직접 실행하는 영구 unit/UI test를 이번 Task에서 추가할 수 없다.
    • 대체 검증 방법:
      • 이미지 유무·가격·구매 여부 조합 fixture를 Preview 또는 수동 화면으로 확인하고 callback 정적 검색과 앱 빌드를 실행한다.
    • 작업 내용:
      • 이미지 없는 레이아웃은 유지하면서 유료 미구매 상태에 구매 affordance를 제공한다.
      • 기존 purchaseCommunityPost callback과 loading·오류 흐름을 재사용한다.
      • 무료 및 구매 완료 게시물의 카드 탭·반응 UI는 변경하지 않는다.
    • 검증 기준:
      • 수동 확인: imageUrl == nil, price > 0, existOrdered == false fixture에서 구매 진입이 노출되고 한 번의 사용자 확인으로 기존 구매 callback이 1회 실행되어야 한다.
      • 수동 확인: 이미지가 있는 유료 미구매, 무료, 구매 완료 상태는 기존 표시와 동작을 유지해야 한다.
      • 실행 명령: rg "hasImage|isLocked|paidLockOverlay|purchaseCommunityPost|onTapPurchase" SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 이미지 유무와 무관하게 유료 미구매 상태가 기존 구매 경로에 연결되어야 한다.

Phase 16: 사업자 정보 섹션 UI

  • Task 16.1: 사업자 정보 더보기/접기 섹션 작성/보완

    • 대상 파일:
      • 생성/보완: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBusinessInfoSection.swift
      • 확인/보완: SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift
    • 작업 내용:
      • 추천 탭 UI 마지막에 사업자 정보 섹션을 배치한다.
      • 섹션 width는 화면에 채운다.
      • 기본 3줄 말줄임표와 더보기를 표시한다.
      • 더보기 터치 시 전체 표시와 접기를 제공한다.
      • 외부 라이브러리를 사용하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeBusinessInfoSection|BusinessInfoExpandableTextView|ExpandableTextView|lineLimit|더보기|접기" SodaLive/Sources/V2
      • 기대 결과: 사업자 정보 섹션과 확장 텍스트 구현이 확인된다.
  • Task 16.2: 사업자 정보 확장 텍스트 구현 단일화

    • Goal 실행 P16-R1: REV-P16-001을 수정해 사업자 정보 wrapper가 빌드 대상의 공용 V2 확장 텍스트 하나만 사용하게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase16-business-info-section.md
      • 확정 항목: REV-P16-001
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBusinessInfoSection.swift
      • 수정/이름 정리: SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift
      • 확인/보완: SodaLive.xcodeproj/project.pbxproj
      • 확인: SodaLive/Sources/CustomView/ExpandableTextView.swift
    • TDD 예외 사유:
      • 동작을 추가하지 않고 중복 View와 Xcode target 포함 상태를 정리하는 회귀 문서/구조 Task다.
    • 대체 검증 방법:
      • 타입 정의·소비처·PBX Sources 포함 개수를 대조하고 3줄 이하/초과 텍스트 수동 확인과 앱 빌드를 실행한다.
    • 작업 내용:
      • 현재 V2 공용 파일이 Sources에 포함되지 않고 화면 파일에 같은 측정 구현이 복제된 상태를 확인한다.
      • 기존 CustomView/ExpandableTextView 소비처를 변경하지 않으면서 타입명 충돌을 피하고, 공용 V2 구현과 사업자 wrapper를 단일 연결한다.
      • 이번 변경으로 생긴 미사용 private 구현과 프로젝트 참조만 정리한다.
      • 타입 정의/소비처 검색, plutil -lint SodaLive.xcodeproj/project.pbxproj, git diff --check, SodaLive-dev Debug 빌드를 통과한다.
      • 3줄 이하/초과 더보기 조건은 공용 구현 연결, 타입 검색, 빌드로 확인하고, 실제 화면 수동 확인은 잔여 확인 사항으로 검증 기록에 남긴다.
  • Task 16.3: V2 확장 텍스트 Sources 중복 등록 제거

    • Goal 실행 P16-R2: REV-P16-002를 수정해 V2ExpandableTextView.swift가 각 앱 target의 Sources에 정확히 한 번만 포함되게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase16-business-info-section.md
      • 확정 항목: REV-P16-002
    • 대상 파일:
      • 수정: SodaLive.xcodeproj/project.pbxproj
    • TDD 예외 사유:
      • production 동작이 아니라 Xcode target의 Sources 메타데이터 중복을 정리하는 프로젝트 설정 Task다.
    • 대체 검증 방법:
      • PBX Sources phase별 포함 개수를 대조하고 프로젝트 유효성 검사와 두 앱 scheme 빌드를 실행한다.
    • 작업 내용:
      • SodaLive target에 중복 등록된 V2ExpandableTextView.swift in Sources 한 건만 제거한다.
      • SodaLive-dev target 등록과 다른 기존 Sources 항목은 변경하지 않는다.
    • 검증 기준:
      • 실행 명령: 앱 target별 Sources build phase에서 V2ExpandableTextView.swift in Sources 포함 개수를 확인한다.
      • 기대 결과: SodaLive, SodaLive-dev target에 각각 정확히 한 번 포함되어야 한다.
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug buildSodaLive-dev 동일 빌드
      • 기대 결과: 두 scheme 모두 BUILD SUCCEEDED이며 해당 파일의 중복 Sources 경고가 없어야 한다.

Phase 17: 섹션 조립 순서와 빈 섹션 처리

  • Task 17.1: MainHomeRecommendationView에 섹션 순서 반영
    • 대상 파일:
      • 확인/보완: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
    • 작업 내용:
      • 섹션 순서를 PRD와 2026-07-12 장르 크리에이터 섹션 미표시 결정에 맞춘다.
      • 현재 라이브, 배너, 최근 활동, 최근 데뷔, AI 캐릭터, 응원, 인기 커뮤니티, 사업자 정보 순서로 배치하고 장르 섹션은 조립하지 않는다.
      • 각 데이터 배열이 비어 있으면 섹션 제목과 컨테이너까지 숨긴다.
    • 검증 기준:
      • 실행 명령: rg "MainHomeLiveSection|MainHomeBannerSection|MainHomeActiveCreatorSection|MainHomeRecentDebutCreatorSection|MainHomeAiCharacterSection|MainHomeCheerCreatorSection|MainHomePopularCommunitySection|MainHomeBusinessInfoSection" SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 기대 결과: 활성 구현 대상 섹션이 올바른 순서로 조립되고 MainHomeGenreCreatorSection은 검색되지 않는다.

Phase 18: 최종 프로젝트 포함과 빌드 검증

  • Task 18.1: Xcode 프로젝트 포함 여부 확인

    • 대상 파일:
      • 확인/보완: SodaLive.xcodeproj/project.pbxproj
      • 확인: SodaLive/Sources/V2/Main/Home/**
      • 확인: SodaLive/Sources/V2/Component/**
    • 작업 내용:
      • 신규 Swift 파일이 빌드 대상에 포함되는지 확인한다.
      • 파일 시스템 동기화 방식으로 자동 포함되면 프로젝트 파일을 수정하지 않는다.
      • 프로젝트 파일 수정이 필요한 경우에만 최소 변경한다.
    • 검증 기준:
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
  • Task 18.2: 정적 점검과 빌드

    • 대상 파일:
      • 확인: SodaLive/Sources/V2/Main/Home/**
      • 확인: SodaLive/Sources/V2/Component/**
      • 확인: SodaLive/Sources/Home/**
    • 작업 내용:
      • 제외 섹션, 기존 홈 API 오염, Figma URL, 공백 오류를 확인한다.
      • 가능한 빌드 명령을 실행한다.
    • 검증 기준:
      • 실행 명령: rg "추천 필모그래피|또 다른 모습" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component
      • 기대 결과: 검색 결과가 없어야 한다.
      • 실행 명령: rg "api/v2/home/recommendations" SodaLive/Sources/Home
      • 기대 결과: 검색 결과가 없어야 한다.
      • 실행 명령: rg "localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component
      • 기대 결과: 검색 결과가 없어야 한다.
      • 실행 명령: git diff --check
      • 기대 결과: 출력 없이 성공한다.
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED
  • Task 18.3: 프로덕션 target의 홈 추천 Sources 중복 등록 제거

    • Goal 실행 P18-R1: REV-P18-001을 수정해 이번 계획 범위의 홈 추천 Swift 파일이 SodaLiveSodaLive-dev target에 각각 정확히 한 번만 포함되게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase18-final-project-build.md
      • 확정 항목: REV-P18-001
    • 대상 파일:
      • 수정: SodaLive.xcodeproj/project.pbxproj
    • TDD 예외 사유:
      • production 동작이 아니라 Xcode Compile Sources 메타데이터 중복을 정리하는 프로젝트 설정 Task다.
    • 대체 검증 방법:
      • 두 앱 target의 Sources phase별 file reference 포함 개수를 대조하고, 프로젝트 유효성 검사와 두 scheme 빌드 로그에서 대상 파일의 duplicate build warning이 사라졌는지 확인한다.
    • 작업 내용:
      • SodaLive Sources phase에 두 번 등록된 MainHomeView.swift, MainHomeRecommendationView.swift, MainHomeRecommendationViewModel.swift, MainHomeRankingView.swift, MainHomeFollowingView.swift, MainHomeLiveSection.swift, MainHomeBannerSection.swift, MainHomeActiveCreatorSection.swift, MainHomeRecentDebutCreatorSection.swift, MainHomeAiCharacterSection.swift, MainHomeBusinessInfoSection.swift의 중복 build file 한 건씩을 확인한다.
      • 각 파일의 프로덕션 중복 build file과 Sources phase 참조 한 건만 제거하고 SodaLive-dev 등록 및 다른 기존 중복 항목은 변경하지 않는다.
      • plutil -lint SodaLive.xcodeproj/project.pbxprojgit diff --check를 통과한다.
      • SodaLive, SodaLive-dev target에 위 11개 파일이 각각 1회 등록되어 있고 xcodebuild -workspace "SodaLive.xcworkspace" -list로 프로젝트 파싱이 성공하는지 확인한다.
      • 실제 등록 수와 검증 결과를 이 문서와 Phase 18 리뷰 리포트에 누적한다.
  • Task 18.4: 프로덕션 target에 남은 홈 추천 Sources 중복 등록 제거

    • Goal 실행 P18-R2: REV-P18-002를 수정해 Task 18.3 이후에도 두 번 남은 홈 추천 Swift 파일 11개의 프로덕션 Sources 등록을 각각 한 번으로 맞춘다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase18-final-project-build.md
      • 확정 항목: REV-P18-002
    • 대상 파일:
      • 수정: SodaLive.xcodeproj/project.pbxproj
    • TDD 예외 사유:
      • production 동작이 아니라 Xcode Compile Sources 메타데이터의 잔여 중복을 정리하는 프로젝트 설정 Task다.
    • 대체 검증 방법:
      • 두 앱 target의 Sources phase별 파일명 포함 수와 fresh DerivedData 빌드 경고를 수정 전후로 대조한다.
    • 작업 내용:
      • 현재 SodaLive Sources phase에서 MainHomeView.swift, MainHomeRecommendationView.swift, MainHomeRecommendationViewModel.swift, MainHomeRankingView.swift, MainHomeFollowingView.swift, MainHomeLiveSection.swift, MainHomeBannerSection.swift, MainHomeActiveCreatorSection.swift, MainHomeRecentDebutCreatorSection.swift, MainHomeAiCharacterSection.swift, MainHomeBusinessInfoSection.swift가 각각 2회이고 SodaLive-dev에서는 각각 1회인 실패 상태를 확인한다.
      • 각 파일의 프로덕션 잔여 중복 build file과 Sources phase 참조 한 건만 제거하고 SodaLive-dev 및 범위 밖 파일은 변경하지 않는다.
      • plutil -lint SodaLive.xcodeproj/project.pbxprojgit diff --check를 통과한다.
      • 두 target에서 대상 11개 파일이 각각 정확히 1회인지 대조하고 fresh DerivedData의 SodaLive, SodaLive-dev Debug 빌드를 실행한다.
      • 두 빌드 로그에서 대상 11개 파일의 Skipping duplicate build file 경고가 없는지 확인하고 실제 결과를 이 문서와 Phase 18 리뷰 리포트에 누적한다.

Phase 19: 문서와 검증 기록 갱신

  • Task 19.1: PRD/계획 문서 갱신

    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • 작업 내용:
      • 구현 중 확정된 배너 이동 규칙, 표시 개수, 커뮤니티 audioUrl 표시 여부가 있으면 PRD를 먼저 갱신한다.
      • 완료한 task 체크박스를 실제 상태에 맞게 갱신한다.
      • 실행한 검증 명령과 결과를 이 문서 하단 검증 기록에 누적한다.
    • 검증 기준:
      • 실행 명령: rg "### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 기대 결과: phase heading과 Task N.N 형식 체크박스가 검색된다.
  • Task 19.2: 장르 크리에이터 미표시 기준 문서 정합성 보정

    • Goal 실행 P19-R1: REV-P19-001을 수정해 2026-07-12 장르 섹션 미표시 결정과 PRD·Phase 17 활성 기준을 일치시킨다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase19-documentation-records.md
      • 확정 항목: REV-P19-001
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 문서 정정 Task다.
    • 대체 검증 방법:
      • 현재 코드 조립 순서, PRD 화면 트리, Phase 17 기준과 2026-07-12 결정의 대조표 및 정적 검색으로 확인한다.
    • 작업 내용:
      • PRD의 활성 화면 구성과 Phase 17 작업/기대 결과에서 장르 섹션 노출 요구가 남은 위치를 확인한다.
      • genreCreators 응답 모델 유지와 MainHomeGenreCreatorSection 미표시를 구분해 PRD와 활성 검증 기준을 정정한다.
      • 기존 Phase 13 구현 기록과 2026-06-30 검증 기록은 삭제하지 않고 후속 정정 기록을 누적한다.
      • rg "장르의 크리에이터|MainHomeGenreCreatorSection|genreCreators" docs/20260602_메인_홈_추천_UI_API_연동 SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swiftgit diff --check 결과를 검증 기록에 남긴다.
  • Task 19.3: 활성 문서 코드 블록과 V2 컴포넌트 경로 정합성 보정

    • Goal 실행 P19-R2: REV-P19-002, REV-P19-003을 수정해 PRD Markdown 구조와 최신 V2 확장 텍스트 경로를 현재 구현에 맞춘다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase19-documentation-records.md
      • 확정 항목: REV-P19-002, REV-P19-003
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 Markdown 구조와 활성 파일 경로 정정 Task다.
    • 대체 검증 방법:
      • Markdown fence 쌍과 활성 경로의 실제 파일 존재 여부를 정적 검사한다.
    • 작업 내용:
      • PRD 응답 모델 예시의 누락·중첩된 코드 fence를 각 모델 단위로 닫아 이후 본문이 코드 블록으로 렌더링되지 않게 한다.
      • PRD와 계획 상단의 활성 공용 컴포넌트 이름·경로를 V2ExpandableTextView.swift로 정정한다.
      • 과거 Task와 검증 기록의 당시 경로는 이력으로 보존한다.
    • 검증 기준:
      • 실행 명령: PRD의 각 응답 모델 예시가 독립된 Markdown fence 여닫힘 쌍을 가지며 각 모델 heading과 설명이 코드 블록 밖에 있는지 확인한다.
      • 실행 명령: rg "V2/Component/Text/(ExpandableTextView|V2ExpandableTextView)\.swift" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 기대 결과: 활성 기준은 존재하는 V2ExpandableTextView.swift를 가리키고 과거 경로는 검증 이력에만 남아야 한다.
  • Task 19.4: 활성 API 타입명과 리뷰 정정 기록 보완

    • Goal 실행 P19-R3: REV-P19-004를 수정해 PRD의 추천 API 타입명과 Phase 11/21 후속 리뷰 기록을 현재 구현과 일치시킨다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase19-documentation-records.md
      • 확정 항목: REV-P19-004
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase21-recent-activity-live-fallback.md
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 활성 문서 타입명과 append-only 리뷰 기록 정정 Task다.
    • 대체 검증 방법:
      • 실제 Swift 타입, Phase 11 카드 구현, Phase 21 destination 분기와 문서 문장을 정적 대조한다.
    • 작업 내용:
      • PRD Goal의 MainHomeApi를 실제 활성 타입 MainHomeRecommendationApi로 정정한다.
      • Phase 11의 CreatorProfileGrid 재사용 확인 문구를 실제 전용 직사각형 카드 사용 판정과 일치하도록 후속 정정한다.
      • Phase 21의 LIVE_REPLAY가 라이브/creator fallback을 사용한다는 문구를 targetId 기반 콘텐츠 상세 이동 및 fallback 없음으로 후속 정정한다.
      • 기존 리뷰 기록은 삭제하지 않고 정정 기록을 누적하며, rggit diff --check 결과를 검증 기록에 남긴다.
  • Task 19.5: 최근 데뷔 섹션의 활성 계획 기준을 실제 전용 카드 구현과 맞춤

    • Goal 실행 P19-R4: REV-P19-005를 수정해 Phase 11의 완료 기준이 현재 MainHomeRecentDebutCreatorItemView 사용 판정과 모순되지 않게 한다.
    • 시작 조건:
      • 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase19-documentation-records.md
      • 관련 Phase 리뷰: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md
      • 확정 항목: REV-P19-005
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 활성 계획·리뷰 정합성 보정 Task다.
    • 대체 검증 방법:
      • Phase 11 Task의 작업·기대 결과, 현재 전용 직사각형 카드 코드와 Phase 11 최신 리뷰 결론을 줄 단위로 대조한다.
    • 작업 내용:
      • Task 11.1이 공용 원형 CreatorProfileGrid 재사용을 완료 조건으로 요구하지만 현재 코드와 최신 리뷰는 전용 직사각형 카드를 올바른 구현으로 판정하는 충돌을 확인한다.
      • 공용 컴포넌트 우선 원칙은 유지하되 Figma 카드 형태를 충족하지 못할 때 페이지 전용 MainHomeRecentDebutCreatorItemView를 사용하는 현재 결정을 활성 Task와 기대 결과에 명시한다.
      • 기존 Phase 11 완료 기록과 리뷰 정정 이력은 삭제하지 않고 후속 정정만 누적한다.
      • rg "CreatorProfileGrid|MainHomeRecentDebutCreatorItemView" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeRecentDebutCreatorSection.swiftgit diff --check 결과를 검증 기록에 남긴다.

Phase 20: 추천 커뮤니티 게시물 상세 진입 보정

  • Task 20.1: PRD/계획 문서에 커뮤니티 게시물 상세 이동 요구사항 추가

    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • 작업 내용:
      • 최근 활동 크리에이터의 activityType == COMMUNITY 탭 액션을 커뮤니티 게시물 상세 이동으로 명시한다.
      • 인기 커뮤니티 섹션의 게시물 탭 액션을 커뮤니티 게시물 상세 이동으로 명시한다.
      • targetId는 최근 활동 COMMUNITY일 때 커뮤니티 게시물 postId로 취급한다.
    • 검증 기준:
      • 실행 명령: rg "activityType == COMMUNITY|커뮤니티 게시물 상세|targetId.*postId|인기 커뮤니티" docs/20260602_메인_홈_추천_UI_API_연동
      • 기대 결과: PRD와 계획 문서에서 이번 상세 이동 요구사항이 검색된다.
  • Task 20.2: 추천 탭 커뮤니티 게시물 상세 라우팅 연결

    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
      • 수정: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift
      • 수정: SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
    • 작업 내용:
      • 추천 탭 커뮤니티 callback을 postId 기준으로 명확히 연결한다.
      • 최근 활동 크리에이터의 COMMUNITY 타입은 targetIdpostId로 전달한다.
      • 인기 커뮤니티 카드 일반 탭과 댓글 아이콘 탭은 postId로 커뮤니티 게시물 상세에 진입한다.
      • 좋아요, 구매, 오디오 재생 액션은 기존 동작을 유지한다.
      • 팔로잉 탭 스케줄의 기존 .community 라우팅은 이번 추천 탭 범위 밖이므로 변경하지 않는다.
    • 검증 기준:
      • 실행 명령: rg "onTapCommunityPost|handleRecommendationCommunityPostTap|creatorChannelCommunityPostDetail|onTapPost|onTapComment|handleFollowingScheduleTap" SodaLive/Sources/V2/Main SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
      • 기대 결과: 추천 탭 커뮤니티 액션은 postId 기반 상세 이동을 사용하고, 팔로잉 스케줄 community 라우팅은 기존 분기를 유지한다.
  • Task 20.3: 정적 검증과 빌드 검증

    • 대상 파일:
      • 확인: SodaLive/Sources/V2/Main/**
      • 확인: SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift
      • 확인: SodaLive.xcodeproj/project.pbxproj
    • 작업 내용:
      • 변경 파일의 공백 오류와 프로젝트 파일 유효성을 확인한다.
      • 가능한 빌드를 실행한다.
      • 실행 결과를 검증 기록에 누적한다.
    • 검증 기준:
      • 실행 명령: git diff --check
      • 기대 결과: 출력 없이 성공한다.
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED

Phase 21: 최근 활동 LIVE 이동 fallback 보정

Phase 결과: 최근 활동 크리에이터의 서버 원본 activityType == LIVE 아이템은 targetId 유무에 따라 라이브룸 또는 크리에이터 채널로 이동한다. LIVE_REPLAY는 표시 문구를 기존 라이브로 유지하되, AUDIO와 동일하게 콘텐츠 상세 페이지로 이동한다.

선행조건: 서버가 HomeActiveCreatorItem.creatorId를 항상 유효한 양수의 non-null Long 값으로 제공한다.

  • Task 21.1: PRD/계획 문서에 LIVE 이동 fallback 요구사항 추가

    • Goal: 인터뷰에서 확정한 응답 필드, 이동 분기, 양수 검사, 회귀 제외 범위를 구현 기준으로 고정한다.
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • 작업 내용:
      • HomeActiveCreatorItem 응답에 non-null creatorId가 추가됨을 명시한다.
      • 서버 원본 activityType == LIVE에서 targetId != null이면 라이브룸, targetId == null이면 creatorId 기반 크리에이터 채널로 이동하도록 명시한다.
      • 서버가 creatorId를 유효한 양수로 보장하더라도 앱에서 creatorId > 0을 검사하도록 명시한다.
      • LIVE_REPLAY에는 LIVE의 새 fallback을 적용하지 않고, AUDIO와 동일하게 targetId 기반 콘텐츠 상세 페이지로 이동하도록 명시한다.
      • AUDIO, COMMUNITY, 알 수 없는 타입의 기존 동작은 변경하지 않도록 명시한다.
    • 완료 증거:
      • PRD 응답 스키마, 상세 진입 규칙, 성공 기준, 검증 계획과 이 Phase의 구현 Task가 같은 요구사항을 사용한다.
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 문서 갱신 Task다.
    • 검증 기준:
      • 실행 명령: rg "creatorId: Long|activityType == LIVE|targetId == null|creatorId > 0|LIVE_REPLAY" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 기대 결과: 응답 필드, 분기 조건, 양수 검사, LIVE_REPLAY 제외 규칙이 두 문서에서 검색된다.
  • Task 21.2: 최근 활동 응답 모델과 활동 타입 구분 보정

    • Goal: creatorId를 필수 값으로 디코딩하고 LIVELIVE_REPLAY를 이동 분기에서 구분할 수 있게 한다.
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
    • 작업 내용:
      • HomeActiveCreatorItem에 non-optional creatorId: Int를 추가한다.
      • RecommendedActivityType에서 LIVELIVE_REPLAY를 별도 case로 디코딩하되 두 case의 표시 문구는 기존 라이브 문구를 유지한다.
      • Preview의 HomeActiveCreatorItem 생성부에 creatorId를 추가한다.
    • 완료 증거:
      • 모델과 Preview가 신규 필드를 사용하고, LIVELIVE_REPLAY의 표시 문구는 같지만 enum case는 구분된다.
    • 검증 기준:
      • 실행 명령: rg "creatorId|case liveReplay|LIVE_REPLAY|HomeActiveCreatorItem\\(" SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 신규 필드와 구분된 활동 타입, 갱신된 Preview 생성부가 검색된다.
  • Task 21.3: LIVE 분기와 LIVE_REPLAY 콘텐츠 이동 연결 및 회귀 검증

    • Goal: 최근 활동 LIVE 아이템의 두 이동 경로와 LIVE_REPLAY의 콘텐츠 상세 이동을 기존 추천 상세 진입 callback에 연결한다.
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 수정: SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift
      • 확인: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 확인: SodaLive/Sources/V2/Main/MainView.swift
      • 확인: SodaLive.xcodeproj/project.pbxproj
    • 작업 내용:
      • MainHomeActiveCreatorSection에 기존 onTapCreator callback을 전달한다.
      • 서버 원본 LIVE에서 targetId가 있으면 onTapLive(targetId), 없으면 creatorId > 0 검사 후 onTapCreator(creatorId)를 실행한다.
      • LIVE_REPLAYAUDIO와 동일하게 targetId가 있을 때 onTapContent(targetId)를 실행하고, 없으면 아무 동작도 하지 않는다.
      • AUDIO, COMMUNITY, 알 수 없는 타입의 기존 동작을 유지한다.
      • 라이브룸과 크리에이터 채널 이동은 MainView의 기존 추천 상세 진입 guard를 재사용한다.
    • 완료 증거:
      • LIVE의 두 분기, creatorId 양수 검사, LIVE_REPLAY의 콘텐츠 상세 이동이 코드에 존재하고, 정적 검증과 SodaLive-dev 빌드가 성공한다.
    • 검증 기준:
      • 실행 명령: rg "onTapCreator|creatorId > 0|targetId|liveReplay|onTapLive|onTapContent|onTapCommunityPost" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: LIVE의 두 이동 경로, LIVE_REPLAYonTapContent 연결, 다른 활동 타입의 기존 callback이 검색된다.
      • 실행 명령: git diff --check
      • 기대 결과: 출력 없이 성공한다.
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED
    • 수동 확인:
      • LIVE + targetId != nil 아이템을 터치하면 라이브룸으로 이동한다.
      • LIVE + targetId == nil + creatorId > 0 아이템을 터치하면 크리에이터 채널로 이동한다.
      • LIVE_REPLAY + targetId != nil 아이템을 터치하면 콘텐츠 상세 페이지로 이동한다.
      • LIVE_REPLAY + targetId == nil 아이템은 이동하지 않는다.
      • AUDIO, COMMUNITY, 알 수 없는 타입은 기존 동작을 유지한다.
  • Task 21.4: LIVE_REPLAY 이동 요구사항 문서 정정

    • Goal: 잘못 기록된 LIVE_REPLAY 라이브룸 이동 기준을 AUDIO와 동일한 콘텐츠 상세 이동 기준으로 정정한다.
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • 작업 내용:
      • PRD의 상세 진입 규칙, 성공 기준, Open Questions, 검증 계획을 정정한다.
      • Phase 21 결과와 미완료 구현 Task에서 LIVE_REPLAYonTapContent(targetId)에 연결하도록 정정한다.
      • LIVE_REPLAY의 표시 문구는 기존과 같이 I18n.HomeRecommendation.activityLive를 유지하도록 명시한다.
      • 기존 검증 기록은 삭제하지 않고 후속 정정 기록을 추가한다.
    • 완료 증거:
      • 활성 요구사항과 미완료 구현 Task에서 LIVE_REPLAY의 라이브룸 이동 표현이 없고 콘텐츠 상세 이동 규칙이 일치한다.
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 문서 정정 Task다.
    • 검증 기준:
      • 실행 명령: rg "LIVE_REPLAY.*(라이브룸|콘텐츠 상세)|onTapContent\\(targetId\\)" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 기대 결과: 활성 요구사항과 미완료 구현 Task에는 LIVE_REPLAY의 콘텐츠 상세 이동만 명시되고, 과거 오류는 정정 기록에서만 설명된다.

Phase 22: 모두 팔로우 확인 Dialog

Phase 결과: 로그인 사용자는 메인 홈 추천 탭의 모든 모두 팔로우하기 진입점에서 Confirm Dialog를 확인한 뒤에만 여러 크리에이터를 팔로우하며, 취소 시 API 요청이 발생하지 않는다.

선행조건: MainHomeView에서 전달된 모든 추천 탭 모두 팔로우 action이 MainView.handleRecommendationFollowAllTap 공통 진입점을 사용한다.

Phase 완료 조건: Task 22.1~22.3을 완료하고 확인 전·취소·dimmed 영역 터치 API 0회, 확인 시 API 1회, 비로그인 기존 로그인 흐름 유지와 ko/en/ja 문구를 검증 기록에 누적한다.

  • Task 22.1: 인터뷰 결정사항을 PRD와 계획 문서에 반영

    • Goal: 모두 팔로우 확인 Dialog의 적용 범위, 인증 순서, 문구, 취소 동작과 완료 기준을 추정 없이 구현할 수 있게 고정한다.
    • 대상 파일:
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/prd.md
      • 수정: docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
    • 작업 내용:
      • 메인 홈 추천 탭의 모든 공통 모두 팔로우하기 진입점에 적용한다.
      • 비로그인 사용자는 기존처럼 로그인 화면으로 바로 이동하고, 로그인 후 자동 팔로우하지 않는다.
      • 로그인 사용자는 Confirm Dialog의 팔로우 하기를 선택한 경우에만 기존 API를 호출한다.
      • 취소와 dimmed 영역 터치는 보류 action을 폐기하고 API를 호출하지 않는다.
      • Dialog 제목, 설명, 확인 문구를 ko/en/ja로 확정하고 취소는 I18n.Common.cancel을 재사용한다.
      • 현재 미노출 상태인 장르 크리에이터 섹션을 다시 표시하는 작업은 제외한다.
    • 완료 증거:
      • PRD 7.6, Success Criteria, Verification Plan, Decision Log와 Phase 22가 동일한 흐름과 문구를 사용한다.
    • TDD 예외 사유:
      • production 동작을 변경하지 않는 문서 갱신 Task다.
    • 검증 기준:
      • 실행 명령: rg "모두 팔로우 확인 Dialog|모두 팔로우할까요|Follow all creators|すべてのクリエイターをフォローしますか|dimmed|자동 팔로우" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md
      • 기대 결과: 적용 범위, 인증 순서, 취소 동작과 ko/en/ja 문구가 두 문서에서 검색된다.
  • Task 22.2: 공통 모두 팔로우 Confirm Dialog와 I18n 구현

    • Goal: 기존 공통 모두 팔로우 callback에 최소 상태만 추가해 로그인 사용자의 명시적 확인 후에만 보류한 action을 실행한다.
    • 대상 파일:
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
      • 수정: SodaLive/Sources/I18n/I18n.swift
      • 확인: SodaLive/Sources/V2/Main/Home/MainHomeView.swift
      • 확인: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
      • 확인: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift
      • 확인: SodaLive/Sources/V2/Component/Modal/SodaV2ActionModal.swift
    • 작업 내용:
      • handleRecommendationFollowAllTap에서 기존 로그인 guard를 먼저 통과한 사용자에게만 SodaV2ActionModal을 표시한다.
      • 보류한 모두 팔로우 action은 Dialog 확인 시 한 번 실행하고, 확인·취소·dimmed 영역 처리 후에는 즉시 비운다.
      • Dialog 제목, 설명, 확인 문구는 I18n.HomeRecommendation의 ko/en/ja 값을 사용하고 취소는 I18n.Common.cancel을 재사용한다.
      • 기존 followAll(creatorIds:completionKey:)의 완료, loading, 오류 toast와 중복 호출 방지 로직은 변경하지 않는다.
      • MainHomeView와 섹션별 View의 callback 계층은 공통 진입점을 우회하지 않는 한 변경하지 않는다.
    • 완료 증거:
      • 공통 callback과 기존 SodaV2ActionModal 재사용만으로 확인 흐름이 연결되고, API/Repository/Request 계약 변경이 없다.
    • TDD 예외 사유:
      • 저장소에 테스트 번들 타깃이 없고 SwiftUI Dialog와 실제 네트워크 요청의 통합 흐름을 위한 신규 테스트 인프라 추가는 이번 최소 변경 범위를 벗어난다.
    • 대체 검증 방법:
      • 상태/action/I18n 연결 정적 검색, SodaLive-dev 빌드, 로그인/비로그인 수동 흐름과 네트워크 요청 횟수 확인으로 검증한다.
    • 검증 기준:
      • 실행 명령: rg "handleRecommendationFollowAllTap|SodaV2ActionModal|pending.*FollowAll|followAll.*Confirm|I18n.HomeRecommendation|I18n.Common.cancel" SodaLive/Sources/V2/Main/MainView.swift SodaLive/Sources/I18n/I18n.swift
      • 기대 결과: 로그인 guard 뒤의 Dialog 표시, 보류 action, 확인/취소 처리와 다국어 키가 검색된다.
      • 실행 명령: rg "followRecommendedCreators|FollowRecommendedCreatorsRequest" SodaLive/Sources/V2/Main/Home/Recommendation
      • 기대 결과: 기존 모두 팔로우 API와 request 경로가 유지된다.
  • Task 22.3: 모두 팔로우 확인 흐름 Phase Gate

    • Goal: Confirm Dialog가 의도하지 않은 대량 팔로우를 차단하면서 기존 인증·완료·loading·오류 흐름을 유지하는지 최종 판정한다.
    • 대상 파일:
      • 확인: SodaLive/Sources/V2/Main/MainView.swift
      • 확인: SodaLive/Sources/V2/Main/Home/**
      • 확인: SodaLive/Sources/I18n/I18n.swift
      • 확인: SodaLive.xcodeproj/project.pbxproj
    • 완료 증거:
      • 정적 검증, 프로젝트 유효성, SodaLive-dev 빌드와 아래 수동 확인 결과가 검증 기록에 누적된다.
    • 검증 기준:
      • 실행 명령: git diff --check
      • 기대 결과: 출력 없이 성공한다.
      • 실행 명령: plutil -lint SodaLive.xcodeproj/project.pbxproj
      • 기대 결과: OK
      • 실행 명령: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
      • 기대 결과: BUILD SUCCEEDED
    • 수동 확인:
      • 로그인 사용자가 모두 팔로우하기를 터치하면 Dialog가 표시되고 API 요청은 0회다.
      • 취소 또는 dimmed 영역을 터치하면 Dialog가 닫히고 API 요청은 0회다.
      • 팔로우 하기를 한 번 터치하면 Dialog가 닫히고 해당 섹션의 기존 API 요청이 1회 발생한다.
      • 비로그인 사용자가 버튼을 터치하면 Dialog 없이 로그인 화면으로 이동하고, 로그인 완료 후 자동 팔로우하지 않는다.
      • 기존 완료/호출 중 버튼 상태와 API 실패 toast가 유지된다.
      • 앱 언어 ko/en/ja에서 제목, 설명, 확인, 취소 문구가 각각 표시된다.

검증 기록

2026-07-31 Task 5.4 독립 수정 확인

  • 코드 확인:
    • LiveNowAllView는 인증 성공 후 handleLiveNowItemTap(roomId:isAdult:)를 재호출해 민감 콘텐츠 설정 guard를 다시 통과함
    • CreatorChannelView는 인증 성공 후 handleTalkTap()을 재호출해 민감 콘텐츠 설정 guard를 다시 통과함
  • 검증:
    • 인증·설정 4개 조합과 인증 미완료 상태 self-check — task-5.4-independent-self-check=passed
    • git diff --check, git diff --cached --check — 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • SodaLive-dev, SodaLive Debug generic/platform=iOS 빌드 — 모두 종료 코드 0
  • 추가 점검:
    • auth == falseisAdultContentVisible을 함께 사용하는 Swift 화면을 재검색하고 현재 ContentView에서 도달 가능한 MainView, LiveNowAllView, CreatorChannelView의 guard 재진입을 확인
    • 활성 앱 라우팅 범위에서 신규 확정 발견 사항 없음
    • 비활성 레거시 HomeView, HomeTabView, ChatTabView는 기존 범위 제외 상태 유지
  • 범위:
    • 이번 점검에서는 production Swift 코드를 추가 수정하지 않음

2026-07-31 리뷰 보완 Task 5.4 처리

  • 목적: REV-P5-003 보완
  • 수행 내용:
    • LiveNowAllView.handleLiveNowItemTap의 인증 후 pendingActionopenLiveDetail(roomId:) 직접 실행에서 handleLiveNowItemTap(roomId:isAdult:) 재호출로 변경
    • CreatorChannelView.handleTalkTap의 인증 후 pendingActionstartChat(characterId:) 직접 실행에서 handleTalkTap() 재호출로 변경
    • 공용 guard 계층을 새로 만들지 않고 기존 로그인·국가·본인인증·민감 콘텐츠 설정 분기와 route를 유지
  • TDD 예외/대체 검증:
    • 앱 테스트 번들 타깃이 없어 Bootpay 본인인증 callback과 전역 route를 직접 실행하는 영구 통합 test는 추가하지 않음
    • Swift 상태 전이 self-check, 정적 검색, 공백 오류, 프로젝트 유효성, 두 scheme Debug 빌드로 대체 검증
  • 검증:
    • swift -e '<기존 LiveNowAllView/CreatorChannelView pendingAction 상태 전이 self-check>' 실행, 기존 방식은 RED live old path bypassed settings: route=true settings=false로 실패 재현
    • swift -e '<수정 후 LiveNowAllView/CreatorChannelView pendingAction 상태 전이 self-check>' 실행, task-5.4-guard-self-check=passed 확인
    • rg -n "pendingAction = \\{|handleLiveNowItemTap\\(roomId: roomId, isAdult: isAdult\\)|handleTalkTap\\(\\)|openLiveDetail\\(roomId: roomId\\)|startChat\\(characterId: characterId\\)|contentViewSettings|isAdultContentVisible" "SodaLive/Sources/Live/Now/All/LiveNowAllView.swift" "SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift" 실행, 인증 후 guard 재진입과 기존 최종 route 유지 확인
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • rg -n -- "- \\[ \\]" "docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md" 실행, 미완료 Task 검색 결과 없음
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask54Dev" build 최초 병렬 실행은 10분 제한으로 BUILD INTERRUPTED, 동일 DerivedData 재시도는 BUILD SUCCEEDED
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask54Prod" build 최초 병렬 실행은 10분 제한으로 BUILD INTERRUPTED, 동일 DerivedData 재시도는 BUILD SUCCEEDED
  • 잔여 확인:
    • 실제 기기/시뮬레이터의 Bootpay 본인인증 완료 수동 확인은 이번 환경에서 수행하지 못해 상태 전이 self-check와 앱 빌드로 대체함
    • SodaLive 빌드의 범위 밖 V2 파일 duplicate Sources warning은 기존 상태로 남아 있으며 이번 Task에서 변경하지 않음

2026-07-31 Task 5.3/9.5 수정 확인 및 활성 guard 추가 점검

  • 수정 확인:
    • MainView.performRecommendationDetailAction(requiresAdultContent: true)는 인증 성공 후 동일 guard를 재진입해 민감 콘텐츠 설정 비활성 시 설정 화면으로 이동하고 상세 route를 실행하지 않음
    • BannerCarousel.wrapIfNeeded()는 예약 당시 displayIndexitemsRevision이 모두 유지된 경우에만 지연 reset을 실행해 반대 방향 이동과 같은 개수의 데이터 교체를 덮어쓰지 않음
  • self-check:
    • 인증 전후 4개 상태 조합과 인증 미완료 상태 — auth-guard-self-check=passed
    • 첫·마지막 복제 경계, 반대 방향 이동, 같은 개수 데이터 교체, 반복 같은 방향 입력 — banner-reset-self-check=passed
  • 정적·빌드 검증:
    • git diff --check, git diff --cached --check — 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • SodaLive-dev, SodaLive Debug generic/platform=iOS 빌드 — 모두 종료 코드 0
  • 추가 확정 항목:
    • REV-P5-003 High — 현재 ContentView에서 실제 라우팅되는 LiveNowAllView의 성인 라이브와 CreatorChannelView의 AI 대화가 인증 성공 시 최종 route를 직접 실행해 민감 콘텐츠 보기 설정을 우회함
    • Phase 5 Task 5.4 / P5-R3 신규 추가
  • 범위:
    • 현재 앱 route에서 사용되지 않는 레거시 HomeView, HomeTabView, ChatTabView의 동일 패턴은 이번 Task 대상에서 제외
    • 이번 점검에서는 production Swift 코드를 추가 수정하지 않음

2026-07-31 리뷰 보완 Task 5.3/9.5 처리

  • 목적: REV-P5-002, REV-P9-001 잔여 보완
  • 수행 내용:
    • MainView.performRecommendationDetailAction(requiresAdultContent: true)에서 본인인증 필요 시 최종 상세 route가 아니라 동일 guard를 재진입하는 closure를 pendingAction에 저장하도록 수정
    • BannerCarousel.wrapIfNeeded()의 지연 reset이 예약 당시 displayIndexitemsRevision이 유지된 경우에만 실행되도록 보정
  • TDD 예외/대체 검증:
    • 앱 테스트 번들 타깃이 없어 Bootpay callback과 SwiftUI gesture/timer의 영구 unit/UI test는 추가하지 않음
    • Swift 상태 전이 self-check, 정적 검색, 공백 오류, 프로젝트 유효성, SodaLive-dev Debug 빌드로 대체 검증
  • 검증:
    • swift -e '<기존 본인인증 후 pendingAction 상태 전이 self-check>' 실행, 기존 방식은 detail=true settings=false로 RED 실패 재현
    • swift -e '<수정 후 본인인증 후 pendingAction 상태 전이 self-check>' 실행, settings=false는 설정 이동·상세 미실행, settings=true는 상세 실행 통과 확인
    • swift -e '<기존 배너 예약 reset 상태 전이 self-check>' 실행, 반대 방향 이동 후 예약 reset이 31로 덮어쓰는 RED 실패 재현
    • swift -e '<수정 후 배너 예약 reset 상태 전이 self-check>' 실행, 반대 방향 이동과 같은 개수의 items 변경은 덮어쓰지 않고 같은 경계는 정상 reset되는 것 확인
    • rg -n "pendingAction = \{|performRecommendationDetailAction\(requiresAdultContent: true, action: action\)|itemsRevision|scheduledIndex|scheduledRevision" SodaLive/Sources/V2/Main/MainView.swift SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift 실행, guard 재진입과 조건부 reset 확인
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask5395Dev" build 실행, 10분 도구 제한으로 asset/codesign 단계에서 BUILD INTERRUPTED
    • 동일 DerivedData xcodebuild -quiet ... generic/platform=iOS ... 재시도와 CODE_SIGNING_ALLOWED=NO 재시도도 10분 도구 제한으로 BUILD INTERRUPTED
    • xcodebuild -quiet ... -destination "generic/platform=iOS Simulator" ... CODE_SIGNING_ALLOWED=NO build 실행, SPM Promises 컴파일 중 비정상 종료되어 BUILD FAILED
    • /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLive-sim-build-20260731-200318.log에서 BUILD INTERRUPTED 확인
  • 수동 확인:
    • 실제 기기/시뮬레이터의 Bootpay 본인인증 완료와 빠른 경계 연속 스와이프 시각 확인은 이번 환경에서 직접 수행하지 못해 상태 전이 self-check와 정적 검증으로 대체함
  • 차단:
    • SodaLive-dev Debug 빌드 성공 증거는 확보하지 못함. iPhoneOS 빌드는 10분 도구 제한으로 반복 중단됐고, Simulator 빌드는 SPM Promises 컴파일 단계에서 실패함.

2026-07-31 Phase 1~22 리뷰 재점검 및 후속 Task 전환

  • 목적: 현재 working tree의 Phase별 리뷰 판정과 실제 production 코드·활성 계획을 다시 대조하고, 남은 확정 결함을 이어서 실행 가능한 Task로 전환
  • Phase별 결과:
    • Phase 14, 68, 10~22: 기존 Phase별 최신 판정을 유지하며 이번 재점검에서 신규 확정 항목 없음
    • Phase 5: REV-P5-002 High 확정 — 한국 사용자에게 본인인증이 먼저 필요한 경우 인증 성공 후 민감 콘텐츠 보기 설정 guard를 건너뛰고 AI 캐릭터 상세 route를 직접 실행함
    • Phase 9: 기존 REV-P9-001의 index 범위 정규화만으로는 예약된 경계 reset이 반대 방향 이동 후 정상 index를 덮어쓰는 상태를 막지 못해 수정 미완료로 재판정
  • 계획 전환:
    • Phase 5 Task 5.3 / P5-R2 신규 추가
    • Phase 9는 동일 경계 상태를 소유하는 기존 미완료 Task 9.5 / P9-R1의 재현·완료 조건을 보강하고 중복 Task는 추가하지 않음
  • 재현:
    • swift -module-cache-path /private/tmp/sodalive-review-module-cache-auth -e '<본인인증 후 pendingAction 상태 전이>'detail=true settings=false, 설정 guard 우회 재현
    • swift -module-cache-path /private/tmp/sodalive-review-module-cache-banner -e '<배너 경계 지연 reset 상태 전이>' — 반대 방향 이동 후 beforeDelayedReset=3, 예약 reset 뒤 afterDelayedReset=1, expected=3 재현
  • 검증:
    • xcodebuild -workspace SodaLive.xcworkspace -list — workspace와 SodaLive, SodaLive-dev 스킴 인식 확인
    • xcodebuild -quiet -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination generic/platform=iOS -derivedDataPath /private/tmp/SodaLiveDerivedDataReviewFinal-dev build — 종료 코드 0
    • xcodebuild -quiet -workspace SodaLive.xcworkspace -scheme SodaLive -configuration Debug -destination generic/platform=iOS -derivedDataPath /private/tmp/SodaLiveDerivedDataReviewFinal-dev build — 종료 코드 0
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • git diff --check, git diff --cached --check — 출력 없이 성공
    • Phase별 리포트 22개와 각 리포트의 필수 1~9절 존재 확인
  • 기존 Task 정리:
    • Phase 4 Task 4.2 / P4-R1은 추천 ViewModel의 직접 print( 제거, ERROR_LOG 사용과 SodaLive-dev 빌드 성공을 확인해 완료 처리
  • 범위:
    • 리뷰 리포트와 후속 계획만 갱신했으며 production Swift 코드는 수정하지 않음
    • 기존 완료 체크와 과거 검증 기록은 삭제하거나 되돌리지 않음

2026-07-31 리뷰 보완 Task 4.2/9.5/19.5 처리

  • 목적: REV-P4-001, REV-P9-001, REV-P19-005 보완
  • 수행 내용:
    • MainHomeRecommendationViewModel.fetchRecommendations()의 추천 응답 디코딩 catch에서 print(error)ERROR_LOG(error.localizedDescription)로 교체
    • BannerCarousel.wrapIfNeeded()에서 displayIndex0...items.count + 1 복제 범위로 정규화해 경계 reset 지연 중 연속 입력이 범위 밖 index를 지속시키지 않도록 보정
    • Phase 11 활성 Task 기준에 공용 원형 creator widget 우선 검토와 Figma 직사각형 카드 미충족 시 전용 MainHomeRecentDebutCreatorItemView 사용 결정을 명시
  • TDD 예외/대체 검증:
    • 앱 테스트 번들 타깃이 없어 ViewModel 로그 호출, SwiftUI gesture/timer, 문서 정합성에 대한 영구 unit/UI test는 추가하지 않음
    • 정적 실패 근거 재현, Swift 상태 전이 self-check, 정적 검색, 공백 오류, 프로젝트 유효성, SodaLive-dev Debug 빌드로 대체 검증
  • 검증:
    • rg -n "print\(|ERROR_LOG|func fetchRecommendations|catch" "SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift" "SodaLive/Sources/Utils/Log.swift" 실행, 추천 ViewModel 범위의 직접 print( 제거와 ERROR_LOG 사용 확인
    • swift -e '<BannerCarousel index 상태 전이 self-check>' 실행, 기존 조건의 items.count + 2/-1 실패와 보정 후 1...items.count 복구 self-check 통과 확인
    • rg -n "displayIndex = min\(max\(displayIndex, 0\), items.count \+ 1\)|wrapIfNeeded|currentPage" "SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift" 실행, index 정규화와 기존 page 계산 유지 확인
    • rg -n "CreatorProfileGrid|MainHomeRecentDebutCreatorItemView" "docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md" "docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md" "SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeRecentDebutCreatorSection.swift" 실행, 활성 계획·리뷰·코드 기준 일치 확인
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • git diff --check 실행, 출력 없이 성공
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask4295195" build 실행 2회, Pods/SPM 및 app resource 처리 중 10분 도구 제한으로 BUILD INTERRUPTED
  • 차단:
    • SodaLive-dev Debug 빌드 성공 증거와 실제 기기/시뮬레이터 빠른 경계 연속 스와이프 수동 확인은 아직 확보하지 못함
  • 수동 확인:
    • 실제 기기/시뮬레이터의 빠른 경계 연속 스와이프 시각 확인은 이번 환경에서 수행하지 못해 정적 self-check와 빌드 결과로 대체함

2026-07-31 Phase 1~22 최종 코드 리뷰 및 신규 Task 전환

  • 목적: 현재 working tree의 PRD, 계획, Phase별 리포트, production 코드와 Xcode target 상태를 다시 대조하고 남은 확정 항목을 실행 가능한 후속 Task로 전환
  • Phase별 리포팅:
    • docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase1-*.md부터 phase22-*.md까지 Phase별 22개 리포트를 유지하고 최신 판정을 해당 소유 리포트에 누적
  • 신규 확정 항목:
    • REV-P4-001 Low: 신규 추천 ViewModel의 응답 디코딩 catch가 프로젝트 로깅 규칙의 ERROR_LOG 대신 print(error)를 사용함
    • REV-P9-001 Medium: 무한 캐러셀 복제 경계의 지연 reset 중 같은 방향 스와이프가 다시 끝나면 displayIndex가 유효 범위를 벗어나 빈 배너 상태가 지속될 수 있음
    • REV-P19-005 Low: Phase 11 활성 Task는 CreatorProfileGrid 재사용을 완료 조건으로 두지만 현재 코드와 최신 리뷰는 Figma 직사각형 전용 카드를 올바른 구현으로 판정함
  • 계획 전환:
    • Phase 4 Task 4.2 / P4-R1
    • Phase 9 Task 9.5 / P9-R1
    • Phase 19 Task 19.5 / P19-R4
  • 기존 항목 재판정:
    • REV-P2-001, REV-P5-001, REV-P6-001, REV-P10-001, REV-P12-001, REV-P15-001, REV-P15-002, REV-P16-001, REV-P16-002, REV-P18-001, REV-P18-002, REV-P19-001~REV-P19-004는 현재 코드·문서에서 수정 완료 상태 유지
    • Phase 13, 58, 1018, 2022에서는 이번 재점검으로 추가 확정된 production 기능 결함 없음. Phase 11 production 구현은 유지하고 활성 문서 충돌만 Phase 19가 소유
  • 검증:
    • git diff --check, git diff --cached --check — 성공, 출력 없음
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • Phase 122 리뷰 파일의 샘플 필수 절 19 존재 여부 — 22개 모두 충족
    • PRD Markdown fence 수 — 10개로 짝수이며 활성 응답 예시 구조 확인
    • 제외 섹션/Figma URL/기존 HomeApi 추천 endpoint 정적 검색 — 검색 결과 없음
    • xcodebuild -workspace SodaLive.xcworkspace -list — 종료 코드 0, SodaLive, SodaLive-dev scheme 확인
    • xcodebuild -quiet -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination generic/platform=iOS -derivedDataPath /private/tmp/SodaLiveDerivedDataReview20260731Dev build — 종료 코드 0
    • 동일 clean DerivedData의 SodaLive Debug 빌드 — 종료 코드 0
    • 두 빌드에서 REV-P18-002 대상 홈 추천 파일 11개의 duplicate build warning 없음. 프로덕션 target의 다른 V2 파일 기존 duplicate warning은 이번 계획 범위 밖으로 유지
  • 범위:
    • 이번 리뷰에서는 production 코드 결함을 수정하지 않고 Phase별 리뷰 리포트와 후속 계획만 갱신
    • 기존 완료 체크와 검증 기록은 삭제·되돌리지 않고 신규 Task와 판정을 누적

2026-07-31 리뷰 보완 Task 10.2/18.4 처리

  • 목적: REV-P10-001, REV-P18-002 보완
  • 수행 내용:
    • MainHomeActiveCreatorSection의 최근 활동 상대 시간 표시를 공용 DateParser.relativeTimeText(fromUTC:fallback:) 호출로 교체하고 중복 계산 helper를 제거
    • SodaLive.xcodeproj/project.pbxprojSodaLive Sources phase에서 홈 추천 범위 11개 Swift 파일의 잔여 중복 build file 참조를 제거
  • TDD 예외/대체 검증:
    • production 동작을 새로 추가하지 않는 구조 정리와 Xcode Sources 메타데이터 정리 작업이며 앱 테스트 번들 타깃이 없어 신규 테스트는 추가하지 않음
    • 공용 함수 연결 정적 검색, target별 Sources 등록 수, 프로젝트 유효성, 공백 오류, 두 scheme 빌드와 duplicate warning 검색으로 대체 검증
  • 검증:
    • rg -n "dateComponents|timeIntervalSince|relativeTimeText|relativeActivityAtText" "SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift" "SodaLive/Sources/Common/DateParser.swift" 실행, 추천 섹션은 DateParser.relativeTimeText 호출만 남고 중복 helper는 검색되지 않음
    • 홈 추천 범위 11개 Swift 파일 Sources 등록 수 대조 — SodaLive=1, SodaLive-dev=1
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • git diff --check 실행, 출력 없이 성공
    • xcodebuild -quiet -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask184DevRetry" build 실행, 종료 코드 0
    • xcodebuild -quiet -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination "generic/platform=iOS" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask184Prod" build 실행, 종료 코드 0
    • 두 빌드 로그에서 REV-P18-002 대상 11개 홈 추천 파일의 duplicate build warning은 검색되지 않음. 기존 범위 밖 MainHomeRankingViewModel.swift, MainHomeFollowingViewModel.swift duplicate warning은 남아 있어 이번 Task에서 변경하지 않음
    • SodaLive-dev 빌드 시도는 10분 제한으로 BUILD INTERRUPTED됐고, 위 결과는 동일 변경을 별도 DerivedData에서 다시 검증한 결과임

2026-07-31 Phase 1~22 최종 재점검 및 후속 Task 전환

  • 목적: 현재 working tree의 Phase별 리포트, PRD, 계획, 코드와 프로젝트 등록을 다시 대조해 기존 보완 판정의 정확성을 확인
  • 확정 항목:
    • REV-P10-001 Low: MainHomeActiveCreatorSection.relativeActivityAtText(now:)가 공용 DateParser.relativeTimeText(fromUTC:fallback:now:)와 동일한 상대 시간 계산을 복제함
    • REV-P18-002 Low: Task 18.3 완료 기록과 달리 대상 홈 추천 Swift 파일 11개가 현재 SodaLive=2, SodaLive-dev=1로 등록되어 프로덕션 duplicate build warning이 남음
  • 계획 전환:
    • Phase 10 Task 10.2 / P10-R1: 공용 DateParser.relativeTimeText 재사용 및 중복 계산 제거
    • Phase 18 Task 18.4 / P18-R2: 프로덕션 Sources 잔여 중복 한 건씩 제거 및 두 scheme fresh 빌드 검증
  • 기존 항목 재판정:
    • REV-P2-001, REV-P5-001, REV-P6-001, REV-P12-001, REV-P15-001, REV-P15-002, REV-P16-001, REV-P16-002, REV-P19-001~REV-P19-004는 현재 코드·문서에서 수정 완료 상태 유지
    • Phase 19, 1117, 19~22에서는 이번 재점검으로 추가 확정된 기능 결함 없음
  • 검증:
    • git diff --check — 성공, 출력 없음
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • 제외 섹션/Figma URL/기존 HomeApi 추천 endpoint 정적 검색 — 검색 결과 없음
    • PBX Sources phase 대조 — 대상 11개 파일 모두 SodaLive=2, SodaLive-dev=1
    • 격리 DerivedData 빌드 — SodaLiveSodaLive-dev 모두 종료 코드 0
    • 빌드 경고 대조 — SodaLive에서는 대상 11개 파일의 duplicate build warning이 모두 재현됐고 SodaLive-dev에서는 대상 경고 없음
  • 범위:
    • 이번 리뷰에서는 production Swift 코드와 프로젝트 중복 등록을 수정하지 않고 후속 Task만 추가
    • 기존 완료 체크와 과거 검증 기록은 삭제·되돌리지 않고 후속 판정을 누적

2026-07-31 리뷰 보완 Task 18.3/19.4 처리

  • 목적: REV-P18-001, REV-P19-004 보완
  • 수행 내용:
    • SodaLive.xcodeproj/project.pbxproj에서 홈 추천 범위 11개 Swift 파일의 중복 Compile Sources 등록을 정리
    • PRD Goal의 활성 추천 API 타입명을 MainHomeRecommendationApi로 정정
    • Phase 11/21 리뷰의 오기 기록을 삭제하지 않고 append-only 후속 정정 완료 기록 추가
  • TDD 예외/대체 검증:
    • production 동작 변경이 아니라 Xcode Sources 메타데이터와 문서 정정 작업이므로 신규 테스트는 추가하지 않음
    • target별 Sources 등록 수, 프로젝트 파싱, 정적 검색, 공백 오류 검증으로 대체
  • 검증:
    • 홈 추천 범위 11개 Swift 파일 Sources 등록 수 대조 — SodaLive=1, SodaLive-dev=1
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • xcodebuild -workspace "SodaLive.xcworkspace" -list 실행, 프로젝트 파싱 성공 및 SodaLive, SodaLive-dev scheme 확인
    • xcodebuild -quiet -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask183DevRetry" build 실행, 종료 코드 0
    • xcodebuild -quiet -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataTask183ProdFinal" build 실행, 종료 코드 0
    • 두 빌드 로그에서 REV-P18-001 대상 11개 홈 추천 파일의 duplicate build warning은 검색되지 않음. 기존 범위 밖 V2 파일 duplicate warning은 남아 있어 이번 Task에서 변경하지 않음
    • rg -n "MainHomeApi|MainHomeRecommendationApi|CreatorProfileGrid|MainHomeRecentDebutCreatorItemView|LIVE_REPLAY|liveReplay|targetId" "docs/20260602_메인_홈_추천_UI_API_연동/prd.md" "docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase11-recent-debut-creators.md" "docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase21-recent-activity-live-fallback.md" 실행, 활성 타입명과 append-only 정정 기록 확인
    • git diff --check 실행, 출력 없이 성공
  • 부수 정리:
    • 빌드 과정에서 SwiftPM이 자동 갱신한 SodaLive.xcworkspace/xcshareddata/swiftpm/Package.resolved는 이번 Task 범위 밖 변경이므로 원래 내용으로 되돌림

2026-07-31 Phase 1~22 최종 리뷰 점검 및 후속 Task 전환

  • 목적: Phase별 기존 리뷰와 보완 구현을 최신 working tree에서 다시 대조하고, 누락된 프로젝트·문서 결함을 실행 가능한 후속 Task로 전환
  • 확정 항목:
    • REV-P18-001 Low: SodaLive target에서 이번 계획 범위의 홈 추천 Swift 파일 11개가 각각 두 번 Sources 등록되어 프로덕션 빌드에 duplicate build warning이 발생함
    • REV-P19-004 Low: PRD의 활성 추천 API 타입명과 Phase 11/21 후속 리뷰 기록 일부가 현재 Swift 구현과 다름
  • 계획 전환:
    • Phase 18 Task 18.3 / P18-R1: 대상 11개 파일의 프로덕션 중복 Sources 등록 제거 및 두 scheme 빌드 검증
    • Phase 19 Task 19.4 / P19-R3: PRD API 타입명과 append-only 리뷰 정정 기록 보완
  • 기존 항목 재판정:
    • REV-P16-002V2ExpandableTextView.swift는 두 앱 target에 각각 한 번만 등록되고 최신 프로덕션 빌드에서 해당 중복 경고가 없어 수정 완료 유지
    • Phase 16, 817, 20~22 production 코드에서는 이번 최종 점검으로 추가 확정된 기능 결함 없음
  • 검증:
    • git diff --check — 성공, 출력 없음
    • plutil -lint SodaLive.xcodeproj/project.pbxprojOK
    • 제외 섹션/Figma URL/기존 HomeApi 추천 endpoint 정적 검색 — 검색 결과 없음
    • PBX Sources phase 대조 — REV-P18-001 대상 11개 파일은 SodaLive=2, SodaLive-dev=1
    • xcodebuild -quiet -workspace SodaLive.xcworkspace -scheme SodaLive -configuration Debug -derivedDataPath /private/tmp/SodaLiveDerivedDataReviewCurrentProd build — 종료 코드 0, 빌드 성공 및 대상 duplicate warning 재현
    • 최신 SodaLive-dev 빌드 재실행은 10분 이상 종료되지 않아 중단했으며, 동일 dev target의 직전 현재 변경군 BUILD SUCCEEDED 기록을 유지
  • 범위:
    • production 코드와 프로젝트 중복 등록은 수정하지 않고 후속 Task만 추가
    • 기존 완료 기록과 리뷰 판정은 삭제하지 않고 Phase별 리포트에 후속 판정을 누적

2026-07-31 리뷰 보완 Task 6.4/15.3/16.3/19.3 처리

  • 목적: 2026-07-31 재점검에서 확정된 REV-P6-001, REV-P15-002, REV-P16-002, REV-P19-002, REV-P19-003 보완
  • 수행 내용:
    • MainHomeView의 추천/랭킹/팔로잉 탭 제목을 기존 I18n.MainContentRecommendation.tabTitle, I18n.MainContentRanking.tabTitle, I18n.HomeFollowing.tabTitle로 교체
    • CommunityPostCard에서 imageUrl == nil && price > 0 && existOrdered == false인 게시물도 기존 onTapPurchase callback으로 진입하는 구매 affordance 표시
    • SodaLive target에 중복 등록된 V2ExpandableTextView.swift in Sources 한 건 제거, SodaLive-dev target 등록은 유지
    • PRD 응답 모델 예시의 Markdown fence를 모델 단위로 분리하고 활성 V2 확장 텍스트 경로를 V2ExpandableTextView.swift로 정정
  • TDD 예외/대체 검증:
    • 저장소에 앱 테스트 번들 타깃이 없어 SwiftUI 렌더링·버튼 callback을 직접 실행하는 영구 unit/UI test는 추가하지 않음
    • 변경 전 정적 RED 체크에서 한글 탭 제목, 이미지 없는 유료 미구매 구매 affordance 부재, PBX 중복 등록, 활성 문서의 이전 경로를 재현
  • 검증:
    • rg -n 'MainContentRecommendation\.tabTitle|MainContentRanking\.tabTitle|HomeFollowing\.tabTitle' SodaLive/Sources/V2/Main/Home/MainHomeView.swift 실행, 기존 I18n 키 연결 확인
    • rg -n 'hasImage|isLocked|lockedTextPurchaseButton|paidLockOverlay|purchaseCommunityPost|onTapPurchase' SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift SodaLive/Sources/V2/Main/Home/Recommendation 실행, 이미지 유무와 무관한 유료 미구매 구매 경로 확인
    • rg -n 'V2ExpandableTextView\.swift in Sources|C922F89D' SodaLive.xcodeproj/project.pbxproj 실행, build file은 C922F89B, C922F89C 두 건만 남고 중복 C922F89D 제거 확인
    • rg -n '^```|#### RecommendationBannerResponse|#### HomePopularCommunityPostItem|V2/Component/Text/(ExpandableTextView|V2ExpandableTextView)\.swift|V2ExpandableTextView' docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, PRD fence 10개와 활성 V2ExpandableTextView.swift 경로 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK
    • git diff --check 실행, 출력 없이 성공
    • SodaLive-dev Debug 전체 빌드는 일반 실행 2회와 백그라운드 실행 1회가 모두 Pods/SDK 컴파일 중 10분 도구 제한을 초과해 완료 증거를 확보하지 못함. 백그라운드 프로세스 20992는 종료 처리함
    • Oracle 리뷰어 게이트 실행, 네 보완 Task에 대한 차단/중요 findings 없음 판정
    • lsp_diagnostics는 개별 Swift 파일 단독 분석에서 기존 프로젝트 타입과 외부 모듈(Kingfisher)을 찾지 못해 false positive를 반환했으므로 실제 컴파일 검증은 xcodebuild 결과를 기준으로 판단
  • 미실행 수동 확인:
    • 실제 기기/시뮬레이터에서 ko/en/ja 탭 제목과 이미지 없는 유료 미구매 카드 구매 버튼 탭의 API 1회 호출은 아직 수행하지 못함

2026-07-31 Phase 1~22 후속 통합 리뷰 및 신규 Task 전환

  • 목적: 2026-07-30 통합 리뷰 후 보완된 구현과 Phase 22 수동 완료 상태를 현재 PRD·계획·코드·프로젝트에 다시 대조하고, 새로 확정한 항목을 소유 Phase의 실행 가능한 Task로 전환
  • Phase별 리포팅:
    • docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase1-*.md부터 phase22-*.md까지 22개 리포트에 2026-07-31 재점검 기록을 각각 누적
  • 기존 리뷰 항목 재판정:
    • REV-P2-001, REV-P5-001, REV-P12-001, REV-P15-001, REV-P16-001, REV-P19-001은 현재 구현·문서에서 수정 완료 확인
  • 신규 확정 항목:
    • REV-P6-001 Medium: 홈 추천/랭킹/팔로잉 탭 제목이 기존 I18n 키를 사용하지 않고 한글 문자열로 고정됨
    • REV-P15-002 Medium: imageUrl == nil인 유료 미구매 게시물은 잠금·구매 Button이 렌더링되지 않아 기존 구매 API로 진입할 수 없음
    • REV-P16-002 Low: V2ExpandableTextView.swift가 프로덕션 SodaLive Sources에 두 번 등록됨
    • REV-P19-002 Low: PRD 7.1 응답 예시의 Markdown code fence가 중첩·누락됨
    • REV-P19-003 Low: PRD와 계획의 활성 기준이 이름 변경 전 V2 ExpandableTextView.swift 경로를 가리킴
  • 계획 전환:
    • Phase 6 Task 6.4 / P6-R1
    • Phase 15 Task 15.3 / P15-R2
    • Phase 16 Task 16.3 / P16-R2
    • Phase 19 Task 19.3 / P19-R2
  • 검증:
    • MainHomeView.swift, CommunityPostCard.swift, I18n.swift, PRD와 PBX Sources phase를 줄 단위로 대조해 각 실패 조건을 재현
    • PBX Sources phase 대조 결과 V2ExpandableTextView.swift in Sources 포함 수 SodaLive=2, SodaLive-dev=1
    • xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive -configuration Debug -derivedDataPath /private/tmp/SodaLiveDerivedDataReviewCurrentProd build 실행, BUILD SUCCEEDED
    • 필터링한 증분 빌드에서 Skipping duplicate build file ... V2ExpandableTextView.swift 경고 재현, 종료 코드 0
    • SodaLive-dev Debug 빌드는 같은 현재 source/project 상태에 대한 2026-07-31 Phase 22.3 검증에서 BUILD SUCCEEDED
  • 범위:
    • 리뷰 리포트와 후속 계획만 갱신했으며 신규 확정 항목의 production 코드·프로젝트·PRD 수정은 수행하지 않음
    • 기존 완료 체크와 과거 검증 기록은 유지하고 신규 Task는 미완료 상태로 추가

2026-07-31 Phase 22.3 모두 팔로우 확인 흐름 수동 검증 완료

  • 목적: Confirm Dialog가 의도하지 않은 대량 팔로우를 차단하면서 기존 인증·완료·loading·오류 흐름을 유지하는지 최종 판정
  • 수동 확인 결과:
    • 로그인 사용자가 모두 팔로우하기를 터치하면 Dialog가 표시되고 확인 전 API 요청은 발생하지 않음
    • 취소 또는 dimmed 영역 터치 시 Dialog가 닫히고 API 요청은 발생하지 않음
    • 팔로우 하기를 한 번 터치하면 Dialog가 닫히고 해당 섹션의 기존 API 요청이 1회 발생함
    • 비로그인 사용자는 Dialog 없이 로그인 화면으로 이동하고, 로그인 완료 후 자동 팔로우하지 않음
    • 기존 완료/호출 중 버튼 상태와 API 실패 toast에서 발견된 오류 없음
    • 앱 언어 ko/en/ja에서 제목, 설명, 확인, 취소 문구 표시에서 발견된 오류 없음
  • 검증:
    • 사용자 수동 테스트 결과 발견된 오류 없음
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataFinalCheck" build: BUILD SUCCEEDED
    • Task 22.3 완료 처리

2026-07-30 리뷰 보완 Task 2.3/5.2/12.2/15.2/16.2/19.2 처리

  • 목적: 통합 리뷰에서 확정된 REV-P2-001, REV-P5-001, REV-P12-001, REV-P15-001, REV-P16-001, REV-P19-001 보완
  • 수행 내용:
    • HomeRecommendationResponse에서 PRD 응답 계약에 없는 firstAudioContentsHomeFirstAudioContentItem 제거
    • 추천 AI 캐릭터 탭 callback을 creatorId가 아니라 characterId로 전달하도록 수정
    • 추천 AI 캐릭터 전용 handleRecommendationCharacterTap(characterId:)를 추가하고 기존 추천 상세 guard를 거쳐 .characterDetail(characterId:)로 이동하도록 연결
    • CommunityPostCard.isAccessiblePostprice <= 0 || existOrdered로 수정
    • 사업자 정보 섹션의 private BusinessInfoExpandableTextView 중복 구현을 제거하고 V2 공용 V2ExpandableTextView로 단일화
    • legacy CustomView/ExpandableTextView와 산출물 충돌을 피하기 위해 V2 공용 파일명을 V2ExpandableTextView.swift로 정리하고 Xcode Sources에 포함
    • PRD와 Phase 17 활성 기준에서 장르 크리에이터 섹션 미표시 결정을 반영하고, genreCreators 응답 모델 유지는 구분해 기록
  • TDD 예외/대체 검증:
    • 저장소에 앱 테스트 번들 타깃이 없어 production Swift 모델/UI callback을 import하는 영구 unit test는 추가하지 않음
    • swift -module-cache-path "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive-swift-module-cache" -e '<PRD 필수 필드만 포함한 추천 JSON 디코딩>' 실행, decoded without firstAudioContents 확인
  • 검증:
    • rg -n "firstAudioContents|HomeFirstAudioContentItem" "SodaLive/Sources/V2/Main/Home/Recommendation" 실행, 검색 결과 없음 확인
    • rg -n "onTapCharacter:|handleRecommendationCharacterTap|characterDetail\(characterId:|onTapCharacter\(item\.(characterId|creatorId)\)" "SodaLive/Sources/V2/Main/MainView.swift" "SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift" 실행, item.characterId, handleRecommendationCharacterTap, characterDetail(characterId:) 연결 확인
    • rg -n "price (==|<=) 0 \|\| existOrdered|isAccessiblePost|isLocked" "SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift" 실행, price <= 0 || existOrdered 확인
    • rg -n "V2ExpandableTextView|BusinessInfoExpandableTextView|struct ExpandableTextView|struct V2ExpandableTextView" "SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBusinessInfoSection.swift" "SodaLive/Sources/V2/Component/Text" "SodaLive/Sources/CustomView/ExpandableTextView.swift" 실행, 사업자 섹션은 V2 공용 구현을 사용하고 legacy 타입은 기존 경로에만 남음 확인
    • rg -n "장르의 크리에이터|MainHomeGenreCreatorSection|genreCreators" "docs/20260602_메인_홈_추천_UI_API_연동" "SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift" 실행, 최신 미표시 결정과 과거 기록 구분 확인
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK
    • git diff --check 실행, 출력 없이 성공
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataReviewSupplement" build 실행, V2/legacy 파일명이 모두 ExpandableTextView.swiftMultiple commands produce ... ExpandableTextView.stringsdata로 실패 확인
    • V2 공용 파일명을 V2ExpandableTextView.swift로 정리 후 xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataReviewSupplement2" build 최초 실행은 10분 제한으로 BUILD INTERRUPTED 확인
    • 동일 빌드 명령 재실행, BUILD SUCCEEDED 확인
    • lsp_diagnostics는 개별 Swift 파일 단독 분석에서 기존 프로젝트 타입과 외부 모듈(Kingfisher, Bootpay)을 찾지 못해 false positive를 반환했으므로, 실제 컴파일 검증은 xcodebuild 결과를 기준으로 판단
  • 미실행 수동 확인:
    • 실제 기기/시뮬레이터에서 AI 캐릭터 탭, 커뮤니티 가격 상태 UI, 사업자 정보 3줄 이하/초과 토글, 모두 팔로우 API 요청 0/1회, ko/en/ja 표시 확인은 아직 수행하지 못함
    • Task 22.3은 실제 로그인/네트워크/언어 화면 수동 확인이 필요하므로 미완료 유지

2026-07-30 Phase 1~22 구현 통합 리뷰 및 후속 Task 전환

  • 목적: 완료 또는 진행된 각 Phase의 계획 체크, 실제 코드·프로젝트 포함 상태·검증 기록을 현재 PRD와 저장소 가이드에 대조하고, 확정된 수정 항목을 소유 Phase의 실행 가능한 신규 Task로 전환
  • 리뷰 결과:
    • Phase별 리포트 22개를 docs/20260602_메인_홈_추천_UI_API_연동/reviews/phase<번호>-*.md로 분리 작성
    • REV-P2-001 High: PRD에 없는 non-optional firstAudioContents 때문에 기준 응답이 keyNotFound로 전체 디코딩 실패 가능
    • REV-P5-001 High: 추천 AI 캐릭터 callback이 크리에이터 상세 handler에 연결됨
    • REV-P12-001 High: AI 캐릭터 카드가 characterId 대신 creatorId를 callback으로 전달함
    • REV-P15-001 Low: 커뮤니티 무료 판정이 PRD의 price <= 0이 아니라 price == 0으로 구현됨
    • REV-P16-001 Low: 공용 V2 확장 텍스트 파일은 Sources 미포함이고 사업자 화면에 동일 구현이 복제됨
    • REV-P19-001 Low: 장르 섹션 미표시 결정과 PRD/Phase 17 활성 기준이 충돌함
    • Phase 22는 정적/빌드 결함이 추가로 확인되지 않았으나 실제 요청 0/1회와 ko/en/ja 화면 확인이 미실행이므로 기존 Task 22.3을 미완료로 유지
  • 계획 전환:
    • Phase 2 Task 2.3 / P2-R1
    • Phase 5 Task 5.2 / P5-R1
    • Phase 12 Task 12.2 / P12-R1
    • Phase 15 Task 15.2 / P15-R1
    • Phase 16 Task 16.2 / P16-R1
    • Phase 19 Task 19.2 / P19-R1
  • 검증:
    • git diff --check 실행, 출력 없이 성공
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK
    • 제외 섹션/Figma URL/기존 HomeApi 추천 endpoint 정적 검색, 검색 결과 없음
    • swift -module-cache-path /private/tmp/sodalive-review-swift-module-cache -e '<필수 Decodable 키 누락 재현>' 실행, keyNotFound(firstAudioContents) 재현
    • 샌드박스 내 xcodebuild -workspace "SodaLive.xcworkspace" -list는 CoreSimulator/캐시 접근 제한으로 실패
    • 샌드박스 밖 xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/private/tmp/SodaLiveDerivedDataReview20260730" build 재실행, BUILD SUCCEEDED
  • 범위:
    • 리뷰 리포트와 후속 계획만 작성했으며 production Swift 코드는 수정하지 않음
    • 기존 완료 체크와 과거 검증 기록은 삭제하거나 되돌리지 않음

2026-07-30 Phase 22 모두 팔로우 Confirm Dialog 코드 구현

  • 목적: 로그인 사용자의 추천 탭 모두 팔로우하기 API 호출을 Confirm Dialog 확인 이후로 지연
  • 수행 내용:
    • MainView.handleRecommendationFollowAllTap에서 비로그인 사용자는 기존처럼 로그인 화면으로 이동하도록 유지
    • 로그인 사용자는 SodaV2ActionModal Confirm Dialog를 표시하고, 팔로우 하기 확인 시 보류한 followAll action을 1회 실행하도록 연결
    • 취소와 dimmed 영역 터치 시 Dialog를 닫고 보류 action을 폐기하도록 연결
    • Dialog 제목, 설명, 확인 버튼 문구를 I18n.HomeRecommendation에 ko/en/ja로 추가하고 취소 버튼은 I18n.Common.cancel 재사용
    • 기존 MainHomeRecommendationViewModel.followAll, FollowRecommendedCreatorsRequest, Repository/API 계약은 변경하지 않음
  • TDD 예외 사유:
    • SodaLive-dev scheme의 test action이 구성되어 있지 않고, SwiftUI Dialog와 실제 네트워크 요청 횟수 통합 흐름을 위한 신규 테스트 인프라 추가는 이번 최소 변경 범위를 벗어남
  • 검증:
    • rg -n "handleRecommendationFollowAllTap|SodaV2ActionModal|pendingRecommendationFollowAllAction|isShowRecommendationFollowAllConfirmDialog|followAllConfirm|I18n.Common.cancel" "SodaLive/Sources/V2/Main/MainView.swift" "SodaLive/Sources/I18n/I18n.swift" 실행, 로그인 guard 뒤 Confirm Dialog 표시, 보류 action, 확인/취소 처리와 다국어 키 확인
    • rg -n "followRecommendedCreators|FollowRecommendedCreatorsRequest" "SodaLive/Sources/V2/Main/Home/Recommendation" 실행, 기존 모두 팔로우 API와 request 경로 유지 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataPhase22" build 최초 실행은 10분 제한으로 BUILD INTERRUPTED 확인
    • 동일 빌드 명령 재실행, BUILD SUCCEEDED 확인
    • lsp_diagnostics는 개별 Swift 파일 단독 분석에서 기존 프로젝트 모듈(Bootpay)을 찾지 못해 false positive를 반환했으므로, 실제 컴파일 검증은 xcodebuild 결과를 기준으로 판단
  • 미실행 수동 확인:
    • 실제 기기/시뮬레이터에서 로그인/비로그인, 확인 전 API 0회, 취소/dimmed API 0회, 확인 API 1회, ko/en/ja 표시 확인은 아직 수행하지 못했으므로 Task 22.3 Phase Gate는 미완료로 유지

2026-07-30 Phase 22 모두 팔로우 확인 Dialog 요구사항 문서화

  • 목적: 의도하지 않은 다중 크리에이터 팔로우를 막기 위한 Confirm Dialog 요구사항과 실행 계획을 인터뷰 결정 기준으로 확정
  • 수행 내용:
    • 기존 메인 홈 추천 UI/API 연동 PRD에 문제, 목표, 사용자 흐름, 적용 범위, 로그인 순서, ko/en/ja 문구, 성공 기준과 Decision Log 추가
    • 메인 홈 추천 탭의 모든 공통 모두 팔로우하기 진입점에 적용하되 현재 미노출 장르 섹션을 다시 표시하지 않도록 범위 확정
    • 비로그인 사용자는 기존 로그인 이동을 유지하고, 로그인 사용자는 팔로우 하기 확인 시에만 기존 API를 호출하도록 확정
    • 취소와 dimmed 영역 터치는 보류 action 폐기 및 API 미호출로 확정
    • 실제 Swift/I18n 구현과 빌드·수동 API 검증은 Task 22.2~22.3 미완료 상태로 분리
  • 검증:
    • rg "모두 팔로우 확인 Dialog|모두 팔로우할까요|Follow all creators|すべてのクリエイターをフォローしますか|dimmed|자동 팔로우" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 적용 범위, 인증 순서, 취소 동작과 ko/en/ja 문구가 두 문서에서 검색됨 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 구현 완료

  • 목적: 최근 활동 크리에이터의 LIVE fallback과 LIVE_REPLAY 콘텐츠 상세 이동을 코드에 반영
  • 수행 내용:
    • HomeActiveCreatorItem.creatorId를 필수 Int로 추가
    • RecommendedActivityType.liveReplay를 추가하고 LIVE_REPLAY 디코딩을 .live와 분리
    • LIVELIVE_REPLAY의 표시 문구는 모두 I18n.HomeRecommendation.activityLive를 유지
    • HomeActiveCreatorTapDestinationactiveCreatorTapDestination으로 최근 활동 탭 목적지를 한 곳에서 결정
    • LIVE + targetId는 라이브룸, LIVE + targetId == nil + creatorId > 0은 크리에이터 채널로 연결
    • LIVE_REPLAY + targetId는 콘텐츠 상세로 연결하고, targetId == nil이면 이동하지 않도록 처리
    • AUDIO, COMMUNITY, 알 수 없는 타입의 기존 분기는 유지
  • 검증:
    • 임시 swiftc RED 체크 실행, 기존 코드에서 HomeActiveCreatorItem.creatorId, RecommendedActivityType.liveReplay, activeCreatorTapDestination 부재로 실패 확인
    • 임시 swiftc GREEN 체크 실행, creatorId 디코딩, LIVE_REPLAY case 분리, LIVE/LIVE_REPLAY/AUDIO/COMMUNITY/unknown 라우팅 precondition 통과 확인
    • rg -n "creatorId|case liveReplay|LIVE_REPLAY|HomeActiveCreatorItem\(|activeCreatorTapDestination|onTapCreator|creatorId > 0|onTapLive|onTapContent|onTapCommunityPost" "SodaLive/Sources/V2/Main/Home/Recommendation" "SodaLive/Sources/V2/Main/MainView.swift" 실행, Phase 21 구현 근거 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • plutil -lint "SodaLive.xcodeproj/project.pbxproj" 실행, OK 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
    • lsp_diagnostics는 개별 Swift 파일 단독 분석에서 기존 프로젝트 타입(I18n, EventItem, DateParser)을 찾지 못해 false positive를 반환했으므로, 실제 컴파일 검증은 xcodebuild 결과를 기준으로 판단

2026-07-30 Phase 21 LIVE_REPLAY 이동 요구사항 정정

  • 정정 대상:
    • Task 21.1과 Task 21.3에 기록했던 LIVE_REPLAY의 기존 라이브룸 이동 기준
    • 이전 2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 요구사항 문서화 기록의 LIVE_REPLAY 기존 동작 유지 표현
  • 정정 내용:
    • LIVE_REPLAY는 라이브룸으로 이동하지 않는다.
    • AUDIO와 동일하게 targetId를 콘텐츠 ID로 사용해 콘텐츠 상세 페이지로 이동한다.
    • targetId == nil이면 이동하지 않으며 creatorId fallback은 적용하지 않는다.
    • 표시 문구는 기존과 같이 I18n.HomeRecommendation.activityLive를 사용해 라이브로 표시한다.
  • 반영 범위:
    • PRD 상세 진입 규칙, 성공 기준, Open Questions, 검증 계획
    • Phase 21 결과와 Task 21.1, Task 21.3
    • 문서 정정 추적용 Task 21.4
  • 검증:
    • rg "LIVE_REPLAY.*(라이브룸|콘텐츠 상세|activityLive|라이브)|onTapContent\\(targetId\\)" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 활성 요구사항과 미완료 구현 Task에서 LIVE_REPLAY의 콘텐츠 상세 이동 및 기존 라이브 표시 유지 기준 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-07-30 Phase 21 최근 활동 LIVE 이동 fallback 요구사항 문서화

  • 목적: HomeActiveCreatorItem.creatorId 추가와 최근 활동 LIVEtargetId 유무별 이동 규칙을 구현 전에 확정
  • 수행 내용:
    • PRD 응답 스키마에 non-null creatorId: Long 추가
    • 서버 원본 LIVE에서 targetId가 있으면 라이브룸, 없으면 creatorId 기반 크리에이터 채널로 이동하도록 명시
    • 서버가 유효한 양수를 보장하더라도 앱에서 creatorId > 0을 검사하도록 명시
    • LIVELIVE_REPLAY를 앱 enum case에서 구분하고 LIVE_REPLAY에는 새 fallback을 적용하지 않도록 명시
    • AUDIO, COMMUNITY, 알 수 없는 활동 타입의 기존 동작 유지 기준 추가
    • Phase 21에 문서, 모델/enum, 이동 연결/검증 Task를 추가하고 구현 Task는 미완료로 유지
  • 검증:
    • rg "creatorId: Long|activityType == LIVE|targetId == null|creatorId > 0|LIVE_REPLAY" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 응답 필드, LIVE 분기, 양수 검사, LIVE_REPLAY 제외 규칙이 두 문서에 반영됨 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-07-10 Phase 20 추천 커뮤니티 게시물 상세 진입 보정 완료

  • 목적: 메인 홈 추천 탭의 최근 활동 COMMUNITY와 인기 커뮤니티 게시물 탭 액션을 커뮤니티 게시물 상세 페이지로 연결
  • 수행 내용:
    • PRD에 최근 활동 activityType == COMMUNITYtargetId를 커뮤니티 게시물 postId로 취급한다는 기준을 추가
    • PRD에 인기 커뮤니티 게시물 일반 탭/댓글 아이콘 탭이 커뮤니티 게시물 상세 페이지로 이동한다는 기준을 추가
    • MainHomeView, MainHomeRecommendationView, MainHomeActiveCreatorSection, MainHomePopularCommunitySection의 추천 커뮤니티 callback 이름을 onTapCommunityPost로 정리
    • MainView.handleRecommendationCommunityPostTap(postId:)를 추가해 추천 탭 커뮤니티 액션을 AppStep.creatorChannelCommunityPostDetail(postId:onCommunityRefresh:)로 연결
    • CommunityPostCard에 기본 no-op onTapPost를 추가하고, 인기 커뮤니티 섹션에서 일반 탭과 댓글 아이콘 탭 모두 postId 기반 상세 이동으로 연결
    • 팔로잉 스케줄의 기존 .community 라우팅은 creatorCommunityAll(creatorId:)로 유지하고 로그인 guard 흐름도 유지
  • 검증:
    • rg "activityType == COMMUNITY|커뮤니티 게시물 상세|targetId.*postId|인기 커뮤니티" docs/20260602_메인_홈_추천_UI_API_연동 실행, PRD/계획 문서에 요구사항 반영 확인
    • rg -n "onTapCommunityPost|handleRecommendationCommunityPostTap|creatorChannelCommunityPostDetail|onTapPost|onTapComment|handleFollowingScheduleTap|creatorCommunityAll" SodaLive/Sources/V2/Main SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift 실행, 추천 탭 postId 상세 이동과 팔로잉 스케줄 기존 분기 확인
    • rg -n "onTapCommunity:|handleRecommendationCommunityTap" SodaLive/Sources/V2/Main SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift 실행, 기존 모호한 추천 커뮤니티 callback 이름 제거 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • 샌드박스 내 xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, CoreSimulator/로그 접근 제한으로 실패 확인
    • 승인 후 동일 xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 재실행, BUILD SUCCEEDED 확인

2026-06-30 Phase 17~19 최종 조립/검증/문서 갱신 완료

  • 목적: V2 Main Home 추천 탭 섹션 조립 순서와 빈 섹션 숨김 조건을 최종 확인하고, 프로젝트 포함/정적 점검/빌드 검증 결과를 계획 문서에 반영
  • 수행 내용:
    • MainHomeRecommendationView가 현재 라이브, 배너, 최근 활동, 최근 데뷔, AI 캐릭터, 장르, 응원, 인기 커뮤니티, 사업자 정보 순서로 섹션을 조립하는지 확인
    • 데이터 기반 섹션 컴포넌트가 items.isEmpty 조건으로 섹션 제목과 컨테이너를 숨기는지 확인
    • 신규 Swift 파일 프로젝트 포함은 기존 SodaLive.xcodeproj/project.pbxproj 상태로 충족되어 추가 수정하지 않음
    • 배너 이동 규칙, 표시 개수, 커뮤니티 audioUrl 표시 여부에 새 확정 사항은 없어 prd.md는 수정하지 않음
    • Phase 17, 18, 19 task 체크박스를 실제 완료 상태로 갱신
  • 검증:
    • rg "MainHomeLiveSection|MainHomeBannerSection|MainHomeActiveCreatorSection|MainHomeRecentDebutCreatorSection|MainHomeAiCharacterSection|MainHomeGenreCreatorSection|MainHomeCheerCreatorSection|MainHomePopularCommunitySection|MainHomeBusinessInfoSection" SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift 실행, 모든 구현 대상 섹션이 요구 순서로 조립됨 확인
    • 각 섹션 파일 확인, MainHomeLiveSection, MainHomeBannerSection, MainHomeActiveCreatorSection, MainHomeRecentDebutCreatorSection, MainHomeAiCharacterSection, MainHomeGenreCreatorSection, MainHomeCheerCreatorSection, MainHomePopularCommunitySection에서 빈 배열 guard 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • rg "추천 필모그래피|또 다른 모습" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component 실행, 검색 결과 없음 확인
    • rg "api/v2/home/recommendations" SodaLive/Sources/Home 실행, 검색 결과 없음 확인
    • rg "localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component 실행, 검색 결과 없음 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, 기존 DerivedData build.db lock으로 실패 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataPhase18" build 실행, 10분 제한으로 BUILD INTERRUPTED 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/SodaLiveDerivedDataPhase18Long" build 실행, BUILD SUCCEEDED 확인

2026-06-30 Phase 16 사업자 정보 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭 마지막에 사업자 정보 더보기/접기 섹션을 연결
  • 수행 내용:
    • MainHomeBusinessInfoSection을 추가해 기존 I18n.Settings.companyInfo를 표시
    • 기존 ExpandableTextView 이름 충돌을 피하기 위해 파일 내부 전용 BusinessInfoExpandableTextView로 기본 3줄 lineLimit, 더보기, 접기 동작을 연결
    • MainHomeRecommendationView에서 인기 커뮤니티 섹션 다음에 사업자 정보 섹션을 배치
    • 신규 MainHomeBusinessInfoSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • rg "MainHomeBusinessInfoSection|BusinessInfoExpandableTextView|ExpandableTextView|lineLimit|더보기|접기" SodaLive/Sources/V2 실행, 사업자 정보 섹션/3줄 제한/더보기 접기 구현 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test 실행, Scheme SodaLive-dev is not currently configured for the test action으로 테스트 액션 미구성 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-30 Phase 15 isLiked 컴파일 보완

  • 목적: HomePopularCommunityPostItem.isLiked 추가 이후 추천 인기 커뮤니티 섹션 컴파일 오류 보완
  • 수행 내용:
    • HomePopularCommunityPostItemisLiked 필드를 유지하고, 섹션에서 사용하는 relativeCreatedAtText(now:) helper를 복구
    • MainHomePopularCommunitySectionitem.isLikedCommunityPostCard(isLike:) 초기 상태로 전달하는지 확인
  • 검증:
    • rg -n "HomePopularCommunityPostItem\(|\.isLike\b|isLike: item|isLiked|relativeCreatedAtText" 실행, 추천 섹션에 남은 item.isLike 참조 없음 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 15 인기 커뮤니티 섹션 세로 FeedCommunityView 보정 완료

  • 목적: V2 Main Home 추천 탭의 인기 커뮤니티 섹션을 Figma 24:5645, 567:17875, 567:17878 기준 세로 FeedCommunityView 형태로 보정
  • 수행 내용:
    • MainHomePopularCommunitySection의 가로 ScrollView/LazyHStack/240폭 카드 구성을 제거하고, 부모 추천 ScrollView 안에서 세로 VStack 피드 목록으로 표시
    • CommunityPostCard를 Figma FeedCommunityView 형태로 보정해 Text Only, Text + Image, Text + Image + Audio, 유료 미구매 잠금 상태를 지원
    • audioUrl이 있으면 기존 CreatorCommunityMediaPlayerManagerContentPlayManager.pauseAudio() 흐름을 재사용해 이미지 중앙 재생/일시정지 버튼을 표시
    • 기존 CreatorCommunityRepository.communityPostLike(postId:), purchaseCommunityPost(postId:), CommunityPostPurchaseDialog를 추천 ViewModel에 연결해 좋아요와 유료 미구매 포스트 구매를 지원
    • DateParser.relativeTimeText(fromUTC:fallback:now:)를 공용 함수로 추가하고, 기존 커뮤니티 상세와 추천 홈 카드가 UTC 날짜를 디바이스 Timezone 기준 상대 날짜로 표시하도록 연결
    • HomePopularCommunityPostItem.isLiked를 카드 좋아요 초기 상태와 연결
    • 키워드 영역과 구매완료 버튼은 추가하지 않음
    • MainHomeRecommendationView에서 응원 섹션 다음에 인기 커뮤니티 섹션을 배치하고, 댓글 아이콘 탭은 기존 creatorCommunityAll(creatorId:) 라우팅에 맞춰 creatorId를 전달
    • 신규 MainHomePopularCommunitySection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5645, 567:17875, 567:17878 디자인 컨텍스트와 스크린샷 확인, 인기 커뮤니티 섹션이 세로 리스트이고 Feed 카드가 14 padding, 16 gap, 14 radius, 댓글/좋아요 18 아이콘 구조임을 확인
    • rg -n "ScrollView\\(\\.horizontal|LazyHStack|frame\\(width: 240\\)" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift 실행, 검색 결과 없음 확인
    • rg -n "ic_feed_community_heart|ic_feed_community_heart_fill|ic_feed_community_reply|CommunityPostPurchaseDialog|purchaseCommunityPost|communityPostLike|toggleContent\\(item:|relativeTimeText\\(fromUTC|relativeCreatedAtText|CreatorCommunityRepository" SodaLive/Sources 실행, 좋아요/댓글 아이콘, 구매/좋아요 API, 오디오 재생, UTC 상대 날짜 연결 확인
    • rg -n "localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component 실행, 검색 결과 없음 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test 실행, Scheme SodaLive-dev is not currently configured for the test action으로 테스트 액션 미구성 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 14 최근 응원이 많은 크리에이터 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5636, 309:19196 기준 최근 응원이 많은 크리에이터 섹션을 연결
  • 수행 내용:
    • MainHomeCheerCreatorSection을 추가해 HomeRecommendationResponse.cheerCreatorscreatorId, creatorNickname, creatorProfileImage 기반 크리에이터 목록을 표시
    • Phase 13의 MainHomeCreatorGroupSection을 재사용하되, 응원 섹션은 섹션 제목 아래 고정 1개 카드만 표시하도록 구성
    • MainHomeCreatorGroupSection에 기본값 trueshowTitle 옵션을 추가해 장르 섹션 기본 동작은 유지하고, 응원 섹션 카드 내부 제목만 숨김
    • 데이터가 비어 있으면 섹션 제목과 카드가 렌더링되지 않도록 구성
    • MainHomeRecommendationView에서 장르 섹션 다음에 응원 섹션을 배치하고, 모두 팔로우는 응원 섹션의 creatorId 목록만 followAll로 전달
    • 신규 MainHomeCheerCreatorSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5636, 309:19196 디자인 컨텍스트와 스크린샷 확인, 섹션 제목/단일 카드/8개 프로필/모두 팔로우 버튼 구조 확인
    • rg -n "MainHomeCheerCreatorSection|cheerCreators|MainHomeCreatorGroupSection|CreatorProfileGrid|showTitle|followAll|localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Creator 실행, 응원 섹션/필드/재사용 그룹/followAll 연결 확인 및 forbidden URL 미포함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test 실행, Scheme SodaLive-dev is not currently configured for the test action으로 테스트 액션 미구성 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 13 장르 크리에이터 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5611, 24:5612, 24:5615, 24:5623, 24:9092 기준 장르 크리에이터 그룹 섹션과 모두 팔로우 상태를 연결
  • 수행 내용:
    • MainHomeGenreCreatorSection을 추가해 HomeGenreCreatorGroupItem.genreName, creators 기반 가로 그룹 카드 목록을 표시
    • MainHomeCreatorGroupSection을 같은 파일에 분리해 Phase 14에서도 재사용 가능한 그룹 카드 UI로 구성
    • 그룹 카드는 Figma 기준 폭 374, padding/radius/gap 14, 어두운 배경에서 soda700으로 이어지는 세로 gradient, 최대 8개 크리에이터 2행 x 4열 구조로 구현
    • 크리에이터 아이템은 기존 CreatorProfileItem을 재사용하고, 75x75 원형 이미지와 한 줄 말줄임 닉네임을 표시하며, 탭 시 기존 onTapCreator guard 경로를 재사용
    • 모두 팔로우 버튼은 ic_new_follow, ic_new_following 아이콘과 Figma의 미완료/완료 상태를 반영하도록 보완
    • MainHomeRecommendationView에서 AI 캐릭터 섹션 다음에 장르 섹션을 배치하고, 기존 MainHomeRecommendationViewModel.followAll(creatorIds:completionKey:)POST /api/v2/home/recommendations/creators/follow 경로를 재사용
    • 신규 MainHomeGenreCreatorSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5611, 24:5612, 24:5615, 24:5623, 24:9092 디자인 컨텍스트와 스크린샷 확인, 카드 폭/내부 간격/프로필 크기/버튼 상태 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test 실행, Scheme SodaLive-dev is not currently configured for the test action으로 테스트 액션 미구성 확인
    • rg -n "MainHomeGenreCreatorSection|MainHomeCreatorGroupSection|genreCreators|genreName|creators|followAll|FollowAllButton|followRecommendedCreators|localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Button/FollowAllButton.swift 실행, 섹션/필드/API 연결 및 forbidden URL 미포함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
    • 리뷰어 지적에 따라 CreatorProfileItem 재사용과 project.pbxproj 중복 Sources 등록 제거를 반영한 뒤 동일 빌드 재실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 12 카드 반응형 크기와 채팅 수 표기 보완

  • 목적: AI 캐릭터와 최근 데뷔 크리에이터 썸네일 카드 크기를 402 기준으로 보정하고, AI 캐릭터 채팅 수 배지를 다국어 축약 표기로 표시
  • 수행 내용:
    • AiCharacterCard.responsiveSize(deviceWidth:)를 추가해 최대 185x278, 디바이스 폭이 402보다 작으면 deviceWidth / 402 비율로 축소되도록 구성
    • MainHomeRecentDebutCreatorSection의 아이템도 동일한 responsive size를 사용해 AI 캐릭터 카드와 최대 크기/축소 비율을 맞춤
    • I18n.HomeRecommendation.compactChatCount(_:)를 추가해 한국어/일본어는 , , 계열, 영어는 K, M, B 계열로 표시
    • 축약 소수는 한 자리까지 표시하고 경계값 반올림으로 단위가 앞당겨지지 않도록 내림 처리
  • 검증:
    • rg -n "responsiveSize|baseDeviceWidth|maxCardWidth|maxCardHeight|compactChatCount|compactEastAsianCount|compactEnglishCount|100_000_000|1_000" SodaLive/Sources/V2 SodaLive/Sources/I18n/I18n.swift 실행, 반응형 크기와 다국어 축약 로직 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 12 AI 캐릭터 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5551, 24:5554 기준 AI 캐릭터 섹션을 연결
  • 수행 내용:
    • AiCharacterCard를 Figma 기준 185x278 썸네일 카드로 보완하고, profileImage, totalChatCount, name, description, originalWorkTitle 표시를 반영
    • MainHomeAiCharacterSection을 추가해 HomeAiCharacterItem.characterId, creatorId, name, description, profileImage, totalChatCount, originalWorkTitle 기반 가로 카드 목록을 표시
    • 데이터가 비어 있으면 섹션 제목과 목록을 렌더링하지 않도록 구성
    • MainHomeRecommendationView에서 최근 데뷔 크리에이터 섹션 다음 순서로 AI 캐릭터 섹션을 배치
    • 신규 MainHomeAiCharacterSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
    • I18n.HomeRecommendation.aiCharacterSectionTitle의 한국어 문구를 Figma 섹션 제목인 크리에이터와 이야기를 나눠요!로 반영
  • 검증:
    • Figma 24:5551, 24:5554 디자인 컨텍스트와 스크린샷 확인, 섹션 제목/간격 14/리스트 좌측 inset 14/아이템 간격 4/아이템 185x278 구조 확인
    • 구현 전 xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test 실행, Scheme SodaLive-dev is not currently configured for the test action으로 테스트 액션 미구성 확인
    • rg -n "MainHomeAiCharacterSection|AiCharacterCard|aiCharacters|totalChatCount|originalWorkTitle|profileImage|localhost:3845|figma.com" SodaLive/Sources/V2 SodaLive/Sources/I18n/I18n.swift 실행, 추천 응답 필드 연결 및 forbidden URL 미포함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 12 제외 섹션 반영

  • 목적: 요구사항 변경에 따라 제외된 추천 섹션 UI 구현 범위를 PRD와 계획 문서에서 제거
  • 수행 내용:
    • prd.md에서 제외 섹션의 응답 모델, UI 요구, 검증 항목을 제거
    • plan-task.md에서 기존 Phase 12 Task를 제거하고, 이후 Phase 1320을 Phase 1219로 한 단계씩 재번호 지정
    • 섹션 조립 순서와 검증 명령에서 제외 섹션 참조를 제거
  • 검증:
    • 제외 섹션 관련 키워드 검색 결과가 남지 않음을 확인
    • 최종 Phase/Task 번호 검색 결과, 제거 전 마지막 번호가 남지 않음을 확인
    • rg "### Phase [0-9]+:|- \[[ x]\] \*\*Task [0-9]+\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase/Task 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-29 Phase 11 최근 데뷔 크리에이터 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5534, 24:5537 기준 최근 데뷔한 크리에이터 섹션을 연결
  • 수행 내용:
    • MainHomeRecentDebutCreatorSection을 추가해 HomeCreatorItem.creatorId, creatorNickname, creatorProfileImage 기반 가로 카드 목록을 표시
    • Figma 아이템 원본 205x259를 요청 기준에 맞춰 185x234 고정 크기로 표시하고, radius 14, 하단 dim gradient, 중앙 하단 크리에이터명을 적용
    • 데이터가 비어 있으면 섹션 제목과 목록을 렌더링하지 않도록 구성
    • MainHomeRecommendationView에서 현재 라이브, 배너, 최근 활동 다음 순서로 최근 데뷔 크리에이터 섹션을 배치
    • 신규 MainHomeRecentDebutCreatorSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5534, 24:5537 디자인 컨텍스트와 스크린샷 확인, 섹션 제목/간격 14/리스트 좌측 inset 14/아이템 간격 4/아이템 185x234 구조 확인
    • rg -n "itemWidth|itemHeight|frame\(width: Self\.itemWidth, height: Self\.itemHeight\)|MainHomeRecentDebutCreatorSection|recentDebutCreators|localhost:3845|figma.com" SodaLive/Sources/V2/Main/Home/Recommendation 실행, itemWidth 185, itemHeight 234, 추천 응답 연결 확인 및 forbidden URL 미포함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
    • 리뷰어 게이트 재검토 결과 Unconditional Approval 확인

2026-06-29 Phase 10 최근 활동 크리에이터 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5529, 24:5532 기준 최근 활동 크리에이터 섹션을 연결
  • 수행 내용:
    • MainHomeActiveCreatorSection을 추가해 creatorNickname, creatorProfileImage, activityType, activityAt, targetId 기반 pill 형태 가로 목록을 표시
    • RecommendedActivityType.title로 활동 태그를 표시하고, DateParser.parseI18n.Time 기준 상대 시간을 표시
    • 데이터가 비어 있으면 섹션 제목과 목록을 렌더링하지 않도록 구성
    • MainHomeRecommendationView에서 현재 라이브, 배너 다음 순서로 최근 활동 크리에이터 섹션을 배치
    • 신규 MainHomeActiveCreatorSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5529, 24:5532 디자인 컨텍스트와 스크린샷 확인, 섹션 제목/가로 pill 아이템/52px 원형 이미지/활동 태그/상대 시간 구조 확인
    • rg "MainHomeActiveCreatorSection|activityType|activityAt|targetId|RecommendedActivityType" SodaLive/Sources/V2/Main/Home/Recommendation 실행, 최근 활동 섹션이 신규 응답 필드와 활동 타입 변환을 사용함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 Phase 9 배너 스펙 변경 반영

  • 목적: 변경된 RecommendationBannerResponse 백엔드 응답과 배너 1:1 이미지 비율 요구사항을 반영
  • 수행 내용:
    • RecommendationBannerResponse에서 과거 bannerId, type, title, eventId 필드를 제거하고 imageUrl, eventItem, creatorId, seriesId, link 구조로 변경
    • 배너 탭 시 eventItem, creatorId, seriesId, link 순서로 첫 non-optional 목적지를 찾아 이동하도록 연결
    • eventItemeventDetail, creatorIdcreatorDetail, seriesIdseriesDetail, link는 외부 URL open 경로를 사용
    • BannerCarousel 높이를 itemWidth와 동일하게 되돌려 이미지 영역 1:1 비율 유지
    • BannerCarousel_Previews, MainHomeBannerSection_Previews, MainHomeLiveSection_Previews의 Preview 원격 이미지를 placehold.co 대신 JPEG를 반환하는 picsum.photos/500/500로 변경
  • 검증:
    • rg -n "bannerId|eventId|RecommendationBannerResponse\(|\.type|\.title" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Main/MainView.swift 실행, V2 추천 배너 코드에서 과거 응답 필드 참조 제거 확인
    • curl -L -o /dev/null -w "%{http_code} %{content_type}\n" "https://placehold.co/500" 실행, 200 image/svg+xml 확인
    • curl -L -o /dev/null -w "%{http_code} %{content_type}\n" "https://picsum.photos/500/500" 실행, 200 image/jpeg 확인
    • rg -n "placehold\.co/500" SodaLive/Sources/V2/Main/Home/Recommendation/Components SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift 실행, 검색 결과 없음 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
    • git diff --check 실행, 출력 없이 성공 확인

2026-06-29 Phase 9 배너 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 Figma 24:5525 기준 배너 캐러셀과 추천 배너 섹션을 연결
  • 수행 내용:
    • BannerCarouseldevice width - 40 폭의 1:1 배너, 간격 8, radius 14, 좌우 인접 배너 일부 노출, 우측 상단 01 / NN pill 인디케이터 구조로 보완
    • 배너가 2개 이상이면 첫/마지막에 복제 아이템을 두어 경계에서 이어지는 수평 캐러셀 동작을 구현
    • MainHomeBannerSection을 추가해 RecommendationBannerResponse.imageUrlBannerCarouselItem으로 매핑하고, 원본 배너를 상위 탭 콜백으로 전달하며, 데이터가 비어 있으면 섹션을 렌더링하지 않도록 구성
    • MainHomeRecommendationView에서 현재 라이브 섹션 다음에 배너 섹션을 배치
    • 배너 이동 규칙은 미확정 상태로 유지하고 탭 액션을 새로 구현하지 않음
    • 리뷰어 지적에 따라 무한 캐러셀 경계 reset은 animation 비활성 transaction으로 처리하고, 인디케이터 trailing 위치를 현재 배너 내부 기준으로 보정
    • 신규 MainHomeBannerSection.swiftSodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5525 디자인 컨텍스트와 스크린샷 확인, 3개 수평 배너/간격 8/radius 14/우측 상단 01 / 20 인디케이터 확인
    • rg "SodaSpacing\.s8|SodaSpacing\.s14|BannerCarousel|GeometryReader|ScrollView|TabView|01|current|total|localhost:3845" SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift 실행, 간격/radius/수평 캐러셀/페이지 인디케이터 근거 확인 및 localhost:3845 미포함 확인
    • rg "MainHomeBannerSection|BannerCarouselItem|BannerCarousel|banners|RecommendationBannerResponse" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Banner 실행, 추천 응답 banners가 배너 섹션과 BannerCarousel에 연결됨 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
    • 전용 테스트 타깃이 검색되지 않아 새 테스트 인프라를 추가하지 않고 계획서의 정적/빌드/수동 시각 기준으로 검증

2026-06-29 Phase 9 배너 섹션 Task 세분화

  • 목적: BannerCarousel을 Figma 24:5525 기준으로 구현할 수 있도록 Phase 9 작업을 실행 가능한 단위로 세분화
  • 수행 내용:
    • 기존 단일 Task 9.1Task 9.1~Task 9.4로 분리
    • BannerCarousel 현재 구조 확인, Figma 레이아웃 보완, 추천 홈 배너 섹션 연결, 빌드/시각 검증 단계로 분리
    • 무한 스크롤, 좌우 배너 일부 노출, 배너 간격 8, 이미지 1:1 비율, 배너 width device width - 40, 우측 상단 페이지 인디케이터 요구사항 반영
    • Figma 컨텍스트에서 확인한 radius 14와 01 / 20 형태 인디케이터를 구현 요구사항에 반영
  • 검증:
    • Figma 24:5525 디자인 컨텍스트와 스크린샷 확인, 수평 배너 3개 구성과 우측 상단 01 / 20 인디케이터 확인
    • rg "Task 9\\.[1-4]|device width - 40|1:1|간격은 8|무한 스크롤|24:5525|01 / 20" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase 9 세부 Task와 핵심 배너 요구사항 반영 확인
    • rg "### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase/Task 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-29 Phase 8.1 현재 라이브 섹션 구현 완료

  • 목적: V2 Main Home 추천 탭에 현재 라이브 섹션을 API 응답 데이터 기반으로 표시
  • 수행 내용:
    • MainHomeLiveSectionRecommendation/Components 아래에 추가하고 HomeLiveItem.roomId, creatorNickname, creatorProfileImage를 사용해 렌더링
    • Figma 24:5518 라이브 아이템 메타데이터(70x102)와 스크린샷을 기준으로 단일 아이템 프레임과 프로필 이미지/라이브 배지 배치를 보정
    • MainHomeLiveSection_PreviewsLive Item 고정 크기 Preview와 Live Section Preview를 추가해 Xcode Preview에서 확인 가능하도록 구성
    • 섹션 제목을 제거하고 roomId를 non-optional 응답 값으로 반영
    • 데이터가 비어 있으면 SectionTitle과 가로 목록이 렌더링되지 않도록 구성
    • MainHomeRecommendationView에는 Phase 8 현재 라이브 섹션만 조립하고, 아이템 탭 시 MainView에서 로그인 guard 후 LiveViewModel.enterLiveRoom(roomId:)로 전달되도록 연결
    • MainView에 이미 배치된 LivePaymentDialog, LiveRoomPasswordDialog, LiveRoomViewV2 표시 흐름을 재사용
    • 신규 Swift 파일을 SodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • Figma 24:5518 메타데이터 확인 결과: live 노드 크기 70x102, 스크린샷 기준 원형 프로필/하단 LIVE 배지/닉네임 말줄임 구성 확인
    • rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage|enterLiveRoom|LivePaymentDialog|LiveRoomPasswordDialog" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift 실행, 라이브 섹션 필드와 기존 입장 흐름 재사용 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-29 추천 응답 모델 optionality 정렬

  • 목적: PRD의 "서버 nullable 필드는 Swift optional" 기준에 맞춰 MainHomeRecommendationResponse.swift 모델 optionality를 정리
  • 수행 내용:
    • PRD 응답 스펙에서 ?가 없는 필드를 Swift non-optional로 변경
    • targetId, profileImage, originalWorkTitle, creatorProfileImage, imageUrl, audioUrl 등 PRD nullable 필드는 optional 유지
    • RecommendationBannerResponse는 백엔드 변경 스펙에 맞춰 imageUrl, eventItem, creatorId, seriesId, link 기준으로 정렬
    • HomeLiveItem.creatorNickname, creatorProfileImage가 non-optional이 되면서 라이브 섹션의 불필요한 nil fallback 제거
  • 검증:
    • rg -n "let (roomId|activityType|activityAt|characterId|totalChatCount|genreName|creators|postId|createdAt|likeCount|commentCount|existOrdered): .*\\?" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift 실행, 검색 결과 없음 확인 예정
    • rg -n "\\?\\? \"\"" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift 실행, 검색 결과 없음 확인 예정
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행 예정

2026-06-29 Phase 7 중간 빌드 검증 완료

  • 목적: Phase 4~6에서 생성/이동한 데이터 상태, 라우팅, 탭 루트 Swift 파일이 프로젝트 빌드 대상에 포함되어 있는지 중간 검증
  • 수행 내용:
    • SodaLive.xcodeproj/project.pbxproj 수정 없이 현재 프로젝트 파일 유효성 확인
    • SodaLive-dev Debug 빌드로 신규/이동 Swift 파일 포함 상태 확인
    • Phase 7 Task 7.1 완료 체크 반영
  • 검증:
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-26 Phase 4~6 구현 완료

  • 목적: 추천 ViewModel 데이터 로딩 계층을 Recommendation 하위로 정리하고, 추천 탭 상세 진입 callback guard와 홈 탭 shell/루트 View를 연결
  • 수행 내용:
    • MainHomeViewModel.swiftSodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift로 이동하고 MainHomeRecommendationViewModel로 이름 변경
    • MainHomeRecommendationView를 추가해 추천 API 로딩/에러 toast 상태를 추천 탭 루트에서 관리하도록 구성
    • MainHomeView를 추가해 HomeTitleBar, 추천/랭킹/팔로잉 TextTabBar, 탭별 루트 View 조합만 담당하도록 구성
    • MainHomeRankingView, MainHomeFollowingView는 이번 추천 API 범위 밖이므로 최소 placeholder 루트 View만 추가
    • MainView.home 분기를 MainHomeView로 교체하고, 추천 상세 진입 callback을 기존 token, auth, pendingAction, isShowAuthConfirmView, authView 인프라를 재사용하는 guard helper에 연결
    • HomeLiveItem에 성인 여부 필드가 없어 라이브 항목 성인 여부는 임의 판단하지 않고, 향후 성인 여부가 명확한 호출에서 requiresAdultContent를 사용할 수 있게 중앙 helper만 준비
    • 신규/이동 Swift 파일을 SodaLive.xcodeproj/project.pbxproj 빌드 대상에 포함
  • 검증:
    • rg "final class MainHomeRecommendationViewModel|fetchRecommendations|HomeRecommendationResponse|MainHomeRecommendationRepository|isLoading|errorMessage" SodaLive/Sources/V2/Main/Home 실행, 추천 API 로딩/에러/응답 상태가 MainHomeRecommendationViewModel 중심으로 검색됨 확인
    • rg "pendingAction|isShowAuthConfirmView|setPendingContentSettingsGuideMessage|adultContentEnableGuide|contentViewSettings|MainHomeView\(|MainHomeRecommendationView\(" SodaLive/Sources/V2/Main/MainView.swift SodaLive/Sources/V2/Main/Home 실행, 신규 추천 탭 callback이 MainView guard 인프라를 재사용함 확인
    • find SodaLive/Sources/V2/Main/Home -maxdepth 3 -type f | sort 실행, Recommendation, Ranking, Following 하위 루트 파일 확인
    • rg "struct MainHomeView|HomeTitleBar|MainHomeRecommendationView|MainHomeRankingView|MainHomeFollowingView|MainTabBarView|fetchRecommendations" SodaLive/Sources/V2/Main/Home/MainHomeView.swift SodaLive/Sources/V2/Main/MainView.swift 실행, MainHomeView가 탭별 루트 View를 조합하고 fetchRecommendations를 직접 호출하지 않음 확인
    • rg "case \\.home|MainHomeView|MainPlaceholderTabView" SodaLive/Sources/V2/Main/MainView.swift 실행, .homeMainHomeView를 표시하고 다른 placeholder 탭은 유지됨 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-26 Phase 1~3 코드 리뷰 보완

  • 목적: Phase 2.2 리뷰에서 지적된 과거 추정 응답 필드 혼재를 제거하고, 추천 전용 request 모델 위치를 Recommendation/Models 구조로 일치
  • 수행 내용:
    • MainHomeRecommendationResponse.swift에서 PRD 응답 스펙에 없는 legacy/추정 필드(liveRoomId, profileImageUrl, thumbnailUrl, coverImageUrl, releaseDate, originalTitle 등) 제거
    • 배너는 변경된 백엔드 스펙에 맞춰 eventItem, creatorId, seriesId, link 중 첫 non-optional 값으로 이동 판단
    • FollowRecommendedCreatorsRequest.swiftSodaLive/Sources/V2/Main/Home/Recommendation/Models 아래로 이동
    • SodaLive.xcodeproj/project.pbxproj의 request/model/API/Repository 참조 경로 갱신
  • 검증:
    • rg "liveRoomId|profileImageUrl|thumbnailUrl|coverImageUrl|releaseDate|originalTitle|chatCount|creatorProfileImageUrl|genreId|debutDate|followerCount|cheerCount|nickname" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift 실행, 검색 결과 없음 확인
    • rg "FollowRecommendedCreatorsRequest" SodaLive/Sources/V2/Main/Home SodaLive.xcodeproj/project.pbxproj 실행, request 모델이 Recommendation/Models에 있고 호출부/프로젝트 참조가 유지됨 확인
    • rg --files SodaLive/Sources/V2/Main/Home | sort 실행, 추천 전용 모델/API 파일이 Recommendation 하위에 위치함 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-26 Phase 4 이후 데이터 선행 순서 재배치

  • 목적: Figma 기준 UI는 직접 확인하며 처리할 수 있도록, Phase 4 이후 작업을 네트워크 통신/상태/라우팅/중간 빌드 검증 선행 후 섹션 UI 구현 순서로 재배치
  • 수행 내용:
    • Phase 4를 추천 ViewModel 데이터 로딩 계층 정리로 변경
    • Phase 5를 상세 진입 데이터/라우팅 guard로 배치
    • Phase 6을 홈 탭 shell과 탭별 루트 연결로 배치하되, 섹션 UI 구현은 이후 Phase로 미룸
    • Phase 7에 데이터 기반 프로젝트 포함과 중간 빌드 검증을 추가
    • 기존 섹션별 UI Phase를 Phase 817로 뒤로 이동하고, 섹션 조립/최종 검증/문서 갱신을 Phase 1820으로 재번호 지정
  • 검증:
    • rg "^### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase/Task 번호 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-26 Phase 1~3 재점검 및 보완

  • 목적: 신규 재분류 기준의 Phase 1~3에 맞춰 추천 API/모델/활동 타입 위치와 응답 필드를 Recommendation 하위 구조로 정리
  • 수행 내용:
    • PRD와 현재 SodaLive/Sources/V2/Main/Home, SodaLive/Sources/V2/Component 구현 상태를 비교해 Phase 1 기준점과 제외 범위 확인
    • 추천 API/Repository를 SodaLive/Sources/V2/Main/Home/Recommendation/Repository 아래로 이동하고 MainHomeRecommendationApi, MainHomeRecommendationRepository로 이름 정리
    • 추천 응답 모델과 활동 타입을 SodaLive/Sources/V2/Main/Home/Recommendation/Models 아래로 이동
    • HomeRecommendationResponse.banners 타입을 RecommendationBannerResponse로 명확히 하고 PRD 핵심 필드(roomId, creatorProfileImage, targetId, totalChatCount, originalWorkTitle, audioUrl) 반영
    • RecommendedActivityTypeLIVE, LIVE_REPLAY, AUDIO, COMMUNITY 변환과 I18n.HomeRecommendation ko/en/ja 문구 유지 확인
    • SodaLive.xcodeproj/project.pbxproj의 이동/이름 변경된 Swift 파일 참조 갱신
  • 검증:
    • rg --files SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component SodaLive/Sources/Home SodaLive/Sources/I18n | sort 실행, V2 홈/공용 컴포넌트 및 기존 홈 파일 목록 확인
    • rg "추천 필모그래피|또 다른 모습|figma.com|localhost:3845" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component 실행, 검색 결과 없음 확인
    • rg "/api/v2/home/recommendations|getRecommendations" SodaLive/Sources/V2/Main/Home/Recommendation/Repository SodaLive/Sources/Home 실행, 신규 추천 endpoint가 Recommendation/Repository에서만 검색되고 기존 SodaLive/Sources/Home에는 없음 확인
    • rg "roomId|creatorProfileImage|targetId|totalChatCount|originalWorkTitle|audioUrl" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift 실행, PRD 핵심 필드 반영 확인
    • rg "LIVE_REPLAY|activityLive|activityAudio|activityCommunity|ライブ|オーディオ|コミュニティ" SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift SodaLive/Sources/I18n/I18n.swift 실행, 활동 타입 변환과 I18n 문구 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인

2026-06-26 MainHome 탭별 폴더 구조 반영

  • 목적: MainHomeView에 추천/랭킹/팔로잉 콘텐츠 조립이 누적되지 않도록 탭별 하위 폴더와 루트 View 구조를 PRD/계획 문서에 반영
  • 수행 내용:
    • prd.mdMainHomeView는 홈 상단 shell, 추천/랭킹/팔로잉 탭 콘텐츠는 별도 View로 분리한다는 기준 추가
    • 추천 탭 루트/모델/API/ViewModel/섹션 경로를 SodaLive/Sources/V2/Main/Home/Recommendation/** 기준으로 변경
    • 랭킹/팔로잉 탭 루트 파일 후보를 SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift, SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift로 추가
    • Phase 4를 MainHomeView 탭 shell과 탭별 루트 View로 재정의하고, 추천 섹션 조립은 MainHomeRecommendationView에서 처리하도록 변경
  • 검증:
    • rg "MainHomeRecommendationView|MainHomeRankingView|MainHomeFollowingView|Recommendation/Components|Recommendation/Repository|Recommendation/Models" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 탭별 루트 View와 추천 탭 하위 경로 반영 확인
    • rg "### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase/Task 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-26 상세 진입 guard 요구사항 추가

  • 목적: 신규 추천 탭의 상세 진입 시 기존 홈과 같은 로그인/본인인증/민감 콘텐츠 보기 설정 guard를 적용하도록 PRD와 계획 문서 보완
  • 수행 내용:
    • prd.md추천 탭 상세 진입 guard 요구사항 추가
    • plan-task.md의 Phase 4에 Task 4.3: 추천 탭 상세 진입 guard 적용 추가
    • MainHomeView는 탭 이벤트만 올리고, V2 MainView의 기존 인증 인프라를 재사용하는 방향으로 명시
    • HomeLiveItemisAdult 또는 동등한 필드가 필요하다는 Open Question 반영
  • 검증:
    • rg "추천 탭 상세 진입 guard|pendingAction|isShowAuthConfirmView|setPendingContentSettingsGuideMessage|HomeLiveItem.*isAdult|Task 4.3" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, guard 요구사항과 Task 반영 확인
    • rg "### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase/Task 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-26 PRD/계획 문서 재분류

  • 목적: 신규 API 응답 스펙, FeedCommunityView, 사업자 정보 요구사항을 PRD와 계획 문서에 반영하고, 기존 Phase를 섹션 단위 Phase로 재분류
  • 수행 내용:
    • prd.md를 신규 응답 스펙 기준으로 갱신
    • plan-task.md의 기존 Phase/완료 상태를 새 작업 분류 기준으로 재작성
    • UI 작업은 현재 라이브, 배너, 최근 활동, 최근 데뷔, AI 캐릭터, 장르, 응원, 인기 커뮤니티, 사업자 정보 섹션별 Phase로 분리
    • 기존 검증 기록은 아래에 보존
  • 검증:
    • rg "GET /api/v2/home/recommendations|RecommendationBannerResponse|FeedCommunityView|추천 필모그래피|또 다른 모습|node-id=309-19774|node-id=309-19775" docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 신규 API/응답 타입/FeedCommunityView/제외 섹션/Figma 노드 반영 확인
    • rg "### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, Phase heading과 Task 체크박스 형식 확인
    • git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/prd.md docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md 실행, 출력 없이 성공 확인

2026-06-02 계획 문서 생성

  • 목적: docs/20260602_메인_홈_추천_UI_API_연동/prd.md를 기준으로 구현 전 계획/TASK 문서 작성
  • 수행 내용:
    • MainHome 페이지 루트, 신규 API 계층, 공용 컴포넌트, MainHome 전용 컴포넌트, 연결/검증 작업을 TASK 단위로 분리
    • 공용 컴포넌트는 SodaLive/Sources/V2/Component/** 형태별 폴더 기준으로 배치
    • MainHome 전용 컴포넌트는 SodaLive/Sources/V2/Main/Home/Components 기준으로 배치
  • 아직 수행하지 않은 작업:
    • Swift 코드 구현
    • Xcode 프로젝트 포함 여부 확인
    • 빌드/기능 검증

2026-06-02 Phase 1 구현 완료

  • 목적: Phase 1 범위인 구현 전 구조 확인, 추천 API 모델, I18n 문구, 신규 API/Repository 작성
  • 수행 내용:
    • SodaLive/Sources/V2/Main/MainView.swift.home placeholder 유지 상태와 기존 HomeApi, HomeTabRepository, I18n 구조 확인
    • SodaLive/Sources/V2/Main/Home/ModelsHomeRecommendationResponse, FollowRecommendedCreatorsRequest, RecommendedActivityType 추가
    • SodaLive/Sources/I18n/I18n.swiftI18n.HomeRecommendation 문구 추가
    • SodaLive/Sources/V2/Main/Home/RepositoryMainHomeApi, MainHomeRepository 추가
    • 신규 Swift 파일 5개를 SodaLive.xcodeproj/project.pbxprojSodaLive, SodaLive-dev Sources에 포함
  • 검증:
    • rg "case \.home|MainPlaceholderTabView|enum HomeApi|enum I18n" SodaLive/Sources/V2/Main SodaLive/Sources/Home SodaLive/Sources/I18n/I18n.swift 실행, .home placeholder와 기존 HomeApi, I18n 구조 확인
    • rg "struct HomeRecommendationResponse|struct FollowRecommendedCreatorsRequest|enum RecommendedActivityType" SodaLive/Sources/V2/Main/Home/Models 실행, 모델 정의 검색 확인
    • rg "enum HomeRecommendation|activityLive|followAllCompleted|collapse" SodaLive/Sources/I18n/I18n.swift 실행, 신규 I18n 문구 검색 확인
    • rg "/api/v2/home/recommendations|followRecommendedCreators|getRecommendations" SodaLive/Sources/V2/Main/Home/Repository 실행, 신규 API 경로와 repository 메서드 검색 확인
    • rg "/api/v2/home/recommendations" SodaLive/Sources/Home 실행, 검색 결과 없음 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -list 실행, 별도 테스트 타깃 없음 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
  • 아직 수행하지 않은 작업:
    • Phase 2 이후 ViewModel, UI 컴포넌트, 홈 탭 연결
    • 테스트 타깃이 없어 Phase 1 전용 RED/GREEN 단위 테스트는 추가하지 않음

2026-06-02 Phase 2 구현 완료

  • 목적: Phase 2 범위인 MainHomeViewModel과 공용 UI 컴포넌트 작성
  • 수행 내용:
    • SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift에 추천 API 로딩/오류/응답 상태와 모두 팔로우 완료/호출 중 상태 추가
    • SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift 추가
    • SodaLive/Sources/V2/Component/CreatorCreatorProfileItem, CreatorProfileGrid 추가
    • SodaLive/Sources/V2/Component/Button, Banner, CardFollowAllButton, BannerCarousel, AiCharacterCard, CommunityPostCard 추가
    • SodaLive/Resources/Assets.xcassets/v2에 Phase 2 버튼/카드용 ic_new_following, ic_new_follow, ic_new_community_lock 이미지셋 포함
    • 신규 Swift 파일 8개를 SodaLive.xcodeproj/project.pbxprojSodaLive, SodaLive-dev Sources에 포함
    • 실제 파일이 없던 기존 CustomView/ExpandableTextView.swift stale 프로젝트 참조를 제거해 중복 빌드 산출물 오류 해결
  • 검증:
    • rg "final class MainHomeViewModel|fetchRecommendations|followAll|ApiResponse<HomeRecommendationResponse>|ApiResponseWithoutData" SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift 실행, ViewModel 상태/API 처리 메서드 검색 확인
    • rg "struct ExpandableTextView|lineLimit|moreTitle|collapseTitle|isExpanded" SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift 실행, 확장/접기 상태와 3줄 제한 구현 키워드 검색 확인
    • rg "struct CreatorProfileItem|struct CreatorProfileGrid|creatorNickname|HomeCreatorItem|HomeRecommendationResponse|MainHome" SodaLive/Sources/V2/Component/Creator 실행, 공용 Creator 컴포넌트 검색 및 API 응답 타입 의존 없음 확인
    • rg "struct FollowAllButton|ic_new_following|struct BannerCarousel|struct AiCharacterCard|struct CommunityPostCard|구매완료|HomeBannerItem|HomeAiCharacterItem|HomePopularCommunityPostItem|HomeRecommendationResponse" SodaLive/Sources/V2/Component 실행, 공용 컴포넌트 검색 및 금지 문구/응답 타입 의존 없음 확인
    • plutil -lint SodaLive.xcodeproj/project.pbxproj 실행, OK 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인
  • 아직 수행하지 않은 작업:
    • Phase 3 이후 MainHome 전용 섹션, 페이지 조립, 홈 탭 연결
    • 테스트 타깃이 없어 Phase 2 전용 RED/GREEN 단위 테스트는 추가하지 않음

2026-06-12 Phase 2 코드 리뷰 보완

  • 목적: Phase 2 코드 리뷰에서 확인된 ViewModel Combine 캡처 안정성과 커뮤니티 카드 잠금 아이콘 asset 불일치 보완
  • 수행 내용:
    • SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift의 추천 API/모두 팔로우 API Combine callback 캡처를 [unowned self]에서 [weak self]와 early return으로 변경
    • SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift의 잠금 아이콘을 기존 ic_lock_bb에서 Phase 2 신규 asset인 ic_new_community_lock으로 변경
  • 검증:
    • rg "unowned self" SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift 실행, 검색 결과 없음 확인
    • rg "weak self|ic_new_community_lock|ic_lock_bb" SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift 실행, weak self 캡처 4곳과 ic_new_community_lock 사용 확인
    • git diff --check 실행, 출력 없이 성공 확인

2026-06-12 Phase 1/2 리뷰 추가 보완

  • 목적: Phase 1/2 리뷰에서 확인된 커뮤니티 카드 PRD 표시 누락과 사업자 정보 더보기 판정 안정성 보완
  • 수행 내용:
    • SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift에 생성 시간 표시용 createdAt 입력과 footer 렌더링 추가
    • 잠금 이미지의 가격 표시를 단순 텍스트에서 pay capsule 형태로 변경
    • SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift의 측정 높이 변화 감지를 추가해 부모 폭/레이아웃 변경 시 더보기 표시 판정이 갱신되도록 보완
  • 검증:
    • rg "createdAt|Capsule\(\)|onChange\(of: proxy.size.height\)" SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift 실행, 생성 시간 입력/표시, pay capsule, 높이 변화 감지 검색 확인
    • git diff --check 실행, 출력 없이 성공 확인
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build 실행, BUILD SUCCEEDED 확인