4.0 KiB
Phase 3: 스와이프 오탭·경계 애니메이션 리뷰
1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 대상 | P3-T1, SB-021/022 |
| 일자 | 2026-10-30 |
| 리뷰어 | Oracle, 단일 독립 읽기 전용 리뷰; 상위 실행자가 판정 기록 |
| 기준 | working tree와 이전 native-final snapshot의 component diff |
| 상태 | APPROVE, 차단 항목 없음 |
2. 목적과 범위
swipe 후 이전 배너 링크 실행과 마지막→첫번째 순간 교체를 확인했다. product 수정은 SubBannerCarousel.swift 하나이며 기존 main carousel, 두 화면 조립, 모델/API/opener는 바꾸지 않았다. native XCTest 하네스·UI tests·실행기와 RED/GREEN·실제 렌더 프레임을 함께 검토했다.
3. 판정 기준
실제 swipe/인식된 짧은 drag/세로 scroll에서 tap callback이 없어야 하고, 정상 탭은 표시 항목에 한 번만 전달되어야 한다. 순환은 같은 방향의 중간 프레임을 가지며 논리 페이지·이미지 비율·탭 ID·목록 교체 안전성을 유지해야 한다.
4. 검토 근거
- 구현·RED/GREEN 보고서, native 로그, test-summary와 frame-analysis.json.
- 현재 component와 GREEN snapshot SHA256:
b3e4c5333cf8249ccd7773b5cabd372efb5a5565323bd7778034e110386151fd, source/snapshot cmp 동일. - baseline actual swipe: 페이지 이동 후
taps=1;last=1assertion 실패. 수정본 actual coordinate tests 11/11 PASS. - baseline 경계 0049→0050 전체 교체와 수정본 automatic0063/manual0029/forward0032 중간 PNG를 reviewer가 직접 읽었다.
5. 발견 사항
확정 차단 결함 없음. APPROVE, 신뢰도 높음(두 결함 범위 한정).
6. 주요 판단
PrimitiveButtonStyle의drag.exclusively(before: TapGesture())로 Button release와 GestureState 초기화 순서에 의존하지 않고 인식을 분리한다..global좌표로 이동하는 라벨의 drag translation 오류를 제거하고 부모 scroll과 simultaneous 참여를 유지한다.- 복제 endpoint identity와 display/logical index를 분리한다. 인접 복제로 애니메이션한 뒤 같은 이미지로만 정렬한다. revision/index guard로 교체·이탈 시 이전 정렬 callback을 무효화한다.
- accessibility Button/activation/adjustable action 및 현재 페이지만 노출하는 처리가 보존됐다. VoiceOver 자체 조작 완료를 의미하지는 않는다.
7. 상위 실행자 재검증
| 실행 | 결과 |
|---|---|
| 명시 simulator ID로 native suite 재실행 | exit0, 11 tests/0 failures/0 skipped, 134.827초; parent-test-summary.json |
전체 work/tests/check-*.sh 순차 루프 |
16개 단일 루프 exit0, 마지막 113 assertions PASS |
| SodaLive / SodaLive-dev Debug simulator build | 각각 exit0, 최종 product hash로 컴파일 |
| 현재 product와 native GREEN snapshot | cmp exit0, SHA 동일 |
| runner bash syntax·명시 환경 실행 | PASS; 임시 UDID 고정 제거, SB_SIMULATOR_ID로 재실행 |
SB_SIMULATOR_ID=<booted-simulator-UUID> \
KINGFISHER_MODULE_PATH=<Debug-iphonesimulator-products> \
bash work/tests/run-sub-banner-gesture-tests.sh
runner가 출력하는 root에는 xcresult/log가 남는다. 증거 확인 뒤 호출자가 해당 root와 테스트 앱만 정리한다. x86_64 simulator와 설치된 Kingfisher 빌드 산출물이 필요한 로컬 검사다.
8. 종료 판정
Oracle APPROVE 후 상위 native suite/전체 checks/양 앱 build 결과를 연결했다. 소유 앱2개 uninstall 및 simulator shutdown/delete, device 경로 부재를 확인했다. 상위 root/cache·임시 note 정리 영수증은 plan에 기록한다.
9. 잔여 검증 범위
실제 input은 iPhone SE3/iOS18.3.1 simulator다. 실기기·외부 서비스/링크 앱 launch·VoiceOver 직접 조작·지연0ms 초고속 재입력은 미검증이다. LSP 도구는 제공되지 않아 실제 컴파일/typecheck/build/test를 사용했다. 기존 API·화면 배치·5초 간격은 유지했다.