요청: FAB두궤적심화-KPI전섹션-체인원장
- 날짜: 2026-07-21 00:39:48
- 작업 경로: /Users/ef/crowny-fab
요청 본문
KPI 나머지 섹션(supply/jig/train/iqc/asm/ship/flow) 전량 pull + FAB 소유 append-only 해시체인 원장(EV 생산이벤트 앵커링) 두 궤적 심화
관련 산출
개요
fab.crowny.org:8200(서버.한선)에 두 궤적을 심화했다.
- 궤적1: factory /api/kpi 8섹션(dash/supply/jig/train/iqc/asm/ship/flow) 전량 passthrough 신규 엔드포인트
- 궤적2: FAB 소유 append-only 해시체인 원장(체인원장.psv) — EV 생산이벤트(EV연동 슬롯) 앵커링·검증
궤적1 — GET /api/kpi/full
_섹션추출(raw, 키):"키":[위치 탐색 후 인용부호(따옴표) 인식 대괄호 매칭으로 정확한 섹션 배열 잘라냄(신규 헬퍼,_처리factory_rollup뒤·_처리kpi앞에 삽입 — 전방참조 없음).- 8섹션 원본 그대로 passthrough +
riskSignals=_부분개수(kpiRaw,"#A34A5E")(전 섹션 리스크 행 수). - 라이브 검증: factory 원본 JSON과 파이썬으로 섹션별 길이·내용 대조, riskSignals=5 실측치와 raw
#A34A5E카운트(5) 일치 확인.
궤적2 — 체인원장 (data/체인원장.psv)
- 행 포맷:
seq|ts|prevHash|eventType|eventRef|hash, hash=해시_SHA256(seq|prevHash|eventType|eventRef|ts), 제네시스 prevHash="GENESIS". POST /api/chain/anchor: factory/api/slots실pull → "EV 주문 연동" 포함 슬롯 객체를 인용부호 인식 중괄호 매칭으로 스캔, "no" 필드(슬롯번호) 추출 → 원장에 없는 신규 eventRef만 append(멱등). 함수 재호출 배열지역변수 오염 함정 회피 위해 슬롯 추출을 별도 배열반환 헬퍼로 만들지 않고, 단일 함수 내 스칼라 전용 단일패스로 스캔+앵커를 동시 처리(신규 배열 변수 없음).GET /api/chain: 원장 전량 반환.GET /api/chain/verify: 각 블록 hash를 필드에서 진짜 재계산(해시_SHA256 재호출) 후 저장값과 대조 + prevHash 링크 검증./api/factory/rollup의 chain 섹션: 원장 비어있으면 기존 파생값(note) 유지, 원장 존재 시 실측 height/headHash 반영.
종단 실측 (2026-07-21, 전량 라이브)
- STRICT 컴파일:
CROWNY_STRICT=1 hanseonc_high 서버.한선 > 서버.toau— 경고 0건. - 재기동:
launchctl kickstart -k gui/$(id -u)/org.crowny.fab→/api/health200. GET /api/kpi/full→ ok:1, source:factory.crowny.org:8300, 8섹션 각 4행씩 전부 존재, riskSignals:5(factory 원본 raw count 5와 일치), pulledAt 타임스탬프.POST /api/chain/anchor1회째:{"ok":1,"anchored":1,"height":1,"headHash":"adc9987e95ce782399f67a7441ad4e5baeb0078f1121e6fbeade36ffb2ec946c"}(EV연동 슬롯 #214 1건 앵커).POST /api/chain/anchor2회째:{"ok":1,"anchored":0,"height":1,"headHash":"(동일)"}— 멱등 실증(재앵커 안 됨).GET /api/chain→ blocks[0] = {seq:1, prevHash:"GENESIS", eventType:"ev.production.slot", eventRef:"#214", hash:"adc99..."}.GET /api/chain/verify→{"ok":1,"height":1,"valid":true,"brokenAt":-1}.- 원장 PSV 육안:
1|1784562353|GENESIS|ev.production.slot|#214|adc9987e...— python3 hashlib.sha256("1|GENESIS|ev.production.slot|#214|1784562353")로 수동 재계산해 headHash와 완전 일치 확인(하드코딩 아님, 진짜 SHA256). /api/factory/rollupchain 섹션:{"evAnchorable":1,"height":1,"headHash":"adc99..."}— 원장 실측치로 갱신됨.- 재기동 후
GET /api/chainheight 여전히 1(PSV 파일 기반이라 재기동에도 자동 복원, 인메모리 상태 불필요 확인).
관련 파일
/Users/ef/crowny-fab/서버.한선—_섹션추출,_처리kpi_full,_블록json,_처리chain_anchor,_처리chain_get,_처리chain_verify신규 +_처리factory_rollupchain 섹션 갱신 + 요청처리 디스패치 4개 라우트 등록./Users/ef/crowny-fab/data/체인원장.psv— 신규 원장 파일(append-only)./Users/ef/crowny-fab/서버.toau— 재컴파일 산출물(라이브 반영).
크라우니코드 학습
crownycode-learn.sh add 3건: FAB_KPI전섹션_대괄호매칭passthrough, FAB_체인원장_해시앵커링_멱등, FAB_체인검증_재계산무결성.
크라우니코드: lookup HIT 0건(FAB 신규 intent MISS) / 유사검색 참조 2건(해시체인_다음해시·해시체인_체인검증 — 맵 기반이라 직접재사용은 안 되고 설계 참조만) / MISS 2건(생성) / learn 추가 3건.
잔여 이슈
_JSON필드추출의 quoted-string 분기가 no 필드 추출에 정상 작동 확인했으나, EV연동 슬롯이 여러 개로 늘어나는 경우(현재 factory 데이터는 1건뿐)의 다건 앵커 경로는 코드 로직상 일반화되어 있으나 라이브 다건 검증은 미실시(factory 측 데이터가 1건이라 물리적으로 불가 — factory 슬롯 데이터 늘어나면 재검증 권장).- 원장 무결성 검증(
/api/chain/verify)은 정상 케이스만 실측. 의도적 변조(파일 직접 수정 후 valid:false 확인) 적대검증은 미실시.