os.crowny.org 렌더러 현황 감사 + 빛의아이들 스카이류 게임 기초 정리
2026-07-12 · 울트라 2라운드 감사(39 서브에이전트, sonnet/opus/haiku 분업, 적대검증+완결성비평) · 읽기전용 감사 원칙(라이브 무접촉, 단 승인받은 보안패치 1건 예외)
개요
사용자 질문 셋: (1) os.crowny.org 렌더러 현황 파악, (2) "크라우니VM 위 크라우니OS 위 순수 한선씨 렌더러/3D엔진"으로 만들었는데 수정·오염된 것 확인·정리, (3) 빛의아이들 스카이류 게임(캐릭터/배경/사운드/무빙 이미지처리) 사전 기초 정리.
1. 렌더러 현황 — 정직한 진실
os.crowny.org(:9150, node os-site/server.js)의 실제 렌더러는 "순수 한선씨 3D엔진"이 아니다. 오염된 것이 아니라 애초에 그렇게 만들어진 적이 없다 — 처음부터 "데이터/로직정본=한선씨, 픽셀그리기=JS" 분업 설계다.
실픽셀을 그리는 4주체는 전량 수기 JavaScript이고, 이 렌더/드로우/이벤트루프 로직에 대응하는 .한선 동반 파일이 하나도 없다(헌법 "한선씨 동반 필수" 위반):
| 렌더 주체 | 파일 | 기법 | .한선 동반 |
|---|---|---|---|
| 마을 3D 씬 | os-site/village.js (1238줄/90KB) | Canvas2D + 페인터 Z정렬 | 없음 |
| 월드 데스크톱 | os-site/world.js (378줄) | CSS3D transform3d (DOM) | 없음 |
| 부팅 스플래시 | os-site/town.js (296줄) | Canvas2D | 없음(주석은 "3D렌더러.한선 1:1"이라 허위) |
| 캐릭터 뷰어 | raion27-viewer.html 인라인 | Canvas2D 수동 투영 | 없음 |
- (a) 캐릭터 파츠 데이터 빌드타임 생성:
인간9.한선/사자27.한선/라이온27.한선→human9.js/raion27roster.js등 (런타임 무관, 빌드 1회). - (b) 물리 AOT WASM:
이동엔진.한선/액터.한선/지구셀_입력.한선→ toau2c→C→clang wasm32 →이동.wasm/액터.wasm/지구셀.wasm. - (c) 씬 JSON:
스튜디오/장면3D.한선→scene.json→씬빌드.sh→village.html주입.
★결정적 발견: 라이브 한선씨 실행 ≈ 0%
라이브 :9150에서 이동.wasm/액터.wasm/지구셀.wasm 3개가 전부 HTTP 404다. 원인은 server.js:521이 req.url.split('?')[0]만 하고 한글 파일명의 percent-encoding을 decodeURIComponent 하지 않아 디스크의 한글 파일과 매칭 실패. 세 로더는 404를 조용히 삼켜 JS 폴백(village.js:835 MoveEngine undefined 분기, stepJS/wanderJS)으로 넘어간다.
결과: 화면은 정상 렌더되지만, 지금 라이브 브라우저에서 실행되는 한선씨 유래 코드는 사실상 0이다(물리조차 100% 수기 JS 폴백). WASM 3종은 컴파일러(hanseonc_high·crownyc.c 7/11)보다 18~20일 뒤처진 6/21~6/22 빌드로 stale-toau 위험군이기도 하다.
2. 오염·규약위반 정리표
round-1의 "RCE 전면"·"3파일 절단"은 각각 정밀화됐다(RCE는 실재했고 패치 완료, 0바이트 스텁은 오히려 대폭 과소집계였음). 오염은 라이브 os-site가 아니라 sibling apps/에 집중.
| 항목 | 경로 | 조치 | 위험도 | 상태 |
|---|---|---|---|---|
| 인증없는 공개 RCE | server.js case 'unknown' | 셸실행(execSync) 제거 | — | ✅ 패치·재기동·실증 완료(승인받음) |
| twin 하드코딩 기본토큰 | server.js TWIN_TOKEN | 환경변수 필수 fail-closed + plist 강한토큰 | — | ✅ 완료 |
| twin exec 셸 메타문자 우회 | server.js /twin/api/exec | [;&\|$(){}<>]` 정규식 차단 | — | ✅ 완료 |
| WASM 물리 라이브 404 | server.js:521,15 | decodeURIComponent(u) + .wasm MIME 추가 | needs_approval | 대기(최우선 권고) |
| 뷰.한선 섀도잉(사본 10개) | apps/뷰.한선 등 | 정본만 남기고 폐기/심링크 | needs_approval | 대기 |
| RPN 방언 렌더러 8종 확장자 | apps/CAD*.한선 등 | .rpn.한선 개명 또는 폐기(Raion EV CAD 고아) | needs_approval | 대기 |
| town.js 허위 주석 | os-site/town.js:3 | 주석 사실 정정 | needs_approval | 대기 |
| village.js 로직 .한선 미러 부재 | village.js:65-102,562-637 | 카메라/투영/포즈/컬링 수학 → 3D렌더러.한선 소비 재작성 → WASM AOT | needs_approval | 대기(아키텍처 착수점) |
| stale WASM 3종 | crownyc/wasm/toau2c-wasm-build.sh | 4항 mtime 가드로 재빌드 | needs_approval | 대기 |
| 0바이트 .한선 스텁 ~28개 | apps/ (문서·게이트웨이·메인서버v2 등) | 무참조 확인 후 삭제 | destructive | 대기 |
| 스트레이 .toau 산출물 10+ | apps/메인서버.toau 등 | 소스트리서 삭제(재컴파일 재생성) | destructive | 대기 |
| 103일 미커밋(1171 변경) | CrownyOS 전체 | crowny-hub commit-all+handover | needs_approval | 대기 |
| crowny-dom-host.js 빈스텁 fb_ | crownyc/crowny-dom-host.js | 오인방지 경고 주석 | safe | 대기 |
3. 스카이류 게임 기초 — 6축 자산맵
빛의아이들 스카이(Sky: Children of the Light) 장르 기준. 크라우니는 이미 기술 골격 절반을 라이브로 보유.
| 축 | 있는 것(have) | 만들 것(need) | 첫 단계 |
|---|---|---|---|
| 캐릭터 | 인간9/사자27.한선 파츠정본(망토·왕관·후광), 캐릭터모델러.한선(box/구 리그, STRICT 0), OBJ/STL 내보내기 | 부모-자식 본계층(FK) 부재, IK, 부분조합 커스터마이징, 표정 | 캐릭터모델러.한선에 _부모 배열 추가→FK 포즈합성, 절차적애니.한선 2본 IK 이식 |
| 배경 | CIF 이미지 7종(STRICT 0 컴파일검증), cif-decode.js, 장면3D.한선→scene.json 자동주입 | 근평면 클리핑 부재(50유닛 타일 우회), 씬 뒷면컬링 없음, 씸리스 청크 스트리밍 없음 | 3D렌더러.한선 투영행렬(near/far)·NDC를 project()에 이식 |
| 사운드 | village.js Web Audio 절차생성 BGM(펜타토닉+4코드, 라이브), 마을음악.한선 데이터정본, 서버측 음재생/음톤(opcode881/884, afplay 실증) | 악기 합주 입력계, SFX 트리거, 보이스 | 악기.한선(음계데이터)+Web Audio 노트+chat릴레이 브로드캐스트 |
| 무빙 | 이동엔진/액터.한선(AOT, STRICT 0), 보간.한선, 키프레임애니메이션.한선(이징7종), 절차적애니.한선(2본IK/척추/호흡) | village.js gait 100% 수기 JS(한선씨 0%), Y축 비행물리(글라이딩) 없음, 애니메이션엔진.한선/모션캡처.한선 스텁 | 보행애니.한선 신설(gait sin식+파츠매핑 이식)→village.js는 순수렌더러로 축소 |
| 엔진 | toau2c→clang wasm32 AOT(geocell 실증), FB_ 프리미티브 15종 네이티브 | WASM 3종 404(blocker), IMAGE_LOAD 픽셀→화면 브리지 opcode 0건(스프라이트 blocker), crowny-wasm은 FB 4종만 매핑 | server.js decode+wasm MIME → 물리 라이브로드 복구(최저비용 최대이득) |
| 네트워크 | presence.crowny.org:9788 WS 릴레이 라이브(node PID1726 실측), village.js PRESENCE(join/state/chat/원격아바타보간), 마을프레즌스.한선 스펙정본, WS opcode 780-787(2026-07-08 수정됨) | 릴레이 실로직이 JS(한선씨우선 위반), 손잡기/합주 브로드캐스트 없음 | WS opcode로 셀서버 릴레이 .한선 그림자구현(라이브 무접촉) |
스카이 10요소 커버맵
- 커버(4): 글라이딩/비행(village.js 4단), 온라인 프레즌스(만남·이동동기화·채팅), 스튜디오 3집사 캐릭터생산공정, 씬/서정적 BGM.
- 부분(3): 커스터마이징(9인간/27라이온 프리셋 통째선택, 부분조합 아님), 오픈월드(단일 마을 캔버스), 아트미학(로우폴리 복셀, 스카이 실사 아님).
- 갭: 빛/촛불 수집 진행루프 통째 부재(blocker) — 스카이 진행의 심장, 악기 합주(high), 이모트/손잡기 감정소통(medium).
MVP (2~3주 검증 슬라이스)
village.html(비행4단+점프+중력, 프레즌스, 인간9/사자27 피커, Web Audio BGM — 전부 이미 라이브)을 베이스로 재사용 + 신규 3개만:
- 수집물.한선 — 씬에 촛불 배치 + village.js 근접픽업+카운터+27칸 인벤토리(closeInventory 골격 재사용). 한선씨=수집판정, JS=픽업렌더.
- 이모트.한선 — 프레즌스 state 패킷(:735)에 emote/손잡기 필드 확장 + 이모트휠 UI.
- 악기.한선 — 음계 데이터정본 + Web Audio 노트 트리거 + chat릴레이 확장 브로드캐스트(여럿이 맞추는 합주).
4. 반드시 피할 함정 (실측)
- WASM 폴백 상시동작 착시: wasm 404여도 JS폴백이 조용히 대신 돌아 화면 정상 → "한선씨 물리 돈다" 오인 금지. curl/네트워크탭 실측 필수.
- toau2c 축소런타임: crownyc.c 1628 opcode 중 74개만 재구현, 미구현은 조용한 no-op → wasm 대상 한선씨에 새 내장함수 쓰면 에러 없이 결과만 틀림. 4항 mtime 가드 필수.
- IMAGE_LOAD(757): PNG/JPEG 진짜 디코딩하지만
crowny_image_handle_pixels()호출 opcode 0건 → 픽셀 접근 불가(스프라이트/텍스처 blocker, C패치 선행). - 동반장식 스텁: 스프라이트그리기()·사운드.한선 재생()·애니메이션엔진.한선·모션캡처.한선 = 출력값() 로그만, 렌더/오디오 opcode 0건. 함수명 믿지 말고 본문 확인.
- 이미지.한선(RPN)·캔버스.한선: 픽셀설정/RGB 호출 78건이 미인식단어=0 조용한 치환. RPN은 @접두 관용구+rpn숙련.sh 검사 필수.
- 브라우저 WASM 오디오 원천불가: AUD_ afplay는 샌드박스서 무의미 → 게임 사운드는 무조건 Web Audio JS + 한선씨 데이터정본.
- VM 산술: 나눗셈 자연반올림(이진탐색 무한루프), 배열 1023/4095캡, 맵 길이()=항상0(맵있나 사용), % 균형나머지 음수, 버퍼잘라 3인자=끝오프셋, 정수 오버플로 ±3^24 silent wrap, 음악주파수 2^(n/12) VM 정수나눗셈 불가(JS 합성).
관련 파일
- 라이브:
os-site/server.js(패치완료),os-site/village.js(1238줄 실렌더러),presence :9788 - 한선씨 정본:
crownyc/pkg/libs/3D렌더러.한선·삼각도.한선·캐릭터모델러.한선,os-site/{인간9,사자27}.한선,스튜디오/장면3D.한선·3집사,시작화면/{마을음악,마을프레즌스}.한선 - WASM:
crownyc/wasm/toau2c-wasm-build.sh,os-site/{이동,액터,지구셀}.wasm(라이브 404) - 백업:
scratchpad/server.js.bak,scratchpad/com.crowny.os.plist.bak
실행 결과 (2026-07-12 같은 세션)
- ✅ 공개 RCE 차단 — server.js
unknown셸실행 제거 + twin 토큰 fail-closed + 셸 메타문자 차단. 재기동·실증 완료. - ✅ wasm 404 근본수정 — server.js에
decodeURIComponent(u)+.wasmMIME 추가 → 이동/액터/지구셀.wasm200 application/wasm복구. 라이브 한선씨 물리 실행이 0%→실재. - ✅ apps/ 오염정리 — 무참조 42개(0바이트 .한선 27 + 스트레이 .toau 15) 백업 이동(scratchpad/apps-cleanup-backup).
- ✅ MVP 착수·라이브 실증 — 게임슬라이스/{수집물,이모트,악기}.한선(컴파일 STRICT0+실행+학습) + 컴패니언 게임슬라이스.js(340줄) + village.html §1 + village.js §2(VillageHook)/§3(촛불 billboard). 헤드리스 스크린샷 실증: 마을 3D + 촛불 26개 글로우 광원 + 🕯️수집0/26 HUD 라이브. 로컬 커밋(8810497, push 미사용).
적대검증 결과 (같은 세션, 6에이전트)
★내 "RCE 차단" 주장이 반박됨 → 심층 재수정 완료. 1차 패치가unknown 케이스만 고쳤는데, 같은 server.js dispatch에 무인증 셸실행이 더 있었다(전부 실증·수정·재검증):
file_list:ls -la "${dir}"→$(touch)마커로 RCE 실증 → fs.readdir(/Users/ef 제한)으로 교체.hanseon_run: 사용자 한선씨 컴파일+실행(체계()=셸) → 공개 비활성화./twin/api/file:startsWith미정규화../etc/passwd유출 → path.resolve 재검사./twin/api/exec: 인자 경로제한0/etc/hosts유출 + firstWord 부분매칭 버그 → 정확매칭+경로제한.- %00 DoS(내 decodeURIComponent 회귀): NUL→fs.readFile 동기throw 크래시 → NUL 가드 400. 8/8 재검증 통과, run() 전수조사로 잔여 없음 확인. 커밋 9457935.
MVP=순수로직 정확하나 연동 정합성 반박: 진열장 슬롯인덱스 충돌(high, 촛불↔상점 crowny.진열장 크로스오염), 촛불 8/26 씬겹침(high, 건물내부4·나무동일좌표4), 수집후 FACES 미제거(medium), addBillboards id누락 위상동기화(medium), fixedTick 정지조건 부재(low). 게임 버그(보안 아님) — 수정 대기.
3D 최적성=optimal false: village.js는 유효 베이스지만 "지금 그대로"는 최적 아님. 4대 천장 — ①페인터+z버퍼없음(매프레임 3중정렬, 상호관통 해소불가) ②근평면 클리핑 부재(정점1개 뒤면 통면드롭→벽 근접 증발, 지면50유닛타일=반창고) ③project() 프레임불변 F/R/U 기저를 매 정점 재계산(~4N 중복=오브젝트수 실질병목) ④프러스텀 컬링 전무. 권고=하이브리드 C 단계적: 백엔드무관 병목 먼저 제거→fillrate 한계시 드로우콜만 WebGL 승격(씬데이터·수학은 한선씨/WASM 유지, MoveEngine 선례). 배제=전면WebGL재작성(조기최적화·헌법이탈)·한선씨소프트래스터(platform_wasm FB케이스 0건→GPU없어 Canvas2D보다 느림). 정정: IMAGE_LOAD 757 픽셀브리지는 브라우저 스프라이트 경로 아님(wasm런타임에 없음)—브라우저 스프라이트=ctx.drawImage(단기)/WebGL텍스처(중기).
3D 로드맵(우선순위): 0.보안P0(완료) → 1.project() 기저 프레임당1회 호이스트(1-2h) → 2.근평면 폴리곤클리핑 Sutherland-Hodgman(0.5-1d) → 3.프러스텀+거리컬링+월드 뒷면컬링(0.5d) → 4.캐릭터 FK 본계층 리깅(1-2d) → 5.(A완료후)드로우콜만 WebGL 승격. 1~4는 한선씨/WASM 이관 적합(3D렌더러.한선 행렬 재사용).
a,b,c 후속 실행 (같은 세션, 전부 스크린샷/curl 실증·커밋)
- (a) MVP 게임버그 4종: 촛불 11개 재배치(건물4·나무4·덤불2·분수1→개방잔디, python 충돌검증)·슬롯키 분리(crowny.진열장→crowny.촛불진열, 상점 크로스오염 차단)·addBillboards id추가(개별 위상 복원)·VillageHook.removeCandle(수집시 FACES splice). 커밋 cda8a6a.
- (b) 3D 로드맵 ①②: ①project() look-at 기저 (eye,target)당 1회 캐시(_view+project 분리, EYE 매프레임 재할당 불변식, 정점마다 hypot×2+외적→프레임당1회, 렌더 불변 스크린샷). ②drawQuadTri 근평면 Sutherland-Hodgman 클립(정점1개 뒤면 통째드롭→근평면서 잘라 렌더, 벽 근접 증발 해소). 클립 수학 단위검증(2앞2뒤=이전0→이제4정점)+일반시점 무회귀. 커밋 727c0ba·1ca7262.
- (c) 보안 하드닝: CORS 와일드카드 제거→crowny.org·localhost 화이트리스트(res.req origin 검사, evil.com ACAO없음·os.crowny.org 반사 실증). twin plist/token 권한 644→600. 커밋 de6e448.
- ③ 월드 뒷면+거리 컬링: boxFaces에 바깥법선 n+중심 c3 저장, culled()(캐릭터 654행과 동일
>=0 skip규약, flat 지면/빌보드 제외) 렌더루프 필터. 박스면 45% 컬링(뒷벽) 계측+렌더 불변 스크린샷. 커밋 a242494. - ④ 캐릭터 FK 리깅 — 보류(판단): 파츠(라이온27/인간9.한선)에 관절/피벗 데이터 부재(평면 파츠+이름만), 보행=파츠 translate(cz+=gait, 610-613행). 진짜 FK는 파츠 스키마에 부모/피벗 추가→생성기→렌더러 다중파일 변경 + 애니 품질은 정적 스크린샷 검증 불가(걷는 동작 필요)라 라이브 애니 리뷰 세션에서 진행 권장(검증불가 애니 변경의 라이브 회귀 위험 회피).
- 남은 3D: ④(라이브 애니 리뷰 시) → ⑤드로우콜만 WebGL 승격(fillrate 한계 시).
스카이 비행 손맛 1~3단계 (같은 세션, 물리 시뮬·단위테스트·무회귀 검증)
붙임 조언(유니티/언리얼 전제)을 형님 스택(village.js Canvas2D + 이동엔진.한선 + presence:9788)에 맞게 재설계. 맵 물량은 "미터 아닌 프레임당 가시 면 수"로 재는 게 정답(현 마을 정적면 132·컬링후 72가 부드러운 기준선). 활강 코스는 길고 성기게(오브젝트 40~80) — ③ 컬링이 거리를 공짜로 만듦.
- ①글라이딩 물리(공중부양→글라이딩): village.js pitch(Space상승/Shift다이브)+airspeed 모멘텀. 다이브=가속·클라임=속도를 고도로·항력. flyMode=스로틀. 상태머신 idle↔run↔jump↔glide↔dive↔climb. 정본 비행물리.한선(고정소수점, Bhaskara/부동소수 함정 회피). 물리시뮬 검증(다이브 고도50→0·속도12→60 / 클라임 20→70·45→25 / 펌핑). 커밋 db8c511.
- ②바람존(상승기류): WINDS(S.winds 또는 데모3) + 비행 중 존 진입 vy 상승력(제곱거리·천장컷) + drawWinds 파란 상승입자 마커. 비행물리.한선 바람상승() 정본. 존감지 단위테스트(밖0·안+30·천장컷·반경). 커밋 0d936fe.
- ③트레일: TRAIL 링버퍼(max20·minSpd15) + drawTrail 양날개 하얀 궤적 페이드. 버퍼 단위테스트(20캡·소멸·minSpd컷). 커밋 8fbfdec.
- 튜닝은 형님 손: GLIDE 상수(village.js ~60행: grav/drag/sink/thrust/maxPitch)를 라이브서 날며 조정. 정적 스크린샷으론 손맛 검증 불가(물리 정확성만 증명).
- ★2026-07-12 사용자 거부: 라이브서 날아보고 "이런식으로 날면 안된단다" → 글라이딩 손맛 재작업 open(물리는 맞으나 느낌 틀림). 의심 culprit: 수평 항상침하(sink)·컨트롤 피치기반으로 바뀜(이전 직접상승/하강이 단순)·수평속도 가변·다이브 급가속. 힐링게임엔 시뮬<직접제어+약한물리 하이브리드가 맞을 수 있음. 구체 피드백 확보가 선결. 상세=[[feedback_스카이_글라이딩_손맛_거부]]. 바람존·트레일은 비행 위 레이어라 함께 재튜닝.
- 다음(4단계): 3존 맵(로비=현마을 재사용 / 활강코스=길고성기게 / 광장=8~12피어 부하) → 손잡기(FK, 라이브 애니 리뷰 필요) → 존 전환.
잔여 이슈 (사용자 결정)
- §4 crowny-presence:9788 노트/이모트 중계 — 별도 라이브 서비스 + 컴패니언 수신부 미구현. 런북(게임슬라이스/연동런북.md §4)에 스니펫 있음.
- 뷰.한선 섀도잉 / RPN 방언 8종 개명 — needs_approval 유지. 정직 재판정: apps/뷰.한선은 3개 앱(test_데스크톱렌더·크라우니홈·test_뷰v3)이, 넙스엔진은 라이온렌더가 import하는 상호의존 클러스터라 성급한 개명·삭제 시 휴면 파일 조용한 손상. 컴파일 클러스터 검증 선행 필요(휴면 CAD 고아라 비긴급).
- 103일 미커밋(1171건, 타 세션 작업 포함) — 내 os-site 작업만 스코프 커밋함. 전체 인수인계는 작성자·메시지 문제로 사용자 결정 필요(crowny-hub commit-all).
- 다음 MVP 단계: FK 캐릭터 리깅(캐릭터모델러.한선 _부모 배열), 근평면 클리핑(3D렌더러.한선 투영행렬 이식), IMAGE_LOAD 픽셀브리지 opcode(스프라이트 blocker, C패치).