docs(recommendation): 서브 배너 리뷰와 QA 증거를 보존한다
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# 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 보고서](evidence/gesture-fix/implementation.md), native 로그, test-summary와 frame-analysis.json.
|
||||
- 현재 component와 GREEN snapshot SHA256: `b3e4c5333cf8249ccd7773b5cabd372efb5a5565323bd7778034e110386151fd`, source/snapshot cmp 동일.
|
||||
- baseline actual swipe: 페이지 이동 후 `taps=1;last=1` assertion 실패. 수정본 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](evidence/gesture-fix/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`로 재실행 |
|
||||
|
||||
```bash
|
||||
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초 간격은 유지했다.
|
||||
Reference in New Issue
Block a user