docs(mypage): 공지 롤링 리뷰와 QA 증거를 보존한다

This commit is contained in:
Yu Sung
2026-10-28 17:16:18 +09:00
parent e0e59e5acf
commit d664448f38
199 changed files with 10167 additions and 0 deletions
@@ -0,0 +1,72 @@
# 마이 탭 공지 롤링 리뷰
## 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를 구분한다.