crowny-class CVF 단일화 재기동+라이브 E2E 실측 (2026-07-12)
개요
class.crowny.org(9864)의 mp4→CVF 단일화 전환 이후, 서비스를 재기동하고 라이브 상태에서
CVF 라우트·캔버스 재생·관리자 대시보드 판정 배선·회귀 4영역을 전수 실측했다.
무엇을 했는지
1. 재기동
launchctl kickstart -k gui/$(id -u)/com.crowny.class → 부팅 로그 모듈 5개 확인(enroll/video/lesson/community/admin).
com.crowny.video(video.crowny.org, 9877)도 재기동 확인.
2. CVF 라우트 실측 (o1-1=무료 mrgilkb817j8, o3-1=유료 mrgilm7qqxjf)
| 케이스 | 기대 | 실측 |
|---|
무료 무로그인 /api/video/cvf/<free> (Range) | 206 | 206 |
무료 무로그인 /api/video/cvfaudio/<free> (Range) | 206 | 206 |
유료 무로그인 /api/video/cvf/<paid> | 401 | 401 |
유료 무로그인 ?owner=가짜 | 401 | 401 |
구 mp4 stream /api/video/stream/<id> (양쪽) | 410 | 410/410 |
구 다운로드 video.crowny.org/api/download/class_o3-1.cvf (로컬+공개 HTTPS) | 404 | 404/404 |
3. 캔버스 재생 실증 (puppeteer-core, class.html)
- 함정 발견: class.html 전체 스크립트가
(function(){ ... })() IIFE로 감싸여 있어
cvfPlayer/
CVFDecoder/
state 등 내부 변수가
window에 노출되지 않는다 —
puppeteer
page.evaluate에서 직접 참조 불가(항상
undefined, waitForFunction이
조용히 타임아웃). 판정은
DOM 관측치로 전환: 캔버스 픽셀(
#cvfCanvas getImageData),
프레임 인덱스 미러(
#cvfSeek.value — cvfRenderFrame이 매 프레임 갱신), 오디오
마스터클럭(
#cvfAudio.currentTime).
- 무료 레슨(o1_1) 선택 → CVF fetch+parse+최초렌더 2823ms(138MB, 2133프레임) → 캔버스 고유색 21(>20, 실프레임) → ▶ 클릭 → 3초 후 seek 0→25, audio.currentTime 0→2.88s, audioPaused=false.
- 스크린샷:
/tmp/class-cvf-play.png (실제 강의 화면녹화 프레임 렌더 확인, 타이머 0:02/3:56).
- 판정 로직 SSOT:
한선씨/class-cvf-playtest.한선(4항목 4상 판정: 실프레임판정·프레임전진판정·오디오전진판정·종합재생판정) — 컴파일+실행 검증 완료. 드라이버(puppeteer)는 부득이한 JS.
4. 관리자 대시보드 판정 배선
GET /api/admin/dashboard(Bearer ADMIN_TOKEN) 응답에
관리판정.한선 미러 함수(수강생비율·입금대기판정·수료율·대시보드상태) 결과가 실배선 확인:
json{"수강생수":0,"대기입금":0,"영상수":23,"과제수":0,"주차별진도":{},"정원":150,"수료율":0,"입금상태":"정상","모집상태":"모집중"}
5. 회귀
GET /api/lesson/curriculum → 200, 95레슨.
GET /api/enroll/status → 200, {capacity:150,enrolled:0,remaining:150,open:true}.
GET /api/community/portfolios → 200, 21건(showcase).
관련 파일
/Users/ef/crowny-class/server.js, modules/video/routes.js, modules/admin/routes.js
/Users/ef/crowny-class/public/class.html (CVF 캔버스 플레이어, IIFE 스코프)
/Users/ef/crowny-class/한선씨/관리판정.한선, class-cvf-playtest.한선(신규)
- 테스트 드라이버:
scratchpad/class-cvf-playtest.js (puppeteer-core)
- 업로드맵:
/Users/ef/crowny-class/영상원본/업로드맵.psv
잔여 이슈
- 없음 — 5영역 전수 실측 통과, 재현 3회 이내 완료(1회차 성공).
- task #17([정합] 동반 3파일 허위주장 정정)은 별도 세션(2a) 담당분 남아있음(영상엔진.한선) — 본 작업 범위 밖.
크라우니코드: lookup HIT 0건(재사용) / MISS 1건(생성: cvf재생판정) / learn 추가 1건