# ADR-0018 — Phase 7 범위

상태: **Proposed (2026-05-08, 야간 자율 사이클 18)**

---

## 결정

Phase 7 = **외부 인프라 swap + 첫 매출 + 카탈로그 시드**. 자율 진행 가능 부분(코드 어댑터·단위 테스트·문서)은 사이클 단위로 진행, 외부 인프라(호스팅·결제 인증·실 카탈로그 자료·영업 활동)는 사용자/협업자 영역.

## 자율 진행 가능 영역 (사이클 18~)

### A. 라이선스 키 REST 어댑터 (Phase 7-A)

- [x] **사이클 18**: `RestKeyIssuanceBackend.cs` — UnityWebRequest 기반 IKeyIssuanceBackend 구현 (POST /issue · POST /revoke · GET /revoked · GET /customers/{id}/keys · GET /health)
- [ ] 단위 테스트 — Connect 없이 Issue 거부 / invalid baseUrl ArgumentException / JSON 직렬화 round-trip
- [ ] LicenseKeyManager 통합 — backend swap 가능성 검증 (Mock ↔ Rest 동일 인터페이스)

### B. ProPlusPricingCalculator sensitivity (Phase 7-B)

- [ ] 단가 변동 시나리오 (intensity 임계점 + seat scaling 곡선)
- [ ] 한국·일본·독일 시장별 톤 차이 (사용자 결정 후 시드)
- [ ] 단위 테스트 — 추천 모델 분기 경계값 검증

### C. 협업자 시연 시나리오 다국어화 (Phase 7-C)

- [ ] 일본어 시연 시나리오 (`wiki/topics/demo/0001-collaborator-demo-scenario-ja.md`)
- [ ] 독일어 시연 시나리오 (`wiki/topics/demo/0001-collaborator-demo-scenario-de.md`)

### D. 보안 강화 (Phase 7-D)

- [ ] server.py POST/DELETE rate limit (token bucket per IP)
- [ ] License key revocation list (CRL) 캐시 정책 (TTL)
- [ ] HMAC secret 환경변수 분리 (`FACTORY00_LICENSE_SECRET`)

## 자율 외 (사용자/외부 인프라)

- 실 백엔드 서버 호스팅 (LemonSqueezy / Paddle / 자체 REST API + 데이터베이스)
- 결제 게이트웨이 통합 (Stripe / Toss / Iamport — API 키 + 인증)
- 실 모터 / 기어 카탈로그 (산업 표준 외부 자료 + 컨설팅)
- 첫 유료 고객 + 매출
- WebGL 실 빌드 검증 (사용자 GUI 필요)
- 영업 활동 / BD 미팅 / 협업자 시연

## REST 엔드포인트 가설 (Phase 7-A)

| 메서드 | 경로 | 페이로드 | 응답 |
|---|---|---|---|
| POST | `/issue` | `IssueRequest` JSON | `IssueResponse` JSON |
| POST | `/revoke` | `RevokeRequest` JSON | `{"ok":bool,"error":string}` |
| GET | `/revoked?key={key}` | URL param | `{"revoked":bool}` |
| GET | `/customers/{id}/keys` | URL path | `{"items":[IssueResponse...]}` |
| GET | `/health` | — | `{"ok":true}` |

인증: `Authorization: Bearer {token}` 헤더 (사용자가 환경변수로 주입).

## 코드 swap 가이드 (Mock → Rest)

```csharp
// Phase 6 (Mock)
var backend = new MockKeyIssuanceBackend("dev-secret");
backend.Connect();

// Phase 7 (Rest swap — 인터페이스 동일)
var backend = new RestKeyIssuanceBackend(
    baseUrl: "https://api.factory00.example/v1",
    authHeader: "Bearer " + System.Environment.GetEnvironmentVariable("FACTORY00_API_TOKEN")
);
backend.Connect();

// LicenseKeyManager 코드는 그대로 (인터페이스 swap만)
var mgr = new LicenseKeyManager(backend, /* offlineVerifier */ null);
```

## 검증 기준

- [x] `RestKeyIssuanceBackend.cs` 컴파일 통과 (사이클 18)
- [ ] `Phase7-A` 단위 테스트 PASS (Connect 거부 / invalid URL / JSON round-trip)
- [ ] LicenseKeyManager integration 통합 테스트 (Mock 백엔드로 검증, Rest 백엔드는 placeholder URL로 컴파일만)

## Phase 8 입력

1. **첫 매출 후속 가격 재평가** — Pro Plus 단가 시장 데이터 기반 조정
2. **DOTS/ECS 마이그레이션** — 60fps 측정 결과 기반 결정
3. **추가 언어** — 중국어 / 스페인어 (시장 진입 결정 후)
4. **모터·기어 카탈로그** — 사용자 자료 + 산업 표준 임포트

## 참고

- ADR-0001~0017
- `wiki/journal/2026-05-08-night-summary.md` — 야간 자율 보고서 (사이클 1~17)
