← 목록
기타 2026-06-13 13KB 읽기 13분

크라우니파이낸스 — 울트라 종합감사 + 회계 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.