CIF(크라우니 이미지 포맷) 설계정리 — 결정 가능한 상태로
목적: 크라우니클래스 세션이 "별도 세션으로 미뤄둔 CIF 설계 정리"를 결정 가능한 문서로 확정한다. 원칙: 실측(이 세션에서 코드/스펙 직접 확인)과 추측(문서·메모리 기반)을 구분 표기한다. 이 포맷의 과거 사고가 "코드에 없는 원설계를 있다고 믿은 것"이었으므로, 근거 없는 주장을 싣지 않는다. 이번 임무 범위 = 설계 정리(문서)까지. 코드 수정 없음.
표기 규약: [실측] = 2026-07-22 이 세션에서 파일/라이브서버 직접 확인 · [문서] = CrownyDoc·메모리 기록(재검증 안 함) · [추론] = 근거로부터의 판단.
① 포맷 계보 (래스터 원본 → 오염 → 적대검증 → 현재)
계보 5줄 요약
- 3월 원본 = 래스터. 최초 실물
cif.js(2026-03-18)·cif.한선/cif2.한선(2026-03-25)은 전픽셀 래스터 → 3×3 재귀분할(트릿-트리) → 씨앗(Seed) 접기. 파라메트릭 벡터(path/curve/gradient)는 씨앗에 0건.[문서: 인수인계 22~32행, 메모리] - "벡터형/방사형 원설계"는 코드에 존재한 적 없다 — "벡터형"의 실뜻은 3트릿 색상벡터[R G B](벡터그래픽 아님), "방사형 퍼짐" t[18..23]은 v2.0 스펙 주석에만 존재하고 인코더가 한 번도 인코딩 안 함(사산).
[문서: 메모리 12~14행 — 07-12 울트라 14에이전트 적대검증 결론] - 진짜 오염 = 06-11.
rasterToCIFv3실사진 피벗 + v3.1 사진코덱 기법 + 구현 4~5갈래 분기로 정본 소실, 경고 3회 무시. 이게 "설계원리 이탈" 가설의 실체.[문서: 메모리 15행, 4K밸런싱 분석] - 적대검증(07-12) → 사장님 가설("2·3월 벡터/방사형 원본이 오염됐다")은 반증됨: 오염된 건 맞으나 원본은 래스터였고 벡터/방사형은 애초에 코드에 없었다.
[문서: 인수인계 3~8행] - 현재(07-22) = 정체성 분리로 정리 완료. CIF-R(래스터 쿼드트리) / CIF-V(진짜 파라메트릭 벡터) 두 포맷으로 명명 분리, 매직·인코딩원리·용도 전부 다름.
[실측: 두 스펙 파일 직접 확인]
근거 인용 (파일:라인)
[실측] /Users/ef/crowny-image/CIF_SPEC.md:1— 문서 제목이 "CIF-R (Crowny Image Format — Raster 쿼드트리) v2.1"로 개명됨. §0(9~25행) 적용범위: 사진·노이즈 부적합, 06-11 실측 20.8배 참패 인용. 버전이력(365행)에 07-12 명명정정 기록.[실측] /Users/ef/crowny-image/CIFV_SPEC.md:1— "CIF-V ... v1.0 [확정 — 2026-07-12 적대감사 pass·결함5건 수리·독립재검증 완료]". §4.2(75~78행): v2.0이 주석으로만 선언했던 t[18..23] 퍼짐을 방사그라디언트로 실동작 구현("퍼짐의 부활").[실측] /Users/ef/crowny-image/server.js:226,254,1531— 구세대 인코더 경로 3곳[DEPRECATED 2026-07-12] 미배선 죽은 경로주석 마킹. 라이브는rasterToCIFv3(533행)·civToPixelBuffer(1341행).
② 현행 스펙 요약 (실코드 기준)
두 포맷 병존 — 별개 포맷임을 코드가 강제 [실측]
| 항목 | CIF-R (래스터 쿼드트리) | CIF-V (파라메트릭 벡터) |
|---|---|---|
| 정본 스펙 | crowny-image/CIF_SPEC.md v2.1(문서상)/v3 라이브 | crowny-image/CIFV_SPEC.md v1.0 |
| 매직 | CIF! (0x43494621) | CIV! |
| 확장자 / MIME | .cif / application/x-cif | .civ / application/x-civ |
| 저장 단위 | 씨앗(Seed) = 1큐브 27트릿 (트릿-트리 리프) | 명령(디스플레이 리스트) op 1~9 |
| 인코딩 원리 | 픽셀격자 3×3 재귀분할, 균일영역=씨앗1개 | 도형 파라미터 직접 기술(페인터 위→아래) |
| 정수 인코딩 | 혼용: 좌표 LSB-first·색 MSB-first (v3 함정) | 전 필드 LSB-first 통일 |
| 좌표폭 | v2.1=3트릿(±13, 모자이크 한계) → v3 헤더 좌표폭:8(±3280) | 헤더 좌표폭(기본 8), 코드포인트 14트릿 |
| 색 | 3트릿(27색)/9트릿(19,683색) | 9트릿(R3+G3+B3) |
| 라이브 인코더 | rasterToCIFv3(server.js:533) | 업로드 수용(server.js:1716) |
| 라이브 디코더/렌더 | 래스터경로 /png/:id, /render(PPM) | civToPixelBuffer(1341), parseCIVContent(926), decodeCIVCommand(951) |
CIF-R 씨앗 구조 (27트릿) [실측: CIF_SPEC.md:82~116]
t[0-2]위치X · t[3-5]위치Y · t[6-8]깊이Z · t[9-11]R · t[12-14]G · t[15-17]B · t[18-20]너비 · t[21-23]높이 · t[24]리프여부 · t[25]타입 · t[26]예비. 균형3진 T(+1)/O(0)/A(-1), U=큐브경계.
- v3 좌표폭 확장
[실측: crowny-image/CLAUDE.md "CIF v3.0"]: v2.1의 13×13 모자이크 한계 원인 = 좌표 직렬화가 3트릿(±13)이었던 것. v3.0이encodeSeedLineV3/decodeSeedLineV3(x,y,w,h 각 8트릿)로 해소.좌표폭헤더 없으면 v2.1 폴백(하위호환). - 본래 목적 = 저대역폭 통신
[문서]: HD CIF 인코드 → 단말에서/png/:id?w=3840&h=2160로 4K 업스케일(해상도 독립 벡터성). HD 298KB → 4K표시가 4K직접전송 대비 51× 절감, 정합성 85(픽셀화).
CIF-V 명령 어휘 (op 3트릿, 1~9) [실측: CIFV_SPEC.md:59~69]
1 배경 · 2 사각형 · 3 원 · 4 직선(두께) · 5 다각형(even-odd) · 6 경로(M/L/Q/Z, Q=De Casteljau 8분할, even-odd) · 7 선형그라디언트 · 8 방사그라디언트(감쇠 A=√p완만/O=p선형/T=p²급격) · 9 글리프(nonzero winding, cifv4 아웃라인 EM=1000).
- 더블 구현(정본 2)
[실측]: 한선씨CrownyOS/crownyc/libs/CIF벡터.한선(48KB) + RPN 정본CIF벡터.rpn.한선(68KB, 존재 확인) + JSserver.js. 헌법상 RPN 정본화 요건 충족. - 글리프 정본 = crownyc.c
fb_fill_glyph_v4[실측: CIFV_SPEC.md:88~98]: 앵커=글리프박스 좌상단, 베이스라인 by=y+0.80×size, AA=4×4 슈퍼샘플. VM PPM vs JS PNG 최암픽셀 거리 ≤8px로 정합 검증(완전 bit-identical은 비보장).
검증 상태 [실측]
- 라이브 서버 9872 정상 —
/health→{"상태":"정상"}. - CIF-V 라운드트립 라이브 확인 —
samples/데모.civ(568B, op 9종) 업로드 →이미지ID:2565ef239462ab1a,원본형식:CIV저장 성공. - CIF-R 라이브 소비처 존재 — os-site 3D 월드 데스크톱 배경:
world.js:81이desktop-bg.cif/ground-bg.cif를 선택, 브라우저 디코더os-site/cif-decode.js가 렌더. (CIF-R은 실배선된 소비처가 있음.)
③ 미해결 설계 쟁점
쟁점 A — 방사형/벡터의 "재도입" 여부
[실측]: 이미 부분 재도입됨. CIF-V §4.2가 v2.0의 사산 "퍼짐"을 방사그라디언트로 실동작 구현(양 렌더러 동일). "벡터" 역시 CIF-V라는 별개 포맷으로 신설·라이브.[추론]: CIF-R(래스터 쿼드트리)에도 벡터/방사 프리미티브를 섞을 것인가, 아니면 CIF-R은 순수 래스터로 못박을 것인가. 과거 오염의 핵심이 "래스터 포맷에 사진코덱·벡터 개념을 뒤섞은 것"이었으므로, 혼입 재개는 06-11 오염의 재발 경로다.쟁점 B — CIF-V 소비 경로 0 (고아 재발 위험)
- 현황
[실측]: CIF-V를 소비하는 서비스 페이지 없음 —samples/데모.civ1건뿐. 반면 CIF-R은 os-site 배경으로 실배선.[문서: 후속계획 6행 "아직 데모만, 실적용 0"] - 쟁점: 검증만 된 CIF-V를 실자산(로고·아이콘·6561 시그니처·UI 그래픽)에 적용해 소비 경로를 만들 것인가. 07-12 적대검증이 경고한 "고아" 패턴의 정면 대상.
쟁점 C — CVF(영상 포맷) 처분
- 현황
[문서: 메모리 22~24행, 후속계획 17행]: CVF는 mp4 대체 불가 6축 전패(디코드 2.6s·RAM 1.19GB·시킹 없음·플레이어 0종·PSNR 29 vs h264 37). 소스 파일 삭제(2.9GB 회수), 강의=mp4 정본. CVF_SPEC.md는 crowny-video에 잔존[실측: 파일 존재]. - 쟁점: (a)모션그래픽 전용 니치로 유지 (b)셸브 (c)v4.1 투자(GOP 인덱스+WASM 플레이어+오디오 컨테이너). 현재 실수요 0.
쟁점 D — hanseonc_rpn 1000변수 한계 (인프라 부채)
- 현황
[문서: 후속계획 21~23행]: 대형 라이브러리+호출자 변수합 >1000이면 통짜 RPN 단독 컴파일 불가(영역 9000~9999 고정 1000슬롯). 헌법상 RPN 정본화의 병목. (단 CIF벡터.rpn.한선은 이미 존재 — 분할/우회로 통과한 것으로 추정[추론].) - 쟁점: hanseonc_rpn.c 변수테이블 확장 vs 모듈 분할 규약 표준화. CIF 외 대형 라이브러리 공통 영향.
쟁점 E — stale 메타 / 잔존 사료 정리 (무해)
- 현황
[문서: 후속계획 25~30행]: class 영상 메타 JSON 23개가 삭제된 CVF(cvfStatus:ready)를 가리킴(프런트는 mp4라 무영향). CVF변환기.한선:67 좌상단 1픽셀 손실버그[문서: 인수인계 19행]— CVF 삭제로 사문화.
④ 권고안 (쟁점별 4상 판정 + 다음 액션 1줄)
4상: 티=확정 실행 / 옴=추가검증 후 실행 / 타=폐기 / 음=사장님 결정 필요
| 쟁점 | 판정 | 근거 | 다음 액션 (1줄) |
|---|---|---|---|
| A. CIF-R에 벡터/방사 혼입 | 타(폐기) | 정체성 분리가 이번 정리의 성과. 혼입 = 06-11 오염 재발 경로. 방사/벡터 니즈는 이미 CIF-V가 흡수 | CIF_SPEC.md §0에 "CIF-R은 순수 래스터 — 벡터/그라디언트 프리미티브 혼입 금지" 1줄 명문화(스펙 고정) |
| B. CIF-V 실적용(소비경로) | 티(확정 실행) | 검증 완료·라이브 라운드트립 확인. 고아 방지가 07-12 적대검증의 핵심 권고 | 로고/6561 시그니처 1~2종을 .civ 인코딩 → image.crowny.org 등록 → 서비스 페이지 /png/:id 벡터 배선 + PNG/SVG 대비 크기·선명도 실측 |
| C. CVF 처분 | 음(사장님 결정) | 빌드 아님·방향 결정 사안. 실수요 0, mp4로 충분. 애니메이션/6561 비주얼 로드맵 유무에 종속 | 사장님께 (a)모션그래픽 니치 유지 / (b)셸브 / (c)v4.1 투자 3안 제시 → 답 받은 뒤 실행 |
| D. hanseonc_rpn 1000변수 한계 | 옴(추가검증 후) | 인프라 부채. CIF벡터.rpn.한선이 이미 존재하므로 CIF-V는 당장 안 막힘 — 실병목 재현 필요 | hanseonc_rpn.c 변수테이블 상한 재현 테스트 → 확장 vs 모듈분할규약 중 택1 (별도 인프라 태스크) |
| E. stale 메타/사료 | 옴(추가검증 후) | 무해·저우선. 프런트 무영향이나 감사 노이즈 | class 메타 JSON 23개 cvf 필드 리셋 스크립트(선택) — CVF 처분(C) 결정 후 일괄 |
음(사장님 결정 필요) 항목 — 최종 확인 요망
- 쟁점 C: CVF 처분 — 유일한 음. (a)모션그래픽 전용 포맷으로 유지 / (b)셸브 / (c)v4.1 투자(실수요 확정 시). 현재 실사용처 0, 강의는 mp4 정본으로 충분. 사장님 방향 지시 전까지 CVF는 현상 동결(소스 삭제·SPEC만 잔존) 유지 권고.
관련 파일 (정본 목록)
스펙 SSOT [실측]
/Users/ef/crowny-image/CIF_SPEC.md— CIF-R(래스터 쿼드트리) v2.1/v3 정본/Users/ef/crowny-image/CIFV_SPEC.md— CIF-V(파라메트릭 벡터) v1.0 정본/Users/ef/crowny-image/CLAUDE.md— image.crowny.org 서비스 규약(v3.0·CIF-V 절)/Users/ef/crowny-video/CVF_SPEC.md— CVF 정본(동결, 소스 삭제 상태)
구현 정본 [실측]
/Users/ef/crowny-image/server.js— 라이브:rasterToCIFv3(:533, CIF-R 인코더)·parseCIVContent(:926)·decodeCIVCommand(:951)·civToPixelBuffer(:1341, CIF-V 렌더). DEPRECATED 죽은경로 :226/:254/:1531/Users/ef/CrownyOS/crownyc/libs/CIF벡터.한선(48KB) +/Users/ef/CrownyOS/crownyc/libs/CIF벡터.rpn.한선(68KB, RPN 정본) — CIF-V 한선씨 더블구현/Users/ef/CrownyOS/crownyc/libs/CIF.한선(15KB) — CIF-R 표준 라이브러리/Users/ef/CrownyOS/crownyc/crownyc.cfb_fill_glyph_v4(:1141) — 글리프 렌더 정본(VM 불변)/Users/ef/CrownyOS/os-site/cif-decode.js+world.js:81— CIF-R 라이브 소비처(월드 배경)
근거 문서 [문서]
/Users/ef/CrownyDoc/projects/2026-07-12-CIF-설계원리-적대검증-인수인계.md— 사장님 가설·오염 census/Users/ef/CrownyDoc/projects/2026-07-12-CIF-CVF-후속작업계획.md— P1~P3 계획/Users/ef/CrownyDoc/projects/2026-07-12-크라우니클래스-세션종합.md— CIF↔class 접점(왜 미뤘나: opus 세션 분리+class는 mp4 마무리)- 메모리
/Users/ef/.claude/projects/-Users-ef/memory/project_cif_cvf_적대검증_래스터원본.md— 적대검증 결론 정본
크라우니클래스 ↔ CIF 접점 (왜 미뤘나) [문서: 인수인계 6~8행, 세션종합 17행]
class 강의영상 CVF 변환에서 "CIF 오염" 발견(진짜 RD-CIF는 server.js뿐, cvf-codec.js는 구세대 복제) → 사장님이 "CIF 설계원리 적대검증"을 지시. 그러나 opus 세션이 계속 내려오는 문제로 세션 분리: class 세션은 강의재생을 mp4로 마무리하고, CIF 설계정리는 별도 세션으로 이관. 그 이관분이 본 문서로 종결됨.잔여 이슈
- 쟁점 B(CIF-V 실적용) 실행 = 다음 세션 P1 진입점.
- 쟁점 C(CVF)는 사장님 결정 대기 — 결정 전 코드 변경 금지.
- 쟁점 A 권고(스펙 §0 명문화 1줄)는 문서 수정 사안이나, 이번 임무는 설계정리까지이므로 스펙 파일 편집은 별도 승인 후.
2026-07-23 정정 — 쟁점 C(CVF 처분)의 "실수요 0"은 부정확
같은 날 크라우니클래스(class.crowny.org:9864) 영상 파이프라인 종단 실측(별도 트랙)에서 CVF 라이브 생산·서빙 경로가 확인됨:
- 업로드마다
scripts/encode-upload.sh가crowny-video/lib/cvf-encoder.js로 CVF 생성(데이터/영상/cvf/class_<id>.cvf+.cvf.mp3+ ccp 아카이브) — [실측] 샘플 업로드에서 2,196,558B CVF 생성 확인. - 서빙 엔드포인트
/api/video/cvf/<id>·/api/video/cvfaudio/<id>Range 206 실측 통과. - 단, 수강생 실재생 정본은 mp4(
/api/video/stream/<id>)이고 CVF는 관리자/아카이브용.