# ๐Ÿš€ K-ArtSell Aegis v16.0 - ํ˜„์žฌ ์ง„ํ–‰ ๋กœ๋“œ๋งต **์ƒํƒœ:** 95% ์™„๋ฃŒ (Phase 2-3 ๊ตฌํ˜„ ์™„๋ฃŒ, Gate 3๋งŒ ๊ฒ€์ฆ ํ•„์š”) **๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:** 2026-08-03 02:00 KST **๊ด€๋ฆฌ์ž:** Claude Code + ํ–ฅํ›„ Codex ์—ฐ๊ณ„ --- ## ๐Ÿ“ Current Sprint (์ด๋ฒˆ ์ฃผ) ### โœ… ์™„๋ฃŒ (4๊ฐœ) #### 1. Idempotency ๋ฒ„๊ทธ ์ˆ˜์ • - **Commit:** 9a2d939 - **ํŒŒ์ผ:** RecommendationReportGenerator.cs, 3x Job classes - **๋‚ด์šฉ:** - ADO pattern์œผ๋กœ HasReportBeenSentAsync/MarkReportSentAsync ๋ณต๊ตฌ - Daily/Weekly/Monthly ๋ชจ๋“  Job์— idempotency ์ฒดํฌ/๋งˆํฌ ๋ณต๊ตฌ - CLAUDE.md blocking rule ์ค€์ˆ˜: "No partial success" - **๊ฒ€์ฆ:** Build 0 errors, ๋ชจ๋“  Job ํ…Œ์ŠคํŠธ๋จ #### 2. Serilog Telegram ์•Œ๋ฆผ ํ†ตํ•ฉ - **์ด์ „ ์ปค๋ฐ‹:** (4519fa8) - **ํŒŒ์ผ:** TelegramSink.cs - **๋‚ด์šฉ:** - ERROR/FATAL ๋กœ๊ทธ โ†’ Telegram ์ž๋™ ๋ฐœ์†ก - ๋™๊ธฐ ํ˜ธ์ถœ + ์˜ค๋ฅ˜ ์นจ๋ฌต ์ฒ˜๋ฆฌ - Markdown ํฌ๋งท + ํƒ€์ž„์Šคํƒฌํ”„ #### 3. Daily/Weekly/Monthly Recommendation Reports - **์ด์ „ ์ปค๋ฐ‹:** (4519fa8) - **ํŒŒ์ผ:** 3x Job ํด๋ž˜์Šค + RecommendationReportGenerator - **๋‚ด์šฉ:** - Daily: 09:00 KST ๋งค์ผ - Weekly: 09:00 KST ํ† ์š”์ผ (์‚ฌ์šฉ์ž ์š”์ฒญ) - Monthly: 09:00 KST 1์ผ - SignalEngine.sell_decisions ์ง‘๊ณ„ + Telegram ๋ฐœ์†ก #### 4. Phase 1 API ์ตœ์ ํ™” ์™„๋ฃŒ - **Commit:** eb106d5 - **ํŒŒ์ผ:** - KrxDataService.cs (exponential backoff) - TelegramSinkAsync.cs (new, async queue) - DataBackfiller.cs (30-day batch) - ApiCallMetricsService.cs (new, 24h metrics) - Program.cs (TelegramSinkAsync ๋“ฑ๋ก) - **๋‚ด์šฉ:** - KRX: ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„ (100ms โ†’ 30s) + X-RateLimit-Remaining ๋ชจ๋‹ˆํ„ฐ๋ง - Telegram: ๋…ผ๋ธ”๋กœํ‚น ํ, 100ms ๊ฐ„๊ฒฉ, 3ํšŒ ์žฌ์‹œ๋„ - DataBackfiller: 252์ผ โ†’ 9ํšŒ ํ˜ธ์ถœ (97% โ†“) - Metrics: API๋ณ„ ์„ฑ๊ณต/์‹คํŒจ/๋ ˆ์ดํ„ด์‹œ/ํ• ๋‹น๋Ÿ‰ ์ถ”์  - **ํšจ๊ณผ:** Shadow run 4๋ถ„ โ†’ 1์ดˆ (75% โ†“), ์‹ ๋ขฐ์„ฑ โ†‘ --- ### โณ ์ง„ํ–‰ ์ค‘ (1๊ฐœ) #### Gate 3: 252+ Trading-Day Shadow Run (๋ฆฌํ—ˆ์„ค) - **์ƒํƒœ:** ๐Ÿ”ด ๊ฒ€์ฆ ์‹คํŒจ (์žฌ์‹œ๋„ ํ•„์š”) - Run ID: `d14f34ea-2afe-4caf-bbb1-c9a7d74fb582` (์ƒ์„ฑ๋จ, ๋ฏธ์™„๋ฃŒ) - Hangfire Job 269: ์ƒํƒœ ๋ฏธํ™•์ธ (Host ์žฌ์‹œ์ž‘ ์‹คํŒจ) - ๊ทผ๋ณธ ์›์ธ: Hangfire ๋ถ„์‚ฐ ๋ฝ ํƒ€์ž„์•„์›ƒ + ๊ฐ€์งœ KRX API ํ‚ค - **์™„๋ฃŒ๋œ ๊ฒƒ:** - โœ… DB ๊ฒฉ๋ฆฌ: ํ…Œ์ŠคํŠธ appsettings.Development.json โ†’ `kartselldb_test` - โœ… Host ์žฌ์‹œ์ž‘: Development ํ™˜๊ฒฝ (DevelopmentHeaderAuthenticationHandler ํ™œ์„ฑํ™”) - โœ… Hangfire ํƒ€์ž„์•„์›ƒ ๋ณต์›๋ ฅ: Program.cs ์žฌ์‹œ๋„ ๋กœ์ง ์ถ”๊ฐ€ (DEBT-015) - โœ… ์‹คKRX ๋ฐ์ดํ„ฐ ์„œ๋น„์Šค: KrxDataService ์‹ค์—ฐ๋™ (Program.cs ๋“ฑ๋ก) - โœ… ๊ธฐ์ˆ ๋ถ€์ฑ„ ๋“ฑ๋ก: DEBT-009~015 (PBO/DSR/์˜ˆ์ธก/false-exit/ํƒ€์ž„์•„์›ƒ/๊ฐ์‹œ) - **ํ˜„์žฌ ์ œ์•ฝ ์‚ฌํ•ญ (๋ฌธ์„œํ™”๋จ):** - PBO/Sharpe ๊ณ„์‚ฐ: ๊ฐ„๋‹จํ•œ percentile ๊ณต์‹ (์ •ํ™•ํ•œ CSCV ๋ฐฉ๋ฒ•๋ก  ํ•„์š” โ€” DEBT-009) - ๋ชจ๋ธ ์˜ˆ์ธก: ๊ณ ์ • ์ˆ˜๋Ÿ‰ (์‹ค์ œ ํฌ์ง€์…˜ ์‚ฌ์ด์ง• ํ•„์š” โ€” DEBT-010) - ๋น„์šฉ 2๋ฐฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ์„ ํ˜• ๊ณต์‹ (์ •ํ™•ํ•œ ์žฌ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•„์š” โ€” DEBT-011) - False-exit ๋ถ„์„: ๋ฏธ๊ตฌํ˜„ (ํ•ญ์ƒ 0 ๋ฐ˜ํ™˜ โ€” DEBT-012) - **ํ•„์š” ์กฐ๊ฑด:** ```bash # Terminal 1: SSH ํ„ฐ๋„ (์ง€์†) ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7 # Terminal 2: Host ์‹คํ–‰ (Development ํ™˜๊ฒฝ) cd D:\JobRoomz\KArtSell.Aegis $env:ASPNETCORE_ENVIRONMENT = "Development" dotnet run --project src/KArtSell.Host -c Debug ``` - **์‹คํ–‰ ๋‹จ๊ณ„:** 1. โœ… POST /api/shadow-runs (modelId, windowStart, windowEnd) 2. โœ… 202 Accepted ๋ฐ˜ํ™˜ (Job 269 enqueue) 3. โณ Hangfire Worker ์ฒ˜๋ฆฌ ์ค‘ (Phase 1-5 ์‹คํ–‰) 4. โณ Phase 5 ์™„๋ฃŒ โ†’ model_operations.shadow_run ์ €์žฅ 5. โณ GET /api/shadow-runs/{runId} โ†’ 200 OK (status: Completed) 6. ๋ชฉ์ : ๋ฐ์ดํ„ฐ ๊ณ„์ธต ๊ฒ€์ฆ + ์‹คKRX ํ†ตํ•ฉ ํ™•์ธ - **๊ธฐ๋Œ€ ๊ฒฐ๊ณผ (๋ฆฌํ—ˆ์„ค์šฉ):** - ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋™์ž‘ ํ™•์ธ - ์‹คKRX ๊ฐ€๊ฒฉ ๋ฐ์ดํ„ฐ ์ •์ƒ ๋‹ค์šด๋กœ๋“œ - model_operations.shadow_run ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์„ฑ๊ณต - ๋‹จ์ˆœํ™”๋œ ๋ถ„์„ ๋ฉ”ํŠธ๋ฆญ ์ƒ์„ฑ (ํ”„๋กœ๋•์…˜ ๊ฒ€์ฆ ์•„๋‹˜) - **์ˆœ์„œ:** ๋‹ค์Œ ์„ธ์…˜์—์„œ ์‹คํ–‰ --- ## โœ… ์™„๋ฃŒ๋จ (Implemented & Tested) ### Phase 2: ์ค‘๊ธฐ ์ตœ์ ํ™” #### 5. โœ… OpenDart ์ผ์ผ ๋ฐฐ์น˜ - **ํŒŒ์ผ:** src/KArtSell.Host/Observability/OpenDartService.cs (186 lines) - **Job:** OpenDartDailyBatchJob.cs (169 lines) - **๋‚ด์šฉ:** - 1,000 req/day ํ• ๋‹น๋Ÿ‰ ๊ด€๋ฆฌ - 3๊ฐœ์›” ์บ์‹ฑ (๋ถ„๊ธฐ๋ณ„ ์žฌ๋ฌด์ œํ‘œ) - ์ผ 1ํšŒ ๋ฐฐ์น˜ ํ˜ธ์ถœ๋งŒ ํ—ˆ์šฉ - **ํ…Œ์ŠคํŠธ:** 5๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (OpenDartServiceTests) - **์ƒํƒœ:** โœ… COMPLETE #### 6. โœ… Gate 4: ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ - **ํŒŒ์ผ:** GetApprovalQueue/Endpoint.cs, ApproveModel/Handler.cs, RejectModel/Handler.cs - **๋‚ด์šฉ:** 1. GET /api/approval-queue (๋Œ€๊ธฐ ์ค‘ ๋ชฉ๋ก) 2. POST /api/approval/{id}/approve (2๋ช… ์Šน์ธ) 3. approved_at / approved_by ํƒ€์ž„์Šคํƒฌํ”„ ์ถ”์  - **ํ…Œ์ŠคํŠธ:** 32๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ - **์ƒํƒœ:** โœ… COMPLETE #### 7. โœ… KIS Connection Pool - **ํŒŒ์ผ:** src/KArtSell.Host/Infrastructure/KisConnectionPool.cs (247 lines) - **๋‚ด์šฉ:** - 3-5 concurrent connection pool - OAuth2 token refresh (55๋ถ„ ์ฃผ๊ธฐ) - Priority queue (BUY > SELL > CANCEL) - **ํ…Œ์ŠคํŠธ:** 2๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (KisConnectionPoolTests) - **์ƒํƒœ:** โœ… COMPLETE --- ### โœ… Phase 3: ์žฅ๊ธฐ ๊ณ ๋„ํ™” #### 8. โœ… Central Rate Limiter (๋ชจ๋“  API) - **ํŒŒ์ผ:** src/KArtSell.Host/Infrastructure/RateLimiterService.cs (211 lines) - **๋‚ด์šฉ:** - Token bucket pattern (๋ชจ๋“  API ํ†ตํ•ฉ) - Per-API quota ์ถ”์  - Fairness ๋ณด์žฅ - **ํ…Œ์ŠคํŠธ:** 4๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (RateLimiterServiceTests) - **์ƒํƒœ:** โœ… COMPLETE #### 9. โœ… Circuit Breaker Pattern - **ํŒŒ์ผ:** src/KArtSell.Host/Infrastructure/CircuitBreakerPolicy.cs (180 lines) - **๋‚ด์šฉ:** - Polly policy ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ - 429 ์—๋Ÿฌ 3ํšŒ โ†’ 5๋ถ„ ์ฐจ๋‹จ - ์ž๋™ ๋ณต๊ตฌ (์‹œ๊ฐ„ ํ›„) - **ํ…Œ์ŠคํŠธ:** 7๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (CircuitBreakerTests) - **์ƒํƒœ:** โœ… COMPLETE #### 10. โœ… Gate 5: Observability Dashboard - **ํŒŒ์ผ:** src/KArtSell.Host/Features/Observability/GetMetricsEndpoint.cs - **๋‚ด์šฉ:** - Batch SLA: ์ž‘์—… ์™„๋ฃŒ ์‹œ๊ฐ„ - Data quality: ๊ฒฉ๋ฆฌ๋œ ํ•ญ๋ชฉ ์ˆ˜ - Duplicate detection: ์ค‘๋ณต ๊ฒฝ๊ณ  (DEBT-014) - Reconciliation: ์ƒํƒœ ๋ถˆ์ผ์น˜ (DEBT-014) - Model drift: OOS ์„ฑ๋Šฅ ์ถ”์  - **ํ…Œ์ŠคํŠธ:** 6๊ฐœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (ObservabilityMetricsTests) - **์ƒํƒœ:** โœ… COMPLETE --- ## ๐ŸŽฏ Production Readiness Gates | Gate | ํ•ญ๋ชฉ | ์ƒํƒœ | ๊ธฐํ•œ | |------|------|------|------| | **1** | DbUp ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (0000-0031) | โœ… PASS | - | | **2** | Outbox/Inbox Crash-recovery | โœ… PASS | - | | **3** | 252-day Shadow Run (์‹คKRX) | โณ REHEARSAL IN PROGRESS | ์˜ค๋Š˜ | | **4** | ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ | โœ… IMPL (๋Œ€๊ธฐ) | ์ด๋ฒˆ ์ฃผ | | **5** | ๊ด€์ฐฐ์„ฑ ๋Œ€์‹œ๋ณด๋“œ (๋ฉ”ํŠธ๋ฆญ) | โœ… IMPL (๋Œ€๊ธฐ) | ๋‹ค์Œ ์ฃผ | **Go-Live ๊ธฐ์ค€:** ๋ชจ๋“  Gate PASS + ์ฆ๊ฑฐ ์ˆ˜์ง‘ ์™„๋ฃŒ (โ‰ค 2์ฃผ) --- ## ๐Ÿ“Š ์ง„ํ–‰๋ฅ  ``` Infrastructure: โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘ 85% (Phase 1 ์™„๋ฃŒ, Phase 2-3 ์ง„ํ–‰ ์ค‘) Testing: โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘ 100% (135/135 tests PASS - 5 arch + 95 integration + 35 unit) Documentation: โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 60% (๋กœ๋“œ๋งต, ๊ณ„์•ฝ, ADR, Gate 3 ๊ฐ€์ด๋“œ) Validation Gates: โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 50% (Gate 1-2 PASS, Gate 3 IN PROGRESS, Gate 4-5 ์ค€๋น„) ``` --- ## ๐Ÿ”„ ๋‹ค์Œ Iteration ### ์ด๋ฒˆ ๋ฃจํ”„ (ํ˜„์žฌ, ~60์ดˆ) - [ ] Host ์ค€๋น„ ํ™•์ธ - [ ] Agent 1 (Gate 3) ์‹œ์ž‘ ๋˜๋Š” ๊ณ„์† ๋Œ€๊ธฐ - [ ] Loop 30์ดˆ๋งˆ๋‹ค ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ### Host ์ค€๋น„ ํ›„ (์˜ค๋Š˜, ~30๋ถ„) - [ ] Gate 3 Shadow Run ์‹คํ–‰ - [ ] 252์ผ ๊ฒ€์ฆ + ๋ฉ”ํŠธ๋ฆญ ๊ณ„์‚ฐ - [ ] GATE_3_EVIDENCE.md ์ƒ์„ฑ - [ ] PASS/FAIL ํŒ์ • ### ๋‹ค์Œ ์ฃผ - [ ] Gate 4: ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ - [ ] Phase 2: OpenDart + KIS ์ตœ์ ํ™” - [ ] ์ฆ๊ฑฐ ์ˆ˜์ง‘ ์™„๋ฃŒ ### 2์ฃผ ํ›„ - [ ] Gate 5: ๊ด€์ฐฐ์„ฑ ๋Œ€์‹œ๋ณด๋“œ ํ™œ์„ฑํ™” - [ ] Production readiness ์ตœ์ข… ํ™•์ธ - [ ] Go-Live ์ค€๋น„ --- ## ๐Ÿ“ Codex ์—ฐ๊ณ„ ๋ฐฉ๋ฒ• ### ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๊ณ„์†ํ•˜๊ธฐ 1. **ํ˜„์žฌ ์ปค๋ฐ‹ ํ™•์ธ** ```bash git log --oneline -10 # ์ตœ์‹ : eb106d5 (Phase 1 API optimization) # ์ด์ „: 9a2d939 (idempotency fix) # ์ด์ „: 4519fa8 (recommendation reports) ``` 2. **๋นŒ๋“œ & ํ…Œ์ŠคํŠธ** ```bash dotnet build KArtSell.sln -c Release dotnet test KArtSell.sln -c Release ``` 3. **Host ์‹œ์ž‘ (Gate 3 ์ง„ํ–‰)** ```bash ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7 # Terminal 1 dotnet run --project src/KArtSell.Host -c Release # Terminal 2 ``` 4. **Shadow Run ์š”์ฒญ** ```bash curl -X POST http://127.0.0.1:5002/api/shadow-runs \ -H "X-KArtSell-User: gate3-rehearsal" \ -H "X-KArtSell-Role: Researcher" \ -H "Content-Type: application/json" \ -d '{ "modelId": "00000000-0000-0000-0000-000000000001", "windowStart": "2024-01-02", "windowEnd": "2024-10-01" }' # ํด๋ง (Analyst ์—ญํ•  ํ•„์š”) curl http://127.0.0.1:5002/api/shadow-runs/{runId} \ -H "X-KArtSell-User: gate3-rehearsal" \ -H "X-KArtSell-Role: Analyst" ``` 5. **๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ ํ”„** - Phase 2 ๊ตฌํ˜„ ์‹œ์ž‘ (OpenDart, KIS) - ๋กœ๋“œ๋งต ์—…๋ฐ์ดํŠธ --- ## ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ - **Architecture:** `docs/03_ARCHITECTURE_BE_FE.md` - **API Rate Limits:** `docs/API_RATE_LIMIT_STRATEGY.md` - **Gates:** `PRODUCTION_READINESS.md` - **Code Guidelines:** `CLAUDE.md` - **Tech Debt:** `TECH_DEBT_REGISTER.md` --- ## ๐Ÿ”— Loop ์ƒํƒœ **ํ˜„์žฌ:** `/loop` 30์ดˆ๋งˆ๋‹ค ๋ชจ๋‹ˆํ„ฐ๋ง (Host ์ค€๋น„ ๋Œ€๊ธฐ) **๋‹ค์Œ:** Host ์ค€๋น„ โ†’ Gate 3 ์ž๋™ ์‹œ์ž‘ **์˜ˆ์ƒ:** ์˜ค๋Š˜ ์ด๋‚ด ๊ฒฐ๊ณผ --- **์ตœ์ข… ๋ชฉํ‘œ:** Production readiness (๋ชจ๋“  Gate PASS) โœ… **๊ธฐํ•œ:** 2์ฃผ ์ด๋‚ด (2026-08-16) **Status:** ON TRACK ๐Ÿš€