docs(event): SDK 조사와 딥링크 리뷰를 보존한다

This commit is contained in:
Yu Sung
2026-10-29 15:44:53 +09:00
parent e7799449c6
commit 7ce07b3128
3 changed files with 140 additions and 0 deletions
@@ -0,0 +1,52 @@
# 이벤트 상세 딥링크 연결 리뷰
## 1. 리뷰 정보
- 대상: Phase 2 / P2-T1, P2-T2의 현재 작업 트리 변경.
- 기준: [PRD](../prd.md), [계약](../api-contract.md), [계획](../plan-task.md).
- 일자: 2026-10-29. 리뷰어: Oracle 단일 읽기 전용 리뷰.
- 최초 판정: REQUEST_CHANGES. 제품 source 3개와 테스트/runner 4개, 연결된 MainView 호출을 검토했다. 기존 외부 project.pbxproj 재정렬은 제외했다.
## 2. 목적과 판정 기준
event-detail URI/OneLink/push/알림 목록이 유효한 ID로 기존 화면을 한 번 열고, 잘못된 값·중복·취소·비동기 경합이 다른 목적지 또는 이전 pending을 훼손하지 않아야 한다. 실제 정상 short URL 성공은 사용자 지시로 비차단 후속 항목이다.
## 3. 검토 근거와 실행 증거
- `AppDeepLinkHandler.swift`의 origin/ID 검증, SDK 위임, UDL 입력, event in-flight guard와 live 확인 흐름.
- `AppDelegate.swift`의 SDK 시작 전 push path 등록, Firebase/Notifly hook 이후 단일 owner 처리, 기존 GCD/마케팅 흐름 보존.
- `AppState.setAppStep`은 main queue에서 비동기로 route를 적용한다. `requestExternalNavigation`의 모든 production 호출자(MainView, 신규 handler)와 교체 취소 closure를 확인했다.
- parent 로컬 검사: 이벤트 325 assertion, 기존 deep-link 279 assertion, 전체 검사 15개 PASS. 전체 실행 timeout 후 잔여 2개를 재실행했다.
- parent 양 스킴 Debug Simulator 빌드 exit 0. Oracle는 해당 제공 증거를 사용했고 빌드나 테스트를 재실행하지 않았다.
## 4. 발견 사항
| ID | 심각도 | 상태 | 내용 | 소유 Task |
|---|---|---|---|---|
| REV-P2-001 | High | 수정 검증 완료 | 현재 이벤트 판정과 실제 route 적용 사이의 비동기 경합 | P2-R1 |
### REV-P2-001
`AppDeepLinkHandler.swift:133-153`의 current/guard 검사는 `AppState.swift:113-139`의 비동기 stack 변경보다 먼저 실행된다. 예약된 이전 이동은 실행 시점에 최신 event intent를 다시 확인하지 않는다.
재현 순서(Oracle의 FIFO 소스 추적; 수정 전 실제 RED 검사를 수행할 것): 현재 이벤트 45, live OFF에서 main queue를 비운 뒤 `44 → 45`를 중간 settle 없이 전달하면 최종 화면이 44가 된다. `44 → 45 → 44`는 44를 두 번 append할 수 있다. 최신 의도와 현재 목적지 비교를 실제 mutation과 같은 main queue 블록에서 수행해야 한다.
## 5. 계획 전환
P2-R1에서 두 warm 혼합-ID 사례의 실제 RED를 확인하고 최소 수정 후 집중 회귀·기존 딥링크·양 스킴 빌드를 다시 확인한다. 기존 기록/테스트를 삭제하거나 약화하지 않는다.
## 6. 검증 한계
실제 short 서버 해석, 실제 push/Notifly 전달, 이벤트 API 및 앱 화면 실행은 검증하지 않았다. 로컬 검사는 실제 production handler/AppState를 실행하고 SDK 경계만 대역으로 대체한다.
## 7. 후속 판정
수정 및 delta 재검토 결과를 누적한다.
### P2-R1 구현자 재현 - 2026-10-29
- 수정 전 production handler/AppState 검사에서 `mixed-current`, `mixed-repeat`가 각각 Oracle의 `44 → 45`, `44 → 45 → 44` assertion으로 exit 1을 반환했다. 입력 사이 main queue를 비우지 않았다.
- 같은 Task의 live 하위 경계도 재현했다. current event 뒤에 player가 있는 경우 `current-live` 검사에서 `current event behind live still requests leave confirmation` assertion이 실패했다. Handler의 early current return이 기존 live 종료 확인을 건너뛰므로 current 검사를 실제 guarded mutation으로 이동하는 수정에 포함한다.
- 최초 REQUEST_CHANGES 판정은 유지한다. 구현 후 집중 GREEN은 별도 기록하고, 양 타깃 재빌드 및 동일 Oracle의 delta 판정은 parent가 수행한다.
### P2-R1 구현자 수정 및 로컬 증거 - 2026-10-29
- `AppState.setAppStep(step:ifCurrentStep:completion:)`의 기존 main async 블록에 optional predicate를 추가했다. predicate와 실제 stack mutation 사이에 추가 enqueue/await가 없으며 skipped 요청도 defer completion을 실행한다. Handler는 그 predicate 안에서 최신 event ID와 current event를 비교하고, current early return을 제거해 live 확인을 먼저 거친다.
- `bash work/tests/check-event-deep-link.sh mixed-current mixed-repeat current-live` → assertions=21 PASS, 전체 집중 검사 → assertions=345 PASS, 기존 gift/community → assertions=279 PASS. 기존 EventDetailCheck 전체와 변경 Swift 4개 parse도 exit 0이다. 세 RED의 명령/오류 및 GREEN 세부는 P2-R1 계획에 누적했다.
- 구현자 로컬 수정 상태이며 Oracle 승인으로 간주하지 않는다. parent 양 스킴 재빌드 및 같은 reviewer의 delta 판정은 미실행이다. 실제 SDK/서버/푸시 검증 범위는 확대하지 않았다.
### 최종 delta 판정 및 parent 검증 - 2026-10-29
- Oracle: **REV-P2-001 ADDRESSED / APPROVE**. predicate와 mutation 사이에 추가 enqueue가 없어 최신 intent/현재 목적지를 원자적으로 검사한다. skipped completion과 current-event 뒤의 live 확인/취소도 보존되며 기본값을 사용하는 기존 setAppStep caller는 종전 동작을 유지한다. 새 차단 결함 없음.
- parent 전체 15개 회귀 script를 timeout 없이 완료: FAILED_SCRIPTS=0, exit 0. 이벤트 345 및 기존 deep-link 279 assertion PASS.
- parent 수정 후 SodaLive와 SodaLive-dev의 Debug generic iOS Simulator 빌드 모두 BUILD SUCCEEDED, exit 0. 기존 build 경고는 이번 범위 밖으로 유지했다.
- 최종 결론: 클라이언트 구현 승인. 실제 short URL 서버 성공·실제 push/Notifly 전달·앱 API·기기 UI 검증은 이 승인과 구분되는 미실행 후속 항목이다.