UI 복잡 버전 234 RED→GREEN 완료(docs/UI_USECASES.md §A~§J): 라이브 테마 전환(DynamicResource 전환+ThemeResolver+HighContrast 테마, 재시작 없음), 디자인 토큰 체계·WCAG 대비 결함 5건 수정, 설정창 카테고리 내비/검색 재구성+AppConfig 40여 속성, 다운로드 관리자(속도/ETA/세그먼트맵/전체 일시정지-이어받기/CSV 내보내기/예약 게이트/중복 확인), 라이브러리·아카이브·작업공간·재생목록·즐겨찾기 편집 뷰, 접근성(자동화 속성 30여 개·커스텀 피어·docs/ACCESSIBILITY.md), 인터랙션(휠 클릭 새 탭·XButton 탐색·F12·영역 캡처·프로필 전환), 상태/알림(토스트·알림센터·온보딩·CrashReportDialog). 보강 테스트 35건+실창 E2E 4건(StaDispatcher 기반 — 프록시 설정이 기시작 핸들러를 건드리는 크래시 실결함 수정 포함) — 453/453 GREEN. 이전 미커밋 작업(CI 워크플로·Mdns·QueueHub·UpdateChecker·AGENTS/CLAUDE·빌드 스크립트) 일괄 포함

This commit is contained in:
Yun Chan 2026-08-17 15:54:53 +09:00
parent 5a0ce730b2
commit 17f2f91152
88 changed files with 9463 additions and 1127 deletions

View file

@ -1,8 +1,8 @@
# 구현 감사 보고서 — 계획 ↔ 구현 ↔ 증거 매핑
> **대상**: `BROWSER_FEATURES_PLAN.md` (v2) + `MOBILE_PLAN.md` (v1) 전 항목
> **감사일**: 2026-08-15 · **방법**: TDD(RED→GREEN) + E2E 검증
> **요약**: 전 솔루션 Release 빌드 **0 오류**, 단위/E2E 테스트 **154/154 GREEN**, Android 에뮬레이터·iOS 시뮬레이터·LAN 서버 E2E 완료
> **감사일**: 2026-08-15 (갱신 2026-08-16) · **방법**: TDD(RED→GREEN) + E2E 검증
> **요약**: 전 솔루션 Release 빌드 **0 오류**, 단위/E2E 테스트 **180/180 GREEN**, Android 에뮬레이터·iOS 시뮬레이터·LAN 서버 E2E 완료
>
> **감사 중 발견·수정된 회귀**: `HlsDownloader` 3-인자 ctor가 `_muxer` 미할당(재구성 ② 누락) → 모든 HLS 리먹스 NUL 위험. RED 테스트(`HlsMuxerWiringTests`)로 재현 후 ctor 할당 수정. `DashDownloader`는 정상.
@ -134,13 +134,23 @@
| 오프라인 저장 진행 알림(M2) | ✅ 💾 저장 중 Android ProgressBar 노티(5% 스로틀 갱신) → 완료 시 "폰 저장 완료" 노티로 전환 | 에뮬 E2E: 34MB 저장 중 "폰에 저장 중 — N%" 라이브 관측(t=1~12s) → 완료 후 **"폰 저장 완료"(big.mp4) 레코드 실증**(진행→완료 전환, Report(1) 되덮어쓰기 방지 포함) |
| U4 저장소 로직 이관 | ✅ OfflineStore → Mobile.Core(디렉터리 주입, MAUI 비의존) | 재시작 매니페스트 유지 테스트 포함 |
### 명시적 미구현 (계획 허용/후순위)
### 3차 완성 (2026-08-16) — 계획 잔여 갭 소거 라운드
- SignalR 허브 — 계획안 명시 "v1은 2초 폴링으로도 가능" 채택
- mDNS 광고(_videodl._tcp) — QR 페어링이 주 경로(계획 §6 리스크 대응과 동일 전제)
- 미디어 알림의 FGS 화 — 백그라운드 재생이 없는 컴패니언 구조상 ongoing 노티로 대체(위 표)
- M4 Android 독립 다운로더 — 계획상 "선택"
- iOS TestFlight — 앱 실행/페어링 프레이밍까지만 (감사일 기준)
| 항목 | 구현 | 증거 |
|---|---|---|
| SignalR 큐 허브 (MOBILE_PLAN §3 `/hubs/queue`) | ✅ `QueueHub`(스냅샷 GetQueue) + `IQueueAdapter.Changed` → 전 클라이언트 `queueUpdated` 푸시. 인증은 기존 미들웨어에 `/hubs` 편입(쿼리 `t`/`access_token` 허용). 폴링 클라이언트와 공존 | `QueueHubE2ETests` 2건(실 Kestrel: 접속→스냅샷→변경 푸시 수신 / 잘못된 토큰 401) |
| mDNS 광고 (MOBILE_PLAN M0 `_videodl._tcp`) | ✅ `MdnsAdvertiser`(Makaretu.Dns) — `ServerOptions.EnableMdns`, 실패는 `ServerHost.MdnsError` 로 표면화(발견 보조라 서버는 유지). 비ASCII 기기명은 TXT 퍼센트 인코딩(Makaretu ASCII 제약) | `MdnsAdvertiserTests` 4건 + **광고→발견 실증**: 별도 ServiceDiscovery 브라우저가 `_videodl._tcp.local` 인스턴스 수신(RESULT=DISCOVERED) |
| 자동 업데이트 v1 (DEPLOYMENT_PLAN §6/D6) | ✅ `Core/Update/UpdateChecker`(GitHub latest 태그 비교, RID별 설치 자산 선택, UA 필수 준수) + `AppConfig.UpdateRepo` + 설정창 "앱 업데이트" 섹션(확인→릴리스 페이지 열기, 설치는 사람 관문) | `UpdateCheckerTests` 9건(가짜 핸들러 격리) + `SettingsUpdateUiE2ETests`(실 창 로드/형식 안내) |
| CI 스캐폴드 (DEPLOYMENT_PLAN §5/D1~D3) | ✅ `.github/workflows/release.yml`(test 관문→win x64/arm64 Inno·linux/macos tar.gz·android apk→Draft Release) + `build/obtainium.json` + README 배포 절 | 정적 스캐폴드 — 실행 검증은 GitHub 공개(사용자 결정) 후 태그 푸시로 |
### 명시적 미구현 (계획 허용/외부 전제)
- ~~SignalR 허브~~ → 2026-08-16 구현(위 표)
- ~~mDNS 광고(_videodl._tcp)~~ → 2026-08-16 구현(위 표)
- 미디어 알림의 FGS 화 — 백그라운드 재생이 없는 컴패니언 구조상 ongoing 노티로 대체(위 표). **계획 문서에 대체 결정 명기됨**
- M4 Android 독립 다운로더 — 계획상 "선택" (성공 기준 §7 에 미포함)
- iOS TestFlight / macOS 서명·공증 — **외부 전제 차단**: Apple Developer Program($99/년) 가입 필요. 시뮬레이터 시동·페어링·큐 조회까지는 실증 완료. 가입 즉시 실행 절차는 `DEPLOYMENT_PLAN.md` §7.5 런북
- 리포지토리 GitHub 공개(D1 후반) — 사용자 결정 사항. **보안 전제 점검 통과**(2026-08-16: `.env` 히스토리 커밋 0건·ignore 유효·템플릿만 추적) — 결정 즉시 `DEPLOYMENT_PLAN.md` §7.5 의 2줄 명령으로 공개+첫 릴리스 가능
## 3. 배포 (DEPLOYMENT_PLAN)
@ -162,3 +172,24 @@
- [x] 라이브러리 스트리밍 재생(시크 포함) (M2) — 실측 MP4 프레임 + 206 Range
- [x] iOS 빌드 시동 + 큐 조회 (M3) — iOS 26 시뮬레이터 UI 렌더
- [x] 폰 저장 오프라인 재생 (M2 후반) — 서버 정지 상태 프레임 렌더 실증 + 이어보기 동기화(재개 35.2초)
---
## 부록 (2026-08-17) — UI 복잡 버전 RED 스펙 등록 → GREEN 완료
- 기존 180개 테스트(구현 감사 대상)는 변동 없이 **전부 GREEN 유지**.
- 신규 **234건 유즈케이스 스펙**(`Tests/E2E/UiUsecase*RedTests.cs` + `docs/UI_USECASES.md`)은
**동일일 GREEN 구현 완료 — `dotnet test` 총 453/453 GREEN**(180 기존 + 234 유즈케이스 + 35 보강 + 4 실창 E2E).
- RED 중 7건이 지목한 실측 스타일 결함(WCAG 대비 미달)은 색값 조정으로 해결:
다크 TextMuted #7C8296→#8B91A6(4.42→5.39:1)·AccentBrush #7C6CFF→#8B7CFF(4.38→5.17:1)·
BorderBrush #343442→#6C6C8A(1.38→3.34:1), 라이트 TextMuted #767B8C→#63687A·TrackBrush #DBDFE6→#808798.
- 주요 구현: 디자인 토큰 체계(Shared.xaml 개서) + 라이브 테마 전환(DynamicResource 전환,
재시작 없음), `AppConfig` 속성 40여 개, 설정창 카테고리 내비+검색 재구성, 다운로드 관리자
(속도/ETA/세그먼트맵/전체 일시정지-이어받기/CSV/중복확인/예약 게이트), 라이브러리·아카이브·
작업공간·재생목록 UI, 접근성(자동화 속성·고대비 테마·`docs/ACCESSIBILITY.md`), 인터랙션
(휠 클릭 새 탭·영역 캡처·프로필 전환·Esc 일괄 닫기), 상태/알림(토스트·알림센터·온보딩·
`CrashReportDialog`).
- 실행 증거: `Tests/E2E/UiUsecaseLiveE2ETests`(실창 4건 — 신규 컨트롤 실존·라이브 테마 전환
dark↔light 창 생존·전체 일시정지/재개 상태 전이·설정 검색 필터·토스트 방해금지 억제).
구현 중 E2E 가 발견한 실제 결함 1건 수정: 프록시 설정이 기시작된 공유 HttpClient 핸들러를
건드려 크래시(SocketsHttpHandler 제약) → 프로세스 최초 1회만 적용으로 변경.