요청: factory-크라우니팩토리-서비스구축
- 날짜: 2026-07-18 12:37:00
- 작업 경로: /Users/ef
요청 본문
factory.crowny.org 만들기. 다운로드폴더에 design_handoff_crowny_factory 폴더보고 만들기. 기존 팩토리 도구/코드 전체 학습하기. ev.crowny.org 연계 서비스임.
관련 산출
(클로드가 작업 결과를 이어 기록)
산출 결과 (2026-07-18 완료)
개요
factory.crowny.org:8300 크라우니팩토리 라이브 — EV(ev.crowny.org:9616) 주문을 실차로 만드는 셀 방식 소량생산 공장 도구. 디자인 핸드오프(design_handoff_crowny_factory, dc.html 941줄 유일스펙) 픽셀 포팅 + 순수 한선씨 엔진/서버.무엇을 했는지
- 기존 팩토리 자산 전수 학습: crowny-fab/server.py(구 :8300 Python FastAPI)·작업지시 PSV(EV작업지시 27건/상세 81건/적산SSOT/셀 10종)·task 양산/시제 문서 → 노트-기존자산.md + 학습DB 6건 등록(팩토리_작업지시PSV스키마·적산SSOT스키마·셀10종매핑·EV주문계약JSON·셀그래프REST설계·한선씨서버뼈대). 발견: crowny-fab에 별개 서비스 2개 공존(구 Python:8300 / 신 서버.한선:8200 최소기능).
- 스펙 추출: 스펙-UI.md(303줄, 토큰·8모듈·인터랙션 원문값) + 스펙-로직.md(650줄, 시드 전량 JSON 발췌 + 명세공백 7건 명시).
- 팩토리엔진.한선(~830줄, SSOT): 공정 10건 시드(왜/설계의도/유의/원가·비중/영향/도면/결착3스텝/노하우), 상태전이 11종(감사로그 반환), 4상 판정 3종(슬롯/로트/VIN — 티옴타음 전부 도달), SOP JSON 직렬화(steps=3+joints), FAB 학습카드(auto≥70/cobot≥50/manual), KPI 집계. 테스트.한선 117 assert PASS·STRICT 0경고.
- public/앱.html(1314줄): dc핸드오프 픽셀 포팅 — 8모듈 탭+⌘1–8, 공정 스트립(클릭→⌘8+selProc 자동), 조립 칸반+안돈+AGV, EOL 순차, 공정인텔리전스(10노드 SVG 연결도+시각3패널 결착애니+지식카드4종+노하우 골드/그린+FAB카드+SOP 내보내기), fetch-first+시드 폴백. 동반 앱.한선(전이 8종 재현 9/9 PASS).
- 서버.한선(~700줄, :8300): 엔진 가져오기(재구현 0), GET 12종+POST 11종(UI 계약 일치), EV 라이브 pull(/api/ev/pull → :9616 /api/erp/order 실주문 EV-1784333233-1712 → 생산슬롯 생성 실증, EV 다운 시 ok:0 정직응답·목 폴백 없음), data/이벤트.psv append 영속+재기동 복원 PASS, EOL 순차위반 거부, vin/move 서버측 재계산(클라이언트 셀값 불신).
- 통합: LaunchAgent org.crowny.factory(RunAtLoad+KeepAlive) · 게이트웨이 기존 배선 활용 https://factory.crowny.org 200(와일드카드 cert — 인증서 작업 0) · 크라우니디자인 레지스트리+apply(페이지 200·토큰 무손상) · brain 학습래칫 2건(엔진/서버 — 다음부터 토큰0).
관련 파일
- /Users/ef/crowny-factory/{팩토리엔진.한선, 서버.한선, 테스트.한선, public/앱.html, public/앱.한선, 스펙-UI.md, 스펙-로직.md, 노트-기존자산.md, org.crowny.factory.plist}
- 서버 상세: CrownyDoc 2026-07-18-crowny-factory-서버-8300.md (서버 에이전트 작성)
- 신규 VM 함정: 버퍼파일읽기 체인 결과 인라인 연결 스택오염 → ~/.claude/templates/한선씨-가드레일.md 등재 + feedback 메모리
잔여 이슈
- UI 미배선 API 5종(process/sop·fab/card·lot/deviate·vin/torque·ev/pull) — 서버는 구현·검증 완료, UI 수동 트리거만 스펙 미정의(핸드오프 §14에 없음)
- crowny://factory 크라우니AI 앱카드 미장착(EV 앱카드와 같은 잔여)
- crowny-fab 신 서버.한선(:8200)과의 역할 정리(FAB=기가팩토리 다음 제품 — SOP JSON 소비 계약만 현재 연결점)
- 명세공백 보정값(마음보상 10+helps2, FAB 임계 70/50)은 엔진 신규정의 — 사장님 확정 필요 시 조정
07-20 연계 점검 — Factory ↔ FAB 계약 실측
FAB(fab.crowny.org:8200, 타 세션 07-19 출시)가 그 사이 라이브. 양측 실측:
| 방향 | 상태 | 근거 |
|---|---|---|
| Factory → FAB 공급 | 준비 완료 | /api/process/sop?id=iqc 기계가독 SOP JSON 정상(version·steps 4·cost·knowhowAdoptedCount), /api/fab/card 10공정 준비도(avgReadiness 54, auto 2건) |
| FAB → Factory 소비 | 미연결(선언만) | FAB /api/manifest의 connects:["ev...","factory.crowny.org:8300"]와 /api/link/status의 factory 블록은 host·port 정적 문자열뿐 — factory API 호출 코드 없음(_처리link_status 확인) |
07-20 잔여 마감 (2건 완료)
① UI 미배선 서버 API 6종 배선 완료
public/앱.html — 서버엔 있으나 UI 트리거가 없던 6개를 실배선(모두 라이브 curl로 응답형태 확인 후 코딩, 추측 금지):
- ⌘8 공정·노하우:
/api/process·/api/fab/cardfetch-first + 시드 폴백(렌더 함수 무수정 = 픽셀 유지). SOP 내보내기 버튼이/api/process/sop?id=실호출 → 클립보드 복사 + .json Blob 다운로드(FAB 소비 계약 실동작) - 검증 IQC: "특채 상신" 버튼(#A34A5E) →
POST /api/lot/deviate - 조립: VIN 패널 "토크 기록" →
POST /api/vin/torque - 관제: 주문ID 입력 + "EV 주문 가져오기" →
POST /api/ev/pull?id=, 실패 시 서버 msg 그대로 노출(목 폴백 없음)
public/앱.한선 자체시험 9→23/23 PASS(신규 14, STRICT 경고 0). EV 주문 존재 여부는 로컬에서 확인 불가라 삼진 모름(0) 반환 — "모르면 정직 이관" 규약 적용.오케스트레이터 독립 재검증: 서버 23라우트 ↔ UI 호출 커버리지 23/23(쿼리스트링 호출 2건 포함), 골격 doctype·charset 각 1, 서빙본=디스크본 바이트 일치, 자체시험 23 PASS·0 FAIL.
종단 실측: 특채 상신(CT-0711 검사중→"불합격 · 특채 상신", 이벤트 append) / 이미 합격한 로트 특채 시도 = ok:-1 거부("이미 합격 상태") / SOP JSON 파싱 OK(셀2 배터리 v4 steps 6) / 존재하지 않는 EV 주문 = ok:0 정직응답. 검증 후 이벤트로그는 data/이벤트.psv.검증백업-20260720로 백업 후 초기화, 재기동하여 시드 청정 상태 복원(CT-0711 → "검사 중") 확인.
② crowny://factory 크라우니AI 앱 장착 완료
EV 장착 5지점 1:1 미러링 —crowny-ai-content.m(별칭 팩토리/factory/크라우니팩토리/공장, caOpenFactoryInActiveTab loadRequest 라이브 서버형, navigateTo 디스패치, AI홈 타일, 북마크 시드 v13) + 런처 카드 앱목록.psv 29행 + 한선씨 SSOT src/팩토리연결.한선(4상 라우팅, 17/17 티).
독립 재검증: make ai 에러 0·CrownyAI 604KB 빌드, 회귀 0(caOpenEv/Cad/Hall 심볼 각 2건 불변, 시드 게이트 v10~v13 전부 존속), psv 6열 규약 일치. 다음 북마크 채번 = v14.학습 래칫
brain 2건 추가(팩토리_UI_미배선API_배선_fetch토스트, 크라우니AI_앱장착_라이브서버형_별칭4상라우팅) — 총 4건, 다음부터 토큰0.잔여 (갱신)
- FAB 소비측 배선 — Factory 공급측(SOP JSON·FAB카드)은 완비, FAB(:8200)이 실호출하지 않음(위 §07-20 연계 점검). crowny-fab 트랙 소관.
- 팩토리 브릿지 JS·ERP/Today 이벤트버스 연동(EV/CAD/홀과 동일하게 후속 트랙)
- 명세공백 보정값(마음보상
10+helps*2, FAB 임계 70/50)은 엔진 신규정의 — 사장님 확정 시 조정 - crowny://factory GUI E2E 육안검증(타 세션 GUI 자동화 충돌 회피로 미실행)
07-20 FAB 계약 — 공급측 일괄화 완료 + 소비측 실측 정정
정정: FAB 소비측은 절반 구현돼 있었음
23:35 재실측 결과, 타 세션이 26분 전 crowny-fab/서버.한선을 수정해 요약지표 소비는 이미 실동작:GET /api/factory/rollup= factory/api/fab/card실pull(avgReadiness 54·autoGradeCount 2·카드 10건이 factory 실값과 일치 — 목 아님), 실패 시503 "폴백 없음"정직응답/api/link/status도 정적 문자열 → 실프로브(up:true)로 승격
남아있던 진짜 공백 = SOP JSON 소비
fab 서버.한선process/sop 참조 0건 — 핸드오프 규정의 본체("기계가독 SOP JSON = FAB 라인설계 에이전트 직접 소비")는 미이행. 실질 장벽 = factory SOP가 단건 전용이라 10공정에 10회 왕복 필요(id 누락·id=all 모두 오류).공급측 조치: SOP 일괄공급 (factory 측, 충돌 없음)
팩토리엔진.한선—SOP_직렬화를SOP_직렬화_객체(id,버전,채택수)(래퍼 없는 순수 객체) + 래핑판으로 분리. 단건 출력 바이트 동일 유지서버.한선—GET /api/process/sop/all신규(10공정 일괄) +?id=all하위호환 위임테스트.한선— 117 → 122 assert(일괄 직렬화·래핑 재구성 동치·10공정 루프)
count=10·sops 10건·ID 순서 정확(supply→ship), ?id=all과 /sop/all diff 동일, 일괄 첫 원소와 단건 ?id=supply 응답이 키집합·값 전부 동일(11필드), 단건 스키마 회귀 0, 오류경로 보존(bogus·id 필요), STRICT 경고 0, 테스트 PASS 전항목, /·/api/health·https 200, 이벤트로그 0바이트 유지(읽기전용 라우트).
반증 시험: 테스트에 고의 오류 주입 시 FAIL:공정수_10 + "총 실패 항목 수: 1" 출력 확인 — "PASS 전항목"이 빈 통과가 아님을 실증.인계 (crowny-fab 트랙 — 타 세션 활동 중이라 무접촉)
지식셀 #26115연동계약/FAB_SOP소비_잔여 등록: 완료/미완 구분, 일괄 엔드포인트 1회 호출로 10공정 SOP 수신 방법, 그리고 fab _프로브()가 체계() 셸 패스스루라 사용자 입력을 넘기면 RCE(os-site deacon 전례) 경고 포함.07-21 자율 잔여 마감 (이벤트버스·GUI육안·보정값) + ★다크모드 P0 결함 발견·수리
★ 최대 성과: 다크모드 판독불가 결함 (실사용자 영향 P0)
증상: macOS 다크모드 사용자에게 KPI 숫자·슬롯 제목·VIN·우측 패널 값이 흰 카드 위 밝은 글씨로 렌더 → 사실상 판독 불가. 발견 경로: GUI 육안검증을 사용자 활동 중(유휴 0초)이라 GUI 자동화 대신 헤드리스 대조 렌더로 수행 → 포팅본 vs 원본 핸드오프 나란히 비교에서 즉시 노출. 오진→정정: 1차 가설 "중앙 크라우니디자인.css의html[data-crowny] body 폰트 오버라이드"는 통제 실험(링크 제거 후 렌더)으로 반증 — 증상 그대로 유지. 가설 기반 수리를 하지 않은 것이 핵심.
진짜 원인: 앱.html의 반쪽짜리 다크 블록 @media(prefers-color-scheme:dark){body{background:#181410;color:#EFE6D8;}} — body 색만 밝히고 .kpi-card{background:#FFF} 등 밝은 표면 15개는 그대로. 원본 dc.html에는 다크 스펙 없음(grep 0) = 포팅이 주입한 결함.
수리: 다크 블록 제거 + :root{color-scheme:light} 선언(폼 컨트롤 자동반전 차단) + 사유 주석. 재렌더 결과 원본과 픽셀 일치 복원 실증.
생태계 스캔: 디자인 레지스트리 전수 확인 — class·team·abti 등은 다크 블록에서 CSS 변수를 재정의(--bg/--panel/--text)해 전 표면이 함께 전환되는 올바른 구현. 결함은 팩토리 고유(변수 대신 body 직접 지정). 향후 팩토리에 다크가 필요하면 class/team 패턴이 정본.① CrownyShared 이벤트버스 연동 (발행+구독+UI)
- 발행 5토픽(CAD
_CrownyShared발행패턴 미러, best-effort):factory.slot.created(EV pull)factory.lot.deviated(→ERP 전자결재)factory.eol.passed(5항목 마지막만)factory.ship.confirmed(→ERP 매출기표)factory.sop.updated(→FAB 라인설계 신호) GET /api/bus/recent?n=(기본 20·상한 100) — 전 모듈 이벤트 반환(생태계 피드)- ⌘1 관제 하단 "생태계 이벤트" 패널 — 라이브 실측에서 cad.doc.updated + factory 5토픽 혼합 표시 확인(스크린샷)
- 핵심 정합성: 거부된 전이(ok:0/-1)는 미발행 — 실측 2회(특채 재시도·재채택) 모두 버스 행수 불변. 타 모듈(CAD) 기존 행 무손상(append-only 유지)
- 테스트 +16 assert(페이로드 조립·파이프 포함 페이로드 파싱·오형식 폴백)
② GUI 육안검증 (헤드리스 대조 — 사용자 GUI 무간섭)
- 관제(⌘1): 원본과 픽셀 일치, EV 주문 가져오기 입력·버튼 정상
- 공정·노하우(⌘8, 핸드오프 "핵심 화면"): 10노드 연결도(선택 하이라이트·병목/치명 배지)·시각 3패널(부품 SVG 도면 M12×8·45Nm 치수, 결착 3스텝 애니 칩, 완성차 하이라이트)·지식카드 4종(왜/유의/설계자 의도 CAD 인용/원가·비중 스택바 14%)·전체 영향(병목·치명)·FAB 학습 68%·기계가독 SOP 버튼 — 전부 명세대로 렌더 확인
- 한계:
crowny://factory앱 내부 GUI E2E는 미실행(사용자 활동 중 포커스 레이스 위험 — 규칙 준수). 유휴 시 재개 대상
③ 보정값 2개 정합 (임의값 → 근거/선언)
- 맘 보상:
10 + helps*2(생태계 대비 2~4배 과다) →5 + min(helps,3)(5~8). 근거=생태계 정본/Users/ef/crowny-game/src/routes/reward.js지급표(최고 고정액 academy.quiz 5, 나머지 1~3). 주석에 정본 경로·대조 수치 명시. 라이브 왕복 실측maam:8, sopVersion:5+ 재채택 거부 + 버스 1건만 append - FAB 임계 70/50: 소비자 crowny-fab에 준비도 척도 부재 확인(FAB엔진.한선엔 자재 12/16일 등 다른 축만) → 숨은 매직넘버를 선언 정책으로 승격: 접근함수
FAB임계_auto()/FAB임계_cobot()경유 +/api/fab/card에policy:{autoMin:70,cobotMin:50,source:"factory-declared",basis:"none-yet"}노출.basis:"none-yet"은 정본 부재를 정직하게 표시(그럴듯한 근거 날조 금지). FAB이 척도를 정의하면 그쪽이 SSOT - 등급 회귀 0 실측: supply45→manual, iqc52→cobot, cell5 72↑→auto, avgReadiness 54·autoGrade 2·카드 10 불변
검증 총계
STRICT 경고 0(엔진·서버·테스트) · 테스트 PASS 전항목(122→143+) · 반증시험으로 하네스 유효성 실증 ·/·/api/health·https 200 · SOP 일괄 count=10 무회귀 · brain 래칫 누적 5건07-21 "둘 다 안 열림" 진단 — 원인=앱 번들 구버전(빌드 파이프라인 갭)
사용자 신고: crowny://factory · factory.crowny.org 둘 다 파일 안 열림.
진단 (원인 분리)
- factory.crowny.org (웹) = 완전 정상: curl 200, HTTPS 엄격검증 ssl_verify=0(.crowny.org 와일드카드 SAN), 실도메인 게이트웨이 경유 실제 Chrome 헤드리스 렌더 성공(DNS→GW→8300→JS 전 경로). 일반 브라우저에서 열림.
- crowny://factory (앱) = 안 열림 확정: 실행 중
CrownyAI.app/Contents/MacOS/CrownyBrowser번들 바이너리가 7/18자 601KB — factory·EV·cad 배선 strings 0. 최신 배선은native/CrownyAI(7/21, 668KB)에만 존재. - 오판 배제: 에러로그 "문자열 핸들 90%" 경고는 기동 로드 1회성(요청 60회 부하에도 미증가·health 정상)이라 다운 원인 아님을 부하실측으로 배제.
근본 원인
make ai가 native/CrownyAI 바이너리만 만들고 실행 .app 번들 교체 스텝이 Makefile에 없음. make-app.sh는 구 소스(native/CrownyBrowser)·구 번들명(CrownyBrowser.app) 사용해 불일치. 결과: 7/18 이후 EV/CAD/factory 앱 장착이 실행 앱에 하나도 반영 안 됨(팩토리만의 문제 아님).수리
- 최신
native/CrownyAI→CrownyAI.app번들 설치(백업 후) + ad-hoc 재서명(TeamIdentifier 없음). 서명 함정 실측:.bak을 MacOS/ 폴더 안에 두면 codesign "invalid Info.plist" 실패 → 백업을native/앱바이너리백업/(번들 밖)로 이동 후 재서명 성공. - 재발방지:
native/install-ai-app.sh생성(백업→교체→번들정리→재서명→검증→배선리포트, idempotent 재실행 검증). CrownyBrowser CLAUDE.md에 "crowny:// 장착 후 필수 설치 스텝" 절 추가. 메모리 feedback 등재. - 설치 후 번들 배선 확인: factory=1 ev=1 cad=1 hall=1(strings), 서명 유효.
잔여 (사용자 결정)
- 앱 재시작 필요: 실행 중 앱은 메모리의 구버전 유지 — 껐다 켜야 반영. 사용자 활동 중이라 강제 안 함(파괴적 행위=사용자 결정). 재시작 후 crowny://factory 실물 열림 검증은 그 시점에.
- EV/CAD/홀도 같은 미반영 상태였으므로 이번 재설치로 함께 살아남(재시작 시 전부 반영).
실물 검증 완료 (앱 재시작 후 — 사용자 승인)
- CrownyAI 앱 재시작(구 601KB → 최신 668KB 바이너리 로드 확인) →
open "crowny://factory"→ 실제 앱에서 정상 오픈 확인(창 캡처): 탭 "Crowny Factory", 주소 https://factory.crowny.org/, 북마크바에 크라우니팩토리·FAB 카드 출현, 관제 화면 다크 수리 반영 정상 렌더, 앱 크래시 0. - 결론: crowny://factory ✅ · factory.crowny.org ✅ 둘 다 정상. 원인이었던 "앱 번들 구버전"은 install-ai-app.sh 설치+재시작으로 해소. EV/CAD/홀도 이번 재설치로 함께 반영됨.