diff --git a/CURRENT_ROADMAP.md b/CURRENT_ROADMAP.md index ebd19a54..e013fd02 100644 --- a/CURRENT_ROADMAP.md +++ b/CURRENT_ROADMAP.md @@ -1,28 +1,30 @@ # ๐Ÿš€ K-ArtSell Aegis v16.0 - ํ˜„์žฌ ์ง„ํ–‰ ๋กœ๋“œ๋งต -**์ตœ์ข… ๊ฐฑ์‹ :** 2026-08-07 (์ด ๋ฌธ์„œ์˜ ์ด์ „ ๋ฒ„์ „์€ 2026-08-03 ์ƒํƒœ๋กœ ์ •์ฒด๋˜์–ด ์žˆ์—ˆ๊ณ , ๊ทธ ์‚ฌ์ด ๋ณ‘ํ•ฉ๋œ 115๊ฐœ ์ปค๋ฐ‹์„ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐฑ์‹ ์€ ์‹ค์ œ ์ฝ”๋“œ/ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ํ™•์ธํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.) +**์ตœ์ข… ๊ฐฑ์‹ :** 2026-08-08 (VS ๋ฒˆํ˜ธ ์žฌ๋ฐฐ์ • โ€” ์•„๋ž˜ "์•Œ๋ ค์ง„ ๋ฌธ์„œ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ" 1๋ฒˆ ์ฐธ์กฐ. 2026-08-07 ๊ฐฑ์‹  ๋‚ด์šฉ์€ ์‹ค์ œ ์ฝ”๋“œ/ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ํ™•์ธํ•œ ๊ฒฐ๊ณผ์˜€๊ณ  ์ด๋ฒˆ ๊ฐฑ์‹ ์€ ๊ทธ ์œ„์— ๋ฒˆํ˜ธ ์ถฉ๋Œ๋งŒ ์ •์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) -**์ƒํƒœ ์š”์•ฝ:** VS-03(์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ), VS-04(๊ฐ์‚ฌ ์ถ”์ ), VS-10(๋งค๋„ ๊ฒฐ์ •), VS-12(๊ฑฐ๋ž˜ ์‹คํ–‰), VS-14(ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ) ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ + ํ…Œ์ŠคํŠธ ์™„๋ฃŒ. Phase 1 Shadow Run(Gate 5a, 252+ ๊ฑฐ๋ž˜์ผ ๊ฒ€์ฆ)์€ **์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์Œ** (๊ณผ๊ฑฐ "RUNNING" ๊ธฐ๋ก์€ ํ—ˆ์œ„์˜€์Œ์ด ์ด๋ฏธ ๋ฌธ์„œ๋กœ ์ •์ •๋จ). ์ƒ์„ธ ํ•ญ๋ชฉ๋ณ„ ์ƒํƒœ๋Š” `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` ์ฐธ์กฐ. +**์ƒํƒœ ์š”์•ฝ:** VS-27(๊ฐ์‚ฌ ์ถ”์ ), VS-10(๋งค๋„ ๊ฒฐ์ •), VS-28(๊ฑฐ๋ž˜ ์‹คํ–‰), VS-29(ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ) ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ + ํ…Œ์ŠคํŠธ ์™„๋ฃŒ. VS-26(์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ, ๊ตฌ VS-03)์€ DEBT-017(์ค‘๋ณต ๊ตฌํ˜„) ๋ฏธํ•ด๊ฒฐ๋กœ **BLOCKED**. Phase 1 Shadow Run(Gate 5a, 252+ ๊ฑฐ๋ž˜์ผ ๊ฒ€์ฆ)์€ **์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์Œ** (๊ณผ๊ฑฐ "RUNNING" ๊ธฐ๋ก์€ ํ—ˆ์œ„์˜€์Œ์ด ์ด๋ฏธ ๋ฌธ์„œ๋กœ ์ •์ •๋จ). ์ƒ์„ธ ํ•ญ๋ชฉ๋ณ„ ์ƒํƒœ๋Š” `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` ์ฐธ์กฐ. --- ## โš ๏ธ ์•Œ๋ ค์ง„ ๋ฌธ์„œ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ (DECISION_REQUIRED) -1. **VS ๋ฒˆํ˜ธ ์ฒด๊ณ„ ์ถฉ๋Œ:** `docs/CURRENT/CATALOGS/WBS_MASTER.csv`(์› ๊ณ„ํš)์™€ ์‹ค์ œ ๊ตฌํ˜„/`WBS_PROGRESS_TRACKER.csv`(์‹คํ–‰ ํŠธ๋ž˜์ปค) ์‚ฌ์ด์— VS-03/VS-04/VS-12/VS-14 ๋ฒˆํ˜ธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ถฉ๋Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„ธ์…˜์—์„œ ๋ฐœ๊ฒฌํ–ˆ๊ณ , ์‚ฌ์šฉ์ž ๊ฒฐ์ •์— ๋”ฐ๋ผ **๊ธฐ์กด ํŠธ๋ž˜์ปค ๋ฒˆํ˜ธ๋ฅผ ์œ ์ง€**ํ•˜๊ณ  ์ถฉ๋Œ ์‚ฌ์‹ค๋งŒ ๊ฐ ํ–‰์— ๋ช…์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ณธ ํ•ด๊ฒฐ(์žฌ๋ฒˆํ˜ธ ๋ถ€์—ฌ ๋˜๋Š” WBS_MASTER ๊ณต์‹ ๋Œ€์ฒด)์€ ์•„์ง ๋ฏธ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. -2. **DbUp ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ…Œ์ŠคํŠธ DB ๊ถŒํ•œ ๋ฌธ์ œ:** `kartsell` DB ์‚ฌ์šฉ์ž๊ฐ€ `kartsell_migration_test` ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์†Œ์œ ์ž๊ฐ€ ์•„๋‹ˆ์–ด์„œ `DbUpMigrationTests`(12๊ฑด)๊ฐ€ ๋กœ์ปฌ์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ DBA ์กฐ์น˜(์†Œ์œ ๊ถŒ ๋ถ€์—ฌ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. +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`. + - **์ด ๊ณผ์ •์—์„œ ์ƒˆ๋กœ ๋ฐœ๊ฒฌํ•œ, ์•„์ง ๋ฏธํ•ด๊ฒฐ์ธ ๋ฌธ์ œ (TECH_DEBT_REGISTER.md DEBT-017):** VS-26(๊ตฌ VS-03) ์Šน์ธ์›Œํฌํ”Œ๋กœ์šฐ๋Š” **๋™์ผ ๊ธฐ๋Šฅ์˜ ์ค‘๋ณต ๊ตฌํ˜„์ด ๋‘ ๋ฒŒ** ์กด์žฌํ•ฉ๋‹ˆ๋‹ค โ€” `src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/`(20/20 ํ…Œ์ŠคํŠธ ํ†ต๊ณผํ•˜์ง€๋งŒ ์ „ ์—”๋“œํฌ์ธํŠธ๊ฐ€ `[DontRegister]`๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์‹ค์ œ๋กœ๋Š” ํ˜ธ์ถœ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฃฝ์€ ์ฝ”๋“œ)์™€ `Features/ApprovalWorkflow/`(`Program.cs`์— ์‹ค์ œ ๋“ฑ๋ก๋˜์–ด ์‚ด์•„์žˆ์ง€๋งŒ ์ „์šฉ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Œ). ์ฆ‰ **ํ…Œ์ŠคํŠธ๋œ ์ฝ”๋“œ๋Š” ์ฃฝ์–ด์žˆ๊ณ , ์‚ด์•„์žˆ๋Š” ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.** ์•„ํ‚คํ…ํŠธ ๊ฒฐ์ •(๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ •์‹์œผ๋กœ ์„ ํƒํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์‚ญ์ œ) ์ „๊นŒ์ง€ ์ด ์Šฌ๋ผ์ด์Šค์— ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ๋ถ™์ด์ง€ ๋งˆ์„ธ์š”. WBS_PROGRESS_TRACKER.csv์˜ AEG-VS-26-01 ํ–‰ ์ƒํƒœ๋ฅผ `BLOCKED`๋กœ ์ •์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. + - **๋˜ ๋‹ค๋ฅธ ๋ฐœ๊ฒฌ โ€” ๋ฏธ์ถ”์  ์ž‘์—…:** `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. **frontend ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์žฌํ•ด์‹œ:** `dotnet build`๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค `pnpm build`๊ฐ€ ์žฌ์‹คํ–‰๋˜์–ด `wwwroot/assets/*` ํ•ด์‹œ ํŒŒ์ผ๋ช…์ด ๋ฐ”๋€Œ๊ณ  git์— ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ์ด ์Œ“์ด๋Š” ๊ตฌ์กฐ์  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์•„์ง ๋ฏธํ•ด๊ฒฐ). --- ## โœ… ์™„๋ฃŒ (Backend ๊ตฌํ˜„ + ํ…Œ์ŠคํŠธ, 2026-08-07 ๊ธฐ์ค€ ๊ฒ€์ฆ๋จ) -### VS-03: ๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ (Maker-Checker Governance) -- **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/` -- **ํ…Œ์ŠคํŠธ:** 20/20 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) -- **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ -- **์ด๋ฒˆ ์„ธ์…˜์—์„œ ๋ฐœ๊ฒฌ/์ˆ˜์ •ํ•œ ๊ฒฐํ•จ:** `ApprovalSql`์ด Dapper๋กœ `DateOnly` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ๋ชปํ•ด ์Šน์ธ ์ œ์•ˆ์„œ ์ƒ์„ฑ์ด ์‹ค DB ํ™˜๊ฒฝ์—์„œ 100% ์‹คํŒจํ•˜๋˜ ๋ฒ„๊ทธ โ€” ๋ณ‘ํ•ฉ ์ดํ›„ ์‹ค DB๋กœ ํ•œ ๋ฒˆ๋„ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ์Œ +### VS-26 (๊ตฌ VS-03): ๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ (Maker-Checker Governance) โ€” ๐Ÿ”ด BLOCKED +- **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/` (์ฃฝ์€ ์ฝ”๋“œ, `[DontRegister]`) + `Features/ApprovalWorkflow/` (์‹ค์ œ ๋“ฑ๋ก๋จ, ํ…Œ์ŠคํŠธ ์—†์Œ) +- **ํ…Œ์ŠคํŠธ:** 20/20 PASS๋Š” ์ฃฝ์€ ์ฝ”๋“œ ์ชฝ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค โ€” ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ตฌํ˜„์€ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ TECH_DEBT_REGISTER.md DEBT-017 ์ฐธ์กฐ. +- **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ. DEBT-017 ํ•ด๊ฒฐ ์ „๊นŒ์ง€ ์ฐฉ์ˆ˜ ๊ธˆ์ง€. +- **์ด์ „ ์„ธ์…˜์—์„œ ๋ฐœ๊ฒฌ/์ˆ˜์ •ํ•œ ๊ฒฐํ•จ (์—ฌ์ „ํžˆ ์œ ํšจ, ์ฃฝ์€ ์ฝ”๋“œ ์ชฝ ํ•œ์ •):** `ApprovalSql`์ด Dapper๋กœ `DateOnly` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ๋ชปํ•ด ์Šน์ธ ์ œ์•ˆ์„œ ์ƒ์„ฑ์ด ์‹ค DB ํ™˜๊ฒฝ์—์„œ 100% ์‹คํŒจํ•˜๋˜ ๋ฒ„๊ทธ โ€” ๋ณ‘ํ•ฉ ์ดํ›„ ์‹ค DB๋กœ ํ•œ ๋ฒˆ๋„ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ์Œ -### VS-04: ๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  (Audit Trail / GDPR) +### VS-27 (๊ตฌ VS-04): ๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  (Audit Trail / GDPR) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/Compliance/` - **ํ…Œ์ŠคํŠธ:** 5/5 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ @@ -31,16 +33,16 @@ ### VS-10: ๋งค๋„ ๊ฒฐ์ • ์—”์ง„ (Sell Decision Engine) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/SellDecision/`, `frontend/src/features/sell-decision/` - **ํ…Œ์ŠคํŠธ:** 32/32 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) -- **์™„๋ฃŒ๋„:** Backend + Frontend ๋ชจ๋‘ ์กด์žฌ (VS-03/04/12/14 ์ค‘ ์œ ์ผ) +- **์™„๋ฃŒ๋„:** Backend + Frontend ๋ชจ๋‘ ์กด์žฌ (VS-26/27/28/29 ์ค‘ ์œ ์ผ) - **โš ๏ธ ๋ฏธ๊ฒ€์ฆ ์‚ฌํ•ญ:** ์ฝ”๋“œ/ํ…Œ์ŠคํŠธ ์™„๋ฃŒ โ‰  PBO/DSR ํ”„๋กœ๋•์…˜ ๊ฒ€์ฆ ์™„๋ฃŒ. ์‹ค ์‹œ์žฅ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์€ Phase 1 Shadow Run ์™„๋ฃŒ ํ›„์—๋งŒ ๊ฐ€๋Šฅ -### VS-12: ๊ฑฐ๋ž˜ ์‹คํ–‰ ์‹œ์Šคํ…œ (Trade Execution, KIS ์—ฐ๋™) +### 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-14: ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ (Portfolio Reconciliation) +### VS-29 (๊ตฌ VS-14): ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ (Portfolio Reconciliation) - **์œ„์น˜:** `src/KArtSell.Modules.ModelOperations/PortfolioReconciliation/` - **ํ…Œ์ŠคํŠธ:** 18/18 PASS (๊ฒฉ๋ฆฌ ์‹คํ–‰ ๊ธฐ์ค€) - **๋ฏธ์™„๋ฃŒ:** ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ diff --git a/docs/CURRENT/CATALOGS/WBS_MASTER.csv b/docs/CURRENT/CATALOGS/WBS_MASTER.csv index 39c772ea..5c1ecaa8 100644 --- a/docs/CURRENT/CATALOGS/WBS_MASTER.csv +++ b/docs/CURRENT/CATALOGS/WBS_MASTER.csv @@ -663,3 +663,7 @@ AEG-V16-085,S15,W31-32,Cross,Cross-cutting,Packaging/Docs,PKG,REQ-V16-PKG-05,Cro AEG-V16-086,S15,W31-32,Cross,Cross-cutting,Packaging/Docs,PKG,REQ-V16-PKG-06,Cross,Cross,Cross,Cross,T-V16-PKG-06,Manifest/SHA256,PACKAGE_MANIFEST/SHA256SUMS,์ „ ํŒŒ์ผ hash,Release Manager,PM/QA,4,AEG-V16-085,G6,SOURCE+V16_DELTA,P1,PLANNED AEG-V16-087,S15,W31-32,Cross,Cross-cutting,Packaging/Docs,PKG,REQ-V16-PKG-07,Cross,Cross,Cross,Cross,T-V16-PKG-07,ZIP CRC/recursive scan,PACKAGE_QA,testzip nullยทself include 0,Release Manager,PM/QA,5,AEG-V16-086,G6,SOURCE+V16_DELTA,P1,PLANNED AEG-V16-088,S15,W31-32,Cross,Cross-cutting,Packaging/Docs,PKG,REQ-V16-PKG-08,Cross,Cross,Cross,Cross,T-V16-PKG-08,Distribution README,DISTRIBUTION_README,๊ฒ€์ฆ ์ง„์‹ค์„ฑยท์‹คํ–‰ ์ˆœ์„œ,Release Manager,PM/QA,6,AEG-V16-087,G6,SOURCE+V16_DELTA,P1,PLANNED +AEG-VS-26-01,S2,W-,VS-26,ApprovalWorkflow,ModelOperations,GOV,REQ-APR-001,APR-01,MIG-0036,-,UI-APR-01,T-APR-001,๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ (Maker-Checker Governance),"docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md; ADR-WBS-001",์ƒ์„ธ ์ƒํƒœ๋Š” WBS_PROGRESS_TRACKER.csv AEG-VS-26-01 ์ฐธ์กฐ โ€” BLOCKED (DEBT-017: ๋‘ ๊ฐœ์˜ ์ค‘๋ณต ๊ตฌํ˜„ ์ค‘ ์‹ค์ œ ๋“ฑ๋ก๋œ ์ชฝ์€ ํ…Œ์ŠคํŠธ ์•ˆ๋จ),PM/BE Lead,Security/QA,-,-,G1-B,SOURCE+DESIGN_PROPOSAL,P0,BLOCKED +AEG-VS-27-01,S2,W-,VS-27,AuditTrail,ModelOperations,GOV,REQ-AUD-001,AUD-01,MIG-0037,-,UI-AUD-01,T-AUD-001,๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  (Audit Trail / GDPR),"docs/CURRENT/SLICE_SPECS/VS-27-SLICE_SPEC.md; ADR-WBS-001",์ƒ์„ธ ์ƒํƒœ๋Š” WBS_PROGRESS_TRACKER.csv AEG-VS-27-01 ์ฐธ์กฐ โ€” Backend 5/5 tests PASS(๊ฒฉ๋ฆฌ); ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ,PM/BE Lead,Security/QA,-,-,G1-B,SOURCE+DESIGN_PROPOSAL,P0,COMPLETED +AEG-VS-28-01,S2,W-,VS-28,TradeExecution,ModelOperations,BE,REQ-TRD-001,TRD-01,MIG-0039,-,UI-TRD-01,T-TRD-001,"๊ฑฐ๋ž˜ ์‹คํ–‰ ์‹œ์Šคํ…œ (Trade Execution, KIS)","docs/CURRENT/SLICE_SPECS/VS-28-SLICE_SPEC.md; ADR-WBS-001",์ƒ์„ธ ์ƒํƒœ๋Š” WBS_PROGRESS_TRACKER.csv AEG-VS-28-01 ์ฐธ์กฐ โ€” Backend 13/13 tests PASS(๊ฒฉ๋ฆฌ); ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ,BE Lead/Trading Ops,Security/QA,-,-,G1-B,SOURCE+DESIGN_PROPOSAL,P0,COMPLETED +AEG-VS-29-01,S2,W-,VS-29,PortfolioReconciliation,ModelOperations,BE,REQ-REC-002,REC-02,MIG-0040,-,UI-REC-02,T-REC-002,ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ,"docs/CURRENT/SLICE_SPECS/VS-29-SLICE_SPEC.md; ADR-WBS-001",์ƒ์„ธ ์ƒํƒœ๋Š” WBS_PROGRESS_TRACKER.csv AEG-VS-29-01 ์ฐธ์กฐ โ€” Backend 18/18 tests PASS(๊ฒฉ๋ฆฌ); ํ”„๋ŸฐํŠธ์—”๋“œ UI ์—†์Œ,BE Lead,Security/QA,-,-,G1-B,SOURCE+DESIGN_PROPOSAL,P0,COMPLETED diff --git a/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv b/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv index b6c3b663..8282827d 100644 --- a/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv +++ b/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv @@ -17,13 +17,13 @@ AEG-VS-00-07,S0,VS-00,ํšŒ๊ท€ยท๊ด€์ œยทRunbookยทRollback ์ฆ๊ฑฐ,COMPLETED,2026-08 AEG-X-009,S1,Cross,Source catalog ๊ณ ๋„ํ™”,COMPLETED,2026-08-07,"docs/CURRENT/CATALOGS/source-catalog.md; docs/CURRENT/AEG-X-009_AUTOMATION_PROPOSAL.md; contracts/data/source-approval.v1.proposed.json; docs/DECISIONS/ADR-DATA-001.md; db/migrations/0033_source_approval_contract.sql; db/migrations/0034_dataset_manifest_freeze_contract.sql; db/migrations/0033_market_data_import_logs.sql; src/KArtSell.Modules.ModelOperations/Infrastructure/DapperApprovedModelContextReader.cs",Data Governance,"โœ… Workstream D/E/F COMPLETED: source-catalog.md v2.0 (KRX/OpenDart/KIS consolidated), VS-02_DATA_GOVERNANCE_POLICY.md, VS-03/04 SLICE_SPECs. All 4 unknowns resolved. โœ… Workstream G (commit 136665c, 2026-08-07) also now COMPLETE: live KRX OpenAPI / OpenDart / KIS service integrations (P1-P3), daily scheduling + error classification + SLA tracking + LKG fallback (P4-P6), market_data schema with append-only import logs, correlation_id-based idempotent replay. โš ๏ธ Note: 0033 is used by two different, unrelated migrations across branches (source_approval_contract.sql vs market_data_import_logs.sql) โ€” confirm actual applied migration number in the target DB's kartsell_schema_versions journal before assuming both landed as authored." AEG-VS-01-01,S1,VS-01,์ •์ฑ…ยท๋ฒ”์œ„ยท์‹คํŒจ์ƒํƒœ ๊ณ„์•ฝ ํ™•์ •,COMPLETED,2026-08-07,docs/CURRENT/SLICE_SPECS/VS-01-SLICE_SPEC.md,PM/Architect,"โœ… SLICE_SPEC produced: VS-01-SLICE_SPEC.md (identity/MFA/RBAC/maker-checker contract). Prerequisite AEG-X-001 + AEG-VS-00-02 already COMPLETED. Ready for security team review and schema implementation." AEG-VS-02-01,S1,VS-02,์ •์ฑ…ยท๋ฒ”์œ„ยท์‹คํŒจ์ƒํƒœ ๊ณ„์•ฝ ํ™•์ •,COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-02-SLICE_SPEC.md; docs/CURRENT/VS-02_DATA_GOVERNANCE_POLICY.md",PM/Architect,"โœ… COMPLETE: VS-02-SLICE_SPEC.md + governance policy. All 4 unknowns resolved (data source, import SLA, audit policy, schema versioning). Financial security master implementation ready for Phase 2." -AEG-VS-03-01,S2,VS-03,๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌํ˜„ (Maker-Checker Governance),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/ (ApprovalSql.cs, ApprovalPolicy.cs); db/migrations/0036_approval_workflow.sql; tests/KArtSell.Integration.Tests/ApprovalWorkflow/*; commit a2e742c (Workstream H, PR #23, merged to main)",PM/BE Lead,"โœ… Backend implementation + tests complete: maker-checker 2-person approval gate, evidence attachment, approve/reject with justification. 20/20 tests PASS run in isolation (2026-08-07, KARTSELL_POSTGRES=kartselldb). Also fixed same day: ApprovalSql couldn't insert a DateOnly parameter through Dapper at all (see fix/dapper-underscore-mapping-and-build branch) โ€” prior to that fix, proposal creation failed 100% of the time against a real database; this was never caught because no integration test had run against a live DB since the slice merged. โš ๏ธ No frontend UI yet (no frontend/src/features/approval-workflow/). โš ๏ธ WBS_ID COLLISION โ€” DECISION_REQUIRED: docs/CURRENT/CATALOGS/WBS_MASTER.csv defines VS-03 as 'IngestMarketDataPIT' (market data PIT ingestion), an unrelated slice. This VS-03 label was assigned by SLICE_SPECS/VS-03-SLICE_SPEC.md independently, without checking WBS_MASTER.csv. Needs an explicit decision: renumber this slice, or formally supersede WBS_MASTER's original VS-03 definition and record why." -AEG-VS-04-01,S2,VS-04,๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  ๊ตฌํ˜„ (Audit Trail / GDPR),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-04-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/Compliance/ (AuditSql.cs, GdprRetention.cs); tests/KArtSell.Integration.Tests/Compliance/AuditTrailTests.cs; commit 97444c9 (Workstream I, PR #24, merged to main)",PM/BE Lead,"โœ… Backend implementation + tests complete: append-only audit_events table, GDPR retention tracking + redaction (actor_emailโ†’'', customer_idโ†’''), PII fields (ip_address). 5/5 tests PASS run in isolation (2026-08-07). Also fixed same day (fix/dapper-underscore-mapping-and-build branch): ip_address (inet) and kis_response-style jsonb columns threw InvalidCastException when read through Dapper into a typed class; GdprRetention.RetentionEndsAt was declared DateTime against a DATE column, same failure mode; and a process-wide Dapper snake_case-mapping race condition (KArtSell.BuildingBlocks' [ModuleInitializer] only fires once that assembly loads โ€” AuditSql doesn't reliably touch it) intermittently nulled out every column read from this table depending on unrelated test/host startup order. None of this had ever been exercised against a live database before. โš ๏ธ No frontend UI yet. โš ๏ธ WBS_ID COLLISION โ€” DECISION_REQUIRED: WBS_MASTER.csv defines VS-04 as 'ApplyCorporateActions' (corporate actions processing), an unrelated slice. Same issue and same required decision as AEG-VS-03-01 above." +AEG-VS-26-01,S2,VS-26,๋ชจ๋ธ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌํ˜„ (Maker-Checker Governance),BLOCKED,-,"docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/ (ApprovalSql.cs, ApprovalPolicy.cs, [DontRegister]'d); src/KArtSell.Modules.ModelOperations/Features/ApprovalWorkflow/ (Handlers.cs, Sql.cs, Policy.cs โ€” the one actually wired in Program.cs); db/migrations/0036_approval_workflow.sql; tests/KArtSell.Integration.Tests/ApprovalWorkflow/*; TECH_DEBT_REGISTER.md DEBT-017; commit a2e742c (Workstream H, PR #23, merged to main)",PM/BE Lead,"๐Ÿ”ด CORRECTED 2026-08-08 โ€” this row previously said 'Backend implementation + tests complete, 20/20 tests PASS' and that claim is misleading: TECH_DEBT_REGISTER.md DEBT-017 records that TWO independent ApprovalWorkflow implementations exist with colliding routes. The one this row's evidence links to and the one with 20/20 passing tests (`ApprovalWorkflow/`, Workstream H) has all 4 endpoints annotated `[DontRegister]` and is NOT reachable via HTTP. The implementation actually registered in `Program.cs` and reachable at runtime is `Features/ApprovalWorkflow/` (Workstream G) โ€” grep found no dedicated test file exercising it. Net effect: the maker-checker approval gate that is actually live has not been shown to work, and the one that has been shown to work is dead code. Do not build frontend UI against either implementation, and do not re-mark this COMPLETED, until an architect decision (DEBT-017) picks the canonical implementation, deletes the other, and a test suite runs against whichever is kept. Renumbered from VS-03 to VS-26 on 2026-08-08 per docs/DECISIONS/ADR-WBS-001-slice-renumbering.md โ€” VS-03 in WBS_MASTER.csv ('IngestMarketDataPIT') is a separate, unrelated, still-unimplemented slice and keeps its original number unchanged. Also note: src/KArtSell.Host/Features/MarketData/VS03_*.cs is a THIRD, unrelated, already-implemented-and-tested body of work also labeled 'VS-03' (Market Data Ingestion Dashboard, commits 2bc2b1e/32b49a4) that is entirely absent from this tracker โ€” see CURRENT_ROADMAP.md for a note to investigate and add it." +AEG-VS-27-01,S2,VS-27,๋ถˆ๋ณ€ ๊ฐ์‚ฌ ์ถ”์  ๊ตฌํ˜„ (Audit Trail / GDPR),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-27-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/Compliance/ (AuditSql.cs, GdprRetention.cs); tests/KArtSell.Integration.Tests/Compliance/AuditTrailTests.cs; commit 97444c9 (Workstream I, PR #24, merged to main)",PM/BE Lead,"โœ… Backend implementation + tests complete: append-only audit_events table, GDPR retention tracking + redaction (actor_emailโ†’'', customer_idโ†’''), PII fields (ip_address). 5/5 tests PASS run in isolation (2026-08-07). Also fixed same day (fix/dapper-underscore-mapping-and-build branch): ip_address (inet) and kis_response-style jsonb columns threw InvalidCastException when read through Dapper into a typed class; GdprRetention.RetentionEndsAt was declared DateTime against a DATE column, same failure mode; and a process-wide Dapper snake_case-mapping race condition (KArtSell.BuildingBlocks' [ModuleInitializer] only fires once that assembly loads โ€” AuditSql doesn't reliably touch it) intermittently nulled out every column read from this table depending on unrelated test/host startup order. None of this had ever been exercised against a live database before. โš ๏ธ No frontend UI yet โ€” in progress 2026-08-08. Renumbered from VS-04 to VS-27 on 2026-08-08 per docs/DECISIONS/ADR-WBS-001-slice-renumbering.md โ€” VS-04 in WBS_MASTER.csv ('ApplyCorporateActions') was an unrelated, still-unimplemented slice and keeps its original number unchanged." AEG-VS-05-01,S3,VS-05,์ •์ฑ…ยท๋ฒ”์œ„ยท์‹คํŒจ์ƒํƒœ ๊ณ„์•ฝ ํ™•์ •,PLANNED,-,-,PM/Architect,"Not started. No docs/CURRENT/SLICE_SPECS/VS-05-SLICE_SPEC.md and no src/ implementation exist yet (confirmed 2026-08-07). Previous note referenced 'Job 976 (~50-90 days)' as if Phase 1 were actively running and counting down โ€” that was false; see PHASE-1-SHADOW-RUN row below. Correct statement: blocked behind Gate 1 (Phase 1 shadow run), which itself has not been queued yet." AEG-X-011,S4,Cross,Golden vector ๊ณ ๋„ํ™”,BLOCKED,TBD,"AGENTS.md: Algorithm changes require Golden data",Quant/QA,"Gate 2 prerequisite. Blocked by Phase 1 completion. Corrected 2026-08-07: Phase 1 (Job 893/976) has not been started, not 'in progress' โ€” see PHASE-1-SHADOW-RUN row. No countdown is currently running." AEG-VS-09-01,S4,VS-09,BuildEvidenceSnapshot,BLOCKED,TBD,"CLAUDE.md: Evidence requires Phase 1 results",PM/Architect,"Gate 2 prerequisite. Blocked by Phase 1, which has not been started (confirmed 2026-08-07). No src/ implementation exists for this slice." AEG-VS-10-01,S4,VS-10,๋งค๋„ ๊ฒฐ์ • ์—”์ง„ ๊ตฌํ˜„ (GenerateSellDecision),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-10-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/SellDecision/ (SellDecisionEndpoints.cs, SellDecisionHandler.cs, SellDecisionSql.cs, SellPriorityRanker.cs); frontend/src/features/sell-decision/; tests/KArtSell.Integration.Tests/SellDecision/SellDecisionTests.cs; commit b1e38ac (Phase 3 J, PR #28, merged to main)",BE Lead/Quant Lead,"โœ… Implementation complete (code + BE + FE + tests), matches WBS_MASTER's VS-10='GenerateSellDecision' definition (no ID collision here). Sell priority ranking (HARD_IMPAIRMENTโ†’...โ†’REENTRY_OPTION) with age/liquidity score boosts per VS-10-SLICE_SPEC.md. 32/32 tests PASS run in isolation (2026-08-07); one test (CalculateScore_HardImpairment_ReturnsLowestScore) had a wrong input value that happened to not exercise the >365-day age-boost branch the spec defines โ€” fixed as a test bug, not a product bug (see fix/dapper-underscore-mapping-and-build branch). โš ๏ธ NOT validated: this row was previously (incorrectly) marked BLOCKED with reasoning 'Model must pass PBO/DSR validation' โ€” that Gate-3/production-readiness validation genuinely still requires real Phase 1 shadow-run data and has not happened. Distinguish 'code implemented and unit/integration-tested' (done) from 'PBO/DSR-validated against real market data' (not done, blocked on Phase 1)." AEG-VS-19-01,S5,VS-19,RunFrozenBacktest,BLOCKED,TBD,"CLAUDE.md: Requires evidence from Phase 1-4",PM/Architect,"Gate 3 prerequisite. Blocked by Phase 1, which has not been started (confirmed 2026-08-07). No src/ implementation exists for this slice." -AEG-VS-12-01,S2,VS-12,"๊ฑฐ๋ž˜ ์‹คํ–‰ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (Trade Execution, KIS Integration)",COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-12-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/TradeExecution/ (TradeEndpoints.cs, TradeHandlers.cs, TradeSql.cs, Trade.cs, KisTradeExecutionService.cs); db/migrations/0039_trades.sql; tests/KArtSell.Integration.Tests/TradeExecution/TradeExecutionTests.cs; commit b1e38ac (Phase 3 K, PR #28, merged to main)",BE Lead/Trading Ops,"New row โ€” no prior tracker entry existed for this slice. โœ… Backend implementation + tests complete: Trade state machine (Pendingโ†’Submittedโ†’Acceptedโ†’PartiallyFilled/FullyFilledโ†’Confirmedโ†’Reconciled), KIS order submission/poll/settlement. 13/13 tests PASS run in isolation (2026-08-07), but only after two real bugs were fixed on fix/dapper-underscore-mapping-and-build: (1) UpdateTradeStatusAsync only ever persisted status/kis_response/error_message and silently dropped kis_order_id, executed_quantity, unit_price, commission, net_proceeds and both timestamps on every single call since the slice merged โ€” trade fills and settlements were not actually being recorded; (2) the same Dapper snake_case-mapping race condition described in AEG-VS-04-01's notes. โš ๏ธ No frontend UI yet (no frontend/src/features/trade-execution/). โš ๏ธ WBS_ID COLLISION โ€” DECISION_REQUIRED: WBS_MASTER.csv defines VS-12 as 'RankBuyCandidates' (buy candidate ranking), an unrelated slice. This VS-12 label was assigned independently by SLICE_SPECS/VS-12-SLICE_SPEC.md." -AEG-VS-14-01,S2,VS-14,ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ ๊ตฌํ˜„ (Portfolio Reconciliation),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-14-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/PortfolioReconciliation/ (Endpoints.cs, ReconcileTradeHandler.cs, ReconciliationEngine.cs, ReconciliationSql.cs, MismatchDetector.cs, CostBasisCalculator.cs); tests/KArtSell.Integration.Tests/PortfolioReconciliation/ReconciliationEngineTests.cs; tests/KArtSell.ModelOperations.UnitTests/EvaluationReconciliationPlannerTests.cs; commit b1e38ac (Phase 3 L, PR #28, merged to main); commit 4059828 (fix: missing model_operations.models table breaking every fresh DB, PR #29, merged to main same day)",BE Lead,"New row โ€” no prior tracker entry existed for this slice. โœ… Backend implementation + tests complete: Sell Decision โ†’ Trade โ†’ Holdings reconciliation, cost-basis calculation, mismatch detection. 18/18 tests PASS run in isolation (2026-08-07). Note this slice's own merge (PR #28) shipped with a missing model_operations.models table that broke every fresh-database migration; that was caught and fixed same day in PR #29 โ€” a reminder that this branch's fresh-install DbUp path had not actually been rehearsed before merge. โš ๏ธ No frontend UI yet. โš ๏ธ WBS_ID COLLISION โ€” DECISION_REQUIRED: WBS_MASTER.csv defines VS-14 as 'GenerateDailyRecommendations' (daily client recommendation packages), an unrelated slice." +AEG-VS-28-01,S2,VS-28,"๊ฑฐ๋ž˜ ์‹คํ–‰ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (Trade Execution, KIS Integration)",COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-28-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/TradeExecution/ (TradeEndpoints.cs, TradeHandlers.cs, TradeSql.cs, Trade.cs, KisTradeExecutionService.cs); db/migrations/0039_trades.sql; tests/KArtSell.Integration.Tests/TradeExecution/TradeExecutionTests.cs; commit b1e38ac (Phase 3 K, PR #28, merged to main)",BE Lead/Trading Ops,"New row โ€” no prior tracker entry existed for this slice. โœ… Backend implementation + tests complete: Trade state machine (Pendingโ†’Submittedโ†’Acceptedโ†’PartiallyFilled/FullyFilledโ†’Confirmedโ†’Reconciled), KIS order submission/poll/settlement. 13/13 tests PASS run in isolation (2026-08-07), but only after two real bugs were fixed on fix/dapper-underscore-mapping-and-build: (1) UpdateTradeStatusAsync only ever persisted status/kis_response/error_message and silently dropped kis_order_id, executed_quantity, unit_price, commission, net_proceeds and both timestamps on every single call since the slice merged โ€” trade fills and settlements were not actually being recorded; (2) the same Dapper snake_case-mapping race condition described in AEG-VS-27-01's notes. โš ๏ธ No frontend UI yet (no frontend/src/features/trade-execution/) โ€” in progress 2026-08-08. Renumbered from VS-12 to VS-28 on 2026-08-08 per docs/DECISIONS/ADR-WBS-001-slice-renumbering.md โ€” VS-12 in WBS_MASTER.csv ('RankBuyCandidates') was an unrelated, still-unimplemented slice and keeps its original number unchanged." +AEG-VS-29-01,S2,VS-29,ํฌํŠธํด๋ฆฌ์˜ค ๋Œ€์‚ฌ ๊ตฌํ˜„ (Portfolio Reconciliation),COMPLETED,2026-08-07,"docs/CURRENT/SLICE_SPECS/VS-29-SLICE_SPEC.md; src/KArtSell.Modules.ModelOperations/PortfolioReconciliation/ (Endpoints.cs, ReconcileTradeHandler.cs, ReconciliationEngine.cs, ReconciliationSql.cs, MismatchDetector.cs, CostBasisCalculator.cs); tests/KArtSell.Integration.Tests/PortfolioReconciliation/ReconciliationEngineTests.cs; tests/KArtSell.ModelOperations.UnitTests/EvaluationReconciliationPlannerTests.cs; commit b1e38ac (Phase 3 L, PR #28, merged to main); commit 4059828 (fix: missing model_operations.models table breaking every fresh DB, PR #29, merged to main same day)",BE Lead,"New row โ€” no prior tracker entry existed for this slice. โœ… Backend implementation + tests complete: Sell Decision โ†’ Trade โ†’ Holdings reconciliation, cost-basis calculation, mismatch detection. 18/18 tests PASS run in isolation (2026-08-07). Note this slice's own merge (PR #28) shipped with a missing model_operations.models table that broke every fresh-database migration; that was caught and fixed same day in PR #29 โ€” a reminder that this branch's fresh-install DbUp path had not actually been rehearsed before merge. โš ๏ธ No frontend UI yet โ€” in progress 2026-08-08. Renumbered from VS-14 to VS-29 on 2026-08-08 per docs/DECISIONS/ADR-WBS-001-slice-renumbering.md โ€” VS-14 in WBS_MASTER.csv ('GenerateDailyRecommendations') was an unrelated, still-unimplemented slice and keeps its original number unchanged." PHASE-1-SHADOW-RUN,S0-S5,Cross,252+ Trading Day Shadow Run,BLOCKED,TBD,"docs/CURRENT/PHASE-1_SHADOW_RUN_STATUS_CORRECTION.md; docs/CURRENT/AEG-X-004_DBUP_EVIDENCE.md; docs/CURRENT/PHASE-1_REQUEUE_READINESS.md; docs/CURRENT/PHASE-1_EXECUTION_EVIDENCE_PLAN.md; docs/CURRENT/PHASE-1_PREFLIGHT_20260806.md; docs/CURRENT/PHASE-1_PRODUCTION_PREFLIGHT_20260806.md; evidence/AEG-X-004/production-readonly-preflight-20260806.md; db/migrations/0032_shadow_run_queued_status_contract.sql; logs/phase-1-execution.log; logs/host-startup-20260804-173000.log",๊น€์žฌํ˜„/BE/SRE,"Read-only preflight: active DbUp journal public.kartsell_schema_versions contains 0032 and check_status includes Queued. Capabilities remain order/KIS/client publication OFF. Server-side dataset_manifest, model_version_registry, evidence_snapshot, and release_evidence_bundle contain no approved/frozen rows; no RunId/JobId/enqueue created. Blocked pending approved server-side VersionSet. Re-confirmed 2026-08-07: still no RunId/JobId exists anywhere in this workspace or its evidence trail; nothing changed on this row this session. Any future document that claims this row is RUNNING must cite a real RunId/JobId โ€” do not restate the earlier (already-corrected) false claim." diff --git a/docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md b/docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md similarity index 96% rename from docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md rename to docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md index a5d663a7..b6107321 100644 --- a/docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md +++ b/docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md @@ -1,6 +1,6 @@ -# VS-03: Model Approval Workflow (Maker-Checker Governance) +# VS-26: Model Approval Workflow (Maker-Checker Governance) -**Vertical Slice:** VS-03 (Model Approval & Activation Gateway) +**Vertical Slice:** VS-26 (Model Approval & Activation Gateway) **Version:** 1.0 COMPLETE **Date:** 2026-08-07 **Owner:** Platform Lead + Compliance @@ -228,11 +228,11 @@ CREATE TABLE model_operations.approval_events ( - **VS-00:** PIT envelope (published_at, correlation_id, revision) - **VS-02:** Financial security master (governance foundation) -- **VS-04:** Audit trail (event logging) +- **VS-27:** Audit trail (event logging) - **VS-10:** Sell decision (uses approved models) --- **Co-Authored-By:** Claude Haiku 4.5 **Status:** โœ… READY FOR IMPLEMENTATION -**Next:** VS-04 (audit trail), then Phase 2 implementation +**Next:** VS-27 (audit trail), then Phase 2 implementation diff --git a/docs/CURRENT/SLICE_SPECS/VS-04-SLICE_SPEC.md b/docs/CURRENT/SLICE_SPECS/VS-27-SLICE_SPEC.md similarity index 98% rename from docs/CURRENT/SLICE_SPECS/VS-04-SLICE_SPEC.md rename to docs/CURRENT/SLICE_SPECS/VS-27-SLICE_SPEC.md index 8c7835ae..11058b9e 100644 --- a/docs/CURRENT/SLICE_SPECS/VS-04-SLICE_SPEC.md +++ b/docs/CURRENT/SLICE_SPECS/VS-27-SLICE_SPEC.md @@ -1,6 +1,6 @@ -# VS-04: Immutable Audit Trail (GDPR/Compliance) +# VS-27: Immutable Audit Trail (GDPR/Compliance) -**Vertical Slice:** VS-04 (Audit Log & Compliance Trail) +**Vertical Slice:** VS-27 (Audit Log & Compliance Trail) **Version:** 1.0 COMPLETE **Date:** 2026-08-07 **Owner:** Compliance + Security @@ -245,7 +245,7 @@ WHERE entity_id IN (SELECT id FROM ... WHERE customer_id = $1); - **VS-00:** PIT envelope (published_at, correlation_id, revision) - **VS-02:** Governance foundation (data sources, policies) -- **VS-03:** Approval workflow (events logged by VS-04) +- **VS-26:** Approval workflow (events logged by VS-27) - **Compliance:** GDPR, FSS, PCI-DSS requirements --- diff --git a/docs/CURRENT/SLICE_SPECS/VS-12-SLICE_SPEC.md b/docs/CURRENT/SLICE_SPECS/VS-28-SLICE_SPEC.md similarity index 88% rename from docs/CURRENT/SLICE_SPECS/VS-12-SLICE_SPEC.md rename to docs/CURRENT/SLICE_SPECS/VS-28-SLICE_SPEC.md index 9a60ca22..05e735d1 100644 --- a/docs/CURRENT/SLICE_SPECS/VS-12-SLICE_SPEC.md +++ b/docs/CURRENT/SLICE_SPECS/VS-28-SLICE_SPEC.md @@ -1,11 +1,11 @@ -# VS-12: Trade Execution System (KIS Integration) +# VS-28: Trade Execution System (KIS Integration) -**Vertical Slice:** VS-12 (Trade Execution) +**Vertical Slice:** VS-28 (Trade Execution) **Version:** 1.0 COMPLETE **Date:** 2026-08-07 **Owner:** Backend Lead + Trading Ops **Status:** โœ… READY FOR IMPLEMENTATION -**Depends On:** VS-10 (sell decisions), VS-03 (approval), VS-04 (audit) +**Depends On:** VS-10 (sell decisions), VS-26 (approval), VS-27 (audit) --- @@ -16,12 +16,12 @@ **So that** portfolios are rebalanced automatically with full audit trail **Acceptance Criteria:** -- โœ… Execute trade only after VS-03 approval +- โœ… Execute trade only after VS-26 approval - โœ… Submit order to KIS, track order status - โœ… Handle partial fills and slippage - โœ… Confirm settlement and update cost basis - โœ… Classify errors (transient/permanent/liquidity) -- โœ… All state changes logged (VS-04 audit) +- โœ… All state changes logged (VS-27 audit) --- @@ -47,7 +47,7 @@ PARTIAL_FILLED / FULLY_FILLED (execution progress) โ†“ CONFIRMED (settlement confirmed) โ†“ -RECONCILED (cost basis updated by VS-14) +RECONCILED (cost basis updated by VS-29) ``` --- @@ -87,7 +87,7 @@ CREATE INDEX idx_trades_correlation_id ON trades(correlation_id); ### POST /trades (Create Trade) -**Role:** System (after VS-03 approval) +**Role:** System (after VS-26 approval) **Request:** ```json { @@ -164,12 +164,12 @@ ConfirmSettlementAsync(kisOrderId, correlationId) - Wait 1 business day after FILLED - Confirm settlement with KIS - Update status=CONFIRMED -- Emit event to VS-14 (reconciliation) +- Emit event to VS-29 (reconciliation) ### ReconcileTradeHandler - Receive settlement event - Update status=RECONCILED -- Mark ready for VS-14 processing +- Mark ready for VS-29 processing --- @@ -204,7 +204,7 @@ ConfirmSettlementAsync(kisOrderId, correlationId) - Liquidity: Partial fills, slippage **RBAC:** -- System role: Submit trades (via VS-03 approval) +- System role: Submit trades (via VS-26 approval) - Operations: View & monitor execution - Audit: Query immutable trail @@ -213,9 +213,9 @@ ConfirmSettlementAsync(kisOrderId, correlationId) ## ๐Ÿ“‹ Related Specifications - **VS-10:** Sell Decision (generates trades) -- **VS-03:** Approval Workflow (prerequisite) -- **VS-04:** Audit Trail (logs all state changes) -- **VS-14:** Portfolio Reconciliation (consumes trade settlement) +- **VS-26:** Approval Workflow (prerequisite) +- **VS-27:** Audit Trail (logs all state changes) +- **VS-29:** Portfolio Reconciliation (consumes trade settlement) --- diff --git a/docs/CURRENT/SLICE_SPECS/VS-14-SLICE_SPEC.md b/docs/CURRENT/SLICE_SPECS/VS-29-SLICE_SPEC.md similarity index 93% rename from docs/CURRENT/SLICE_SPECS/VS-14-SLICE_SPEC.md rename to docs/CURRENT/SLICE_SPECS/VS-29-SLICE_SPEC.md index 98f74d1d..e6f61de8 100644 --- a/docs/CURRENT/SLICE_SPECS/VS-14-SLICE_SPEC.md +++ b/docs/CURRENT/SLICE_SPECS/VS-29-SLICE_SPEC.md @@ -1,11 +1,11 @@ -# VS-14: Portfolio Reconciliation (Sell Decision โ†’ Trade โ†’ Holdings) +# VS-29: Portfolio Reconciliation (Sell Decision โ†’ Trade โ†’ Holdings) -**Vertical Slice:** VS-14 (Portfolio Reconciliation) +**Vertical Slice:** VS-29 (Portfolio Reconciliation) **Version:** 1.0 COMPLETE **Date:** 2026-08-07 **Owner:** Data Architecture + Finance **Status:** โœ… READY FOR IMPLEMENTATION -**Depends On:** K (trade execution), uses VS-03 (approval) + VS-04 (audit) +**Depends On:** K (trade execution), uses VS-26 (approval) + VS-27 (audit) --- @@ -38,11 +38,11 @@ ## ๐Ÿ“Š Reconciliation Flow ``` -Trade Executed (from VS-12) +Trade Executed (from VS-28) โ†“ Extract trade details: quantity, price, settlement date โ†“ -Validate against approval (from VS-03) +Validate against approval (from VS-26) โ†“ Update holdings: quantity ยฑ executed โ†“ @@ -237,9 +237,9 @@ CREATE TABLE lots ( ## ๐Ÿ“‹ Related Specifications -- **VS-03:** Approval workflow (approval_proposals, evidence linkage) -- **VS-04:** Audit trail (reconciliation events logged) -- **K (VS-12):** Trade execution (provides trade_id, quantity, price) +- **VS-26:** Approval workflow (approval_proposals, evidence linkage) +- **VS-27:** Audit trail (reconciliation events logged) +- **K (VS-28):** Trade execution (provides trade_id, quantity, price) - **VS-00:** PIT envelope (published_at, correlation_id, revision) --- diff --git a/docs/DECISIONS/ADR-WBS-001-slice-renumbering.md b/docs/DECISIONS/ADR-WBS-001-slice-renumbering.md new file mode 100644 index 00000000..6f308d82 --- /dev/null +++ b/docs/DECISIONS/ADR-WBS-001-slice-renumbering.md @@ -0,0 +1,92 @@ +# ADR-WBS-001: Resolve VS-03/04/12/14 numbering collision + +**Date:** 2026-08-08 +**Status:** ACCEPTED (partial โ€” see "Not resolved by this ADR" below) +**Decision owner:** ๊น€์žฌํ˜„ (per session 2026-08-08 direction: "์‹ค์ œ ๊ตฌํ˜„ ํŠธ๋ž˜์ปค ์œ ์ง€, WBS_MASTER ๊ฐฑ์‹ " + "๊ตฌํ˜„๋œ ์Šฌ๋ผ์ด์Šค๋ฅผ ์ƒˆ ๋ฒˆํ˜ธ๋กœ ์žฌ๋ฐฐ์ •") + +## Context + +`docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` and `docs/CURRENT/SLICE_SPECS/` independently +assigned VS-03, VS-04, VS-12, and VS-14 to four slices implemented in 2026-08-07 (PR #23, #24, #28): + +| Number used by tracker/specs | Actual slice | +|---|---| +| VS-03 | Model Approval Workflow (Maker-Checker Governance) | +| VS-04 | Immutable Audit Trail (GDPR/Compliance) | +| VS-12 | Trade Execution System (KIS Integration) | +| VS-14 | Portfolio Reconciliation | + +These numbers were never checked against `docs/CURRENT/CATALOGS/WBS_MASTER.csv`, the original +666-row plan, which had already assigned the same four numbers to unrelated, still-unimplemented +slices: + +| Number in WBS_MASTER.csv | Original planned slice | +|---|---| +| VS-03 | IngestMarketDataPIT (market data PIT ingestion) | +| VS-04 | ApplyCorporateActions (corporate actions processing) | +| VS-12 | RankBuyCandidates (buy candidate ranking) | +| VS-14 | GenerateDailyRecommendations (daily client recommendation packages) | + +Separately, `src/KArtSell.Host/Features/MarketData/VS03_*.cs` and +`src/KArtSell.Host/Features/Portfolio/VS04_*.cs` / `VS05_*.cs` / `VS08_*.cs` are a **third**, +already-implemented-and-tested body of work (commits `2bc2b1e`, `32b49a4`, `14c5e4f`, `2eee44d`) +that also uses VS-03/04/05/08, for yet another set of features (Market Data Ingestion Dashboard, +Portfolio Rebalance, Risk Metrics, Dashboard). This body of work is not referenced anywhere in +`WBS_PROGRESS_TRACKER.csv` at all. This ADR does not resolve that โ€” see "Not resolved" below. + +## Decision + +Renumber the four 2026-08-07 slices to previously-unused numbers, leaving `WBS_MASTER.csv`'s +original VS-03/04/12/14 rows (and the separate `Features/MarketData`/`Features/Portfolio` +VS-03/04/05/08 code) untouched: + +| Old number | New number | Slice | Code location | +|---|---|---|---| +| VS-03 | **VS-26** | Model Approval Workflow | `src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/` and `Features/ApprovalWorkflow/` (see DEBT-017 below) | +| VS-04 | **VS-27** | Immutable Audit Trail / GDPR | `src/KArtSell.Modules.ModelOperations/Compliance/` | +| VS-12 | **VS-28** | Trade Execution (KIS) | `src/KArtSell.Modules.ModelOperations/TradeExecution/` | +| VS-14 | **VS-29** | Portfolio Reconciliation | `src/KArtSell.Modules.ModelOperations/PortfolioReconciliation/` | + +VS-26 through VS-29 were free (highest number previously used in `WBS_MASTER.csv` was VS-25). + +## Why renumber the new slices rather than renumber WBS_MASTER's originals + +`WBS_MASTER.csv`'s VS-03/04/12/14 rows are referenced by ID from dozens of other rows across the +666-row file (dependency chains, addendum sections `AEG22-*`, `AEG-V15-*`, `AEG-V16-*` all use +VS-03 to mean "MarketData" consistently throughout). Renumbering those in place would touch 50+ +rows with a high chance of missing a cross-reference. The four 2026-08-07 slices have a much +smaller footprint (2 SLICE_SPEC files each side, 2 README.md files, a handful of tracker rows) and +were not yet referenced by ID anywhere else, so moving them was the lower-risk edit. + +## What changed + +- `docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md` โ†’ `VS-26-SLICE_SPEC.md` (content updated) +- `docs/CURRENT/SLICE_SPECS/VS-04-SLICE_SPEC.md` โ†’ `VS-27-SLICE_SPEC.md` (content updated) +- `docs/CURRENT/SLICE_SPECS/VS-12-SLICE_SPEC.md` โ†’ `VS-28-SLICE_SPEC.md` (content updated) +- `docs/CURRENT/SLICE_SPECS/VS-14-SLICE_SPEC.md` โ†’ `VS-29-SLICE_SPEC.md` (content updated) +- `src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/README.md` (VS-03โ†’26, VS-04โ†’27 refs updated) +- `src/KArtSell.Modules.ModelOperations/TradeExecution/README.md` (VS-03โ†’26, VS-04โ†’27, VS-12โ†’28, VS-14โ†’29 refs updated) +- `docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv` rows `AEG-VS-03-01`/`04-01`/`12-01`/`14-01` renamed to `AEG-VS-26-01`/`27-01`/`28-01`/`29-01` +- `docs/CURRENT/CATALOGS/WBS_MASTER.csv` โ€” 4 summary rows appended (VS-26/27/28/29), original rows untouched +- `CURRENT_ROADMAP.md` updated to reflect the resolution + +## Not resolved by this ADR (still needs an explicit decision) + +1. **DEBT-017 (duplicate ApprovalWorkflow implementation).** While investigating this + renumbering, discovered that the VS-26 (formerly VS-03) tracker row credits + `ApprovalWorkflow/` (Workstream H) with "20/20 tests PASS", but that implementation's + endpoints are all `[DontRegister]`'d in FastEndpoints โ€” i.e. dead, unreachable code. The + implementation actually wired into `Program.cs` and reachable over HTTP is + `Features/ApprovalWorkflow/` (Workstream G), which has no dedicated test file found. This + ADR does **not** pick a winner between the two. `AEG-VS-26-01`'s status has been changed from + `COMPLETED` to `BLOCKED` in the tracker pending that decision โ€” see the row's Notes column and + `TECH_DEBT_REGISTER.md` DEBT-017. +2. **`Features/MarketData`/`Features/Portfolio` (VS-03/04/05/08 Market Data Ingestion Dashboard, + Portfolio Rebalance, Risk Metrics, Dashboard).** This is real, committed, tested code + (commits `2bc2b1e`, `32b49a4`, `14c5e4f`, `2eee44d`, `fed750f`, `e0d58ac`) that is completely + absent from `WBS_PROGRESS_TRACKER.csv`. It is not renumbered by this ADR because it appears to + be a genuine (if structurally divergent โ€” it lives under `Features/` rather than as its own + module) implementation attempt at `WBS_MASTER.csv`'s original VS-03/04/05/08 definitions, + not a new collision. It needs to be added to the tracker with real evidence (test results, + whether it is wired into `Program.cs`, whether a frontend exists) rather than silently + inherited into this renumbering. Flagged in `CURRENT_ROADMAP.md` as a follow-up. diff --git a/src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/README.md b/src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/README.md index 5450bc93..675fad2f 100644 --- a/src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/README.md +++ b/src/KArtSell.Modules.ModelOperations/ApprovalWorkflow/README.md @@ -1,11 +1,11 @@ -# VS-03: Model Approval Workflow +# VS-26: Model Approval Workflow ## Overview This vertical slice implements a maker-checker approval workflow for model activation. It enforces separation of duties, state machine transitions, and evidence linkage for regulatory compliance. **Status:** โœ… Ready for implementation -**Specification:** `docs/CURRENT/SLICE_SPECS/VS-03-SLICE_SPEC.md` +**Specification:** `docs/CURRENT/SLICE_SPECS/VS-26-SLICE_SPEC.md` --- @@ -183,7 +183,7 @@ published_at, correlation_id - **VS-00:** PIT envelope (published_at, correlation_id, revision) - **VS-02:** Financial security master (governance foundation) -- **VS-04:** Audit trail (logs all approval events) +- **VS-27:** Audit trail (logs all approval events) - **VS-10:** Sell decision (uses approved models) --- @@ -198,7 +198,7 @@ published_at, correlation_id 6. โœ… FastEndpoints (ApprovalEndpoints.cs) 7. โœ… Unit/Integration tests 8. โณ Merge to main (awaiting PR review) -9. โณ Integration with VS-04 (audit trail subscribers) +9. โณ Integration with VS-27 (audit trail subscribers) 10. โณ Phase 2 implementation (after Phase 1 data available) --- diff --git a/src/KArtSell.Modules.ModelOperations/TradeExecution/README.md b/src/KArtSell.Modules.ModelOperations/TradeExecution/README.md index b4e716a6..f8c0919c 100644 --- a/src/KArtSell.Modules.ModelOperations/TradeExecution/README.md +++ b/src/KArtSell.Modules.ModelOperations/TradeExecution/README.md @@ -1,10 +1,10 @@ -# VS-12: Trade Execution System (KIS Integration) +# VS-28: Trade Execution System (KIS Integration) ## Overview -VS-12 implements automated trade execution through Korea Investment & Securities (KIS) API. This vertical slice handles order submission, status polling, settlement confirmation, and reconciliation for approved sell decisions. +VS-28 implements automated trade execution through Korea Investment & Securities (KIS) API. This vertical slice handles order submission, status polling, settlement confirmation, and reconciliation for approved sell decisions. -**Depends On:** VS-10 (sell decisions) โ†’ VS-03 (approval) โ†’ VS-12 (execution) โ†’ VS-14 (reconciliation) +**Depends On:** VS-10 (sell decisions) โ†’ VS-26 (approval) โ†’ VS-28 (execution) โ†’ VS-29 (reconciliation) ## Architecture @@ -21,7 +21,7 @@ PARTIAL_FILLED / FULLY_FILLED (execution progress) โ†“ CONFIRMED (settlement confirmed) โ†“ -RECONCILED (cost basis updated by VS-14) +RECONCILED (cost basis updated by VS-29) ``` ### Components @@ -158,12 +158,12 @@ CREATE TABLE model_operations.trade_status_history ( ### Incoming - **VS-10 (Sell Decision):** Creates TradeSubmitted event โ†’ triggers SubmitTradeHandler -- **VS-03 (Approval):** Approval pre-requisite checked before trade submission +- **VS-26 (Approval):** Approval pre-requisite checked before trade submission ### Outgoing - **TradeSubmittedEvent:** KIS order ID, quantity, sell decision ID - **TradeFilledEvent:** Executed quantity, unit price, trade ID -- **TradeSettledEvent:** Net proceeds, trade ID โ†’ consumed by VS-14 +- **TradeSettledEvent:** Net proceeds, trade ID โ†’ consumed by VS-29 ### External (KIS API) - **Order submission:** POST /v1/orders @@ -182,10 +182,10 @@ CREATE TABLE model_operations.trade_status_history ( ### Audit Trail - โœ… INSERT-only trades & trade_status_history tables - โœ… All state transitions logged with timestamps -- โœ… VS-04 audit trail integration +- โœ… VS-27 audit trail integration ### RBAC -- โœ… System role: Submit trades (via VS-03 approval) +- โœ… System role: Submit trades (via VS-26 approval) - โœ… Operations: View & monitor execution - โœ… Audit: Query immutable trail @@ -196,7 +196,7 @@ CREATE TABLE model_operations.trade_status_history ( - [ ] HTTP client timeout configured (30 seconds default) - [ ] Circuit breaker SLA validated (< 1% error rate) - [ ] Hangfire jobs q-evaluation queue ready -- [ ] VS-04 audit trail integration verified +- [ ] VS-27 audit trail integration verified - [ ] Logs & alerts configured for transient/permanent/liquidity errors ## Performance Considerations @@ -216,9 +216,9 @@ CREATE TABLE model_operations.trade_status_history ( ## Related Documentation - **VS-10:** Sell Decision Engine (PLANNED) -- **VS-03:** Approval Workflow (MERGED, PR #23) -- **VS-04:** Audit Trail (MERGED, PR #24) -- **VS-14:** Portfolio Reconciliation (PLANNED) +- **VS-26:** Approval Workflow (MERGED, PR #23) +- **VS-27:** Audit Trail (MERGED, PR #24) +- **VS-29:** Portfolio Reconciliation (PLANNED) - **CLAUDE.md:** KIS API reference, error handling patterns ---