요청: 솔루션-M3M4-앱카드
- 날짜: 2026-07-21 00:39:16
- 작업 경로: /Users/ef/.claude/projects/-Users-ef/memory
요청 본문
이벤트버스 연동(빌딩·홀·에스텔 M3), 수료 원장·ERP 전표 대사(M4), crowny://solution 앱카드 등록
관련 산출
크라우니 솔루션 앱(solution.crowny.org:9735)의 개발명세 M3·M4 마일스톤 + 크라우니AI 앱카드 완료. 서브에이전트(sonnet) 2대가 한선씨 엔진을 완성했으나 레이트리밋으로 server.js JS 배선 전 중단 → 메인 세션(opus)이 배선·종단검증·마감을 이어받아 완료.
M3 — A7 이벤트버스 연동
- 엔진 SSOT:
이벤트버스.한선(20함수) +이벤트버스검증.한선70/70 assert PASS, STRICT 0. - 발행 5토픽(솔루션이 낸다): contract.stage_changed · ledger.posted/refunded · sla.breached · release.deployed · edu.completed → hall(9606)/space(9607)
POST /busfire-and-forget(타임아웃 2s, 실패해도 본 로직 무중단). 발행 이력data/solapp-bus-out.psv. - 구독: building(9605)
GET /api/events폴링(60초, 커서solapp-bus-cursor.txt중복방지).building.alarm.*수신 시 SLA 비상(2h) 티켓 자동 승격(명세 A8 비상 경로). 수신 이력data/solapp-bus-in.psv. - 자체 수신구:
POST /bus(hall/space 동일 계약{source,type,entityRef}→{ok:1}).erp.voucher.posted통지는 전표 대사로 라우팅. - 연동 상태 4상:
GET /api/bus/status→ hall/space/building=티, estel=타(정직한 갭 — /bus 엔드포인트 부재, 목 데이터로 받은 척 안 함).
/bus에 실제 POST 200(out.psv 4줄 확인) · 자체 수신구 erp.voucher.posted 적재 · /api/bus/status estel=타.M4 — 수료 원장 + ERP 전표 대사
수료원장.한선(7함수) + 전표대사.한선(10함수) + M4검증.한선 48/48 assert PASS, STRICT 0.POST /api/completions(씨앗=크레딧 차감 0·운영/전문=차감·재교육=분기크레딧 표식·강사 실명검증 게이트 403). 시설 고유 인원(같은 사람 2과정=1인) 집계 → 계약 completions 동기화(4→5 게이트 근거). GET /api/completions/ledger.GET /api/releases/:train/doc — 구독 시설 upgrade분(⅓) 적립 = 원가 풀, 배포 시설·집행 배분 첨부.event|target|txRef, 중복 발행 차단). GET /api/erp/vouchers?status= · POST /api/erp/reconcile. 대사 4상: matched/amount_mismatch/unmatched/duplicate.실측: CON-2 stage4→5 게이트 통과(수료 2인)→원장+전표 VCH-1 자동 발행 · 대사 matched→재대사 duplicate · 씨앗 차감0/운영 차감1 · 강사 미검증 403 · 릴리즈 문서 upgrade 풀.
앱카드 — crowny://solution
- CrownyBrowser 5지점 배선(FAB 선례 미러):
앱목록.psv(솔루션 카드) · 시작페이지 타일 · 북마크 시드 v15 · normalizeURLString 별칭 ·caOpenSolutionInActiveTab(→solution.crowny.org/app). - 한선씨 SSOT
src/솔루션연결.한선24/24 PASS, STRICT 0.make ai빌드 회귀 0. - ★번들 설치 필수(CLAUDE.md §194):
make ai는 바이너리만 만들고 실행 앱 미반영 →install-ai-app.sh로 번들 교체+ad-hoc 재서명. 실행 번들에caOpenSolutionInActiveTab·crowny://solution반영 확인. 다음 북마크 채번=v16.
검증 총계
한선씨 assert 142건(M3 70 + M4 48 + 앱카드 24), STRICT 경고 0. 기존 회귀(/ /app solutions contracts audit·진단 왕복·3분할 합) 전부 통과.
크라우니코드
lookup MISS(신규 도메인) → 생성 → learn 4건: 솔루션_전표멱등_대사4상 · 솔루션_수료차감_게이트근거 · 솔루션_이벤트버스_연동4상_비상승격 · 브라우저_솔루션연결_별칭라우팅_4상.
함정·교훈
- 서브에이전트 레이트리밋 중단 = 산출물 확인 먼저: 에이전트가 "server 실패"라고 죽었어도 한선씨 엔진은 디스크에 완성돼 있었다(M3 70/70·M4 48/48). glob no-match(
ls data/solapp-bus*)가 명령 전체를 실패시켜 이벤트버스.한선을 "없다"고 오판할 뻔 → Write 거부 덕에 기존 파일 보존. 죽은 에이전트 이어받기 = 파일 실재 확인 후 배선만 이어붙이기. - 라우트 200 ≠ 구현됨:
/api/erp/vouchers200이 실은 index.html 폴백(착시). 실제 응답 본문을 봐야 진위 판별. - estel 연동은 엔드포인트 부재 = 정직한 갭 표기(타), 목으로 채우지 않음.
잔여 완료 (2026-07-22)
estel /bus 실연동 + 운영 콘솔 시각화 마감.
estel /bus 신설(라이브 서버 crowny-estel/서버.한선 순수 한선씨):
_처리버스(수신구, hall/space 동일 계약{source,type,entityRef}→{ok:1}) +_발행게이트(estel.gate.reached를 솔루션 :9735/bus로 curl -m 2 push) +_처리게이트도달(POST /api/gate/reach {gate}).- STRICT 0 컴파일 → 서버.toau 교체 → kickstart 재기동. 회귀(/health·/·기존 라우트) 정상.
- 실측 체인:
POST /api/gate/reach {gate:"QEC.표면코드.d3"}→ estel이 솔루션 /bus로 발행 → 솔루션 /api/bus?dir=in에estel|estel.gate.reached|QEC.표면코드.d3수신 확인. - 솔루션
/api/bus/status의 estel 하드코딩 "타" → 실프로브로 교체(probe 9617). 이제 4상 전부 티(hall/space/building/estel). 갭 해소.
web/app.html SolModuleOps, 원본 다크브라운 스타일 준수):
- 우측 패널에 카드 2개 추가 — 생태계 이벤트버스(연동 4상 배지 + 최근 수신 이벤트) · ERP 전표 대사(전표 목록 + matched/전체 카운트).
componentDidMount에서/api/bus/status·/api/bus?dir=in·/api/erp/vouchersfetch(실패 시 조용히 폴백). 라이브 데이터 화면 반영 육안 확인(building.alarm.eq·estel.gate.reached·erp.voucher.posted·VCH-1 matched).- 동반
web/app.한선에 시각화 판정 추가(연동배지색/라벨·전표상태색·대사율·소스배지) 13/13 assert PASS, STRICT 0.
최종 상태
- 4대 연동(hall/space/building/estel) 전부 실배선·라이브 티. estel.gate.reached 실수신 체인 확증.
- 운영 콘솔에서 버스 연동상태·수신이벤트·전표대사 라이브 시각화.
- 백업:
crowny-estel/서버.한선.bak-bus,crowny-solution/server.js.bak-m3m4. - 한선씨 assert 누계 155건(M3 70 + M4 48 + 앱카드 24 + 시각화 13).
잔여 (차기)
- 솔루션 앱화면 이야기(스토리) 오버레이 한선씨 판정.
- estel 양자 실행(/api/quantum/run) 완료 시 gate.reached 자동 발행 훅(현재는 /api/gate/reach 수동 트리거).
- crowny://solution 화면 GUI E2E(타 세션 GUI 자동화 중이라 보류).