docs(auth): 콘텐츠 설정 요구사항과 검증 결과를 기록한다

This commit is contained in:
Yu Sung
2026-10-13 11:37:26 +09:00
parent 61bfa46c11
commit 1b50f559bd
6 changed files with 894 additions and 0 deletions
@@ -0,0 +1,86 @@
# 본인인증 후 콘텐츠 보기 설정 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 대상 | Phase 1~3 / 현재 main working tree의 인증 설정 변경 |
| 일자 | 2026-10-12 |
| 기준 | `../prd.md`, `../plan-task.md` |
| 검토 | Oracle 기능/회귀 검토, 독립 시각 검토, coordinator 실행 검증 |
| 상태 | 코드 결함 미발견 / 실제 인증 통합 QA 증거 대기 |
## 2. 목적과 범위
- 범위: `MyPageViewModel`, 인증 DTO/repository, 공용 `AuthContentSettingsSheet`, 7개 인증 caller, I18n, Xcode 등록, serializer check.
- 기준: 확인 전 요청·저장 금지, ON/ALL, 확인 후 닫힘→POST, POST 실패 시 동일 draft 재개, callback 경로 GET/로컬 동기화 후 action, GET 실패 재시작, 기존 마이페이지 재시작 유지.
- 제외: 기존 콘텐츠 설정 autosave 변경, SDK/인증 서버 변경, unrelated 경고 정리, 사용자 계정의 임의 인증.
## 3. 판정 기준
확정된 사용자 요구사항 위반은 수정 대상으로 판정한다. 실제 서버/화면 통합 증거가 없는 항목은 코드 결함과 분리해 보류하고 최종 Gate를 통과로 표시하지 않는다.
## 4. 검토한 근거
### 소스
- `SodaLive/Sources/MyPage/MyPageViewModel.swift`: receipt capture, immutable request, onDismiss submit, POST/GET 실패 분리, callback 소비.
- `SodaLive/Sources/V2/Component/Modal/AuthContentSettingsSheet.swift`: binding-only 입력, native sheet dismissal 금지, onDismiss 전송, 오류/로딩 연결.
- `MyPageView`, `HomeView`, `HomeTabView`, `ChatTabView`, `LiveNowAllView`, `V2/Main/MainView`, `CreatorChannelView`: provider 닫기와 설정 시트 연결, pending action 보존.
- `ContentView:22`, `SplashView:73`, `MainView:59`: 재시작 시 MainView 제거·재생성과 기존 member GET 연결. 런타임 성공 증거는 아님.
### 실행 환경과 증거
- macOS Intel, Xcode 26.0, iOS 26.0 iPhone 17 Pro Simulator. deployment target 16.6.
- 증거 루트: `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode`.
| 실행 | 결과 | 근거/한계 |
|---|---|---|
| 실제 DTO swiftc compile/run | PASS / exit 0 | 4개 조합 exact keys/types/values. RED는 새 initializer 인자 부재 compile 실패 |
| 실제 VM/repository + native Combine 임시 driver | PASS / exit 0 | malformed6, POST failure6, GET failure7, callback 순서·중복 방지. transport/AppState/UserDefaults는 임시 stubs |
| 네이티브 실제 sheet/modifier 임시 앱 XCTest | PASS / 2 tests, 0 failures | toggle/radio/swipe 차단/confirm dismiss. VM·toast stub으로 실서버/오류 토스트 미검증 |
| 한·영 ON/OFF native screenshots | 시각 검토 APPROVE | 잘림·겹침 없음. Android 대비 iOS26 floating 외곽 차이, pixel-perfect 주장 없음 |
| 기존 `work/tests/check-*.sh` 전체 | PASS / exit 0 | 변경 전 및 변경 후 회귀 확인 |
| 두 workspace Debug Simulator builds | PASS / exit 0 | SodaLive-dev, SodaLive, coordinator 재실행 포함. 기존 SDK/중복 소스/dSYM 경고 존재 |
| Swift parse / plutil / git diff --check | PASS / exit 0 | LSP 도구 미제공, LSP 실행 성공으로 대체 표기하지 않음 |
UI 증거: `auth-settings-qa/{EVIDENCE.md,interactions.log,NativeInteractions.xcresult,ko-on-all.png,ko-off-all.png,en-on-all.png,en-off-all.png}`. 실제 sheet hash는 `ff44380bedf20a364d59b5ad5b07164f97dfaa87cb78bbb09a1e1dc3f80eddff`이며 캡처 이후 소스 변경이 없다.
## 5. 발견 사항 요약
**확정 코드 결함 없음.** 아래는 최종 수용 판단을 위한 증거 부족 항목이다.
| ID | 상태 | 내용 | 소유 Goal |
|---|---|---|---|
| QA-001 | 보류 | 실제 7개 인증 caller의 provider-dismiss-sheet, POST 실패 오류/재개 통합 증거 없음 | P3-QA |
| QA-002 | 보류 | GET 실패 후 실제 앱 재시작으로 member GET과 로컬 저장이 이루어지는 증거 없음 | P3-QA |
## 6. 발견 사항 상세
### QA-001: 실제 인증 진입점 통합
- 관련 기준: AUTH-002/003/006/007. 실제 마이페이지의 inline provider와 다른 6개 cover를 종료한 뒤 시트가 정상 표시되는지 검증해야 한다.
- 현재 증거: 7개 caller 소스/컴파일, shared VM 실행, native modifier 단독 상호작용. 실제 전체 화면 계층·Bootpay와의 연동 성공을 대신하지 않는다.
- 재개: 승인된 QA 계정/유효한 receipt로 모든 진입점 정상·전송 실패 경로 실행. raw receipt/token 기록 금지.
### QA-002: 재시작 후 실제 동기화
- 관련 기준: PRD §14.1의 restart fallback 실제 member refresh 및 로컬 반영.
- 현재 증거: VM driver에서 GET 실패→재시작 1회/추가 POST 0회/callback 0회; 소스에서 새 MainView의 member GET 경로 확인.
- 미검증: 실제 화면 재생성과 GET 응답/로컬 상태 반영. 임시 AppState 카운터만으로 통과 처리하지 않는다.
- 재개: POST 성공 후 GET만 실패시키고, 재시작 뒤 GET 성공을 허용해 auth/content 설정 갱신과 pending action 미실행을 관찰한다.
## 7. plan·goal 전환
코드 수정 확정 항목이 없어 신규 회귀 수정 Task는 없다. QA-001/002는 기존 `P3-QA`에 [blocked]로 유지한다. 실패가 실제 재현되면 코드 수정 전에 신규 회귀 Task를 추가한다.
## 8. 리뷰 종료 판정
- 소스/격리 실행/네이티브 시각 검토: 완료, 확정 production defect 없음.
- 전체 사용자 흐름 최종 Gate: **외부 QA 조건 대기**. Oracle은 코드 결함이 아니라 실제 통합 증거 부족으로 최종 승인을 보류했다.
- 실서버 지원은 사용자 확인에 근거한다. receipt 만료/재시도 idempotency 및 작은 화면·큰 글자 실사용은 별도 미검증이다.
## 9. 후속 검증 기록
- 2026-10-12: coordinator가 현재 소스의 양쪽 앱 incremental build와 기존 회귀 스크립트 전체를 재실행해 exit 0을 확인했다. 배경 탭 차단 추가 네이티브 검사는 별도 후속 기록으로 남긴다.
- 2026-10-12 후속: 실제 dimmed 영역 `(0.5,0.2)` 탭 뒤 시트 유지, 그 후 설정 완료로만 닫힘을 focused XCTest 1개/실패 0개로 확인했다. `auth-settings-qa/NativeBackdrop.xcresult`, `backdrop.log` 및 `backdrop-attachments`에 증거가 있다. 임시 앱·runner 제거와 simulator 종료를 확인했다. 추가 검사는 단독 native host 증거로 QA-001/002의 실제 인증 통합 차단을 해소하지 않는다.
@@ -0,0 +1,59 @@
# 콘텐츠 높이 커스텀 BottomSheet 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 대상 | Phase4 / P4-T1 / 현재 main working tree의 표시 방식 변경 |
| 일자 | 2026-10-12 |
| 기준 | `../prd.md` §10.0, `../plan-task.md` P4-T1 |
| 리뷰어 | 기능 독립 검토 + 시각 독립 검토 + coordinator 증거 확인 |
| 상태 | P4 APPROVE / 기존 P3 실서버 통합 미검증은 유지 |
## 2. 목적과 범위
- `AuthContentSettingsSheet.swift`의 native sheet를 투명 fullScreenCover + 콘텐츠 자연 높이의 전폭 하단 패널로 바꾼 변경만 검토한다.
- 배경 노출/입력 차단, 자연 높이, safe area, overflow 스크롤, 확인 후 dismiss 콜백을 확인한다.
- 기존 인증 API/회원 동기화/실서버 검증 공백은 이번 UI-only 판정과 분리한다.
## 3. 판정 기준
일반 화면에서 높이는 내용으로 결정되고 외곽 floating 여백이 없어야 한다. 실제 공간 초과 때만 본문을 스크롤하며 확인 버튼 접근과 닫힘 완료 후 제출 연결을 유지해야 한다.
## 4. 근거와 실행 검증
- 실제 소스 hash: `9b88f2e4999f9dfd28f32576385ced5b6078002671f6092f199f243ea43b1a27`.
- native 증거 root: `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/auth-settings-qa`.
- 실제 production View/modifier/font/I18n/token을 직접 컴파일한 임시 앱이다. VM과 toast는 stub으로 실제 서버나 오류 toast 검증은 아니다.
| 검사 | 결과 | 근거 |
|---|---|---|
| ko ON / OFF geometry | PASS | 화면402×874pt, 패널 `(0,502,402,372)` / `(0,587,402,287)` |
| en ON geometry | PASS | 높이383.67pt로 실제 줄바꿈에 따라 증가 |
| 배경 투명/입력 차단 | PASS | marker RGBA `[24,84,102,255]`, 뒤 버튼 unhittable, backgroundTaps0 |
| toggle/radio/배경·드래그 차단/확인 | PASS | `IntrinsicPanelPass.xcresult` 3 tests, 0 failures |
| 가로·시스템 최대 글자 overflow | PASS | `IntrinsicOverflow.xcresult` 1 test, 0 failures. 본문 스크롤·확인 접근 |
| Swift parse / 두 앱 Debug Simulator build | PASS | coordinator 실제 실행 exit0, 기존 SDK/중복 소스/dSYM 경고 유지 |
| serializer / VM 격리 driver / 기존 regression | PASS | 실제 DTO4조합, 기존 상태 전이, work/tests 전체 |
캡처 대조:
- `intrinsic-panel-attachments/5BBF64BD-30D4-4FE3-A0F7-D1667609709A.png`: ko ON.
- `intrinsic-panel-attachments/CDE33DE3-749C-4C73-9594-5C7D55BF0F8A.png`: ko OFF.
- `intrinsic-panel-attachments/F0FACA4C-7025-488D-BC25-38D44F79E8DD.png`: en ON.
- `intrinsic-overflow-attachments/41F47EE5-69D0-40DD-86E9-5033A1F5E49F.png`, `0C90E2E0-8109-476C-AC95-C680FFE681E4.png`: 가로 최대 글자 스크롤 전/후.
## 5. 발견 사항
**확정 발견 사항 없음(P4 범위).** 기능/시각 검토 모두 APPROVE다. 코드에서 고정 높이·`.large` 분기가 제거됐으며, 두 layout 후보는 동일 binding의 본문을 공유하고 부수효과가 없다. 확인 버튼은 두 후보 밖에 유지된다.
## 6. plan·goal 전환
새로운 회귀 수정 Task 없음. P4-T1은 완료하고 기존 P3-QA의 실제 인증 통합 미검증은 별도로 보존한다.
## 7. 종료 판정과 한계
**P4 표시 방식 변경 승인.** 실제 네이티브 캡처·geometry assertions와 현재 소스가 일치한다. pixel-perfect 차이율은 측정하지 않았다. iOS16.6 기기 실행 및 실제 계정/서버와 연결된 7개 caller의 전체 흐름은 검증하지 않았다. LSP 도구는 미제공이며 compiler/build로 검증했다.
## 8. 정리 기록
QA app/runner 제거와 작업 소유 simulator 종료를 실행했다. `simctl list devices booted`에 실행 기기 없음, `pgrep -fl 'xcodebuild|AuthSettingsQA'`에 남은 프로세스 없음. 증거는 tmp 경로에 보존했다.
@@ -0,0 +1,60 @@
# 개발 전용 인증 시뮬레이션 리뷰
## 1. 리뷰 정보
- 대상: P5-T1 개발 타깃 조건, 공통 인증 View, 모의 repository/세션 상태.
- 기준: `../prd.md` §11.0, `../plan-task.md` Phase5.
- 일자: 2026-10-12. 상태: P5 수정·검증 완료 / 독립 재검토 APPROVE.
## 2. 목적과 범위
SodaLive-dev만 SDK/인증 POST를 모의 처리하고 기존 성공 흐름을 재사용하는지, 일반 앱에 모의 코드가 제외되는지, 조회·계정 변경·후속 설정이 일관되는지 확인한다. 실제 서버 권한 부여는 범위 밖이다.
## 3. 검토 근거
- 실제 `AuthRepository`, `UserRepository`, `AuthVerificationMock`와 native Combine을 컴파일하고 transport/UserDefaults 의존성만 격리했다.
- 재현 파일: `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/auth-verification-repository-check/CheckMockRaces.swift`.
- 기존 Foundation mock 체크와 저장소/VM 정상 흐름은 통과했으나 아래 두 순서 사례는 빠져 있었다.
## 4. 발견 사항 요약
| ID | 심각도 | 상태 | 내용 | Task |
|---|---|---|---|---|
| REV-P5-001 | High | 수정 완료 | 인증 전 GET의 늦은 응답이 활성 모의 상태를 되돌림 | P5-R1 |
| REV-P5-002 | Medium | 보류 / 이번 수정 제외 | repository 단독 역순 응답은 재현되지만 실제 UI 로딩 차단을 포함한 중첩 사용자 요청 미확정 | 후속 재현 시 재평가 |
## 5. 발견 사항 상세
### REV-P5-001
`selfMemberPublisher`가 요청 시점의 활성 mock Session을 캡처한다. 인증 전에는 nil이므로, 같은 로그인 세션에서 인증 완료 후 응답이 와도 overlay하지 않는다. App/Home VM은 정상 응답의 isAuth/선호를 그대로 저장하므로 최신 모의 상태가 되돌아갈 수 있다.
재현: GET A 시작 → 모의 인증 성공 → GET B 완료로 true/FEMALE 반영 → GET A 완료. 실행 결과 `auth=false, preference=ALL`, 기대 `true/FEMALE`.
### REV-P5-002
`updateContentPreference`는 응답마다 공유 snapshot을 갱신하며 요청 순서를 구분하지 않는다. 기존 ContentSettingsViewModel의 latestRequestToken은 그 뒤 UI 갱신만 차단하므로 공유 snapshot이 이미 이전 값으로 변한다.
재현: MALE 요청 A → FEMALE 요청 B → B 성공 → A 성공 → member GET. 실행 결과 `MALE`, 기대 최신 요청의 `FEMALE`.
## 6. plan·goal 전환
코드 변경 전에 `P5-R1`을 추가했다. 로그인 세션과 mock 활성 상태를 분리하고 preference 요청 순서를 추적하는 최소 수정 후 동일 재현과 real/mock 회귀 검사를 다시 실행한다.
## 7. 검증 및 판정
- 위 두 재현은 coordinator가 실제 변경 소스를 컴파일해 확인했다. 실서버를 호출하지 않았다.
- 독립 리뷰와 두 앱 전체 빌드는 진행 중이며 아직 최종 완료로 판단하지 않는다.
- 2026-10-12 독립 리뷰 후속: Oracle은 REV-P5-001을 실제 Main 회원조회/로컬 저장 경로의 확정 회귀로 판정했다. REV-P5-002는 기존 설정 UI의 LoadingView 차단 때문에 실제 중첩 사용자 요청을 확정하지 못했으므로, repository 단독 재현만으로 제품 결함을 확정한 이전 판정을 보류로 정정한다. 최소 변경 원칙에 따라 추가 preference 요청순서 상태는 구현하지 않는다.
- 두 Debug 앱 빌드 exit0, 네 가지 구성에서 mock flag는 dev Debug/Release에만 존재했다. 실제 standard 실행파일/debug dylib에 mock 심볼 없음, dev dylib에는 존재함을 확인했다. 아래 회귀 수정 후 필요한 검증을 재실행한다.
## 8. 수정 후 검증 및 종료 판정
- REV-P5-001: stable login Session과 optional 확정 preference를 분리했다. 인증 전 요청이 캡처한 동일 세대는 응답 시점의 최신 확정값을 사용한다. 명시적 nil·이전 계정·같은 token 재로그인 이전 세대는 보정하지 않는다.
- `AuthVerificationMockCheck.swift:34`에 late pre-confirmation GET 검사를 추가하고 assertion RED(exit132)→GREEN(exit0)을 확인했다. 기존 assertion 삭제/완화 없음. 임시 실제 repository/변경 없는 VM driver도 `A 시작→모의 인증→B 성공/로컬 저장→A 성공` 후 true/FEMALE 유지, 실제 인증 POST0회를 확인했다.
- Oracle 재검토는 **APPROVE**, 새로운 차단 결함 없음. 재검토가 남긴 수정 후 두 앱 빌드 조건도 coordinator 18:51 재실행 exit0으로 충족했다.
- 전체 `work/tests/check-*.sh`, dev/standard repository driver, Swift parsing, project plutil, diff check PASS. native UI는 수정하지 않아 기존 4test/0failure 증거를 유지한다.
- 실제 wrapper의 cover/inline 로딩→패널→확인/닫힘, 취소·재등장 guard는 iOS26 native host에서 검증했다. 인증 success와 member sync는 실제 VM/repository에 transport stubs를 연결한 격리 실행으로 검증했으며 실서버 인증으로 표현하지 않는다.
- 일반 `SodaLive` Debug/Release effective mockflag 없음. dev Debug/Release만 flag 있음. 실제 Debug Mach-O 표준 mocksymbol0, devmock 존재; Release는 전체 앱 빌드 미실행이며 설정/검사 바이너리만 검증했다.
- REV-P5-002는 실제 UI 경로 미확정이므로 보류 판정을 유지하며 추가 순서 추적을 만들지 않았다. 실제 사용자 경로로 재현되면 별도 회귀 Task로 진행한다.
- P5 앱 흐름 테스트 기능은 승인 가능하다. 기존 P3 실제 계정/서버 통합 공백은 별도이며, 개발 mock은 서버 보호 API 권한을 부여하지 않는다. LSP 도구는 미제공으로 실제 compiler/build 검증을 사용했다.
@@ -0,0 +1,52 @@
# 고정 배경·패널 모션 분리 리뷰
## 1. 리뷰 정보
- 대상: P6-T1, 현재 working tree 중 `AuthContentSettingsSheet.swift` 모션 변경.
- 일자: 2026-10-13. 기준: PRD §10.0 Phase6, plan-task P6-T1.
- 검토: 독립 기능 검토와 시각/모션 검토, coordinator 실제 소스/프레임/검사 확인.
- 상태: **APPROVE(P6 한정)**.
## 2. 목적과 범위
fullScreenCover 기본 전환을 끄고 배경은 고정, 패널만 이동하도록 한 변경을 검토한다. 기존 intrinsic 높이, 안전 영역, 확인 전송 순서와 오류 재표시를 유지한다. VM/API/mock/실서버 권한 변경은 범위 밖이다.
## 3. 판정 기준
배경 마커 위치와 색은 각 진입/퇴장 모션 동안 고정되어야 한다. 패널은 독립적으로 이동하며 화면 밖으로 퇴장한 뒤 host가 닫히고 기존 onDismiss가 한 번 호출돼야 한다. 빠른 확인·재표시·Reduce Motion에서도 누락/중복 호출이나 host 잔류가 없어야 한다.
## 4. 검토 근거
- 소스: `AuthContentSettingsModifier`의 local host state/transaction, `AuthContentSettingsPanelMotion`의 rendered progress 완료와 자체 높이 변환, 기존 VM confirm/submit guards.
- 최종 hash: `1eee37ffc5c8a937b7be15c0f388782be8965447738aa8fa883a84b729719403`.
- 정확한 P6 delta와 증거: tmp/opencode/auth-settings-qa의 `motion-production.diff`, `MOTION-EVIDENCE.md`, `motion-verification.json`, `panel-final.mp4`, `panel-interrupt.mp4`, `panel-reduce.mp4`.
- native host는 실제 View/modifier·폰트·토큰 소스를 컴파일하고 VM/toast는 격리 대체한다. 실서버 인증 증거로 해석하지 않는다.
## 5. 검증 결과
| 검사 | 결과 | 근거 |
|---|---|---|
| 배경 고정/패널 진입 | PASS | `panel-final-083/087/091.png`, 고정 마커 RGB(23,83,101), 패널 top 변화 |
| 퇴장 완료 후 onDismiss | PASS | `124/128/132/133.png`, 완전 퇴장132 후 host 제거133, callback1회 |
| 빠른 확인/진입 반전 | PASS | normal6개 및 quick 반복5개/0실패, interruption 영상 |
| 오류 재개/선택 유지/3cycles | PASS | native 기본 회귀와 FEMALE 유지, cycle당 callback1회 |
| Reduce Motion | PASS | visible frame의 panel top1508px 일정, 수직 이동 없음 |
| 큰 글자 overflow/foreground 복귀 | PASS | 각각1개/0실패, 확인 접근·선택 유지 |
| 실제 dev loading→panel | PASS | 별도 mock lifecycle4개/0실패, wrapper/패널 실제 소스 |
| 두 앱 Debug builds/회귀 | PASS | coordinator 현재 소스 빌드 exit0, 기존 work/tests 전체·Swift parse·diff 검사 PASS |
초기 didSet-only observer는 빠른 확인에서 hang을 재현해, 최종 수정에서는 actual GeometryEffect 렌더 진행값에서 완료를 확인한다. 최종 증거는 이 보완 후 생성됐다.
## 6. 발견 사항 및 plan 전환
**확정 코드 결함 없음.** 기능·시각 독립 검토 모두 승인했다. 추가 회귀 수정 Task는 없다.
증거 표현 정정: `panel-final-131.png`에는 하단 얇은 패널 조각이 남아 있다. 완전 이탈은 `132.png`를 근거로 하며, `133.png`에서 배경과 host가 제거된다. 자동 픽셀 분석의 null만으로131을 완전 이탈로 판단하지 않는다.
## 7. 종료 판정과 한계
P6 승인 기준 충족. 기존 레이아웃·문구·API·mock 코드는 유지됐고, 제출 호출은 여전히 host onDismiss 한 곳이다. iOS26 native 실행과 minimum16.6 compile은 확인했으나 iOS16 실기기, 실제 toast, 실계정/7caller/서버 통합은 미검증이다. LSP 도구 미제공으로 compiler/build 증거를 사용했다.
## 8. 정리 기록
작업 전용 QA 앱/runner 제거, 소유 simulator 종료 및 recorder 종료를 확인했다. 환경의 접근성 설정은 원복했고 프레임·영상·로그는 tmp 경로에 보존했다. 커밋/푸시 없음.