# 이벤트 상세 API 연동 리뷰 ## 1. 리뷰 정보 | 항목 | 내용 | |---|---| | 리뷰 대상 | Phase 1, 현재 브랜치의 미커밋 변경 | | 리뷰 일자 | 2026-10-29 | | 리뷰어 | Oracle 단일 읽기 전용 리뷰, Sisyphus 검증 | | 기준 문서 | ../prd.md, ../api-contract.md, ../plan-task.md | | 리뷰 상태 | 코드 승인, 비차단 항목 수정 검증 완료 | ## 2. 리뷰 목적과 범위 ID-only 라우팅 7개 호출, 기존 EventApi/Repository, 신규 V2 EventDetailViewModel, 기존 상세 View, 양 타깃 등록과 집중 테스트를 검토했다. 딥링크 parser 추가, 공통 인증 변경, 다른 화면 URL 정책 변경은 제외했다. 실서버 테스트는 사용자 지시로 제외한다. ## 3. 판정 기준 사용자 계약 위반·화면 오동작·인증 회귀는 차단 문제로, 반복 QA/문서 정합성은 별도 정리 항목으로 판정한다. HTTP200만으로 성공 처리하지 않고 success 및 단일 유효 data를 요구하며 false는 해당 화면으로 범위를 제한해 복귀해야 한다. ## 4. 검토한 근거 - EventApi.swift/Repository.swift의 GET·requestPlain·optional bearer 및 기존 provider plugin 유지. - EventDetailViewModel.swift의 status → success → DTO 순서, 양수/일치 ID, nullable 이미지·link-only, HTTP(S)+host 경계, 요청 취소·중복·지연 응답 억제. - EventDetailView.swift의 StateObject, View-scoped dismiss, loading/toast, 이미지 주소·기존 레이아웃 보존. - AppStep.swift와 ContentView.swift 및 7개 진입 호출, project.pbxproj의 양 타깃 source membership. - work/tests/EventDetailCheck.swift의 production API/repository/VM/DTO 및 실제 Combine 드라이버. Moya/provider 대역은 실제 공통 plugin 실행이나 HTTP 전송을 증명하지 않는다. | 검증 | 결과 | 증거 | |---|---|---| | 집중 이벤트 검사 | PASS | parent 직접 재실행 exit 0 | | 전체 work/tests/check-*.sh | PASS | parent 14개 실행, 실패 0 | | SodaLive / SodaLive-dev Debug 시뮬레이터 빌드 | PASS | 양 스킴 BUILD SUCCEEDED, exit 0 | | 프로젝트 순서 정리 | PASS | 정리 전후 canonical JSON SHA-256 동일 | | TMPDIR 없는 runner 실행 | FAIL 재현 | env -u TMPDIR bash work/tests/check-event-detail.sh, 5행 unset variable | | 네이티브 화면/VoiceOver/LSP | 미실행 | 조작·LSP 도구 부재, 시각 검증 통과를 주장하지 않음 | | 구현 후 실서버 연결 | 제외 | 사용자 지시 | ## 5. 발견 사항 요약 **앱 계약 위반의 확정 차단 사항 없음. Oracle 판정: APPROVE.** | ID | 심각도 | 상태 | 제목 | 소유 Task | |---|---|---|---|---| | REV-P1-001 | Low | 수정 완료 | 검사 runner의 TMPDIR 의존 및 임시 디렉터리 미정리 | P1-T3 | | REV-P1-002 | Low | 수정 완료 | 구현자 기록 이후 빌드·전체 회귀·재정렬 소유권 정정 필요 | P1-T3 | ## 6. 발견 사항 상세 REV-P1-001: `work/tests/check-event-detail.sh:5`는 `set -u`에서 TMPDIR를 직접 참조한다. TMPDIR 제거 실행은 컴파일 전 exit 1이고, trap이 없어 성공/실패 산출물이 누적된다. 기존 notice runner의 `mktemp -d` 및 생성한 디렉터리만 제거하는 EXIT trap으로 맞춘다. REV-P1-002: 이전 구현자의 미실행 빌드 및 비소유 재정렬 기록은 당시 관찰이다. 상위 실행자가 양 빌드/14개 회귀 PASS와 Xcode에 의한 자동 재정렬 정리·의미 동일성을 후속 Progress로 누적하여 정정했다. 기존 검증 기록은 삭제하지 않았다. ## 7. 확정 항목의 plan 전환 P1-T3에서 runner 실패 재현 → 최소 수정 → 정상/실패 경로 cleanup 검증 → 문서 완료 상태 갱신을 수행한다. 앱 production 코드는 추가 변경하지 않는다. ## 8. 리뷰 종료 판정 코드·확정 계약 기준 APPROVE. 비차단 항목도 수정·검증했으며 실서버 및 네이티브 UI 검증을 수행했다고 주장하지 않는다. ## 9. 수정 후 검증 기록 2026-10-29: runner를 기존 notice 패턴의 `mktemp -d`와 EXIT trap으로 변경했다. `env -u TMPDIR bash work/tests/check-event-detail.sh` exit 0. 정상 실행 및 swiftc 함수 대역의 강제 실패(exit 42) 모두 EXIT trap이 생성한 임시 디렉터리만 제거했고 `test ! -e`로 부재를 확인했다. `bash -n`도 exit 0. 앱 production 코드는 승인 후 변경하지 않았다. 문서에는 양 빌드·14개 회귀·프로젝트 의미 동일성·검증 제외 범위를 누적했다.