구현 현황 — 제품 계약 기능
읽기 안내
특정 커밋 시점의 구현 상태 기록입니다. 현재 브랜치의 실시간 완료 현황이 아닙니다.
문서의 기준 SHA와 검증 근거를 확인한 후 최신 CI 및 변경사항과 비교하세요.
상태 라벨:
EXISTING_AND_REUSABLE(코드가 존재하고 제품 표면으로 그대로 채택 가능) ·NEEDS_HARDENING(존재하지만 알려진 갭이 제품화를 차단) ·PARTIALLY_IMPLEMENTED(서브셋 존재) ·NOT_IMPLEMENTED·NOT_VERIFIED(존재하지만 현재 SHA에서 실행된 증거가 인용되지 않음).베이스:
cb0270be계보, HEADad360cf에서 검사됨.experiments/auto-protection에 대해 인용된 실행 증거는 자체IMPLEMENTATION-STATUS.md에서 온 것입니다(8ace0d4에서 2026-11-04 실행, 루프백만) — 이 태스크에서 재실행한 것이 아닌 코드 수준 감사 문서입니다. 아래 어느 것도 프로덕션 준비 클레임이 아닙니다.
상태 표 — 12개 핵심 기능
| # | 기능 | 상태 | 리포 내 증거 | 정직한 갭 |
|---|---|---|---|---|
| 1 | 보호 Spec | EXISTING_AND_REUSABLE (PoC 등급) | experiments/auto-protection/spec/ — 스키마 v1, 13개 불변식 폐쇄 레지스트리, 검증기, from-analysis/from-requirements 생성기; 18/18 단위 테스트 + 9/9 적대적 spec 레그 BLOCKED (auto-protection 상태 문서 기준) | 루프백 PoC; 승인 라이프사이클은 컨벤션(draft 플래그 + REQUIRES_APPROVAL 마커), 서명/영속 승인 없음; 제품 UI나 API 없음. |
| 2 | 보호 플랜 | EXISTING_AND_REUSABLE (PoC 등급) | experiments/auto-protection/planner/ — 결정론적 규칙 → AUTO/AGENT/MANUAL_REVIEW, spec_sha256 바인딩, capability 카탈로그; 18/18 테스트 | 플랜 JSON 미서명(해시로 탐지 가능, 자기 검증 아님 — 기록된 정직한 한계); 서비스로 노출되지 않음. |
| 3 | 보호 실행 — Track A | EXISTING_AND_REUSABLE (PoC 등급) | analyzer/ (61/61 테스트), partitioner/ (81/81), track-a/ (29/29 + e2e 93/93 PASS, 루프백) | 파티셔너 안전 서브셋이 좁음(SUPPORTED-SCOPE); 분석기는 단일 모듈; 런타임 격리는 node:vm+fork — 컨테이너 등급 아님; 멀티 테넌트 호스티드 경로 없음. |
| 4 | 보호 실행 — Track B | EXISTING_AND_REUSABLE (PoC 등급) | track-b/ — 가이드, run.mjs 하니스, scenario-adskip-item, e2e 25/25 PASS | 에이전트 대면 문서 + CLI만; 플랫폼 서비스 없음; 채택은 셀러 에이전트가 라이프사이클을 따르는 것에 의존. |
| 5 | 라이선스 발급 및 라이프사이클 | EXISTING_AND_REUSABLE | licenses 테이블(001_init.sql), 원자적 배치 내 체크아웃 발급, 셀러 CRUD(endpoints_impl.rs), verify(verify_impl.rs), FE 페이지 fe/pages/licenses/* | 레거시 디바이스 모델(activations_json, device_id)은 레코드 전용; 바이어 셀프 서비스(자기 라이선스 조회) NOT_IMPLEMENTED; 만료는 검사 시점, 스위퍼 없음. |
| 6 | Entitlement 프로토콜 (호스티드) | NEEDS_HARDENING | be-cloudflare/src/license_security.rs + license-crypto/ 크레이트 — activate/capability/execute/status, fail-closed 가드, D1 논스/capability/바인딩 저장소(014), 기능 게이트 LICENSE_SECURITY_ENABLED | 기본적으로 기능 게이트 OFF; 내장 premium_convert만 실행; aud/tenant_id/kid 클레임 없음(감사 p5-sdk-contract-audit.md); 사용량 기록은 최선 노력; Axum be/에 패리티 라우트 없음. |
| 7 | BYOS 강제 SDK | EXISTING_AND_REUSABLE (연동 노트 포함) | sdk/license/{server,web,nuxt} — sdk/license/README.md 기준 47/26/15 테스트; memory+sqlite 저장소 어댑터; Nuxt requireLicense; PoC 호환 테스트가 wire 계약 고정 | 기본 activatePath=/api/license/activate ≠ Worker /api/v1/licenses/activate(문서화된 블로커); iss 기본 devpay ≠ Worker devpay-lic; Worker 발급 entitlement는 SDK 기본값을 통과하지 못함 — 상호운용은 명시적 설정 필요, 계약 버전 결정 필요. |
| 8 | 영속 사용량 | PARTIALLY_IMPLEMENTED | license_usage + security_events 테이블이 호스티드 execute/guard에서 기록; 돈을 위한 transaction_ledger; ledger/verify 엔드포인트 | 사용량 기록은 post-execute 최선 노력(트랜잭션 아님); 런타임 미터링은 단일 프로세스 인메모리(SUPPORTED-SCOPE 항목 5); 셀러용 사용량 읽기 API 없음; 영속 outbox 소비자 없음(#9 참조). |
| 9 | 결제 동기화 | NEEDS_HARDENING | checkout_impl.rs 원자적 배치 + 멱등성; toss_impl.rs TEST 어댑터(pending → checkout/confirm → webhooks/toss reconcile → finalize_paid); payment_provider.rs TEST 키/live 키 게이트 | Toss는 TEST 키 전용, PAYMENT_LIVE_ENABLED=false; confirm_pending/needs_review 복구는 수동(스케줄된 reconcile 잡 미관찰); outbox deliver_event는 false를 반환하는 스텁 — 실제 소비자 없음(재시도 후 이벤트 dead-letter); Portone 분기는 503 PAYMENT_PROVIDER_UNAVAILABLE. |
| 10 | 환불 및 폐기 | EXISTING_AND_REUSABLE | refund_impl.rs — refund_attempts 라이프사이클(attempted/succeeded/failed/needs_review), 부분 상한, 전액 환불 라이선스/이행 보정, GET refund-attempts 뷰; orders.refunded_krw | needs_review 해결 경로는 수동; PG 환불 실패 보정은 라이선스 폐기를 호출자에게 남김(설계 주석); mock 프로바이더 환불은 본질적으로 회계 전용. |
| 11 | 독립 검증 및 증거 | EXISTING_AND_REUSABLE (하니스); NOT_VERIFIED (제품 표면) | evidence/ 파이프라인(record/validate/cross-track, 클레임 게이트), red-team/ 47레그 배터리(기록된 SHA에서 47/47 BLOCKED), fe/e2e/ Playwright 스펙, results/ 감사 문서 | 증거는 PoC 구성 요소를 커버하고 배포된 앱은 커버하지 않음; 이 SHA에서 p5 감사(블로커 발견) 외에 license-security Worker 엔드포인트를 SDK와 묶는 증거 없음; CI wasm-build 잡은 있으나 docs/agent/00-beta-rc-baseline.md 기준 D1 라우트 자동화 스위트 없음. |
| 12 | 셀러 콘솔 + 운영 | PARTIALLY_IMPLEMENTED | fe/pages/ — 대시보드, 상품, 주문, 라이선스, 구독, 정산, 설정, 프로젝트, 온보딩; fe/pages/admin/ + /api/v1/admin/*(users, sellers, verifications, audit, overview) | 콘솔은 레거시 스토어 모델 — 보호 spec/plan UI 없음, license-security 표면(activate/capability/execute/status) 없음, 사용량/보안 이벤트 뷰어 없음; 바이어 대면 계정/셀프 서비스 콘솔 NOT_IMPLEMENTED. |
교차 갭 (뭉개면 안 됨)
- 두 라이선스 플레인이 아직 하나의 제품이 아닙니다. 레거시
licenses플레인(체크아웃 발급,verify, 셀러 CRUD)과 license-security 플레인(PoP activate → entitlement → capability → execute)은licenses테이블을 상태/상품 앵커로 공유하지만, 서로 다른 디바이스 모델(activations_jsonvslicense_bindings), 서로 다른 인증(device_id 표시 vs jkt PoP)을 가지고, FE는 레거시만 사용합니다. be/(Axum) 패리티가 보안 플레인에 없습니다 — 모든 PoP 엔드포인트는 Worker 전용(be-cloudflare). 로컬 Axum dev는 이를 실행할 수 없습니다.- 상호운용 계약은 DevPay 고유 —
jkt이중 해시,htu의미, 페이로드jwk, 커스텀hbody 해시: 상호 PoC↔Worker 상호운용은 확인됨, RFC 9449 상호운용은 부재(p5 감사). 외부 SDK 소비자 전에 버전 계약 결정이 필요합니다. - 새 플레인을 위한 호스티드 배포가 없습니다 —
LICENSE_SECURITY_ENABLED가wrangler.toml에 단순히 부재(바인딩 없음, 주석 설정 없음); 현재 환경에서 엔드포인트는 404입니다. 모든 staging/prod 동작은NOT_VERIFIED. - 미터링/빌링 플레인 부재 — 무엇이 관찰 가능하고 아닌지는
pricing-metering-model.md§3 참조.
출처
experiments/auto-protection/IMPLEMENTATION-STATUS.md(실행된 PoC 증거, 8ace0d4) · UNIFIED-ARCHITECTURE.md §6 정직한 한계 · experiments/secure-browser-licensing/docs/p5-sdk-contract-audit.md + server-feature-flags.md · be-cloudflare/migrations/001–014 · be-cloudflare/src/{lib,license_security,checkout_impl,toss_impl, refund_impl,events_impl,settle_impl,payment_provider,verify_impl}.rs · sdk/license/README.md · docs/agent/00-beta-rc-baseline.md · docs/implementation-status.md(v4.0/v5.0 staging/prod 증거, 오래된 베이스라인).