docs(ads): Yandex 광고 제거 요구사항과 검증을 기록한다

This commit is contained in:
Yu Sung
2026-10-13 16:01:15 +09:00
parent 9478565a04
commit 8f51b2a57a
3 changed files with 531 additions and 0 deletions
@@ -0,0 +1,281 @@
# Yandex 광고 잔여 참조 제거 계획
| 문서 항목 | 내용 |
|---|---|
| 상태 | 코드 구현·자동 검증 완료, 수동 QA 외부 조건 대기 |
| 작성일 | 2026-10-13 |
| 요구사항 기준 | [prd.md](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/` 기준):**
```text
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` 소비만 제거한다.
- [x] **RED:** 아래 명령을 배너 참조 0건 수용 검사로 사용한다.
- [x] **RED 확인:** 종료 코드 0과 기존 배너 호출 11건을 확인한다.
- [x] **GREEN:** 배너 및 광고 전용 modifier·광고만 감싼 조건문을 삭제한다. 주변 공용 간격은 유지한다.
- [x] **GREEN 확인:** 같은 명령이 종료 코드 1인지 확인한다.
- [x] **REFACTOR:** 삭제로 생긴 빈 블록만 정리하고 11개 파일을 대조해 관련 없는 변경이 없는지 기록한다.
```bash
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` 유지.
- [x] **RED:** 아래 두 명령을 광고 전용 심볼·enum 부재 검사로 사용한다.
- [x] **RED 확인:** 각 명령이 종료 코드 0으로 현재 참조를 찾는지 확인한다.
- [x] **GREEN:** `showRewardedAdForChatQuota`, `prepareRewardedAdIfNeeded`와 호출, `.ad`, `quotaAdAction`, `rewardedAdLoadFailed`만 제거한다.
- [x] **GREEN 확인:** 두 명령 모두 종료 코드 1인지 확인하고 기존 캔 요청 필드·값을 코드 대조한다.
- [x] **REFACTOR:** 삭제로 발생한 미사용 코드만 정리한다. 구매·오류·로딩·잔액 갱신 로직은 재구성하지 않는다.
```bash
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 초기화와 두 앱 타깃 구성은 유지한다. 신규 인터페이스는 없다.
- [x] **RED:** 아래 명령을 SDK·공용 참조 부재 검사로 사용한다.
- [x] **RED 확인:** 종료 코드 0과 AppDelegate·공용 파일·프로젝트의 잔존을 확인한다.
- [x] **GREEN:** Yandex import·초기화·전용 주석, 공용 파일, 파일 참조·그룹 항목·두 타깃 build-file/Sources 등록을 제거한다.
- [x] **GREEN 확인:** 같은 명령이 종료 코드 1인지 확인하고 두 타깃에 누락 파일 참조가 없는지 확인한다.
- [x] **REFACTOR:** 프로젝트 전체 재직렬화 없이 해당 항목만 정리하고 Gate로 진행한다.
```bash
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`은 유지해야 한다.
```bash
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. 이 계획 단계에서 실행한 결과가 아니다.
- [x] Task 3개의 정적 검사를 재실행한다. 과거 문서·보존 plist·미사용 Pods 리소스 파일은 부재 검사에서 제외한다.
- [x] 보존 파일과 캔 계약, Project Format을 구현 직전 기준선과 대조한다.
- [x] 두 스킴 빌드와 위 문법 검사를 통과한다. 제공되는 파일 진단 도구가 있으면 수정 Swift 파일도 검사한다.
- [ ] 11개 화면의 콘텐츠·스크롤·이동, 광고 전용 빈 공간 제거를 수동 확인한다. 승인된 테스트 계정으로 10캔·20캔 구매의 쿼터·잔액 갱신과 기존 잔액 부족·실패 처리를 확인한다. 운영 비용이 발생하는 검증은 별도 승인 없이는 수행하지 않는다.
- [x] `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가 남아 미완료라는 판정. [리뷰 보고서](reviews/phase1-yandex-reference-removal.md)에 기록했다.
- 정리: 전용 앱 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 조작 환경 필요 |