docs(recommendation): 서브 배너 요구사항과 검증 기록을 남긴다
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# 추천 서브 배너 구현 계획
|
||||
|
||||
| 항목 | 내용 |
|
||||
|---|---|
|
||||
| 상태 | 후속 제스처·순환 수정 및 시각적 카운트 제거 검증 완료 |
|
||||
| 작성일 | 2026-10-29 |
|
||||
| 요구사항·API 기준 | [prd.md](prd.md), 사용자 제공 구현 완료 API 계약 |
|
||||
| 현재 Phase | Phase 4 완료 |
|
||||
| 실행 방식 | 현재 작업 트리, worktree 없음, 단일 구현자와 독립 최종 리뷰 |
|
||||
|
||||
## 목표와 범위
|
||||
두 추천 화면이 기존 추천 GET의 서브 배너 전체를 지정 위치에서 원본 비율로 자동 전환하며 안전한 iOS/웹 링크를 실행한다. 기존 메인 배너와 기타 추천 콘텐츠는 유지한다.
|
||||
|
||||
**기술:** Swift 5, iOS 16.6+, SwiftUI, Combine, Moya, 기존 Kingfisher. 새 의존성 없음.
|
||||
|
||||
**제약:** 별도 endpoint/query/두 번째 추천 요청 없음. 서버 순서·기간 판단 보존. 빈 목록 컴포넌트 자체 미표시. 5초 전환, 현재 이미지 비율 높이, 좌우 padding 0. 기존 메인 배너의 20개 제한과 정사각형 형식을 수정하지 않는다. fixture는 명시 실행에 한정한다. 원문 URI 변경·다른 OS 링크 실행 금지. 공유 인증 plugin은 수정하지 않는다.
|
||||
|
||||
## 현재 상태
|
||||
| Phase | 상태 | 완료 Task | 다음 Goal | 남은 조건 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 완료 | 1/1 | 없음 | 없음 |
|
||||
| 2 | 완료 | 2/2 | 없음 | physical input·실서비스·전체 앱 UI는 공개된 미검증 범위 |
|
||||
| 3 | 완료 | 1/1 | 없음 | 실기기·VoiceOver 자체 조작은 미검증 |
|
||||
| 4 | 완료 | 1/1 | 없음 | 시각적 삭제 범위의 UI typecheck·native 2개·PNG 확인 |
|
||||
|
||||
## Phase 1: 두 추천 화면 통합
|
||||
**결과:** 앱에서 서브 배너가 표시되고 기존 요청·화면·오류 정책을 보존한다.
|
||||
**선행조건:** PRD DEC-007~008 반영 완료.
|
||||
|
||||
### Task 1.1 통합 계약과 캐러셀 구현
|
||||
**Goal P1-T1:** 기존 추천 응답을 통해 두 화면의 서브 배너와 안전한 탭 흐름을 제공한다.
|
||||
|
||||
**Files:**
|
||||
- Create: `SodaLive/Sources/V2/Component/Banner/SubBanner.swift`, `SubBannerLinkOpener.swift`, `SubBannerCarousel.swift`.
|
||||
- Modify: `SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift`, `Repository/MainHomeRecommendationApi.swift`, `MainHomeRecommendationViewModel.swift`, `MainHomeRecommendationView.swift`.
|
||||
- Modify: `SodaLive/Sources/V2/Main/Content/Recommendation/Models/AudioRecommendationsResponse.swift`, `Repository/MainContentRecommendationApi.swift`, `MainContentRecommendationViewModel.swift`, `MainContentRecommendationView.swift`.
|
||||
- Modify: `SodaLive.xcodeproj/project.pbxproj` (신규 production 파일 두 앱 target membership만).
|
||||
- Test: `work/tests/SubBannerCheck.swift`, `work/tests/check-sub-banners.sh`; native QA는 같은 tests 또는 작업 소유 임시 harness로 작성한다.
|
||||
|
||||
**Interfaces:**
|
||||
- `SubBanner`: `Int` id, placement enum, imageUrl 및 nullable webUrl/androidDeepLink/iosDeepLink 그대로 디코딩. 날짜 필드 없음.
|
||||
- 두 추천 DTO의 `subBanners: [SubBanner]` 및 화면별 유효 목록. 입력 순서 보존, 콘텐츠 `isEmpty`에 유효 서브 배너 포함.
|
||||
- `SubBannerLinkOpener.open(_:using:)`: URL과 completion을 받는 opener를 주입하여 iOS 우선/웹 1회 대체. 실제 앱에서는 `UIApplication.open` completion 사용.
|
||||
- `SubBannerCarousel(items:onTap:)`: 전체 목록, 실제 이미지 비율, 현재 컨테이너 너비, 5초 자동 전환, swipe, 기존 page count. 빈 목록일 때 부모에서 삽입하지 않는다.
|
||||
|
||||
**실행 체크리스트:**
|
||||
- [x] **RED:** 기존 EventDetailCheck의 production API/repository/VM + Moya double/native Combine 패턴으로 두 응답·정수 경계·URL·헤더·상태·링크 시도 횟수 테스트 작성.
|
||||
- [x] **RED 확인:** `bash work/tests/check-sub-banners.sh`에서 미구현 기능에 의한 실패를 기록.
|
||||
- [x] **GREEN:** DTO와 유효성/순서/placement 필터, 두 GET 익명 헤더, 두 VM HTTP200 검증, 기존 실패 UI 유지, completion 기반 opener 구현.
|
||||
- [x] **GREEN:** 공통 캐러셀과 두 화면 통합. 홈 active creators 뒤, 콘텐츠 main banner와 exclusive series 사이, s24. 목록 교체/축소 시 안전한 index, 사라짐·inactive 시 timer 중지, 늦은 이미지 응답이 다른 현재 항목 높이를 바꾸지 않게 처리.
|
||||
- [x] **GREEN 확인:** 동일 집중 checks 통과. 이미지 처음 로딩은 임의 비율을 만들지 않고 실제 로드가 높이 0에 막히지 않게 한다.
|
||||
- [x] **REFACTOR:** 이번 코드의 중복만 점검, focused checks와 관련 기존 회귀 실행. 필요 없는 state abstraction/새 인프라는 만들지 않는다.
|
||||
|
||||
**완료 증거:** 집중 검사 로그와 변경 diff, 두 target membership, 다음 Phase의 실제 native 렌더.
|
||||
|
||||
## Phase 2: 검증과 리뷰
|
||||
### Task 2.1 검증 Gate
|
||||
**Goal P2-GATE:** 요구 동작과 기존 회귀를 실제 실행 증거로 확인한다.
|
||||
**선행조건:** P1-T1 코드 구현과 집중 테스트 통과.
|
||||
**Files:** `work/tests/check-*.sh`, 앱 workspace/두 scheme, 이 계획, `reviews/phase1-sub-banner-integration.md`, `reviews/evidence/`.
|
||||
**TDD 예외:** 검증·리뷰 작업은 새 제품 로직이 아니며 기존 tests/native surface로 증명한다.
|
||||
|
||||
| 시나리오 | 이진 통과 기준 | 검증 surface |
|
||||
|---|---|---|
|
||||
| API/익명/오류 | 실제 두 GET만 호출, 익명 Authorization 없음, 로그인 보존, 비200/false/transport 오류가 빈 성공 아님 | production API/repository/VM을 컴파일한 CLI checks |
|
||||
| 목록/정밀도 | Int.max 및 >2^53 보존, 21개 이상 전체 순서 유지, placement 격리, sub-banner-only 콘텐츠 표시 | production DTO/filter CLI checks + native 화면 |
|
||||
| URI/실패 격리 | 원문 동일, iOS 성공 웹0회/실패 웹1회, Android0회, 금지 scheme0회, 양쪽 실패 비치명 | production opener driver |
|
||||
| 배치/비율/empty | 양쪽 지정 위치+s24, 전체 폭, 서로 다른 원본 비율 높이, empty 추가 gap0 | 실제 SwiftUI native harness PNG/geometry, production source 사용 |
|
||||
| 자동/생명주기/이미지 | 실제 5초 전환·순환, 단일 고정, 목록 교체 안전, 이미지 실패가 다른 추천 콘텐츠에 영향 없음 | native harness와 focused state checks |
|
||||
| 인접 회귀 | 기존 main banner 변경 없음, follow 헤더 유지, 기존 checks 통과, 양 앱 build 성공 | diff + 전체 local checks + xcodebuild |
|
||||
|
||||
- [x] 집중 검사와 전체 `work/tests/check-*.sh` 실행. 상위 실행자가 16개 스크립트 한 루프 exit 0 확인.
|
||||
- [x] 양 앱 Debug x86_64 시뮬레이터 빌드 exit 0. generic clean build는 tool timeout 후 소유 simulator destination과 기존 cache로 전환. 상세 명령은 parent-verification.md.
|
||||
- [x] 실제 native 화면 캡처/상태 변화 확인. 실제 production View composition + 명시 주변 대역 harness, worker 42장 및 parent 직접 smoke. physical tap/swipe·실서비스·전체 앱 UI 통합은 미검증으로 구분.
|
||||
- [x] 변경 Swift parse/typecheck/build 진단. LSP 도구 미제공, 실제 대체 검증 결과만 기록.
|
||||
- [x] 단일 독립 리뷰 및 delta 재검토 APPROVE. REV-P1-001을 P2-R1로 보완하고 해소 판정 기록.
|
||||
- [x] QA 프로세스·앱·소유 임시 device/cache/root 정리 및 부재 영수증 확인. 공유 cache/device는 삭제하지 않음.
|
||||
|
||||
### Task P2-R1: REV-P1-001 현재 소스와 검증 증거 연결
|
||||
**시작 조건:** [리뷰 REV-P1-001](reviews/phase1-sub-banner-integration.md)의 소스 해시 불일치 확인.
|
||||
**Goal:** 현재 캐러셀 소스와 최신 native 실행·build 증거를 동일 버전으로 연결한다.
|
||||
**Files:** production `SubBannerCarousel.swift`는 읽기 전용; `reviews/evidence/native-final/**`, `reviews/phase1-sub-banner-integration.md`, 이 계획만 갱신.
|
||||
**TDD 예외:** 제품 수정이 아닌 실행 증거 보완. 기존 tests/실제 native matrix 재실행으로 대체.
|
||||
- [x] 기존 소스 대비 제스처 변경 범위와 현재 hash를 리뷰 §9에 기록한다. 전체 snapshot은 최신 native evidence에 포함한다.
|
||||
- [x] 현재 production 소스로 native matrix를 재실행하고 같은 hash의 캡처·geometry·cleanup 증거를 `reviews/evidence/native-final/`에 기록한다. 상위 실행자가 현재 소스와 snapshot을 cmp하여 동일성도 확인했다.
|
||||
- [x] 현재 hash로 SodaLive build와 집중 체크 exit0 재확인. SodaLive-dev는 최종 소스 변경 이후 exit0 기록 보존.
|
||||
- [x] 같은 독립 reviewer의 delta 재검토: REV-P1-001 ADDRESSED, APPROVE, 남은 차단 항목 없음.
|
||||
|
||||
## 사전 계획 대조표
|
||||
| 대상 | 검토 결과 |
|
||||
|---|---|
|
||||
| P1 내부 DTO → UI/opener | 같은 SubBanner 모델, 서버 필드는 추가 추정 없음. enum은 사용자 계약을 따른다. |
|
||||
| P1 → P2 | 실제 production 코드·native surface 검증, 소스 문자열 검사만으로 동작 PASS 하지 않음. |
|
||||
| P1 단독 | 기존 배너 이동·20개 cap 재사용·공통 인증 수정 없음. |
|
||||
| P2 단독 | 도구 부재와 실제 실패를 구별하며 fake PASS 금지. |
|
||||
|
||||
## Progress / 검증 기록
|
||||
- 2026-10-29: 사용자 후속 승인과 기존 코드/plan agent 검토에 근거해 계획 작성. worktree 없음.
|
||||
- 기존 `check-event-detail.sh`: PASS. 전체 baseline 루프는 첫 4개 스크립트 통과 후 120초 tool timeout으로 중단됐으며 테스트 실패로 판정하지 않음. 최종 전체 실행은 더 긴 timeout 사용.
|
||||
- 구현 기준 결정: 기존 page count/swipe와 회색 placeholder 계열, 단일 항목 timer 없음. 최초 치수 미확인 시 임의 비율 없음. 현재 항목 원본 비율 확정 시 높이 변경.
|
||||
- 정상 운영 코드에 QA fixture fallback을 넣지 않는다. native harness용 코드가 필요하면 tests/소유 임시 root에 제한한다.
|
||||
- 상위 실행자 검증: [parent-verification.md](reviews/evidence/parent-verification.md). 집중 검사·전체16개 check 스크립트 단일 루프·두 앱 빌드 exit0, native smoke 직접 실행. 상세 native geometry와 timing은 [native/README.md](reviews/evidence/native/README.md). 독립 리뷰 진행 중.
|
||||
- 2026-10-29 P1-T1: 프로덕션 두 API/repository/VM을 실제 Combine으로 컴파일한 검사에서 익명 GET Authorization 및 HTTP 201 성공 처리의 RED를 확인한 뒤 수정했다. `bash work/tests/check-sub-banners.sh` GREEN, `bash work/tests/check-sub-banners.sh --ui`에서 실제 설치된 Kingfisher 및 theme/font를 사용한 iOS 16.6 simulator 타입 검사 PASS. 신규 3개 파일의 두 앱 Sources membership을 파싱해 각각 정확히 1회 확인했다.
|
||||
- 2026-10-29 P1 회귀: 전체 `work/tests/check-*.sh` 루프는 15개 PASS 후 마지막 `check-user-creator-chat-date-presentation.sh`에서 600초 도구 제한으로 종료됐다. 해당 스크립트 분리 재실행은 113 assertions PASS. 합계 16개 스크립트 PASS이며 단일 전체 루프 완주로 표현하지 않는다.
|
||||
- P1 구현 증거: [reviews/evidence/implementation.md](reviews/evidence/implementation.md). 높이 0의 초기 로드는 Kingfisher `startLoadingBeforeViewAppear()`로 시작하며 URL별 실측 비율만 저장한다. 캐러셀 렌더·swipe·5초 전환·생명주기 실동작은 다음 Phase의 native QA 대상이다. 이 체크 완료는 앱 빌드/native QA/독립 리뷰 완료를 뜻하지 않는다.
|
||||
- 2026-10-30 P2-R1: 최신 native 42장과 snapshot/hash 불변, 기존 evidence 미변경 확인. 현재 캐러셀과 snapshot cmp PASS, 최종 SodaLive build log BUILD SUCCEEDED 확인. 동일 reviewer에게 증거 정합성 delta만 재검토 요청했다.
|
||||
- 소유 simulator `482F7827-2E3A-4559-BAF4-48B68CC5725B` shutdown/delete 후 device 디렉터리 부재 확인: `Owned simulator teardown: PASS`. 각 QA worker own app/PID/root도 정리 영수증 보유. 상위 root의 리뷰 로그만 재검토 종료까지 보존한다.
|
||||
- 2026-10-30 종료: 독립 재검토 APPROVE. 상위 run root/cache와 소유 simulator 부재 검사 `Owned run root/cache and simulator absent: PASS`, 임시 메모 삭제 완료. 지속 기록은 이 문서·리뷰·native-final 증거에 남겼다. worktree/commit/push 없이 현재 작업 트리에 변경을 보존한다.
|
||||
|
||||
## Phase 3: 스와이프 오탭 회귀 수정
|
||||
### Task P3-T1: 드래그와 탭 인식 분리 및 연속 순환
|
||||
**Goal:** 실제 드래그는 페이지 전환/세로 스크롤만 수행하고, 정상 탭만 현재 배너 링크를 한 번 실행한다. 끝→처음도 일반 전환과 같은 방향으로 연속 슬라이드한다.
|
||||
**시작 조건:** 사용자 스와이프 오탭 보고, PRD SB-021.
|
||||
**Files:**
|
||||
- Modify: `SodaLive/Sources/V2/Component/Banner/SubBannerCarousel.swift` (공통 원인 한 곳만).
|
||||
- Test: `work/tests/SubBannerGestureHarness.swift`, `work/tests/SubBannerGestureUITests.swift`, `work/tests/run-sub-banner-gesture-tests.sh` 또는 같은 범위의 최소 native XCTest 진입점.
|
||||
- Evidence: `reviews/evidence/gesture-fix/**`, `reviews/evidence/gesture-fix/implementation.md`.
|
||||
- 두 추천 View 호출부, 기존 `BannerCarousel.swift`, DTO/API/opener는 변경하지 않는다.
|
||||
|
||||
**확인된 코드/가설:** `@GestureState isSwiping`은 드래그 종료/취소 시 초기화된다. Button과 simultaneousGesture는 함께 인식되므로 Button action 시점의 guard가 그 이전 드래그를 기억하지 못할 수 있다. 기존 main carousel의 지연 state 초기화는 참고하되 임의 시간 지연을 새 해결책으로 추가하지 않는다.
|
||||
|
||||
- [x] **RED:** 실제 production 캐러셀과 로컬 fixture를 사용하는 작은 native app + XCTest UI test 구성. 설치된 xcodeproj gem으로 임시 project를 생성하며 production project에는 test infrastructure를 추가하지 않는다.
|
||||
- [x] **RED 확인:** 좌표 drag 후 `onTap` 횟수 0 조건이 실패함을 확인한다. 도구/빌드 실패를 RED로 계산하지 않는다.
|
||||
- [x] **GREEN:** 테스트로 확인된 제스처 경합을 최소 수정한다. 선택지는 native tap/drag 상호 배제이며 vertical ScrollView를 빼앗는 highPriority만의 변경이나 고정 지연 억제는 통과 검증 없이 채택하지 않는다. 접근성 버튼 action 유지.
|
||||
- [x] **GREEN 확인:** 같은 실제 touch tests로 좌우/wrap/짧은 드래그 callback0, 정상·직후 탭 현재 ID 1회, 세로 scroll, 단일 항목을 확인한다. 자동 timer가 입력 검사를 오염시키지 않게 harness fixture만 명시 제어하고 production 5초 코드는 바꾸지 않는다.
|
||||
- [x] **RED/GREEN 경계 전환:** 기존 무애니메이션 경계 분기를 native 전환 프레임으로 확인한다. 기존 main carousel의 경계 복제/정렬 패턴을 적용하되 원본 비율과 실제 페이지/클릭 대상 매핑을 보존한다. 수동 양방향 wrap과 실제5초 자동 wrap의 중간·종료 프레임, 목록 변경/화면 이탈 시 지연 정렬 안전성을 검증한다.
|
||||
- [x] **REFACTOR:** 이번 변경만 정리하고 `check-sub-banners.sh`, `--ui`, 독립 native app/UI-test build를 검증한다. 전체 관련 앱 build는 사용자 지시에 따라 상위 실행자 소유로 남긴다.
|
||||
- [x] **Gate(이번 위임 범위):** 현재 소스 해시 연결, 소유 QA app/root/cache 정리, 실제 실행/미실행 범위 기록. 빌린 simulator는 유지한다. 단일 독립 리뷰는 사용자 명시 no-agents 지시에 따라 미실행이며 상위 확인 대상으로 구분한다.
|
||||
- [x] **최종 Gate:** 상위 실행자가 native11개·기존16개 check·양 앱 build를 재검증했다. 독립 리뷰 APPROVE. 앞 문장의 no-agents는 구현자에게 내린 하위 위임 제한이며 사용자 전체 작업의 리뷰 금지가 아니다.
|
||||
|
||||
**완료 조건:** native touch assertion의 RED/GREEN, 페이지/링크 시도 횟수 증거 및 정상 탭·세로스크롤 회귀 통과. 이전 native-final 증거는 덮어쓰지 않는다.
|
||||
- [x] **검증 진입점 정리:** 임시 UDID를 필수 `SB_SIMULATOR_ID` 인자로 바꾸고 TMPDIR/Kingfisher 경로를 선택 가능하게 했다. 부모가 같은 native suite를 재실행하여 11/11 PASS 확인.
|
||||
- 후속 추가 범위 SB-022: 마지막→첫 번째 snap 수정은 같은 파일/검증 실행에서 처리한다. 별도 리팩터링이나 공용 main carousel 변경은 하지 않는다.
|
||||
|
||||
### Phase 3 Progress / 검증 기록
|
||||
- 2026-10-30 P3-T1: 제품 수정 전 실제 XCTest 좌표 swipe에서 페이지 이동 후 `taps=1;last=1`이 발생해 callback0 assertion RED를 확인했다. 단순 tap recognizer는 34pt drag를 막지 못해 배타 인식으로 교체했고, 이동 라벨의 좌표 회귀도 실제 112pt 입력 실패를 확인한 뒤 `.global`로 해결했다.
|
||||
- 최종 독립 native build/test exit0: 11 tests, 0 failures. 좌우·양방향 wrap·17/34pt drag·정상/직후 tap·세로 부모 스크롤·single/empty·2:1/3:1·목록 교체·실제5초·background6초·전환 중 replace/hide를 검증했다. 최종 소스는 `b3e4c5333cf8249ccd7773b5cabd372efb5a5565323bd7778034e110386151fd`로 실행 전후 및 cleanup 후 동일하다.
|
||||
- 원본 경계 RED는 117개 실제 native frame 중 31.9ms 사이 green→red 직접 교체로 확인했다. 최종 수정본은 자동/수동 reverse/forward에서 각각 10/21/22개 중간 프레임, 같은 방향 진행, 정착 후 동일 배너 hash를 확인했다. 목록 교체/이탈은 실제 중간 PNG 감지 후 약1ms에 실행했다.
|
||||
- `check-sub-banners.sh`, `--ui` exit0. 제품 수정은 공통 컴포넌트 1개뿐이다. 소유 app/runner uninstall exit0 및 root/cache 부재 확인, 빌린 `B5F2BA0D-327C-4EE3-94EE-39710A0E1ACC`는 Booted 유지, parent `sub-banner-gesture.Fyv2wD` 미변경. 전체 앱 build·독립 리뷰·보조공학 자체 조작 등 미실행 범위는 [implementation.md](reviews/evidence/gesture-fix/implementation.md)에 분리했다.
|
||||
- 최종 상위 검증: native XCTest 11/11 PASS(실패/skip0), 기존 check16개 단일 루프 PASS, SodaLive/SodaLive-dev Debug simulator build exit0, 현재 product/테스트 snapshot cmp 동일. [Phase3 리뷰](reviews/phase3-sub-banner-gesture.md) APPROVE.
|
||||
- 최종 정리: parent 재실행의 앱/runner uninstall exit0, 소유 simulator shutdown/delete 및 device 경로 부재, parent root/cache 삭제 및 부재, 임시 note 삭제 확인. 출력 `Gesture fix owned root/cache/device absent: PASS`. 공유 cache·사용자 simulator·기존 미커밋 변경은 정리하지 않았다. worktree/commit/push 없음.
|
||||
|
||||
## Phase 4: 시각적 페이지 카운트 제거
|
||||
### Task P4-T1: 우측 상단 배지만 삭제
|
||||
**Goal:** PRD DEC-009에 따라 서브 배너에 시각적 페이지 표시를 없애고 상호작용·접근성을 보존한다.
|
||||
**선행조건:** 사용자 명시 결정, Phase 3 완료 소스 `b3e4c5333cf8249ccd7773b5cabd372efb5a5565323bd7778034e110386151fd` 확인.
|
||||
**Files:** `SodaLive/Sources/V2/Component/Banner/SubBannerCarousel.swift`, 이 계획, `prd.md`, `reviews/evidence/no-count/README.md` 및 PNG 1~2장. 기존 `work/tests/SubBannerGestureHarness.swift`와 runner는 수정 없이 재사용한다.
|
||||
**TDD 예외:** 로직 없는 overlay/helper 삭제이며 새 단위 테스트는 만들지 않는다. 대체 검증은 `bash work/tests/check-sub-banners.sh --ui`, 기존 `testManualBoundaryFrames`(선택적으로 `testSwipeDoesNotTap`) 및 native 캡처 직접 확인이다. 전체 회귀·전체 앱 빌드·새 인프라는 범위 밖이다.
|
||||
- [x] overlay와 고립된 `pageIndicator`만 삭제하고 나머지 소스·메인 배너 불변을 대조한다.
|
||||
- [x] UI typecheck와 전용 iPhone SE3/iOS18.3의 기존 native 테스트를 통과하고 배지 없는 PNG를 직접 확인한다.
|
||||
- [x] 명령·해시·결과·캡처 경로 및 소유 앱/runner/PID/device/temp root 정리·부재 확인을 증거에 기록한다.
|
||||
**완료 증거:** [no-count/README.md](reviews/evidence/no-count/README.md). 구현 전 임시 root와 정리 TODO를 생성했으며 공유 cache/device는 정리하지 않는다.
|
||||
|
||||
### Phase 4 Progress / 검증 기록
|
||||
- 2026-10-30 P4-T1 완료: 순수 삭제 23줄(181→158), 나머지 소스 완전 일치. 최종 SHA256 `15ade1c2e0cd26fca4b0e1833bbb08aa42627335a8c79099528caedc337015d8`와 runner 실행 전/컴파일/실행 후 해시 동일. 메인 배너·기존 검증 인프라 불변.
|
||||
- `bash work/tests/check-sub-banners.sh --ui` exit0. 기존 `testManualBoundaryFrames`, `testSwipeDoesNotTap`만 실행하여 2/2 PASS, 실패/skip0, 24.711초. native PNG 1장을 직접 확인했고 우측 상단 배지 없음. 전체 회귀/전체 앱 빌드는 순수 렌더링 삭제 범위이므로 생략했다.
|
||||
- 소유 앱/runner uninstall 및 부재, PID 종료, 전용 simulator shutdown/delete와 디렉터리 부재, 임시 root/cache/note 부재 모두 PASS. 상세 명령·한계·캡처는 완료 증거에 기록했다.
|
||||
- 상위 실행자가 UI typecheck 재실행 exit0, 소스/PNG 및 소유 자원 부재를 확인했다. [Phase4 단일 독립 리뷰](reviews/phase4-sub-banner-count.md) APPROVE. 추가 제품 변경 없음.
|
||||
Reference in New Issue
Block a user