finance.crowny.org — 초대 바이럴 서비스 (전화번호부 동기화 + 가입 알림 + 1맘 보상)
개요
크라우니 가입을 바이럴로 확산시키는 초대 서비스. 셀코어 이벤트버스(N.실시간)로 가입→알림 일원화.
- 전화번호부 동기화: 지인 연락처를 미리 등록(해시 pending 셀).
- 가입 알림 broadcast: 누군가 크라우니 가입(AI 가입/크라우니뱅크 계정생성) 시, 그를 연락처에 등록해둔 사용자들에게 "OOO님이 크라우니에 가입하셨습니다!" 알림.
- 1맘 보상: 등록해둔 지인이 가입할 때마다 등록자에게 1맘(≈25.5원) 지급. 쌍(등록자×지인) 1회 dedup + 가입 멱등.
울트라 워크플로우 9에이전트(설계4 → 구축2 → 컴파일0수리 → 검증3). compiled, 2.97MB toau.
셀코어 일원화 (감사 PASS 85/100)
- 연락처 1건 = 셀 1개: 슬롯 등록자/해시폰/마스킹표시명/상태/보상/지급맘/소스.
- 가입 트리거 = 이벤트버스: 워처생성("가입알림", 상태슬롯, "==", 1) + 이벤트워처등록 → 가입처리()가 셀씀(상태=1) → 이벤트발행 → 워처 발화 → 알림 생성. ad-hoc if-else 대신 셀+워처/이벤트버스로 일원화.
- 매칭:
_byphone_<해시> append-only CSV 역색인 순회(가입폰 해시 → 등록자 셀들).
- 보상 룰: 슬롯 보상마커(0→1) dedup 게이트 +
_pair_<등록자>_<해시> 쌍키 + _joined_<해시> 가입 멱등 카운터.
프라이버시
- 폰:
해시_SHA256(VM opcode 291) 정규화 후 해시만 저장(010-9988-7766/01099887766 동일 해시). 미가용 시 djb2 다항 폴백. 평문 폰/이름 영속화 없음.
- 표시: 이름마스킹(홍\동) + 폰마스킹(010\\\\1234).
신규 라우트
| 라우트 | 동작 |
|---|
| POST /api/invite/sync {user, contacts[]} | 연락처 해시 등록 → {registered, duplicate, rejected, totalContacts} |
| POST /api/invite/join {phone, name, source} | 매칭→1맘 지급(dedup)→이벤트발행→알림 → {firstJoin, rewarded[], notified[], message} |
| GET /api/invite/feed/:user | 가입 알림 피드(append-only 인덱스, id 단조증가) |
| GET /api/invite/rewards/:user | {momEarned, krw=floor(mom×255/10), joinedCount, settlement} |
| GET /api/invite/stats | {syncedContacts, joins, momPaid, krwPaid, operator} |
정산
- 1맘 = 25.5원. krw = floor(mom×255/10) — 정수근사(v10.0 자연반올림 함정 회피).
- 보상 = 원장 적립 지시(_ledger_)만. 실제 송금은 reward(9738) 배치 위임 + wallet(9410)/dex(9402) 맘↔포네. (렌탈 접수와 동일하게 정산은 전용 서비스 위임)
검증 (3중 + 독립 재확인, 모두 PASS)
- 셀코어+보상 감사: PASS 85/100 — 일원화·보상정확성·dedup·멱등·프라이버시 충족(수정 후). dedup 카운트 버그 수정·재검증.
- E2E 초대: PASS — sync(2) → join(AI, 1맘+알림) → rewards(momEarned1/krw25) → re-join(bank, 무보상+알림만) → feed(2) → stats. 기존 chat/shareholder/referral 회귀 무손상.
- 모바일 디자인: PASS — 베이지+골드 Claude스타일, 칩 앵커링 개선(최신 봇 메시지 바로 아래 인라인), overflow=false. collect 자유입력 서버 캡처 동작(receipt #11).
- 독립 재확인: sync→join(홍동님이 크라우니에 가입하셨습니다!)→rewards(1맘/25원)→재가입 멱등→feed 2건 정상.
잔여 폴리시 (함께 처리됨)
- 상태기계 슬롯13 단일 진실원 게이팅 정합성 보강(단계명 슬롯13 파생).
- collect 자유입력 이름/연락처 서버 캡처.
- 챗 칩 최신 메시지 하단 앵커링(밀도 개선).
관련 파일
- 백엔드: /Users/ef/crowny-finance/src/크라우니파이낸스.한선 (초대 로직 ~1021-1320, 라우트 5종) — v1.3.0
- 프론트: web/assets/chat.js(초대 모듈: sync카드/알림토스트 20초폴링/1맘카운터/칩앵커), chat.css
- 실행: 백엔드 :9750, 프록시 :9754 (수동 기동, 워치독 비관리)
향후 하드닝 (별도 — 인프라 영역)
- 자가가입 보상 우회: selfPhone 미선언 시 본인 번호 자가등록→자가가입으로 1맘 자가보상 가능. → sync 시 selfPhone 필수화 또는 가입 본인인증 연동.
- 인메모리 비영속: 초대DB/원장/멱등마커 전역 인메모리 → 재시작 시 소실(재유입 시 재지급 위험). → WAL 영속화(렌탈 DB와 함께). 단 실제 송금은 reward9738 배치라 정산층 dedup으로 1차 방어.
- 가입 트리거 연동: bank.crowny.org 계정생성 / AI 가입 측에서 /api/invite/join 호출 훅(별 세션 책임).