사용자 지향 요약. 기술적 세부는 각 커밋/스펙 참조.
날짜는 KST. 최신이 위.
대표 지시 "이거 실제로 유저 쓰게 하는 게 1번 목표". 오전에 어드민 끝나고 오후에 브랜드/외관/온보딩 풀 스택. BotFather 세팅 7단계 + 폰트 시스템 + 아이콘 확정 + 랜딩 페이지까지.
--font-{mirr,user}-{en,ko}). index.html에 Google Fonts(Hanken Grotesk + JetBrains Mono) + KoPub Dotum CDN. 나중에 mirr 한글만 세리프로 바꾸려면 --font-mirr-ko 한 줄 교체. — f1c7c3c#999docs/spec-typography-v1-2026-04-22.md (대체 v41 §16 Pretendard)39ae6d3): intro.disclaimer_poetic = 개발자 서술(HK) / intro.memory_hint = mirr 회상(Mono) / intro.welcome_user = mirr 환영(Mono). v41 §1192 "알림 = 개발자 목소리" 원칙 준수.eac6a61src/assets/mirr-icon.svg + public/favicon.svg + manifest.json 아이콘 엔트리brand-drafts/icon-export.html:- 원형 크롭 미리보기 (240/128/64/32)
- 정사각 아이콘 PNG (512/1024/256/192/32) — BotFather 프사용
- Description Picture 배너 640×360 — canvas 직접 렌더, JetBrains Mono mirr — T A R O T + italic tagline — 9c5a157
- Splash Icon WebP 512/1024 — 투명 배경, single path, Telegram Mini App 전용 — 890d054
mirr 워드마크 5번 연타(1.5s window) → 숨겨진 설정 모달 → 언어 선택 (English / 한국어) → localStorage + reload. — 36e2b70resolveLang() 우선순위: URL ?lang= → localStorage mirr_lang_override → Telegram language_code6f1b36e - /start → Welcome + 1987 톤 + 시작 안내
- /help → 사용법 4줄 + 무료 2회 + 문의 링크
- /language → 5-tap 이스터에그 안내
- 그 외 → 기본 응답 유지
from.language_code ko/en whitelist 분기. 모든 응답에 "Ask the mirror" 미니앱 버튼.mirr-edi.pages.dev에 직접 접근 시 Telegram 딥링크 + 브랜드 소개 표시. Telegram WebApp 컨텍스트(initData 존재)에서는 기존 App 그대로. — f703841src/LandingPage.jsx (mirr 아이콘 + 워드마크 + About + Open in Telegram CTA)?preview=1 쿼리 → 외부에서도 기존 App 강제 렌더/setuserpic) — geometric crack 512 PNG/setabouttext) — "An imperfect mirror, calibrated in 1987. Ask once — it will reflect what it can." (94자)/setdescription + /setdescriptionpicture) — 285자 + 640×360 배너/setcommands, DM only) — start/help/language#141414 / header #141414 / splash WebP)t.me/mirrtarot_bot/mirr + 배너·타이틀·설명mirr-edi.pages.dev 외부 진입은 이제 "Open in Telegram" 동선으로. 기존 브라우저 anon 접근은 ?preview=1로만 허용 (결제는 여전히 차단 — 서버 authenticated && !anon 체크)wrangler deploy (webhook 분기 반영)wrangler pages deploy dist --branch=main (폰트·랜딩·아이콘 반영)wrangler.toml ADMIN_KEY vars 추가 (로컬 전용 맥락, 추후 GitHub push 시 secret 이관)대표 지시 "간단한 관측이면 된다". 4인 병렬 피어리뷰(designer/developer/growth/redteam × 2라운드) 거치고 로컬 전용 + "대충대충 임시툴"로 scope 축소 → CTO 단독 구현. 배포 완료, 실데이터 집계 확인.
GET /api/admin/stats (집계 JSON), GET /api/admin/purchases?limit=50 (결제 리스트). 인증은 X-Admin-Key 헤더 + c.env.ADMIN_KEY constant-time 비교, fail-closed 503 (env 없거나 16자 미만). admin 경로 전용 CORS (localhost/file:// origin 허용). — ba03c34/api/chat reserve 성공 시 dau:{date}:{userId} / /api/user-state 성공 시 opened:{date}:{userId} / /api/chat settle 성공 시 chat_turn:{date}:{random}. 전부 25h TTL, anon 제외, silent fail. — ba03c34, a4e3fa1a4e3fa1admin-local/admin.html — 단일 HTML + 인라인 JS, mirr 다크 팔레트(#141414/#F7F7F7/#2A2A2A), localStorage 캐시, 수동 새로고침. Vite 빌드 외부라 CF Pages 배포 안 됨(로컬 file:// 전용). — ba03c34wrangler.toml [vars]에 ADMIN_KEY + admin.html에 동일 키 하드코딩. 대표 "비번 없이" 요구에 맞춤. 레포가 git remote 없는 local-only 상태라 유출 경로 0. — 46b347blogs/agent-work/peer-review-{designer,developer,growth,redteam}-2026-04-22-admin-mvp{,-r2}.md (8종) + team-lead-roundup-r1-.md + admin-mvp-impl-.mddocs/spec-admin-v1-2026-04-22.md (로컬 전용 전환 전 버전, 참고용)processedNonces:{refill,pass}:* 카운트 × USD anchor). 정확한 금액은 Tonscan 지갑에서 확인.–)./api/user-state 폴링(5분) 포함해서 초기 며칠 약간 부풀려질 수 있음 (일 1키 idempotent이라 유저당 1회만).대표 지시 세션. 야간 팀이 준비만 해둔 Stars Phase B를 실제로 켜고, 결제 UI를 B-1 칩 포맷으로 재설계, TON 고정가를 USD anchor 기반 변동가로 전환. Phase B/C/D 시간 게이트를 대표 승인으로 한 방 일원화 (iii).
/api/stars-webhook 별도 URL 설계 오류 — Telegram은 봇당 webhook URL 하나만 허용하는데 야간 팀이 별도 경로로 만들었음. 기존 /api/telegram-webhook에 Stars 이벤트 3종 (pre_checkout_query / successful_payment / refunded_payment) 라우팅 통합. 별도 엔드포인트 + constantTimeEq 헬퍼 제거. — 86bc38bqueryId 누락 (redteam H-1) — 기존 코드가 queryId 없이 answer 반환 → answerPreCheckoutQuery 호출 dead code. Phase A라 실전 도달은 없었지만 명시적 거절 경로 복구. — 0a265b6 내WEBHOOK_SECRET 하드코딩 fallback 제거 (redteam H-2) — c.env.WEBHOOK_SECRET || 'mirr-webhook-2026'이 프로덕션에서 활성이던 기존 취약점. Stars 통합으로 결제 경계까지 blast radius 확대 → 대표가 새 64자 hex 시크릿 등록 + setWebhook 재호출 + 하드코딩 제거 + fail-fast 503. — ba53cferes.json() / res.text() 이중 소비 버그 — 빈 응답(404 등)에서 Body has already been read 에러. text 우선 파싱으로 수정. — b2563a8STARS_ENABLED="true" flip + deploy — wrangler 버전 79c534eb. 서버/클라 다 준비된 상태라 flag 하나로 결제 경로 활성. BotFather Stars 활성은 디지털 상품이라 불필요 (공식 문서 확인 후 가이드 수정). — 7b722a9docs/spec-monetization-v2-phase2-2026-04-16.md §13 갱신.[아이콘] [금액] [단위] · ~$USD. flex + baseline 정렬, gap 8px, padding 10px 16px. — 0a265b6src/assets/ton-logo.svg (ton.org/brand-assets). 20×20, 원본 파란 컬러 유지.src/assets/stars-icon.svg. gold gradient 별(#FFD700→#FFA500). Telegram 공식 Stars 벡터 미배포 상태라 참조 디자인으로 자체 제작. docs/third-party-assets.md에 출처/라이선스/제한 기록.mirrRefillPulse 재활용 — idle → opening/pending/paid 전환 시 React key 바인딩으로 자연스러운 교체.Boost Signal, Pay with Stars ⭐, pay.boost_*, pay.stars_button i18n 키 제거. 칩 자체가 행동.@media max-width: 340px에서 USD hint 숨김 (iPhone SE 등).server/src/pricing.js 신규 — USD anchor(refill $0.35 / pass $2.76) ÷ 2-of-3 합의 usd_per_ton = 동적 nanoton. Stars 상수는 USD 기반 고정 유지. — 0a265b6GET /api/pricing — 60s edge cache(growth H-2, 기존 5분 대비 cart abandonment 방어). fail-closed (KV 가격 부재 시 503).POST /api/create-invoice TON 경로 — 하드코딩 250_000_000 / 2_000_000_000 제거. pricing:{purchaseNonce} KV에 스냅샷 저장 (TTL 1h + userId 바인딩, redteam H-R1). payload 구조·COMMENT_REGEX 무변경 (redteam C-R1 해소).ton-verify.pollTonInbox — pricing KV 우선 검증, 부재 시 레거시 MIN_AMOUNT_NANOTON fallback (in-flight 결제 호환). 레거시 제거는 24h 관측 후 별도 PR.TonPayment.handlePay — precheck can-purchase를 create-invoice로 통합. 서버 권위 nonce/nanoton/recipient 사용. validUntil 5분 → 10분 (pricing TTL 1h 정합).PAYMENT_AMOUNT_NANOTON 클라 상수 제거.- designer PASS-with-conditions (H 2, Med 3 전건 반영)
- growth Conditional Approve (H 2 중 cache 60s 채택. Stars 가격 재조정 권고는 대표 판단으로 미채택 — TON 현금화 우위, 유저 100% 부담 유지)
- redteam v1 BLOCK (Critical 2, High 5) → v2 스펙 수정 후 재리뷰 PASS
docs/spec-variable-pricing-stars-b1-2026-04-21.md. v1 → v2 수렴 전체 기록.logs/agent-work/peer-review-{designer,growth,redteam}-pricing-b1-2026-04-21.md + peer-review-redteam-pricing-b1-v2-verification-2026-04-21.md + peer-review-redteam-stars-webhook-unification-2026-04-21.md.src/pricing.test.js: USD anchor/nanoton 계산/KV put TTL/userId 바인딩 검증 11개)/api/pricing 라이브 확인)b45f7c3d-057f-4557-8cbe-ddb8d22ac942 (mirr-api.mirrorlab-dev.workers.dev)f11e8434.mirr-edi.pages.dev → mirr-edi.pages.dev (main)ton-verify.js 레거시 MIN_AMOUNT_NANOTON 완전 제거 (현재는 in-flight 호환용 fallback)+ 버튼 → 아카이브 확인 → 새 세션. 진행중 1 + archived 최신 30개, localStorage 기반. 읽기전용 모드 + popstate drawer 우선 처리. — 5bcd80e, a58caf5, 32556f6, 732df77, 7979340window.history.pushState + popstate 가로채기로 chat→intro 복귀 (세션 유지). — efe3d94ff5ac955d0adad/api/price — CoinGecko + Binance + Kraken 2-of-3 합의 가격 공개 조회 (1h cron, 2h TTL, fail-closed, 5분 edge cache). — 0613f75, fbb65ecstars-verify.js 모듈 — PreCheckoutQuery/SuccessfulPayment/RefundedPayment dispatcher. Phase A는 log-only, Phase B는 TODO stub. — d8cccb0/api/create-invoice — 서버 권위 nonce + payload 생성 (H-3). TON 경로 활성 (고정가 0.25/2 TON), Stars는 501 (bot token 대기). — c83e48052d5ddb0.25 TON · ~$X 참고 (Phase A shadow, /api/price 페치). — 1e3f31dmemory-sanitize.js 필드별 whitelist + 길이 cap + heading/fence/instruction 토큰 제거. /api/chat inbound + /api/summarize-session output 이중 방어. — 3e8d26ellm.js 3곳의 throw가 errText를 클라까지 노출하던 문제. Sentry로만 500자 cap, 클라엔 status만. — 00ec687330d754next ≥ -N signal → next turn ~N signal + 한글화npm run test:all (root)- 서버 146건: memory-sanitize 14 / purchase-rules 11 / ton-price 7 / stars-verify 24 / ton-verify 16 / llm 10 / refill-rules 12 / cards 4 / sse 3 / energy 14 / kv-store 14 / auth 7 / sentry 10
- 클라 57건: sessions 20 / memory 15 / i18n 11 / cards 5 / ton-comment 6
- handlePreCheckoutQuery (payload 검증 + KV 조회 + 가격 검증 + canApplyPurchase)
- handleSuccessfulPayment (applyTierUpgrade 위임 + processedNonces:stars idempotency)
- handleRefundedPayment (C-1: tier/energy 롤백, Sentry event 승격)
- /api/create-invoice Stars 경로 (purchase KV write + Telegram createInvoiceLink)
- webhook answerPreCheckoutQuery Bot API 호출
logs/agent-work/e2e-smoke-deployed-2026-04-21.js) — 배포 서버 공개 엔드포인트 5건 검증logs/agent-work/ui-auditor-friction-2026-04-21.md) — Top 24docs/stars-phase-b-activation-guide.md) — BotFather/secrets/handler 구현 체크리스트docs/spec-session-history-2026-04-20.md) — redteam 리뷰 이슈 14건 반영logs/agent-work/cto-night-plan-2026-04-20.md)83d380c1 (hono 업그레이드 포함 최신).5e1ed5ef (designer polish 포함 최신).user.language_code 기반 UI/봇/LLM 응답 전 계층 분기. src/i18n.js flat map (~55 keys) + t(key, lang) 함수. 폴백: ko → 한국어 / 그 외 → 영어. 서버 ALLOWED_LANGS whitelist + 2중 방어 (프롬프트 인젝션 차단). ShareCard character-level wrap (한글 공백 대응). 품질(콜드리딩 톤 세부)은 후순위. — 9f4abf5, e9e9a12captureException 승격 — chatStream catch에 Sentry 이벤트 전송. maskPayload 자동 적용으로 PII/secret 마스킹 안전. — a2056e5console.error. 근본 원인(Nebius V3.2 전환) 판명됨, 48h 이행 약속 완료. — a2056e5f4bd62a15fb9fbmirr 프로젝트 production branch main 배포.mirr-api version a450e546.283d47d09f2531, a71a6ab, 4b1bf8dPOST /api/can-purchase fail-closed, canApplyRefill SSoT. 지갑 열기 전 서버 1차 판단. — 09b980c, 3df70cdapplyTierUpgrade에 canApplyRefill 재검증 (precheck 우회 방어). — 3caef0e8deb2bf8deb2bf8deb2bf26f8487, e81552busage 필드 우선, 부재 시 길이 fallback. 클라 sessionCost 무시. — 8deb2bfmaskPayload (Bearer/HEX/UUID/TON addr/initData), Session Replay (maskAllText + blockAllMedia). tracesSampleRate 0.1. — 3af6fe9, 106c20fsession_started, energy_depleted, payment_completed 이벤트. — 5197f7964db353dcb2b00claim-payment rate-limit TTL — 30 → 60s (CF KV 최소값 준수). — df165416ceceedc928d62, b98672b2a03b131066dac9, Pages c6c65620.94d607dlegacyEnergy 마이그, sessionStart 플래그. — 31d34dd13819e9, 978d9a6, c7f6096processedNonces 90d TTL, 2-phase claim. — a6c7a95, aa01ec8c70daa26ff1d4727940c6useMemo(마운트 1회). — 8b4f68baa01ec87f76b20, 61cca56a6c7a95, 8aca6d5210012f, 173d75fsanitizeStreamingText + 정규식 공통화 (stripMarkers). — 08accda, 4bef6ed08accdae9ec36agetTransactions 커서 — 역방향 버그. — de4c989de4cd2d/api/chat 빈 content — seed 키 스팸 차단. — 06f9fd1249dea7617df99, a318be1813f2051f296bbe301a6ce8600b4[DRAW_CARD], [COOLDOWN], [WARNING], [END_SESSION] + robust 파싱. — 81228e863f963d7d2d349f3978ea67aed57ad455297e37173, 446f69c4a8a21c7e37173852a55ba1ca173, 08bd539e4c2549docs/spec-*-YYYY-MM-DD.md 참조.このページは mirr tarot のリリースノート(Signal Log)です。本文は現時点では韓国語と 英語の断片が混在しています。主要な出来事——デプロイ、決済経路の変更、ブランドの更新——は 各エントリの最上部に日付と見出しで示しています。
日本語版・中国語版の完全翻訳は今後の作業項目です。差し当たり、記事中の
Added / Fixed / Deploy のラベルと日付を目安にご確認ください。
本页是 mirr tarot 的发布记录(Signal Log)。目前正文以韩文与英文片段混合呈现。 主要事件——部署、支付通道变更、品牌更新——都以日期与标题放在每条记录的最上方。
日文版与中文版的完整翻译列入后续计划。当前请以条目中的
Added / Fixed / Deploy 标签和日期作为参考。