# 마이 탭 공지 롤링 리뷰 ## 1. 리뷰 정보 | 항목 | 내용 | |---|---| | 대상 | Phase 1 / working tree, 기준 HEAD `8c08861b34222a9c29bfa2bdaea888d111e37829` | | 일자 | 2026-10-28 | | 리뷰어 | Oracle 코드 리뷰, 독립 native QA, 부모 검증 | | 기준 | `../prd.md`, `../plan-task.md` | | 상태 | 수정 검증 완료 / 코드 APPROVE / 서버 통합 대기 | ## 2. 목적과 범위 최신 공지 배열 계약·기존 상세 동작·제목 확장·0/1/2/3 순환·생명주기 회귀를 검토한다. 서버 구현과 기존 홈은 제외한다. ## 3. 판정 기준 사용자 요구 또는 기존 동작을 깨는 확인된 문제만 차단한다. 전체 앱·실제 터치 검증과 하네스 검증을 구분한다. ## 4. 검토한 근거 - `MyPageView.swift`, `MyPageViewModel.swift`, `NoticeApi.swift`, `NoticeRepository.swift`, `MyPageNoticeRoller.swift`, 공통 응답·기존 상세·두 메인 탭 경로. - 신규 `work/tests/MyPageNoticesCheck.swift`와 runner, 기존 인증 종료 회귀 fixture, 두 앱 타깃 등록. - 부모 실행: 전체 13개 스크립트 PASS. 두 앱 스킴 generic iOS 및 iOS Simulator 빌드 모두 exit 0. - Oracle 직접 실행: 신규 공지·기존 인증 종료 검사 PASS, diff 공백 검사 PASS. - [native QA](evidence/native/README.md): 실제 소스 기반 iPhone SE3 / iOS18.3 화면과 5초 타이머, 36 PNG. S5 실패. 전체 앱/물리 탭 검증 아님. ## 5. 발견 사항 요약 | ID | 심각도 | 상태 | 제목 | 후속 Goal | |---|---|---|---|---| | REV-P1-001 | Medium | 확정 | 배너 외부 padding이 Button 영역 밖으로 이동해 기존 클릭 영역 축소 | P1-R1 | | REV-P1-002 | High | 확정 | inactive에서 한 번 더 진행하고 active 복귀 후 재개하지 않음 | P1-R1 | ## 6. 발견 사항 상세 ### REV-P1-001 `MyPageView.swift`의 Button label 내부에 contentShape가 있지만 기존 좌우24·상하6 padding은 바깥 ZStack에 있다. 기존에는 padding 뒤 contentShape/onTapGesture로 배너 전체를 눌렀다. padding을 label 내부로 옮긴 뒤 contentShape를 적용하여 기존 영역을 복원한다. 실제 좌표 탭은 환경 도구 지원 범위에 따라 별도 판정한다. ### REV-P1-002 `scenePhase` onChange가 전달하는 새 값을 버리고 `restartRollTimer()` 내부에서 캡처된 환경 값을 읽는다. native probe는 inactive/active 변경을 기록했지만 배너 동작은 이전 상태를 따른다. 같은 실패가 matrix, 별도 lifecycle, OS background/복귀 bridge에서 재현됐다. 새 phase를 직접 타이머 재시작 판단에 전달하는 최소 변경을 우선 검증한다. Reduce Motion 변경도 새 값을 사용해야 하는지 함께 확인한다. ## 7. plan·goal 전환 두 항목을 코드 변경 전에 `plan-task.md`의 P1-R1로 등록했다. 기존 실패 증거를 보존하고 새 캡처·실행 결과를 별도로 누적한다. ## 8. 최종 판정 현재 REQUEST_CHANGES. API·배열·본문/date·기존 목록 보존은 확인됐으나 위 회귀 수정이 필요하다. 실서버 공개 GET 401은 별도 외부 통합 차단 조건이다. ### 후속 판정 — 2026-10-28 - **APPROVE:** Oracle 재리뷰에서 REV-P1-001/002 모두 해결, 추가 확정 제품 코드 차단 사항 없음. 위 REQUEST_CHANGES는 최초 판정 기록으로 보존한다. - 배너 padding이 label 안에서 contentShape 앞에 적용돼 기존 영역의 소유권이 복원됐다. scenePhase/Reduce Motion의 새 값을 타이머 재시작 함수에 직접 전달한다. - [수정 후 native 증거](evidence/native-fix/README.md): 리뷰어가 핵심 25장을 직접 확인하여 하네스 범위 시각 PASS. 0/1/2/3 순환, 한글 말줄임·화살표, inactive 유지·active 재개·OS 복귀·remount·축소를 확인했다. - 부모 최종 검증: 전체 13개 검사 PASS, `SodaLive`/`SodaLive-dev` 각각 iOS·Simulator 빌드 exit 0. 리뷰 중 남아 있던 dev simulator 실행도 이후 exit 0으로 완료했다. 최종 제품 소스 해시는 `7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02`와 일치한다. - QA worker 서비스 연결 실패 후 fallback이 동일 소스로 [별도 재실행](evidence/native-fix/rerun-154222/README.md)을 마쳤다. 제품 수정 없이 추가 확인했으며 기존 RED/승인 대상 증거는 보존했다. - 부모가 프로세스 부재·booted simulator 없음·모든 알려진 소유 TMP 부재를 확인했다. [정리 영수증](evidence/native-fix/cleanup.json). - **미검증:** 실제 좌표 탭/가장자리 hit-testing, 전체 앱 상세 이동, VoiceOver·Reduce Motion 런타임, 실기기/iOS16.6, LSP(도구 미제공). 코드·하네스 승인을 전체 E2E 승인으로 확대하지 않는다. - **외부 출시 조건:** 신규 API 무인증 GET의 HTTP 200·실제 payload 확인이 필요하다. 현재 테스트 서버는 401이며 클라이언트 fallback이나 공통 인증 변경은 하지 않았다. ### P1-T2 후속 UI 보완 — 2026-10-28 - 사용자가 계약·정상 동작·롤링 정상 확인을 전달했다. 위 401 외부 확인 대기는 사용자 확인으로 해소하며 과거 측정 기록만 보존한다. - 사용자 추가 요청에 따라 화살표·버튼은 고정하고 제목만 전환한다. 변경은 `UpdateBannerView`의 제목 ZStack과 id/transition 위치로 한정했다. - 독립 리뷰 **APPROVE**, 확정 발견 사항 없음. 전체 padded hit area·현재 항목 callback·5초 타이머·생명주기·Reduce Motion 경로를 유지했다. - [native 비교판](evidence/title-only/banner-contact-sheet.png)에서 실제 wrap 중간 제목 이동과 고정 화살표 확인. 부모 비교 스크립트 재실행 exit 0, 10개 프레임 화살표 변경 픽셀 0. 중간 전환 이전에 찍힌 `two-mid`는 중간 동작 증거에서 제외하고 `wrap-mid`를 사용했다. - 부모 검증: 회귀 스크립트 13개 PASS, `SodaLive-dev` iOS Simulator 빌드 exit 0, diff 공백 검사 PASS. 제품 SHA-256 `af77569942c0bbdbad0242431362b5987dc278d8f70d015ccc1ef675b2b264ed`. - 물리 탭·전체 상세 이동·VoiceOver/Reduce Motion 런타임 재검증은 이번 범위에서 생략했다. 하네스 렌더링·픽셀 비교와 전체 E2E를 구분한다.