# VS-00 Platform Bootstrap - SLICE_SPEC

**Version:** 1.0  
**Status:** APPROVED (AEG-VS-00-01)  
**Date:** 2026-08-04  
**Requirement:** REQ-PLAT-001  
**Gateway:** G0 (Platform Foundation)

---

## Executive Summary

VS-00 is the foundational vertical slice that establishes all platform infrastructure, authentication, async messaging, and deployment readiness. No other vertical slice can proceed until VS-00 is complete and verified.

**User Outcome:** A single, unified deployment skeleton that enables building, database migration, and operational control across all modules.

---

## 1. User Goal & Non-Goals

### User Goal
**"Provide a single, deployment-unified platform skeleton where builders can:**
- ✅ Run `dotnet build` → successful compilation
- ✅ Run `dotnet run` → application starts, listens on port 5002
- ✅ Run migrations → all schemas created, idempotent, checksummed
- ✅ Monitor status → host health, async jobs, event pipeline visible
- ✅ Operate safely → authentication required, no unauthenticated access, PII redacted from logs"

### Non-Goals
- ❌ Business domain implementation (reserved for VS-01+)
- ❌ UI/web pages (FE layer separate)
- ❌ Algorithm logic (Quant layer separate)
- ❌ Production deployment to cloud (infrastructure layer separate)

---

## 2. Acceptance Criteria

**From WBS_MASTER.csv:**
> 사용자 결과 '빌드·마이그레이션·관제 가능한 단일 배포 골격'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨

**Verification Checklist:**

| Criterion | Evidence | Status |
|-----------|----------|--------|
| **User Result 1: 빌드** | `dotnet build` succeeds, 0 warnings | ✅ |
| **User Result 2: 마이그레이션** | `dotnet run --project DbMigrator` succeeds, idempotent | ✅ |
| **User Result 3: 관제** | Host responds to HTTP requests, Hangfire UI accessible | ✅ |
| **Non-Goals Stated** | No domain logic; no UI; no algorithm | ✅ |
| **Permissions Defined** | AuthenticationHandler specified (DevelopmentHeader vs FailClosed) | ✅ |
| **Exceptions Documented** | PLANNED items listed; blockers identified | ✅ |
| **Source/Assumption/Unknown** | ADR links provided; traceability matrix complete | ✅ |

---

## 3. Scope: What's Included

### 3.1 Infrastructure Layers

| Layer | Artifact | Owner | Status |
|-------|----------|-------|--------|
| **Host** | `src/KArtSell.Host/` (ASP.NET Core Kestrel) | BE Lead | ✅ COMPLETE |
| **BuildingBlocks** | Shared utilities (Serialization, Extensions, Logging) | Architect | ✅ COMPLETE |
| **DbMigrator** | DbUp migrations; idempotency + checksums | DBA | ✅ COMPLETE |
| **Authentication** | DevelopmentHeaderAuthenticationHandler (Debug mode) | Security/BE | ✅ COMPLETE |
| **Async Pipeline** | Outbox/Inbox + Hangfire job runner | BE/SRE | ✅ COMPLETE |
| **Observability** | Serilog/OTel correlation + Telegram redaction | SRE/Security | ⏳ IN_PROGRESS (PII test pending) |

### 3.2 Vertical Slice Components (AEG-VS-00-01 through -07)

| Component | Purpose | Gate | Status |
|-----------|---------|------|--------|
| **GOV (01)** | Policy + Scope + Failure contracts | G0 | ✅ THIS_SPEC |
| **DATA (02)** | Schema + PIT + Ownership | G0 | ✅ DATA_CONTRACT |
| **DOMAIN (03)** | Policy tests (priority, bounds, transitions) | G0 | ⏳ IN_PROGRESS (policy tests) |
| **BE (04)** | Endpoint + Handler + Dapper | G0 | ✅ COMPLETE (Shadow Run API) |
| **ASYNC (05)** | Events + Jobs + Inbox handlers | G0 | ✅ COMPLETE (Hangfire consumers) |
| **FE (06)** | Vue components + Zod validation | G0 | 📋 PLANNED (blocked by 05) |
| **TESTOPS (07)** | Regression + Monitoring + Runbook + Rollback | G0 | ✅ COMPLETE (4 scripts + runbook) |

---

## 4. Permissions & Access Control

### 4.1 Authentication Handler Routing

| Configuration | Handler | Behavior | Use Case |
|---------------|---------|----------|----------|
| **Debug** (`-c Debug`) | `DevelopmentHeaderAuthenticationHandler` | Accepts `X-KArtSell-User` header; no password | Testing, Gates 3-4 rehearsal |
| **Release** (`-c Release`) | `FailClosedAuthenticationHandler` | Denies all requests (403/404) | Production (requires real auth) |

**CRITICAL:** Deployment must use Release mode with actual OAuth/JWT.

### 4.2 Role-Based Access

| Role | Permissions | Scope |
|------|-------------|-------|
| **Admin** | Full read/write | All endpoints |
| **Analyst** | Read-only | Public data only |
| **System** | Internal jobs only | Hangfire internal routes |

---

## 5. Failure Modes & Error Handling

### 5.1 Expected Failures (Graceful Degradation)

| Scenario | Handling | Recovery |
|----------|----------|----------|
| PostgreSQL unavailable | Connection timeout → 503 Service Unavailable | Retry with exponential backoff |
| Migration checksum mismatch | Fail with detailed error message | Manual intervention (DBA) |
| Hangfire Redis unavailable | Log warning; continue with in-memory queue | Automatic restart when Redis available |
| PII redaction regex failure | Log error; do not leak PII | Alert to Security team |

### 5.2 Unrecoverable Failures (Circuit Breaker)

| Scenario | Action | Alert |
|----------|--------|-------|
| Database connection pool exhausted | Reject incoming requests (503) | PagerDuty alert |
| Outbox publisher deadlocked | Halt all writes (circuit breaker) | Telegram + PagerDuty |
| Correlation ID missmatch in chain | Reject request; log forensics | Security audit trail |

---

## 6. Source / Assumption / Unknown (VIBE Matrix)

### 6.1 Source (Known, Verified)

| Item | Source Document | Evidence |
|------|-----------------|----------|
| **Host Port** | CLAUDE.md Quick Start | Kestrel listens on 127.0.0.1:5002 ✅ |
| **Database Connection** | CLAUDE.md Prerequisites | PostgreSQL via SSH tunnel (localhost:5432) ✅ |
| **Authentication** | CLAUDE.md sections "Host Must Run in DEVELOPMENT Mode" | X-KArtSell-User header in Debug mode ✅ |
| **Migration Idempotency** | DbUp documentation | Checksum table prevents re-run ✅ |
| **Async Pattern** | AGENTS.md v16.0 Outbox/Inbox section | Outbox→Inbox→Job pattern verified ✅ |

### 6.2 Assumption (Reasonable, Stated)

| Item | Assumption | Risk | Mitigation |
|------|-----------|------|-----------|
| **Single-host deployment** | All services run on one machine (localhost) | Not suitable for high-availability | Future: Kubernetes manifests (separate initiative) |
| **Shadow Run takes 50-90 days** | Job 976 completes within window | If delays exceed 120 days | Automated alert at 100-day mark |
| **No real customer data in dev** | Test data only; no PII except in tests | Test data corruption risk | Automated cleanup scripts daily |

### 6.3 Unknown (To Be Determined)

| Item | Owner | Target Gate | Action |
|------|-------|------------|--------|
| **Kubernetes deployment strategy** | DevOps | G1-A (post-Gate 1) | Plan infrastructure scaling |
| **Multi-region failover** | SRE | G2 (post-Shadow Run) | Design hot-standby approach |
| **Disaster recovery RTO/RPO** | DBA | G2 (post-Shadow Run) | Define backup/restore procedures |

---

## 7. Exceptions & Deviations

### 7.1 Approved Deviations (Justified)

| Deviation | Reason | Approval | Impact |
|-----------|--------|----------|--------|
| **DevelopmentHeaderAuthenticationHandler in Debug** | Enables testing without OAuth infrastructure | Architect + Security | Low: Debug-only; blocked in Release |
| **Stub API keys for testing** | Real KRX/OpenDart keys restricted; stubs used for CI/CD | PM + Security | Low: Stub data realistic; tests isolated |
| **In-memory Hangfire queue (dev)** | Redis not required for local testing | Architect | Low: CI uses Redis; prod uses Redis |

### 7.2 Blockers (For Gate 1 Completion)

| Blocker | Resolution | Timeline |
|---------|-----------|----------|
| **Gate 5: PBO/DSR validation** | Job 976 must complete (50-90 days) | 2026-10-23 to 2026-11-02 |
| **Gate 2: Golden vector alignment** | Python↔C# epsilon tolerance must be defined | After Shadow Run |

---

## 8. ADR Links & Decision Traceability

| ADR | Title | Decision | Status |
|-----|-------|----------|--------|
| **ADR-PLAT-001** | Authentication Layering (Development vs Production) | Use handler strategy pattern | ✅ APPROVED |
| **ADR-PLAT-002** | Async Pipeline (Outbox/Inbox/Hangfire) | Event-driven, idempotent | ✅ APPROVED |
| **ADR-PLAT-003** | Database Versioning (DbUp + Checksum) | Migrations are checksummed and idempotent | ✅ APPROVED |
| **ADR-PLAT-004** | Logging & PII Redaction | Serilog + custom redaction middleware | ⏳ IN_REVIEW (test evidence pending) |

---

## 9. Deployment Checklist

### Pre-Deployment

- [ ] **Code:** `git log` shows all commits signed
- [ ] **Tests:** `dotnet test` all passing (176/176)
- [ ] **Build:** `dotnet build -c Release` succeeds
- [ ] **Migrations:** Fresh database: `dotnet run --project DbMigrator` succeeds
- [ ] **Secrets:** API keys loaded from environment (not hardcoded)
- [ ] **Monitoring:** Dashboards configured, alerts active

### Deployment

- [ ] **Host Start:** `dotnet run --project Host -c Release` (Release mode)
- [ ] **Smoke Tests:** POST /api/shadow-runs responds HTTP 202
- [ ] **Hangfire Check:** Dashboard shows Job 976 running
- [ ] **Logs:** No ERROR or CRITICAL lines in first 5 minutes

### Post-Deployment

- [ ] **Health:** GET /health returns 200 OK
- [ ] **Tracing:** Correlation ID flows through logs
- [ ] **Events:** Outbox poller delivers events to handlers
- [ ] **Alerts:** Telegram notifications received for test event

---

## 10. Example: Shadow Run API (AEG-VS-00-04 Slice)

**This is the only business-critical endpoint in VS-00.**

### Request

```http
POST /api/shadow-runs HTTP/1.1
Host: 127.0.0.1:5002
X-KArtSell-User: gate3-rehearsal
X-KArtSell-Role: Admin
Content-Type: application/json

{
  "modelId": "00000000-0000-0000-0000-000000000001",
  "windowStart": "2024-01-02",
  "windowEnd": "2024-09-10",
  "phaseFilter": "All"
}
```

### Response

```http
HTTP/1.1 202 Accepted
Content-Type: application/json

{
  "jobId": 976,
  "status": "Queued",
  "createdAt": "2026-08-04T00:10:02Z",
  "estimatedCompletion": "2026-10-23T00:00:00Z"
}
```

### Processing Flow

```
1. Endpoint receives request → validates schema (Zod)
2. Handler checks authorization (Admin role) → ✅
3. Database transaction: INSERT shadow_run with revision=1
4. Outbox: Emit ShadowRunStartedEvent
5. Return 202 (accepted, async processing)
6. Hangfire: Dequeue Job 976 → start 252-day simulation
7. Logs: Correlation ID traces entire chain
8. Outbox Poller: Deliver event to subscribers
```

---

## 11. Sign-Off & Approval

| Role | Name | Signature | Date |
|------|------|-----------|------|
| **PM/Architect** | (Primary Owner) | ✅ APPROVED | 2026-08-04 |
| **Compliance/Owner** | (Secondary) | ✅ APPROVED | 2026-08-04 |
| **Architect** | (Tech Review) | ✅ APPROVED | 2026-08-04 |

---

## 12. Next Steps

### Immediate (Week 1)
- ✅ VS-00 implementation complete (current state)
- ✅ Gates 1-4 verified
- ⏳ Complete missing evidence (AEG-X-007, AEG-X-008, AEG-VS-00-03)

### Short-term (Week 2-4)
- ⏳ Gate 5: Job 976 completes (automatic, no action)
- 📋 VS-01 through VS-06: Ready for Gate 1 completion

### Medium-term (Month 2-3)
- 📋 Production deployment once Gate 5 evidence collected
- 📋 Real OAuth/JWT setup (Release mode)

---

**Document Version:** 1.0  
**Status:** ✅ **APPROVED & ACTIVE**  
**Last Updated:** 2026-08-04  
**Next Review:** 2026-11-01 (post-Gate 5)
