docs: resolve VS-03/04/12/14 numbering collision (renumber to VS-26/27/28/29)
Renumbers the four 2026-08-07 slices (ApprovalWorkflow, AuditTrail, TradeExecution, PortfolioReconciliation) to previously-unused VS-26..29, leaving WBS_MASTER.csv's original VS-03/04/12/14 definitions (IngestMarketDataPIT, ApplyCorporateActions, RankBuyCandidates, GenerateDailyRecommendations) untouched, per docs/DECISIONS/ADR-WBS-001-slice-renumbering.md. While investigating, found two things not yet resolved by this commit: - DEBT-017 (duplicate ApprovalWorkflow implementation): the tested backend (ApprovalWorkflow/) is [DontRegister]'d dead code; the live one (Features/ApprovalWorkflow/, wired in Program.cs) has no dedicated tests. AEG-VS-26-01 downgraded from COMPLETED to BLOCKED in the tracker pending an architect decision on which implementation is canonical. - Features/MarketData and Features/Portfolio (VS-03/04/05/08 Market Data Ingestion Dashboard, Portfolio Rebalance, Risk Metrics, Dashboard) are a third, already-implemented-and-tested body of work entirely absent from WBS_PROGRESS_TRACKER.csv. Flagged in CURRENT_ROADMAP.md as a follow-up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+15
-13
@@ -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 없음
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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→'<redacted>', customer_id→'<purged>'), 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→'<redacted>', customer_id→'<purged>'), 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."
|
||||
|
||||
|
+4
-4
@@ -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 <noreply@anthropic.com>
|
||||
**Status:** ✅ READY FOR IMPLEMENTATION
|
||||
**Next:** VS-04 (audit trail), then Phase 2 implementation
|
||||
**Next:** VS-27 (audit trail), then Phase 2 implementation
|
||||
+3
-3
@@ -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
|
||||
|
||||
---
|
||||
+13
-13
@@ -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)
|
||||
|
||||
---
|
||||
|
||||
+8
-8
@@ -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)
|
||||
|
||||
---
|
||||
@@ -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.
|
||||
@@ -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)
|
||||
|
||||
---
|
||||
|
||||
@@ -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
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user