크라우니EV 엔진(EV엔진.한선) 구현
개요
ev.crowny.org:9616 크라우니EV(테메라리오 동급 T-프레임 위 외관 커스텀+규제검수+견적/계약/생산슬롯) 계산 SSOT를/Users/ef/crowny-ev/EV엔진.한선(순수 정수 산술, hanseonc_high)로 구현하고 /Users/ef/crowny-ev/테스트.한선(58 assert)로 전량 검증했다.
정본 참조: Crowny EV.dc.html renderVals() (원 JS 로직), 스펙-로직.md(정수화 지침 SSOT).무엇을 했는지
- 구성 기본값·클램프 — roofH/gc/wheelIn/ductS 클램프 함수, wing/sig/power/finish/wrap enum 유효성 판정.
- 성능계산 — Cd(×1000 스케일)·중량(altSave 반영 ×100 스케일)·항속(sqrt 루트() 재사용+18엔트리 없이 단계별 정수 나눗셈)·0-100가속(×10)·최고속(18엔트리 (0.312/Cd)^0.45 룩업테이블). 기준값(덕테일/gc115/휠20/듀얼/경량화없음) Cd=320·weight=2166·range=587·v100=29·vmax=328 — dc.html 원본과 정확히 일치 확인.
- 가격견적 — priceItems 13조건 총액/아이템수/세미콜론 구분 브레이크다운 문자열("이름|금액;...").
- 4상 검수 — 지상고(타 유일 차단)·전고(항상 티)·에어로/시그니처(GT윙·시그C=옴)·보행자(항상 티) + 종합 우선순위(타>옴>음>티). enum 밖 값은 음(판정불가). 셀코어 룰 3건 등록.
- 주문 상태기계 — 0(구성)→1(견적)→2(계약,보증금1000만)→3(슬롯확정), 1→2 전이만 검수_종합==-1(타)이면 차단, 3+ 멱등, 단계별 토스트 문구.
- BOM 트리 — 7어셈블리×3부품=21종 인덱스 dispatch(그룹/품번/이름/wt0×10/pr0/재질/공급/altable), CFRP 대체 4종(BD-001/002/003,CH-001) −38%중량/+60%단가 재계산.
- L0-L8 계층(HIER) — dc.html:724-796 원본 트리를 실측 추출해 재귀 정의를 인라인 스칼라로 그대로 전개, unitsOf(HIER)=227,913·depthOf=8 정확히 재현 검증(3개 상위 브랜치 함수로 압축, 배열 미사용).
- 집사해석 — 색상맵(순회순서 마지막매치 우선)·피니시/윙(첫매치)·휠인치·지상고(낮게+숫자 독립 if, 숫자가 나중에 덮어씀)·파워·랩핑·시그니처(A/B/C), 정규식 미사용(포함하나+인덱스 스캔).
- ERP 생산오더 JSON — 구성+스펙+BOM 스냅샷을 문자열로 직접 조립(팩토리/FAB 커넥터용).
함정 발견
- 성능_vmax/range 스케일 누락 함정(직접 발견, 검증 중 catch): range 계산에서
612*ratio1000처럼 앞단 스케일(×1000)을 그대로 들고 가다가, sqrt/tri/wheel 각 계수의 "자기 스케일"만 나눠주고 최초 ratio1000의 잔여 ×1000을 안 나누면 최종값이 1000배 부풀어 오른다 — 매 단계 "자기 스케일만" 나누고, 맨 마지막에 "누적된 최초 스케일"을 한 번 더 나눠야 함. 손 계산 중 vmax 케이스(GT윙/gc95/duct80/트라이)에서 최초 기대값 359를 329로 정정한 것도 같은 부류의 실수였음(18-엔트리 룩업 자체는 정확, 최종 나눗셈 순서 재확인으로 해결). - 기존 미완성 초안(같은 파일, 다른 세션/이전 시도)이 float 리터럴 기반(윙코드 정수 0/1/2)으로 존재 — 이 VM이 실제로 float 수학함수를 지원한다는 걸 확인했지만, 본 작업은 상위 지시(전부 정수 산술, API 계약의
_x10/_x100/_x1000스케일 원칙)를 따라 완전 정수 재작성으로 교체.
관련 파일
/Users/ef/crowny-ev/EV엔진.한선(계산 SSOT, STRICT 0경고)/Users/ef/crowny-ev/테스트.한선(58 assert, PASS 전항목, 3회 재실행 안정성 확인 — 함수 재호출 배열 지역변수 함정 대비)/Users/ef/crowny-ev/스펙-로직.md(정본 스펙)/Users/ef/Downloads/design_handoff_crowny_ev/Crowny EV.dc.html(원본 JS)
잔여 이슈
- HIER L0-L8은 인라인 상수 전개(3개 브랜치 함수)로 검증됐으나, hierPath 기반 nodeAt() 동적 네비게이션(UI "심층 탐색" 기능)은 미구현 — 필요 시 서버단에서 별도 설계 필요(현재는 unitsOf/depthOf 총계만 제공).
- CrownyDoc 학습:
crownycode-learn.sh add로 8개 핵심 함수(EV성능계산Cd가중치/중량weight100/항속range, EV4상검수종합, EV주문상태기계, EVBOM트리CFRP대체재계산, EVBOMHIER유닛총계재귀, EV집사해석색상순회) 등록 완료.
2단계 — 서버.한선 구현 (2026-07-17, 후속 세션)
/Users/ef/crowny-ev/서버.한선 — 포트 9616, API 계약 전 엔드포인트 배선 완료. 계산은 전부 EV엔진.한선 함수 호출(서버=배선만), 구조는 crowny-cad/crowny-character 서버.한선 패턴 그대로 차용.
엔드포인트 (전 항목 curl 스모크 PASS)
GET /api/health→{"ok":1,"service":"crowny-ev"}GET /api/manifest→ service/port/connectors(factory,fab,cad,render,erp)GET /→ public/index.html 서빙(파일소켓전송)GET /api/spec— 기본구성 결과가 엔진 검증 기준값과 정확 일치: Cd=320, weight=2166kg, range=587km, v100=2.9s, vmax=328km/hGET /api/inspect— gc=90(클램프 95, 여전히 <100)→타 확인, GT윙+sig=C→옴 2건, 무효 wing→음, 우선순위 타>옴>음>티 실측 정합GET /api/bom?cfrp=— CFRP 대체 2종(BD-001,CH-001) 적용 시 자연반올림 380×62/100=236, 420×160/100=672 등 정확 재계산, unitsTotal=227913 그대로 노출GET /api/ai?text=— "무광 검정 GT윙 21인치" →{"changes":{"bodyC":"#2A2119","finish":"무광","wing":"GT윙","wheelIn":21}}정확 매치GET /api/order/submit— 상태기계 0→1→2→3→3(멱등) 전부 실측, 1→2 전이에서 gc=90(타) 차단({"ok":0,"blocked":[...]}) 확인. 주의: 검수 차단은 EV엔진주문_차단여부설계상 1→2 전이에서만 발동 — 0→1(견적발송)은 검수 결과와 무관하게 항상 통과(엔진 의도된 동작, 서버버그 아님).GET /api/order/status?id=— 재기동 후 조회 재검증(kill→재기동→동일 order_id stage=3 그대로 복원) PASSGET /api/erp/order?id=— config+spec+bom+stage 스냅샷 JSON, erp_생산오더JSON() 그대로 반환
서버단에서 발견한 함정(1건, 즉시 수정)
_다음주문ID()를 최초체계("date +%s")(초단위) 기반으로 짰다가, 같은 초 안에 여러 신규주문(id 미지정)이 생성되면 주문 ID가 충돌해 서로 다른 주문이 같은 PSV id로 뒤섞이는 걸 실측으로 잡음(연속 curl 2회가 동일 EV-<epoch> 생성).crowny-cad/서버.한선의lk<현재시간()>_<무작위(1000,9999)>링크ID 패턴을 그대로 차용해"EV-" + 현재시간() + "-" + 무작위(1000,9999)로 교체 → 재검증 시 별도 ID로 정상 분리 확인. 동시에_주문저장/_로그의 타임스탬프도 체계()+파일 왕복 대신현재시간()직접 호출로 단순화(STRICT 재컴파일 0경고 유지).
컴파일/실행 검증
CROWNY_STRICT=1 hanseonc_high 서버.한선 > 서버.toau — 경고 0. crownyc run 서버.toau로 포그라운드 기동 후 별도 셸 curl 스모크 전 항목 통과, 매 검증 후 프로세스 kill 확인(포트 재바인드 실패 재현으로 이전 인스턴스 잔존을 잡아 강제 kill 후 재검증 — crowny-sysguard 원칙대로 좀비 남기지 않음).크라우니코드
lookup MISS(EV서버 라우팅 신규) / learn 추가 2건(EV서버HTTP라우팅배선, EV주문상태기계PSV영속).관련 파일 (2단계 추가)
/Users/ef/crowny-ev/서버.한선(포트 9616, STRICT 0경고)/Users/ef/crowny-ev/data/주문.psv,data/요청로그.psv(append-only, latest-wins 복원 실측 검증)
잔여 이슈 (2단계)
- 서버 재기동을 상시 서비스로 올리는 LaunchAgent 등록은 이번 작업 범위 밖(org.crowny.ev.plist는 기존 파일 존재 — 필요 시 그걸로 등록, 이번 세션에서 데몬화는 하지 않음, 테스트 프로세스 전부 kill 완료).
- public/index.html(프론트)은 기존 파일(89KB) 그대로 사용, 이번 세션에서 수정 안 함.