Files
sodalive-ios/docs/20261028_마이_탭_공지사항_롤링/reviews/phase1-my-page-notices.md
T

6.2 KiB

마이 탭 공지 롤링 리뷰

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: 실제 소스 기반 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 증거: 리뷰어가 핵심 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이 동일 소스로 별도 재실행을 마쳤다. 제품 수정 없이 추가 확인했으며 기존 RED/승인 대상 증거는 보존했다.
  • 부모가 프로세스 부재·booted simulator 없음·모든 알려진 소유 TMP 부재를 확인했다. 정리 영수증.
  • 미검증: 실제 좌표 탭/가장자리 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 비교판에서 실제 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를 구분한다.