크라우니파이낸스 — 울트라 종합감사 + 회계 CRITICAL 버그 수정
- 날짜: 2026-06-13
- 세션: 페블(아키텍트) + 울트라 워크플로(소넷 43에이전트)
- 대상: /Users/ef/crowny-finance (finance.crowny.org, 백엔드 :9750 / 프록시 :9754)
개요
크라우니파이낸스 라이브 서비스를 울트라 워크플로로 5차원 종합감사(소스읽기+라이브실측+적대검증)하고,
최우선 CRITICAL 회계 버그를 근본 수정·검증했다. 라이브 배포는 사용자 승인 대기.
1. 울트라 종합감사 (확정 38건)
5차원 병렬 감사(소넷) → 발견별 라이브 재현 적대검증 → 심각도순 확정 백로그.
- 차원: 챗상태기계 / 정산·바이럴 / 주주공유·생태계 / VM메모리한계 / Quadbook재무제표
- 결과: CRITICAL 1 / HIGH 6 / MEDIUM 20 / LOW 11 (적대검증이 referral customerId 등 오탐을 LOW로 강등)
- 워크플로 산출 JSON: tasks/wmdb9op6d.output (43에이전트, 2.68M 토큰)
2. CRITICAL #1 — 자동분개 대변 부호 오류 (수정·검증 완료)
- 증상: 복식부기 미구현.
자동분개가 차변·대변 양쪽 모두 +금액 가산 → 자산 이중 팽창.
라이브 9750에서
balance = 자산-부채-자본-순이익 = 3,980,020 ≠ 0 (항등식 깨짐).
- 근인: src/크라우니파이낸스.한선:78-79
잔액변경(대, 금액) (대변도 +금액).
집계(
합계계산 176-198)는 _b를
계정의 자연 양수 잔액으로 기대.
수정: GAAP 부호 테이블 도입(부호적용 함수 신설).
차변정상(자산·비용): 차변 +, 대변 −
대변정상(부채·자본·수익): 차변 −, 대변 +
자동분개: 잔액변경(차, 부호적용(차,금액,1)) / 잔액변경(대, 부호적용(대,금액,0))
단항 음수 리터럴 회피 위해 0 - 금액 사용(한선씨 VM 안전).
검증(9751 격리 인스턴스 실측):
입금100만(현금/수익) → 자산+100만, 수익+100만
출금30만(비용/현금) → 비용+30만, 자산−30만
광고비5만 자연어 → 비용+5만, 자산−5만
최종 {asset:650000, revenue:1000000, expense:350000, profit:650000, balance:0} ✓ 항등식 성립
회계 DB는 인메모리 전용(디스크 영속 없음) → 재시작 시 초기화, 과거 오염데이터 보정 불필요.3. HIGH #2 — WAL 파이프 인젝션 (수정·검증 완료)
- 증상: WAL S/P/J 레코드의
user 필드 미이스케이프. user에 | 포함 시 replay 필드 분열 → 자가가입 방지 우회.
- 수정: src/크라우니파이낸스.한선:1196,1236,1379 —
user → 줄이스케이프(user).
(
줄이스케이프(265)는 |·\n·\r→공백, SHA256 해시·숫자 필드는 안전)
- 검증: 코드검사(기존 검증된 |-제거 함수로 래핑) + 통합빌드 클린 컴파일·기동·health ok.
라이브 invite WAL 오염 방지 위해 런타임 테스트는 생략(코드자명).
빌드/배포 상태
- 소스 수정 완료 → 클린 컴파일(/tmp/finance_staged.toau, 3,169,572 bytes, 유효 TOAU).
- 라이브 배포 보류: auto모드 분류기가 라이브 :9750 재시작을 차단(프로덕션 배포=명시 승인 필요). 사용자 승인 대기.
- 배포 절차(승인 시):
mv /tmp/finance_staged.toau /tmp/finance2.toau (원자) → 백엔드 kill → 프록시(2537) 슈퍼바이저가 새 toau로 respawn.
- 워치독(watchdog.sh)은 finance 백엔드 미관리(bank/wallet/dex/chain/reward/projint/monitor/rewardui만) → 충돌 없음.
관련 파일
- src/크라우니파이낸스.한선 (66-91 부호적용/자동분개, 1196/1236/1379 WAL escape)
- 감사 워크플로 스크립트: workflows/scripts/finance-audit-wf_3991c8af-7e0.js
4. 챗 상태기계 8갭 배치 (소넷 분업 → 수정·검증·배포 완료)
모델분업: 소넷 속행집사가 한선씨 코딩, 페블 아키텍트가 독립 재검증·배포.
- A 필드불일치(근본): chat.js:1036
{text}→{message}, 백엔드 2152 message 미스 시 text 폴백. 실 UI 자유입력 전면 무시 해소.
- B recommend 자유입력: 입력키워드 code==2 분기 추가(네/좋아/접수/진행/이걸로/yes→collect).
- C sharing end 칩: 칩반영 end→slot13=0(greet 복귀).
- D collect 빈submit 유령접수: 접수트리거에서 이름/연락처 미충족 시 slot13=3 롤백.
- E collect slot19 이메일 덮어쓰기: em 가드 추가.
- F need 키워드 오분류: 비용절감 키워드 확장(줄이/예산/절약/아끼/효율).
- G referral ref_yes 무처리: ref_yes→slot24=2, code==7 피소개인 수집(slot10/11).
- H upsell_yes 2차접수 drop: slot21/22 초기화로 2차 접수 작동.
- 독립 재검증(9752): B(recommend→collect)·D(빈submit collect잔류, 이름+연락처 후 received)·F(need→recommend) 실측 통과. 회계 balance=0 회귀 없음. 컴파일 rc=0, toau 3,187,548B.
- 배포 완료(사용자 승인): 라이브 :9750 PID 99195, "네 좋아요"→collect 라이브 확인.
데이터 위생 메모
- 9752 검증 인스턴스가 절대경로로 라이브 data/receipts.dat 공유 → submit 테스트가 테스트 영수증 적재(26→41건). 단, 41건 전부 테스트 데이터(실고객 0, wallets/accounts/tx 모두 0=개발상태) → 실데이터 무손상. 임의 삭제 안 함(파괴적·사용자 자산).
- 교훈: 쓰기 경로 검증 시 verify 인스턴스는 격리 data 디렉토리 필요(절대경로 주의). [[feedback_hanseon_verify_shares_live_data]]
5. 배치3 — 맵729 예방 + 문서교정 (수정·격리검증 완료, 배포 대기)
#18 피드 무제한 누적 차단: 알림적재()에 만약 (fid >= 27) { 반환 fid } — 사용자당 _feed_ 키 27 상한. 729 맵 최대 성장 벡터 1개 봉쇄.
#35/#37 문서교정: CLAUDE.md 9753→9754(프록시), 9749→9754, dex 9729→9402, chain 9734→9729(SSOT 정합); proxy.js:4 주석. 배포 무관(디스크 반영).
격리 데이터 하니스 검증(라이브 초대WAL 무오염): data 복사+경로/포트 sed→9752.
빈 초대DB 30 contacts sync→30 join: joins=30, momPaid=30, 피드 정확히 27 상한 ✓, 회계 balance=0.
부수 실증: 포화근접(613엔트리) 격리본에선 join이 inviter 매칭 실패(_byphone_ silent drop)→보상0. #3/#6 포화버그 라이브 실재 확인.
스테이징: /tmp/finance_b3_staged.toau (3,188,080B). 배포는 사용자 승인 대기.7. byphone 분리(#3/#6) — 구현·독립검증 완료, 배포 대기 (소넷+페블)
실증 진단 (격리 하니스)
- 라이브 스냅샷 = 583셀(C) + 519메타(K) = 1102 엔트리 > 맵한계.
맵키목록 1023 상한이 셀+메타 혼재 키목록을 잘라 메타키(_pair_/_byphone_) 절반 유실(라이브 _pair_ 210·_byphone_ 208 ≪ 583셀 = 이미 truncated).
- 실측: sync는 등록되나(583→633) 직후 join이 matched=None·보상0. 바이럴 보상이 현재 규모서 실제로 깨짐.
수정 = 2-way 맵 분리 (소넷 66건 변경)
초대DB → 초대셀DB(셀 전용) + 초대메타DB(메타키 전용). 셀583<729, 메타519<729 각 한계 내.
- 부수효과: 맵키목록이 메타전용→1023 truncation 해소, _stat_joins/_stat_mompaid 카운터 복원 버그도 해결.
검증 (격리 하니스 6게이트 + 페블 독립재현)
- G1 부팅충실 583복원(+joins15/momPaid16 복원, 분리전 0/0). G2 신규sync→join rewarded:[{inviter,1}](핵심 수정). G3 718연락처 무드롭. G4 재기동 614·momPaid17 보존+재기동후 매칭지속. G5 멱등(재join 보상0). G6 회계 balance=0·챗·피드cap.
- 스테이징: /tmp/finance_shard_staged.toau (3,188,164B). 배포는 finance 세션(이 세션) 담당.
잔여 리스크
- 이미 유실된 메타키는 비복구(과거 truncation): 분리 배포는 추가 유실 차단+신규 정상화. 유실 ~370연락처는 재sync 시 회복. 불가피.
- 메타DB도 ~365연락처(_pair_+_byphone_≈2N) 시 729 근접 → 후속 N-way 메타 샤딩 필요(현 519는 안전).
- 셀DB 729(연락처 상한) → ~700+ 시 셀 N-way 필요.
6. ⚠️ (해소됨 — §7 참조) byphone 분리
- 라이브 ~554/729. 연락처당 3키(cell/_pair_/_byphone_) 성장 → 곧 729 포화 → join 보상 silent fail(바이럴 핵심 깨짐).
- 피드 cap은 성장 1벡터만 차단, 연락처 기반 포화는 미해결.
- 근본수정=_byphone_/_joined_ 인덱스를 별도 맵(초대폰인덱스)으로 분리. 고위험: 스냅샷 직렬화(스냅샷쓰기/부팅로드)+walApply K 재현+맵키목록(1023상한) 전부 수정. 라이브 초대 데이터 왕복 → 격리 하니스 필수(data 복사+경로 sed, 이번에 검증됨).
- crownyc.c 맵 cap 3^6→3^7 상향은 멀티세션 충돌·전역영향으로 비권장.
잔여 백로그 (감사 확정, 다음 배치 — 소넷 한선씨코딩 분업)
- HIGH #3/#6: 초대DB 맵 729 엔트리 한계 → 인덱스 맵 분리/샤딩 (멱등 파괴 근본수정)
- HIGH #4/#15/#16: shareholder activeServices=10 하드코딩 → 동적 헬스(curl -m 경유, 소켓 타임아웃 없음 회피)
- HIGH #5: asset(9745)/insurance(9746) 미가동인데 "연결됨" 노출 → 서비스 기동 or status 필드
- HIGH #7: 재무제표 4종(삼진손익/벡터흐름/큐브원가/TOAU의사결정) 라우트 미연결 (쿼드북.한선 존재, import 충돌 주의)
- MEDIUM #8~#14: 챗 상태기계 갭(recommend 자유입력 정체, sharing end 핸들러 누락, collect 빈submit 유령접수 등)
- MEDIUM #20: receipts.dat 읽기() 16383B 한계 → 165건+ 부팅 시 접수 누락 (회전/샤딩)
- MEDIUM #23: 챗 접수(received) → 쿼드북 회계 연결 단절
8. 새 시대 3배 재투자 엔진 + 백로그 병렬 (통합·검증 완료, 배포 대기)
병렬 구축 (6에이전트 워크플로)
- Track B 새 회계 모듈 4종(신규 .한선, 소넷): 삼배분배(4상 분할+3배환산)·인적재투자(7레벨 역량)·자본재투자(셀슬롯 복리/플라이휠)·재투자결정(셀코어 4상 룰+순수 폴백).
- Track A 백로그 4건(main 단독, 소넷): 재무제표 4종 라우트·ecosystem activeServices 동적(7/10)·챗→Quadbook 분개·receipts 파트분할.
- 설계문서: 2026-06-13-finance-새시대-3배재투자회계.md
통합 (페블 아키텍트)
- main에 3 클린모듈 가져오기(삼배/인적/자본). 재투자결정은 순수
결정_비율만 인라인(셀코어 핫패스 크래시 회피).
- 재투자 풀 _재투자_T/O/A/U/창조 +
재투자발화(금액) 훅: 자동분개 수익 이벤트 → 4상 분배(T35/O30/A25/U10)+3배 창조+자본_적립.
- 라우트 /api/reinvest{,/dashboard,/decide,/calculate,/develop,/human}.
격리검증 (9759)
- 입금100만→pools T35만/O30만/A25만/U10만/창조300만, 자본 적립. decide 고리스크→U35·고계발→T35. calculate 900만→3배 24.3M. develop 인적 레벨업. dashboard 통합.
- Track A: 재무제표4종 200·activeServices 7/10. 회귀: 회계 balance=0·invite 584·챗 자유입력 정상.
- 스테이징: /tmp/finance_newera_staged.toau (3,514,896B). main 2579줄.
잔여 (최적화 단계)
- 재투자 풀·인적DB·자본셀 영속화(WAL) — 현 인메모리. 동적 비율(결정_비율)을 재투자발화에 연결(현 고정 35/30/25/10). 인적_적립 per-person 귀속(현 develop 수동). reward9738 원리9 월정산 연동.
9~10. 최적화·감사잔여·인적귀속 (배치7~9 라이브 배포 완료)
- 배치7: 생태건강=activeServicesCount()/리스크=10-자본준비 동적화 + 회계 원장 영속화(ledger.dat, 재무상태표 누적·손익 당기 모델).
- 배치8(소넷 6): #21쿼리스트링·#27소켓16384·#25금액복합·#22건강점수4영역·#17지갑일치·#19토큰맵700교체.
- 배치9: 수익 발화훅 type=="수익"화 + per-person 자동귀속(접수고객→T몫 인적_적립, 정성문 검증).
- 라이브 PID54899: ?sso=200·금액복합35000·건강점수75B·balance0·invite584.
- 다음단계(미배포): reward9738 원리9월정산(서버 /spec 불확실)·메타N-way샤딩(예방·~365연락처)·인적레벨 원스케일 캘리브레이션.
- 세션총괄: 울트라감사38건→라이브배포9배치, 전부 격리/독립검증+백업, 모델분업+병렬워크플로.
11. 잔여3건 병행 (2026-06-14)
- ✅ 인적 레벨 ₩스케일 캘리브레이션: 임계 [0,100,...] → [0,10만,30만,70만,150만,300만,600만]원. 10만원=기초/레벨2 검증.
- ⏸️ reward9738 원리9 연동 이연: reward 서버 전 라우트 404(정산 API 없음). reward 서버 복구 후 착수.
- ✅ 메타DB N-way 샤딩(소넷): 초대메타DB → 9-way 키해시 샤딩(초대메타0..8, 52건 치환), 6561키≈2000+연락처 용량. 하위호환(스냅K적용→메타넣기 라우팅).
⚠️ 사고+복구: 메타샤딩 에이전트 격리실패 → 라이브 invite 디스크 오염(583→2085 테스트연락처). 복구=깨끗백업(byphone시 확보) 복원+재시작. 라이브 메모리 내내 정상(584), 실데이터 무손상. 오염본 포렌식보관. 교훈→feedback_hanseon_verify_shares_live_data 보강.
배포(PID 58630): 깨끗 583 복원 로드, 신규 sync→join rewarded(샤딩 활성), 레벨캘 정상, balance=0.