# Phase 6 운송장 등록 진입 검증 리뷰 ## 1. 리뷰 정보 | 항목 | 내용 | |---|---| | 리뷰 대상 | Phase 6 / `P6-T1`, `P6-R1` | | 기준 commit 또는 working tree | 미커밋 working tree | | 리뷰 일자 | `2026-10-06` | | 리뷰어 | Sisyphus, Oracle 기능 리뷰, Oracle 정적 UI 리뷰 | | 기준 문서 | `prd.md`, `plan-task.md` | | 리뷰 상태 | 수정 검증 완료 | ## 2. 리뷰 목적과 범위 ### 목적 - 운송장 등록 화면이 상세를 재조회하고 등록 가능 조건을 fail-closed로 판정하는지 확인한다. - 개인정보 경계, guarded navigation, 반응형 너비와 긴 한국어 문구 접근성을 확인한다. ### 포함 범위 - 코드: `SodaLive/Sources/V2/Gift/Tracking/**`, 관련 display policy와 route helper. - 테스트: production ViewModel을 직접 컴파일하는 임시 assertion harness. - 문서: `TRACK-001`, `TRACK-002`, `P6-T1`. - 수동 검증: 소스 기반 상태 전이와 정적 SwiftUI 검토. ### 제외 범위 - `P6-T2` 택배사·운송장 입력 UI와 `P6-T3` 등록 mutation. - 로그인·실서버·시뮬레이터 screenshot·VoiceOver 실행 검증. ## 3. 판정 기준 | 심각도 | 기준 | |---|---| | Blocker | 핵심 흐름 불능, 개인정보 노출 또는 완료 판정 무효 | | High | 확정 요구사항·API 계약 위반 또는 주요 회귀 | | Medium | 제한된 lifecycle·화면 크기·접근성 조건의 기능 문제 | | Low | 비핵심 유지보수성 또는 문서 정합성 문제 | ## 4. 검토한 근거 ### 문서와 코드 - 요구사항: `TRACK-001`, `TRACK-002`. - 계획: `P6-T1`, `P6-R1`. - 코드: `GiftTrackingRegistrationViewModel.swift`, `GiftTrackingRegistrationView.swift`, `GiftDisplayPolicy.swift`, `AppState.swift`, `BaseView.swift`. ### 실행 환경 ```text OS: macOS Xcode SDK: iOS 26.0 대상: generic/platform=iOS, Debug, CODE_SIGNING_ALLOWED=NO Browser/viewport: 해당 없음 ``` ### 실행한 검증 | 명령 또는 수동 검증 | 결과 | 핵심 증거 | |---|---|---| | production ViewModel `swiftc` harness | 성공 | `GREEN assertions: 56` | | `xcodebuild` / `SodaLive-dev` | 성공 | `BUILD SUCCEEDED` | | `xcodebuild` / `SodaLive` | 성공 | `BUILD SUCCEEDED` | | `plutil -lint SodaLive.xcodeproj/project.pbxproj` | 성공 | `OK` | | `swiftc -parse` / `git diff --check` | 성공 | exit code 0 | | Oracle 기능 재리뷰 | 성공 | `APPROVE`, Blocker/High/Medium 없음 | | Oracle 정적 UI 재리뷰 | 성공 | `APPROVED_STATIC`, 차단 항목 없음 | | screenshot·VoiceOver·실서버 | 불가 | 인증 가능한 runtime 미확보 | ## 5. 발견 사항 요약 | ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal | |---|---|---|---|---|---| | `REV-P6-001` | Medium | 수정 완료 | 비활성 중 toast 종료 시 상세 복귀 유실 | `P6-R1` | 완료 | | `REV-P6-002` | Medium | 수정 완료 | 긴 오류 문구에서 재시도 버튼 세로 overflow 가능 | `P6-R1` | 완료 | ## 6. 발견 사항 상세 ### REV-P6-001 — 비활성 중 toast 종료 시 상세 복귀 유실 - **심각도:** Medium - **상태:** 수정 완료 - **관련 요구사항:** `TRACK-001` - **소유 Task:** `P6-R1` **관찰 내용** 비활성 상태에서 toast가 닫히면 `shouldReturnToDetail`이 남아도 기존 `hasAppeared` guard 때문에 재등장 시 callback을 소비하지 못할 수 있었다. **권장 조치와 결과** 모든 appearance에서 최초 조회 guard보다 먼저 `errorToastDidDismiss()`를 호출하고, ViewModel의 guard와 선행 flag 해제로 exactly-once를 유지했다. 수정 후 기능 재리뷰가 승인됐다. ### REV-P6-002 — 긴 오류 문구에서 재시도 버튼 세로 overflow 가능 - **심각도:** Medium - **상태:** 수정 완료 - **관련 요구사항:** `TRACK-002` - **소유 Task:** `P6-R1` **관찰 내용** 서버 오류 문구는 길이 제한이 없지만 오류 분기가 scroll되지 않아 작은 화면·큰 글자에서 재시도 버튼이 화면 밖으로 밀릴 수 있었다. **권장 조치와 결과** 오류 메시지와 재시도 버튼을 기존 스타일 그대로 세로 `ScrollView`에 배치했다. 수정 후 정적 UI 재리뷰가 승인됐다. ## 7. 확정 항목의 plan·goal 전환 - 두 확정 항목을 `plan-task.md`의 완료된 회귀 Task `P6-R1`로 기록했다. ## 8. 리뷰 종료 판정 | 판정 항목 | 결과 | 근거 | |---|---|---| | 리뷰 범위 전체 확인 | 충족 | 코드·문서·검증 결과 대조 | | 후보 항목 판정 완료 | 충족 | 두 Medium 항목 수정 완료 | | 확정 항목 plan 반영 | 충족 | `P6-R1` | | 보류 항목의 담당·재개 조건 기록 | 충족 | 인증 runtime 확보 후 screenshot·VoiceOver·실서버 확인 | | 검증 명령과 결과 기록 | 충족 | 56 assertions, 양 스킴 build, lint·parse·diff check | **최종 결론:** 수정 검증 완료. **남은 항목:** 로그인·실서버·screenshot·VoiceOver 검증은 최종 Gate에서 수행한다. ## 9. 수정 후 검증 기록 ### 1차 수정 검증 — 2026-10-06 - 무엇을: `REV-P6-001`, `REV-P6-002`를 수정했다. - 왜: 화면 lifecycle과 큰 글자에서 상세 복귀·재시도 접근성을 유지하기 위해서다. - 어떻게: - production-source harness — 56 assertions 성공. - `SodaLive-dev`, `SodaLive` generic iOS Debug build — 성공. - Oracle 기능 재리뷰 — `APPROVE`. - Oracle 정적 UI 재리뷰 — `APPROVED_STATIC`. - 남은 항목: 인증 runtime 기반 실제 화면·VoiceOver·실서버 검증.