Final Release Gate — Nougat DevPay Public Beta
Historical snapshot
This report contains historical release-gate decisions, including revised verdicts. Earlier READY text is not proof of current beta readiness.
Read the latest decision within this document and compare its date, target SHA, and environment with today's branch before using it.
HEAD: post-Wave-4 (staging+prod deployed, all P0/P1 verified)
Gate A — Identity & Security
- [x] 실제 회원가입·로그인 (signup→JWT, login→JWT)
- [x] 표준 JWT (HS256, iss/aud/exp/iat/tv — Axum 계약)
- [x] Password Hash (PBKDF2 WebCrypto + legacy sha256 호환)
- [x] 비활성 계정 차단 (status + token_version)
- [x] Buyer/Seller/Admin 분리 (verify_token_db role)
- [x] Seller 격리 (list_scope — seller scoped, admin all, buyer 403)
- [x] 고정 판매자 fallback 제거 (seller_nougat → 403)
- [x] 관리자 Bootstrap (bootstrap-admin.ps1 real hash)
- [x] Rate Limit (login_attempts — 5 fails → 429)
Gate B — Database
- [x] Fresh D1 Migration (001 dup 제거, 009-011 등록)
- [x] 기존 DB Upgrade (staging+prod ALTER 적용)
- [x] Seed 멱등성 (INSERT OR IGNORE)
- [x] Local/Staging/Prod 격리 (별도 D1)
- [x] Prod Demo Seed 차단 (NOUGAT_SEED opt-in + 스크립트 거부)
- [x] Seller 무결성 (memberships + seller body)
Gate C — Business
- [x] 상품·프로젝트 CRUD (endpoints_impl)
- [x] 공개 스토어 (widget-config public)
- [x] 무료 피드백 (feedback INSERT + payment_id UNIQUE)
- [x] Sandbox Checkout (PAYMENT_MODE=staging simulate)
- [x] Refund/License/Subscription (소유권+ledger+payment)
- [x] Ledger Verify (refund 차감 반영)
- [x] Audit Verify (chain)
- [x] Outbox (claim→lease→consume→retry→dead-letter, 실제 전달만 consumed)
- [x] Prod Mock 결제 차단 (PAYMENT_MODE=prod → NOT_LIVE_PAYMENT)
Gate D — Frontend
- [x] FE↔Workers 필수 API (26 endpoints wired)
- [x] Mock/API 분리 (apiMode emptyDb)
- [x] 사용자 상태 격리 (logout clearAuth)
- [x] 로그인 보호 화면
- [x] 판매자 온보딩 (실 API)
- [~] Browser E2E (미완 — Playwright 미실행)
Gate E — Operations
- [x] 로컬 FE/BE 빌드 (nuxi + worker-build)
- [x] Staging 배포 (api.staging verified)
- [x] 실제 URL Smoke (auth/scoping/payment verified)
- [x] CORS (PATCH/DELETE + origin allowlist)
- [x] 롤백 (wrangler rollback verified)
- [x] D1 백업·복구 (export→restore verified)
- [x] Prod 배포 (api.devpay verified)
Gate F — Public Launch
- [~] 개인정보/약관 실제 주체 검토 (문서만, 주체 미검증)
- [ ] 고객 문의 채널
- [ ] 계정 복구/삭제 절차 (deactivate만 구현)
- [x] 공개 vs Sandbox 구분 (PAYMENT_MODE)
- [x] 보안 설정·Secret 검증
- [~] 장애 대응 절차
- [ ] 외부 공개 범위 확정
v7.0 잔여 결함 해소
- A-2 audit_verify → admin-only (공유 secret ≠ admin) — VERIFIED
- A-5 DEV_AUTH staging 제거 — 공개 staging JWT-only — VERIFIED (X-Dev-User→401)
- B-2 feedback_payment → prod NOT_LIVE_PAYMENT — VERIFIED
- B-4 issue_license → APPROVED seller/admin only — VERIFIED
- C-1/2 public storefront — anonymous /public/stores/:slug + slug-조회 FE — VERIFIED
- D-3 settle seller_scope_db — VERIFIED
- 잔여: SPA deep-link 404-status (Pages quirk — shell은 렌더링됨), A-4 email ownership (email 미검증 — invite-based 필요), fresh-D1 full test
판정: PUBLIC_BETA_READY_WITH_LIMITATIONS
핵심 보안·데이터·운영 Gate 통과. 미완: Browser E2E, 고객 채널, 계정 복구, 개인정보 주체 검토, DEV_AUTH 스테이징 dev-path (sandbox 의도). 실결제는 prod에서 명시 비활성(402) — PG 연동 전 Preview 모드.
v8.0 상태 정정 (NOT_VERIFIED 원칙)
실제 라이브 검증이 끝난 것만 TESTED로 표시. 나머지는 NOT_VERIFIED.
| 항목 | 상태 | 증거 |
|---|---|---|
| PBKDF2 signup→logout→login→/me | VERIFIED | staging 실테스트 — signup→relogin JWT→/me 200, wrong→401 |
| spec의 "PBKDF2 delimiter 누락" | 오보 | pbkdf2$50000$salt$hash — 구분자 3개 정상 |
| JWT·revocation·rate-limit·scoping | VERIFIED (v6/v7) | staging/prod 라이브 검증 |
| Public storefront | TESTED | anonymous /public/stores/nougat 200, unpublished→404 |
| Email ownership | NOT_VERIFIED | 이메일 검증 메커니즘 없음 — 초대기반 정책 필요 |
| Browser E2E | NOT_VERIFIED | Playwright 등 실브라우저 미실행 |
| 계정 복구/삭제 | PARTIAL | deactivate만 구현 |
| 고객 문의 채널 | MISSING | 구현 없음 |
| 개인정보 주체 검토 | NOT_VERIFIED | 문서만, 실제 운영 주체 미검증 |
판정 정정
이전 PUBLIC_BETA_READY_WITH_LIMITATIONS → READY_WITH_LIMITATIONS, 단 실제 브라우저 E2E + 이메일 소유권 확인 전까지 완전 PUBLIC_BETA_READY는 아님. 핵심 보안·데이터·운영은 라이브 검증 통과.