# Phase 11 선물 링크·크리에이터 표시 코드 리뷰 ## 1. 리뷰 정보 | 항목 | 내용 | |---|---| | 리뷰 대상 | Phase 11 / `P11-T1`~`P11-T3`, `P11-GATE` | | 기준 commit 또는 working tree | `main` working tree의 미커밋 변경 | | 리뷰 일자 | `2026-10-08` | | 리뷰어 | Oracle 기능 리뷰, Oracle 정적 시각 리뷰 2개 | | 기준 문서 | `docs/20261006_선물_UI_추가/prd.md`, `docs/20261006_선물_UI_추가/plan-task.md` | | 리뷰 상태 | 코드·정적 판정 완료, 인증 runtime 시각 검증 대기 | ## 2. 리뷰 목적과 범위 ### 목적 - `COMMON-006`, `COMMON-007`, `SEND-008`, `GIFT-004` 구현이 승인된 요구사항과 기존 선물 흐름을 보존하는지 확인한다. - RED/GREEN 기록, focused 회귀, 양 스킴 build와 실제 변경이 일치하는지 확인한다. ### 포함 범위 - 코드: `AppDeepLinkHandler`, 선물 route, CreatorChannel action/header, `GiftSendView`, `GiftAgreementRow`, `GiftConstants`. - 테스트: `AppDeepLinkGiftDetailCheck.swift`, `check-gift-phase11.sh`, 기존 Gift focused checks. - UI: 선물 버튼 구조와 asset, 선물 보내기 수신자 프로필의 정적 SwiftUI 구조. ### 제외 범위 - 인증 계정이 필요한 실제 크리에이터 채널·선물 보내기 화면 캡처와 VoiceOver 실행. - API 계약, 선물 제출 payload, 기존 Talk/DM 디자인 변경. ## 3. 판정 기준 - Blocker/High: 확정 요구사항 위반, 핵심 이동 불능, 기존 약관·API·개인정보 경계 회귀. - Medium: 제한 조건의 기능·접근성·레이아웃 결함. - Low: 비핵심 유지보수성 또는 문서 정합성 문제. ## 4. 검토한 근거 ### 문서와 코드 - 요구사항: `COMMON-006`, `COMMON-007`, `SEND-008`, `GIFT-004`. - 계획: `P11-T1`, `P11-T2`, `P11-T3`, `P11-GATE`. - 코드: `SodaLive/Sources/App/**`, `SodaLive/Sources/ContentView.swift`, `SodaLive/Sources/V2/CreatorChannel/**`, `SodaLive/Sources/V2/Gift/**`의 Phase 11 변경. - 테스트: `work/tests/AppDeepLinkGiftDetailCheck.swift`, `work/tests/check-gift-phase11.sh`와 직접 영향 회귀. ### 실행 환경 ```text OS: macOS Xcode: 현재 xcodebuild 기본 toolchain Build destination: generic/platform=iOS Signing: CODE_SIGNING_ALLOWED=NO Runtime capture: 인증 실행 환경 부재로 미수행 ``` ### 실행한 검증 | 명령 또는 수동 검증 | 결과 | 핵심 증거 | |---|---|---| | `bash work/tests/check-app-deep-link-gift-detail.sh` | 성공 | `PASS AppDeepLinkGiftDetailCheck assertions=22` | | `bash work/tests/check-gift-phase11.sh` | 성공 | profile, policy, button 3개 mode PASS | | Gift address/contact/recipient/received/decoding focused checks | 성공 | address 15, contact 80, recipient 280, decoding 22 assertions 및 source checks PASS | | `xcodebuild ... -scheme SodaLive-dev ... build` | 성공 | `BUILD SUCCEEDED` | | `xcodebuild ... -scheme SodaLive ... build` | 성공 | `BUILD SUCCEEDED`; 기존 Crashlytics dSYM·dependency scan warning 유지 | | `bash -n work/tests/check-gift-phase11.sh`, `git diff --check` | 성공 | 출력 없음, exit 0 | | 인증 화면 screenshot·VoiceOver | 불가 | 인증된 실행 상태와 화면 캡처 부재 | ## 5. 발견 사항 요약 확정 발견 사항 없음. - 기능 리뷰: `APPROVE`, Critical/Important/Minor 없음. - 정적 시각 리뷰: SwiftUI 구조, design token 재사용, 38pt 원형 프로필, 20pt icon, 검정 문구·흰 capsule, 접근성 이미지 제외를 승인했다. - 증거 공백: 좁은 화면·접근성 글꼴에서 세 버튼 동시 표시, 실제 이미지 로딩, 링크 이동, VoiceOver는 runtime 증거가 없어 시각 QA 완료 판정을 보류했다. ## 6. 발견 사항 상세 확정된 제품 결함 없음. 정적 리뷰가 제기한 버튼 폭·Dynamic Type 항목은 실제 재현이 없는 위험 후보이므로 추정 수정하지 않는다. 인증 실행 환경에서 재현될 때만 별도 review ID와 회귀 Task를 만든다. ## 7. 확정 항목의 plan·goal 전환 전환 항목 없음. ## 8. 리뷰 종료 판정 | 판정 항목 | 결과 | 근거 | |---|---|---| | 리뷰 범위 전체 확인 | 충족 | 관련 diff, source contract, focused checks, 양 스킴 build 검토 | | 후보 항목 판정 완료 | 충족 | 제품 결함 미확정, runtime 증거 공백으로 분리 | | 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 | | 보류 항목의 담당·재개 조건 기록 | 충족 | 인증 실행 환경 확보 후 screenshot·VoiceOver 재검증 | | 검증 명령과 결과 기록 | 충족 | §4 및 `plan-task.md` Progress | **최종 결론:** 코드·정적 Gate 승인, 인증 runtime 시각 Gate 대기. **남은 항목:** 양 scheme 실제 딥링크, 파손 정책 링크 탭, 프로필 이미지 로딩, 좁은 화면·Dynamic Type 버튼 배치와 VoiceOver 확인. ## 9. 수정 후 검증 기록 확정 수정 항목 없음. Gate 검토 중 계획에 있던 경로형 신청번호 누락 거부와 splash pending coverage를 harness에 보강했고 22 assertions로 재검증했다.