최종 제품화 리포트 — DevPay (§15 캡스톤)
읽기 안내
특정 검증 SHA를 기준으로 한 과거 제품화 평가입니다. 기능 상태·보안 발견사항·다음 릴리스 조건이 포함됩니다.
현재 PR 출시 준비 상태로 단정하지 말고 최근 제약 목록과 CI 증거를 함께 확인하세요.
평가 시점: 검증된 베이스
9798ed8da870753c821b6a819fac3486a04825e6(p0 제품 계약 문서 + p1 영속 권한 + p2 yp CLI + p3 셀러 운영 콘솔 + p5 제품 CI 머지). p4 보안/신뢰성 배터리는 동시에 랜딩했고 이 SHA에서 미머지입니다; 그 실행된 증거는 p4 워크트리의docs/security/product-red-team.md에서 인용됩니다(c4e5b93c…, 베이스라인e3b4d04대비 2026-11-04 실행).이 리포트는 승인이 아닌 기술입니다: PM이 릴리스 결정을 소유합니다. 모든 상태는 증거 바운드 —
VERIFIED클레임은 실행된 스위트를 인용; 미실행 항목은 추론 없이 라벨됩니다.
1. 준비 수준 — 정의와 현재 평가
| 수준 | 의미 | 평가 |
|---|---|---|
EXPERIMENTAL_ONLY | 연구 PoC; 루프백 증거만; 제품 표면 없음 | 파이프라인이 시작된 곳(auto-protection/secure-browser-licensing 실험) |
PRODUCT_CANDIDATE | 제품 형태 표면 + 영속 상태, 실제 인가 강제, 실제 스택(로컬)에서 독립 실행된 테스트 증거, 문서화된 한계 | 현재 수준 — 아래 주의 포함 |
BETA_READY | 후보 + 비작성자 사용자가 실행한 스테이징 배포 기능 세트, 실제 PG 테스트 모드 왕복, 백업/복원 훈련, 법률 승인, 운영 런북 | 미충족 — beta-readiness-checklist.md §2 블로커 B-1..B-8 참조 |
PRODUCTION_READY | 베타 + 승인된 live 결제, SLA/알림, 목표 볼륨에서 부하 테스트, 인시던트 이력 | 미충족 — 어디에도 프로덕션 클레임 없음 |
PRODUCT_CANDIDATE 주의: 모든 백엔드 증거는 루프백입니다 (wrangler dev --local + miniflare 로컬 D1, 127.0.0.1); 보안 플레인은 모든 실제 배포에서 비활성(LICENSE_SECURITY_ENABLED가 wrangler.toml에 부재 → 404); 호스티드 범용 실행은 설계 전용.
2. 이 wave에서 출시된 것 (태스크별)
| Wave | 산출물 | 주요 커밋 | 상태 |
|---|---|---|---|
| p0 제품 계약 문서 | docs/product/: product-scope, trust-model, product-contract, implementation-status, api-contract-map, pricing-metering-model | 6e608ec, 3ac0c78, 304d937 | 출시 — 코드에 근거한 계약 레지스트리, 알려진 한계 기록 |
| p1 영속 권한 | inbox_events dedup(015), usage_counters + consumed_by(016), reconciliation_runs/findings(017), outbox 정직 범위 + OUTBOX_SINK_URL + admin 재구동, 테넌트 스코프 읽기 API(bindings/usage/security-events/usage-counters) | 179b464, 931b69c | 출시 — 실제 로컬 D1에서 55검사 영속 E2E(tests/durable.test.mjs) |
p2 yp CLI | tools/devpay-cli/ — auto-protection 기계를 감싸는 init/plan/review/apply/verify/doctor; 증거 정직성 수정(공허 verify 거부, PARTITION_AUTH 고정, plan→apply TOCTOU, env 스크럽, 순회, gitignore) | 0584131, a7fba8d | 출시 — CI의 4개 e2e 테스트; 로컬 전용, 업로드 경로 없음 |
| p3 셀러 운영 콘솔 | fe/pages/operations/index.vue — 결제→entitlement 연결 뷰, 보안 이벤트, 환불 이상, 감사 피드, 리포트 모달; 라이선스 상세 PoP 바인딩/사용량; durable API 부재 시 우아한 디그레이드 | 652fb6e, 61e0db5 | 출시 — seller-ops.spec.ts(3 스펙)는 API에 durable 엔드포인트가 없으면 자체 스킵; Worker 경로에 대해서만 실행(CI e2e 잡은 Axum be/ 실행 → 스펙은 설계상 거기서 스킵) |
| p4 보안 + 신뢰성 배터리 | be-cloudflare/tests/red-team/ 12 레그 + tests/reliability/ 7 레그 + docs/security/product-red-team.md | 이 SHA에서 미머지 | 실행됨 — 11/12 BLOCKED + 1 PARTIAL(F-01); 7/7 BLOCKED; 루프백만 |
| p5 제품 CI | .github/workflows/yetdapay.yml — product-suites(license-crypto, 영속 E2E, CLI e2e, 8개 auto-protection 스위트) + security-regression(커밋 아티팩트 검증 + 조건부 p4 스텝); wrangler/worker-build 고정, 최소 권한 permissions: | c76fd91, e506769 | 출시 — 하드 게이트, continue-on-error 없음 |
| p6 (이 wave) | docs/product/: beta-readiness-checklist, data-protection-compliance, unit-economics-cost-model, hosted-execution-requirements, final-productization-report, known-limitations | 이 커밋 | 문서만 — 코드 변경 없음, 새 클레임 없음 |
3. 기능별 상태 (12개 핵심 기능, 현재)
| # | 기능 | 9798ed8 상태 | 증거 |
|---|---|---|---|
| 1 | 보호 Spec | EXISTING_AND_REUSABLE(PoC 등급) | CI의 spec 스위트; CLI 게이트를 통한 draft→approved 라이프사이클; 영속/서명 승인 없음 |
| 2 | 보호 플랜 | EXISTING_AND_REUSABLE(PoC 등급) | CI의 planner 스위트; sha 바운드 spec/target/driver(TOCTOU 거부) |
| 3 | Track-A 보호 실행 | EXISTING_AND_REUSABLE(PoC 등급) | CI의 analyzer/partitioner/track-a 스위트; node:vm은 경계 아님 — 기록됨 |
| 4 | Track-B 에이전트 네이티브 실행 | EXISTING_AND_REUSABLE(PoC 등급) | track-b 스위트 + CLI AGENT handoff 번들 |
| 5 | 라이선스 발급 및 라이프사이클 | EXISTING_AND_REUSABLE | PAY-01/04/05 레그; lic_{ord_id} 결정론적 멱등성; 셀러 발급 32비트 키 = 열린 발견 |
| 6 | Entitlement 프로토콜(호스티드) | IMPLEMENTED, 배포에서 게이트 OFF | activate/capability/execute/status + 영속 카운터; USE-01/02 레그; RT-SEC-01/02/08; wrangler.toml에 LICENSE_SECURITY_ENABLED 미설정 |
| 7 | BYOS 강제 SDK | EXISTING_AND_REUSABLE + 상호운용 델타 | @yetdapay/license-* 0.1.0; iss/activatePath 기본값이 Worker와 다름; wire 버전 필드 없음 |
| 8 | 영속 사용량 | IMPLEMENTED(이 wave에서 승격) | license_usage + usage_counters가 소비와 원자적(consumed_by 승자 가드); 읽기 API 존재 |
| 9 | 결제 동기화 | NEEDS_HARDENING → IMPLEMENTED(루프백, mock+TEST-stub) | inbox dedup, 권위 재조회, confirm_pending, needs_review; 실제 PG 샌드박스 BLOCKED_EXTERNAL_CREDENTIALS; outbox 소비자 선택적 |
| 10 | 환불 및 폐기 | EXISTING_AND_REUSABLE | refund_attempts 라이프사이클 + 부분 상한 + 보정 배치; REC-03 순서 레그 |
| 11 | 독립 검증 및 증거 | EXISTING_AND_REUSABLE + 제품 플레인 배터리 | p4 제품 레드팀/신뢰성(19 레그 실행); r18 47레그 아티팩트 CI 검증 |
| 12 | 셀러 콘솔 + 운영 | PARTIALLY_IMPLEMENTED → PARTIALLY_IMPLEMENTED+ | 운영 페이지 + 라이선스 상세 durable 표면; 바이어 셀프 서비스 여전히 NOT_IMPLEMENTED; spec/plan UI 없음 |
4. 열린 발견 인벤토리
p0–p5 리뷰 + p4 배터리의 통합 잔여 발견. (전체 상세: known-limitations.md.)
Medium
| ID | 발견 | 출처 | 상태 |
|---|---|---|---|
| M-1 | 공개 무제한 POST /licenses/verify로 열거 가능한 32비트 셀러 발급 라이선스 키(~4.3×10⁹ 공간) | product-contract.md KNOWN_LIMITATION | 열림 — 수용; 형식 마이그레이션 또는 레이트 리밋 |
| M-2 | Worker↔SDK 계약 상호운용: iss(devpay-lic vs yp), activatePath 기본값, aud/tenant_id/kid 없음, 버전 필드 없음 — 외부 소비자가 조용히 깨짐 | p5-sdk-contract-audit.md, implementation-status #7 | 열림 — 버전 계약 결정 필요(B-6) |
| M-3 | /auth/login(5회 실패→5분 잠금) 외 요청 수준 레이트 리미팅 없음. 웹훅/라이선스 엔드포인트 무제한 | p4 F-05(Info→비용/남용 리스크로 추적) | 열림 — 인프라 작업 |
| M-4 | 배포된 스택에 D1 백업/복원 경로 없음(admin/backup은 Axum 전용) | beta-checklist 항목 6 | 열림(B-5) |
Low / Info (p4 findings F-01..F-06 + 이전 잔여물)
| ID | 발견 | 심각도 | 상태 |
|---|---|---|---|
| L-1 | F-01: location_hint.file이 analysis.target과 교차 검사되지 않음 — 불활성 라벨, 다운스트림 신뢰 금지 | Low | 열림 |
| L-2 | F-02: dev 아이덴티티가 kind=="user" 게이트 목록에서 401(스코프 200 아님) — fail-closed 패리티 갭, 노출 없음 | Info | 열림 |
| L-3 | F-03: JWS typ 미강제(서명+클레임이 여전히 게이트) | Info | 열림(문서화됨) |
| L-4 | F-04: 멀티 인스턴스 공유 D1 소비 경합 패자가 500 표면화(dedup은 정확히 1 유지) | Info | 열림 — 호출자 재시도; D1-at-scale NOT_VERIFIED |
| L-5 | F-06: 키 로테이션은 하드 컷오버 — 진행 중 entitlement 사망(120초 TTL이 영향 경계) | Info | 열림(문서화됨) |
| L-6 | Axum be/에 PoP 엔드포인트 패리티 없음 — 로컬 Axum dev가 보안 플레인을 실행 불가; seller-ops 스펙은 CI e2e에서 스킵 | Info | 열림 |
| L-7 | NODE_OPTIONS/NODE_*가 분석/트레이스된 드라이버 자식 env로 전파(허용 목록 NODE_[A-Z_]+, analyzer/dynamic.mjs:33) — 의도적으로 드롭하는 파티션 워커와 다름 | Low | 열림 |
| L-8 | CI 액션 태그 고정(@v4, @stable), SHA 고정 아님; Dependabot 부재 | Low | 열림 — 워크플로에 인라인 노트 |
| L-9 | experiment-h H-1(Medium) / H-2(Low) | — | 수정 + 회귀 테스트됨(59/59) — 이력용 유지 |
| L-10 | usage/audit/retention 하우스키핑: retention_class/legal_hold 스키마만; audit/security/usage/inbox/outbox 행 절대 정리 안 됨 | Info | 열림 |
과거 (wave 이전, 여전히 사실)
node:vm/node:worker는 보안 경계 아님(trust-model §2.6).- BYOS 강제는 셀러가 제거 가능; DevPay는 셀러 내부 실행을 미터링 불가 (trust-model §2.1/2.2).
- 아날로그 홀 / 협력 릴레이 oracle 경계(trust-model §2.3/2.4).
- PoP 계약은 DevPay 고유, RFC 9449 아님(§2.5).
5. 다음 단계 진입 조건
BETA_READY에 도달하려면(beta-readiness-checklist.md §3 재진술):
- 실제 PG 테스트 모드 왕복(구매→웹훅→환불) 실행.
LICENSE_SECURITY_ENABLED=true+ PoP 스위트가 있는 스테이징 배포.- D1 백업 + 복원 훈련 실행.
- Wire 버전/계약 고정 결정 + 상호운용 재검증.
- 법률 승인(compliance 문서 §7/§8 항목).
- 운영 런북 + 알림 +
needs_review해결 SLA. - 한 명의 외부 셀러 파일럿 종단간.
베타 이후 PRODUCTION_READY로: live 결제 승인(charter §0은 명시적 사용자 승인 필요), 실제 outbox 소비자, 목표 볼륨에서 부하 테스트, 레이트 리밋 커버리지, 인시던트 이력.
6. 정직한 요약
이 SHA의 DevPay는 동작하는 영속 권한 코어를 가진 제품 후보입니다: 결제→라이선스 발급은 멱등하고 대사됨; PoP 라이선스 프로토콜은 구현되고, 디바이스 바운드이며, 리플레이 저항적이고, 로컬 실제 스택에서 독립적으로 레드팀됨; CLI는 하드 정직 게이트로 보호 파이프라인을 구동; 콘솔은 셀러에게 영속 진실을 표면화. 베타가 아닙니다: 실제 PG, 배포된 보안 플레인, 외부 사용자, 법률 검토에 대해 아무것도 실행되지 않았고 — 백업/복원과 계약 버전 관리 스토리도 부재입니다.