북스 소셜 추천 플랫폼 — 구현 (소개자 귀속 + 가입게이트 + 다중대상 좋아요)
개요
book.crowny.org(:9931) 책방을 추천→소개자 자동귀속→가입게이트→다중대상 좋아요 소셜 플랫폼으로 격상. 울트라 딥리서치(9에이전트 검증)로 경제설계 확정 → 울트라 병렬 빌드(서버 한선씨=Sonnet / 클라 JS=Sonnet / 카피=Haiku) → 메인 세션(Opus) 통합·컴파일·라이브검증.기존 라이브 레이어(가입100맘·맘보내기·게시판·역보상·QnA·NFT) 위에 증분 구축. 딥리서치 종합 참조.
무엇을 했는지
1. 추천 도구 + 소개자 자동귀속
- POST /api/live/recommend {fromNick,book} →
/welcome?ref=<nick>&book=<slug>URL + 짧은 코드. 추천 의도 로깅(append-only). - welcome ?ref 처리: 착지 시 ref를 localStorage
crRef저장 + "OO님의 추천으로 오셨군요!" 표시. - 가입 시 귀속: signup {nick,ref?,phone?} — ref 유효(≠nick, 역왕복 차단, 멱등)시 referral PENDING 기록. phone → SHA256 dedup(같은 폰 다른 닉=409).
- 전환 보상: ref-convert {invitee} — 피추천자 첫 챕터 읽을 때 클라가 호출 → PENDING→CONVERTED(멱등) + 소개자 +50맘. (피추천자는 가입 시 100맘)
2. 가입게이트 (책 단위)
- 첫 책 무료. localStorage
crBooks에 연 책 슬러그 누적 → 2번째 다른 책 + 비회원이면 게이트월. 2번째 책 첫 챕터는 스크롤 45%서 소프트 발동. - 게이트월 카피: "첫 번째 책은 선물이에요. 가입하면 100맘, 두 번째 책부터 자유롭게. 친구 추천하면 50맘." → 가입(무료)=등록게이트.
3. 다중대상 좋아요 (책/챕터/작가/리뷰)
- POST /api/live/like {nick,ttype,tid} — ttype별 차등단가(챕터1·책3·작가5·리뷰1맘), 지갑 차감, 일일캡 30맘(비이월), dedup(타깃 파일 nick 스캔), 카운트·앵커 기록.
- tid 정본(충돌 방지): 챕터=
<슬러그>_<버전>_<장>(crownyai_expert_1) / 책=<슬러그>(crownyai, 버전 합산) / 작가=kimpresident/ 리뷰=댓글id(C-...). 버전≠슬러그 혼동 + 책 간 충돌(book3/expert/1) 해소. - 리뷰어 품질게이팅: 리뷰 좋아요 ≥5 시 리뷰작성자 +10맘(1회). 댓글쓰기가
revau_<id>.aut(리뷰id→작성자) 매핑 기록 → like가 보상. - POST /api/live/likecount {ttype,tid,nick?} → {count, liked}. 리더 버튼이 로드해 카운트·이미좋아요 표시.
- 소셜증명: "N명이 이 챕터를 좋아해요" 배너.
경제설계 (딥리서치 기반, 초기 가설 — chain-anchor 실측 보정)
가입100맘 · 챕터1/책3/작가5/리뷰1맘 · 일일캡30(비이월) · 소개자50맘(지연·멱등) · 리뷰어10맘(좋아요≥5) · 환금 초기차단(내부전용).검증 (라이브 GREEN)
- 서버 스모크(별도포트): recommend/signup+ref/self-ref차단/ref-convert(+50,멱등)/좋아요4종 차등단가/dedup/likecount/리뷰어보상(110맘)/폰dedup(409) 전부 정상.
- 전체 동선(로컬 9931): 추천링크→가입(ref,referred:1)→좋아요 챕터/책/작가(99/96/91, capLeft 29/26/21)→전환보상(소개자 100→150맘) ✓
- 게이트웨이: 정규 443 경유 reader/welcome?ref/api 전부 200(8443→443 정규 HTTPS 301 리다이렉트는 게이트웨이 세션 정책).
- tid 충돌 해소 확인: crownyai_expert_1 ≠ book3_expert_1.
관련 파일
- 서버(한선씨):
/Users/ef/crowny-agent/책서버.한선— 신규 라우트(라우트_추천링크/ref변환/좋아요/좋아요수) + 가입 수정(ref/phone) + 댓글쓰기 리뷰어매핑 + 헬퍼(referral/like/phone dedup·일일캡·잔액증가). 상수 13~23줄 아래. - 배포 캐시:
/Users/ef/crowny-data/bin/bookagent.toau(2.08MB). 공급자=crowny-infra 워치독(node)이 9931 점유·최신 toau respawn. launchd com.crowny.bookagent는 바인드충돌로 78루프(중복 슈퍼바이저, 인프라 세션 소관). - 클라(JS/HTML):
웹/build-reader.js— 추천공유·좋아요4종·책단위게이트·소셜증명·SLUG/CHAPTID 주입.웹/welcome/index.html— ?ref 처리(15727B, 읽기 16384 한계 근접 주의). - 데이터(샤딩, flat):
data/라이브/— ref/(referral·inv_·intent.log) · like/{chapter,book,author,review}/+cap_·revau_·revrw_ · likecnt/ · phone/.
함정/교훈
- 쓰기()/덧쓰기()는 부모 디렉토리 미생성(silent 실패) → 동적 prefix 서브디렉 샤딩 금지, flat 파일명으로 평탄화. (메모리 feedback_hanseon_write_no_mkdir + 가드레일)
- 버전≠슬러그: 리더 클라 BOOK=data-book=버전id(expert), 빌드 Node BOOK=슬러그. 좋아요 tid는 슬러그 포함해야 책 간 충돌·버전합산 정합. SLUG 상수 주입으로 해결.
- HTTP응답_JSON엔 평면 배열 직접전달(JSON생성 이중감싸기 금지).
- 소스 변경 후 재컴파일·재배포 필수(라우트_환영착지 선례 재확인).
- 이중 슈퍼바이저: launchd + crowny-infra 워치독이 같은 9931 관리 → launchd 78 EX_CONFIG 루프(워치독이 실서빙). 기능 무영향이나 인프라 정리 필요(인프라 세션).
잔여 이슈
- 단가·일일캡·보상규모는 가설 — 라이브 후 chain-anchor 로그로 4상 튜닝.
- welcome.html 15727B로 읽기 16384 한계 근접 → 더 키우면 .pN 스트리밍 전환 필요.
- launchd 78 루프 정리(인프라 세션 — launchd bootout 또는 워치독 일원화).
- 폰 인증은 해시 dedup만(SMS OTP 아님) — 본격 봇방어는 SMS 연동 시 강화.
- 환금 게이트(맘→chain/bank/dex)는 누적 임계 후 별도 설계.