베타 RC 릴리스 게이트 — 증거와 결정
읽기 안내
특정 후보 커밋·스테이징 환경에 대한 Gate 증거와 판정입니다.
이후 커밋이나 운영 환경까지 자동 승인한 것으로 해석하지 마세요.
현재 브랜치: feat/pg-magician 후보 소스 SHA: d83e29adfaf07be8a9ac1a620ba9cd56bb921a36 검증 중인 스테이징 배포:
- 프론트엔드:
https://staging.nougat-devpay.pages.dev - API:
https://api.staging.devpay.chu.plus - Worker:
nougat-devpay-api-staging, 배포 버전dc0caf4a-d26a-423e-85c3-59e3ad8e6f01 - D1:
nougat-devpay-d1-staging(0d9d565e-6090-4e67-9723-f21e31f11ee1)
결정
PUBLIC_BETA_READY_WITH_LIMITATIONS
이것은 프로덕션 배포 승인이 아닌 릴리스 후보 권고입니다. 프로덕션 배포, 프로덕션 D1 변경, DNS/시크릿/설정 변경, 실제 벤더/고객 액션은 여전히 명시적 사용자 승인이 필요합니다.
검증된 증거
| 영역 | 증거 | 결과 |
|---|---|---|
| 아이덴티티 및 인가 | 익명, buyer, seller A/B, admin, dev-header 케이스의 스테이징 Worker/D1 인가 매트릭스 | 53/53 검사 통과 |
| 셀러 설정/상품 지속성 | 스테이징 저장/재독, 상품 CRUD/상태/필드 지속성, 크로스 셀러 격리 | 통과 |
| 운영자 콘솔 계약 | /me, admin overview/users/verification/audit, 셀러 거부, 누락 사용자 404를 포함한 스테이징 admin 매트릭스 | 29/29 검사 통과 |
| 실제 사용자 흐름 | 스테이징 방문자 → 가입 → 로그인 → 셀러 온보딩 → 상품 생성 → 발행 → 익명 스토어 | 19 검사 통과 |
| 커머스 신뢰성 | 스테이징 체크아웃/멱등성/동시성, 유료/mock 정책, 환불/라이선스/구독/정산, outbox, 원장, 감사 | 32/32 검사 통과 |
| 배포 스모크 | 스테이징 프론트엔드 루트, SPA 딥링크, API health, 무인증 GET/POST /api/v1/projects | 모든 기대 200/401 응답 통과 |
| CORS | 허용된 스테이징 오리진은 일치하는 Access-Control-Allow-Origin과 200 반환; 거부된 오리진은 403 CORS_ORIGIN_DENIED 반환 | 통과 |
| 레이트 리밋 | 5번 실패 로그인이 401 반환; 6번째와 7번째가 429 RATE_LIMITED 반환 | 통과 |
| Worker 관측성 | X-Request-ID 응답 헤더와 일치하는 request_id 오류 body 검증; /api/v1/metrics가 익명 401, buyer 403, admin 200(집계 카운트만) 반환 | 통과 |
| 스테이징 브라우저 E2E | 배포된 스테이징 아티팩트 대상 v9-landing-signup.spec.ts | 4/4 통과 |
| 스테이징 공개/role E2E | 배포된 스테이징 아티팩트 대상 격리된 buyer/seller/product 데이터의 staging-public-role.spec.ts | 5/5 통과 |
| Control Plane 게이트 | 통합된 릴리스 작업의 태스크 헤드 및 머지된 후보 검사 | 제출된 모든 릴리스 태스크 통과 |
| FE 빌드/타입검사 | 후보 SHA에서 vue-tsc, pnpm build:staging, pnpm build:production | 통과 |
| Worker 빌드 | 후보 소스에서 worker-build --release | 통과 |
| 로컬 백엔드 회귀 | cargo test --locked --offline | 29 통과, PostgreSQL 의존 테스트 1 무시 |
| D1 마이그레이션 추적 | 스테이징 schema_version이 각각 체크섬이 있는 버전 1–11 포함 | 통과 |
| D1 백업/복원 리허설 | wrangler d1 export 스테이징 → 스크래치 SQLite 복원 → 라이브 행 수 비교 | 23/23 테이블 일치 |
| 환경 API 정렬 | 배포된 스테이징 HTML이 https://api.staging.devpay.chu.plus 참조; 127.0.0.1:8080/localhost:8080 없음 | 통과 |
현재 한계
- 실제 PG 결제 캡처, 프로바이더 콜백, 정산 지급, 프로바이더 환불은 미연동. 프로덕션은 별도 승인 및 검증까지
NOT_LIVE_PAYMENT/402로 계속 fail closed해야 함. - 실제 이메일 전달과 이메일 소유권 증명은 미연동. Mock 이메일은 소유권을 검증하거나 과거 구매/라이선스를 주장하면 안 됨.
- 계정 복구와 완전 삭제는 불완전; 비활성화는 존재하지만 고객 대면 복구/삭제 흐름은 한계로 남음.
- 고객 지원 채널, 인시던트 대응 소유권, 외부 공개 출시 범위가 완전히 확립되지 않음.
- 법률/개인정보 페이지는 존재하고 도달 가능하지만, 실제 운영/법인 검토는 여기서 독립적으로 검증되지 않음.
- 최신 Worker/CORS 및 릴리스 후보 변경은 스테이징에서만 배포 및 검증됨. 현재 프로덕션 런타임은 새 승인된 프로덕션 배포와 프로덕션 스모크 검사 없이 이 후보에 대해 검증됐다고 주장하면 안 됨.
- 공식 스테이징 커스텀 도메인
https://staging.devpay.chu.plus는 Pages 프로젝트에 등록되고 CNAME이nougat-devpay.pages.dev를 가리키지만, 증거 시점에 Cloudflare 인증서 검증이 여전히pending이었음. 완료된 브라우저 실행은 실제 Pages 별칭https://staging.nougat-devpay.pages.dev를 검증함. - 로컬 Axum/SQLite 테스트는 회귀 증거일 뿐; Worker/D1 검증의 대체가 아님.
공개 배포 전 프로덕션 게이트
- 프로덕션 배포와 모든 프로덕션 DNS/시크릿/D1 변경에 대한 명시적 사용자 승인 획득.
- 승인된 후보에 해당하는 로컬 빌드 Worker 아티팩트와 로컬 빌드 Pages 아티팩트 배포.
- 비변경 프로덕션 스모크 실행: 프론트엔드 루트, SPA 딥링크, API health, 무인증 보호 라우트
401, CORS 거부 오리진 검사, 환경 API 베이스 검사. - 프로덕션
PAYMENT_MODE가 live 결제 전용으로 유지되고 유료 mock 체크아웃이402 NOT_LIVE_PAYMENT로 거부되는지 확인. - 프로덕션 배포 ID/버전, 소스 SHA, 스모크 출력, 롤백 대상, 운영자 승인을 기록.