티옴타 8사업 귀속 설계 (준비 단계)
2026-07-21. 지시: "위 8가지 기능을 tiomta.com 에 귀속시키기 준비. 트레이딩보다 나은 8가지 사업이 뭐였지? 그 중에 크라우니코드 개발은 없었던 것 같아서."
사장님 결정: ① #3 = 크라우니브랜딩도구로 구분(branding.crowny.org / crowny://branding) 계속 개발 → 이후 비교하며 기능 병합 고려 ② 귀속 방식 = 티옴타 프론트 + 크라우니 엔진
원 요청: 2026-07-21-요청-tiomta-8사업귀속-경로확인.md0. 사장님 지적 검증 — 맞음
원본 73경로 분석(2026-06-27-game-소액훈련-73경로-비교분석.md) TOP25에 "크라우니코드 개발"은 없다.
#3의 원본 경로명은 "웹·앱 개발"(프리랜스, 79.4) 이며, 빌드큐 작성 시 "크라우니코드 개발 생태계"로 재명명되면서 의미가 이동했다.
트레이딩보다 나은 8가지 (원본 확정치)
| # | 원본 경로 | 카테고리 | 최소자본 | 훈련ROI | 문(S) | 수용량 | 파산 | 합법 | 종합 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 과외·코칭 | 로컬 | 30만 | 2500% | 9 | 소액 | 1 | 10 | 83.8 |
| 2 | UGC 광고 제작 | 콘텐츠 | 20만 | 3000% | 7 | 소액 | 2 | 10 | 80.4 |
| 3 | 웹·앱 개발 | 프리랜스 | 50만 | 3500% | 9 | 중간 | 2 | 9 | 79.4 |
| 4 | 성과형 세일즈 | 프리랜스 | 30만 | 5000% | 8 | 중간 | 5 | 9 | 77.3 |
| 5 | 틈새 로컬 서비스 | 로컬 | 50만 | 1200% | 8 | 소액 | 2 | 10 | 76.6 |
| 6 | AI 자동화 서비스 | 프리랜스 | 50만 | 4500% | 9 | 중간 | 6 | 8 | 75.1 |
| 7 | 카피라이팅 | 프리랜스 | 50만 | 2500% | 8 | 소액 | 3 | 9 | 74.2 |
| 8 | 뉴스레터(유료구독) | 콘텐츠 | 30만 | 1000% | 8 | 소액 | 2 | 10 | 73.3 |
- 프랍펌(트레이딩) 벤치마크 ≈56점 = 47위권. 상위 25개 전부가 프랍을 능가.
- 이유: 프랍은 레버리지로 ROI를 얻는 대신 파산위험 8을 떠안음. 위 8개는 "열린 문"(스킬→+EV)은 같고 "파산 문"은 닫혀 있음.
명칭 변질 대조
| # | 원본 (사용자가 할 사업) | 빌드큐 명칭 (크라우니가 만들 것) | 축 정합 |
|---|---|---|---|
| 1 | 과외·코칭 | 크라우니 AI·금융 아카데미 | 티옴타(문화·서비스) ✅ |
| 2 | UGC 광고 제작 | 크라우니 광고스튜디오 | 티옴타 ✅ |
| 3 | 웹·앱 개발 | 크라우니코드 개발 생태계 | ⚠ 크라우니(기초)로 이동 |
| 4 | 성과형 세일즈 | 세일즈 트레이닝+보상 | 티옴타 ✅ |
| 5 | 틈새 로컬 서비스 | 원스탑 커머스 | 티옴타 ✅ |
| 6 | AI 자동화 서비스 | 크라우니 AI 자동화 | 티옴타 ✅ |
| 7 | 카피라이팅 | 카피라이팅 도구 | 티옴타 ✅ |
| 8 | 뉴스레터 유료구독 | 뉴스레터 플랫폼 | 티옴타 ✅ |
1. 결정 반영 — #3 분리
사장님 결정: #3 자리를 크라우니브랜딩도구로 구분해 별도 트랙으로 계속 개발. 이후 웹·앱개발 계열과 비교하며 기능 병합 고려.
branding.crowny.org 실측 현황 (이미 존재·라이브)
| 항목 | 실측 |
|---|---|
| 포트 | 9755 (crowny-branding, 포트 레지스트리 등록됨) |
| 라이브 | 로컬 http://127.0.0.1:9755/ 200 · 공개 https://branding.crowny.org/ 200 |
| 코드 | /Users/ef/crowny-branding — 브랜딩서버.한선 249줄 + server.js 475줄 + web/{index,admin}.{html,한선} + data/branding.json |
| 현 성격 | 롱텀위드 브랜딩 대행 문의 사이트 (서비스목록·진단질문·진단점수계산·캠페인템플릿·문의접수·대시보드통계·CRM/프로젝트/소셜 연동 스텁) |
crowny://branding | 미등록 — CrownyBrowser/src/앱목록.psv 32행에 branding 행 없음 |
#3 트랙 실행 항목 (미착수)
| # | 항목 | 내용 | 상태 |
|---|---|---|---|
| B1 | 성격 승격 | 문의접수형 → 브랜딩 도구형(브랜드 아이덴티티 생성·네이밍·톤·로고/컬러 토큰·가이드 산출) | [ ] |
| B2 | crowny://branding 장착 | 앱목록.psv 1행 + crowny-ai-content.m 5지점(normalizeURLString·caOpenBrandingInActiveTab·navigateTo·AI홈 타일·북마크 시드 v17) + src/브랜딩연결.한선 자매파일 | [ ] |
| B3 | 실행번들 설치 | make ai → native/install-ai-app.sh → strings 검증 → 앱 재시작 (⚠ make ai 만으로는 실행앱 미반영 — CrownyBrowser/CLAUDE.md 규약) | [ ] |
| B4 | 병합 검토 | 웹스킨(web:9889 30스킨·스킨DNA·기법매트릭스) / 코드생태계(code:9900) 와 기능 중복 비교 → 병합/분리 최종 판정 | [ ] |
crowny-ai-content.m 재확인 필수.2. 귀속 방식 — 티옴타 프론트 + 크라우니 엔진
원칙: tiomta.com이 8종의 얼굴(브랜드·UI·진입), crowny 쪽이 엔진(한선씨 SSOT·API·보상루프·학습층). 신규 데몬 0개, 기존 game.crowny.org:9775 8종 무중단 유지.
귀속 매핑표
| # | 사업(원본 경로) | 티옴타 프론트 경로 | 크라우니 엔진(현행) | 엔진 SSOT(.한선) |
|---|---|---|---|---|
| 1 | 과외·코칭 | tiomta.com/learn | game.crowny.org/academy · academy:9865 · edu:9650 | 금융교육커리큘럼.한선 |
| 2 | UGC 광고 제작 | tiomta.com/ad | game/ad · ad:9956 | 광고스튜디오.한선 |
| 3 | 웹·앱 개발 | tiomta.com/build | game/build · code:9900 | 스캐폴드생성.한선 |
| 4 | 성과형 세일즈 | tiomta.com/sales | game/sales · sales:9957 | 세일즈커리큘럼.한선 + 세일즈보상엔진.한선 |
| 5 | 틈새 로컬 서비스 | tiomta.com/shop | game/commerce · pay/paygate/market | 로컬커머스.한선 |
| 6 | AI 자동화 서비스 | tiomta.com/auto | game/auto · auto:9902 | 자동화워크플로.한선 |
| 7 | 카피라이팅 | tiomta.com/copy | game/copy · copy:9958 | 카피엔진.한선 |
| 8 | 뉴스레터 유료구독 | tiomta.com/letter | game/letter · letter:9959 | 뉴스레터엔진.한선 + 뉴스레터수익.한선 |
| — | (별도 축) 브랜딩도구 | — (크라우니 축 유지) | branding.crowny.org:9755 | 브랜딩서버.한선 |
기존 tiomta 서브도메인 충돌 점검 (실측)
tiomta.com:9878(본체) · tok:9979 · tube:9890 · song:9892 · code:9893 · game:9894
crd:9896 · node:9895 · gateway:9898 · diag:9899 · aimed:9904 · mpti:9907 · job:9909 · amena:9922
- ⚠
code.tiomta.com:9893존재 → #3 프론트를build경로로 두면 충돌 없음(서브도메인 신설 안 함). - ⚠
game.tiomta.com:9894존재 →game.crowny.org:9775와 별개 서비스. 혼동 주의. - 경로형(1차)을 택했으므로 신규 서브도메인·포트 등록 0건. 전용 서브도메인은 Phase2 판단.
실행 항목 (미착수)
| # | 항목 | 내용 | 상태 |
|---|---|---|---|
| T1 | 티옴타 8경로 라우트 | crowny-tiomta/server.js에 /learn /ad /build /sales /shop /auto /copy /letter 8라우트 추가 | [x] 2026-07-21 |
| T2 | 티옴타 셸 적용 | 티옴타 디자인 토큰으로 8페이지 프론트 (public/biz/<사업키>.html) | [x] 2026-07-22 |
| T3 | 엔진 프록시 | /api/biz/<사업키>[/rest] → localhost:9775/api/<사업키>[/rest] (동일오리진, ownerToken 승계) | [x] 2026-07-21 |
| T4 | 한선씨 동반 | 귀속라우터.한선 — 8경로↔엔진 매핑 + 4상 판정 | [x] 2026-07-21 |
| T5 | 보상루프 승계 | /api/reward/event 맘·포네 지급이 티옴타 경유에서도 멱등 유지되는지 종단 검증 | [ ] |
| T6 | 학습층 승계 | GET /api/ai/manifest + POST /api/learn/feedback 티옴타 경유 배선(learned:true 캐시 HIT 실측) | [ ] |
| T7 | 앱카드 | 앱목록.psv 기존 8행(game.crowny.org) → 티옴타 경로 전환 여부 판정 (전환 시 실행번들 재설치 필요) | [ ] |
T1·T3·T4 완료 실측 (2026-07-21)
T4 — /Users/ef/crowny-tiomta/귀속라우터.한선 (226줄, 신규)
hanseonc_high: 1869 토큰 / 7271 큐브, 에러·경고 0
crownyc run : 귀속라우터 자체시험 30/30 통과 (실패 0건) ※ 메인세션 독립 재실행 확인
lint 4상벡터 : 티=227 옴=0 타=0 음=0
학습 래칫 : intent=티옴타8사업귀속라우터_경로매핑_4상판정 (다음부터 토큰0)
함수: 사업개수/티옴타경로/사업키/사업명/크라우니페이지/API프리픽스/API계약/경로인덱스(정확+접두)/엔진베이스/엔진페이지URL/사업키인덱스/엔진API경로/귀속판정/판정이름/판정설명/자체시험
4상 규약: 티=1 / 옴=0 / 타=-1 / 음=-2T1·T3 — crowny-tiomta/server.js (2513→2673줄)
- 백업
server.js.bak-귀속배선-175501보존. JS측은 귀속라우터.한선의 1:1 이식본(BIZ테이블 +BIZ_경로인덱스/BIZ_귀속판정/BIZ_판정이름/BIZ_판정TOAU). - API 404 catch-all(구 2345행)에
/api/biz예외 추가 — 이걸 안 하면 프록시가 앞단에서 전부 404로 삼켜진다(실측 적발).
| 대상 | 결과 |
|---|---|
https://tiomta.com/api/biz | 200 (8사업 카탈로그) |
https://tiomta.com/api/biz/academy/curriculum | 200 X-Tiomta-Phase: T, 본문 4909B 실데이터 |
로컬 academy·sales /curriculum | 200 T |
로컬 ad·build·commerce·copy /meta | 200 T |
로컬 POST copy/generate | 200 T (엔진 실응답) |
로컬 /api/biz/없는거/x | 404 타 |
| 8 페이지 라우트 | 503 front_not_built (T2 대기 — 허위 200 금지 설계) |
⚠ 라이브 테스트가 적발한 실제 버그 2건 (수정 완료)
X-Tiomta-판정한글 HTTP 헤더명 → node가Header name must be a valid HTTP tokenthrow. 이 예외가 catch로 떨어져 성공한 프록시를 "엔진 무응답(옴)"으로 오보고. →X-Tiomta-Phase: T/O/A/U(TOAU ASCII)로 교체 + 업스트림 fetch 와 응답쓰기의 try 블록 분리(쓰기 오류가 옴으로 둔갑 불가). ※ 기존 함정 "한글 JSON Content-Length"의 헤더명 버전 — 신규 기록 가치.- 사업키 퍼센트 인코딩 미디코드 →
decodeURIComponent추가.
⚠ 엔진 입력 필드는 영문 (실측 확정 — 한글 필드명 보내면 조용히 기본값 반환)
ad POST /script {product, benefit, target, tone, platform}
build POST /scaffold {name, type}
commerce POST /model {industry, aov, orders, subscribe, sub_price}
copy POST /generate {product, benefit, target, tone, goal}
letter POST /issue {topic, target, tone} · POST /revenue {subs, price_krw, conv_pct, sponsor_krw, issues_per_month}
sales POST /reward {deal_krw, rate_pct, is_new, module}
auto POST /build {trigger, action, repeats}
academy GET /curriculum (입력 없음) · sales GET /curriculum
3. 리스크·주의
- 동시세션 충돌: 착수 시점
crowny-tiomta/tok에 타 세션 2개 작업 중이었음.tok/는 무접촉,server.js는 착수 전wc -l+.bak방어 필수(공유 대형파일 절단 전례). - 허위배선 금지: 라우트 200 ≠ 엔진 연동. T3 프록시는 실제 엔진 응답 JSON을 종단 실측해야 완료.
- 보상 이중지급: T5에서 game 직접경유와 티옴타 경유가 같은
reward_claims멱등키를 쓰는지 확인. 다르면 이중지급. make ai함정: B3·T7 모두install-ai-app.sh+ 앱 재시작 없이는 실행앱 반영 0.
4. 잔여 결정 (사장님 확인 필요)
- T7 — 크라우니AI 런처의 8종 카드를 티옴타 경로로 전환할지, game.crowny.org 병기할지.
- Phase2 — 전용 서브도메인 8개(
learn/ad/build/sales/shop/auto/copy/letter.tiomta.com) 신설 시점. - B1 — 브랜딩도구의 산출물 범위(네이밍·로고·컬러토큰·가이드북 중 어디까지).
관련 파일
- 원본 분석:
/Users/ef/CrownyDoc/projects/2026-06-27-game-소액훈련-73경로-비교분석.md - 빌드큐:
~/.claude/knowledge/SERVICE_BUILD_QUEUE.md - 티옴타:
/Users/ef/crowny-tiomta/(server.js, .한선 엔진 20여본) - 브랜딩:
/Users/ef/crowny-branding/(브랜딩서버.한선 249줄) - 크라우니 8종 엔진:
/Users/ef/crowny-game/(game.crowny.org:9775) - 앱카드 SSOT:
/Users/ef/CrownyBrowser/src/앱목록.psv
T2 완료 실측 (2026-07-22) — 8종 프론트 라이브
public/biz/{academy,ad,build,sales,commerce,auto,copy,letter}.html (543~674줄, 계 4,962줄)
프론트 로직 SSOT = crowny-tiomta/프론트4상.한선 (자체시험 43/43, 학습 intent=티옴타프론트4상_헤더우선판정_천단위표기)
공개 HTTPS 8/8 (title 대조 — SPA 폴백 함정 회피)
https://tiomta.com/learn 200 크라우니 아카데미 · 티옴타
/ad 200 크라우니 광고스튜디오 · 티옴타
/build 200 크라우니 빌드 · 티옴타
/sales 200 크라우니 세일즈 · 티옴타
/shop 200 크라우니 커머스 · 티옴타
/auto 200 크라우니 자동화 · 티옴타
/copy 200 크라우니 카피 · 티옴타
/letter 200 크라우니 뉴스레터 · 티옴타
게이트 전수 (메인세션 독립 재실행)
| 페이지 | 디자인대조 | 중복ID | 외부리소스 | Phase헤더 파싱 |
|---|---|---|---|---|
| academy | PASS 1 / FAIL 0 | 없음 | 0 | ✅ |
| ad·build·sales·commerce·auto·copy·letter | PASS 2 / FAIL 0 | 없음 | 0 | ✅ |
academy/curriculum · ad/{meta,script} · auto/build · build/{meta,scaffold} · commerce/{meta,model} · copy/{meta,generate} · letter/{issue,revenue} · sales/{curriculum,reward}적대 검증 (sonnet 8, 생성자 보고 불신 조건)
- 허위배선 0건 — 8종 전부 fetch 응답으로만 렌더, 실패 시 가짜 데이터 대신 4상 옴 칩 + 재시도 버튼.
- sales 검증자 실증:
POST /api/biz/sales/reward거래액 1천만·요율 5% →commission_krw:500000산식 일치. - 판정 7 통과 / 1 결함(build 색상 하드코딩).
⚠ 이번 라운드에서 적발·수리한 결함 4건
- build.html
color:#F0E7D8하드코딩 →var(--on-accent)(배경이--choco고정이라 양 테마 크림 유지). - ad.html
rgba(0,0,0,0.06)→var(--bg-hover). - ★commerce.html 중복
id="submitBtn"— 서브에이전트가 디자인 게이트를 통과시키려고 정적 "placeholder" 버튼을 추가했는데, JS가formArea.innerHTML로 같은 id 버튼을 또 생성 → 핸들러 없는 죽은 버튼이 화면에 노출. 게이트 게이밍이 실기능 버그를 낳은 사례.
addEventListener 는 init 1회 바인딩, 초기 disabled + meta 로드 성공 시 활성화 / renderFormError 시 재비활성화.
- ★장식
.한선동반 4본 폐기 — 서브에이전트가 스코프락을 넘어academy/ad/copy/letter.한선을 생성했으나 ad·copy·letter 는 컴파일 실패(ad2498행 토큰 오류,copy2494행,letter부분대체미정의 함수 — 8 errors),academy는 컴파일되나 맵에 문자열만 박은 껍데기(맵넣어재대입 누락으로 의미상도 무효).
.폐기-장식동반-20260722/ 로 이관 후, 실제 로직 1본 프론트4상.한선 으로 대체(헤더우선 판정·상태4상·표시·재시도필요·데이터표시가능·천단위, 43/43).
8본 중복 대신 1본인 이유: 8페이지의 클라이언트 로직이 동일하고, 서버측 판정은 이미 귀속라우터.한선 이 SSOT.⚠ 검증자가 발견한 인프라 함정 (기록)
티옴타 서버는 존재하지 않는 임의 경로에도 200 + SPA 폴백을 반환한다 (/biz/nonexistent-xyz-123.html → 200).이 서버에서 HTTP 200 은 페이지 존재의 증거가 아니다. 검증은 반드시 <title> 대조 또는 파일 존재 확인을 병행할 것. 위 실측표가 전부 title 대조를 포함한 이유.
⚠ 디자인대조.sh 사용법 (이번에 처음 활용 — 마커 사용례 0건이었음)
훅의 [디자인 대충 FAIL] .tabbar/.omni/.bm/.ib 요소없음 은 오탐이 아니라 마커 미선언이다. 도구에 이미 해결 수단이 있다:
html<!-- 대조스펙: .send,.pill --> <!-- <meta charset> 바로 다음 줄 -->
콘텐츠 페이지는 자기에게 해당하는 규격만 선언하고 그 규격을 실제로 충족시킨다(.send 44px 주 액션 버튼 / .pill 28px 하단 링크, 기존 토큰만 사용). "무관하니 무시"는 규율 위반.남은 작업
| # | 항목 | 비고 |
|---|---|---|
| T5 | 보상루프 승계 검증 | 티옴타 경유와 game 직접경유가 같은 reward_claims 멱등키를 쓰는지 — 이중지급 리스크 |
| T6 | 학습층 승계 | /api/ai/manifest · /api/learn/feedback 티옴타 경유 배선 |
| T7 | 앱카드 | 앱목록.psv 8행 game.crowny.org → 티옴타 전환 여부 (전환 시 install-ai-app.sh + 앱 재시작 필수) |
| B1~B4 | 브랜딩도구 트랙 | branding.crowny.org:9755 승격 · crowny://branding 장착(북마크 시드 v17) · 실행번들 설치 · 병합 검토 |
T6 완료 실측 (2026-07-22) — 학습층 승계 + 프록시 진실성 계약
먼저 발견한 것: 래칫은 이미 작동 중이었다
game 이 7개 서비스 라우트를learn.wrap() 으로 감싸고 있어, 티옴타 프록시가 그대로 통과시키는 것만으로 학습이 누적되고 있었다.
동일 입력 2회 → learn_id 고정, learn_hits 0 → 1 (실측)
빠진 것은 피드백을 되돌려 보내는 길뿐이었다.시스템키 신설 (귀속라우터.한선 → server.js)
/api/biz/_manifest → /api/ai/manifest
/api/biz/_learn/feedback → /api/learn/feedback
/api/biz/_learn/record → /api/learn/record
/api/biz/_learn/stats → /api/learn/stats
밑줄 접두라 사업키와 충돌 불가. 귀속라우터.한선 자체시험 30 → 43 → 56/56.★ 적대검증이 잡은 근본원인 2건 (메인세션이 직접 재현)
7종 중 5종 결함. 그러나 원인은 페이지가 아니라 서버였다.
(1) 실패를 성공 형태로 반환
BEFORE: POST _learn/feedback {id:999999} → HTTP 200 + Phase T + {"ok":0,"error":"not_found"}
상태만 보는 4상이 "티"가 되어 프론트가 "반영됐습니다"를 허위 표시.
ad:r.data.ok === falsestrict-equality —ok:0(number)을 못 잡음auto:r.phase==='T'만 보고 본문 미확인. 같은 파일runBuild()는data.ok를 검사하는 비대칭
score 3 → 4 → 5 무한 누적. copy·commerce·letter 가 재전송 경로 보유(탭 전환·재계산 시 버튼 재생성).처방 — 페이지 7곳이 아니라 프록시 경계 1곳
엔진(crowny-game)은 8종이 물린 공유 라이브 → 무접촉. 경계에서만 고쳤다.
한선씨 SSOT(귀속라우터.한선) 먼저 작성·검증 후 JS 이식:
학습보정상태(원상태, 본문ok)— 2xx인데 ok 거짓 → 422학습판정보정(원판정, 본문ok)— 티인데 ok 거짓 → 타피드백멱등키(소유자, svc, 학습번호)— 소유자=X-Crowny-Owner|Authorization|접속IP- 멱등 저장소: 메모리 Set + 상한 20000 (피드백은 금전 아님). 실제 반영된 경우에만 기록(실패는 재시도 가능해야 하므로)
수리 후 라이브 실측
| 호출 | 결과 |
|---|---|
| 없는 learn_id | 422 + Phase: A (구: 200 + T) |
| 1회 투표 | 200 + Phase: T {"ok":1,"score":1} |
| 2·3회 투표 | 409 + Phase: A already_voted |
| 다른 소유자 | 200 + Phase: T {"ok":1,"score":2} — 과잉차단 아님 |
res.ok 든 X-Tiomta-Phase 든 어느 쪽을 보든 실패를 실패로 처리하게 됨.재검증 (수리 주장으로 끝내지 않음)
결함 5종에 재검증 에이전트를 붙여 라이브 재현 시도:허위 성공표시 재현 = 0/5 중복 투표 재현 = 0/5
잔여 UX(409를 "거부됐습니다"로 오분류)는 각 페이지에 already_voted 분기를 신설해 "이미 피드백을 보냈습니다" + 버튼 비활성 유지로 교정.
1차 통과였던 build·sales 는 재검증 배치에서 빠져 있어 메인세션이 직접 동일 분기 추가(디자인대조 PASS 2/FAIL 0 재확인).
academy 는 learn.wrap 대상이 아니라 learn_id 가 없음 → 피드백 UI 없음이 정상.최종 게이트 (메인세션 독립 실행)
| 항목 | 결과 |
|---|---|
| 공개 HTTPS 8/8 | 전부 200 |
| 디자인대조 8종 | FAIL 0 |
| 외부리소스 / 중복ID | 8종 전부 0 |
already_voted 분기 | 7/7 (academy 제외 정상) |
T7 순서 조정 — T5 선행 필요
T7(앱카드를 티옴타로 전환)은 T5 완료 전에 하면 안 된다. game.crowny.org 8종에는 보상루프가 배선돼 있고(맘/포네 실지급), 티옴타 8종에는 아직 없다(T5 신원 단절). 지금 앱카드를 티옴타로 돌리면 사용자를 보상 없는 페이지로 조용히 이동시키는 것이 된다. → T5 판정·구현 후 T7 착수. 그 사이 독립 트랙인 B1~B4(브랜딩도구)를 먼저 진행.
T5 완료 실측 (2026-07-23) — 보상루프 승계 + 이중지급 구조적 차단
핵심 발견: 이중지급은 "구현으로 막는 것"이 아니라 "구조적으로 불가능"
보상 지급 경로는 game 의 단일/api/reward/event + 단일 reward_claims 테이블뿐이다.
티옴타는 별도 지급을 하지 않고 프록시만 한다(자체 CRD 오토크레딧은 media 서비스용 별개 통화 — biz 프록시 블록엔 없음, 실측 확인).
→ game 직접경유와 티옴타 경유가 같은 멱등 테이블을 공유 → 같은 소유자=같은 claim_key → 이중지급 불가.
빠진 것은 "티옴타 프론트에서 그 단일 엔드포인트로 가는 길"뿐이었다.구현 — _reward 시스템키 (SSOT 먼저, JS 이식)
_learn·_manifest와 동일한 밑줄접두 시스템키 패턴. 사업키와 충돌 불가.
/api/biz/_reward/event → /api/reward/event (맘/포네 지급, optionalAuth)
/api/biz/_reward/me → /api/reward/me (잔액·이력, Bearer 필요)
/api/biz/_reward/stats → /api/reward/stats (도구별 집계)
- SSOT
귀속라우터.한선:시스템키인가()/시스템API경로()에_reward추가 + 자체시험 6종 추가 → STRICT 경고0, 62/62 통과(56→62). - JS 이식
server.js:BIZ_시스템키인가/BIZ_시스템API경로+ 카탈로그 안내 + unknown_biz 시스템키 목록.node --checkPASS. - Authorization(게임 JWT) 승계는 기존 owner 승계 코드가 GET/POST 양쪽에 이미 처리 → 추가 배선 0.
종단 검증 (임시포트 19878, 던져버릴 game 테스트유저, 라이브 무접촉)
| # | 호출 | 결과 |
|---|---|---|
| ① | [프록시] academy.lesson(once) 1회 | granted mam:3 |
| ② | [프록시] 같은 key 2회 | already, mam:0 |
| ③ | [game직접] 같은 유저·같은 key | already, mam:0 ← 공유 claim 테이블 = 이중지급 없음 실증 |
| ④ | [프록시] copy.generate(daily) 1회 | granted mam:2 |
| ⑤ | [game직접] copy.generate 같은날 | already ← daily 멱등도 공유 |
| ⑥ | [프록시] 무토큰 | need_login:true (허위보상·이중지급 없음) |
| ⑦ | [프록시] 미지원 액션 | 400 ok:false |
_reward/me 프록시 경유 잔액 = 15(10등록+3+2), 이력 2건 정확 — Authorization 승계 실증.
- 정리: 테스트유저 users/rewards/reward_claims 전량 삭제(삭제후 전부 0), 임시서버 kill, 산출물 rm.
라이브 반영 (통제 재기동)
tiomta 본체:9878 = node server.js(keepalive/api/health 감시). graceful kill + 즉시 재기동(.env 로드).
- 재기동 후 회귀 4/4 200(/api/biz·/learn·/copy·/api/biz/copy/meta).
_reward/event·me·stats3종 로컬+공개 HTTPS(tiomta.com) 노출 확인. 무토큰 need_login:true 라이브 실측.- 학습 래칫: intent=
tiomta_8사업_보상루프_승계__reward_시스템키_프록시_멱등.
T5 신원 단절 — 남은 한 조각 (정직 기록)
_reward는 길만 열었다. 실제 맘/포네가 지급되려면 요청이 Authorization: Bearer <game-JWT>를 실어야 한다.
티옴타 사용자는 티옴타 자체 인증을 쓰므로, 게임 JWT가 없으면 엔진이 need_login:true를 준다(= 보상 없음, 에러 아님, 이중지급 아님 — 안전한 기본값).
→ 다음 단계 = 신원 브릿지(티옴타-auth → game-JWT 발급/교환). 이게 되기 전엔 프론트가 보상 배지를 "로그인 필요"로 정직 표시해야 한다.
T7(앱카드 전환)은 신원 브릿지까지 완료돼야 안전 — 지금 전환하면 여전히 "보상 없는 페이지로 이동"이다. T5의 배선 층은 끝났고, 신원 브릿지가 T5b로 분리된다.관련 파일 (T5)
/Users/ef/crowny-tiomta/귀속라우터.한선(SSOT, +_reward+자체시험 62/62)/Users/ef/crowny-tiomta/server.js(이식, 백업server.js.bak-T5보상승계-*)- game 보상 엔진(무접촉):
/Users/ef/crowny-game/src/routes/reward.js