crowny-class CVF 단일화 재감사 — 적대검증 렌즈 단일화·충실 재확인 (2026-07-12)
개요
"CVF 단일화 미완이고 mp4가 여전히 학생에게 서빙된다 / 동반이 여전히 허위"라는 적대 가설을 세우고 독립 재검증했다. 가설 반증됨 — CVF 단일화 완료 상태 유지, 동반 3파일(관리판정·영상엔진·프론트카피) 전부 충실(컴파일+로직+대응일치) 확인. 단, 감사 범위 밖에서 새 잔여 갭 1건(운영 도구 stale 라벨) 발견.무엇을 했는지
1. class.html 실경로 재확인 (grep)
/api/video/stream호출 0건(설명 주석 1건만 잔존),/api/video/cvf/·/api/video/cvfaudio/2건만 사용.<video src=mp4>잔존 0건. mp4 관련 언급은 "폐지" 설명 주석뿐.- 정적파일 서빙 경로(server.js)가
PUBLIC(=public/)에 한정,DATA(=데이터/)와 분리 확인 →
데이터/영상/파일/*.mp4는애초에 정적 URL로 도달 불가(별도 라우트 없음).2. 라이브 E2E 재실측 (독립, 재기동 없이 실행 중인 서버에 직접 curl)
| 케이스 | 기대 | 실측 |
|---|---|---|
| 무료 CVF 비디오 무로그인 Range | 206 | 206 |
| 무료 CVF 오디오 무로그인 Range | 206 | 206 |
| 유료 CVF 비디오 무로그인 | 401 | 401 |
| 유료 CVF 비디오 가짜 owner | 401 | 401 |
| 구 mp4 stream(무료 id) | 410 | 410 |
| 구 mp4 stream(유료 id) | 410 | 410 |
| video.crowny.org 구 다운로드(class_o3-1.cvf) | 404 | 404 |
| video.crowny.org 구 다운로드(class_o1-1.cvf) | 404 | 404 |
3. 동반 3파일 재판정 (컴파일+로직+대응일치 3축)
- 영상엔진.한선:
hanseonc_high+crownyc runexit0, 21개 출력 라인 전부 정합. 파일 서두에
modules/video/routes.js의 authForStream/
handleCvf/handleCvfAudio를 실제로 읽어 로직(무료/관리자/수강생 허용, 파일없음 404)이
1:1 일치함을 확인. 과잉주장 없음 → 충실.
- 관리판정.한선: exit0, 8개 출력 전부 JS와 일치(수강생비율 80, 수료율 8, 입금대기 정상/주의/긴급 등).
modules/admin/routes.js의 computeDashboard()가 동일 로직 함수를 실제로 호출해 응답에
입금상태/모집상태/수료율 포함하고, public/admin.html이 그 필드를 배지·통계카드로 렌더링하는
것을 코드로 직접 확인(고아 아님, 실사용). → 충실.
- 프론트카피.한선: exit0, 24개 출력 전부 인라인 기대값과 일치(cvf재생상태 4케이스 포함).
join.html statusLabel() + admin.html statusLabel()(신규 배선 확인) 일치class.html truncate40() 일치class.html week0 특수분기 2곳 일치class.html trial UI 카피 일치join.html 폴백 문구 일치assets/class-type.css font-family 스택 일치class.html cvfScheduleFrame 규칙과 일치(§4 실측으로 재확인)판정: 동반 충실 3/3. task #17을 완료로 갱신.
4. CVF 캔버스 재생 실동작 독립 재확인 (puppeteer-core, 재실행)
기존 세션이 남긴 드라이버(scratchpad/class-cvf-playtest.js)를 그대로 재실행(재작성 없음):
선택된 레슨 id: o1_1
CVF fetch+parse+최초렌더 소요: 2764ms
캔버스 고유색 수(재생 전): 21 | seek0=0 | audioSrc=.../api/video/cvfaudio/mrgilkb817j8
3초 재생 후: seek=25 | audio.currentTime=2.87s | audioPaused=false | timeLabel=0:02 / 3:56 | 캔버스고유색=21
✅ class.html CVF 캔버스 재생 성공
스크린샷(/tmp/class-cvf-play.png) 육안 확인: 실제 강의 화면녹화 프레임(창/텍스트 흐림)이 캔버스에
렌더링, 일시정지 버튼 아이콘(재생 중 상태), 타이머 0:02/3:56, 시크바 진행 표시 — 합성 노이즈가
아닌 진짜 프레임. 판정 로직 SSOT 한선씨/class-cvf-playtest.한선(4상 판정) 기존 검증 유지.종합 판정
- CVF 단일화 진척률: 100% (학생 경로 기준) — mp4는 학생에게 어떤 경로로도 도달 불가(스트림
- 동반 충실: 3/3 — 관리판정·영상엔진·프론트카피 전부 컴파일+로직+대응일치, 정직한 면책 포함.
- 잔여 갭 (신규 발견, 원 임무 범위 밖):
public/file.html(운영 파일인벤토리)과
modules/admin/routes.js handleFiles()의 CVF_ROLE 상수·요약배너 문구가 CVF 단일화 이전 서술
그대로 남아 "실제 강의 재생=mp4, CVF=강의 미사용 보관"이라고 뒤집힌 설명을 관리자에게 표시함.
추가로 cvfDir이 /Users/ef/crowny-video/output(현재 class_*.cvf 0건 — 페이월 격리 작업으로
전량 데이터/영상/cvf/로 이동됨)을 그대로 가리켜 관리자 화면 CVF 카운트가 0으로 깨짐.
admin 전용 페이지(requireAdmin 게이트 확인됨)라 학생에게 mp4가 새는 문제는 아님 — "동반
허위" 가설의 학생서빙 축은 반증 유지. task #19로 등록.관련 파일
/Users/ef/crowny-class/한선씨/{영상엔진,관리판정,프론트카피}.한선(재검증, 무수정)/Users/ef/crowny-class/modules/{video,admin}/routes.js,public/{class,admin,join,index,file}.html- 잔여 갭 대상:
/Users/ef/crowny-class/modules/admin/routes.js(CVF_ROLE·cvfDir),public/file.html(배너) - 테스트 드라이버(재사용):
/private/tmp/claude-501/-Users-ef/f9b12166-e530-4008-96c1-e83df68283e2/scratchpad/class-cvf-playtest.js
잔여 이슈
- task #19: 운영 파일인벤토리 CVF 라벨/경로 stale 정정 (admin 전용, 학생 영향 없음 — 우선순위 낮음).
- crowny-video:9877
/api/download엔드포인트 자체의 무인증 상태는 여전히 미해결(이전 세션 기록,
크라우니코드: lookup HIT 0건 / MISS 0건(신규 코드 생성 없음, 순수 감사·재검증) / learn 추가 0건