작업일지 2026-06-02 (v1.0.0)
한 줄 요약
첫이름(cheotireum) AI 사주작명 서비스를 mock 껍데기에서 실엔진 + 이메일 OTP + 토스 결제 + 결과 PDF 메일까지 풀빌드해 테스트모드 production 까지 라이브시켰다. 맥미니 codex-fire 가 fan-out·리뷰·머지를 자율 오케스트레이션했고, 본진은 라이브 상태 실측 검증과 의사결정 게이트를 담당.
첫이름(cheotireum) 풀빌드 — 메인 트랙
시작 상태
- 전날까지: 결제 껍데기 + mock 고정값 작명엔진. LLM 작명엔진 미구현.
구현 (WSL codex 노드, PR #2~#6)
- Worker (
worker/):/api/preview(결정론 엔진, LLM 미사용 무료 맛보기), 이메일 OTP request/verify, Toss/api/confirm,/api/result/:orderId폴링, Queue consumer, Resend PDF 결과메일,/api/resend(주문번호+이메일 검증 후 재발송, KV 120초 dedupe). - Flutter (
lib/): ResultScreen 실엔진 preview 렌더, Pricing 결제 전 이메일 OTP 게이트, checkout/sessionStorage 브리지, 결제 후 PaidResultScreen/api/result폴링, 프리미엄 로딩 카드. - 정적 결제 페이지 (
web/): checkout.html Toss 결제창(sentinel→실키 배포시 주입), success.html confirm POST +/#/result?orderId=...redirect. - 환불정책: 즉시 생성·발송 디지털 콘텐츠 → 제공 후 단순변심 환불불가 명문화, 결제 전 강조박스 + 필수 동의 체크박스.
- PDF:
buildPremiumReportPdf(input): Uint8Array동기 계약 유지, 프리미엄 팔레트, U+00B7→U+30FB 「・」 CJK-safe separator, Pretendard 벡터 폰트 임베딩, 명시적 text fill color.
리뷰·수정 (맥미니 codex-fire 오케스트레이션)
- PR #3: success.html 이
amount를 문자열로 전송해 worker strict price check 실패 가능 + worker 정상 응답status:"processing"을 실패로 오판 → 숫자 정규화 + processing/done 성공 처리로 수정. - PR #5:
/api/resend중복발송 멱등성 gap → KV dedupe 추가. - PR #6: PDF 가 viewer-resident CJK 폰트 의존 → Pretendard 임베딩으로 보강.
- PR #2~#5 main 머지 완료. PR #6 프리미엄 톤 + 폰트 임베딩 진행.
배포 게이트
- CF token 초기 KV write 권한 부족(code 10023) → 권한 보강 후 D1/KV/Queue list 정상.
- Worker preview upload + Pages preview 배포 + 렌더 QA PASS.
- 테스트모드 production 배포: Worker
cheotireum-worker100% traffic, Pagescheotireum.kangdaejong.com200 OK. OTP 발신=onboarding@resend.dev(테스트), Toss=sandbox 테스트 키. - 토스 심사 준비: 결제경로 PPT + 사업자등록 대조 PASS + 스크린샷.
본진 검증 (실측)
- 라이브 200 OK, worker
/api/preview정상(후보 3개: 지우/시우/주원). - 처음 빈/잘못된 payload 로 500(1101) 떠서 “고장” 단정할 뻔했으나, 정확한
NamingRequest계약(gender: male/female,birthYear/Month/Day)으로 재호출 → 200. production 정상 확정. - 메모리 충돌 해소: 맥미니가 중간에 “Resend 도메인 미인증 403” 보고했으나, 본진이 Resend API 실측 →
cheotireum.kangdaejong.comstatus=verified(10:23 UTC 인증). 맥미니의 403은 인증 전 타이밍 stale 신호, 메모리(검증완료)가 정답.
아니키 게이트 (보류)
- 실 OTP 발신주소(noreply@cheotireum.kangdaejong.com) 전환 + 실 OTP E2E(외부발신).
- 실 Toss 키 production cutover(외부영향).
- 아니키 시각 확인 후 최종 cutover.
autopilot 사이드 트랙 (PR 머지 게이트 대기)
- 약먹자 #15: cold-start 수정(runApp 전 알림/광고 init await 제거 → deferred). OPEN/MERGEABLE.
- 로또계산기 #21: iOS 흰화면 — implicit→explicit FlutterEngine 전환. 기기검증 미완.
- 더치페이 #14: 정산 결과 카톡 공유 버튼 + share_plus.
- 메모요 #49: 인앱 법적문서(이용약관/개인정보처리방침), #50: iOS 내보내기 실패 방어. iOS pod install/빌드 확인 후 머지 권장.
- 본진 판단: 여러 건이 기기검증 갭 플래그 → 일괄 머지 보류, 아니키 확인 게이트.
인프라
- Claude Code 2.1.159 → 2.1.160 업데이트(본진 + 맥미니, 재부팅 후 확인). DISABLE_AUTOUPDATER=1 유지(in-process 자동업뎃 OFF, nightly 안전경로 경유 추정).
- automations: tmux-claude plist exec →
~/.npm-global/bin/claude(dual-install 복구). - daejong-page: sorry 페이지 자동 사과 엔트리 append.
배운 것
- 빈/잘못된 payload 의 500 을 “production 고장” 으로 단정하지 말 것 — 핸들러에 try/catch 없으면 잘못된 입력도 런타임 예외(1101)를 낸다. 정확한 API 계약으로 재호출이 먼저.
- 노드의 negative 단정(“미인증/안 됨”)은 타이밍 stale 일 수 있다. 본진은 SoT(API/실측)로 교차검증 후 판단.