# ๐Ÿš€ K-ArtSell Aegis v16.0 - ํ˜„์žฌ ์ง„ํ–‰ ๋กœ๋“œ๋งต **์ตœ์ข… ๊ฐฑ์‹ :** 2026-08-08 (VS ๋ฒˆํ˜ธ ์žฌ๋ฐฐ์ • โ€” ์•„๋ž˜ "์•Œ๋ ค์ง„ ๋ฌธ์„œ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ" 1๋ฒˆ ์ฐธ์กฐ. 2026-08-07 ๊ฐฑ์‹  ๋‚ด์šฉ์€ ์‹ค์ œ ์ฝ”๋“œ/ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ํ™•์ธํ•œ ๊ฒฐ๊ณผ์˜€๊ณ  ์ด๋ฒˆ ๊ฐฑ์‹ ์€ ๊ทธ ์œ„์— ๋ฒˆํ˜ธ ์ถฉ๋Œ๋งŒ ์ •์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) **์ƒํƒœ ์š”์•ฝ:** VS-27(๊ฐ์‚ฌ ์ถ”์ ), VS-10(๋งค๋„ ๊ฒฐ์ •), VS-28(๊ฑฐ๋ž˜ ์‹คํ–‰), VS-29(ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ) ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ + ํ…Œ์ŠคํŠธ ์™„๋ฃŒ. VS-26(์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ, ๊ตฌ VS-03)์€ DEBT-017(์ค‘๋ณต ๊ตฌํ˜„) ์•„ํ‚คํ…ํŠธ ๊ฒฐ์ •์ด 2026-08-08์— ๋‚ด๋ ค์ง€๊ณ  ์‹คํ–‰๋˜์—ˆ์œผ๋‚˜(์ฃฝ์€ ๊ตฌํ˜„ ์‚ญ์ œ, ์œ ์ผ ๊ตฌํ˜„์— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹ ๊ทœ ์ž‘์„ฑ), ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹ค PostgreSQL๋กœ ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ•ด ์—ฌ์ „ํžˆ **BLOCKED**. Phase 1 Shadow Run(Gate 5a, 252+ ๊ฑฐ๋ž˜์ผ ๊ฒ€์ฆ)์€ **์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์Œ** (๊ณผ๊ฑฐ "RUNNING" ๊ธฐ๋ก์€ ํ—ˆ์œ„์˜€์Œ์ด ์ด๋ฏธ ๋ฌธ์„œ๋กœ ์ •์ •๋จ). ์ƒ์„ธ ํ•ญ๋ชฉ๋ณ„ ์ƒํƒœ๋Š” `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` ์ฐธ์กฐ. --- ## โš ๏ธ ์•Œ๋ ค์ง„ ๋ฌธ์„œ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ (DECISION_REQUIRED) 1. **VS ๋ฒˆํ˜ธ ์ฒด๊ณ„ ์ถฉ๋Œ โ€” 2026-08-08 ๋ถ€๋ถ„ ํ•ด๊ฒฐ:** `WBS_MASTER.csv`(์› ๊ณ„ํš)์™€ `WBS_PROGRESS_TRACKER.csv`(์‹คํ–‰ ํŠธ๋ž˜์ปค) ์‚ฌ์ด์˜ VS-03/VS-04/VS-12/VS-14 ์ถฉ๋Œ์€ ํŠธ๋ž˜์ปค ์ชฝ 4๊ฐœ ์Šฌ๋ผ์ด์Šค(์Šน์ธ์›Œํฌํ”Œ๋กœ์šฐ/๊ฐ์‚ฌ์ถ”์ /๊ฑฐ๋ž˜์‹คํ–‰/ํฌํŠธํด๋ฆฌ์˜ค๋Œ€์‚ฌ)๋ฅผ VS-26/27/28/29๋กœ ์žฌ๋ฒˆํ˜ธ ๋ถ€์—ฌํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ: `docs/DECISIONS/ADR-WBS-001-slice-renumbering.md`. - **2026-08-08 ํ›„์† ๊ฐฑ์‹  (TECH_DEBT_REGISTER.md DEBT-017 ํ•ด๊ฒฐ):** ์ฃฝ์€ ๊ตฌํ˜„(`src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/`, `[DontRegister]`)๊ณผ ๊ทธ ์ „์šฉ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ด์•„์žˆ๋Š” `Features/ApprovalWorkflow/`๊ฐ€ ์ด์ œ ์œ ์ผํ•œ ๊ตฌํ˜„์ด๋ฉฐ, ๋™์ผ ์‹œ๋‚˜๋ฆฌ์˜ค(์ƒ์„ฑ/์Šน์ธ/ํ™œ์„ฑํ™” ์—ญํ•  ๊ฒ€์ฆ, makerโ‰ checker ๋ถ„๋ฆฌ, ์ฆ๊ฑฐ ์ฒจ๋ถ€, `DateOnly` ๋ผ์šด๋“œํŠธ๋ฆฝ)๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Handler+Sql+์‹คDB ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌํŒ… ๊ณผ์ •์—์„œ ์‚ด์•„์žˆ๋Š” ๊ตฌํ˜„์˜ `Sql.cs`์—๋„ ์ฃฝ์€ ์ฝ”๋“œ์— ์žˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ Dapper `DateOnly` ๋ฐ”์ธ๋”ฉ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ **์ด ์„ธ์…˜์—์„œ๋„ ์‹ค PostgreSQL์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์–ด(127.0.0.1:5432 ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€, SSH ํ„ฐ๋„ ๋ฏธ๊ฐœํ†ต) ์ƒˆ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ 8๊ฑด์€ ํ•˜๋‚˜๋„ ์‹คํ–‰ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค** โ€” ์ˆœ์ˆ˜ Policy ํ…Œ์ŠคํŠธ 10๊ฑด๋งŒ ํ†ต๊ณผ ํ™•์ธ. ๊ทธ๋ž˜์„œ AEG-VS-26-01์€ ์—ฌ์ „ํžˆ `BLOCKED`์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ •๋ฆฌ ๊ณผ์ •์—์„œ ๋‘ ๊ฐ€์ง€ ์ž”์—ฌ ๊ฒฐํ•จ๋„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(์ด๋ฒˆ ์„ธ์…˜์ด ๋งŒ๋“  ๊ฒฐํ•จ ์•„๋‹˜, ๊ธฐ์กด๋ถ€ํ„ฐ ์žˆ์—ˆ์Œ): `GET /approvals/{id}` ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†์–ด ์Šน์ธ ํ›„ ์ฆ๊ฑฐ(evidence)๋ฅผ HTTP๋กœ ์กฐํšŒํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ณ , Draftโ†’Proposed ์ „ํ™˜์„ ํ˜ธ์ถœํ•˜๋Š” Handler/Endpoint๊ฐ€ ์–ด๋””์—๋„ ์—†์–ด ์‹ค์ œ๋กœ๋Š” ์Šน์ธ API๊ฐ€ ๋๊นŒ์ง€ ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค โ€” TECH_DEBT_REGISTER.md DEBT-025/DEBT-026์œผ๋กœ ์‹ ๊ทœ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. - **๋˜ ๋‹ค๋ฅธ ๋ฐœ๊ฒฌ โ€” ๋ฏธ์ถ”์  ์ž‘์—…:** `src/KArtSell.Host/Features/MarketData/VS03_*.cs`, `Features/Portfolio/VS04_*.cs`/`VS05_*.cs`/`VS08_*.cs`๋Š” ์‹ค์ œ ๊ตฌํ˜„๋˜๊ณ  ํ…Œ์ŠคํŠธ๋„ ์žˆ๋Š”(commits `2bc2b1e`, `32b49a4`, `14c5e4f`, `2eee44d`) **์„ธ ๋ฒˆ์งธ** VS-03/04/05/08 ์‚ฌ์šฉ๋ก€(Market Data Ingestion Dashboard, Portfolio Rebalance, Risk Metrics, Dashboard)์ธ๋ฐ, `WBS_PROGRESS_TRACKER.csv`์— ์ „ํ˜€ ๊ธฐ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ์…˜์—์„œ ์ด ์ž‘์—…์„ ๊ฒ€์ฆ(๋นŒ๋“œ/ํ…Œ์ŠคํŠธ ์žฌํ˜„, ํ”„๋ŸฐํŠธ์—”๋“œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ)ํ•˜๊ณ  ํŠธ๋ž˜์ปค์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2. **DbUp ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ…Œ์ŠคํŠธ DB ๊ถŒํ•œ ๋ฌธ์ œ:** `kartsell` DB ์‚ฌ์šฉ์ž๊ฐ€ `kartsell_migration_test` ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์†Œ์œ ์ž๊ฐ€ ์•„๋‹ˆ์–ด์„œ `DbUpMigrationTests`(12๊ฑด)๊ฐ€ ๋กœ์ปฌ์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ DBA ์กฐ์น˜(์†Œ์œ ๊ถŒ ๋ถ€์—ฌ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ํ•  SQL ์ดˆ์•ˆ: `scripts/dba/grant-migration-test-db-ownership.sql`. 3. **[ํ•ด๊ฒฐ๋จ 2026-08-08] frontend ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์žฌํ•ด์‹œ:** `dotnet build`๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค `pnpm build`๊ฐ€ ์žฌ์‹คํ–‰๋˜์–ด `wwwroot/assets/*` ํ•ด์‹œ ํŒŒ์ผ๋ช…์ด ๋ฐ”๋€Œ๊ณ  git์— ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ์ด ์Œ“์ด๋Š” ๊ตฌ์กฐ์  ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. **๊ทผ๋ณธ ์›์ธ:** `wwwroot/assets/*`, `wwwroot/index.html`์€ 100% Vite ์ƒ์„ฑ ์‚ฐ์ถœ๋ฌผ(์ˆ˜์ž‘์—… ํŒŒ์ผ ์—†์Œ)์ธ๋ฐ๋„ git์— ์ปค๋ฐ‹๋˜์–ด ์žˆ์—ˆ๊ณ , ์žฌ๋นŒ๋“œ๋งˆ๋‹ค ์ฝ˜ํ…์ธ  ํ•ด์‹œ๊ฐ€ ๋ฐ”๋€Œ์–ด stale ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋ˆ„์ ๋จ(์‹ค์ œ๋กœ 6๊ฐœ ์ปค๋ฐ‹ ํŒŒ์ผ ์ค‘ 4๊ฐœ๊ฐ€ ์ด๋ฏธ orphan ์ƒํƒœ์˜€์Œ์ด ํ™•์ธ๋จ). ์กฐ์‚ฌ ๊ฒฐ๊ณผ `.gitea/workflows/deploy.yml`(์‹ค์ œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ)์€ ์ด๋ฏธ ๋งค ๋ฐฐํฌ๋งˆ๋‹ค `wwwroot`๋ฅผ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ๋นŒ๋“œํ•˜๋ฏ€๋กœ ์ปค๋ฐ‹๋œ ์‚ฐ์ถœ๋ฌผ์ด ๋ฐฐํฌ์— ์ „ํ˜€ ์“ฐ์ด์ง€ ์•Š์•˜์Œ โ€” ์œ ์ผํ•˜๊ฒŒ ์˜์กดํ•˜๋˜ ๊ณณ์€ `.gitea/workflows/ci.yml`์˜ `publish`(Gitea Release zip ์ƒ์„ฑ) ์žก๋ฟ์ด์—ˆ์Œ. **์กฐ์น˜:** `wwwroot/assets/`, `wwwroot/index.html`์„ `.gitignore`์— ์ถ”๊ฐ€ํ•˜๊ณ  `git rm --cached`๋กœ ์ถ”์  ํ•ด์ œํ–ˆ์œผ๋ฉฐ, `ci.yml`์˜ `publish` ์žก์— `deploy.yml`๊ณผ ๋™์ผํ•œ ํŒจํ„ด(pnpm install โ†’ build โ†’ wwwroot ๋น„์šฐ๊ณ  ๋ณต์‚ฌ)์„ ์ถ”๊ฐ€ํ•ด release zip๋„ ์‹ ์„ ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ๊ฐ–๋„๋ก ํ•จ. MSBuild์˜ `BuildFrontend` ํƒ€๊ฒŸ(๋กœ์ปฌ `dotnet build` ์‹œ ํ•ญ์ƒ pnpm build ์žฌ์‹คํ–‰)์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ โ€” ์‚ฐ์ถœ๋ฌผ์ด ๋” ์ด์ƒ git ์ถ”์  ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์žฌ์‹คํ–‰ ์ž์ฒด๋Š” ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜. **๊ฒ€์ฆ:** `dotnet build KArtSell.sln -c Release`๋ฅผ ์—ฐ์† 2ํšŒ ์‹คํ–‰ํ•ด `git status`๊ฐ€ ๋‘ ๋ฒˆ ๋ชจ๋‘ ๋™์ผ(๋ฌด๊ด€ ๋ณ€๊ฒฝ ์—†์Œ)ํ•จ์„ ํ™•์ธํ–ˆ๊ณ , ์ˆ˜์ • ์ „ ์ฝ”๋“œ๋กœ ๋˜๋Œ๋ ค ๋™์ผํ•œ ๋ฌด๋ณ€๊ฒฝ ๋นŒ๋“œ๋ฅผ 1ํšŒ ์‹คํ–‰ํ•˜๋ฉด `wwwroot/index.html`์ด 13์ค„ diff๋กœ ์ˆ˜์ •๋˜๊ณ  ์‹ ๊ทœ ํ•ด์‹œ ํŒŒ์ผ 2๊ฐœ๊ฐ€ untracked๋กœ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ์žฌํ˜„ํ•ด ๋Œ€์กฐ ํ™•์ธํ•จ. - **๋ณ„๋„ ๋ฐœ๊ฒฌ(๋ฏธํ•ด๊ฒฐ, ๋ฒ”์œ„ ๋ฐ–):** `frontend/src/**/*.vue.js`, `frontend/src/features/*/api.js` ๋“ฑ TS ์†Œ์Šค ์˜†์— ๋‚˜๋ž€ํžˆ ์กด์žฌํ•˜๋Š” `.js` ํŒŒ์ผ(์•ฝ 130๊ฐœ)๊ณผ `frontend/tsconfig.tsbuildinfo`, `frontend/vite.config.js`๋„ ์ „๋ถ€ git์— ์ปค๋ฐ‹๋˜์–ด ์žˆ๊ณ , `pnpm build`(`vue-tsc -b`)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์žฌ์ƒ์„ฑ๋˜์–ด ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ถˆํ•„์š”ํ•œ diff๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทผ๋ณธ ์›์ธ์€ `frontend/tsconfig.json`์— `"noEmit": true`๊ฐ€ ์—†์–ด `vue-tsc -b`(ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ๋ชจ๋“œ, `outDir` ๋ฏธ์ง€์ •)๊ฐ€ ์†Œ์Šค ์˜†์— ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐฉ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(`pnpm typecheck`๊ฐ€ ์“ฐ๋Š” `vue-tsc --noEmit`์€ ๋ฌธ์ œ์—†์Œ). ์ด๋ฒˆ PR ๋ฒ”์œ„(`wwwroot/assets` ์žฌํ•ด์‹œ)์™€๋Š” ๋ณ„๊ฐœ์˜ ๊ตฌ์กฐ์  ๋ฌธ์ œ๋ผ ์ด๋ฒˆ์—๋Š” ์†๋Œ€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. **์ฐธ๊ณ :** ๋‹ค๋ฅธ ๋™์‹œ ์„ธ์…˜(AEG-X-002 ์ปค๋ฐ‹๋“ค)์ด ์ด `.js` ๋ฐฉ์ถœ ๋ฌธ์ œ๋ฅผ ๋ณ„๋„๋กœ ์ด๋ฏธ ๋‹ค๋ฃจ๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค โ€” ๋ณ‘ํ•ฉ/์ •๋ฆฌ ์‹œ ์ค‘๋ณต ์ž‘์—… ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์„ธ์š”. --- ## โœ… ์™„๋ฃŒ (Backend ๊ตฌํ˜„ + ํ…Œ์ŠคํŠธ, 2026-08-07 ๊ธฐ์ค€ ๊ฒ€์ฆ๋จ) ### VS-26 (๊ตฌ VS-03): ๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ (Maker-Checker Governance) โ€” ๐ŸŸก BLOCKED (DB ๋ฏธ๊ฒ€์ฆ) - **์œ„์น˜:** `Features/ApprovalWorkflow/` โ€” 2026-08-08๋ถ€๋กœ ์œ ์ผํ•œ ๊ตฌํ˜„ (์ค‘๋ณต ๊ตฌํ˜„ ์‚ญ์ œ ์™„๋ฃŒ, DEBT-017 ์ฐธ์กฐ) - **ํ…Œ์ŠคํŠธ:** ์ˆœ์ˆ˜ `Policy` ๋‹จ์œ„ ํ…Œ์ŠคํŠธ 10/10 PASS(DB ๋ถˆํ•„์š”). Handler+Sql+์‹คDB ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ 8๊ฑด ์‹ ๊ทœ ์ž‘์„ฑํ–ˆ์œผ๋‚˜ **์ด ์„ธ์…˜์—์„œ ์‹ค PostgreSQL์— ์—ฐ๊ฒฐํ•˜์ง€ ๋ชปํ•ด(127.0.0.1:5432 connection refused) ๋‹จ ํ•˜๋‚˜๋„ ์‹คํ–‰ ๊ฒ€์ฆ๋˜์ง€ ์•Š์Œ.** `dotnet build -c Release`๋Š” 0 ๊ฒฝ๊ณ /0 ์˜ค๋ฅ˜๋กœ ์„ฑ๊ณต. - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ. ์‹คDB ๋Œ€์ƒ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „๊นŒ์ง€ COMPLETED๋กœ ์ „ํ™˜ ๊ธˆ์ง€. - **์ด๋ฒˆ ์„ธ์…˜(2026-08-08)์—์„œ ๋ฐœ๊ฒฌ/์ˆ˜์ •ํ•œ ๊ฒฐํ•จ:** ์‚ด์•„์žˆ๋Š” `Features/ApprovalWorkflow/Sql.cs`์˜ `InsertProposalAsync`์— ์ฃฝ์€ `ApprovalSql`์ด ๊ฐ–๊ณ  ์žˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ Dapper `DateOnly` ๋ฐ”์ธ๋”ฉ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์Œ(์ˆ˜์ • ์™„๋ฃŒ, DB๋กœ ๋ฏธ๊ฒ€์ฆ). ์ž”์—ฌ ๊ฒฐํ•จ(์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  README์—๋งŒ ๊ธฐ๋ก): `GET /approvals/{id}` ์—”๋“œํฌ์ธํŠธ ์—†์Œ(์ฆ๊ฑฐ ์กฐํšŒ ๋ถˆ๊ฐ€), Draftโ†’Proposed ์ „ํ™˜์ด ์–ด๋””์—๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Œ(์Šน์ธ API๊ฐ€ ์‹ค์‚ฌ์šฉ ์‹œ ๋๊นŒ์ง€ ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ). ### VS-27 (๊ตฌ VS-04): ๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  (Audit Trail / GDPR) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/Compliance/` - **ํ…Œ์ŠคํŠธ:** 5/5 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ - **์ด๋ฒˆ ์„ธ์…˜์—์„œ ๋ฐœ๊ฒฌ/์ˆ˜์ •ํ•œ ๊ฒฐํ•จ:** `ip_address`/`kis_response`๋ฅ˜ ์ปฌ๋Ÿผ์˜ Dapper ํƒ€์ž… ์บ์ŠคํŒ… ์‹คํŒจ, `GdprRetention.RetentionEndsAt`์ด `DATE` ์ปฌ๋Ÿผ์ธ๋ฐ `DateTime`์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋˜ ๋ฌธ์ œ, ๊ทธ๋ฆฌ๊ณ  `KArtSell.BuildingBlocks`์˜ `[ModuleInitializer]`๊ฐ€ ์šฐ์—ฐํžˆ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  snake_case ์ปฌ๋Ÿผ์ด null๋กœ ๋งคํ•‘๋˜๋˜ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ### VS-10: ๋งค๋„ ๊ฒฐ์ • ์—”์ง„ (Sell Decision Engine) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/SellDecision/`, `frontend/src/features/sell-decision/` - **ํ…Œ์ŠคํŠธ:** 32/32 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **์™„๋ฃŒ๋„:** Backend + Frontend ๋ชจ๋‘ ์กด์žฌ (VS-26/27/28/29 ์ค‘ ์œ ์ผ) - **โš ๏ธ ๋ฏธ๊ฒ€์ฆ ์‚ฌํ•ญ:** ์ฝ”๋“œ/ํ…Œ์ŠคํŠธ ์™„๋ฃŒ โ‰  PBO/DSR ํ”„๋กœ๋•์…˜ ๊ฒ€์ฆ ์™„๋ฃŒ. ์‹ค ์‹œ์žฅ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์€ Phase 1 Shadow Run ์™„๋ฃŒ ํ›„์—๋งŒ ๊ฐ€๋Šฅ ### VS-28 (๊ตฌ VS-12): ๊ฑฐ๋ž˜ ์‹คํ–‰ ์‹œ์Šคํ…œ (Trade Execution, KIS ์—ฐ๋™) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/TradeExecution/` - **ํ…Œ์ŠคํŠธ:** 13/13 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ - **์ด๋ฒˆ ์„ธ์…˜์—์„œ ๋ฐœ๊ฒฌ/์ˆ˜์ •ํ•œ ๊ฒฐํ•จ (์‹ฌ๊ฐ):** `UpdateTradeStatusAsync`๊ฐ€ `status`/`kis_response`/`error_message`๋งŒ ์ €์žฅํ•˜๊ณ  `kis_order_id`, `executed_quantity`, `unit_price`, `commission`, `net_proceeds`, ์ฒด๊ฒฐ/์ •์‚ฐ ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๋ณ‘ํ•ฉ ์ดํ›„ ๋งค๋ฒˆ ์กฐ์šฉํžˆ ์œ ์‹ค์‹œํ‚ค๋˜ ๋ฒ„๊ทธ. ๊ฑฐ๋ž˜ ์ฒด๊ฒฐยท์ •์‚ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ๋Š” ์ €์žฅ๋˜๊ณ  ์žˆ์ง€ ์•Š์•˜์Œ ### VS-29 (๊ตฌ VS-14): ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ (Portfolio Reconciliation) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/PortfolioReconciliation/` - **ํ…Œ์ŠคํŠธ:** 18/18 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ - **์ฐธ๊ณ :** ์ด ์Šฌ๋ผ์ด์Šค๊ฐ€ ํฌํ•จ๋œ PR(#28)์ด ๋ณ‘ํ•ฉ ๋‹น์ผ `model_operations.models` ํ…Œ์ด๋ธ” ๋ˆ„๋ฝ์œผ๋กœ ์‹ ๊ทœ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ „๋ถ€ ๊นจ๋œจ๋ฆฌ๋Š” ์ฑ„๋กœ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ณ , ๊ฐ™์€ ๋‚  ๋ณ„๋„ PR(#29)๋กœ ๊ธด๊ธ‰ ์ˆ˜์ •๋จ โ€” ๋ณ‘ํ•ฉ ์ „ fresh-install ๋ฆฌํ—ˆ์„ค์ด ์‹ค์ œ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์Œ์„ ์‹œ์‚ฌ ### AEG-X-009: ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ํ†ตํ•ฉ (KRX/OpenDart/KIS) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/Infrastructure/`, market_data ์Šคํ‚ค๋งˆ - **์™„๋ฃŒ:** ์†Œ์Šค ์นดํƒˆ๋กœ๊ทธ/๊ฑฐ๋ฒ„๋„Œ์Šค ์ •์ฑ…(Workstream D/E/F) + ์‹ค API ์—ฐ๋™(Workstream G: KRX OpenAPI/OpenDart/KIS ์„œ๋น„์Šค, ์ผ์ผ ์Šค์ผ€์ค„๋ง, ์—๋Ÿฌ ๋ถ„๋ฅ˜, LKG ํด๋ฐฑ) ### ๊ทธ ์™ธ ์™„๋ฃŒ ํ•ญ๋ชฉ (VS-00 ํ”Œ๋žซํผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ, VS-01/VS-02 ์Šฌ๋ผ์ด์Šค ์ŠคํŽ™, ๋ณด์•ˆ/Outbox/OpenAPI ๊ฒŒ์ดํŠธ ๋“ฑ) ์ƒ์„ธ๋Š” `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv`์˜ AEG-X-001~008, AEG-VS-00-01~07, AEG-VS-01-01, AEG-VS-02-01 ํ–‰ ์ฐธ์กฐ. --- ## ๐Ÿ”ด ์‹ค์ œ๋กœ ๋ธ”๋กœํ‚น ์ค‘์ธ ๊ฒƒ (Phase 1 Shadow Run) ### PHASE-1-SHADOW-RUN: 252+ ๊ฑฐ๋ž˜์ผ ๊ฒ€์ฆ (Gate 5a) - **์ƒํƒœ:** `BLOCKED` โ€” **์‹คํ–‰ ์ค‘์ด ์•„๋‹˜** - **๊ทผ๊ฑฐ:** `docs/CURRENT/PHASE-1_SHADOW_RUN_STATUS_CORRECTION.md`์— ์ด๋ฏธ ์ •์ •๋˜์–ด ์žˆ์Œ โ€” ๊ณผ๊ฑฐ ์„ธ์…˜๋“ค์˜ "Job 893/976 RUNNING, ~20+์‹œ๊ฐ„ ๊ฒฝ๊ณผ" ๋“ฑ์˜ ๊ธฐ๋ก์€ ์‹ค์ œ๋กœ๋Š” `POST /api/shadow-runs`๊ฐ€ `PostgresException 23514`(check_status ์ œ์•ฝ์กฐ๊ฑด ์œ„๋ฐ˜)๋กœ 500 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์‹คํŒจํ•œ ๊ฒƒ์ด์—ˆ๊ณ , Job์ด ์‹ค์ œ๋กœ ์‹œ์ž‘๋œ ์ ์ด ์—†์Œ - **์ฐจ๋‹จ ์‚ฌ์œ :** ์„œ๋ฒ„ ์ธก `dataset_manifest`, `model_version_registry`, `evidence_snapshot`, `release_evidence_bundle`์— ์Šน์ธ/๋™๊ฒฐ๋œ ํ–‰์ด ์—†์–ด RunId/JobId๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ. ์Šน์ธ๋œ VersionSet ๋Œ€๊ธฐ ์ค‘ - **์žฌ๊ฐœ ์ ˆ์ฐจ:** `PHASE-1_SHADOW_RUN_STATUS_CORRECTION.md`์˜ 5๋‹จ๊ณ„ ์ฐธ์กฐ (โ‘  check_status ์ œ์•ฝ์กฐ๊ฑด ์ •ํ•ฉ โ‘ก ์Šน์ธ๋œ ํ…Œ์ŠคํŠธ DB์—์„œ fresh/upgrade/์žฌ์‹คํ–‰/์‹คํŒจ๋ณต๊ตฌ ๋ฆฌํ—ˆ์„ค โ‘ข ์ฆ๊ฑฐ ๋ณด์กด โ‘ฃ ๋ช…์‹œ์  ์Šน์ธ ํš๋“ โ‘ค ์‹ ๊ทœ Run ID/Job ID๋กœ ์žฌํ์ž‰) - **์ด ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ ค๋ฉด:** ์‹ค์ œ RunId/JobId๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฌธ์„œ์— "RUNNING"์ด๋ผ๊ณ  ๋‹ค์‹œ ์ ์œผ๋ ค๋ฉด ๊ทธ ๊ทผ๊ฑฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•จ (๊ณผ๊ฑฐ์˜ ํ—ˆ์œ„ ๊ธฐ๋ก์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋ง ๊ฒƒ) ์ด ๊ฒŒ์ดํŠธ๋Š” **๋‹ฌ๋ ฅ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์ž‘์—…**์ž…๋‹ˆ๋‹ค (252+ ๊ฑฐ๋ž˜์ผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์ปดํ“จํŒ…์œผ๋กœ ์•ž๋‹น๊ธธ ์ˆ˜ ์—†์Œ). "์ตœ์  ์ „๋žต์ ์œผ๋กœ ๋นจ๋ฆฌ ๋๋‚ด๊ธฐ"์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์—†๊ณ , ๋‚จ์€ ์œ ์ผํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅ ์กฐ์น˜๋Š” ์œ„ ์žฌ๊ฐœ ์ ˆ์ฐจ๋ฅผ ๋ฐŸ์•„ ์‹ค์ œ๋กœ ํ์ž‰ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. --- ## ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ - **WBS ํŠธ๋ž˜์ปค (ํ•ญ๋ชฉ๋ณ„ ์ƒ์„ธ ์ƒํƒœ):** `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` - **WBS ์› ๊ณ„ํš (๋ฒˆํ˜ธ ์ถฉ๋Œ ์žˆ์Œ, ์ฃผ์˜):** `docs/CURRENT/CATALOGS/WBS_MASTER.csv` - **Phase 1 ์ƒํƒœ ์ •์ • ๊ธฐ๋ก:** `docs/CURRENT/PHASE-1_SHADOW_RUN_STATUS_CORRECTION.md` - **Architecture:** `docs/03_ARCHITECTURE_BE_FE.md` - **Code Guidelines:** `CLAUDE.md` - **Tech Debt:** `TECH_DEBT_REGISTER.md` --- ## ๐Ÿ“ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ๊ฐฑ์‹ ํ•  ๋•Œ 1. **git log๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”.** ์ด ๋ฌธ์„œ์™€ `main`์ด ์–ผ๋งˆ๋‚˜ ๋ฒŒ์–ด์กŒ๋Š”์ง€ (`git log --oneline <์ด-๋ฌธ์„œ-๋งˆ์ง€๋ง‰-์ปค๋ฐ‹>..main`) ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์„œ๋งŒ ์ฝ๊ณ  "ํ˜„์žฌ ์ƒํƒœ"๋ฅผ ํŒ๋‹จํ•˜์ง€ ๋งˆ์„ธ์š”. 2. **ํ…Œ์ŠคํŠธ๋Š” ๊ฒฉ๋ฆฌ ์‹คํ–‰์œผ๋กœ ํ™•์ธํ•˜์„ธ์š”.** ์ „์ฒด ์Šค์œ„ํŠธ ์‹คํ–‰์—์„œ ํ†ต๊ณผํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ์ด ์•ˆ์ •์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค (์ด๋ฒˆ ์„ธ์…˜์—์„œ `AuditSql`์ด ์ •ํ™•ํžˆ ์ด ์ด์œ ๋กœ ๋†“์น  ๋ป”ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” `--filter`๋กœ ๋‹จ์ผ ํด๋ž˜์Šค๋งŒ ๋Œ๋ ค์„œ ์žฌํ™•์ธํ•˜์„ธ์š”). 3. **"์™„๋ฃŒ"๋ผ๊ณ  ์“ฐ๊ธฐ ์ „์— ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜์„ธ์š”.** ์ด ์ €์žฅ์†Œ์—๋Š” ๊ฒ€์ฆ ์—†์ด "COMPLETE"/"100%"๋ผ๊ณ  ์„ ์–ธํ•œ ๋ฌธ์„œ๊ฐ€ ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค (`EXECUTION_COMPLETE_FINAL.md`, `WORK_COMPLETION_CERTIFICATE.md` ๋“ฑ). ๊ทธ ํŒจํ„ด์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์„ธ์š”. 4. **Phase 1 Shadow Run์€ ๋‹ฌ๋ ฅ ์‹œ๊ฐ„ ๊ฒŒ์ดํŠธ์ž…๋‹ˆ๋‹ค.** ์‹ค์ œ๋กœ ํ์ž‰๋˜์–ด ์ง„ํ–‰ ์ค‘์ด๋ผ๋Š” ๊ตฌ์ฒด์  ์ฆ๊ฑฐ(RunId/JobId) ์—†์ด "์ง„ํ–‰ ์ค‘"์ด๋ผ๊ณ  ์“ฐ์ง€ ๋งˆ์„ธ์š”.