Files
sodalive-ios/docs/20261013_Yandex_광고_잔여_참조_제거/plan-task.md
T

22 KiB

Yandex 광고 잔여 참조 제거 계획

문서 항목 내용
상태 코드 구현·자동 검증 완료, 수동 QA 외부 조건 대기
작성일 2026-10-13
요구사항 기준 prd.md
API 기준 PRD §11, 기존 캔 충전 계약 유지
현재 Phase Phase 1 수동 QA 대기
현재 활성 Goal 없음, P1-GATE [blocked]

목표

Yandex SDK와 상수가 제거된 앱의 잔여 참조를 없애고, 광고 없이 기존 화면과 캔 충전을 사용할 수 있도록 한다.

현재 상태

Phase 상태 완료 Task 다음 Goal 남은 조건
1 외부 조건 대기 3/3, Gate 부분 검증 P1-GATE [blocked] 11개 화면 및 테스트 계정 캔 구매 QA

사용자 선행 작업인 Pod 의존성·상수 제거는 완료 기준선이며 이 계획에서 재수행하지 않는다. 구현 시작 시 남아 있던 SDK·상수 참조는 P1-T1~T3에서 제거했다.

범위

포함

  • 11개 배너 소비 코드, 보상형 광고 소비 코드, 광고 전용 enum·문구 제거.
  • AppDelegate의 Yandex 연결, 공용 광고 파일 및 두 타깃 프로젝트 참조 제거.
  • 보존 경계 대조, 정적 검사, 두 스킴 빌드, 수동 회귀 확인과 구현 후 리뷰 기록.

제외

  • 두 Info.plist 전체, ATT/IDFA 및 다른 SDK, 캔 구매 UI·Repository·API 계약 변경.
  • Pod 설치·업데이트·재정리, Constants 재수정, 미사용 Pods 생성물 직접 삭제.
  • Project Format 변경, worktree·브랜치 생성, 커밋, 과거 문서 재작성, 새 테스트 인프라.

기술적 제약

  • 현재 작업 디렉터리에서만 순차 실행한다. 사용자의 기존 변경을 덮어쓰지 않는다.
  • 모든 구현은 문서 승인 후 시작하며, 광고에만 속하는 부분만 삭제한다.
  • objectVersion = 77과 운영·개발 타깃 구성은 유지한다.
  • 신규 로직을 추가하지 않는 삭제 작업이며 기존 테스트 타깃이 확인되지 않았다. 아래 RED/GREEN은 명시된 정적 부재 검사로 수행하고 빌드·수동 검증을 보완한다. 테스트 인프라·영구 검증 스크립트는 추가하지 않는다.
  • 부재 검사의 rg 종료 코드는 1만 성공이다. 0은 금지 참조 잔존, 2는 검사 오류다. 단순 ! rg로 검사 오류까지 성공으로 처리하지 않는다.

Phase 1. 잔여 광고 참조 제거

Phase 결과: Yandex 없이 앱을 빌드하고 기존 화면과 캔 충전을 사용할 수 있다.

선행조건: 사용자의 PRD·계획 승인. 승인 전에는 아래 체크박스를 실행하지 않는다.

Phase 완료 조건: P1-T1~P1-T3 및 P1-GATE 완료 증거와 실제 검증 기록.

Task 1.1 배너 소비 코드 제거

Goal 실행 P1-T1: 11개 화면에서 광고 호출을 없애고 주변 콘텐츠를 보존한다.

  • 시작 조건: 문서 승인, YAN-001, YAN-005 확인.
  • 완료 증거: 11개 대상 파일의 배너 참조 부재와 변경 대조. 화면 QA는 Gate에서 수행.
  • 범위 밖: 다른 화면·스타일 개편, 공용 광고 파일 삭제.

Files (Modify, 모두 SodaLive/Sources/ 기준):

Live/LiveView.swift
Live/Room/Detail/LiveDetailView.swift
Explorer/Profile/CreatorCommunity/All/CreatorCommunityAllView.swift
Content/Series/Main/Home/SeriesMainHomeView.swift
Content/Series/Main/DayOfWeek/SeriesMainDayOfWeekView.swift
Content/Series/Main/ByGenre/SeriesMainByGenreView.swift
Notification/List/PushNotificationListView.swift
Settings/Notification/NotificationSettingsView.swift
Chat/Character/CharacterView.swift
Chat/Original/OriginalTabView.swift
Chat/Talk/TalkView.swift

Interfaces: 기존 화면 진입·콘텐츠·탭·스크롤은 유지하고 YandexInlineBannerView 소비만 제거한다.

  • RED: 아래 명령을 배너 참조 0건 수용 검사로 사용한다.
  • RED 확인: 종료 코드 0과 기존 배너 호출 11건을 확인한다.
  • GREEN: 배너 및 광고 전용 modifier·광고만 감싼 조건문을 삭제한다. 주변 공용 간격은 유지한다.
  • GREEN 확인: 같은 명령이 종료 코드 1인지 확인한다.
  • REFACTOR: 삭제로 생긴 빈 블록만 정리하고 11개 파일을 대조해 관련 없는 변경이 없는지 기록한다.
rg -n 'YandexInlineBannerView' SodaLive/Sources --glob '!YandexAdSupport.swift'

Task 1.2 채팅 보상형 광고 잔여 코드 제거

Goal 실행 P1-T2: 광고 사전 로딩·표시·보상 경로를 제거하고 캔 구매 계약은 그대로 둔다.

  • 시작 조건: P1-T1 완료, YAN-002~003, YAN-005 확인.
  • 완료 증거: 광고 소비 심볼 부재, .ad 제거 및 기존 캔 구매 코드 보존.
  • 범위 밖: 구매 함수 재설계, optional 제거, Repository/API·충전 UI 수정.

Files:

  • Modify: SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift
  • Modify: SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift
  • Modify: SodaLive/Sources/I18n/I18n.swift
  • Verify only: SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift, SodaLive/Sources/Chat/Talk/TalkApi.swift, SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift, SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift

Interfaces: purchaseChatQuota(canOption:), CAN, CAN_10, CAN_20, container = "ios", optional canOption, 쿼터·캔 갱신 및 quotaChatCount 유지.

  • RED: 아래 두 명령을 광고 전용 심볼·enum 부재 검사로 사용한다.
  • RED 확인: 각 명령이 종료 코드 0으로 현재 참조를 찾는지 확인한다.
  • GREEN: showRewardedAdForChatQuota, prepareRewardedAdIfNeeded와 호출, .ad, quotaAdAction, rewardedAdLoadFailed만 제거한다.
  • GREEN 확인: 두 명령 모두 종료 코드 1인지 확인하고 기존 캔 요청 필드·값을 코드 대조한다.
  • REFACTOR: 삭제로 발생한 미사용 코드만 정리한다. 구매·오류·로딩·잔액 갱신 로직은 재구성하지 않는다.
rg -n 'YandexRewardedAdManager|showRewardedAdForChatQuota|prepareRewardedAdIfNeeded|quotaAdAction|rewardedAdLoadFailed' SodaLive/Sources --glob '!YandexAdSupport.swift'
rg -n 'case[[:space:]]+ad[[:space:]]*=[[:space:]]*"AD"' SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift

Task 1.3 공용 SDK 연결과 프로젝트 참조 제거

Goal 실행 P1-T3: 소비 코드가 제거된 Yandex 공용 구현과 SDK 연결을 제거한다.

  • 시작 조건: P1-T1, P1-T2 완료, YAN-004 확인.
  • 완료 증거: 소스·프로젝트·의존성 명세에서 Yandex 및 전용 하위 라이브러리 참조 부재.
  • 범위 밖: Pods 생성물 수동 정리, plist·Project Format 변경.

Files:

  • Modify: SodaLive/Sources/App/AppDelegate.swift
  • Delete: SodaLive/Sources/Common/YandexAdSupport.swift
  • Modify: SodaLive.xcodeproj/project.pbxproj
  • Verify only: Podfile, Podfile.lock, Pods/Manifest.lock, Pods/Pods.xcodeproj/project.pbxproj

Interfaces: AppDelegate의 다른 SDK 초기화와 두 앱 타깃 구성은 유지한다. 신규 인터페이스는 없다.

  • RED: 아래 명령을 SDK·공용 참조 부재 검사로 사용한다.
  • RED 확인: 종료 코드 0과 AppDelegate·공용 파일·프로젝트의 잔존을 확인한다.
  • GREEN: Yandex import·초기화·전용 주석, 공용 파일, 파일 참조·그룹 항목·두 타깃 build-file/Sources 등록을 제거한다.
  • GREEN 확인: 같은 명령이 종료 코드 1인지 확인하고 두 타깃에 누락 파일 참조가 없는지 확인한다.
  • REFACTOR: 프로젝트 전체 재직렬화 없이 해당 항목만 정리하고 Gate로 진행한다.
rg -n -i 'yandex|appmetrica|divkit|vgsl' SodaLive/Sources SodaLive.xcodeproj/project.pbxproj Podfile Podfile.lock Pods/Manifest.lock Pods/Pods.xcodeproj/project.pbxproj

Phase 1 Gate

Goal 실행 P1-GATE: 제거 완료와 보존 조건, 빌드·화면·충전 회귀를 실제 결과로 판정한다.

  • 시작 조건: 구현 Task 3개 완료.
  • TDD 예외 사유: 구현 후 검증·기록만 수행하는 Task다.
  • 대체 검증: 정적 검사, 승인 후 구현 직전의 보존 파일 기준선 대조, 아래 빌드와 수동 QA.
  • 완료 증거: 명령 종료 코드·수동 결과·리뷰 경로를 Progress에 기록. 환경 차단은 성공으로 처리하지 않는다.

승인 직후 구현 전에 두 Info.plist, Podfile/lock, 두 Constants, 캔 구매 Repository/API/UI, AppViewModel.swift, SodaLiveApp.swift의 상태를 읽기 전용으로 기록한다. 변경 후 사용자 기존 상태와 대조한다. 두 plist는 전체 내용이 동일해야 하며 objectVersion = 77은 유지해야 한다.

plutil -lint SodaLive.xcodeproj/project.pbxproj SodaLive/Resources/Info.plist SodaLive/Resources/Debug/SodaLive-dev-Info.plist
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build

Expected: 모든 Task 부재 검사는 종료 코드 1, plist/프로젝트 문법 검사와 두 빌드는 종료 코드 0. 이 계획 단계에서 실행한 결과가 아니다.

  • Task 3개의 정적 검사를 재실행한다. 과거 문서·보존 plist·미사용 Pods 리소스 파일은 부재 검사에서 제외한다.
  • 보존 파일과 캔 계약, Project Format을 구현 직전 기준선과 대조한다.
  • 두 스킴 빌드와 위 문법 검사를 통과한다. 제공되는 파일 진단 도구가 있으면 수정 Swift 파일도 검사한다.
  • 11개 화면의 콘텐츠·스크롤·이동, 광고 전용 빈 공간 제거를 수동 확인한다. 승인된 테스트 계정으로 10캔·20캔 구매의 쿼터·잔액 갱신과 기존 잔액 부족·실패 처리를 확인한다. 운영 비용이 발생하는 검증은 별도 승인 없이는 수행하지 않는다.
  • docs/sample/sample-review.md를 읽고 reviews/phase1-yandex-reference-removal.md를 작성한다. 확정 수정 사항은 코드 수정 전에 이 계획에 신규 Task로 추가한다.

[blocked] 수동 QA: 사용 가능한 기기는 새 전용 시뮬레이터였고, 이 세션에 네이티브 탭/화면 탐색 자동화와 승인된 테스트 계정·구매용 데이터가 없다. 앱 실행만으로 11개 화면과 유료 거래를 검증했다고 판정하지 않는다. 계정·데이터와 수동 조작 가능한 환경을 준비한 후 같은 Gate를 이어서 검증한다.

실행 순서와 의존성

사용자 승인 → P1-T1 → P1-T2 → P1-T3 → P1-GATE

동시에 하나의 Task만 진행하고 현재 작업 디렉터리를 사용한다. 각 부분 삭제 단계에서는 빌드 가능 상태라고 주장하지 않는다. 전체 연결 제거 후 두 스킴을 검증한다.

변경 금지 항목과 중단 규칙

PRD의 Non-Goals를 따른다. 승인 전 구현, worktree 생성, 자동 커밋, 생성물 직접 편집을 금지한다. 예상 밖의 API·UX 결정을 요구하는 문제가 나오면 임의로 확장하지 말고 PRD에 기록한 뒤 한 가지 질문으로 확인한다. 환경상 QA가 불가능하면 사유를 명시하고 해당 Gate를 미완료로 남긴다.

Progress

문서 준비 1차 실행 - 2026-10-13

  • 상태: 문서 작성, 구현 승인 대기.
  • 무엇을: 사용자 완료 범위와 잔여 참조, 보존 경계를 정리하고 PRD·계획을 작성했다.
  • 왜: 다중 화면의 동작 변경은 구현 전 문서가 필요하며, 사용자가 문서 작성 후 승인 대기를 요청했다.
  • 어떻게: 문서 정책·샘플·빌드 가이드를 읽고 rg로 현재 참조를 확인했다. 계획 검토는 읽기 전용으로 수행했다.
  • 실행 근거: rg -n 'Yandex|YANDEX_|quotaAdAction|rewardedAdLoadFailed|case ad = "AD"|SKAdNetworkItems|NSAdvertisingAttributionReportEndpoint|objectVersion =' SodaLive/Sources SodaLive.xcodeproj/project.pbxproj Podfile Podfile.lock SodaLive/Resources/Info.plist SodaLive/Resources/Debug/SodaLive-dev-Info.plist에서 잔여 코드·보존 키·objectVersion = 77을 확인했다.
  • 결과: 신규 제거 작업용 PRD·계획이 기존에 없는 것을 확인했다. 과거 배치·부분 제거 문서는 완료 이력으로 보존한다. 앱 코드·프로젝트 설정·Pods 수정과 빌드·수동 QA는 수행하지 않았다.
  • 문서 검증: 생성한 두 문서를 다시 읽고 요구사항 ID·Task·상호 링크를 대조했다. rg로 미치환 템플릿과 미실행 완료 체크가 없음을 확인했다. 승인 대기·worktree 미사용·두 plist 보존·캔 계약·Pods 제외 조건도 두 문서에서 확인했다.
  • 남은 항목: 사용자 문서 승인 후 P1-T1부터 실행.

구현 준비 - 2026-10-13

  • 사용자 승인 후 구현 시작 상태로 전환했다. 두 plist·Pod 명세·Constants·캔 구매 경계·마케팅 파일 총 13개의 SHA-256 기준선을 기록했다.
  • 사용자가 변경한 프로젝트의 objectVersion = 77, 기존 항목 정렬, Copy Pods Resources 단계 제거는 보존한다.
  • P1-T1 정적 RED 검사에서 배너 소비 11건을 확인했다. SwiftUI 삭제는 해당 11개 파일만 대상으로 진행한다.
  • 실제 ChatQuotaPurchaseRequest.swift와 임시 Swift 드라이버를 컴파일·실행한 기준선 검사에서 CAN_10, CAN_20, nil canOption 직렬화 3개 시나리오가 통과했다. 영구 테스트 파일이나 테스트 타깃은 추가하지 않는다.
  • 실행 환경에 lsp_diagnostics 도구가 제공되지 않아 Swift 구문 검사·컴파일 및 두 스킴 빌드로 보완하며, LSP 통과를 주장하지 않는다.

P1-T1 실행 결과 - 2026-10-13

  • 상태: 구현·정적 검증 완료, 실제 화면 QA는 Gate에서 별도 확인.
  • 무엇을: 11개 View의 배너 호출과 광고 전용 modifier 및 장르 화면의 광고 전용 조건문을 삭제했다.
  • 왜: Yandex 공용 파일 삭제 전에 모든 배너 소비 경로를 제거하기 위해서다.
  • 어떻게: 배너 부재 검사가 변경 전 11건(종료 코드 0)에서 변경 후 0건(종료 코드 1)으로 전환됐다. xcrun swiftc -frontend -parse에 11개 수정 파일을 전달한 구문 검사는 종료 코드 0이었다. 11개 파일 본문과 diff를 확인해 콘텐츠·라우팅·기존 공용 간격이 유지됨을 확인했다.
  • 남은 항목: P1-T2, P1-T3, P1-GATE. 구문 검사는 전체 타입 검사나 화면 QA를 대체하지 않는다.

P1-T2 실행 결과 - 2026-10-13

  • 상태: 구현·정적 검사·캔 요청 직렬화 회귀 검증 완료.
  • 무엇을: 광고 표시/사전 로딩 함수와 호출, .ad case, 광고 전용 문구 2개를 삭제했다. 구매 함수·optional·요청 필드·잔액 갱신은 유지했다.
  • 왜: SDK 제거 후 남은 채팅 광고 의존 경로를 제거하면서 기존 유료 충전을 보존하기 위해서다.
  • 어떻게: 두 정적 검사가 각각 종료 코드 0에서 1로 전환됐다. 수정 Swift 파일 3개의 parser 검사는 종료 코드 0이었다. 실제 DTO를 임시 드라이버와 다시 컴파일·실행하여 CAN_10, CAN_20, nil canOption 3개 검사 모두 통과했다. 변경 diff에는 계획한 삭제 외 구매 로직 수정이 없다.
  • 남은 항목: P1-T3 및 Gate. 실서버 구매는 실행하지 않았다.

P1-T3 실행 결과 - 2026-10-13

  • 상태: 구현·정적 검사 완료, 빌드 및 수동 Gate 진행 예정.
  • 무엇을: AppDelegate의 Yandex import·초기화와 공용 파일을 제거하고, 프로젝트에서 전용 등록 6줄만 삭제했다.
  • 왜: 모든 소비 경로가 제거된 SDK 연결과 삭제 상수 참조를 최종 정리하기 위해서다.
  • 어떻게: SDK 부재 검사가 종료 코드 0에서 1로 전환됐다. plutil -lint는 프로젝트 및 두 plist에서 OK, AppDelegate Swift parser는 종료 코드 0이었다. ruby -rxcodeproj 읽기 전용 검사로 두 앱 타깃에 Yandex 소스 항목이 없고 objectVersion = 77임을 확인했다.
  • 남은 항목: P1-GATE. 생성물·보존 plist·사용자 선행 변경은 수정하지 않았다.

P1-GATE 검증 결과 - 2026-10-13

  • 상태: 코드 구현·자동 검증·독립 코드 리뷰 완료, 화면 전체 및 실제 구매 QA는 외부 조건 대기.
  • 무엇을: 두 앱 빌드, 보존 파일 대조, 실제 DTO 실행, 최종 참조 검색, 결과물 검사와 네이티브 시작 smoke를 수행했다.
  • 왜: SDK를 제거한 앱의 실제 컴파일과 실행 가능 여부를 확인하면서 캔 구매·설정 보존을 검증하기 위해서다.
  • 어떻게:
    • 모든 Task의 정적 부재 검사: 종료 코드 1. 수정 Swift 15개 파일의 xcrun swiftc -frontend -parse: 종료 코드 0. LSP 도구는 미제공으로 미실행.
    • plutil -lint SodaLive.xcodeproj/project.pbxproj SodaLive/Resources/Info.plist SodaLive/Resources/Debug/SodaLive-dev-Info.plist: 모두 OK.
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build: 종료 코드 0, BUILD SUCCEEDED.
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build: 종료 코드 0, BUILD SUCCEEDED.
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build: 종료 코드 0, BUILD SUCCEEDED. 기기용 빌드 검증 뒤 native smoke 목적으로 추가한 실행 옵션이며 프로젝트 설정 변경은 없다.
    • shasum -a 256 -c /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/yandex-ios-preserved.sha256: 13개 보존 파일 모두 OK.
    • 실제 ChatQuotaPurchaseRequest.swift와 임시 Swift 드라이버 컴파일·실행: CAN_10, CAN_20, nil canOption 직렬화 및 수치 검사 3/3 통과. 실행 기록은 yandex-ios-quota-check.log로 보존했다.
    • 두 Debug-iphoneos 앱의 Frameworks/, 앱 루트 및 xcrun otool -L debug dylib 출력에서 Yandex/AppMetrica/DivKit/VGSL 링크·번들이 없음을 확인했다.
    • git diff --check: 종료 코드 0. 두 공유 scheme의 TestAction에 Testables가 없으며 Yandex/채팅 쿼터용 기존 XCTest는 확인되지 않았다. 실행 가능한 XCTest 전체 suite 통과로 표기하지 않는다.
  • 네이티브 smoke:
    • iPhone 17 Pro / iOS 26.0 전용 기기 F14B9E9B-F166-4694-ACBD-9804E4B7AD54를 생성하고 boot/bootstatus에 성공했다. 기존 사용자 기기는 건드리지 않았다.
    • xcrun simctl install F14B9E9B-F166-4694-ACBD-9804E4B7AD54 /Users/klaus/Library/Developer/Xcode/DerivedData/SodaLive-clzdtvqrsfonoxcijatzkrqdzrsu/Build/Products/Debug-iphonesimulator/SodaLive-dev.app: 종료 코드 0.
    • xcrun simctl launch F14B9E9B-F166-4694-ACBD-9804E4B7AD54 kr.co.vividnext.sodalive.debug2: PID 61239, 종료 코드 0.
    • xcrun simctl io F14B9E9B-F166-4694-ACBD-9804E4B7AD54 screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/yandex-ios-launch-smoke.png: PNG 저장 후 직접 열어 홈 콘텐츠와 보존된 ATT 팝업 표시를 확인했다. 이는 11개 변경 화면의 시각 QA가 아니다.
  • 독립 리뷰: Oracle bg_16ac91d2 / ses_ecc05fbd9ffe65w6Gb41Ii1HYZ, 코드 APPROVE·확정 코드 결함 없음. 전체 Gate는 수동 QA가 남아 미완료라는 판정. 리뷰 보고서에 기록했다.
  • 정리: 전용 앱 terminate → 해당 기기 shutdown → delete 모두 종료 코드 0. 기기 이름 검색에서 0개를 확인했다. 임시 DTO 드라이버·바이너리를 삭제하고 부재를 확인했다. 로그·스크린샷·체크섬 기준선만 증거로 보존했다.
  • 기존 경고: 중복 Compile Sources, 관련 없는 미사용 지역 변수, Firebase Debug dSYM, AppIntents 메타데이터, Alamofire 의존성 스캔 경고가 있었다. 이번 삭제와 무관한 항목은 수정하지 않았다.
  • 남은 항목: [blocked] 11개 변경 화면의 실제 탐색/레이아웃과 승인된 테스트 계정의 캔 구매·실패 QA. 전체 visual QA 또는 P1-GATE 통과를 주장하지 않는다.

증거 파일 디렉터리: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/

증거 파일
운영 빌드 yandex-ios-standard-debug-build.log
개발 빌드 yandex-ios-dev-debug-build.log
개발 시뮬레이터 빌드 yandex-ios-simulator-debug-build.log
캔 요청 실행 yandex-ios-quota-check.log
보존 파일 기준선 yandex-ios-preserved.sha256
앱 시작 화면 yandex-ios-launch-smoke.png

Decision Log

날짜 ID 상태 결정 근거 영향
2026-10-13 PLAN-001 확정 문서 작성만 수행하고 구현 승인 대기 사용자 직접 지시, PRD DEC-003 전체
2026-10-13 PLAN-002 제안 기존 정적 검사·빌드·수동 QA로 삭제 검증, 신규 테스트 인프라 없음 빌드 가이드, 최소 변경 P1-GATE
2026-10-13 PLAN-003 제안 비활성 Pods 생성물은 그대로 두고 활성 참조만 검사 PRD DEC-004 P1-T3, P1-GATE
2026-10-13 PLAN-004 확정 사용자 승인으로 구현 착수, PLAN-002~003 적용 PRD DEC-005 전체
2026-10-13 PLAN-005 확정 현재 디렉터리·기존 Progress를 사용, worktree/자동 커밋/추가 실행용 저장소 구조 없음 승인 계획을 스킬 기본 절차보다 우선 전체
2026-10-13 PLAN-006 확정 코드 리뷰와 전체 수동 Gate를 분리, 미검증 UI·실구매는 차단으로 남김 실제 검증 범위와 독립 리뷰 판정 P1-GATE

발견된 문제

ID 상태 관찰 처리
YAN-STATE-001 잔여 참조 확인 SDK·상수는 제거됐으나 앱 소비 코드가 남음, 빌드는 아직 미실행 승인 후 P1-T1~T3
YAN-STATE-002 범위 제외 과거 Pods 리소스 스크립트·목록 10개에 참조 잔존, 활성 Copy Pods Resources 단계 없음 직접 편집하지 않음
YAN-STATE-001-FOLLOWUP 해결 잔여 참조 제거 및 운영·개발 Debug 빌드 성공 P1-T1~T3 완료
YAN-QA-001 외부 조건 대기 11개 화면 전체와 실서버 캔 구매 미검증 P1-GATE [blocked], 테스트 계정·데이터 및 native 조작 환경 필요