diff --git a/docs/20261006_선물_UI_추가/reviews/phase6-tracking-entry-validation.md b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-entry-validation.md new file mode 100644 index 00000000..3ffe900b --- /dev/null +++ b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-entry-validation.md @@ -0,0 +1,140 @@ +# 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·실서버 검증. diff --git a/docs/20261006_선물_UI_추가/reviews/phase6-tracking-input-ui.md b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-input-ui.md new file mode 100644 index 00000000..7a4c89fe --- /dev/null +++ b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-input-ui.md @@ -0,0 +1,46 @@ +# Phase 6 운송장 입력 UI 리뷰 + +## 1. 리뷰 정보 + +| 항목 | 내용 | +|---|---| +| 리뷰 대상 | Phase 6 / `P6-T2` | +| 기준 commit 또는 working tree | working tree | +| 리뷰 일자 | 2026-10-07 | +| 리뷰어 | 기능 Oracle, 정적 UI Oracle | +| 기준 문서 | `prd.md`, `plan-task.md` | +| 리뷰 상태 | 판정 완료 | + +## 2. 리뷰 목적과 범위 + +- 신청 요약, 주소, 입력 상태, 안내와 bottom action bar가 `P6-T2` 범위와 개인정보 경계를 지키는지 확인한다. +- 등록·취소 mutation은 `P6-T3` 범위이므로 제외한다. +- 로그인·실서버·실기기 screenshot·VoiceOver 검증은 현재 실행 환경에서 제외한다. + +## 3. 검토한 근거 + +- 코드: `GiftTrackingRegistrationView.swift`, `GiftTrackingRegistrationViewModel.swift`, `GiftCourierPickerView.swift`, `GiftConstants.swift`, `project.pbxproj` +- focused 검증: 실제 production ViewModel harness 71개 assertion 성공 +- build: `SodaLive-dev`, `SodaLive` generic iOS Debug build 성공 +- 정적 검증: `plutil -lint`, Swift parse, `git diff --check` 성공 + +## 4. 발견 사항 요약 + +확정 제품 발견 사항 없음. + +Figma node `2481:19066`, `2481:19109`는 2026-10-07 재조회 시 활성 Figma 문서에서 찾을 수 없어 fresh 원본 대조 증거를 만들지 못했다. 소스 정적 검토에서는 반응형 폭, 한국어 가변 높이, native `Menu`·`TextField`, keyboard dismissal과 접근성 label을 확인했으며 코드 수정 blocker는 발견되지 않았다. + +## 5. plan·goal 전환 + +전환 항목 없음. + +## 6. 리뷰 종료 판정 + +| 판정 항목 | 결과 | 근거 | +|---|---|---| +| 기능 범위 전체 확인 | 충족 | 기능 Oracle `APPROVE` | +| 확정 항목 plan 반영 | 해당 없음 | 확정 제품 발견 사항 없음 | +| 검증 명령과 결과 기록 | 충족 | 71 assertions, 양 스킴 build 및 정적 검사 성공 | +| fresh Figma·runtime visual QA | 미충족 | Figma 활성 문서와 인증 가능한 런타임 부재 | + +**최종 결론:** 기능 구현 승인. fresh Figma·runtime visual QA는 최종 Gate의 증거 공백으로 유지한다. diff --git a/docs/20261006_선물_UI_추가/reviews/phase6-tracking-mutations.md b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-mutations.md new file mode 100644 index 00000000..45e1e7ae --- /dev/null +++ b/docs/20261006_선물_UI_추가/reviews/phase6-tracking-mutations.md @@ -0,0 +1,49 @@ +# Phase 6 운송장 mutation 리뷰 + +## 1. 리뷰 정보 + +| 항목 | 내용 | +|---|---| +| 리뷰 대상 | Phase 6 / `P6-T3` | +| 기준 commit 또는 working tree | working tree | +| 리뷰 일자 | 2026-10-07 | +| 리뷰어 | 기능 Oracle | +| 기준 문서 | `prd.md`, `plan-task.md` | +| 리뷰 상태 | 판정 완료 | + +## 2. 리뷰 목적과 범위 + +- 운송장 validation·등록과 확인된 신청 취소가 기존 API 계약을 사용하고 상호 중복되지 않는지 확인한다. +- 성공 후 로컬 상태를 만들지 않고 동일 신청번호 상세 route로 guarded replace한 뒤 서버 상세를 재조회하는지 확인한다. +- 인증 실서버와 실제 기기의 toast·alert·navigation 조작은 현재 실행 환경에서 제외한다. + +## 3. 검토한 근거 + +- 코드: `GiftTrackingRegistrationViewModel.swift`, `GiftTrackingRegistrationView.swift`, `GiftRepository.swift`, `GiftApi.swift`, `AppState.swift` +- RED: P6-T3 API 부재 compile 실패와 `.trackingRegistered` 취소 허용 assertion 실패를 확인 +- GREEN: `GiftTrackingRegistrationCheck` 62개 assertion 성공 +- build: `SodaLive-dev`, `SodaLive` generic iOS Debug build 성공 +- 정적 검증: Swift parse, `plutil -lint`, `git diff --check` 성공 + +## 4. 발견 사항 요약 + +확정 발견 사항 없음. + +초기 구현 검토 중 `.received`가 아닌 상태에서도 `canCancel`이 참이 될 수 있는 누락을 확인했으며, production 수정 전에 focused RED를 추가한 뒤 `summary.status == .received` 조건으로 수정하고 62개 전체 assertion을 재실행했다. + +## 5. plan·goal 전환 + +전환 항목 없음. + +## 6. 리뷰 종료 판정 + +| 판정 항목 | 결과 | 근거 | +|---|---|---| +| validation·request mapping | 충족 | 택배사 표시명 보존, 운송장 양끝 공백 제거 | +| 등록·취소 중복 차단 | 충족 | 단일 `isSubmitting` lock과 완료 latch | +| 확인 이후 취소 | 충족 | destructive alert action만 `confirmCancel()` 호출 | +| 성공 후 최신 상세 | 충족 | guarded replace, 거부 시 GET 복구, 로컬 status 미생성 | +| focused test·build | 충족 | 62 assertions, 양 스킴 `BUILD SUCCEEDED` | +| 인증 runtime 검증 | 미충족 | 로그인·실서버 환경 부재 | + +**최종 결론:** 코드와 compile/build 범위에서 승인. 인증 runtime 검증은 Phase 6 Gate의 잔여 항목으로 유지한다.