크라우니엔진 돈 실행 계획 (bank/회원/dex 배선)
I now have a complete picture. Here is the synthesized safe-execution plan.
돈 실행 안전계획 + 엔진 배선안 (READ-ONLY 산출 — 아직 아무 돈도 이동 안 함)
★★ 결론 먼저: 3개 작업 전부 "CRD"인데, 라이브 bank(9400)는 CRD를 모른다
정찰로 확인된 가장 중요한 사실 — 요청된 3개 작업은 모두 CRD 단위이고, 라이브 뱅크 API(9400)에는 CRD가 존재하지 않는다. 9400은 CRN/FNC/CRM만 다룬다. CRD의 실제 원장은 별도 파일이다:
- CRD 원장 SSOT =
/Users/ef/crowny-data/chain/원장.wal(코드:/Users/ef/crowny-finance/src/달란트/체인원장.한선) - WAL 형식:
M|계정|금액(발행/민팅),T|from|to|금액(이체),ANCHOR_V3|계정|부|발행|만기|해시(앵커) - 기동 시 전체 리플레이로 잔액 복원. 이 CRD 원장에는 현재 가동 중인 HTTP 서비스가 없다 (체인원장.한선=라이브러리, 크라우니달러.한선=데모뿐, finance 9750/9754=쿼드북 회계로 무관).
- 엔진 클라이언트들이 가정한
/api/balance,/api/debit,/api/credit엔드포인트는 bank에 존재하지 않으며, 과금클라이언트 기본 URLhttp://127.0.0.1:9760은 실제로는 flexible.crowny.org(전혀 다른 서비스) 다 — 즉 현재 배선은 전부 틀린 곳을 가리킨다.
(c) KPS/kpsmacs 식별자 + 현재 CRD 잔액 (정찰 실값)
| 시스템 | KPS 식별자 | kpsmacs |
|---|---|---|
auth (/Users/ef/crowny-data/auth/users.txt) | kps / accountId CRW336e8142d7c7440a04ec (displayName "KPS") | 없음 |
| bank 9400 | uid 세션 = CRW336e8142d7c7440a04ec (CRN/FNC/CRM만, CRD 없음) | 없음 |
| CRD 원장 (원장.wal) | 잔액키 크라우니달러-kimprin | 없음 |
M|크라우니달러-kimprin|12). 담보기준 부-kimprin = 78000.
kpsmacs는 어디에도 존재하지 않음 → 생성 필요. CRD 원장에서는 첫 T/M append 시 자동 생성(이체()가 받는이 잔액 0→증가)되므로 원장 레벨 별도 가입 불필요. 단 kpsmacs가 로그인/구독 주체로 동작하려면 auth(9401)+member(9600) 계정 생성이 필요(bank POST /api/account/register 또는 auth signup) — 이 매핑은 사람 확인 필요(아래 g-2).⚠️ 신원 불일치: KPS가 auth/bank에서는 CRW336e8142d7c7440a04ec, CRD 원장에서는 kimprin. 세 시스템 간 회원ID↔CRD계정키 매핑 테이블이 없다(엔진 data/usermap.psv도 비어 있음). 실행 전 "kimprin = KPS" 확정 필요.
(a) 각 작업의 정확한 실행 방법
전제: 모든 append 전 flock + 사전/사후 잔액 검증(아래 b). 원장.wal은 멱등키가 없으므로 같은 줄 두 번 = 이중적용 → 1줄씩, 마커 grep 선확인 필수.
작업 1 — KPS에 1,000,000 CRD 발행 (개발비)
원장.wal 에 1줄 append:
M|크라우니달러-kimprin|1000000
적용 후 KPS CRD = 12 + 1,000,000 = 1,000,012.
그리고 앵커 1줄 추가(아래 d):
ANCHOR_V3|kimprin|78000|1000012|<만기일>|<sha256(이전상태||신규)>
⚠️ 이것이 최대 위험요소다 (g-1 참조). 문서화된 CRD 담보규칙(크라우니달러.한선)상 kimprin 시즌1 개인한도 = 부 78000 ÷ 729 ≈ 107 CRD. 1,000,000은 한도를 ~9300배 초과. 현재 원장 전체 CRD 발행량은 12+6×8=60 수준 → 1백만은 원장 규모를 5자리수 키운다. 이는 "담보부 대출"이 아니라 중앙발행/개발비 정책 예외여야만 성립 → 반드시 사람 확인.
작업 2 — KPS → kpsmacs 10,000 CRD 이체
원장.wal 에 1줄 append:
T|크라우니달러-kimprin|크라우니달러-kpsmacs|10000
적용 후 KPS CRD = 1,000,012 − 10,000 = 990,012 / kpsmacs CRD = 0 + 10,000 = 10,000.
(주의: 이체()는 잔액부족 시 무변경 → 작업1 선행 필수.)작업 3 — kpsmacs 크라우니코드(엔진) 구독: 2000 CRD/월, 첫 결제 오늘
구독 차감 = CRD 원장에서 kpsmacs → 엔진수취계정 이체:T|크라우니달러-kpsmacs|크라우니달러-<엔진수취계정>|2000
⚠️ 엔진 구독료 수취계정이 미정의(g-3). FOUNDATION? 크라우니달러-엔진? 확정 필요.
첫 결제 후 kpsmacs CRD = 10,000 − 2,000 = 8,000.구독 상태는 엔진 구독레코드에 기록(정산.한선/구독게이트.한선 SSOT, status|lastBilledMonth|overdueSince):
data/users/kpsmacs/subscription 또는 data/subscriptions.json:
active|2026-06|0 + (신규 필드) firstBillDate=2026-06-26, nextBillAt=2026-07-31
(b) 실행 전/후 검증 (정확한 명령)
실행 전 — 현재 CRD 잔액 읽기 (원장.wal 리플레이가 정본):
bash# kimprin / kpsmacs 의 M(발행) 합 − T(보낸) + T(받은) 직접 계산
awk -F'|' '
$1=="M" && $2=="크라우니달러-kimprin"{k+=$3}
$1=="T" && $2=="크라우니달러-kimprin"{k-=$4}
$1=="T" && $3=="크라우니달러-kimprin"{k+=$4}
$1=="M" && $2=="크라우니달러-kpsmacs"{m+=$3}
$1=="T" && $2=="크라우니달러-kpsmacs"{m-=$4}
$1=="T" && $3=="크라우니달러-kpsmacs"{m+=$4}
END{printf "kimprin=%d kpsmacs=%d\n",k,m}' /Users/ef/crowny-data/chain/원장.wal
# 기대(실행 전): kimprin=12 kpsmacs=0
(CLAUDE.md 규칙대로 cat/awk 직접 대신 위는 검증 전용 read-only 명령. 한선씨 경로는 체인원장.한선의 리플레이()+잔액() 호출이 정본.)또한 중복 적용 가드(append 전 동일줄 부재 확인):
bashgrep -c '^M|크라우니달러-kimprin|1000000$' /Users/ef/crowny-data/chain/원장.wal # 0 이어야 진행
실행 후 — 같은 awk 재실행:
- 작업1 후:
kimprin=1000012 - 작업2 후:
kimprin=990012 kpsmacs=10000 - 작업3 후:
kpsmacs=8000+ 엔진 구독레코드active|2026-06
bashcurl -s http://127.0.0.1:9400/api/wallet/balance -H "Cookie: <KPS세션>" # crn/fnc/crm
(d) 블록체인 앵커 / 멱등키 적용 지점
ANCHOR_V3 줄 (달란트앵커v3.한선). 발행/이체 후 kimprin·kpsmacs 각각에 대해 갱신 append. 형식 ANCHOR_V3|계정|부|발행누계|만기일|sha256. → 작업1·2·3 각각 후 해당 계정 앵커 1줄.core/체인.한선 → data/chain/wal.log에 sub:kpsmacs:2000:2026-06 TX 기록 + 일배치로 chain.crowny.org:9729 앵커(F2: daily만). 구독 차감(작업3)은 여기에도 기록.M|계정|금액|txid 로 확장하거나 별도 applied.txids 마커파일 운용(g-4).만약 (마지막청구월 == 월키대상) 반환 1로 이미 이중차감 차단(정산.한선 L424). flock(단일 라이터)와 결합.(e) 엔진 클라이언트 [WIRE] 스텁 → 실 API 배선 구체안
현재 상태: 세 클라이언트 모두 자가테스트만 통과하는 스텁. 핵심 문제 = CRD 원장 HTTP 서비스가 없음. 두 단계로 배선한다.
E-0 (선행, 차단요소): CRD 원장 HTTP 서비스 신규 구축
체인원장.한선을 감싸는 신규 달란트서버.한선(신규 파일, 라이브 무접촉) 필요. 엔드포인트:
GET /api/crd/balance?owner=크라우니달러-<id> → {"balance":N,"currency":"CRD"}
POST /api/crd/debit {owner,amount,idempotencyKey,memo} → {"status":"ok"} / {"reason":"insufficient"}
POST /api/crd/credit {owner,amount,memo} → {"status":"ok"} (= M 발행)
POST /api/crd/transfer{from,to,amount,idempotencyKey} → {"status":"ok"}
idempotencyKey를applied.txids(또는 WAL 4번째 필드)로 중복 차단.- flock으로 단일 라이터. 포트는
crowny-ports.sh free후set crowny-crd <포트>.
E-1 core/과금클라이언트.한선 수정 (잔고=CRD 원장)
- L39 기본URL
9760(=flexible, 오류) → CRD 서비스 포트로 교체:
반환 "http://127.0.0.1:<CRD포트>" (또는 BANK_URL→CRD_URL 환경변수로 개명).
- L162
과금_잔고: 경로/api/balance?user=...→/api/crd/balance?owner=크라우니달러-<소유자>, 응답필드balance유지(OK). - L195
과금_차감:POST /api/debit→POST /api/crd/debit, body의currency:"CRD"유지. 멱등키=월키 그대로. - L224
과금_입금(=발행):POST /api/credit→POST /api/crd/credit. - 응답성공/잔고부족 판정 헬퍼(L117·L139)는
{"status":"ok"}/insufficient그대로 호환.
E-2 core/정산.한선 로컬 스텁 제거 → 실호출
- L257
과금_잔고(현재반환 9999하드코딩) / L263과금_차감(현재반환 1) — 이 두 스텁이 실제 차감을 막는 가짜값. 과금클라이언트와 동일 본문(체계+curl/api/crd/*)으로 교체. (정산.한선은 과금클라이언트를 import 못 함 — 과금클라이언트 top-level 자가테스트 때문 → 동일 로직을 정산.한선 내부에 인라인 복제, CLAUDE.md C3 패턴.) - L283
체인_추가스텁(/tmp/정산_chain_stub.log) →core/체인.한선실배선.
E-3 core/회원클라이언트.한선 배선
CROWNY_MEMBER_URL=http://127.0.0.1:9600(member.crowny.org) 환경변수 주입. 경로/api/member/exists|verify|list는 코드상 준비됨. 단 member 9600의 실제 HTTP 스펙 미확인(P0) → 응답 형식 확인 후응답_exists확인(L90) 키워드 조정.- kpsmacs를 OS유저↔회원ID로
회원맵등록("kpsmacs", "<회원ID>")→data/usermap.psv.
E-4 core/환율클라이언트.한선 배선
- 이번 3작업은 전부 CRD 단일통화 → 환전 불필요, 배선 보류 가능. 추후 CRD↔CRN 환율 필요 시
DEX_URL=http://127.0.0.1:9402주입 + dex/api/rate,/api/swap스펙 확인(현재 미확인, g-5).
(f) 청구 스케줄 규칙 배선 (15일/말일)
요청 규칙: 15일 이전 첫 결제 → 다음달 15일 결제 / 15일 이후 첫 결제 → 매월 말일 결제. 이번 케이스 첫 결제 = 2026-06-26 (26일 ≥ 15) → "매월 말일" 분기 적용. 첫 결제 오늘 2000 CRD(6/26~6/30분), 다음 결제 = 2026-07-31(말일), 이후 매 말일.
현재 정산.한선은 순수 달력월(월키) 멱등 + 다음달 롤오버만 있어 이 규칙 미구현. 추가할 것:
1) core/시간헬퍼.한선 (날짜계산 SSOT) — 신규 함수 3개:
일자(날짜문자열) → DD 정수 ; 부분(s,8,10) 숫자변환
말일(YYYY-MM) → "YYYY-MM-DD" ; date 위임: date -v1d -v+1m -v-1d (BSD) / date -d (GNU)
다음청구일(첫결제일, 직전청구일) → "YYYY-MM-DD"
; 일자(첫결제일) < 15 → 다음달(직전청구월)의 15일
; 일자(첫결제일) >= 15 → 다음달(직전청구월)의 말일
(에폭 수동산술 금지 → 기존 오늘날짜(),다음달(),연체일수()처럼 date 외부위임 + /tmp.)2) core/구독게이트.한선 — 레코드 스키마 확장:
구독_레코드쓰기(L174)에firstBillDate,nextBillDate필드 추가 →
status|lastBilledMonth|overdueSince|firstBillDate|nextBillDate.
구독_가입(L248): 가입 시firstBillDate=오늘, 규칙에 따라nextBillDate=다음청구일(오늘,오늘)기록.
core/정산.한선 — 차감 트리거를 "월키 다름"에서 "오늘 ≥ nextBillDate"로 변경:
정산_1건(L403):만약 (마지막청구월 == 월키대상) 반환 1멱등은 유지하되, 차감 조건에오늘날짜() >= nextBillDate게이트 추가. 차감 성공 후nextBillDate = 다음청구일(firstBillDate, 오늘)로 갱신.정산_누락월(catch-up)은 nextBillDate 미달이면 스킵하도록 정합.
(g) ★ 위험요소 / 모호점 — 실행 전 사람 확인 필수
- [치명] 1,000,000 CRD 발행이 담보한도(≈107 CRD)를 ~9300배 초과. 담보부 대출이 아니라 중앙/개발비 무담보 발행이라는 정책 승인이 명시적으로 있어야 함. 없으면 작업1은 CRD 시스템 무결성(시스템한도 = MIN(담보합, 재단대출×3))을 위반. → 발행 권한 주체·정책근거 확인.
- kpsmacs 신원 미생성. CRD 원장은 자동생성되지만, 구독 주체로 로그인하려면 auth(9401)/member(9600) 계정 + CRD계정키 매핑 필요. → kpsmacs를 어느 시스템에 어떤 ID로 만들지, kimprin↔KPS 매핑 확정.
- 엔진 구독료 CRD 수취계정 미정의. 작업3
T의 받는이(FOUNDATION? 크라우니달러-엔진?) 확정 필요. - CRD 원장 WAL에 멱등키 없음. 일회성 작업1·2는 grep+flock으로만 이중방지. 운영 정기차감 전 WAL 멱등 확장(txid 필드/applied.txids) 권고.
- CRD 원장 HTTP 서비스 부재(차단). E-0 신규 서비스 없이는 정기 구독차감을 API로 못 함 → 우선 일회성은 직접 append, 정기차감은 서비스 구축 후.
- bank/member/dex 실 API 스펙 미확정(P0, 엔진 CLAUDE.md 동일 지적). member 9600·dex 9402 응답 형식 미확인.
- 첫 결제 비례(proration) 모호. 6/26~6/30(5일)에 full 2000 CRD인지 일할인지, 그리고 다음 결제가 6/30인지 7/31인지 해석 여지 → 본 계획은 "오늘 full 2000 + nextBillDate=2026-07-31"로 가정. 확인 필요.
- 두 개의 평행 구독 시스템. subscribe.crowny.org(9946)는 "CD"(가입 2000 + 월 150) — 엔진의 "engine-pro 2000 CRD/월"과 다름. 이번 작업은 엔진 구독이 맞는지 확인(혼동 시 엉뚱한 원장에 기록).
- CRD 원장 데이터:
/Users/ef/crowny-data/chain/원장.wal - CRD 원장 코드:
/Users/ef/crowny-finance/src/달란트/체인원장.한선,크라우니달러.한선,달란트앵커v3.한선 - bank:
/Users/ef/crowny-bank/src/크라우니뱅크.한선(9400, CRD 없음), WAL/Users/ef/crowny-data/bank/wal.log - 엔진 클라이언트(수정대상):
/Users/ef/crowny-engine/core/과금클라이언트.한선(L39,162,195,224),/회원클라이언트.한선,/환율클라이언트.한선 - 정산/게이트/시간(수정대상):
/Users/ef/crowny-engine/core/정산.한선(L257,263,283,403),/구독게이트.한선(L174,248),/시간헬퍼.한선 - auth:
/Users/ef/crowny-data/auth/users.txt(kps=CRW336e8142d7c7440a04ec),/profiles.json