← 목록
기타 2026-07-12 7KB 읽기 7분

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 비디오 무로그인 Range206206
무료 CVF 오디오 무로그인 Range206206
유료 CVF 비디오 무로그인401401
유료 CVF 비디오 가짜 owner401401
구 mp4 stream(무료 id)410410
구 mp4 stream(유료 id)410410
video.crowny.org 구 다운로드(class_o3-1.cvf)404404
video.crowny.org 구 다운로드(class_o1-1.cvf)404404

3. 동반 3파일 재판정 (컴파일+로직+대응일치 3축)

  • 영상엔진.한선: hanseonc_high+crownyc run exit0, 21개 출력 라인 전부 정합. 파일 서두에
"실배선 없음 — 로직 미러 전용" 면책이 명시돼 있고, modules/video/routes.jsauthForStream/ handleCvf/handleCvfAudio를 실제로 읽어 로직(무료/관리자/수강생 허용, 파일없음 404)이 1:1 일치함을 확인. 과잉주장 없음 → 충실.
  • 관리판정.한선: exit0, 8개 출력 전부 JS와 일치(수강생비율 80, 수료율 8, 입금대기 정상/주의/긴급 등).
modules/admin/routes.jscomputeDashboard()가 동일 로직 함수를 실제로 호출해 응답에 입금상태/모집상태/수료율 포함하고, public/admin.html이 그 필드를 배지·통계카드로 렌더링하는 것을 코드로 직접 확인(고아 아님, 실사용). → 충실.
  • 프론트카피.한선: exit0, 24개 출력 전부 인라인 기대값과 일치(cvf재생상태 4케이스 포함).
아래 항목을 각각 실코드와 대조:
  • 상태배지문구 ↔ join.html statusLabel() + admin.html statusLabel()(신규 배선 확인) 일치
  • 미리보기요약(40자 절단) ↔ class.html truncate40() 일치
  • 주차라벨(0=오리엔테이션) ↔ class.html week0 특수분기 2곳 일치
  • 체험타이머문구/잠금안내문구 ↔ class.html trial UI 카피 일치
  • 계좌문구("확정 후 안내됩니다") ↔ join.html 폴백 문구 일치
  • 폰트정책(시스템스택) ↔ assets/class-type.css font-family 스택 일치
  • cvf재생상태/프레임인덱스계산 ↔ class.html cvfScheduleFrame 규칙과 일치(§4 실측으로 재확인)
  • 미배선 명시 항목(잔여석문구·가격문구)도 실제로 미사용임을 확인(index.html은 다른 포맷의
  • 하드코딩/별도 JS 사용) — 정직한 면책, 과잉주장 아님. → 충실.

    판정: 동반 충실 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는 학생에게 어떤 경로로도 도달 불가(스트림
    라우트 410, 정적서빙 미노출), CVF 경로만 실동작(캔버스 픽셀+오디오 마스터클럭 라이브 재확인).
    • 동반 충실: 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 엔드포인트 자체의 무인증 상태는 여전히 미해결(이전 세션 기록,
    class 파일은 이동으로 차단됐으나 다른 예측가능 파일명 우회 가능성 잔존).

    크라우니코드: lookup HIT 0건 / MISS 0건(신규 코드 생성 없음, 순수 감사·재검증) / learn 추가 0건