Initial commit: Add project files
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.cs]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
dotnet_sort_system_directives_first = true
|
||||||
|
dotnet_diagnostic.CA2007.severity = none
|
||||||
|
csharp_style_namespace_declarations = file_scoped:warning
|
||||||
|
|
||||||
|
[*.{json,yml,yaml,ts,vue,css,md}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
name: ci
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ci-${{ gitea.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
static:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 15
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.12'
|
||||||
|
- run: python tools/validate_v16.py
|
||||||
|
- run: python -m unittest -v
|
||||||
|
working-directory: research/hardening
|
||||||
|
- run: python -m unittest -v scripts.tests.test_scaffold_slice scripts.tests.test_scaffold_ui_screen
|
||||||
|
|
||||||
|
backend:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:17
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: kartsell
|
||||||
|
POSTGRES_USER: kartsell
|
||||||
|
POSTGRES_PASSWORD: kartsell
|
||||||
|
ports: ["5432:5432"]
|
||||||
|
options: >-
|
||||||
|
--health-cmd "pg_isready -U kartsell"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: '10.0.x'
|
||||||
|
- run: dotnet restore KArtSell.sln
|
||||||
|
- run: dotnet build KArtSell.sln --no-restore -c Release
|
||||||
|
- run: dotnet run --project src/KArtSell.DbMigrator -c Release --no-build
|
||||||
|
env:
|
||||||
|
KARTSELL_POSTGRES: Host=localhost;Port=5432;Database=kartsell;Username=kartsell;Password=kartsell
|
||||||
|
- run: dotnet run --project src/KArtSell.DbMigrator -c Release --no-build
|
||||||
|
env:
|
||||||
|
KARTSELL_POSTGRES: Host=localhost;Port=5432;Database=kartsell;Username=kartsell;Password=kartsell
|
||||||
|
- run: dotnet test KArtSell.sln --no-build -c Release --logger trx
|
||||||
|
env:
|
||||||
|
KARTSELL_POSTGRES: Host=localhost;Port=5432;Database=kartsell;Username=kartsell;Password=kartsell
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: test -f frontend/pnpm-lock.yaml || (echo "pnpm-lock.yaml is required for reproducible CI" && exit 1)
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 22
|
||||||
|
cache: pnpm
|
||||||
|
cache-dependency-path: frontend/pnpm-lock.yaml
|
||||||
|
- run: pnpm install --frozen-lockfile
|
||||||
|
working-directory: frontend
|
||||||
|
- run: pnpm typecheck && pnpm test && pnpm build
|
||||||
|
working-directory: frontend
|
||||||
|
- run: pnpm exec playwright install --with-deps chromium && pnpm e2e
|
||||||
|
working-directory: frontend
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
**/bin/
|
||||||
|
**/obj/
|
||||||
|
frontend/node_modules/
|
||||||
|
frontend/dist/
|
||||||
|
frontend/.env.local
|
||||||
|
.playwright/
|
||||||
|
TestResults/
|
||||||
|
*.user
|
||||||
|
*.suo
|
||||||
|
.DS_Store
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# K-ArtSell Aegis AI Coding Constitution v12.0
|
||||||
|
|
||||||
|
1. 자동주문과 KIS 제출 Capability는 OFF다. 별도 승인 Release 전 구현·활성화·우회하지 않는다.
|
||||||
|
2. 채팅과 생성 코드는 Source of Truth가 아니다. 모든 변경은 Source / Assumption / Unknown / Decision Required를 표시한다.
|
||||||
|
3. 한 PR은 한 Vertical Slice 또는 한 동작보존 리팩터링 목적만 가진다.
|
||||||
|
4. Endpoint→Application→Pure Policy→Dapper SQL→Outbox→Tests 경계를 지킨다.
|
||||||
|
5. Domain Policy는 시간·랜덤·네트워크·DB·DI Container를 직접 읽지 않는다.
|
||||||
|
6. Generic Repository, God Service, Service Locator, Job 내 비즈니스 정책, 조기 Microservice 분리를 금지한다.
|
||||||
|
7. 모듈은 다른 모듈 Source Table을 직접 조회하지 않는다. 승인된 Contract/Read Model만 사용한다.
|
||||||
|
8. `DateTime.Now/UtcNow`를 직접 사용하지 않고 IClock과 MarketCalendar를 사용한다.
|
||||||
|
9. 금융값은 decimal, 명시적 rounding, 단위 계약을 사용한다. 모델 내부 double은 경계에서 변환한다.
|
||||||
|
10. `SellRatioOfLot`, `SellQuantity`, `TargetPortfolioWeightAfter`, `StrategicCoreFloorWeight`를 혼용하지 않는다.
|
||||||
|
11. EvidenceSnapshot·DatasetId·Model/Config/Code SHA 없이 Decision/Recommendation을 저장하지 않는다.
|
||||||
|
12. Command/Job는 IdempotencyKey/JobRunId/Watermark를 갖고 replay를 견딘다.
|
||||||
|
13. Evidence/Decision/Audit는 update/delete하지 않고 append/correction event로 보존한다.
|
||||||
|
14. Write Model은 정규화·append·revision, 화면은 version/watermark/rebuild가 있는 Read Model이다.
|
||||||
|
15. 서버 상태는 TanStack Query가 소유한다. Pinia에 API 응답을 복제하지 않는다.
|
||||||
|
16. FE request/response는 Zod로 runtime validation하고 같은 retry에 같은 Idempotency-Key를 재사용한다.
|
||||||
|
17. `/internal/*` Endpoint는 Roles 또는 Policies를 선언하며 익명 접근을 허용하지 않는다.
|
||||||
|
18. 알고리즘 변경은 Policy ID, Golden, Frozen OOS, cost×2, false-exit/reentry/ES, ModelCard를 동반한다.
|
||||||
|
19. 새 library/pattern/table/threshold는 ADR/Issue 승인 없이 도입하지 않는다.
|
||||||
|
20. 실행하지 못한 build/test/migration을 통과했다고 기록하지 않는다.
|
||||||
|
21. AI 생성 Migration은 fresh/upgrade/re-run/failure rehearsal 및 DBA 승인 없이는 병합하지 않는다.
|
||||||
|
22. 실고객 데이터·실계좌·실주문 키·secret를 prompt/fixture/log/trace에 넣지 않는다.
|
||||||
|
23. Metric·Alert·Runbook·Rollback·Owner/Secondary가 없으면 Done이 아니다.
|
||||||
|
|
||||||
|
|
||||||
|
## v12.1 execution-readiness delta
|
||||||
|
|
||||||
|
- Every change must cite Requirement/Slice/Policy/Data/API/DB/Job/UI/Test IDs.
|
||||||
|
- Production commands load Evidence/Model/Config from approved server-side PIT context; never trust client-supplied evidence.
|
||||||
|
- Write models are normalized and append/correction based. Denormalization is allowed only in versioned, rebuildable read models.
|
||||||
|
- Outbox/Inbox/JobRun/Projection operations require scope, idempotency, watermark, hashes, and replay evidence.
|
||||||
|
- No generic repository, God service, reflection plugin framework, premature microservice, or unapproved threshold.
|
||||||
|
- Refactoring and policy changes must be separate PRs with characterization or Golden tests first.
|
||||||
|
- Never claim a build, migration, test, Shadow period, PBO, or DSR result that was not executed and preserved as evidence.
|
||||||
|
|
||||||
|
## v12.2 strategic data-semantics delta
|
||||||
|
|
||||||
|
- `CurrentSecurityPortfolioWeight`, `CurrentLotPortfolioWeight`, `SellRatioOfLot`, and `StrategicCoreFloorWeight` are distinct units. Never reintroduce the ambiguous `CurrentPortfolioWeight` into active decision code.
|
||||||
|
- A lot-relative sell changes security weight by `CurrentLotPortfolioWeight * SellRatioOfLot`.
|
||||||
|
- Persist the ordered policy trace with Applied/Blocked/NotApplicable dispositions; do not expose raw internal scores directly to customers.
|
||||||
|
- Prior migrations are immutable. v12.2 changes belong in migration `0014` or later.
|
||||||
|
- The six current-session attachments and their SHA-256 values are part of the release evidence.
|
||||||
|
- Use the reviewed templates under `templates/`; do not bulk-generate unapproved modules or placeholder implementations.
|
||||||
|
|
||||||
|
## v12.3 execution and semantic-version delta
|
||||||
|
|
||||||
|
- `weight_semantics_version=1` contexts are legacy ambiguous data and must never enter active decisions; rebuild them as version 2 from explicit security and lot weights.
|
||||||
|
- A positive opportunity edge with a zero or missing requested sell ratio is BLOCKED. Never clamp missing intent to a minimum sell.
|
||||||
|
- Policy IDs, priorities and thresholds must match `contracts/policies/sell-policy-contract.v1.json`; drift blocks G2.
|
||||||
|
- Decision/API/Event/DB evidence must preserve `decision_contract_version` and `policy_trace_schema_version`.
|
||||||
|
- Outcome metrics must name a definition version, population, numerator, denominator, window and aggregation. Do not equate 63-session research output with an annual target without approval.
|
||||||
|
- `scripts/scaffold_slice.py` is dry-run by default, refuses overwrite and produces SCAFFOLD_ONLY code. Generated files are not approved implementation.
|
||||||
|
- The seven cumulative attachments and their SHA-256 values are part of v12.3 release evidence.
|
||||||
|
|
||||||
|
## v12.4 Model Operations Constitution
|
||||||
|
|
||||||
|
- Scheduler automation is limited to EVALUATION_ONLY, PROPOSAL_ONLY and DRILL_ONLY.
|
||||||
|
- Never generate or merge automatic model promotion, rollback, threshold mutation, code change, automatic order or KIS submission paths.
|
||||||
|
- Every evaluation request freezes Dataset/Model/Config/Code/Contract VersionSet from an approved server-side context.
|
||||||
|
- Metric changes require a versioned numerator, denominator, window, aggregation, PIT/revision rule and Golden/OOS impact.
|
||||||
|
- Improvement proposals are documents and records only; they do not edit model, policy, configuration or source files.
|
||||||
|
- Drift thresholds, false-exit definition and retention policy are DECISION_REQUIRED until approved.
|
||||||
|
|
||||||
|
## v14.0 UI / Model Feedback non-negotiables
|
||||||
|
- Feature code MUST NOT import PrimeVue or AG Grid directly. Use shared UI ports and screen types.
|
||||||
|
- UI provider changes require contract, accessibility, visual, state-matrix and performance evidence.
|
||||||
|
- Model operation automation stops at evaluation/proposal. Model activation is human change approval only.
|
||||||
|
- J39 and every new schedule remain disabled until their source, calendar, ownership and alert contracts are approved.
|
||||||
|
- Never claim .NET, pnpm, PostgreSQL, Playwright or Shadow evidence passed unless the actual artifact is attached.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# K-ArtSell Aegis v16.0 Distribution
|
||||||
|
|
||||||
|
Use `Core_NoLegacy` for development and CI. It contains no nested ZIP archives.
|
||||||
|
Use `Full_With_Attachments` for source preservation. It contains one prior v15 Core archive.
|
||||||
|
|
||||||
|
Execution order: read v10/v12.1 baselines → review v16 docs/decisions → run `python tools/validate_v16.py` → provision .NET 10/pnpm/PostgreSQL → execute build/tests/migration rehearsal → complete Shadow/model gates.
|
||||||
|
|
||||||
|
This package is `IMPLEMENTATION_TEMPLATE / STATIC_VALIDATED`. Automatic model activation, customer publication, order submission and KIS submission remain OFF.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
<AnalysisLevel>latest-recommended</AnalysisLevel>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageVersion Include="FastEndpoints" Version="7.1.0" />
|
||||||
|
<PackageVersion Include="Dapper" Version="2.1.79" />
|
||||||
|
<PackageVersion Include="Npgsql" Version="10.0.3" />
|
||||||
|
<PackageVersion Include="DbUp-PostgreSQL" Version="7.0.1" />
|
||||||
|
<PackageVersion Include="Hangfire.Core" Version="1.8.24" />
|
||||||
|
<PackageVersion Include="Hangfire.AspNetCore" Version="1.8.24" />
|
||||||
|
<PackageVersion Include="Hangfire.PostgreSql" Version="1.21.1" />
|
||||||
|
<PackageVersion Include="Polly" Version="8.7.0" />
|
||||||
|
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||||
|
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.1" />
|
||||||
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||||
|
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.17.0" />
|
||||||
|
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.17.0" />
|
||||||
|
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.17.0" />
|
||||||
|
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.17.0" />
|
||||||
|
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.17.0" />
|
||||||
|
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.2.3" />
|
||||||
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
|
||||||
|
<PackageVersion Include="xunit" Version="2.9.3" />
|
||||||
|
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.31903.59
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.BuildingBlocks", "src/KArtSell.BuildingBlocks/KArtSell.BuildingBlocks.csproj", "{5F0F6CB9-ECB2-5B9E-8FCF-2AF378C6BB82}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.Modules.SignalEngine", "src/KArtSell.Modules.SignalEngine/KArtSell.Modules.SignalEngine.csproj", "{C203AEFE-E523-50DF-A0BC-66E41914E411}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.Host", "src/KArtSell.Host/KArtSell.Host.csproj", "{7F4AD582-8828-5F37-A4F3-E0F8ED300BFF}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.DbMigrator", "src/KArtSell.DbMigrator/KArtSell.DbMigrator.csproj", "{C1E481A2-B1C9-5647-8600-DBE8D854552F}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.SignalEngine.UnitTests", "tests/KArtSell.SignalEngine.UnitTests/KArtSell.SignalEngine.UnitTests.csproj", "{FAA2A1FD-EB0C-50F6-BC9F-D571E1CF570E}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.ArchitectureTests", "tests/KArtSell.ArchitectureTests/KArtSell.ArchitectureTests.csproj", "{E62B968F-28A3-5055-8E5E-BFB52EC0175E}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.Modules.ModelOperations", "src/KArtSell.Modules.ModelOperations/KArtSell.Modules.ModelOperations.csproj", "{A9A7D32E-7F4D-4B90-8C57-3D6A2E1A2401}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KArtSell.ModelOperations.UnitTests", "tests/KArtSell.ModelOperations.UnitTests/KArtSell.ModelOperations.UnitTests.csproj", "{B0B8E43F-805E-4CA1-9D68-4E7B3F2B3502}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5F0F6CB9-ECB2-5B9E-8FCF-2AF378C6BB82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5F0F6CB9-ECB2-5B9E-8FCF-2AF378C6BB82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5F0F6CB9-ECB2-5B9E-8FCF-2AF378C6BB82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5F0F6CB9-ECB2-5B9E-8FCF-2AF378C6BB82}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C203AEFE-E523-50DF-A0BC-66E41914E411}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{C203AEFE-E523-50DF-A0BC-66E41914E411}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C203AEFE-E523-50DF-A0BC-66E41914E411}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{C203AEFE-E523-50DF-A0BC-66E41914E411}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7F4AD582-8828-5F37-A4F3-E0F8ED300BFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7F4AD582-8828-5F37-A4F3-E0F8ED300BFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7F4AD582-8828-5F37-A4F3-E0F8ED300BFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7F4AD582-8828-5F37-A4F3-E0F8ED300BFF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C1E481A2-B1C9-5647-8600-DBE8D854552F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{C1E481A2-B1C9-5647-8600-DBE8D854552F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C1E481A2-B1C9-5647-8600-DBE8D854552F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{C1E481A2-B1C9-5647-8600-DBE8D854552F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FAA2A1FD-EB0C-50F6-BC9F-D571E1CF570E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{FAA2A1FD-EB0C-50F6-BC9F-D571E1CF570E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{FAA2A1FD-EB0C-50F6-BC9F-D571E1CF570E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{FAA2A1FD-EB0C-50F6-BC9F-D571E1CF570E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E62B968F-28A3-5055-8E5E-BFB52EC0175E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E62B968F-28A3-5055-8E5E-BFB52EC0175E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E62B968F-28A3-5055-8E5E-BFB52EC0175E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E62B968F-28A3-5055-8E5E-BFB52EC0175E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A9A7D32E-7F4D-4B90-8C57-3D6A2E1A2401}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A9A7D32E-7F4D-4B90-8C57-3D6A2E1A2401}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A9A7D32E-7F4D-4B90-8C57-3D6A2E1A2401}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A9A7D32E-7F4D-4B90-8C57-3D6A2E1A2401}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B0B8E43F-805E-4CA1-9D68-4E7B3F2B3502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{B0B8E43F-805E-4CA1-9D68-4E7B3F2B3502}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B0B8E43F-805E-4CA1-9D68-4E7B3F2B3502}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{B0B8E43F-805E-4CA1-9D68-4E7B3F2B3502}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
|||||||
|
# K-ArtSell Aegis v16.0
|
||||||
|
|
||||||
|
Reference implementation closure for governed advisory research. `RESEARCH_CANDIDATE_NOT_PRODUCTION`; automatic order/KIS/model activation OFF.
|
||||||
|
|
||||||
|
|
||||||
|
**상태:** `IMPLEMENTATION_TEMPLATE / STATIC_VALIDATED / BUILD_DB_E2E_SHADOW_REHEARSAL_REQUIRED`
|
||||||
|
**운영 경계:** `RESEARCH_CANDIDATE_NOT_PRODUCTION · 투자자문형 우선 · 자동주문/KIS 제출 OFF · 자동 모델승격 OFF`
|
||||||
|
|
||||||
|
v16.0은 v10.0의 Baseline Preservation + Delta + Supersession + Traceability, RG-01~08, PIT·불변 Evidence·26 Vertical Slice 기준과 v12.1~v14.0 실행 패키지를 삭제하지 않고 보존한 누적 Delta다. 화면 수나 코드량을 생산준비도로 간주하지 않으며, `Source/License → PIT/Revision/DQ → Evidence/Version Set → Sell/Reentry → Recommendation → Maker-Checker → Publish → Outcome → Reconciliation/DR`의 완결성으로 판단한다.
|
||||||
|
|
||||||
|
## v16.0 핵심 Delta
|
||||||
|
|
||||||
|
### FE 표준화·교체 가능성
|
||||||
|
- UI Adapter Contract v3.0과 14개 Capability를 제공한다.
|
||||||
|
- 업무 Feature에서 PrimeVue/AG Grid 직접 import를 금지하고 `shared/ui/adapter` 경계 안에서만 허용한다.
|
||||||
|
- `Ks*` Wrapper, `CrudWorkspaceLayout`, `OperationsConsoleLayout`, 표준 CRUD List/Form Page, URL Query Codec, 공통 13상태 Matrix를 제공한다.
|
||||||
|
- Adapter 교체는 contract conformance, keyboard/focus/a11y, T01~T10 회귀, visual regression, bundle·license 검사와 release approval을 통과해야 한다.
|
||||||
|
|
||||||
|
### BE·데이터·스케줄러 실행완결성
|
||||||
|
- Endpoint → Application → Domain Policy → Dapper/Npgsql → Outbox/Inbox를 한 Vertical Slice로 완결한다.
|
||||||
|
- 스케줄 실행은 `scheduledFor` anchor, catch-up 정책, BusinessHold, dispatch revision, correlation, version set을 보존한다.
|
||||||
|
- 평가창은 달력 일이 아니라 MarketCalendar의 1/5/20/63/126/252 거래세션으로 성숙도를 판정한다.
|
||||||
|
- `prediction_evaluation_window`, `metric_cohort_definition`, `ui_contract_release`와 append-only 보호를 Migration 0020에 추가했다.
|
||||||
|
- J39 FeedbackCycleIntegrityAudit와 J40 EvaluationWindowIntegrityAudit는 기본 `disabled`다.
|
||||||
|
|
||||||
|
### 알고리즘·지속 모델운영
|
||||||
|
- 매도 우선순위는 `HARD_IMPAIRMENT → PORTFOLIO_SURVIVAL → DYNAMIC_PROFIT_FLOOR → CONCENTRATION/LIQUIDITY → OPPORTUNITY_COST → REENTRY_OPTION`으로 고정한다.
|
||||||
|
- 비가치훼손 매도는 ReentryWatch, 새 CycleId/Lot, 단계간격·만료·중복방지를 동반한다.
|
||||||
|
- 모델 루프는 Freeze → Mature → Score → Diagnose → Hypothesis → Challenger → Validate → Review → Manual Activation으로 제한한다.
|
||||||
|
- 자동 재학습·자동 승격·자동 주문을 하지 않으며 모든 활성화는 ModelCard, OOS/PBO/DSR, maker-checker, effective_at, rollback evidence를 요구한다.
|
||||||
|
|
||||||
|
## 실행 자료 규모
|
||||||
|
|
||||||
|
- 상세 WBS: 576건(기존 480 + v15 Delta 96)
|
||||||
|
- 기술부채: 124건
|
||||||
|
- Decision Log: 80건
|
||||||
|
- Traceability Matrix: 101건
|
||||||
|
- FE Component Catalogue: 43건
|
||||||
|
- Job Catalogue: 26건
|
||||||
|
|
||||||
|
## 먼저 읽을 문서
|
||||||
|
|
||||||
|
1. `docs/v15_0/K-ArtSell_Aegis_v15_0_실행완결성_표준UI_지속모델운영_통합고도화_제안서.docx`
|
||||||
|
2. `docs/v15_0/00_EXECUTIVE_CRITICAL_PROPOSAL.md`
|
||||||
|
3. `docs/v15_0/01_ROLE_BASED_BRUTAL_AUDIT.md`
|
||||||
|
4. `docs/v15_0/02_FRONTEND_STANDARD_AND_ADAPTER_V3.md`
|
||||||
|
5. `docs/v15_0/03_SCHEDULER_AND_CONTINUOUS_FEEDBACK.md`
|
||||||
|
6. `docs/v15_0/08_DETAILED_WBS_MASTER.csv`
|
||||||
|
7. `docs/v15_0/TECH_DEBT_REGISTER.csv`
|
||||||
|
|
||||||
|
## 주요 구현 경로
|
||||||
|
|
||||||
|
- FE Adapter/Wrapper: `frontend/src/shared/ui/adapter/`, `frontend/src/shared/ui/components/`
|
||||||
|
- 표준 CRUD/Layout: `frontend/src/shared/crud/`, `frontend/src/shared/ui/layouts/`
|
||||||
|
- UI 계약: `contracts/ui/ui-adapter.v3.json`, `crud-page.v1.json`, `layout-regions.v1.json`
|
||||||
|
- 스케줄 계약: `contracts/schedules/model-operations.v3.json`
|
||||||
|
- 모델운영 도메인: `src/KArtSell.Modules.ModelOperations/Domain/`
|
||||||
|
- DB Delta: `db/migrations/0020_v15_execution_and_ui_contract_hardening.sql`
|
||||||
|
- 화면/Slice 생성기: `tools/scaffold_ui_screen.py`, `tools/scaffold_vertical_slice.py`
|
||||||
|
- 원본 첨부: `attachments/current_session/`, `attachments/source_archives/`
|
||||||
|
|
||||||
|
## 현재 검증 진실성
|
||||||
|
|
||||||
|
확인 완료:
|
||||||
|
- v15 정적 패키지 검증: `PASS=1 / WARN=2 / FAIL=0`
|
||||||
|
- Python 정책 Golden: 4 tests PASS
|
||||||
|
- Scaffold 검증: 3 tests PASS
|
||||||
|
- DOCX: 18페이지 전부 렌더·육안 확인, 접근성 감사 `high=0 / medium=0 / low=0`
|
||||||
|
|
||||||
|
아직 통과로 주장하지 않는 Gate:
|
||||||
|
- `.NET 10 restore/build/test`
|
||||||
|
- `pnpm frozen install/typecheck/Vitest/build/Playwright`
|
||||||
|
- PostgreSQL DbUp fresh/upgrade/re-run/failure-recovery
|
||||||
|
- Outbox/Inbox crash/replay, DR·대사 리허설
|
||||||
|
- 최소 252거래일 Shadow, 복수 국면 OOS, PBO/DSR
|
||||||
|
|
||||||
|
위 Gate가 충족되기 전에는 생산 배포, 투자일임형, 자동주문 또는 자동 모델승격으로 해석하지 않는다.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"version": "v16.0",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"File": "K-ArtSell_퀀트투자자문_SI_본프로그램착수_누적고도화_통합실행기준서_v10.0(1).docx",
|
||||||
|
"Relative_Path": "attachments/current_session/K-ArtSell_퀀트투자자문_SI_본프로그램착수_누적고도화_통합실행기준서_v10.0(1).docx",
|
||||||
|
"Size": 402134,
|
||||||
|
"SHA256": "d86795186ec5f578741d64618eb53278a1c3a55795e73307e5bee245980a83a6",
|
||||||
|
"Role": "최상위 누적 실행기준서",
|
||||||
|
"Package": "CORE_AND_FULL",
|
||||||
|
"Treatment": "RETAINED_UNMODIFIED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"File": "K-ArtSell_Aegis_v12_1_실행준비_통합고도화_제안서(1).docx",
|
||||||
|
"Relative_Path": "attachments/current_session/K-ArtSell_Aegis_v12_1_실행준비_통합고도화_제안서(1).docx",
|
||||||
|
"Size": 64063,
|
||||||
|
"SHA256": "eab0c2866b6c3d5d1f2fd8b9fbb33443e010e1adc2cfe612f27a98f97845e8b3",
|
||||||
|
"Role": "실행준비 통합 제안서",
|
||||||
|
"Package": "CORE_AND_FULL",
|
||||||
|
"Treatment": "RETAINED_UNMODIFIED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"File": "K-ArtSell_Aegis_v15_0_통합고도화_제안서.docx",
|
||||||
|
"Relative_Path": "attachments/current_session/K-ArtSell_Aegis_v15_0_통합고도화_제안서.docx",
|
||||||
|
"Size": 52933,
|
||||||
|
"SHA256": "ef7e5746f129ecf14d1bc7d7bd5705fe44ca72251b050769506beb343e28c0a0",
|
||||||
|
"Role": "직전 통합 고도화 제안서",
|
||||||
|
"Package": "CORE_AND_FULL",
|
||||||
|
"Treatment": "RETAINED_UNMODIFIED"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"File": "KArtSell_Aegis_v15_0_Core_NoLegacy(1).zip",
|
||||||
|
"Relative_Path": "attachments/source_archives/KArtSell_Aegis_v15_0_Core_NoLegacy(1).zip",
|
||||||
|
"Size": 4390109,
|
||||||
|
"SHA256": "6c88d2442c831fa11d42726951592929caf2b5bd5847e6b42f9ad9ef28ee1b95",
|
||||||
|
"Role": "직전 Core 구현 기준선",
|
||||||
|
"Package": "FULL_ONLY",
|
||||||
|
"Treatment": "RETAINED_UNMODIFIED"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"all_match": true,
|
||||||
|
"nested_zip_policy": "CORE excludes ZIP; FULL contains one v15 Core archive"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Versioned contracts
|
||||||
|
|
||||||
|
This directory is the machine-readable contract surface for policy, event and outcome-metric definitions.
|
||||||
|
|
||||||
|
- `policies/sell-policy-contract.v1.json`: approved research-candidate implementation values; SHA-256 `a269a0331b83c0f6ec108e7587de1d20c798036ff8d0c03d726cd854e73d8480`.
|
||||||
|
- `events/signal-decision-created.v2.schema.json`: immutable outbox payload contract.
|
||||||
|
- `metrics/outcome-metrics.v1.json`: proposed metric definitions; Quant/Risk approval is still required.
|
||||||
|
|
||||||
|
The C# constants are intentionally checked against the policy JSON by `scripts/validate_v123.py`. A changed value without a Model Change record, Golden vectors and OOS impact evidence blocks G2.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "PIT Execution Envelope",
|
||||||
|
"contractVersion": "1.0",
|
||||||
|
"required": [
|
||||||
|
"asOf",
|
||||||
|
"publishedAtCutoff",
|
||||||
|
"datasetId",
|
||||||
|
"modelVersion",
|
||||||
|
"configVersion",
|
||||||
|
"codeSha",
|
||||||
|
"contractVersion",
|
||||||
|
"contentHash",
|
||||||
|
"correlationId"
|
||||||
|
],
|
||||||
|
"rules": [
|
||||||
|
"server-resolved-context",
|
||||||
|
"no-client-evidence-trust",
|
||||||
|
"append-only-evidence",
|
||||||
|
"tradable-session-cutoff"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "Projection Contract",
|
||||||
|
"contractVersion": "1.0",
|
||||||
|
"required": [
|
||||||
|
"projectionName",
|
||||||
|
"projectionVersion",
|
||||||
|
"sourceWatermark",
|
||||||
|
"builtAt",
|
||||||
|
"staleAfter",
|
||||||
|
"rebuildPolicy",
|
||||||
|
"owner"
|
||||||
|
],
|
||||||
|
"states": [
|
||||||
|
"CURRENT",
|
||||||
|
"STALE",
|
||||||
|
"REBUILDING",
|
||||||
|
"FAILED",
|
||||||
|
"QUARANTINED"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://kartsell.local/contracts/events/signal-decision-created.v2.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"action": {
|
||||||
|
"enum": [
|
||||||
|
"Hold",
|
||||||
|
"PartialSell",
|
||||||
|
"FullSell"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"createdAt": {
|
||||||
|
"format": "date-time",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"datasetId": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"decisionContractVersion": {
|
||||||
|
"const": "sell-decision.v2"
|
||||||
|
},
|
||||||
|
"decisionId": {
|
||||||
|
"format": "uuid",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"evidenceId": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"policyId": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"policyTraceSchemaVersion": {
|
||||||
|
"const": 2
|
||||||
|
},
|
||||||
|
"positionLotId": {
|
||||||
|
"format": "uuid",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"sellRatioOfLot": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"targetSecurityPortfolioWeightAfter": {
|
||||||
|
"maximum": 1,
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"decisionId",
|
||||||
|
"positionLotId",
|
||||||
|
"policyId",
|
||||||
|
"action",
|
||||||
|
"sellRatioOfLot",
|
||||||
|
"targetSecurityPortfolioWeightAfter",
|
||||||
|
"evidenceId",
|
||||||
|
"datasetId",
|
||||||
|
"decisionContractVersion",
|
||||||
|
"policyTraceSchemaVersion",
|
||||||
|
"createdAt"
|
||||||
|
],
|
||||||
|
"title": "SignalDecisionCreated v2",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"metrics": [
|
||||||
|
{
|
||||||
|
"aggregation": "quantity weighted",
|
||||||
|
"definitionVersion": "1.0.0",
|
||||||
|
"denominator": "eligible sold quantity with complete PIT total-return outcome",
|
||||||
|
"metricId": "FALSE_EXIT_63D",
|
||||||
|
"notes": "Not directly comparable to annual 2% target until annualization and cohort rules are approved",
|
||||||
|
"numerator": "sold quantity whose benchmark-adjusted total return from decision price to window end is positive beyond approved materiality threshold",
|
||||||
|
"population": "non-hard sell decisions",
|
||||||
|
"windowTradingSessions": 63
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation": "watch count",
|
||||||
|
"definitionVersion": "1.0.0",
|
||||||
|
"denominator": "eligible watches with complete observations",
|
||||||
|
"metricId": "REENTRY_CAPTURE_126D",
|
||||||
|
"minimumTarget": 0.65,
|
||||||
|
"numerator": "eligible watches that create an approved stage before expiry",
|
||||||
|
"population": "reentry-eligible sell decisions",
|
||||||
|
"windowTradingSessions": 126
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation": "count",
|
||||||
|
"definitionVersion": "1.0.0",
|
||||||
|
"denominator": "not applicable",
|
||||||
|
"maximumTarget": 0,
|
||||||
|
"metricId": "DUPLICATE_STAGE_COUNT",
|
||||||
|
"numerator": "duplicate execution attempts accepted",
|
||||||
|
"population": "all reentry stages"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"registryVersion": "outcome-metrics.v1",
|
||||||
|
"status": "PROPOSED_REQUIRES_QUANT_RISK_APPROVAL"
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "outcome-metrics.v2",
|
||||||
|
"status": "PROPOSED",
|
||||||
|
"commonRules": {
|
||||||
|
"pointInTime": true,
|
||||||
|
"revisionAware": true,
|
||||||
|
"costs": ["fee", "tax", "fx", "slippage"],
|
||||||
|
"windowsTradingDays": [1, 5, 20, 63, 126, 252],
|
||||||
|
"attribution": ["recommendation", "publication", "clientDecision", "execution"]
|
||||||
|
},
|
||||||
|
"metrics": [
|
||||||
|
{
|
||||||
|
"metricCode": "OPERATIONAL_INTEGRITY_ERRORS",
|
||||||
|
"numerator": "count of duplicate, lookahead, unauthorized publication, unreconciled critical breaks and immutable-evidence violations",
|
||||||
|
"denominator": "one evaluation run",
|
||||||
|
"aggregation": "sum",
|
||||||
|
"threshold": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metricCode": "FALSE_EXIT_ANNUAL_RATE",
|
||||||
|
"numerator": "eligible non-impairment exits followed by approved adverse-regret condition within the versioned evaluation window",
|
||||||
|
"denominator": "all eligible non-impairment exits in the same cohort",
|
||||||
|
"aggregation": "annualized cohort ratio",
|
||||||
|
"threshold": "<=0.02",
|
||||||
|
"decisionRequired": "The exact adverse-regret price and benchmark definition must be approved before production use."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metricCode": "REENTRY_CAPTURE_RATE",
|
||||||
|
"numerator": "eligible exits whose versioned reentry contract produced a valid stage-ready observation within 126 trading days",
|
||||||
|
"denominator": "all eligible non-impairment exits with complete data",
|
||||||
|
"aggregation": "cohort ratio",
|
||||||
|
"threshold": ">=0.65"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metricCode": "NET_EXPECTED_UTILITY",
|
||||||
|
"numerator": "realized or calibrated expected benefit after risk, fee, tax, FX, slippage and reentry option loss",
|
||||||
|
"denominator": "one evaluated decision or cohort",
|
||||||
|
"aggregation": "mean with confidence interval",
|
||||||
|
"threshold": ">0 and lower confidence bound >0 for opportunity replacement"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metricCode": "PBO",
|
||||||
|
"numerator": "CSCV combinations where in-sample winner underperforms out of sample",
|
||||||
|
"denominator": "all approved CSCV combinations",
|
||||||
|
"aggregation": "probability",
|
||||||
|
"threshold": "<=0.20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metricCode": "DSR",
|
||||||
|
"numerator": "deflated performance statistic adjusted for multiple testing and non-normality",
|
||||||
|
"denominator": "approved experiment registry",
|
||||||
|
"aggregation": "probability/confidence",
|
||||||
|
"threshold": ">=0.95"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "Model Evaluation and Promotion Contract v2",
|
||||||
|
"contractVersion": "2.0",
|
||||||
|
"promotionMode": "HUMAN_CHANGE_APPROVAL_ONLY",
|
||||||
|
"automaticActivation": false,
|
||||||
|
"automaticOrder": false,
|
||||||
|
"requiredEvidence": [
|
||||||
|
"252-trading-session-shadow",
|
||||||
|
"multiple-regimes",
|
||||||
|
"calibration",
|
||||||
|
"sell-reentry-attribution",
|
||||||
|
"PBO",
|
||||||
|
"DSR",
|
||||||
|
"double-cost-positive",
|
||||||
|
"independent-validation",
|
||||||
|
"rollback-evidence",
|
||||||
|
"operations-integrity"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "1.0.0",
|
||||||
|
"classes": [
|
||||||
|
{"code":"SOURCE","description":"Original source, license, schema or policy evidence"},
|
||||||
|
{"code":"RUNTIME","description":"Build, test, migration, performance or operational evidence"},
|
||||||
|
{"code":"RESEARCH","description":"Frozen backtest, OOS, calibration, PBO/DSR or model-comparison evidence"},
|
||||||
|
{"code":"RELEASE","description":"Approved release bundle with required runtime and governance artifacts"},
|
||||||
|
{"code":"AUDIT","description":"Immutable decision, review, correction and chain-of-custody evidence"}
|
||||||
|
],
|
||||||
|
"statusTransitions": {
|
||||||
|
"IMPLEMENTATION_TEMPLATE": ["STATIC_VALIDATED"],
|
||||||
|
"STATIC_VALIDATED": ["BUILD_VALIDATED"],
|
||||||
|
"BUILD_VALIDATED": ["DB_REHEARSED"],
|
||||||
|
"DB_REHEARSED": ["SHADOW_READY"],
|
||||||
|
"SHADOW_READY": ["PILOT_REVIEW_REQUIRED"]
|
||||||
|
},
|
||||||
|
"forbiddenShortcut": "No state may be inferred from file presence or document version number."
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "promotion-gate.v1",
|
||||||
|
"status": "PROPOSED",
|
||||||
|
"boundary": "EVIDENCE_ONLY_NO_AUTO_PROMOTION",
|
||||||
|
"thresholds": {
|
||||||
|
"minimumShadowTradingDays": 252,
|
||||||
|
"preferredShadowTradingDays": 504,
|
||||||
|
"minimumDistinctRegimes": 2,
|
||||||
|
"maximumFalseExitAnnualRate": 0.02,
|
||||||
|
"minimumReentryCaptureRate": 0.65,
|
||||||
|
"maximumPbo": 0.20,
|
||||||
|
"minimumDsr": 0.95,
|
||||||
|
"positiveNetExpectedUtility": true,
|
||||||
|
"positiveUnderDoubleCost": true,
|
||||||
|
"operationalIntegrityErrors": 0,
|
||||||
|
"calibrationStable": true
|
||||||
|
},
|
||||||
|
"mandatoryApprovals": [
|
||||||
|
"IndependentValidation",
|
||||||
|
"Risk",
|
||||||
|
"InvestmentCommittee",
|
||||||
|
"Compliance",
|
||||||
|
"Security",
|
||||||
|
"Operations"
|
||||||
|
],
|
||||||
|
"forbiddenActions": [
|
||||||
|
"automatic model activation",
|
||||||
|
"automatic threshold change",
|
||||||
|
"automatic order submission",
|
||||||
|
"KIS submission"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"changeControl": "MODEL_CHANGE_AND_GOLDEN_OOS_REQUIRED",
|
||||||
|
"contractVersion": "sell-policy.v1",
|
||||||
|
"decisionContractVersion": "sell-decision.v2",
|
||||||
|
"policies": [
|
||||||
|
{
|
||||||
|
"condition": "approved hard impairment",
|
||||||
|
"documentedRange": [
|
||||||
|
0.8,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": true,
|
||||||
|
"policyId": "ALG-SELL-001",
|
||||||
|
"priority": 1000,
|
||||||
|
"reentryEligible": false,
|
||||||
|
"requestedSellRatioOfLot": 1.0,
|
||||||
|
"terminal": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "capital floor breached",
|
||||||
|
"decisionRequired": "Whether portfolio survival bypasses same-direction cooldown",
|
||||||
|
"mayCrossStrategicCore": true,
|
||||||
|
"policyId": "ALG-SELL-PORT-001",
|
||||||
|
"priority": 900,
|
||||||
|
"ratioSource": "server PIT risk context",
|
||||||
|
"reentryEligible": true,
|
||||||
|
"terminal": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": {
|
||||||
|
"gapBelowFloorAtrGte": 1.5
|
||||||
|
},
|
||||||
|
"documentedRange": [
|
||||||
|
0.3,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-002",
|
||||||
|
"priority": 800,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedSellRatioOfLot": 0.4,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": {
|
||||||
|
"consecutiveCloseBreachesGte": 2
|
||||||
|
},
|
||||||
|
"documentedRange": [
|
||||||
|
0.15,
|
||||||
|
0.25
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-003",
|
||||||
|
"priority": 700,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedSellRatioOfLot": 0.2,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "approved concentration/liquidity excess ratio > 0",
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-004",
|
||||||
|
"priority": 600,
|
||||||
|
"ratioSource": "server PIT portfolio risk context",
|
||||||
|
"reentryEligible": true,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "opportunity edge lower bound > 0 and requested ratio > 0",
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-005",
|
||||||
|
"priority": 500,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedRange": [
|
||||||
|
0.1,
|
||||||
|
0.25
|
||||||
|
],
|
||||||
|
"terminal": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"policyTraceSchemaVersion": 2,
|
||||||
|
"status": "RESEARCH_CANDIDATE_NOT_PRODUCTION"
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "1.0.0",
|
||||||
|
"boundary": "EVIDENCE_ONLY_NO_AUTO_MODEL_OR_ORDER_MUTATION",
|
||||||
|
"dispatcher": {
|
||||||
|
"enabledByDefault": false,
|
||||||
|
"defaultCronUtc": "*/15 * * * *",
|
||||||
|
"leaseMinutes": 14,
|
||||||
|
"batchLimit": 50,
|
||||||
|
"requiresCapability": "ShadowEvaluation"
|
||||||
|
},
|
||||||
|
"operations": [
|
||||||
|
{"code":"J25","name":"SourceContractDriftCheck","cadence":"DAILY","mode":"EVALUATION_ONLY","queue":"q-evaluation","enabledByDefault":false},
|
||||||
|
{"code":"J26","name":"MarketCalendarCompletenessCheck","cadence":"DAILY","mode":"EVALUATION_ONLY","queue":"q-market-data","enabledByDefault":false},
|
||||||
|
{"code":"J27","name":"EvidenceChainAudit","cadence":"DAILY","mode":"EVALUATION_ONLY","queue":"q-control","enabledByDefault":false},
|
||||||
|
{"code":"J28","name":"ProjectionFreshnessCheck","cadence":"DAILY","mode":"EVALUATION_ONLY","queue":"q-evaluation","enabledByDefault":false},
|
||||||
|
{"code":"J29","name":"CapacitySlaTrend","cadence":"WEEKLY","mode":"EVALUATION_ONLY","queue":"q-control","enabledByDefault":false},
|
||||||
|
{"code":"J30","name":"ReleaseEvidenceAssemble","cadence":"EVENT_DRIVEN","mode":"PROPOSAL_ONLY","queue":"q-control","enabledByDefault":false}
|
||||||
|
],
|
||||||
|
"forbiddenEffects": [
|
||||||
|
"MODEL_VERSION_ACTIVATION",
|
||||||
|
"MODEL_CONFIGURATION_MUTATION",
|
||||||
|
"CODE_MERGE",
|
||||||
|
"CLIENT_PUBLICATION",
|
||||||
|
"BROKER_ORDER_SUBMISSION",
|
||||||
|
"KIS_SUBMISSION"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "Scheduled Execution Ledger",
|
||||||
|
"contractVersion": "1.0",
|
||||||
|
"required": [
|
||||||
|
"operationCode",
|
||||||
|
"scopeKey",
|
||||||
|
"scheduledFor",
|
||||||
|
"dispatchRevision",
|
||||||
|
"leaseToken",
|
||||||
|
"idempotencyKey",
|
||||||
|
"versionSet",
|
||||||
|
"state",
|
||||||
|
"reasonCode",
|
||||||
|
"heartbeatAt"
|
||||||
|
],
|
||||||
|
"states": [
|
||||||
|
"REQUESTED",
|
||||||
|
"LEASED",
|
||||||
|
"RUNNING",
|
||||||
|
"SUCCEEDED",
|
||||||
|
"BUSINESS_HOLD",
|
||||||
|
"FAILED",
|
||||||
|
"QUARANTINED",
|
||||||
|
"ABANDONED"
|
||||||
|
],
|
||||||
|
"rules": [
|
||||||
|
"fencing-token-required",
|
||||||
|
"scheduled-for-anchor",
|
||||||
|
"no-blind-retry",
|
||||||
|
"terminal-state-immutable",
|
||||||
|
"manual-model-activation-only"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "model-operations.v1",
|
||||||
|
"status": "IMPLEMENTATION_TEMPLATE",
|
||||||
|
"algorithmStatus": "RESEARCH_CANDIDATE_NOT_PRODUCTION",
|
||||||
|
"dispatcher": {
|
||||||
|
"jobId": "model-operations-dispatcher-v1",
|
||||||
|
"cadence": "EVERY_15_MINUTES",
|
||||||
|
"queue": "q-control",
|
||||||
|
"leaseMinutes": 14,
|
||||||
|
"batchLimit": 50
|
||||||
|
},
|
||||||
|
"automationBoundary": {
|
||||||
|
"allowed": ["EVALUATION_ONLY", "PROPOSAL_ONLY", "DRILL_ONLY"],
|
||||||
|
"forbidden": ["AUTO_PROMOTE", "AUTO_ROLLBACK", "AUTO_PARAMETER_CHANGE", "AUTO_ORDER", "KIS_SUBMISSION"]
|
||||||
|
},
|
||||||
|
"operations": [
|
||||||
|
{"operationCode":"J10","name":"OutcomeEvaluationRun","cadence":"DAILY","queue":"q-evaluation","mode":"EVALUATION_ONLY","gate":"G3"},
|
||||||
|
{"operationCode":"J11","name":"DailyScorecardBuild","cadence":"DAILY","queue":"q-evaluation","mode":"EVALUATION_ONLY","gate":"G3"},
|
||||||
|
{"operationCode":"J17","name":"DriftDetectionRun","cadence":"DAILY","queue":"q-evaluation","mode":"EVALUATION_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J18","name":"ChampionChallengerEvaluation","cadence":"WEEKLY","queue":"q-evaluation","mode":"EVALUATION_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J19","name":"FrozenOosBacktest","cadence":"MONTHLY","queue":"q-research","mode":"EVALUATION_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J20","name":"RobustnessPboDsrRun","cadence":"QUARTERLY","queue":"q-research","mode":"EVALUATION_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J21","name":"ModelImprovementProposalBuild","cadence":"MONTHLY","queue":"q-research","mode":"PROPOSAL_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J22","name":"PromotionEvidenceReviewBuild","cadence":"MONTHLY","queue":"q-control","mode":"PROPOSAL_ONLY","gate":"G4"},
|
||||||
|
{"operationCode":"J23","name":"ModelRollbackDrill","cadence":"QUARTERLY","queue":"q-control","mode":"DRILL_ONLY","gate":"G5"},
|
||||||
|
{"operationCode":"J24","name":"DataRevisionRevalidation","cadence":"WEEKLY","queue":"q-backfill","mode":"EVALUATION_ONLY","gate":"G3"}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "model-operations.v2",
|
||||||
|
"status": "IMPLEMENTATION_TEMPLATE",
|
||||||
|
"algorithmStatus": "RESEARCH_CANDIDATE_NOT_PRODUCTION",
|
||||||
|
"dispatcher": {
|
||||||
|
"jobId": "model-operations-dispatcher-v1",
|
||||||
|
"cadence": "EVERY_15_MINUTES",
|
||||||
|
"queue": "q-control",
|
||||||
|
"leaseMinutes": 14,
|
||||||
|
"batchLimit": 50,
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
"automationBoundary": {
|
||||||
|
"allowed": [
|
||||||
|
"EVALUATION_ONLY",
|
||||||
|
"PROPOSAL_ONLY",
|
||||||
|
"DRILL_ONLY"
|
||||||
|
],
|
||||||
|
"forbidden": [
|
||||||
|
"AUTO_PROMOTE",
|
||||||
|
"AUTO_ROLLBACK",
|
||||||
|
"AUTO_PARAMETER_CHANGE",
|
||||||
|
"AUTO_ORDER",
|
||||||
|
"KIS_SUBMISSION",
|
||||||
|
"CLIENT_PUBLICATION"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"evaluationClock": {
|
||||||
|
"predictionFreeze": "before approved market cutoff",
|
||||||
|
"labelMaturity": "trading-session windows 1/5/20/63/126/252",
|
||||||
|
"revisionPolicy": "new revision; never overwrite prior evidence"
|
||||||
|
},
|
||||||
|
"operations": [
|
||||||
|
{
|
||||||
|
"operationCode": "J31",
|
||||||
|
"name": "PredictionFreezeRun",
|
||||||
|
"cadence": "DAILY",
|
||||||
|
"queue": "q-evaluation",
|
||||||
|
"mode": "EVALUATION_ONLY",
|
||||||
|
"gate": "G3",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J32",
|
||||||
|
"name": "OutcomeMaturitySweep",
|
||||||
|
"cadence": "DAILY",
|
||||||
|
"queue": "q-evaluation",
|
||||||
|
"mode": "EVALUATION_ONLY",
|
||||||
|
"gate": "G3",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J33",
|
||||||
|
"name": "SellReentryAttributionReview",
|
||||||
|
"cadence": "WEEKLY",
|
||||||
|
"queue": "q-evaluation",
|
||||||
|
"mode": "EVALUATION_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J34",
|
||||||
|
"name": "CalibrationRegimeReview",
|
||||||
|
"cadence": "WEEKLY",
|
||||||
|
"queue": "q-evaluation",
|
||||||
|
"mode": "EVALUATION_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J35",
|
||||||
|
"name": "ImprovementHypothesisBuild",
|
||||||
|
"cadence": "MONTHLY",
|
||||||
|
"queue": "q-research",
|
||||||
|
"mode": "PROPOSAL_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J36",
|
||||||
|
"name": "ChallengerExperimentPlan",
|
||||||
|
"cadence": "MONTHLY",
|
||||||
|
"queue": "q-research",
|
||||||
|
"mode": "PROPOSAL_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J37",
|
||||||
|
"name": "IndependentValidationPack",
|
||||||
|
"cadence": "QUARTERLY",
|
||||||
|
"queue": "q-control",
|
||||||
|
"mode": "PROPOSAL_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J38",
|
||||||
|
"name": "ModelPolicyDebtReview",
|
||||||
|
"cadence": "MONTHLY",
|
||||||
|
"queue": "q-control",
|
||||||
|
"mode": "PROPOSAL_ONLY",
|
||||||
|
"gate": "G5",
|
||||||
|
"enabledByDefault": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operationCode": "J39",
|
||||||
|
"name": "FeedbackCycleIntegrityAudit",
|
||||||
|
"cadence": "DAILY",
|
||||||
|
"queue": "q-control",
|
||||||
|
"mode": "EVALUATION_ONLY",
|
||||||
|
"gate": "G4",
|
||||||
|
"enabledByDefault": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "model-operations.v3",
|
||||||
|
"status": "IMPLEMENTATION_TEMPLATE",
|
||||||
|
"algorithmStatus": "RESEARCH_CANDIDATE_NOT_PRODUCTION",
|
||||||
|
"dispatcher": {"jobId":"model-operations-dispatcher-v1","cadence":"EVERY_15_MINUTES","queue":"q-control","leaseMinutes":14,"batchLimit":50,"enabledByDefault":false},
|
||||||
|
"scheduleSemantics": {
|
||||||
|
"anchor":"next due time advances from scheduledFor, not worker dispatch time",
|
||||||
|
"timezone":"IANA/approved calendar mapping; UTC storage",
|
||||||
|
"catchUpPolicies":["LATEST_ONLY","SKIP_MISSED","ALL_WITH_LIMIT"],
|
||||||
|
"businessHold":"no blind retry; reason, owner, holdUntil and evidence required",
|
||||||
|
"idempotency":"operation:scope:scheduleVersion:scheduledForUtc"
|
||||||
|
},
|
||||||
|
"executionStates":["REQUESTED","RUNNING","SUCCEEDED","BUSINESS_HOLD","FAILED","QUARANTINED"],
|
||||||
|
"evaluationWindows":[1,5,20,63,126,252],
|
||||||
|
"automationBoundary": {
|
||||||
|
"allowed":["EVALUATION_ONLY","PROPOSAL_ONLY","DRILL_ONLY"],
|
||||||
|
"forbidden":["AUTO_PROMOTE","AUTO_ROLLBACK","AUTO_PARAMETER_CHANGE","AUTO_ORDER","KIS_SUBMISSION","CLIENT_PUBLICATION"]
|
||||||
|
},
|
||||||
|
"newOperation": {"operationCode":"J40","name":"EvaluationWindowIntegrityAudit","enabledByDefault":false,"mode":"EVALUATION_ONLY","gate":"G4"}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "crud-page.v1",
|
||||||
|
"stateOwners": {"server":"TanStack Query","form":"vee-validate + Zod","url":"vue-router","sessionAndUiPreference":"Pinia"},
|
||||||
|
"requiredRequestHeaders": ["Idempotency-Key for commands", "If-Match for updates where concurrency applies", "X-Correlation-Id"],
|
||||||
|
"requiredResponseMetadata": ["asOf", "projectionVersion", "stale", "watermark where applicable"],
|
||||||
|
"listQuery": ["page", "pageSize", "search", "sort[]", "filter[]"],
|
||||||
|
"failureStates": ["LOADING","EMPTY","WARN","ERROR","UNAUTHORIZED","FORBIDDEN","PARTIAL","DIRTY","CONFLICT","EXPIRED","READONLY","PROCESSING"],
|
||||||
|
"forbidden": ["server data duplicated in Pinia", "vendor grid state stored in domain feature", "silent overwrite after 409/412", "delete without reason and audit"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "K-ArtSell CRUD Resource Contract v2",
|
||||||
|
"contractVersion": "2.0",
|
||||||
|
"required": [
|
||||||
|
"resourceId",
|
||||||
|
"querySchemaVersion",
|
||||||
|
"responseSchemaVersion",
|
||||||
|
"permissionPolicy",
|
||||||
|
"concurrencyMode",
|
||||||
|
"idempotencyMode",
|
||||||
|
"sensitiveFields"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"concurrencyMode": {
|
||||||
|
"enum": [
|
||||||
|
"NONE",
|
||||||
|
"ETAG_IF_MATCH"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"idempotencyMode": {
|
||||||
|
"enum": [
|
||||||
|
"NONE",
|
||||||
|
"IDEMPOTENCY_KEY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"queryOwnership": {
|
||||||
|
"const": "VUE_ROUTER"
|
||||||
|
},
|
||||||
|
"serverStateOwnership": {
|
||||||
|
"const": "TANSTACK_QUERY"
|
||||||
|
},
|
||||||
|
"formOwnership": {
|
||||||
|
"const": "VEE_VALIDATE_ZOD"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"contractVersion":"layout-regions.v1",
|
||||||
|
"regions":["Header","Summary","Filter","Main","SidePanel","ActionBar","AuditHelp"],
|
||||||
|
"rules":["one h1 per page","actions remain visible without covering content","evidence context is visible","responsive order follows task order","operation screens expose run status and watermark"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "2.0",
|
||||||
|
"templates": [
|
||||||
|
{ "id": "T01", "component": "SearchListCrudPage", "purpose": "search/list CRUD" },
|
||||||
|
{ "id": "T02", "component": "DetailReadPage", "purpose": "read-only detail with evidence" },
|
||||||
|
{ "id": "T03", "component": "EditFormPage", "purpose": "create/update form" },
|
||||||
|
{ "id": "T04", "component": "MasterDetailCrudPage", "purpose": "master-detail CRUD" },
|
||||||
|
{ "id": "T05", "component": "ApprovalWorkbenchPage", "purpose": "maker-checker review" },
|
||||||
|
{ "id": "T06", "component": "StepWizardPage", "purpose": "multi-step workflow" },
|
||||||
|
{ "id": "T07", "component": "ScorecardDashboardPage", "purpose": "dashboard and scorecard" },
|
||||||
|
{ "id": "T08", "component": "BatchOperationsPageV2", "purpose": "batch and data operations" },
|
||||||
|
{ "id": "T09", "component": "ReconciliationExceptionPage", "purpose": "reconciliation and correction" },
|
||||||
|
{ "id": "T10", "component": "VersionGovernancePage", "purpose": "version comparison and governance" }
|
||||||
|
],
|
||||||
|
"mandatoryCrossCutting": [
|
||||||
|
"loading/empty/warn/error/unauthorized/partial states",
|
||||||
|
"as-of and version evidence",
|
||||||
|
"permission boundary",
|
||||||
|
"correlation and audit link",
|
||||||
|
"responsive and keyboard operation"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "2.0",
|
||||||
|
"requiredCapabilities": [
|
||||||
|
"button", "text-field", "text-area", "select", "checkbox",
|
||||||
|
"date-field", "number-field", "dialog", "status-tag", "data-grid"
|
||||||
|
],
|
||||||
|
"providers": [
|
||||||
|
{ "id": "primevue-aggrid", "productionEligible": true, "selection": "VITE_UI_ADAPTER=primevue" },
|
||||||
|
{ "id": "native-accessible", "productionEligible": false, "selection": "VITE_UI_ADAPTER=native" }
|
||||||
|
],
|
||||||
|
"featureImportRule": "Feature code imports only from @/shared/ui/components, @/shared/ui/layouts or @/shared/ui/screen-types.",
|
||||||
|
"replacementGate": [
|
||||||
|
"adapter contract tests", "accessibility keyboard tests", "visual regression",
|
||||||
|
"screen-state matrix", "large-list performance", "security review"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"contractVersion": "3.0",
|
||||||
|
"status": "CURRENT",
|
||||||
|
"principle": "Feature code depends on normalized K-ArtSell contracts, never vendor props or events.",
|
||||||
|
"requiredCapabilities": ["button","text-field","text-area","select","multi-select","checkbox","date-field","number-field","dialog","status-tag","inline-message","paginator","tabs","data-grid"],
|
||||||
|
"providers": [
|
||||||
|
{"id":"primevue-aggrid","productionEligible":true,"boundary":"frontend/src/shared/ui/adapter/primevue"},
|
||||||
|
{"id":"native-accessible","productionEligible":false,"purpose":"reference and contract conformance"}
|
||||||
|
],
|
||||||
|
"forbidden": ["vendor import outside provider", "pass-through of unreviewed vendor props", "vendor-specific state in feature store", "silent fallback when capability is missing"],
|
||||||
|
"acceptance": ["contract conformance", "keyboard and label tests", "T01-T10 state matrix", "server paging and sorting contract", "visual regression", "accessibility review"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "K-ArtSell UI Adapter Contract v4",
|
||||||
|
"contractVersion": "4.0",
|
||||||
|
"status": "IMPLEMENTATION_TEMPLATE",
|
||||||
|
"requiredCapabilities": [
|
||||||
|
"button",
|
||||||
|
"text-field",
|
||||||
|
"text-area",
|
||||||
|
"select",
|
||||||
|
"multi-select",
|
||||||
|
"checkbox",
|
||||||
|
"date-field",
|
||||||
|
"number-field",
|
||||||
|
"dialog",
|
||||||
|
"status-tag",
|
||||||
|
"inline-message",
|
||||||
|
"paginator",
|
||||||
|
"tabs",
|
||||||
|
"data-grid"
|
||||||
|
],
|
||||||
|
"requiredEvidence": [
|
||||||
|
"contract-conformance",
|
||||||
|
"keyboard-focus",
|
||||||
|
"accessible-name",
|
||||||
|
"t01-t10-state-regression",
|
||||||
|
"provider-switch-smoke",
|
||||||
|
"visual-regression",
|
||||||
|
"performance-budget",
|
||||||
|
"rollback-rehearsal"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"featureVendorImports": 0,
|
||||||
|
"unknownCapability": "FAIL_FAST",
|
||||||
|
"unsupportedContract": "FAIL_FAST",
|
||||||
|
"providerSelection": "STARTUP_ONLY",
|
||||||
|
"mutableGlobalProviderSwitch": false,
|
||||||
|
"normalizedSemantics": [
|
||||||
|
"disabled",
|
||||||
|
"invalid",
|
||||||
|
"busy",
|
||||||
|
"aria-describedby",
|
||||||
|
"stable-events"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
create schema if not exists building_blocks;
|
||||||
|
create schema if not exists signal_engine;
|
||||||
|
|
||||||
|
create table if not exists building_blocks.outbox_message (
|
||||||
|
message_id uuid primary key,
|
||||||
|
event_type text not null,
|
||||||
|
schema_version integer not null check (schema_version > 0),
|
||||||
|
payload_json jsonb not null,
|
||||||
|
correlation_id text not null,
|
||||||
|
occurred_at timestamptz not null,
|
||||||
|
payload_hash text not null,
|
||||||
|
published_at timestamptz null,
|
||||||
|
attempt integer not null default 0
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists building_blocks.inbox_message (
|
||||||
|
consumer text not null,
|
||||||
|
message_id uuid not null,
|
||||||
|
received_at timestamptz not null,
|
||||||
|
payload_hash text not null,
|
||||||
|
primary key (consumer, message_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists building_blocks.job_run (
|
||||||
|
job_run_id uuid primary key,
|
||||||
|
job_type text not null,
|
||||||
|
job_version integer not null,
|
||||||
|
scope_key text not null,
|
||||||
|
idempotency_key text not null unique,
|
||||||
|
watermark text null,
|
||||||
|
app_version text not null,
|
||||||
|
model_version text null,
|
||||||
|
config_version text null,
|
||||||
|
data_version text null,
|
||||||
|
contract_version text null,
|
||||||
|
status text not null,
|
||||||
|
input_hash text null,
|
||||||
|
output_hash text null,
|
||||||
|
started_at timestamptz null,
|
||||||
|
heartbeat_at timestamptz null,
|
||||||
|
finished_at timestamptz null,
|
||||||
|
error_code text null,
|
||||||
|
trace_id text null
|
||||||
|
);
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
create table if not exists signal_engine.evidence_snapshot (
|
||||||
|
evidence_id text primary key,
|
||||||
|
as_of timestamptz not null,
|
||||||
|
published_at_cutoff timestamptz not null,
|
||||||
|
dataset_id text not null,
|
||||||
|
data_hash text not null,
|
||||||
|
model_version text not null,
|
||||||
|
config_version text not null,
|
||||||
|
payload jsonb not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null default now()
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists signal_engine.signal_decision (
|
||||||
|
decision_id uuid primary key,
|
||||||
|
lot_id uuid not null,
|
||||||
|
cycle_id uuid not null,
|
||||||
|
evidence_id text not null references signal_engine.evidence_snapshot(evidence_id),
|
||||||
|
action text not null,
|
||||||
|
sell_fraction numeric(9,6) not null check (sell_fraction between 0 and 1),
|
||||||
|
policy_id text not null,
|
||||||
|
priority integer not null,
|
||||||
|
reason_code text not null,
|
||||||
|
reentry_eligible boolean not null,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
decision_hash text not null unique
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists signal_engine.reentry_watch (
|
||||||
|
watch_id uuid primary key,
|
||||||
|
sell_decision_id uuid not null unique references signal_engine.signal_decision(decision_id),
|
||||||
|
prior_cycle_id uuid not null,
|
||||||
|
state text not null,
|
||||||
|
minimum_wait_sessions integer not null check (minimum_wait_sessions >= 0),
|
||||||
|
minimum_spacing_sessions integer not null check (minimum_spacing_sessions >= 0),
|
||||||
|
expires_after_sessions integer not null check (expires_after_sessions > 0),
|
||||||
|
created_at timestamptz not null
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists signal_engine.reentry_stage (
|
||||||
|
watch_id uuid not null references signal_engine.reentry_watch(watch_id),
|
||||||
|
stage_no integer not null,
|
||||||
|
target_fraction numeric(9,6) not null check (target_fraction > 0 and target_fraction <= 1),
|
||||||
|
status text not null,
|
||||||
|
eligible_at timestamptz null,
|
||||||
|
executed_cycle_id uuid null,
|
||||||
|
primary key (watch_id, stage_no)
|
||||||
|
);
|
||||||
|
|
||||||
|
create or replace function signal_engine.prevent_immutable_change()
|
||||||
|
returns trigger language plpgsql as $$
|
||||||
|
begin
|
||||||
|
raise exception 'immutable evidence/decision rows cannot be updated or deleted';
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
drop trigger if exists evidence_snapshot_immutable on signal_engine.evidence_snapshot;
|
||||||
|
create trigger evidence_snapshot_immutable
|
||||||
|
before update or delete on signal_engine.evidence_snapshot
|
||||||
|
for each row execute function signal_engine.prevent_immutable_change();
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
-- v11.1 hardening delta. Do not edit prior migrations.
|
||||||
|
|
||||||
|
create index if not exists ix_outbox_pending
|
||||||
|
on building_blocks.outbox_message (occurred_at, message_id)
|
||||||
|
where published_at is null;
|
||||||
|
|
||||||
|
create index if not exists ix_job_run_status_started
|
||||||
|
on building_blocks.job_run (status, started_at);
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
add constraint ck_signal_decision_policy_id_not_blank
|
||||||
|
check (length(trim(policy_id)) > 0) not valid;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
validate constraint ck_signal_decision_policy_id_not_blank;
|
||||||
|
|
||||||
|
drop trigger if exists signal_decision_immutable on signal_engine.signal_decision;
|
||||||
|
create trigger signal_decision_immutable
|
||||||
|
before update or delete on signal_engine.signal_decision
|
||||||
|
for each row execute function signal_engine.prevent_immutable_change();
|
||||||
|
|
||||||
|
create unique index if not exists ux_reentry_stage_executed_cycle
|
||||||
|
on signal_engine.reentry_stage (executed_cycle_id)
|
||||||
|
where executed_cycle_id is not null;
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
-- v12.0 integrated hardening delta. Prior migrations remain immutable.
|
||||||
|
|
||||||
|
-- Rename ambiguous columns while preserving existing data.
|
||||||
|
do $$
|
||||||
|
begin
|
||||||
|
if exists (
|
||||||
|
select 1 from information_schema.columns
|
||||||
|
where table_schema = 'signal_engine'
|
||||||
|
and table_name = 'signal_decision'
|
||||||
|
and column_name = 'lot_id'
|
||||||
|
) and not exists (
|
||||||
|
select 1 from information_schema.columns
|
||||||
|
where table_schema = 'signal_engine'
|
||||||
|
and table_name = 'signal_decision'
|
||||||
|
and column_name = 'position_lot_id'
|
||||||
|
) then
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
rename column lot_id to position_lot_id;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if exists (
|
||||||
|
select 1 from information_schema.columns
|
||||||
|
where table_schema = 'signal_engine'
|
||||||
|
and table_name = 'signal_decision'
|
||||||
|
and column_name = 'sell_fraction'
|
||||||
|
) and not exists (
|
||||||
|
select 1 from information_schema.columns
|
||||||
|
where table_schema = 'signal_engine'
|
||||||
|
and table_name = 'signal_decision'
|
||||||
|
and column_name = 'sell_ratio_of_lot'
|
||||||
|
) then
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
rename column sell_fraction to sell_ratio_of_lot;
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
add column if not exists target_portfolio_weight_after numeric(12,8),
|
||||||
|
add column if not exists dataset_id text,
|
||||||
|
add column if not exists model_version text,
|
||||||
|
add column if not exists config_version text,
|
||||||
|
add column if not exists code_sha text,
|
||||||
|
add column if not exists idempotency_key text,
|
||||||
|
add column if not exists correlation_id text;
|
||||||
|
|
||||||
|
update signal_engine.signal_decision d
|
||||||
|
set dataset_id = coalesce(d.dataset_id, e.dataset_id),
|
||||||
|
model_version = coalesce(d.model_version, e.model_version),
|
||||||
|
config_version = coalesce(d.config_version, e.config_version),
|
||||||
|
code_sha = coalesce(d.code_sha, 'LEGACY_UNKNOWN'),
|
||||||
|
target_portfolio_weight_after = coalesce(d.target_portfolio_weight_after, 0),
|
||||||
|
idempotency_key = coalesce(d.idempotency_key, 'legacy:' || d.decision_id::text),
|
||||||
|
correlation_id = coalesce(d.correlation_id, 'legacy:' || d.decision_id::text)
|
||||||
|
from signal_engine.evidence_snapshot e
|
||||||
|
where e.evidence_id = d.evidence_id;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
alter column target_portfolio_weight_after set not null,
|
||||||
|
alter column dataset_id set not null,
|
||||||
|
alter column model_version set not null,
|
||||||
|
alter column config_version set not null,
|
||||||
|
alter column code_sha set not null,
|
||||||
|
alter column idempotency_key set not null,
|
||||||
|
alter column correlation_id set not null;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
drop constraint if exists ck_signal_decision_sell_ratio_of_lot,
|
||||||
|
add constraint ck_signal_decision_sell_ratio_of_lot
|
||||||
|
check (sell_ratio_of_lot between 0 and 1),
|
||||||
|
drop constraint if exists ck_signal_decision_target_weight,
|
||||||
|
add constraint ck_signal_decision_target_weight
|
||||||
|
check (target_portfolio_weight_after between 0 and 1);
|
||||||
|
|
||||||
|
create unique index if not exists ux_signal_decision_idempotency
|
||||||
|
on signal_engine.signal_decision (idempotency_key);
|
||||||
|
|
||||||
|
create index if not exists ix_signal_decision_lot_created
|
||||||
|
on signal_engine.signal_decision (position_lot_id, created_at desc);
|
||||||
|
|
||||||
|
-- Rebuildable, versioned read model. It is populated only by approved upstream slices.
|
||||||
|
create table if not exists signal_engine.sell_decision_context (
|
||||||
|
context_id uuid primary key,
|
||||||
|
position_lot_id uuid not null,
|
||||||
|
cycle_id uuid not null,
|
||||||
|
evidence_id text not null references signal_engine.evidence_snapshot(evidence_id),
|
||||||
|
dataset_id text not null,
|
||||||
|
model_version text not null,
|
||||||
|
config_version text not null,
|
||||||
|
code_sha text not null,
|
||||||
|
as_of timestamptz not null,
|
||||||
|
published_at_cutoff timestamptz not null,
|
||||||
|
current_portfolio_weight numeric(12,8) not null
|
||||||
|
check (current_portfolio_weight between 0 and 1),
|
||||||
|
strategic_core_floor_weight numeric(12,8) not null
|
||||||
|
check (strategic_core_floor_weight between 0 and current_portfolio_weight),
|
||||||
|
hard_impairment_approved boolean not null,
|
||||||
|
capital_floor_breached boolean not null,
|
||||||
|
survival_sell_ratio_of_lot numeric(12,8) not null
|
||||||
|
check (survival_sell_ratio_of_lot between 0 and 1),
|
||||||
|
gap_below_floor_atr numeric(18,8) not null check (gap_below_floor_atr >= 0),
|
||||||
|
consecutive_close_breaches integer not null check (consecutive_close_breaches >= 0),
|
||||||
|
cooldown_satisfied boolean not null,
|
||||||
|
concentration_sell_ratio_of_lot numeric(12,8) not null
|
||||||
|
check (concentration_sell_ratio_of_lot between 0 and 1),
|
||||||
|
opportunity_edge_lower_bound numeric(18,8) not null,
|
||||||
|
opportunity_sell_ratio_of_lot numeric(12,8) not null
|
||||||
|
check (opportunity_sell_ratio_of_lot between 0 and 1),
|
||||||
|
quality_status text not null check (quality_status in ('PASS', 'WARN', 'QUARANTINED')),
|
||||||
|
source_watermark text not null,
|
||||||
|
projection_version integer not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (position_lot_id, as_of, projection_version)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_sell_decision_context_lookup
|
||||||
|
on signal_engine.sell_decision_context (position_lot_id, as_of desc)
|
||||||
|
where quality_status = 'PASS';
|
||||||
|
|
||||||
|
drop trigger if exists sell_decision_context_immutable on signal_engine.sell_decision_context;
|
||||||
|
create trigger sell_decision_context_immutable
|
||||||
|
before update or delete on signal_engine.sell_decision_context
|
||||||
|
for each row execute function signal_engine.prevent_immutable_change();
|
||||||
|
|
||||||
|
-- Audit rows are append-only. Corrections are represented as new events.
|
||||||
|
create table if not exists signal_engine.decision_audit_event (
|
||||||
|
audit_event_id uuid primary key,
|
||||||
|
decision_id uuid not null references signal_engine.signal_decision(decision_id),
|
||||||
|
event_type text not null,
|
||||||
|
actor_id text not null,
|
||||||
|
correlation_id text not null,
|
||||||
|
payload_json jsonb not null,
|
||||||
|
payload_hash text not null,
|
||||||
|
occurred_at timestamptz not null,
|
||||||
|
unique (decision_id, event_type, payload_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
drop trigger if exists decision_audit_event_immutable on signal_engine.decision_audit_event;
|
||||||
|
create trigger decision_audit_event_immutable
|
||||||
|
before update or delete on signal_engine.decision_audit_event
|
||||||
|
for each row execute function signal_engine.prevent_immutable_change();
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
-- v12.1 execution-readiness delta. Prior migrations remain immutable.
|
||||||
|
|
||||||
|
alter table building_blocks.outbox_message
|
||||||
|
add column if not exists next_attempt_at timestamptz null,
|
||||||
|
add column if not exists lease_owner text null,
|
||||||
|
add column if not exists lease_until timestamptz null,
|
||||||
|
add column if not exists dead_lettered_at timestamptz null,
|
||||||
|
add column if not exists last_error_code text null;
|
||||||
|
|
||||||
|
create index if not exists ix_outbox_dispatchable
|
||||||
|
on building_blocks.outbox_message (coalesce(next_attempt_at, occurred_at), occurred_at, message_id)
|
||||||
|
where published_at is null and dead_lettered_at is null;
|
||||||
|
|
||||||
|
alter table building_blocks.inbox_message
|
||||||
|
add column if not exists processed_at timestamptz null,
|
||||||
|
add column if not exists result_hash text null;
|
||||||
|
|
||||||
|
create table if not exists building_blocks.projection_checkpoint (
|
||||||
|
projection_name text not null,
|
||||||
|
projection_version integer not null check (projection_version > 0),
|
||||||
|
source_watermark text not null,
|
||||||
|
last_event_id uuid null,
|
||||||
|
content_hash text not null,
|
||||||
|
built_at timestamptz not null,
|
||||||
|
primary key (projection_name, projection_version)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists building_blocks.projection_rebuild_run (
|
||||||
|
rebuild_id uuid primary key,
|
||||||
|
projection_name text not null,
|
||||||
|
target_version integer not null check (target_version > 0),
|
||||||
|
through_watermark text not null,
|
||||||
|
dry_run boolean not null,
|
||||||
|
requested_by text not null,
|
||||||
|
requested_at timestamptz not null,
|
||||||
|
status text not null,
|
||||||
|
source_count bigint null,
|
||||||
|
projected_count bigint null,
|
||||||
|
result_hash text null,
|
||||||
|
finished_at timestamptz null,
|
||||||
|
error_code text null
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists building_blocks.audit_event (
|
||||||
|
audit_event_id uuid primary key,
|
||||||
|
entity_type text not null,
|
||||||
|
entity_id text not null,
|
||||||
|
event_type text not null,
|
||||||
|
actor_id text not null,
|
||||||
|
correlation_id text not null,
|
||||||
|
payload_json jsonb not null,
|
||||||
|
payload_hash text not null,
|
||||||
|
corrects_audit_event_id uuid null references building_blocks.audit_event(audit_event_id),
|
||||||
|
occurred_at timestamptz not null,
|
||||||
|
unique (entity_type, entity_id, event_type, payload_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create or replace function building_blocks.prevent_append_only_change()
|
||||||
|
returns trigger language plpgsql as $$
|
||||||
|
begin
|
||||||
|
raise exception 'append-only row cannot be updated or deleted';
|
||||||
|
end;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
drop trigger if exists audit_event_append_only on building_blocks.audit_event;
|
||||||
|
create trigger audit_event_append_only
|
||||||
|
before update or delete on building_blocks.audit_event
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
-- v12.2 strategic data-correctness delta.
|
||||||
|
-- Prior columns remain for compatibility; new code uses explicit security/lot weight semantics.
|
||||||
|
|
||||||
|
alter table signal_engine.sell_decision_context
|
||||||
|
add column if not exists current_security_portfolio_weight numeric(12,8),
|
||||||
|
add column if not exists current_lot_portfolio_weight numeric(12,8);
|
||||||
|
|
||||||
|
update signal_engine.sell_decision_context
|
||||||
|
set current_security_portfolio_weight = coalesce(current_security_portfolio_weight, current_portfolio_weight),
|
||||||
|
current_lot_portfolio_weight = coalesce(current_lot_portfolio_weight, current_portfolio_weight)
|
||||||
|
where current_security_portfolio_weight is null
|
||||||
|
or current_lot_portfolio_weight is null;
|
||||||
|
|
||||||
|
alter table signal_engine.sell_decision_context
|
||||||
|
alter column current_security_portfolio_weight set not null,
|
||||||
|
alter column current_lot_portfolio_weight set not null,
|
||||||
|
drop constraint if exists ck_sell_context_security_weight,
|
||||||
|
add constraint ck_sell_context_security_weight
|
||||||
|
check (current_security_portfolio_weight between 0 and 1),
|
||||||
|
drop constraint if exists ck_sell_context_lot_weight,
|
||||||
|
add constraint ck_sell_context_lot_weight
|
||||||
|
check (current_lot_portfolio_weight between 0 and current_security_portfolio_weight),
|
||||||
|
drop constraint if exists ck_sell_context_published_cutoff,
|
||||||
|
add constraint ck_sell_context_published_cutoff
|
||||||
|
check (published_at_cutoff <= as_of);
|
||||||
|
|
||||||
|
comment on column signal_engine.sell_decision_context.current_portfolio_weight is
|
||||||
|
'Legacy ambiguous field. Do not use in v12.2+ decisions.';
|
||||||
|
comment on column signal_engine.sell_decision_context.current_security_portfolio_weight is
|
||||||
|
'Absolute portfolio weight of the security, 0..1.';
|
||||||
|
comment on column signal_engine.sell_decision_context.current_lot_portfolio_weight is
|
||||||
|
'Absolute portfolio weight represented by the target PositionLot, 0..security weight.';
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
add column if not exists target_security_portfolio_weight_after numeric(12,8),
|
||||||
|
add column if not exists policy_trace_json jsonb;
|
||||||
|
|
||||||
|
update signal_engine.signal_decision
|
||||||
|
set target_security_portfolio_weight_after = coalesce(
|
||||||
|
target_security_portfolio_weight_after,
|
||||||
|
target_portfolio_weight_after,
|
||||||
|
0),
|
||||||
|
policy_trace_json = coalesce(policy_trace_json, '[]'::jsonb)
|
||||||
|
where target_security_portfolio_weight_after is null
|
||||||
|
or policy_trace_json is null;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
alter column target_security_portfolio_weight_after set not null,
|
||||||
|
alter column policy_trace_json set not null,
|
||||||
|
drop constraint if exists ck_signal_decision_target_security_weight,
|
||||||
|
add constraint ck_signal_decision_target_security_weight
|
||||||
|
check (target_security_portfolio_weight_after between 0 and 1),
|
||||||
|
drop constraint if exists ck_signal_decision_policy_trace_array,
|
||||||
|
add constraint ck_signal_decision_policy_trace_array
|
||||||
|
check (jsonb_typeof(policy_trace_json) = 'array');
|
||||||
|
|
||||||
|
comment on column signal_engine.signal_decision.target_portfolio_weight_after is
|
||||||
|
'Legacy ambiguous target field. v12.2+ uses target_security_portfolio_weight_after.';
|
||||||
|
|
||||||
|
create index if not exists ix_signal_decision_policy_trace_gin
|
||||||
|
on signal_engine.signal_decision using gin (policy_trace_json);
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
-- v12.3 semantic-versioning and contract-governance delta.
|
||||||
|
-- Prior migrations remain immutable. Legacy ambiguous weight contexts are blocked, not guessed.
|
||||||
|
|
||||||
|
alter table signal_engine.sell_decision_context
|
||||||
|
add column if not exists weight_semantics_version smallint;
|
||||||
|
|
||||||
|
-- Every row created before this migration is conservatively classified as legacy/ambiguous.
|
||||||
|
update signal_engine.sell_decision_context
|
||||||
|
set weight_semantics_version = 1
|
||||||
|
where weight_semantics_version is null;
|
||||||
|
|
||||||
|
alter table signal_engine.sell_decision_context
|
||||||
|
alter column weight_semantics_version set default 2,
|
||||||
|
alter column weight_semantics_version set not null,
|
||||||
|
drop constraint if exists ck_sell_context_weight_semantics_version,
|
||||||
|
add constraint ck_sell_context_weight_semantics_version
|
||||||
|
check (weight_semantics_version in (1, 2));
|
||||||
|
|
||||||
|
comment on column signal_engine.sell_decision_context.weight_semantics_version is
|
||||||
|
'1=legacy ambiguous current_portfolio_weight backfill; 2=explicit security and lot weights from approved source. Decision reads require 2.';
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
add column if not exists decision_contract_version text,
|
||||||
|
add column if not exists policy_trace_schema_version smallint;
|
||||||
|
|
||||||
|
update signal_engine.signal_decision
|
||||||
|
set decision_contract_version = coalesce(decision_contract_version, 'sell-decision.v2'),
|
||||||
|
policy_trace_schema_version = coalesce(policy_trace_schema_version, 2)
|
||||||
|
where decision_contract_version is null
|
||||||
|
or policy_trace_schema_version is null;
|
||||||
|
|
||||||
|
alter table signal_engine.signal_decision
|
||||||
|
alter column decision_contract_version set default 'sell-decision.v2',
|
||||||
|
alter column decision_contract_version set not null,
|
||||||
|
alter column policy_trace_schema_version set default 2,
|
||||||
|
alter column policy_trace_schema_version set not null,
|
||||||
|
drop constraint if exists ck_signal_decision_contract_version,
|
||||||
|
add constraint ck_signal_decision_contract_version
|
||||||
|
check (decision_contract_version = 'sell-decision.v2'),
|
||||||
|
drop constraint if exists ck_signal_decision_policy_trace_schema_version,
|
||||||
|
add constraint ck_signal_decision_policy_trace_schema_version
|
||||||
|
check (policy_trace_schema_version = 2);
|
||||||
|
|
||||||
|
create table if not exists signal_engine.policy_contract_definition (
|
||||||
|
contract_version text primary key,
|
||||||
|
content_hash text not null unique,
|
||||||
|
policy_json jsonb not null,
|
||||||
|
status text not null check (status in ('PROPOSED', 'APPROVED', 'RETIRED')),
|
||||||
|
effective_from timestamptz null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
check (jsonb_typeof(policy_json) = 'object')
|
||||||
|
);
|
||||||
|
|
||||||
|
insert into signal_engine.policy_contract_definition
|
||||||
|
(contract_version, content_hash, policy_json, status)
|
||||||
|
values
|
||||||
|
('sell-policy.v1', 'a269a0331b83c0f6ec108e7587de1d20c798036ff8d0c03d726cd854e73d8480', $policy$
|
||||||
|
{
|
||||||
|
"changeControl": "MODEL_CHANGE_AND_GOLDEN_OOS_REQUIRED",
|
||||||
|
"contractVersion": "sell-policy.v1",
|
||||||
|
"decisionContractVersion": "sell-decision.v2",
|
||||||
|
"policies": [
|
||||||
|
{
|
||||||
|
"condition": "approved hard impairment",
|
||||||
|
"documentedRange": [
|
||||||
|
0.8,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": true,
|
||||||
|
"policyId": "ALG-SELL-001",
|
||||||
|
"priority": 1000,
|
||||||
|
"reentryEligible": false,
|
||||||
|
"requestedSellRatioOfLot": 1.0,
|
||||||
|
"terminal": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "capital floor breached",
|
||||||
|
"decisionRequired": "Whether portfolio survival bypasses same-direction cooldown",
|
||||||
|
"mayCrossStrategicCore": true,
|
||||||
|
"policyId": "ALG-SELL-PORT-001",
|
||||||
|
"priority": 900,
|
||||||
|
"ratioSource": "server PIT risk context",
|
||||||
|
"reentryEligible": true,
|
||||||
|
"terminal": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": {
|
||||||
|
"gapBelowFloorAtrGte": 1.5
|
||||||
|
},
|
||||||
|
"documentedRange": [
|
||||||
|
0.3,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-002",
|
||||||
|
"priority": 800,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedSellRatioOfLot": 0.4,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": {
|
||||||
|
"consecutiveCloseBreachesGte": 2
|
||||||
|
},
|
||||||
|
"documentedRange": [
|
||||||
|
0.15,
|
||||||
|
0.25
|
||||||
|
],
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-003",
|
||||||
|
"priority": 700,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedSellRatioOfLot": 0.2,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "approved concentration/liquidity excess ratio > 0",
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-004",
|
||||||
|
"priority": 600,
|
||||||
|
"ratioSource": "server PIT portfolio risk context",
|
||||||
|
"reentryEligible": true,
|
||||||
|
"terminal": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "opportunity edge lower bound > 0 and requested ratio > 0",
|
||||||
|
"mayCrossStrategicCore": false,
|
||||||
|
"policyId": "ALG-SELL-005",
|
||||||
|
"priority": 500,
|
||||||
|
"reentryEligible": true,
|
||||||
|
"requestedRange": [
|
||||||
|
0.1,
|
||||||
|
0.25
|
||||||
|
],
|
||||||
|
"terminal": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"policyTraceSchemaVersion": 2,
|
||||||
|
"status": "RESEARCH_CANDIDATE_NOT_PRODUCTION"
|
||||||
|
}
|
||||||
|
$policy$::jsonb, 'PROPOSED')
|
||||||
|
on conflict (contract_version) do nothing;
|
||||||
|
|
||||||
|
drop trigger if exists policy_contract_definition_immutable on signal_engine.policy_contract_definition;
|
||||||
|
create trigger policy_contract_definition_immutable
|
||||||
|
before update or delete on signal_engine.policy_contract_definition
|
||||||
|
for each row execute function signal_engine.prevent_immutable_change();
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
-- v12.4 continuous model operations delta.
|
||||||
|
-- Evaluation and proposal automation only. This migration does not enable automatic model promotion,
|
||||||
|
-- automatic order submission or KIS submission.
|
||||||
|
|
||||||
|
create schema if not exists evaluation;
|
||||||
|
create schema if not exists governance;
|
||||||
|
|
||||||
|
create table if not exists evaluation.dataset_manifest (
|
||||||
|
dataset_id text primary key,
|
||||||
|
scope_key text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
source_catalog_version text not null,
|
||||||
|
lineage_hash text not null,
|
||||||
|
status text not null check (status in ('PROPOSED', 'APPROVED', 'QUARANTINED', 'RETIRED')),
|
||||||
|
frozen_at timestamptz not null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now()
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_dataset_manifest_scope_frozen
|
||||||
|
on evaluation.dataset_manifest (scope_key, frozen_at desc)
|
||||||
|
where status = 'APPROVED';
|
||||||
|
|
||||||
|
create table if not exists governance.model_version_registry (
|
||||||
|
model_version text not null,
|
||||||
|
scope_key text not null,
|
||||||
|
config_version text not null,
|
||||||
|
code_sha text not null,
|
||||||
|
contract_version text not null,
|
||||||
|
lifecycle_state text not null check (lifecycle_state in
|
||||||
|
('RESEARCH', 'CHALLENGER', 'SHADOW', 'CANDIDATE', 'APPROVED', 'RETIRED', 'ROLLED_BACK')),
|
||||||
|
effective_at timestamptz not null,
|
||||||
|
retired_at timestamptz null,
|
||||||
|
model_card_hash text not null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
primary key (model_version, scope_key, effective_at),
|
||||||
|
check (lifecycle_state <> 'APPROVED' or (approved_by is not null and approved_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_model_version_registry_active
|
||||||
|
on governance.model_version_registry (scope_key, effective_at desc)
|
||||||
|
where lifecycle_state in ('RESEARCH', 'CHALLENGER', 'SHADOW', 'CANDIDATE', 'APPROVED');
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_operation_schedule (
|
||||||
|
schedule_id uuid primary key,
|
||||||
|
operation_code text not null,
|
||||||
|
operation_name text not null,
|
||||||
|
scope_key text not null,
|
||||||
|
cadence text not null check (cadence in ('DAILY', 'WEEKLY', 'MONTHLY', 'QUARTERLY', 'EVENT_DRIVEN')),
|
||||||
|
automation_mode text not null check (automation_mode in ('EVALUATION_ONLY', 'PROPOSAL_ONLY', 'DRILL_ONLY')),
|
||||||
|
queue_name text not null,
|
||||||
|
schedule_version integer not null check (schedule_version > 0),
|
||||||
|
enabled boolean not null default true,
|
||||||
|
next_due_at timestamptz not null,
|
||||||
|
last_dispatched_at timestamptz null,
|
||||||
|
last_background_job_id text null,
|
||||||
|
max_lag interval not null,
|
||||||
|
primary_owner text not null,
|
||||||
|
secondary_owner text not null,
|
||||||
|
lease_owner text null,
|
||||||
|
lease_until timestamptz null,
|
||||||
|
last_error_code text null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
updated_at timestamptz not null default now(),
|
||||||
|
unique (operation_code, scope_key, schedule_version)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_model_operation_schedule_due
|
||||||
|
on evaluation.model_operation_schedule (next_due_at, operation_code, scope_key)
|
||||||
|
where enabled = true;
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_operation_request (
|
||||||
|
request_id uuid primary key,
|
||||||
|
schedule_id uuid not null references evaluation.model_operation_schedule(schedule_id),
|
||||||
|
operation_code text not null,
|
||||||
|
scope_key text not null,
|
||||||
|
automation_mode text not null check (automation_mode in ('EVALUATION_ONLY', 'PROPOSAL_ONLY', 'DRILL_ONLY')),
|
||||||
|
idempotency_key text not null unique,
|
||||||
|
dataset_id text not null,
|
||||||
|
data_hash text not null,
|
||||||
|
model_version text not null,
|
||||||
|
config_version text not null,
|
||||||
|
code_sha text not null,
|
||||||
|
contract_version text not null,
|
||||||
|
lifecycle_state text not null,
|
||||||
|
correlation_id text not null,
|
||||||
|
status text not null check (status in ('REQUESTED', 'RUNNING', 'SUCCEEDED', 'BUSINESS_HOLD', 'FAILED', 'QUARANTINED')),
|
||||||
|
output_hash text null,
|
||||||
|
error_code text null,
|
||||||
|
requested_at timestamptz not null,
|
||||||
|
started_at timestamptz null,
|
||||||
|
finished_at timestamptz null
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_model_operation_request_scope_time
|
||||||
|
on evaluation.model_operation_request (scope_key, operation_code, requested_at desc);
|
||||||
|
|
||||||
|
-- Request is a lifecycle aggregate: status/timing fields are mutable under optimistic/transactional control.
|
||||||
|
-- Every transition is additionally recorded as an immutable status event so operational history is never lost.
|
||||||
|
create table if not exists evaluation.model_operation_status_event (
|
||||||
|
event_id uuid primary key,
|
||||||
|
request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
from_status text null,
|
||||||
|
to_status text not null check (to_status in
|
||||||
|
('REQUESTED', 'RUNNING', 'SUCCEEDED', 'BUSINESS_HOLD', 'FAILED', 'QUARANTINED')),
|
||||||
|
reason_code text null,
|
||||||
|
payload_hash text not null,
|
||||||
|
actor_type text not null check (actor_type in ('SYSTEM', 'OPERATOR', 'REPLAY')),
|
||||||
|
correlation_id text not null,
|
||||||
|
occurred_at timestamptz not null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (request_id, to_status, occurred_at, payload_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_model_operation_status_event_request_time
|
||||||
|
on evaluation.model_operation_status_event (request_id, occurred_at);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_metric_definition (
|
||||||
|
metric_code text not null,
|
||||||
|
definition_version integer not null check (definition_version > 0),
|
||||||
|
numerator_definition text not null,
|
||||||
|
denominator_definition text not null,
|
||||||
|
evaluation_window text not null,
|
||||||
|
aggregation_method text not null,
|
||||||
|
threshold_json jsonb not null,
|
||||||
|
status text not null check (status in ('PROPOSED', 'APPROVED', 'RETIRED')),
|
||||||
|
content_hash text not null,
|
||||||
|
effective_from timestamptz null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
primary key (metric_code, definition_version),
|
||||||
|
unique (content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_metric_observation (
|
||||||
|
observation_id uuid primary key,
|
||||||
|
request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
metric_code text not null,
|
||||||
|
definition_version integer not null,
|
||||||
|
scope_key text not null,
|
||||||
|
cohort_key text not null,
|
||||||
|
value_numeric numeric(30, 12) null,
|
||||||
|
value_text text null,
|
||||||
|
sample_size bigint not null check (sample_size >= 0),
|
||||||
|
dataset_id text not null,
|
||||||
|
model_version text not null,
|
||||||
|
as_of timestamptz not null,
|
||||||
|
content_hash text not null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
foreign key (metric_code, definition_version)
|
||||||
|
references evaluation.model_metric_definition(metric_code, definition_version),
|
||||||
|
check ((value_numeric is null) <> (value_text is null)),
|
||||||
|
unique (request_id, metric_code, definition_version, cohort_key, content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_evaluation_snapshot (
|
||||||
|
snapshot_id uuid primary key,
|
||||||
|
request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
scope_key text not null,
|
||||||
|
model_version text not null,
|
||||||
|
dataset_id text not null,
|
||||||
|
gate_contract_version text not null,
|
||||||
|
gate_decision text not null check (gate_decision in ('PASS', 'WARN', 'HOLD', 'FAIL')),
|
||||||
|
blocking_reasons_json jsonb not null,
|
||||||
|
warnings_json jsonb not null,
|
||||||
|
evidence_hash text not null,
|
||||||
|
as_of timestamptz not null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (request_id, evidence_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.model_improvement_proposal (
|
||||||
|
proposal_id uuid primary key,
|
||||||
|
source_request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
scope_key text not null,
|
||||||
|
base_model_version text not null,
|
||||||
|
proposal_type text not null check (proposal_type in
|
||||||
|
('DATA_REMEDIATION', 'FEATURE_REVIEW', 'THRESHOLD_REVIEW', 'POLICY_REFACTORING',
|
||||||
|
'CALIBRATION_REVIEW', 'RISK_LIMIT_REVIEW', 'TECH_DEBT_REPAYMENT')),
|
||||||
|
problem_statement text not null,
|
||||||
|
supporting_evidence_json jsonb not null,
|
||||||
|
counter_evidence_json jsonb not null,
|
||||||
|
expected_benefit text not null,
|
||||||
|
risks text not null,
|
||||||
|
required_tests_json jsonb not null,
|
||||||
|
status text not null check (status in
|
||||||
|
('DRAFT', 'REVIEW_REQUIRED', 'APPROVED_FOR_RESEARCH', 'REJECTED', 'EXPIRED')),
|
||||||
|
created_by text not null,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
reviewed_by text null,
|
||||||
|
reviewed_at timestamptz null,
|
||||||
|
expires_at timestamptz not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
check (status <> 'APPROVED_FOR_RESEARCH' or (reviewed_by is not null and reviewed_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.model_promotion_review (
|
||||||
|
review_id uuid primary key,
|
||||||
|
scope_key text not null,
|
||||||
|
candidate_model_version text not null,
|
||||||
|
evidence_snapshot_id uuid not null references evaluation.model_evaluation_snapshot(snapshot_id),
|
||||||
|
independent_validation_hash text not null,
|
||||||
|
compliance_review_hash text null,
|
||||||
|
security_review_hash text null,
|
||||||
|
decision text not null check (decision in ('PENDING', 'APPROVED_FOR_SHADOW', 'APPROVED_FOR_PILOT', 'REJECTED', 'EXPIRED')),
|
||||||
|
maker_id text not null,
|
||||||
|
checker_id text null,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
decided_at timestamptz null,
|
||||||
|
check (maker_id <> coalesce(checker_id, '')),
|
||||||
|
check (decision = 'PENDING' or (checker_id is not null and decided_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.model_rollback_drill (
|
||||||
|
drill_id uuid primary key,
|
||||||
|
scope_key text not null,
|
||||||
|
champion_model_version text not null,
|
||||||
|
fallback_model_version text not null,
|
||||||
|
runbook_version text not null,
|
||||||
|
started_at timestamptz not null,
|
||||||
|
finished_at timestamptz null,
|
||||||
|
result text not null check (result in ('RUNNING', 'PASS', 'FAIL', 'BUSINESS_HOLD')),
|
||||||
|
recovery_time_seconds integer null check (recovery_time_seconds is null or recovery_time_seconds >= 0),
|
||||||
|
evidence_hash text null,
|
||||||
|
owner text not null,
|
||||||
|
secondary_owner text not null
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Append-only evidence. Request status is mutable, but status_event/observation/snapshot history is immutable.
|
||||||
|
drop trigger if exists model_operation_status_event_append_only on evaluation.model_operation_status_event;
|
||||||
|
create trigger model_operation_status_event_append_only
|
||||||
|
before update or delete on evaluation.model_operation_status_event
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists model_metric_observation_append_only on evaluation.model_metric_observation;
|
||||||
|
create trigger model_metric_observation_append_only
|
||||||
|
before update or delete on evaluation.model_metric_observation
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists model_evaluation_snapshot_append_only on evaluation.model_evaluation_snapshot;
|
||||||
|
create trigger model_evaluation_snapshot_append_only
|
||||||
|
before update or delete on evaluation.model_evaluation_snapshot
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
-- Schedules intentionally automate evidence collection/proposal generation only.
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000010', 'J10', 'OutcomeEvaluationRun', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-evaluation', 1, true, now() + interval '1 hour', interval '1 day', 'Quant/Ops', 'Data/QA'),
|
||||||
|
('e4100000-0000-4000-8000-000000000011', 'J11', 'DailyScorecardBuild', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-evaluation', 1, true, now() + interval '2 hours', interval '1 day', 'Quant/Ops', 'Risk/SRE'),
|
||||||
|
('e4100000-0000-4000-8000-000000000017', 'J17', 'DriftDetectionRun', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-evaluation', 1, true, now() + interval '3 hours', interval '1 day', 'Quant/Risk', 'Data/SRE'),
|
||||||
|
('e4100000-0000-4000-8000-000000000018', 'J18', 'ChampionChallengerEvaluation', 'GLOBAL', 'WEEKLY', 'EVALUATION_ONLY', 'q-evaluation', 1, true, now() + interval '1 day', interval '7 days', 'Quant/Risk', 'QA/InvestmentCommittee'),
|
||||||
|
('e4100000-0000-4000-8000-000000000019', 'J19', 'FrozenOosBacktest', 'GLOBAL', 'MONTHLY', 'EVALUATION_ONLY', 'q-research', 1, true, now() + interval '7 days', interval '31 days', 'Quant/Data', 'QA/Risk'),
|
||||||
|
('e4100000-0000-4000-8000-000000000020', 'J20', 'RobustnessPboDsrRun', 'GLOBAL', 'QUARTERLY', 'EVALUATION_ONLY', 'q-research', 1, true, now() + interval '30 days', interval '95 days', 'Quant/Risk', 'IndependentValidation'),
|
||||||
|
('e4100000-0000-4000-8000-000000000021', 'J21', 'ModelImprovementProposalBuild', 'GLOBAL', 'MONTHLY', 'PROPOSAL_ONLY', 'q-research', 1, true, now() + interval '14 days', interval '31 days', 'Quant Lead', 'Risk/Architect'),
|
||||||
|
('e4100000-0000-4000-8000-000000000022', 'J22', 'PromotionEvidenceReviewBuild', 'GLOBAL', 'MONTHLY', 'PROPOSAL_ONLY', 'q-control', 1, true, now() + interval '21 days', interval '31 days', 'Risk/InvestmentCommittee', 'Compliance/QA'),
|
||||||
|
('e4100000-0000-4000-8000-000000000023', 'J23', 'ModelRollbackDrill', 'GLOBAL', 'QUARTERLY', 'DRILL_ONLY', 'q-control', 1, true, now() + interval '45 days', interval '95 days', 'SRE/Risk', 'Module Owner/QA'),
|
||||||
|
('e4100000-0000-4000-8000-000000000024', 'J24', 'DataRevisionRevalidation', 'GLOBAL', 'WEEKLY', 'EVALUATION_ONLY', 'q-backfill', 1, true, now() + interval '2 days', interval '7 days', 'Data/Quant', 'DBA/QA')
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
-- v12.5 execution assurance delta.
|
||||||
|
-- This migration adds evidence and scheduling metadata only. It does not enable automatic model mutation,
|
||||||
|
-- client publication, broker submission or model promotion.
|
||||||
|
|
||||||
|
-- Fail closed after upgrade. Each schedule must be enabled by an approved operational change.
|
||||||
|
update evaluation.model_operation_schedule
|
||||||
|
set enabled = false,
|
||||||
|
updated_at = now(),
|
||||||
|
last_error_code = 'V12_5_REAPPROVAL_REQUIRED'
|
||||||
|
where schedule_version = 1
|
||||||
|
and operation_code in ('J10','J11','J17','J18','J19','J20','J21','J22','J23','J24');
|
||||||
|
|
||||||
|
alter table evaluation.model_operation_schedule
|
||||||
|
add column if not exists calendar_id text not null default 'GLOBAL_UTC',
|
||||||
|
add column if not exists due_policy text not null default 'FIXED_CADENCE',
|
||||||
|
add column if not exists dependency_json jsonb not null default '[]'::jsonb,
|
||||||
|
add column if not exists catch_up_policy text not null default 'LATEST_ONLY',
|
||||||
|
add column if not exists max_catch_up integer not null default 1 check (max_catch_up between 0 and 31),
|
||||||
|
add column if not exists business_hold_code text null;
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_operation_artifact (
|
||||||
|
artifact_id uuid primary key,
|
||||||
|
request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
artifact_type text not null,
|
||||||
|
artifact_uri text not null,
|
||||||
|
content_hash text not null,
|
||||||
|
media_type text not null,
|
||||||
|
evidence_class text not null check (evidence_class in ('SOURCE', 'RUNTIME', 'RESEARCH', 'RELEASE', 'AUDIT')),
|
||||||
|
produced_by text not null,
|
||||||
|
produced_at timestamptz not null,
|
||||||
|
retention_until timestamptz null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (request_id, artifact_type, content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_operation_dependency_result (
|
||||||
|
dependency_result_id uuid primary key,
|
||||||
|
request_id uuid not null references evaluation.model_operation_request(request_id),
|
||||||
|
dependency_code text not null,
|
||||||
|
result text not null check (result in ('PASS', 'WARN', 'HOLD', 'FAIL')),
|
||||||
|
evidence_hash text not null,
|
||||||
|
checked_at timestamptz not null,
|
||||||
|
unique (request_id, dependency_code, evidence_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.release_evidence_bundle (
|
||||||
|
bundle_id uuid primary key,
|
||||||
|
release_version text not null,
|
||||||
|
source_manifest_hash text not null,
|
||||||
|
build_artifact_hash text null,
|
||||||
|
test_artifact_hash text null,
|
||||||
|
migration_artifact_hash text null,
|
||||||
|
security_artifact_hash text null,
|
||||||
|
rollback_artifact_hash text null,
|
||||||
|
decision_log_hash text not null,
|
||||||
|
status text not null check (status in ('DRAFT', 'REVIEW_REQUIRED', 'APPROVED', 'REJECTED', 'EXPIRED')),
|
||||||
|
maker_id text not null,
|
||||||
|
checker_id text null,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
decided_at timestamptz null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
check (status not in ('APPROVED', 'REJECTED') or (checker_id is not null and checker_id <> maker_id and decided_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.source_contract_snapshot (
|
||||||
|
snapshot_id uuid primary key,
|
||||||
|
source_code text not null,
|
||||||
|
schema_version text not null,
|
||||||
|
license_version text not null,
|
||||||
|
sla_version text not null,
|
||||||
|
timezone_contract text not null,
|
||||||
|
unit_contract text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
status text not null check (status in ('PROPOSED', 'APPROVED', 'RETIRED', 'QUARANTINED')),
|
||||||
|
effective_from timestamptz null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now()
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.execution_assurance_decision (
|
||||||
|
decision_id uuid primary key,
|
||||||
|
decision_code text not null,
|
||||||
|
scope_key text not null,
|
||||||
|
decision_version integer not null check (decision_version > 0),
|
||||||
|
status text not null check (status in ('DECISION_REQUIRED', 'APPROVED', 'REJECTED', 'SUPERSEDED', 'EXPIRED')),
|
||||||
|
statement text not null,
|
||||||
|
basis_json jsonb not null,
|
||||||
|
owner text not null,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
expires_at timestamptz null,
|
||||||
|
content_hash text not null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (decision_code, scope_key, decision_version),
|
||||||
|
unique (content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Append-only operational evidence.
|
||||||
|
drop trigger if exists model_operation_artifact_append_only on evaluation.model_operation_artifact;
|
||||||
|
create trigger model_operation_artifact_append_only
|
||||||
|
before update or delete on evaluation.model_operation_artifact
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists model_operation_dependency_result_append_only on evaluation.model_operation_dependency_result;
|
||||||
|
create trigger model_operation_dependency_result_append_only
|
||||||
|
before update or delete on evaluation.model_operation_dependency_result
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists release_evidence_bundle_append_only on governance.release_evidence_bundle;
|
||||||
|
create trigger release_evidence_bundle_append_only
|
||||||
|
before update or delete on governance.release_evidence_bundle
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists source_contract_snapshot_append_only on governance.source_contract_snapshot;
|
||||||
|
create trigger source_contract_snapshot_append_only
|
||||||
|
before update or delete on governance.source_contract_snapshot
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists execution_assurance_decision_append_only on governance.execution_assurance_decision;
|
||||||
|
create trigger execution_assurance_decision_append_only
|
||||||
|
before update or delete on governance.execution_assurance_decision
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
-- Additional checks are seeded disabled. They may be enabled only after their source/calendar/SLO contracts are approved.
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner,
|
||||||
|
calendar_id, due_policy, dependency_json, catch_up_policy, max_catch_up)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000025', 'J25', 'SourceContractDriftCheck', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-evaluation', 1, false, now() + interval '1 day', interval '1 day', 'Data Governance', 'Adapter Owner/QA', 'GLOBAL_UTC', 'FIXED_CADENCE', '["SOURCE_CONTRACT_APPROVED"]', 'LATEST_ONLY', 1),
|
||||||
|
('e4100000-0000-4000-8000-000000000026', 'J26', 'MarketCalendarCompletenessCheck', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-market-data', 1, false, now() + interval '1 day', interval '1 day', 'Data/Ops', 'Quant/QA', 'APPROVED_MARKET_CALENDAR', 'TRADING_SESSION', '["MARKET_CALENDAR_APPROVED","SOURCE_COMPLETE"]', 'LATEST_ONLY', 1),
|
||||||
|
('e4100000-0000-4000-8000-000000000027', 'J27', 'EvidenceChainAudit', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-control', 1, false, now() + interval '1 day', interval '1 day', 'Compliance/QA', 'Data/BE', 'GLOBAL_UTC', 'FIXED_CADENCE', '["AUDIT_LEDGER_READY"]', 'LATEST_ONLY', 1),
|
||||||
|
('e4100000-0000-4000-8000-000000000028', 'J28', 'ProjectionFreshnessCheck', 'GLOBAL', 'DAILY', 'EVALUATION_ONLY', 'q-evaluation', 1, false, now() + interval '1 day', interval '1 day', 'BE/Data', 'SRE/QA', 'GLOBAL_UTC', 'FIXED_CADENCE', '["PROJECTION_CONTRACT_APPROVED"]', 'LATEST_ONLY', 1),
|
||||||
|
('e4100000-0000-4000-8000-000000000029', 'J29', 'CapacitySlaTrend', 'GLOBAL', 'WEEKLY', 'EVALUATION_ONLY', 'q-control', 1, false, now() + interval '7 days', interval '7 days', 'SRE/PM', 'DBA/Module Owner', 'GLOBAL_UTC', 'FIXED_CADENCE', '["SLO_APPROVED","VOLUME_ASSUMPTION_APPROVED"]', 'LATEST_ONLY', 1),
|
||||||
|
('e4100000-0000-4000-8000-000000000030', 'J30', 'ReleaseEvidenceAssemble', 'GLOBAL', 'EVENT_DRIVEN', 'PROPOSAL_ONLY', 'q-control', 1, false, now() + interval '365 days', interval '365 days', 'QA/Release Manager', 'Compliance/SRE', 'GLOBAL_UTC', 'EVENT', '["BUILD_GREEN","TEST_GREEN","MIGRATION_GREEN","SECURITY_GREEN","ROLLBACK_READY"]', 'NONE', 0)
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
-- v13.0 continuous model feedback loop. All schedules are inserted disabled and are evidence/proposal only.
|
||||||
|
create table if not exists evaluation.prediction_freeze (
|
||||||
|
prediction_freeze_id uuid primary key,
|
||||||
|
portfolio_scope text not null,
|
||||||
|
market_session date not null,
|
||||||
|
as_of timestamptz not null,
|
||||||
|
dataset_id text not null,
|
||||||
|
model_version text not null,
|
||||||
|
config_version text not null,
|
||||||
|
code_sha text not null,
|
||||||
|
contract_version text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
frozen_at timestamptz not null default now(),
|
||||||
|
unique (portfolio_scope, market_session, model_version, content_hash)
|
||||||
|
);
|
||||||
|
create table if not exists evaluation.evaluation_window_maturity (
|
||||||
|
maturity_id uuid primary key,
|
||||||
|
decision_id uuid not null,
|
||||||
|
window_sessions integer not null check (window_sessions in (1,5,20,63,126,252)),
|
||||||
|
due_session date not null,
|
||||||
|
maturity_revision integer not null check (maturity_revision > 0),
|
||||||
|
status text not null check (status in ('PENDING','MATURED','HELD_DATA','EVALUATED','SUPERSEDED')),
|
||||||
|
dataset_id text not null,
|
||||||
|
supersedes_maturity_id uuid null references evaluation.evaluation_window_maturity(maturity_id),
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
check (supersedes_maturity_id is null or supersedes_maturity_id <> maturity_id),
|
||||||
|
unique (decision_id, window_sessions, dataset_id, maturity_revision)
|
||||||
|
);
|
||||||
|
create table if not exists governance.model_improvement_hypothesis (
|
||||||
|
hypothesis_id uuid primary key,
|
||||||
|
model_version text not null,
|
||||||
|
hypothesis_version integer not null check (hypothesis_version > 0),
|
||||||
|
problem_statement text not null,
|
||||||
|
evidence_json jsonb not null,
|
||||||
|
proposed_change text not null,
|
||||||
|
expected_effect text not null,
|
||||||
|
falsification_test text not null,
|
||||||
|
non_goals text not null,
|
||||||
|
status text not null check (status in ('DRAFT','REVIEW_REQUIRED','APPROVED_FOR_EXPERIMENT','REJECTED','SUPERSEDED','EXPIRED')),
|
||||||
|
maker_id text not null,
|
||||||
|
checker_id text null,
|
||||||
|
supersedes_hypothesis_id uuid null references governance.model_improvement_hypothesis(hypothesis_id),
|
||||||
|
expires_at timestamptz not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
decided_at timestamptz null,
|
||||||
|
check (supersedes_hypothesis_id is null or supersedes_hypothesis_id <> hypothesis_id),
|
||||||
|
check (status not in ('APPROVED_FOR_EXPERIMENT','REJECTED') or (checker_id is not null and checker_id <> maker_id and decided_at is not null)),
|
||||||
|
unique (model_version, hypothesis_version)
|
||||||
|
);
|
||||||
|
|
||||||
|
drop trigger if exists prediction_freeze_append_only on evaluation.prediction_freeze;
|
||||||
|
create trigger prediction_freeze_append_only before update or delete on evaluation.prediction_freeze for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
drop trigger if exists evaluation_window_maturity_append_only on evaluation.evaluation_window_maturity;
|
||||||
|
create trigger evaluation_window_maturity_append_only before update or delete on evaluation.evaluation_window_maturity for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
drop trigger if exists model_improvement_hypothesis_append_only on governance.model_improvement_hypothesis;
|
||||||
|
create trigger model_improvement_hypothesis_append_only before update or delete on governance.model_improvement_hypothesis for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner,
|
||||||
|
calendar_id, due_policy, dependency_json, catch_up_policy, max_catch_up)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000031','J31','PredictionFreezeRun','GLOBAL','DAILY','EVALUATION_ONLY','q-evaluation',2,false,now()+interval '1 day',interval '1 day','Quant/Data','QA/Risk','APPROVED_MARKET_CALENDAR','TRADING_SESSION','["PIT_CONTEXT_APPROVED","MODEL_CONTEXT_APPROVED"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000032','J32','OutcomeMaturitySweep','GLOBAL','DAILY','EVALUATION_ONLY','q-evaluation',2,false,now()+interval '1 day',interval '1 day','Quant/Ops','Data/QA','APPROVED_MARKET_CALENDAR','TRADING_SESSION','["TOTAL_RETURN_COMPLETE","CALENDAR_APPROVED"]','BOUNDED',7),
|
||||||
|
('e4100000-0000-4000-8000-000000000033','J33','SellReentryAttributionReview','GLOBAL','WEEKLY','EVALUATION_ONLY','q-evaluation',2,false,now()+interval '7 days',interval '7 days','Quant/Risk','Advisor/QA','GLOBAL_UTC','FIXED_CADENCE','["OUTCOME_MATURED","METRIC_CONTRACT_APPROVED"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000034','J34','CalibrationRegimeReview','GLOBAL','WEEKLY','EVALUATION_ONLY','q-evaluation',2,false,now()+interval '7 days',interval '7 days','Quant/Risk','Data/IndependentValidation','GLOBAL_UTC','FIXED_CADENCE','["COHORT_VERSION_APPROVED","REGIME_DEFINITION_APPROVED"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000035','J35','ImprovementHypothesisBuild','GLOBAL','MONTHLY','PROPOSAL_ONLY','q-research',2,false,now()+interval '30 days',interval '30 days','Quant Lead','Risk/Architect','GLOBAL_UTC','FIXED_CADENCE','["SCORECARD_COMPLETE","ATTRIBUTION_COMPLETE","DEBT_REGISTER_CURRENT"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000036','J36','ChallengerExperimentPlan','GLOBAL','MONTHLY','PROPOSAL_ONLY','q-research',2,false,now()+interval '30 days',interval '30 days','Quant Lead','IndependentValidation/QA','GLOBAL_UTC','FIXED_CADENCE','["HYPOTHESIS_APPROVED_FOR_EXPERIMENT","EXPERIMENT_REGISTRY_READY"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000037','J37','IndependentValidationPack','GLOBAL','QUARTERLY','PROPOSAL_ONLY','q-control',2,false,now()+interval '90 days',interval '90 days','IndependentValidation','Risk/Compliance','GLOBAL_UTC','FIXED_CADENCE','["OOS_COMPLETE","PBO_DSR_COMPLETE","REPRODUCIBILITY_COMPLETE"]','LATEST_ONLY',1),
|
||||||
|
('e4100000-0000-4000-8000-000000000038','J38','ModelPolicyDebtReview','GLOBAL','MONTHLY','PROPOSAL_ONLY','q-control',2,false,now()+interval '30 days',interval '30 days','Risk/Architect','Quant/PM','GLOBAL_UTC','FIXED_CADENCE','["DEBT_REGISTER_CURRENT","INCIDENT_REVIEW_COMPLETE"]','LATEST_ONLY',1)
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
-- v14.0 governed feedback-cycle delta.
|
||||||
|
-- This migration formalizes evidence-to-hypothesis-to-independent-validation history.
|
||||||
|
-- It does not enable automatic model activation, client publication, automatic order submission or KIS submission.
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_feedback_cycle (
|
||||||
|
cycle_id uuid primary key,
|
||||||
|
scope_key text not null,
|
||||||
|
base_model_version text not null,
|
||||||
|
state text not null check (state in (
|
||||||
|
'PLANNED','PREDICTION_FROZEN','OUTCOMES_MATURING','EVALUATED','IMPROVEMENT_PROPOSED',
|
||||||
|
'CHALLENGER_PLANNED','INDEPENDENTLY_VALIDATED','PROMOTION_REVIEW_PENDING','BUSINESS_HOLD','CLOSED')),
|
||||||
|
revision integer not null check (revision > 0),
|
||||||
|
started_at timestamptz not null,
|
||||||
|
closed_at timestamptz null,
|
||||||
|
last_evidence_hash text not null,
|
||||||
|
updated_at timestamptz not null,
|
||||||
|
check ((state = 'CLOSED') = (closed_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_model_feedback_cycle_scope_state
|
||||||
|
on evaluation.model_feedback_cycle (scope_key, state, updated_at desc);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_feedback_transition (
|
||||||
|
transition_id uuid primary key,
|
||||||
|
cycle_id uuid not null references evaluation.model_feedback_cycle(cycle_id),
|
||||||
|
sequence_no integer not null check (sequence_no > 0),
|
||||||
|
from_state text not null,
|
||||||
|
to_state text not null,
|
||||||
|
reason_code text not null,
|
||||||
|
evidence_hash text not null,
|
||||||
|
actor_id text not null,
|
||||||
|
actor_type text not null check (actor_type in ('SYSTEM','OPERATOR','INDEPENDENT_VALIDATOR','INVESTMENT_COMMITTEE')),
|
||||||
|
correlation_id text not null,
|
||||||
|
occurred_at timestamptz not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
unique (cycle_id, sequence_no)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.model_hypothesis_evidence (
|
||||||
|
hypothesis_evidence_id uuid primary key,
|
||||||
|
hypothesis_id uuid not null references governance.model_improvement_hypothesis(hypothesis_id),
|
||||||
|
side text not null check (side in ('SUPPORTING','COUNTER')),
|
||||||
|
classification text not null check (classification in ('SOURCE','ASSUMPTION','UNKNOWN','DECISION_REQUIRED')),
|
||||||
|
reference_code text not null,
|
||||||
|
statement text not null,
|
||||||
|
content_hash text not null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
unique (hypothesis_id, side, reference_code, content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.model_activation_decision (
|
||||||
|
activation_decision_id uuid primary key,
|
||||||
|
scope_key text not null,
|
||||||
|
candidate_model_version text not null,
|
||||||
|
promotion_review_id uuid not null references governance.model_promotion_review(review_id),
|
||||||
|
decision text not null check (decision in ('KEEP_CURRENT_CHAMPION','ACTIVATE_FOR_SHADOW','ACTIVATE_FOR_PILOT','REJECT','EXPIRE')),
|
||||||
|
effective_at timestamptz null,
|
||||||
|
rollback_model_version text not null,
|
||||||
|
maker_id text not null,
|
||||||
|
checker_id text not null,
|
||||||
|
actor_type text not null check (actor_type = 'HUMAN_CHANGE_APPROVAL'),
|
||||||
|
change_ticket text not null,
|
||||||
|
evidence_bundle_hash text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
decided_at timestamptz not null,
|
||||||
|
check (maker_id <> checker_id),
|
||||||
|
check (decision not in ('ACTIVATE_FOR_SHADOW','ACTIVATE_FOR_PILOT') or effective_at is not null)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Immutable evidence. The cycle aggregate itself remains mutable only through optimistic application logic;
|
||||||
|
-- every transition is captured here and cannot be edited or deleted.
|
||||||
|
drop trigger if exists model_feedback_transition_append_only on evaluation.model_feedback_transition;
|
||||||
|
create trigger model_feedback_transition_append_only
|
||||||
|
before update or delete on evaluation.model_feedback_transition
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists model_hypothesis_evidence_append_only on governance.model_hypothesis_evidence;
|
||||||
|
create trigger model_hypothesis_evidence_append_only
|
||||||
|
before update or delete on governance.model_hypothesis_evidence
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists model_activation_decision_append_only on governance.model_activation_decision;
|
||||||
|
create trigger model_activation_decision_append_only
|
||||||
|
before update or delete on governance.model_activation_decision
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
comment on table governance.model_activation_decision is
|
||||||
|
'Human-only activation decision. Scheduler, Hangfire worker and proposal jobs must not insert into this table.';
|
||||||
|
|
||||||
|
-- Integrity audit is disabled until cycle aging, ownership and alert contracts are approved.
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner,
|
||||||
|
calendar_id, due_policy, dependency_json, catch_up_policy, max_catch_up)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000039','J39','FeedbackCycleIntegrityAudit','GLOBAL','DAILY','EVALUATION_ONLY','q-control',1,false,now()+interval '1 day',interval '1 day','Compliance/QA','Quant/SRE','GLOBAL_UTC','FIXED_CADENCE','["FEEDBACK_CYCLE_CONTRACT_APPROVED","AGING_POLICY_APPROVED"]','LATEST_ONLY',1)
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
-- v15.0 execution-completeness delta.
|
||||||
|
-- Evidence evaluation/proposal automation only. Automatic model activation, client publication,
|
||||||
|
-- automatic order submission and KIS submission remain forbidden.
|
||||||
|
|
||||||
|
alter table evaluation.model_operation_schedule
|
||||||
|
add column if not exists dispatch_revision integer not null default 0 check (dispatch_revision >= 0),
|
||||||
|
add column if not exists anchor_at timestamptz null,
|
||||||
|
add column if not exists timezone_id text not null default 'UTC',
|
||||||
|
add column if not exists last_completed_at timestamptz null,
|
||||||
|
add column if not exists last_hold_code text null;
|
||||||
|
|
||||||
|
update evaluation.model_operation_schedule
|
||||||
|
set anchor_at = coalesce(anchor_at, next_due_at)
|
||||||
|
where anchor_at is null;
|
||||||
|
|
||||||
|
alter table evaluation.model_operation_request
|
||||||
|
add column if not exists execution_revision integer not null default 1 check (execution_revision > 0),
|
||||||
|
add column if not exists last_heartbeat_at timestamptz null,
|
||||||
|
add column if not exists hold_until timestamptz null,
|
||||||
|
add column if not exists status_reason_code text null,
|
||||||
|
add column if not exists scheduled_for timestamptz null;
|
||||||
|
|
||||||
|
create table if not exists evaluation.prediction_evaluation_window (
|
||||||
|
window_request_id uuid primary key,
|
||||||
|
prediction_evidence_id uuid not null,
|
||||||
|
scope_key text not null,
|
||||||
|
calendar_id text not null,
|
||||||
|
prediction_session date not null,
|
||||||
|
window_trading_days integer not null check (window_trading_days in (1,5,20,63,126,252)),
|
||||||
|
due_session date not null,
|
||||||
|
status text not null check (status in ('PLANNED','MATURED','EVALUATED','BUSINESS_HOLD','QUARANTINED')),
|
||||||
|
dataset_id text not null,
|
||||||
|
model_version text not null,
|
||||||
|
metric_definition_set_hash text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
matured_at timestamptz null,
|
||||||
|
evaluated_at timestamptz null,
|
||||||
|
check (due_session >= prediction_session),
|
||||||
|
unique (prediction_evidence_id, window_trading_days, metric_definition_set_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists ix_prediction_evaluation_window_due
|
||||||
|
on evaluation.prediction_evaluation_window (due_session, status, scope_key)
|
||||||
|
where status in ('PLANNED','BUSINESS_HOLD');
|
||||||
|
|
||||||
|
create table if not exists evaluation.metric_cohort_definition (
|
||||||
|
cohort_code text not null,
|
||||||
|
definition_version integer not null check (definition_version > 0),
|
||||||
|
scope_expression text not null,
|
||||||
|
inclusion_expression text not null,
|
||||||
|
exclusion_expression text not null,
|
||||||
|
minimum_sample_size integer not null check (minimum_sample_size >= 0),
|
||||||
|
effective_from timestamptz not null,
|
||||||
|
effective_to timestamptz null,
|
||||||
|
status text not null check (status in ('PROPOSED','APPROVED','RETIRED')),
|
||||||
|
content_hash text not null unique,
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
primary key (cohort_code, definition_version),
|
||||||
|
check (effective_to is null or effective_to > effective_from),
|
||||||
|
check (status <> 'APPROVED' or (approved_by is not null and approved_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.ui_contract_release (
|
||||||
|
ui_contract_release_id uuid primary key,
|
||||||
|
contract_version text not null,
|
||||||
|
provider_id text not null,
|
||||||
|
provider_version text not null,
|
||||||
|
capability_hash text not null,
|
||||||
|
screen_template_hash text not null,
|
||||||
|
accessibility_evidence_hash text not null,
|
||||||
|
visual_regression_hash text null,
|
||||||
|
performance_evidence_hash text null,
|
||||||
|
status text not null check (status in ('PROPOSED','APPROVED','RETIRED')),
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null default now(),
|
||||||
|
content_hash text not null unique,
|
||||||
|
unique (contract_version, provider_id, provider_version),
|
||||||
|
check (status <> 'APPROVED' or (approved_by is not null and approved_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Evaluation windows, cohort definitions and UI contract approvals are immutable evidence.
|
||||||
|
drop trigger if exists prediction_evaluation_window_append_only on evaluation.prediction_evaluation_window;
|
||||||
|
create trigger prediction_evaluation_window_append_only
|
||||||
|
before update or delete on evaluation.prediction_evaluation_window
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists metric_cohort_definition_append_only on evaluation.metric_cohort_definition;
|
||||||
|
create trigger metric_cohort_definition_append_only
|
||||||
|
before update or delete on evaluation.metric_cohort_definition
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists ui_contract_release_append_only on governance.ui_contract_release;
|
||||||
|
create trigger ui_contract_release_append_only
|
||||||
|
before update or delete on governance.ui_contract_release
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
comment on table evaluation.prediction_evaluation_window is
|
||||||
|
'Immutable 1/5/20/63/126/252 trading-session maturity plan. Revisions create new evidence rows.';
|
||||||
|
comment on table governance.ui_contract_release is
|
||||||
|
'Approved normalized UI contract/provider evidence. It does not authorize feature behavior or investment decisions.';
|
||||||
|
|
||||||
|
-- Integrity audit remains disabled until approved calendar/cohort definitions and alert runbook exist.
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner,
|
||||||
|
calendar_id, due_policy, dependency_json, catch_up_policy, max_catch_up, anchor_at, timezone_id)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000040','J40','EvaluationWindowIntegrityAudit','GLOBAL','DAILY','EVALUATION_ONLY','q-control',1,false,now()+interval '1 day',interval '1 day','Quant/QA','Data/SRE','GLOBAL_UTC','FIXED_CADENCE','["TRADING_CALENDAR_APPROVED","METRIC_COHORT_APPROVED"]','LATEST_ONLY',1,now()+interval '1 day','UTC')
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
-- v16.0 reference implementation closure.
|
||||||
|
-- Evaluation/proposal/audit only. Automatic model activation, customer publication,
|
||||||
|
-- automatic order submission and KIS submission remain forbidden.
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_operation_lease (
|
||||||
|
operation_code text not null,
|
||||||
|
scope_key text not null,
|
||||||
|
fencing_token bigint not null check (fencing_token > 0),
|
||||||
|
lease_owner text not null,
|
||||||
|
acquired_at timestamptz not null,
|
||||||
|
expires_at timestamptz not null,
|
||||||
|
heartbeat_at timestamptz not null,
|
||||||
|
dispatch_revision integer not null check (dispatch_revision >= 0),
|
||||||
|
primary key (operation_code, scope_key),
|
||||||
|
check (expires_at > acquired_at),
|
||||||
|
check (heartbeat_at >= acquired_at)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists evaluation.model_evaluation_reconciliation (
|
||||||
|
reconciliation_id uuid primary key,
|
||||||
|
prediction_evidence_id uuid not null,
|
||||||
|
window_trading_days integer not null check (window_trading_days in (1,5,20,63,126,252)),
|
||||||
|
action text not null check (action in ('NONE','PLAN_MISSING','QUARANTINE_DUPLICATE','BUSINESS_HOLD_LATE','RECALCULATE_REVISION')),
|
||||||
|
metric_definition_set_hash text not null,
|
||||||
|
cohort_definition_hash text not null,
|
||||||
|
dataset_id text not null,
|
||||||
|
source_revision_hash text not null,
|
||||||
|
reason_code text not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
unique (prediction_evidence_id, window_trading_days, content_hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists building_blocks.projection_rebuild_request (
|
||||||
|
rebuild_request_id uuid primary key,
|
||||||
|
projection_name text not null,
|
||||||
|
requested_version integer not null check (requested_version > 0),
|
||||||
|
source_watermark text not null,
|
||||||
|
requested_by text not null,
|
||||||
|
reason_code text not null,
|
||||||
|
status text not null check (status in ('REQUESTED','RUNNING','SUCCEEDED','FAILED','QUARANTINED')),
|
||||||
|
before_hash text null,
|
||||||
|
after_hash text null,
|
||||||
|
requested_at timestamptz not null,
|
||||||
|
completed_at timestamptz null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
check (completed_at is null or completed_at >= requested_at)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table if not exists governance.ui_adapter_compatibility_evidence (
|
||||||
|
compatibility_evidence_id uuid primary key,
|
||||||
|
contract_version text not null,
|
||||||
|
provider_id text not null,
|
||||||
|
provider_version text not null,
|
||||||
|
capability_hash text not null,
|
||||||
|
contract_test_hash text not null,
|
||||||
|
accessibility_test_hash text not null,
|
||||||
|
visual_test_hash text null,
|
||||||
|
performance_test_hash text null,
|
||||||
|
rollback_test_hash text null,
|
||||||
|
status text not null check (status in ('PROPOSED','APPROVED','REJECTED','RETIRED')),
|
||||||
|
approved_by text null,
|
||||||
|
approved_at timestamptz null,
|
||||||
|
created_at timestamptz not null,
|
||||||
|
content_hash text not null unique,
|
||||||
|
check (status <> 'APPROVED' or (approved_by is not null and approved_at is not null))
|
||||||
|
);
|
||||||
|
|
||||||
|
drop trigger if exists model_evaluation_reconciliation_append_only on evaluation.model_evaluation_reconciliation;
|
||||||
|
create trigger model_evaluation_reconciliation_append_only before update or delete on evaluation.model_evaluation_reconciliation
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
drop trigger if exists ui_adapter_compatibility_evidence_append_only on governance.ui_adapter_compatibility_evidence;
|
||||||
|
create trigger ui_adapter_compatibility_evidence_append_only before update or delete on governance.ui_adapter_compatibility_evidence
|
||||||
|
for each row execute function building_blocks.prevent_append_only_change();
|
||||||
|
|
||||||
|
insert into evaluation.model_operation_schedule
|
||||||
|
(schedule_id, operation_code, operation_name, scope_key, cadence, automation_mode, queue_name,
|
||||||
|
schedule_version, enabled, next_due_at, max_lag, primary_owner, secondary_owner,
|
||||||
|
calendar_id, due_policy, dependency_json, catch_up_policy, max_catch_up, anchor_at, timezone_id)
|
||||||
|
values
|
||||||
|
('e4100000-0000-4000-8000-000000000041','J41','SchedulerLeaseIntegrityAudit','GLOBAL','DAILY','EVALUATION_ONLY','q-control',1,false,now()+interval '1 day',interval '1 day','SRE/QA','BE/DBA','GLOBAL_UTC','FIXED_CADENCE','["LEASE_CONTRACT_APPROVED","ALERT_RUNBOOK_APPROVED"]','LATEST_ONLY',1,now()+interval '1 day','UTC'),
|
||||||
|
('e4100000-0000-4000-8000-000000000042','J42','ModelEvaluationReconciliation','GLOBAL','DAILY','EVALUATION_ONLY','q-evaluation',1,false,now()+interval '1 day',interval '1 day','Quant/QA','Data/Risk','GLOBAL_UTC','FIXED_CADENCE','["TRADING_CALENDAR_APPROVED","METRIC_COHORT_APPROVED","SOURCE_REVISION_INDEX_READY"]','LATEST_ONLY',1,now()+interval '1 day','UTC')
|
||||||
|
on conflict (operation_code, scope_key, schedule_version) do nothing;
|
||||||
|
|
||||||
|
comment on table evaluation.model_operation_lease is 'Lease fencing prevents stale workers from advancing schedules or duplicating model evaluation side effects.';
|
||||||
|
comment on table evaluation.model_evaluation_reconciliation is 'Append-only evaluation repair plan. It never activates a model or submits an order.';
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:17
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: kartsell
|
||||||
|
POSTGRES_USER: kartsell
|
||||||
|
POSTGRES_PASSWORD: kartsell
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- kartsell_postgres:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
kartsell_postgres:
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# 00. 경영진·아키텍처 최종 제안
|
||||||
|
|
||||||
|
## 1. 결론
|
||||||
|
|
||||||
|
기존 v10.0의 방향은 옳다. 다만 본프로그램 착수 전에 해야 할 일은 기능을 더 추가하는 것이 아니라 **연구 코드와 생산 코드의 경계를 확실히 나누고, 데이터·알고리즘·승인·평가를 하나의 반복 가능한 Vertical Slice로 연결하는 것**이다.
|
||||||
|
|
||||||
|
실행 우선순위는 다음과 같다.
|
||||||
|
|
||||||
|
1. **연구 재현성 복구**: 원시 데이터 manifest, 환경 lock, 실행 인자, artifact hash
|
||||||
|
2. **알고리즘 상태기계 정공법 전환**: scalar position이 아닌 Lot/Cycle 단위
|
||||||
|
3. **데이터 정합성 Gate**: PIT·기업행사·총수익·비용·상폐·FX
|
||||||
|
4. **BE Walking Skeleton**: Evidence → SellDecision → ReentryWatch → Review → Outcome
|
||||||
|
5. **FE 업무화면**: Query/Error/Auth/State Matrix를 먼저 표준화
|
||||||
|
6. **Shadow 운영**: 일평가와 false-exit·재진입 포착·대사·DR 검증
|
||||||
|
|
||||||
|
## 2. 과유불급 기준
|
||||||
|
|
||||||
|
| 영역 | 해야 할 것 | 하지 말아야 할 것 |
|
||||||
|
|---|---|---|
|
||||||
|
| 아키텍처 | Modular Monolith, schema ownership, Architecture Test | 초기 Microservice 분리 |
|
||||||
|
| SOLID | Policy·Adapter·Validator 책임 분리 | Interface·Factory·Repository 남발 |
|
||||||
|
| 공통화 | 의미·상태·변경축이 2회 이상 반복될 때 승격 | 한 번 쓰는 추상화 |
|
||||||
|
| 데이터 | 정규화된 Write Model, 재생성 가능한 Read Model | 화면 편의를 위한 Source Table 직접 Join |
|
||||||
|
| 알고리즘 | 순수 결정함수, 상태기계, Golden test | 복잡한 종합점수 하나로 모든 위험 상쇄 |
|
||||||
|
| FE | TanStack Query가 서버상태 소유 | Pinia에 API 응답 복제 |
|
||||||
|
| Batch | Job은 오케스트레이션만 | Hangfire Job에 정책·SQL·HTTP 혼합 |
|
||||||
|
| AI 코딩 | Source/Assumption/Unknown + 실행 증거 | 대화만 근거로 정책·컬럼·임계값 생성 |
|
||||||
|
|
||||||
|
## 3. 운영사급 Done의 정의
|
||||||
|
|
||||||
|
기능이 화면에서 보이는 것으로 끝나지 않는다. 아래가 모두 있어야 Done이다.
|
||||||
|
|
||||||
|
- Requirement/Policy/Data/API/DB/Event/Job/UI/Test/Metric/Runbook 추적
|
||||||
|
- 같은 입력·Version Set으로 같은 결과 재현
|
||||||
|
- 부분실패·중복·재처리·만료·권한·동시성 검증
|
||||||
|
- 고객 공개 전 maker-checker와 Evidence hash 보존
|
||||||
|
- Secondary 운영자의 rollback/replay 리허설
|
||||||
|
- 기술부채 Owner와 만료일
|
||||||
|
|
||||||
|
## 4. 권고 조직 운영
|
||||||
|
|
||||||
|
- Sprint capacity의 15%를 데이터·기술부채·재현성 개선에 고정한다.
|
||||||
|
- 알고리즘 변경 PR과 구조 리팩터링 PR을 분리한다.
|
||||||
|
- Quant 승인 없는 Golden 변경, DBA 승인 없는 PIT/DDL 변경, 준법 승인 없는 공개 문구 변경을 병합하지 않는다.
|
||||||
|
- Production 승격과 투자일임형 검토는 적중률이 아니라 장기 비용후 효용과 운영 무결성의 복합 Gate로 결정한다.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# 01. 첨부 연구 소스 정량·구조 감사
|
||||||
|
|
||||||
|
## A. 즉시 조치 P0
|
||||||
|
|
||||||
|
| ID | 소스 관찰 | 영향 | 조치 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| SRC-P0-01 | 원시 가격데이터와 실행환경 lock이 번들에 없음 | 제3자가 결과를 완전 재현할 수 없음 | Data Manifest, checksum, Python lock, container image digest를 Evidence Pack에 포함 |
|
||||||
|
| SRC-P0-02 | `v12_positions()`가 전체 보유를 하나의 `entry/peak/floor`로 관리하고 재진입 시 모두 reset | 기존 Core lot과 신규 tactical lot의 사이클이 다시 혼합됨 | `PositionLot`·`CycleState`별 보호선과 재진입 생성 |
|
||||||
|
| SRC-P0-03 | KR corporate action을 근사 정수비율로 과거 전체에 소급 조정 | 공식 기업행사와 다를 경우 수익·ATR·보호선 왜곡 | 공식 CA master 우선, 추정값은 QUARANTINED evidence로만 사용 |
|
||||||
|
| SRC-P0-04 | 총수익·PIT 재무·상폐·세금·FX가 없음 | 생산 매도·기대효용 판단 불가 | 가격정책 연구로 한정, 생산 승격 차단 |
|
||||||
|
| SRC-P0-05 | `portfolio_backtest()`의 overlay 비용이 전역 US 7bps로 고정 | KR 자본바닥 결과의 비용 라벨과 실제 계산 불일치 | 비용을 함수 인자로 강제하고 FeeSchedule PIT로 전환 |
|
||||||
|
|
||||||
|
## B. P1 리팩터링
|
||||||
|
|
||||||
|
| ID | 관찰 | 개선 |
|
||||||
|
|---|---|---|
|
||||||
|
| SRC-P1-01 | `v11_positions`, `v12_positions`, `positions_fast`에 정책 로직 중복 | 단일 Policy Core와 vectorized adapter 분리 |
|
||||||
|
| SRC-P1-02 | `giveback_cap_v12()`가 정의돼 있으나 실제 v12 계산은 `giveback_cap_v11()` 사용 | dead code 제거 또는 정책 ID와 Golden으로 의도 명시 |
|
||||||
|
| SRC-P1-03 | `core_floor()`와 별도 `min_pos` literal map이 중복 | YAML→typed config→single resolver |
|
||||||
|
| SRC-P1-04 | `ROOT=/mnt/data`, FILES global, import 시 output directory 생성 | CLI/config 주입, library와 runner 분리 |
|
||||||
|
| SRC-P1-05 | Data quality 함수가 global file을 재읽음 | raw input과 canonical input을 명시적으로 전달 |
|
||||||
|
| SRC-P1-06 | 거래일 결측을 calendar gap으로만 판단 | MarketCalendar 기반 expected session 검증 |
|
||||||
|
| SRC-P1-07 | backtest cost는 신호일, exposure는 다음날 lag로 반영 | OrderIntent/Fill 시점으로 비용·수량·현금 정렬 |
|
||||||
|
| SRC-P1-08 | 동적 동일가중에서 종목 시작/종료에 따른 비중 변화 비용이 명시되지 않음 | UniverseEvent와 rebalance trade를 별도 모델링 |
|
||||||
|
| SRC-P1-09 | `false_exit_rate_63d`가 단순 63일 +10% 여부 | 매도비중·benchmark·비용·재진입을 반영한 FalseExitCost 정의 |
|
||||||
|
| SRC-P1-10 | 9개 local parameter grid만으로 robustness 판단 | CSCV/PBO, Deflated Sharpe, block bootstrap, walk-forward 확대 |
|
||||||
|
|
||||||
|
## C. 유지할 요소
|
||||||
|
|
||||||
|
- 수익구간 이후 활성화되는 단조 보호선
|
||||||
|
- 갭 이탈과 2종가 이탈의 부분매도 구분
|
||||||
|
- 다음 거래가능 세션 execution lag
|
||||||
|
- 최소 10세션 재진입 대기와 50일선 상승·20일 고점 조건
|
||||||
|
- 자본바닥 개념과 비용 스트레스
|
||||||
|
|
||||||
|
## D. 연구 코드 목표 구조
|
||||||
|
|
||||||
|
```text
|
||||||
|
research/
|
||||||
|
pyproject.toml + lock
|
||||||
|
src/kartsell_research/
|
||||||
|
data/ # loader, PIT calendar, CA adjustment
|
||||||
|
domain/ # pure policy contract shared with golden vectors
|
||||||
|
simulation/ # order/fill/cost/cash/universe
|
||||||
|
evaluation/ # metrics, false-exit, PBO/DSR
|
||||||
|
cli/ # no import-time side effects
|
||||||
|
manifests/
|
||||||
|
fixtures/
|
||||||
|
tests/
|
||||||
|
artifacts/<run-id>/manifest.json
|
||||||
|
```
|
||||||
|
|
||||||
|
연구 Python과 .NET 생산 정책은 서로 호출하지 않는다. 대신 동일한 Golden input/output vector와 Policy ID를 공유해 의미 회귀를 검증한다.
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# 02. 알고리즘 리팩터링·고도화 기준
|
||||||
|
|
||||||
|
## 1. 생산 모델 경계
|
||||||
|
|
||||||
|
생산 엔진은 수익률 최대화 함수가 아니라 다음의 순서가 보존된 **결정 상태기계**다.
|
||||||
|
|
||||||
|
```text
|
||||||
|
HARD_IMPAIRMENT
|
||||||
|
→ PORTFOLIO_SURVIVAL
|
||||||
|
→ DYNAMIC_PROFIT_FLOOR
|
||||||
|
→ CONCENTRATION_LIQUIDITY
|
||||||
|
→ OPPORTUNITY_COST
|
||||||
|
→ REENTRY_OPTION
|
||||||
|
```
|
||||||
|
|
||||||
|
상위 정책이 행동을 결정하면 하위 점수는 이를 상쇄하지 못한다. 모든 정책은 `PolicyId`, 입력 `EvidenceId`, `ModelVersion`, `ConfigVersion`, 허용오차와 반대증거를 남긴다.
|
||||||
|
|
||||||
|
## 2. Scalar Position 제거
|
||||||
|
|
||||||
|
기존 `position: float` 하나로는 Core와 Tactical, 기존 lot과 재진입 lot을 분리할 수 없다. 다음 모델로 전환한다.
|
||||||
|
|
||||||
|
```text
|
||||||
|
Portfolio
|
||||||
|
└─ PositionLot (원가·수량·개설/종료·세금 lot)
|
||||||
|
└─ CycleState (Entry, Peak, Floor, BreachCount, LastSell, LastBuy)
|
||||||
|
└─ ProtectionState / ReentryWatch
|
||||||
|
```
|
||||||
|
|
||||||
|
- 부분매도는 특정 Lot/Cycle에 귀속된다.
|
||||||
|
- 재진입은 새 `CycleId`와 새 Lot을 만든다.
|
||||||
|
- Strategic Core는 정책상 보호 대상 비중과 Tactical 비중을 분리한다.
|
||||||
|
- Hard Impairment는 자동 재진입을 금지한다.
|
||||||
|
|
||||||
|
## 3. Functional Core / Imperative Shell
|
||||||
|
|
||||||
|
**Pure Core**
|
||||||
|
|
||||||
|
- `SellPolicyChain.Evaluate(input)`
|
||||||
|
- `ReentryPolicy.Evaluate(input)`
|
||||||
|
- `PortfolioConstraintPolicy.Evaluate(input)`
|
||||||
|
- `ExpectedUtilityCalculator.Calculate(input)`
|
||||||
|
|
||||||
|
**Imperative Shell**
|
||||||
|
|
||||||
|
- PIT data query
|
||||||
|
- transaction, Dapper SQL
|
||||||
|
- EvidenceSnapshot 저장
|
||||||
|
- Outbox 발행
|
||||||
|
- Hangfire schedule/retry
|
||||||
|
- SignalR/Telegram 통지
|
||||||
|
|
||||||
|
## 4. 기대효용 계산 분해
|
||||||
|
|
||||||
|
한 개의 opaque score 대신 구성요소를 별도로 저장한다.
|
||||||
|
|
||||||
|
- Hold expected return distribution P10/P50/P90
|
||||||
|
- ES95와 영구가치훼손 확률×LGD
|
||||||
|
- marginal portfolio risk
|
||||||
|
- liquidity/slippage/tax/FX
|
||||||
|
- replacement lower confidence edge
|
||||||
|
- reentry option loss
|
||||||
|
|
||||||
|
Opportunity sell은 순우위의 신뢰하단이 0을 넘고 IPS·유동성·세금 제약을 통과할 때만 허용한다.
|
||||||
|
|
||||||
|
## 5. 실행 시뮬레이션
|
||||||
|
|
||||||
|
- 결정: 시장 종가 후
|
||||||
|
- 주문의도: 다음 거래가능 세션
|
||||||
|
- Fill: open/VWAP/limit 모델 중 승인된 시나리오
|
||||||
|
- 부분체결, gap, ADV participation, spread, FX, 세금, 수수료를 별도 이벤트로 기록
|
||||||
|
- SignalDecision과 Fill은 분리해 추천 성과·실행 성과·고객 행동을 attribution한다.
|
||||||
|
|
||||||
|
## 6. 일평가
|
||||||
|
|
||||||
|
일평가는 단타 적중률이 아니다.
|
||||||
|
|
||||||
|
| 영역 | 핵심 |
|
||||||
|
|---|---|
|
||||||
|
| 운영 무결성 | duplicate, lookahead, DQ hold, 미승인 공개, reconciliation |
|
||||||
|
| 예측 | coverage, calibration, Brier/log loss |
|
||||||
|
| 매도 | ES/MDD 감소, permanent loss 회피, gain capture, false-exit cost |
|
||||||
|
| 재진입 | capture, delay cost, duplicate stage, expiry |
|
||||||
|
| 비용후 효용 | 20/63/126/252 거래일 |
|
||||||
|
| 모델리스크 | PBO, DSR, parameter stability, regime drift |
|
||||||
|
|
||||||
|
## 7. 변경 규칙
|
||||||
|
|
||||||
|
임계값·수식·우선순위를 바꾸는 PR은 반드시 다음을 포함한다.
|
||||||
|
|
||||||
|
1. Policy ID와 변경 사유
|
||||||
|
2. Characterization/Golden diff
|
||||||
|
3. Frozen OOS와 cost×2 결과
|
||||||
|
4. market/asset/regime별 영향
|
||||||
|
5. false-exit·reentry·ES 영향
|
||||||
|
6. ModelCard와 rollback 기준
|
||||||
|
7. Quant/Risk 승인
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# 03. BE/FE 아키텍처 개선안
|
||||||
|
|
||||||
|
## 1. Modular Monolith 경계
|
||||||
|
|
||||||
|
- 단일 배포로 시작하되 module·PostgreSQL schema·namespace·API contract를 분리한다.
|
||||||
|
- 모듈은 다른 모듈의 Source Table을 직접 조회하지 않는다.
|
||||||
|
- 동기 의존은 좁은 Read Port, 비동기 결합은 Outbox/Inbox Event를 사용한다.
|
||||||
|
- Microservice 분리는 독립 SLO·배포·용량·소유팀이 실제로 필요할 때만 검토한다.
|
||||||
|
|
||||||
|
## 2. Vertical Slice 표준
|
||||||
|
|
||||||
|
```text
|
||||||
|
Features/<Slice>/
|
||||||
|
Endpoint.cs
|
||||||
|
Request.cs / Response.cs
|
||||||
|
Validator.cs
|
||||||
|
Handler.cs
|
||||||
|
Policy.cs
|
||||||
|
Sql.cs / Mapper.cs
|
||||||
|
Jobs/
|
||||||
|
Contracts/
|
||||||
|
Tests/
|
||||||
|
README.md # traceability
|
||||||
|
```
|
||||||
|
|
||||||
|
Endpoint는 HTTP, Handler는 use case/transaction, Policy는 순수 결정, Adapter는 외부 I/O만 담당한다.
|
||||||
|
|
||||||
|
## 3. Dapper·DB 원칙
|
||||||
|
|
||||||
|
- Generic Repository 금지
|
||||||
|
- schema-qualified SQL, 명시적 column, cancellation token
|
||||||
|
- Write는 3NF/append/revision, Read는 projection
|
||||||
|
- Evidence·Audit는 update/delete 차단
|
||||||
|
- DbUp migration은 module별 순번·checksum·fresh/upgrade test
|
||||||
|
- SELECT `*` 금지, PIT query는 `published_at <= cutoff`와 revision resolver 필수
|
||||||
|
|
||||||
|
## 4. Hangfire
|
||||||
|
|
||||||
|
Hangfire는 비즈니스 결정자가 아니라 승인된 Application Command의 반복 실행기다.
|
||||||
|
|
||||||
|
- JobRunId, Scope, IdempotencyKey, Watermark, Version Set, Input/Output Hash
|
||||||
|
- transient/permanent/DQ/business-hold retry class 분리
|
||||||
|
- q-research/q-backfill은 고객 SLA queue와 격리
|
||||||
|
- Job이 다른 Job을 직접 호출하지 않고 Event 또는 readiness gate로 연결
|
||||||
|
- 재처리는 overwrite가 아니라 새 Dataset/Revision 생성
|
||||||
|
|
||||||
|
## 5. FE 상태 소유권
|
||||||
|
|
||||||
|
| 상태 | 소유자 |
|
||||||
|
|---|---|
|
||||||
|
| API 서버상태·cache·stale·retry | TanStack Query |
|
||||||
|
| session·role·UI preference | Pinia |
|
||||||
|
| form | vee-validate + Zod |
|
||||||
|
| URL filter/selection | vue-router query/params |
|
||||||
|
| 대량 업무표 | AG Grid server row model |
|
||||||
|
|
||||||
|
Pinia에 API 응답을 복제하거나, 화면마다 401/409/422/429/503 처리를 다시 만들지 않는다.
|
||||||
|
|
||||||
|
## 6. FE 컴포넌트 승격 기준
|
||||||
|
|
||||||
|
공용 컴포넌트는 시각적 유사성이 아니라 동일한 업무 의미·상태·권한·접근성·테스트가 반복될 때만 만든다.
|
||||||
|
|
||||||
|
필수 공통: `QueryStateBoundary`, `PermissionGuard`, `DataGridShell`, `CrudForm`, `VersionConflictDialog`, `DataFreshnessBadge`.
|
||||||
|
|
||||||
|
도메인 공통: `EvidencePanel`, `ProtectionFloorPanel`, `ReentryTimeline`, `ApprovalPanel`, `VersionSetPanel`, `GateChecklist`.
|
||||||
|
|
||||||
|
## 7. 관측성
|
||||||
|
|
||||||
|
- HTTP/Job/SQL/Outbox를 correlationId·JobRunId·EvidenceId로 연결
|
||||||
|
- Serilog structured logging, OpenTelemetry trace/metric
|
||||||
|
- PII·token·API key는 log/tag 금지
|
||||||
|
- 운영 dashboard는 batch SLA, DQ quarantine, duplicate, recon break, model drift를 우선 표시
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
WBS_ID,Sprint,Workstream,Task,Deliverable,Done_Gate,Owner,PD,Dependency
|
||||||
|
R0.01,S0,Governance,Source/Assumption/Unknown registry 동결,docs/source_registry.csv,미확정 기본값 0,PM/Architect,3,-
|
||||||
|
R0.02,S0,Research,Python 환경·raw manifest·checksum 계약,research/pyproject.lock; manifests,동일 run artifact hash,Quant/Data,6,R0.01
|
||||||
|
R0.03,S0,Research,현재 결과 characterization,golden/current/*.csv,기존 CSV metric diff 0,Quant/QA,6,R0.02
|
||||||
|
R0.04,S0,Architecture,Solution/Module/Schema ownership 확정,ADR-001; module matrix,Architecture review,Architect/DBA,4,R0.01
|
||||||
|
R0.05,S0,DevEx,.NET/FE skeleton·CI·lockfile,"solution, package lock, workflow",restore/build/test green,PL/DevOps,8,R0.04
|
||||||
|
R0.06,S0,Observability,Correlation/OTel/Serilog walking skeleton,trace/log/metric smoke,HTTP→DB→Outbox trace,SRE/BE,5,R0.05
|
||||||
|
ALG.01,S1,Algorithm,Policy input/output contract와 PolicyId registry,SignalPolicyContracts,Quant/Risk 승인,Quant/BE,6,R0.03
|
||||||
|
ALG.02,S1,Algorithm,Lot/Cycle/Protection state model,"Domain/PositionLot,CycleState",invariant/property tests,BE/Quant,10,ALG.01
|
||||||
|
ALG.03,S1,Algorithm,Hard impairment policy,HardImpairmentPolicy,하위정책 상쇄 0,BE/Quant/QA,6,ALG.01
|
||||||
|
ALG.04,S1,Algorithm,Profit floor gap/two-close policy,ProfitFloorPolicies,boundary/monotonic tests,BE/Quant/QA,9,ALG.02
|
||||||
|
ALG.05,S2,Algorithm,Reentry watch state machine,ReentryStateMachine,new Cycle/duplicate0/expiry,BE/Quant/QA,10,ALG.02
|
||||||
|
ALG.06,S2,Algorithm,Expected utility components,ExpectedUtilityCalculator,decimal/CI/cost2x,Quant/BE,10,ALG.01
|
||||||
|
ALG.07,S2,Algorithm,Portfolio survival/concentration overlay,PortfolioConstraintPolicies,caps/property tests,Quant/BE,10,ALG.02
|
||||||
|
DATA.01,S1,Data,Source manifest/raw immutable schema,"raw_record,dataset_manifest",hash/revision/overwrite0,Data/DBA,8,R0.04
|
||||||
|
DATA.02,S1,Data,MarketCalendar/PIT temporal conventions,published/effective/tradable_session,lookahead0,Data/Quant/QA,8,DATA.01
|
||||||
|
DATA.03,S2,Data,Corporate Action/Total Return canonical model,CA/TR migrations+golden,official master reconcile,Data/DBA/Quant,12,DATA.01
|
||||||
|
DATA.04,S2,Data,Fee/Tax/FX temporal model,"fee_schedule,tax,fx",valid range overlap0,DBA/Quant,8,DATA.02
|
||||||
|
DATA.05,S2,Data,DQ rule engine/quarantine,DQ-01~12 pipeline,critical rule release block,Data/QA,12,DATA.01~04
|
||||||
|
DATA.06,S3,Data,Immutable ledger/lot/cycle,"ledger_entry,position_lot",debit-credit/reversal,BE/DBA/QA,12,"ALG.02,DATA.03~04"
|
||||||
|
DATA.07,S3,Data,Evidence/Decision/Watch schemas,"evidence,decision,watch",append/hash/state checks,DBA/BE,10,ALG.03~05
|
||||||
|
BE.01,S0,Backend,BuildingBlocks Result/Clock/Data/Outbox,src/KArtSell.BuildingBlocks,unit/architecture,BE,8,R0.05
|
||||||
|
BE.02,S0,Backend,FastEndpoints/ProblemDetails/Auth conventions,Host + Endpoint base,OpenAPI/error mapping,BE/Security,7,BE.01
|
||||||
|
BE.03,S0,Backend,Dapper transaction/DbUp runner,"DbSession, Migrator",fresh/upgrade/re-run,BE/DBA,8,BE.01
|
||||||
|
BE.04,S1,Backend,JobRun/Watermark/Hangfire queues,"job_run, job_watermark",duplicate0/resume,BE/SRE/DBA,10,BE.03
|
||||||
|
BE.05,S2,Backend,Evidence→SellDecision slice,VS-09/10,Golden/E2E/metric,BE/Quant/QA,14,"ALG.03~04,DATA.07"
|
||||||
|
BE.06,S2,Backend,Sell→ReentryWatch slice,VS-11,state/calendar/E2E,BE/Quant/QA,12,"ALG.05,BE.05"
|
||||||
|
BE.07,S3,Backend,Recommendation→Review→Publish slice,VS-14~16,maker-checker/hash/expiry,BE/FE/Compliance,18,BE.05~06
|
||||||
|
BE.08,S4,Backend,Outcome/Evaluation windows,VS-18,1/5/20/63/126/252,BE/Quant/Data,14,"BE.07,DATA.03~04"
|
||||||
|
BE.09,S4,Backend,Frozen backtest runner,VS-19,manifest/repro/cost2x,BE/Quant/QA,14,"R0.02,ALG.01~07"
|
||||||
|
BE.10,S5,Backend,Risk/Rebalance/Replacement,VS-13/21/22,constraints/NO_ACTION,BE/Quant/QA,18,"ALG.06~07,DATA.06"
|
||||||
|
FE.01,S0,Frontend,AppShell/router/query/api/error,app/shared,lint/type/test/build,FE,10,R0.05
|
||||||
|
FE.02,S1,Frontend,QueryState/Permission/Freshness,C-003~005,11-state/a11y,FE/QA,8,FE.01
|
||||||
|
FE.03,S1,Frontend,DataGrid/Form/Conflict primitives,C-006~010,paging/409/422,FE/QA,12,FE.01
|
||||||
|
FE.04,S2,Frontend,Evidence/Protection/Cost/Reentry components,C-016~019,boundary/table alternative,FE/Quant/UX,12,FE.02
|
||||||
|
FE.05,S3,Frontend,Recommendation review workbench,SCR-009/T05,RBAC/concurrency/E2E,FE/QA/Security,14,"BE.07,FE.03~04"
|
||||||
|
FE.06,S4,Frontend,Advice/Outcome/Scorecard pages,SCR-002/010,as-of/version/partial,FE/QA/Quant,14,"BE.08,FE.04"
|
||||||
|
FE.07,S5,Frontend,Portfolio/Rebalance/Product pages,SCR-004~006,10k grid/perf/a11y,FE/QA/Quant,16,"BE.10,FE.03"
|
||||||
|
QA.01,All,Quality,Architecture/import/schema tests,ArchitectureTests,금지 의존0,Architect/QA,8,R0.04
|
||||||
|
QA.02,All,Quality,PostgreSQL integration/Data tests,IntegrationTests/DataTests,fresh DB/PIT/replay,QA/DBA,14,"BE.03,DATA.01"
|
||||||
|
QA.03,S1~,Quality,Algorithm Golden/property/boundary,SignalEngine.Tests,same input same result,QA/Quant,14,ALG.01
|
||||||
|
QA.04,S2~,Quality,Job fault/retry/replay/concurrency,JobTests,duplicate0/resume,QA/SRE,12,BE.04
|
||||||
|
QA.05,S3~,Quality,Playwright role/state journeys,frontend/e2e,review/publish/expired,QA/FE,14,FE.05
|
||||||
|
OPS.01,S4,Operations,Metrics/alerts/runbooks,runbooks + dashboards,P1/P2 drill,SRE/Ops,10,BE.05~08
|
||||||
|
OPS.02,S5,Operations,Backfill/rebuild/reconcile,maintenance jobs,checkpoint/hash/reconcile,SRE/Data/DBA,12,DATA.01~07
|
||||||
|
OPS.03,S6,Operations,Shadow daily scorecard,J10/J11 dashboard,252일 누적 시작,Quant/Risk/Ops,12,"BE.08,OPS.01"
|
||||||
|
OPS.04,S6,Operations,Kill-switch/DR/Secondary rehearsal,Runbook evidence,RPO/RTO/rollback,SRE/Security/Ops,12,OPS.01~02
|
||||||
|
GATE.01,S0,Gate,G0 implementation-ready,Release Evidence,RG-01~10,Steering,2,R0.*
|
||||||
|
GATE.02,S2,Gate,G2 Algorithm/Data baseline,Model/Data evidence,Golden+PIT+replay,Quant/Risk/Data,3,"ALG.*,DATA.01~05"
|
||||||
|
GATE.03,S4,Gate,G3 Advisory E2E,E2E evidence,approval/publication/outcome,Compliance/QA,3,"BE.07~09,FE.05~06"
|
||||||
|
GATE.04,S6,Gate,G4 Shadow start,Ops evidence,DQ/recon/DR/kill-switch,Steering,3,OPS.01~04
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
DebtId,Title,RiskClass,Evidence,Impact,Owner,Secondary,Created,Due,Remediation,ExitTest,Priority,Decision
|
||||||
|
TD-001,Python 원시데이터·환경 lock 부재,Data/Model,source manifest warning,재현성 상실,Quant Lead,Data Lead,2026-08-01,S0,manifest+lock+container,clean-room replay hash,P1,Fix
|
||||||
|
TD-002,Scalar position과 lot cycle 혼합,Model,source v12_positions,보호선·재진입 왜곡,BE Lead,Quant Lead,2026-08-01,S2,Lot/Cycle state model,property+golden,P1,Fix
|
||||||
|
TD-003,KR capital-floor overlay 비용 상수,Model/Data,portfolio_backtest global cost,KR 결과 왜곡,Quant Lead,QA Lead,2026-08-01,S0,cost parameter/FeeSchedule,cost sensitivity diff,P1,Fix
|
||||||
|
TD-004,기업행사 추정 소급조정,Data,load_kr inferred integer rescale,가격·ATR 왜곡,Data Lead,DBA,2026-08-01,S2,official CA master,CA golden reconcile,P1,Fix
|
||||||
|
TD-005,정책 코드 중복,Engineering,v11/v12/fast,의미 drift,BE Lead,Quant Lead,2026-08-01,S2,single policy core,contract/golden,P2,Fix
|
||||||
|
TD-006,FE lockfile 미생성,Engineering,template baseline,빌드 비결정성,FE Lead,DevOps,2026-08-01,G0,pnpm-lock commit,CI frozen install,P2,Fix
|
||||||
|
TD-007,Read Model rebuild 미구현,Operations,initial template,화면 stale/recovery,Data Lead,SRE,2026-08-01,S6,projection version+rebuild,disaster rebuild test,P2,Defer
|
||||||
|
@@ -0,0 +1,35 @@
|
|||||||
|
# 06. 바이브코딩·홀루시네이션 통제
|
||||||
|
|
||||||
|
## AI 작업 입력 패킷
|
||||||
|
|
||||||
|
AI에게 코드를 요청하기 전에 아래 8개가 있어야 한다.
|
||||||
|
|
||||||
|
1. Source: 근거 문단/Policy ID/ADR/Data Contract
|
||||||
|
2. Slice Spec: 사용자 결과·비목표·상태·권한
|
||||||
|
3. Screen Spec: component/state/a11y
|
||||||
|
4. Contract: Endpoint/Event/Job/ProblemDetails/Idempotency/ETag
|
||||||
|
5. Data: schema/column/PIT/unit/migration/index/lineage
|
||||||
|
6. Tests: unit/integration/data/E2E/Golden/failure/replay
|
||||||
|
7. Ops: metric/alert/runbook/rollback/owner
|
||||||
|
8. Output Rule: 변경파일·명령·결과·가정·잔여위험
|
||||||
|
|
||||||
|
## 차단 규칙
|
||||||
|
|
||||||
|
- 근거 없는 Policy ID·임계값·DB 컬럼·API는 생성하지 않는다.
|
||||||
|
- 미확정은 `DECISION_REQUIRED` 또는 `DESIGN_PROPOSAL`로 표시한다.
|
||||||
|
- 한 PR은 한 Slice 또는 한 리팩터링 목적만 가진다.
|
||||||
|
- 기능 변경과 동작불변 리팩터링을 한 PR에 섞지 않는다.
|
||||||
|
- 실패·skip·실행하지 못한 테스트를 숨기지 않는다.
|
||||||
|
- AI가 생성한 SQL은 schema owner, PIT 조건, index, execution plan 검토를 받는다.
|
||||||
|
- AI가 생성한 알고리즘은 Golden/Frozen OOS diff 없이 병합하지 않는다.
|
||||||
|
- 실고객 데이터·token·API key를 프롬프트/fixture/log에 넣지 않는다.
|
||||||
|
|
||||||
|
## 리팩터링 정공법
|
||||||
|
|
||||||
|
1. Characterize: 현재 동작을 test/Golden/perf로 동결
|
||||||
|
2. Isolate: I/O와 순수 정책 seam 분리
|
||||||
|
3. Small Transform: rename/extract/move 한 종류씩
|
||||||
|
4. Verify: unit/integration/data/E2E/backtest/perf diff
|
||||||
|
5. Simplify: dead abstraction/flag/branch 삭제
|
||||||
|
6. Observe: release 후 SLO/DQ/model/recon 확인
|
||||||
|
7. Close Debt: Debt ID/ADR/Secondary 지식 이전
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# 07. 검증·Release Gate
|
||||||
|
|
||||||
|
## RG-01~10
|
||||||
|
|
||||||
|
| Gate | 조건 |
|
||||||
|
|---|---|
|
||||||
|
| RG-01 | REQ/SCR/VS/Policy ID와 사용자 결과·비목표 승인 |
|
||||||
|
| RG-02 | PIT 필드·단위·published_at·revision·DQ·source/license 정의 |
|
||||||
|
| RG-03 | 화면 template/component/state/권한 정의 |
|
||||||
|
| RG-04 | Endpoint/Event/Job/Read Model/DbUp/오류·멱등·동시성 정의 |
|
||||||
|
| RG-05 | queue/schedule/watermark/retry/replay/kill-switch 정의 |
|
||||||
|
| RG-06 | Unit/Integration/Data/E2E/Golden/Failure/Replay 연결 |
|
||||||
|
| RG-07 | Metric/Alert/Runbook/Rollback/Owner/Secondary 정의 |
|
||||||
|
| RG-08 | AI Source/Unknown/Design Proposal 구분 |
|
||||||
|
| RG-09 | 정규화/Read Model lineage/rebuild/staleness 승인 |
|
||||||
|
| RG-10 | PR 한 목적, 선행 의존 충족 |
|
||||||
|
|
||||||
|
## Release 차단 기준
|
||||||
|
|
||||||
|
- lookahead > 0
|
||||||
|
- Evidence hash 재현 < 100%
|
||||||
|
- duplicate command/job/order > 0
|
||||||
|
- 미승인 공개 > 0
|
||||||
|
- ledger/reconciliation 미승인 break > 0
|
||||||
|
- Critical secret/PII 노출
|
||||||
|
- Model/Config/Data SHA 누락
|
||||||
|
- 자동주문 Capability ON
|
||||||
|
|
||||||
|
## 생산 승격 제외
|
||||||
|
|
||||||
|
이 템플릿은 자동주문과 투자일임형 승격을 구현하지 않는다. 최소 252거래일 Shadow와 복수 국면, 비용후 효용, calibration, ES/영구손실, false-exit·재진입, PBO/DSR, 대사·DR·준법 Gate 후 별도 승인 대상이다.
|
||||||
@@ -0,0 +1,298 @@
|
|||||||
|
# K-ArtSell Aegis v11.1 전략적 하드닝 제안
|
||||||
|
|
||||||
|
상태: `IMPLEMENTATION_DELTA / STATIC_REVIEWED_NOT_BUILD_VERIFIED`
|
||||||
|
기준선: SI 누적 통합 실행기준서 v10.0 + K-ArtSell 12.2 연구 번들 + v11 구현 가속 패키지
|
||||||
|
운영 경계: 투자자문형 우선 · 자동주문 OFF · `RESEARCH_CANDIDATE_NOT_PRODUCTION`
|
||||||
|
|
||||||
|
## 1. 결론
|
||||||
|
|
||||||
|
v10.0과 v11 패키지를 다시 쓰지 않는다. `Baseline Preservation + Delta + Supersession + Traceability` 원칙으로 v11.1 하드닝 Delta를 추가한다.
|
||||||
|
|
||||||
|
우선순위는 다음과 같다.
|
||||||
|
|
||||||
|
1. 연구 결과 재현성 복구: 원시 데이터 manifest, checksum, Python lock, 실행 이미지 digest.
|
||||||
|
2. PIT·기업행사·총수익·비용·상폐·FX 데이터 정합성.
|
||||||
|
3. Scalar position 제거와 Lot/Cycle 기반 매도·재진입 상태기계.
|
||||||
|
4. EvidenceSnapshot → SellDecision → Recommendation → Review → Publish → Outcome의 불변 추적.
|
||||||
|
5. BE/FE/Job/DB를 Slice 단위로 끝내는 Vertical Slice.
|
||||||
|
6. Shadow 일평가와 운영 무결성. 자동주문은 별도 승인 전까지 구현·활성화 금지.
|
||||||
|
|
||||||
|
## 2. 첨부 소스에서 확인한 핵심 결함
|
||||||
|
|
||||||
|
### P0
|
||||||
|
|
||||||
|
- 연구 번들에 원시 데이터와 환경 lock이 없어 제3자 clean-room 재현이 불가능하다.
|
||||||
|
- Python `v12_positions()`가 기존 Core와 신규 Tactical lot을 하나의 entry/peak/floor로 혼합한다.
|
||||||
|
- 한국 기업행사를 정수비율 추정으로 과거 전체에 소급 적용한다.
|
||||||
|
- 총수익·PIT 재무/컨센서스·상폐수익·세금·FX가 불완전하다.
|
||||||
|
- 자본바닥 비용이 함수 계약이 아니라 전역 상수에 묶여 결과 라벨과 실제 계산이 달라질 수 있다.
|
||||||
|
- v11 템플릿의 연구 평가 Endpoint가 `AllowAnonymous()`이고, Handler·Evidence 검증·DB 저장·Outbox가 없다.
|
||||||
|
- FE CI는 `pnpm-lock.yaml`을 요구하지만 패키지에 lockfile이 없다.
|
||||||
|
|
||||||
|
### P1
|
||||||
|
|
||||||
|
- 매도 정책이 Hard impairment, gap, two-close 3개만 구현되어 survival·집중/유동성·기회비용이 누락됐다.
|
||||||
|
- 매도비중의 단위가 “현재 lot 대비 비율”인지 “포트폴리오 절대비중”인지 계약이 모호하다.
|
||||||
|
- Reentry 상태기계가 `REENTERED → WATCH/OPEN` 다단계 전이를 표현하지 못한다.
|
||||||
|
- Evidence 불변 trigger는 있으나 SignalDecision 불변 trigger가 빠져 있다.
|
||||||
|
- Architecture Test가 Generic Repository 문자열 탐지만 수행한다.
|
||||||
|
- FE가 API contract를 수동 중복 정의하고, retry 시 Idempotency-Key를 새로 만들어 동일 명령의 재시도 의미를 깨뜨린다.
|
||||||
|
|
||||||
|
## 3. SOLID의 현장 적용
|
||||||
|
|
||||||
|
| 원칙 | 적용 | 과유불급 차단 |
|
||||||
|
|---|---|---|
|
||||||
|
| S | Endpoint=HTTP, Handler=유스케이스/트랜잭션, Policy=순수 결정, Adapter=외부 I/O | God Service, Job 내 정책 로직 금지 |
|
||||||
|
| O | Policy/DQ/Adapter는 명시적 registry로 추가하되 우선순위와 계약은 고정 | 임의 plugin framework, reflection 기반 자동 발견 금지 |
|
||||||
|
| L | KRX/DART/KIS Adapter 대체 시 동일 시간·단위·오류 contract test | mock 통과만으로 공급원 대체 금지 |
|
||||||
|
| I | `IMarketDataSource`, `IFilingSource`, `IEvidenceReader`, `IClock` 등 좁은 Port | 범용 Repository/IServiceProvider 노출 금지 |
|
||||||
|
| D | Domain은 Npgsql/Hangfire/HTTP를 모른다 | Infrastructure type이 Domain으로 침투하는 것 금지 |
|
||||||
|
|
||||||
|
추상화는 두 번째 실제 구현과 동일한 변경축이 확인된 뒤 승격한다. 한 번 쓰는 interface, generic repository, 범용 mediator wrapper는 만들지 않는다.
|
||||||
|
|
||||||
|
## 4. 알고리즘 고도화
|
||||||
|
|
||||||
|
### 4.1 생산 경계
|
||||||
|
|
||||||
|
생산 엔진은 점수 합산기가 아니라 순서가 고정된 결정 상태기계다.
|
||||||
|
|
||||||
|
`HARD_IMPAIRMENT → PORTFOLIO_SURVIVAL → DYNAMIC_PROFIT_FLOOR → CONCENTRATION_LIQUIDITY → OPPORTUNITY_COST → REENTRY_OPTION`
|
||||||
|
|
||||||
|
상위 사유는 하위 기대수익으로 상쇄하지 않는다. 모든 결정은 다음 Version Set을 남긴다.
|
||||||
|
|
||||||
|
- `PolicyId`, `PolicyVersion`
|
||||||
|
- `EvidenceId`, `DatasetId`, `DataHash`
|
||||||
|
- `ModelVersion`, `ConfigVersion`, `CodeSha`
|
||||||
|
- `AsOf`, `PublishedAtCutoff`, `TradableSession`
|
||||||
|
- 입력 단위, rounding, 허용오차, 반대증거
|
||||||
|
|
||||||
|
### 4.2 Lot/Cycle 모델
|
||||||
|
|
||||||
|
- `PositionLot`: 수량·원가·세금 lot·개설/종료.
|
||||||
|
- `CycleState`: entry, peak, floor, breach count, last sell/buy.
|
||||||
|
- `ProtectionState`: 보호 활성화와 단조 floor.
|
||||||
|
- `ReentryWatch`: 매도 원인, 대기, 조건, 단계, 만료.
|
||||||
|
- 재진입은 새 `CycleId`와 새 Lot을 생성한다.
|
||||||
|
- Hard impairment는 자동 재진입을 금지한다.
|
||||||
|
|
||||||
|
### 4.3 매도 수량 계약
|
||||||
|
|
||||||
|
`SellRatioOfLot`와 `TargetPortfolioWeightAfter`를 분리한다. API/DB/UI에서 단순 `sell_fraction` 하나를 사용하지 않는다.
|
||||||
|
|
||||||
|
- `SellRatioOfLot`: 현재 lot 수량 중 매도 비율, 0~1.
|
||||||
|
- `SellQuantity`: 주문 단위 반영 후 실제 제안 수량.
|
||||||
|
- `TargetPortfolioWeightAfter`: 매도 후 목표 포트폴리오 비중.
|
||||||
|
- `StrategicCoreFloorWeight`: 포트폴리오 절대비중.
|
||||||
|
|
||||||
|
이 구분이 없으면 Core floor와 부분매도 비율을 잘못 비교하게 된다.
|
||||||
|
|
||||||
|
### 4.4 기대효용
|
||||||
|
|
||||||
|
opaque score를 금지하고 구성요소를 저장한다.
|
||||||
|
|
||||||
|
- P10/P50/P90 기대수익
|
||||||
|
- ES95
|
||||||
|
- 영구가치훼손 확률 × LGD
|
||||||
|
- marginal portfolio risk
|
||||||
|
- liquidity/slippage/tax/FX
|
||||||
|
- replacement lower-confidence edge
|
||||||
|
- reentry option loss
|
||||||
|
|
||||||
|
Opportunity sell은 순우위 신뢰하단이 0을 초과하고 IPS·유동성·세금 제약을 통과한 경우만 허용한다.
|
||||||
|
|
||||||
|
### 4.5 연구와 생산의 분리
|
||||||
|
|
||||||
|
Python 연구 코드는 생산 엔진에서 호출하지 않는다. Python과 .NET은 동일 Golden Vector와 Policy ID만 공유한다.
|
||||||
|
|
||||||
|
- Python: 대규모 탐색, walk-forward, CSCV/PBO, DSR, bootstrap.
|
||||||
|
- .NET: 승인된 순수 정책, Evidence/Decision/Audit, Shadow 운영.
|
||||||
|
- 결과 비교: manifest + deterministic seed + tolerance.
|
||||||
|
|
||||||
|
## 5. 데이터 정합성·정규화·역정규화
|
||||||
|
|
||||||
|
### 5.1 계층
|
||||||
|
|
||||||
|
1. L0 Source Manifest: 권리·schema/version·SLA·timezone·단위.
|
||||||
|
2. L1 Raw Immutable: payload/hash/event/published/ingested.
|
||||||
|
3. L2 Canonical PIT: 가격·기업행사·재무·컨센서스·비용 revision.
|
||||||
|
4. L3 Quality/Lineage: DQ·quarantine·watermark·dataset manifest.
|
||||||
|
5. L4 Feature/Evidence: feature/forecast/risk/evidence hash.
|
||||||
|
6. L5 Transaction/Audit: ledger/decision/review/publication/fill/outcome.
|
||||||
|
7. L6 Read Model: 화면·리포트 projection.
|
||||||
|
8. L7 Artifact: backtest/model card/release evidence.
|
||||||
|
|
||||||
|
### 5.2 정규화 원칙
|
||||||
|
|
||||||
|
- 원장·현금·lot: 3NF + append/reversal.
|
||||||
|
- PIT 가격/재무/공시: source + published_at + revision + hash.
|
||||||
|
- 추천/승인/공개: 현재상태와 이력 분리.
|
||||||
|
- 설정/수수료: `valid_from/to`; current flag 단독 사용 금지.
|
||||||
|
- Evidence: JSONB 원문 + 검색/제약에 필요한 핵심 컬럼 승격.
|
||||||
|
|
||||||
|
### 5.3 역정규화 허용 조건
|
||||||
|
|
||||||
|
Read Model에만 허용하며 반드시 다음을 가진다.
|
||||||
|
|
||||||
|
- Owner
|
||||||
|
- ProjectionVersion
|
||||||
|
- SourceWatermark
|
||||||
|
- RefreshedAt/StaleAt
|
||||||
|
- Rebuild command
|
||||||
|
- Lineage
|
||||||
|
- 권한 scope
|
||||||
|
|
||||||
|
Source table을 화면에서 임의 join하거나 current value를 복제하지 않는다.
|
||||||
|
|
||||||
|
### 5.4 DB 강제 규칙
|
||||||
|
|
||||||
|
- schema-qualified SQL, 명시적 column, `SELECT *` 금지.
|
||||||
|
- Evidence/Decision/Audit update/delete 차단 trigger.
|
||||||
|
- 시간 범위 overlap exclusion 또는 사전 검증.
|
||||||
|
- Idempotency unique key.
|
||||||
|
- Outbox pending index와 lease/attempt/dead-letter.
|
||||||
|
- DbUp fresh/upgrade/re-run/failure rehearsal.
|
||||||
|
|
||||||
|
## 6. BE 고도화
|
||||||
|
|
||||||
|
### 6.1 Slice 표준
|
||||||
|
|
||||||
|
```text
|
||||||
|
Features/<Slice>/
|
||||||
|
Endpoint.cs
|
||||||
|
Request.cs
|
||||||
|
Response.cs
|
||||||
|
Validator.cs
|
||||||
|
Handler.cs
|
||||||
|
Policy.cs
|
||||||
|
Sql.cs
|
||||||
|
Mapper.cs
|
||||||
|
Contracts/
|
||||||
|
Jobs/
|
||||||
|
Tests/
|
||||||
|
README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Endpoint는 `EvidenceId`, 모델버전, 정책 임계값을 클라이언트에서 그대로 신뢰하지 않는다. 요청은 업무 식별자와 as-of만 받고 Handler가 승인된 Evidence와 Version Set을 조회한다.
|
||||||
|
|
||||||
|
### 6.2 트랜잭션
|
||||||
|
|
||||||
|
동일 PostgreSQL transaction에서 다음을 처리한다.
|
||||||
|
|
||||||
|
1. Idempotency claim.
|
||||||
|
2. Evidence/lot/cycle as-of 조회.
|
||||||
|
3. 순수 Policy 평가.
|
||||||
|
4. Decision append.
|
||||||
|
5. Outbox append.
|
||||||
|
6. commit.
|
||||||
|
|
||||||
|
외부 API 호출은 transaction 밖에서 수행하고 raw result를 먼저 저장한다.
|
||||||
|
|
||||||
|
### 6.3 Outbox/Inbox
|
||||||
|
|
||||||
|
- Event payload는 최소키와 schema version만 포함.
|
||||||
|
- consumer별 Inbox unique key.
|
||||||
|
- 재처리는 동일 결과 또는 no-op.
|
||||||
|
- poison event는 dead-letter와 운영 승인 후 replay.
|
||||||
|
- 이벤트가 Job을 직접 호출하지 않고 readiness/command를 만든다.
|
||||||
|
|
||||||
|
### 6.4 Hangfire
|
||||||
|
|
||||||
|
Queue를 다음처럼 분리한다.
|
||||||
|
|
||||||
|
- `q-control`
|
||||||
|
- `q-market-data`
|
||||||
|
- `q-fundamentals`
|
||||||
|
- `q-feature-risk`
|
||||||
|
- `q-recommendation`
|
||||||
|
- `q-evaluation`
|
||||||
|
- `q-reconciliation`
|
||||||
|
- `q-research`
|
||||||
|
- `q-backfill`
|
||||||
|
|
||||||
|
모든 Job은 `JobRunId`, `ScopeKey`, `IdempotencyKey`, `Watermark`, Version Set, input/output hash를 가진다. DQ/business-hold는 transient retry와 분리한다.
|
||||||
|
|
||||||
|
### 6.5 보안
|
||||||
|
|
||||||
|
- `/internal/*` 익명 접근 금지.
|
||||||
|
- 자동주문 Capability는 코드와 설정 모두 기본 OFF.
|
||||||
|
- Swagger는 dev 또는 승인된 운영자만.
|
||||||
|
- maker-checker와 SoD를 endpoint/DB/audit에서 동시에 검증.
|
||||||
|
- secret/PII/token은 log, trace tag, fixture, prompt에 금지.
|
||||||
|
|
||||||
|
## 7. FE 고도화
|
||||||
|
|
||||||
|
### 7.1 상태 소유권
|
||||||
|
|
||||||
|
- 서버 상태: TanStack Query.
|
||||||
|
- 세션/role/UI preference: Pinia.
|
||||||
|
- form: vee-validate + Zod.
|
||||||
|
- filter/selection: router query/params.
|
||||||
|
- 대량 표: AG Grid server-side row model.
|
||||||
|
|
||||||
|
Pinia에 API 응답을 복제하지 않는다.
|
||||||
|
|
||||||
|
### 7.2 공통 상태 계약
|
||||||
|
|
||||||
|
`LOADING, EMPTY, PARTIAL, STALE, WARN, ERROR, UNAUTHORIZED, FORBIDDEN, CONFLICT, EXPIRED, READONLY`를 공통 컴포넌트로 처리한다.
|
||||||
|
|
||||||
|
### 7.3 계약과 멱등
|
||||||
|
|
||||||
|
- OpenAPI에서 DTO를 생성하거나 versioned contract를 단일 관리한다.
|
||||||
|
- submit 시 한 번 생성한 Idempotency-Key를 동일 retry에 재사용한다.
|
||||||
|
- 409는 `VersionConflictDialog`, 422는 field/summary mapping, 429/503은 retry-after를 표시한다.
|
||||||
|
- 고객 화면은 연구용 내부 evaluate endpoint를 호출하지 않는다.
|
||||||
|
|
||||||
|
### 7.4 컴포넌트화
|
||||||
|
|
||||||
|
공용 승격은 동일 업무 의미·상태·권한·접근성·테스트가 반복될 때만 한다.
|
||||||
|
|
||||||
|
공통: `QueryStateBoundary`, `PermissionGuard`, `DataGridShell`, `CrudForm`, `VersionConflictDialog`, `DataFreshnessBadge`.
|
||||||
|
|
||||||
|
도메인: `EvidencePanel`, `ProtectionFloorPanel`, `ReentryTimeline`, `ApprovalPanel`, `VersionSetPanel`, `GateChecklist`.
|
||||||
|
|
||||||
|
## 8. 바이브코딩·홀루시네이션 통제
|
||||||
|
|
||||||
|
- 채팅은 Source of Truth가 아니다.
|
||||||
|
- AI는 Policy ID, DB column, API, threshold를 발명하지 않는다.
|
||||||
|
- 모든 PR에 `Source / Assumption / Unknown / Decision Required`를 기록한다.
|
||||||
|
- 실행하지 않은 build/test/migration을 통과했다고 기록하지 않는다.
|
||||||
|
- 리팩터링 전 characterization test를 먼저 고정한다.
|
||||||
|
- 한 PR은 한 Slice 또는 한 리팩터링 목적만 가진다.
|
||||||
|
- AI 생성 migration은 fresh/upgrade/re-run과 DBA review 없이는 병합하지 않는다.
|
||||||
|
- 알고리즘 변경은 Golden/OOS/cost×2/false-exit/reentry/ES/ModelCard를 동시에 갱신한다.
|
||||||
|
|
||||||
|
## 9. 기술부채 운영
|
||||||
|
|
||||||
|
- P0는 기능 개발보다 먼저 처리한다.
|
||||||
|
- 각 Sprint 용량의 15~20%를 승인된 기술부채에 배정한다.
|
||||||
|
- Debt는 Risk, Interest, Owner, Due, Remediation, Exit Test를 가진다.
|
||||||
|
- “나중에 정리”가 아니라 해당 Slice의 Definition of Done에 포함한다.
|
||||||
|
- 무기한 예외는 금지하고 expiry와 재승인을 둔다.
|
||||||
|
|
||||||
|
## 10. 16 Sprint 개선 로드맵
|
||||||
|
|
||||||
|
기존 32주 기준은 유지하되 Release Train으로 묶는다.
|
||||||
|
|
||||||
|
| Train | Sprint | 목표 | 핵심 Gate |
|
||||||
|
|---|---|---|---|
|
||||||
|
| R0 Foundation | S0~S3 | 재현성, CI, PIT/CA/비용, ledger | build/lock/replay/lookahead 0 |
|
||||||
|
| R1 Sell/Reentry | S4~S5 | Evidence, Lot/Cycle, 매도/재진입 | Golden/state/invariant |
|
||||||
|
| R2 Advisory MVP | S6~S8 | IPS, 추천, 검토, 공개, 결과 | maker-checker/E2E/audit |
|
||||||
|
| R3 Portfolio Intelligence | S9~S11 | risk, rebalance, buy/replacement, scorecard | constraint/NO_ACTION/Shadow |
|
||||||
|
| R4 Pilot Hardening | S12~S15 | KIS capability OFF, recon, security, DR, cutover | duplicate 0/recon/DR/rollback |
|
||||||
|
|
||||||
|
Critical Path를 벗어난 대시보드·상품탐색 선행 구현은 제한한다.
|
||||||
|
|
||||||
|
## 11. 템플릿 적용 판정
|
||||||
|
|
||||||
|
첨부 v11 템플릿은 교육용 walking skeleton으로는 유효하지만 Implementation-ready 기준에는 미달한다. 다음 조건을 만족한 뒤 기준 템플릿으로 승격한다.
|
||||||
|
|
||||||
|
- 실제 .NET SDK/pnpm에서 restore/build/test green.
|
||||||
|
- lockfile과 dependency audit.
|
||||||
|
- 익명 internal endpoint 제거.
|
||||||
|
- Handler/Validator/DB/Outbox/Idempotency 구현.
|
||||||
|
- SignalDecision 불변 DB trigger.
|
||||||
|
- Architecture/Data/Integration/Replay/E2E test 추가.
|
||||||
|
- FE 11-state, auth, conflict, stable idempotency.
|
||||||
|
- Release Evidence Pack 자동 생성.
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Architecture Fitness Functions
|
||||||
|
|
||||||
|
| ID | 자동 검사 | 차단 기준 |
|
||||||
|
|---|---|---|
|
||||||
|
| AF-01 | Module project reference graph | 승인되지 않은 역방향 의존 1건 |
|
||||||
|
| AF-02 | 다른 모듈 schema 직접 SQL 참조 | 1건 |
|
||||||
|
| AF-03 | Domain project의 Npgsql/Hangfire/HTTP 참조 | 1건 |
|
||||||
|
| AF-04 | `DateTime.Now/UtcNow` 직접 사용 | 승인 예외 외 1건 |
|
||||||
|
| AF-05 | `SELECT *` | 1건 |
|
||||||
|
| AF-06 | Generic Repository/God Service 명명·크기 | 1건 또는 기준 초과 |
|
||||||
|
| AF-07 | Modules 내부 `AllowAnonymous` | 1건 |
|
||||||
|
| AF-08 | Evidence/Decision/Audit immutable trigger | 누락 1건 |
|
||||||
|
| AF-09 | DbUp fresh/upgrade/re-run | 실패 |
|
||||||
|
| AF-10 | PIT `published_at <= cutoff` contract test | 실패 |
|
||||||
|
| AF-11 | Dataset+Code+Config 동일 replay hash | 100% 미만 |
|
||||||
|
| AF-12 | command/job/order duplicate | 0 초과 |
|
||||||
|
| AF-13 | Outbox/Inbox retry and poison replay | 실패 |
|
||||||
|
| AF-14 | Algorithm Golden/boundary/property | 실패 |
|
||||||
|
| AF-15 | Reentry calendar/stage/expiry/new cycle | 실패 |
|
||||||
|
| AF-16 | FE server state duplicated in Pinia | 탐지 1건 |
|
||||||
|
| AF-17 | FE ProblemDetails/409/422/429/503 common handling | 누락 |
|
||||||
|
| AF-18 | Role/state Playwright journeys | 실패 |
|
||||||
|
| AF-19 | Secret/PII scan | Critical 1건 |
|
||||||
|
| AF-20 | Release Evidence Pack completeness | 누락 1건 |
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Sell/Reentry Algorithm Contract
|
||||||
|
|
||||||
|
## Decision Context
|
||||||
|
|
||||||
|
- PortfolioId, AccountId, LotId, CycleId
|
||||||
|
- AssetPolicyId, IPSVersion
|
||||||
|
- AsOf, PublishedAtCutoff, TradableSession
|
||||||
|
- EvidenceId, DatasetId, ModelVersion, ConfigVersion, CodeSha
|
||||||
|
- CurrentLotQuantity, CurrentPortfolioWeight, StrategicCoreFloorWeight
|
||||||
|
- Peak/Floor/Breach/Cooldown
|
||||||
|
- Hard impairment evidence grade and approval
|
||||||
|
- Risk reduction requirement, concentration excess, liquidity capacity
|
||||||
|
- Expected utility component distribution and confidence lower bound
|
||||||
|
|
||||||
|
## Decision Output
|
||||||
|
|
||||||
|
- Action: HOLD/PARTIAL_SELL/FULL_SELL
|
||||||
|
- PolicyId/Priority/ReasonCode
|
||||||
|
- SellRatioOfLot
|
||||||
|
- ProposedQuantity
|
||||||
|
- TargetPortfolioWeightAfter
|
||||||
|
- ReentryEligibility
|
||||||
|
- CounterEvidence
|
||||||
|
- ValidUntil/NextReviewSession
|
||||||
|
- DecisionHash
|
||||||
|
|
||||||
|
## Invariants
|
||||||
|
|
||||||
|
1. Hard impairment cannot be overridden.
|
||||||
|
2. Proposed quantity cannot exceed lot quantity.
|
||||||
|
3. Strategic core floor cannot be breached unless an approved higher-priority policy allows it.
|
||||||
|
4. Same input and Version Set produce the same decision hash.
|
||||||
|
5. A decision without immutable Evidence cannot be stored.
|
||||||
|
6. A reentry stage executes at most once.
|
||||||
|
7. Reentry creates a new CycleId.
|
||||||
|
8. Hard impairment cannot create an automatic ReentryWatch.
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
WBS_ID,Sprint,Slice,Workstream,Task,Deliverable,Acceptance,Owner,Secondary,PD,Dependency,Release_Blocker,Basis
|
||||||
|
AEG-S0-01,S0,VS-00,Governance,Baseline/Delta/Supersession matrix 확정,docs/version_coverage.csv,유효 기준 불명확 0,PM/Architect,Compliance,3,-,Y,Source
|
||||||
|
AEG-S0-02,S0,VS-00,Governance,REQ/ALG/DATA/API/DB/JOB/SCR/TEST ID Registry 동결,docs/id_registry.csv,중복/재사용 ID 0,PM,Architect,3,AEG-S0-01,Y,Source
|
||||||
|
AEG-S0-03,S0,VS-00,Research,원시 데이터 Manifest/checksum/license 계약,research/manifests,clean-room 입력 식별 100%,Data Lead,Quant,6,AEG-S0-01,Y,Source
|
||||||
|
AEG-S0-04,S0,VS-00,Research,Python pyproject/lock/container digest,research/pyproject.toml; lock; image digest,동일 환경 재실행 가능,Quant,DevOps,6,AEG-S0-03,Y,Design
|
||||||
|
AEG-S0-05,S0,VS-00,DevEx,.NET/pnpm restore lock 및 패키지 검증,global.json; packages; pnpm-lock,restore/build/test green,PL,DevOps,8,AEG-S0-01,Y,Source
|
||||||
|
AEG-S0-06,S0,VS-00,Security,Internal endpoint 익명 접근 제거,auth policy; access tests,/internal anonymous 0,Security,BE,5,AEG-S0-05,Y,Source
|
||||||
|
AEG-S0-07,S0,VS-00,Architecture,Fitness Function 20종 CI 연결,ArchitectureTests; scripts,AF-01~20 green,Architect,QA,8,AEG-S0-05,Y,Design
|
||||||
|
AEG-S0-08,S0,VS-00,Observability,HTTP→DB→Outbox correlation walking skeleton,OTel/Serilog smoke,trace link 100%,SRE,BE,5,AEG-S0-05,N,Source
|
||||||
|
AEG-S1-01,S1,VS-02,Data,SecurityMaster/listing/trading calendar canonical,migrations/security_master,상장기간·세션 invariant,Data,DBA,8,AEG-S0-03,Y,Source
|
||||||
|
AEG-S1-02,S1,VS-03,Data,Raw immutable/dataset manifest,raw_record; dataset_manifest,overwrite 0/hash 100%,Data,DBA,8,AEG-S0-03,Y,Source
|
||||||
|
AEG-S1-03,S1,VS-03,Data,PIT temporal resolver,PublishedAtPolicy; MarketCalendar,lookahead 0,Data,Quant,8,"AEG-S1-01,AEG-S1-02",Y,Source
|
||||||
|
AEG-S1-04,S1,VS-03,Data,DQ engine/quarantine/watermark,DQ-01~12 pipeline,Critical DQ release block,Data,QA,10,"AEG-S1-02,AEG-S1-03",Y,Source
|
||||||
|
AEG-S1-05,S1,VS-03,BE,Hangfire JobRun/Watermark/Retry class,job_run; job_watermark,duplicate 0/resume,BE,SRE,10,AEG-S0-05,Y,Source
|
||||||
|
AEG-S1-06,S1,VS-03,FE,Data run operational page baseline,SCR-013,processing/partial/warn/error,FE,Data,7,"AEG-S1-04,AEG-S1-05",N,Source
|
||||||
|
AEG-S2-01,S2,VS-04,Data,공식 Corporate Action master/조정,CA canonical + golden,수량·원가·수익 대사,Data,Quant/DBA,12,"AEG-S1-01,AEG-S1-02",Y,Source
|
||||||
|
AEG-S2-02,S2,VS-03,Data,Total return/FX/rate canonical,TR/FX/rate migrations,price vs total return 구분,Data,Quant,10,AEG-S1-03,Y,Source
|
||||||
|
AEG-S2-03,S2,VS-06,Data,Fee/Tax/FX PIT schedule,fee_schedule/tax/fx,기간 overlap 0,DBA,Quant,8,AEG-S1-03,Y,Source
|
||||||
|
AEG-S2-04,S2,VS-04,QA,상폐·분할·배당·증자 Golden,DataTests fixtures,공식 master diff 허용치,QA,Data,8,"AEG-S2-01,AEG-S2-02",Y,Source
|
||||||
|
AEG-S2-05,S2,VS-19,Research,기존 Python 결과 Characterization,golden/current,기존 artifact metric diff 0,Quant,QA,8,AEG-S0-04,Y,Source
|
||||||
|
AEG-S2-06,S2,VS-19,Research,비용 전역상수 제거/함수 계약화,research simulation cost contract,market/account cost 라벨 일치,Quant,QA,6,"AEG-S2-03,AEG-S2-05",Y,Source
|
||||||
|
AEG-S3-01,S3,VS-08,Data,Append ledger/cash/lot/cycle,ledger_entry; position_lot; cycle_state,debit-credit/reversal,BE/DBA,QA,14,"AEG-S2-01,AEG-S2-03",Y,Source
|
||||||
|
AEG-S3-02,S3,VS-08,Algorithm,Scalar position→Lot/Cycle migration contract,domain model + migration plan,core/tactical 혼합 0,BE,Quant,12,AEG-S3-01,Y,Source
|
||||||
|
AEG-S3-03,S3,VS-09,Data,EvidenceSnapshot Version Set,evidence schema/hash,동일 입력 hash 동일,BE/DBA,Quant,10,"AEG-S1-04,AEG-S2-02,AEG-S2-03",Y,Source
|
||||||
|
AEG-S3-04,S3,VS-08,QA,Ledger property/reconciliation tests,Unit/Data/Integration,수량·현금 invariant,QA,BE/DBA,10,AEG-S3-01,Y,Source
|
||||||
|
AEG-S3-05,S3,VS-08,FE,Portfolio lot/cycle read model,rm_portfolio_overview,stale/lineage/rebuild 표시,FE,Data,8,AEG-S3-01,N,Source
|
||||||
|
AEG-S4-01,S4,VS-10,Algorithm,Policy contract/priority registry,Policy registry,우선순위 변경 승인 강제,Quant,Risk/BE,6,AEG-S2-05,Y,Source
|
||||||
|
AEG-S4-02,S4,VS-10,Algorithm,Hard impairment policy/evidence grade,ALG-SELL-001,하위정책 상쇄 0,BE/Quant,QA,7,"AEG-S4-01,AEG-S3-03",Y,Source
|
||||||
|
AEG-S4-03,S4,VS-10,Algorithm,Portfolio survival/capital floor policy,ALG-PORT-001,risk cap property,Quant/BE,QA,9,"AEG-S3-02,AEG-S4-01",Y,Source
|
||||||
|
AEG-S4-04,S4,VS-10,Algorithm,Gap/two-close/protection floor,ALG-SELL-002/003,monotonic/boundary/cooldown,BE/Quant,QA,12,"AEG-S3-02,AEG-S4-01",Y,Source
|
||||||
|
AEG-S4-05,S4,VS-10,Algorithm,Concentration/liquidity policy,ALG-SELL-004,caps/ADV constraint,Quant/BE,QA,8,AEG-S4-01,Y,Source
|
||||||
|
AEG-S4-06,S4,VS-10,Algorithm,Expected utility/opportunity policy,ALG-SELL-005,lower CI > 0/cost×2,Quant/BE,Risk/QA,12,"AEG-S2-03,AEG-S4-01",Y,Source
|
||||||
|
AEG-S4-07,S4,VS-10,BE,Endpoint→Handler→Policy→DB→Outbox slice,VS-10 code packet,auth/idempotency/transaction,BE,SRE/QA,14,"AEG-S3-03,AEG-S4-02~06",Y,Source
|
||||||
|
AEG-S4-08,S4,VS-10,DB,Decision immutability/indexes,0011_signal_hardening.sql,update/delete 0,DBA,BE,5,AEG-S4-07,Y,Design
|
||||||
|
AEG-S5-01,S5,VS-11,Algorithm,Reentry staged state machine,ALG-REENTRY-001,wait/spacing/expiry/new cycle,BE/Quant,QA,12,"AEG-S3-02,AEG-S4-07",Y,Source
|
||||||
|
AEG-S5-02,S5,VS-11,BE,Reentry watch scan/idempotent stage,VS-11 handler/job,stage duplicate 0,BE,SRE,10,"AEG-S5-01,AEG-S1-05",Y,Source
|
||||||
|
AEG-S5-03,S5,VS-19,Research,Python/.NET Golden vector comparison,BacktestRegression,허용오차 내 의미 동일,Quant/QA,BE,10,"AEG-S4-02~06,AEG-S2-05",Y,Source
|
||||||
|
AEG-S5-04,S5,VS-19,Research,Walk-forward/PBO/DSR/bootstrap hooks,research evaluation,승격 지표 산출 가능,Quant,Risk/QA,12,"AEG-S0-04,AEG-S2-06",N,Source
|
||||||
|
AEG-S5-05,S5,VS-11,FE,Reentry timeline/state matrix,SCR-003,expired/readonly/warn/conflict,FE,UX/QA,9,AEG-S5-02,N,Source
|
||||||
|
AEG-S6-01,S6,VS-07,BE,Client/IPS versioned contract,VS-07,과거 IPS 수정 0,BE,Compliance,10,AEG-S0-06,Y,Source
|
||||||
|
AEG-S6-02,S6,VS-08,BE,Portfolio performance/risk baseline,VS-08/13,TWR/MWR/ES golden,BE/Quant,QA,12,AEG-S3-01,Y,Source
|
||||||
|
AEG-S6-03,S6,VS-07,FE,IPS wizard/conflict/validation,SCR-008,409/422/RBAC/a11y,FE,UX/QA,10,AEG-S6-01,N,Source
|
||||||
|
AEG-S6-04,S6,ReadModels,Data,Read model version/rebuild framework,projection registry,rebuild hash/staleness,Data/BE,SRE,10,AEG-S3-05,Y,Source
|
||||||
|
AEG-S7-01,S7,VS-14,BE,Recommendation aggregation,VS-14,DQ/IPS/capability hold,BE,Quant,14,"AEG-S4-07,AEG-S6-01,AEG-S6-02",Y,Source
|
||||||
|
AEG-S7-02,S7,VS-15,BE,Maker-checker review/concurrency,VS-15,self approval 0,BE,Compliance/QA,10,AEG-S7-01,Y,Source
|
||||||
|
AEG-S7-03,S7,VS-15,FE,Recommendation workbench,SCR-009,11-state/RBAC/E2E,FE,QA/UX,14,"AEG-S7-02,AEG-S6-04",N,Source
|
||||||
|
AEG-S7-04,S7,Cross,FE,Stable idempotency/ProblemDetails/ETag common,shared/api,retry same key/409/422/429/503,FE,BE/QA,8,AEG-S0-05,Y,Design
|
||||||
|
AEG-S8-01,S8,VS-16,BE,Approved advice publish/version hash,VS-16,unapproved publish 0,BE,Compliance,10,AEG-S7-02,Y,Source
|
||||||
|
AEG-S8-02,S8,VS-17,BE,Client decision attribution,VS-17,advice/execution/action 분리,BE,Quant,7,AEG-S8-01,N,Source
|
||||||
|
AEG-S8-03,S8,VS-18,BE,Outcome windows 1/5/20/63/126/252,VS-18/J10,calendar/revision/no-fill,BE/Quant,Data/QA,14,"AEG-S8-01,AEG-S2-02",Y,Source
|
||||||
|
AEG-S8-04,S8,VS-16,FE,Advice detail/evidence/counterevidence,SCR-002,approved version only,FE,UX/Compliance,10,"AEG-S8-01,AEG-S6-04",N,Source
|
||||||
|
AEG-S8-05,S8,Audit,Governance,E2E audit trace,rm_audit_trace,input→outcome trace 100%,BE,Audit/SRE,10,AEG-S8-01~03,Y,Source
|
||||||
|
AEG-S9-01,S9,VS-13,Algorithm,Portfolio ES/concentration/correlation,VS-13,numeric/property/perf,Quant/BE,QA,12,AEG-S6-02,Y,Source
|
||||||
|
AEG-S9-02,S9,VS-21,Algorithm,Rebalance deterministic baseline,VS-21,constraint 0/NO_ACTION,Quant/BE,QA,14,"AEG-S9-01,AEG-S2-03",Y,Source
|
||||||
|
AEG-S9-03,S9,VS-21,FE,Before/after risk and constraints,SCR-005,override audit/a11y,FE,QA/UX,10,AEG-S9-02,N,Source
|
||||||
|
AEG-S10-01,S10,VS-12,Algorithm,Buy candidate calibrated outputs,VS-12,P10/P50/P90 calibration,Quant,Risk/QA,14,AEG-S5-04,N,Source
|
||||||
|
AEG-S10-02,S10,VS-22,Algorithm,Replacement net-edge/ranking,VS-22,after-cost/IPS ranking,Quant/BE,QA,10,"AEG-S4-06,AEG-S10-01",N,Source
|
||||||
|
AEG-S10-03,S10,VS-12,FE,Candidate AG Grid server model,SCR-006,10k row/perf/filter/auth,FE,QA,12,"AEG-S10-01,AEG-S6-04",N,Source
|
||||||
|
AEG-S11-01,S11,VS-18,Evaluation,False-exit cost/reentry capture definition,sell_evaluation,benchmark/cost/weight 일치,Quant,Risk/QA,10,"AEG-S8-03,AEG-S5-01",Y,Source
|
||||||
|
AEG-S11-02,S11,VS-24,Evaluation,Daily scorecard/cohort/drift,J11/SCR-010,표본/창/as-of/version,Quant/BE,Data,12,AEG-S11-01,Y,Source
|
||||||
|
AEG-S11-03,S11,Shadow,Operations,Shadow next-session execution,shadow_execution,decision/fill/action 분리,Quant/BE,QA,12,"AEG-S8-03,AEG-S2-03",Y,Source
|
||||||
|
AEG-S11-04,S11,VS-24,FE,Scorecard/gate/drift dashboard,SCR-010,적중률 보조지표,FE,Quant/QA,10,AEG-S11-02,N,Source
|
||||||
|
AEG-S12-01,S12,VS-23,BE,KIS adapter capability OFF baseline,adapter/capability,prod order path disabled,BE,Security/Compliance,10,AEG-S0-06,Y,Source
|
||||||
|
AEG-S12-02,S12,VS-23,BE,OrderIntent/Fill dedupe,VS-23,duplicate fill/order 0,BE,DBA/QA,12,"AEG-S12-01,AEG-S3-01",Y,Source
|
||||||
|
AEG-S12-03,S12,VS-23,Operations,Position/cash/fee/tax/FX reconciliation,J12,unapproved break 0,BE/Ops,DBA/QA,12,AEG-S12-02,Y,Source
|
||||||
|
AEG-S12-04,S12,VS-23,FE,Reconciliation workbench,SCR-014,maker-checker/SLA,FE,Ops/QA,9,AEG-S12-03,N,Source
|
||||||
|
AEG-S13-01,S13,VS-25,Security,RBAC/MFA/SoD/access matrix,security tests,cross-client access 0,Security,BE/QA,12,"AEG-S6-01,AEG-S7-02",Y,Source
|
||||||
|
AEG-S13-02,S13,VS-25,Operations,Kill-switch/capability control,VS-25,scope block/recovery,SRE,Risk/BE,10,AEG-S12-01,Y,Source
|
||||||
|
AEG-S13-03,S13,DR,Operations,Backup/PITR/read-model rebuild drill,runbooks/dr,RPO/RTO/reconcile,SRE/DBA,Ops,12,"AEG-S6-04,AEG-S12-03",Y,Source
|
||||||
|
AEG-S13-04,S13,QA,Quality,Playwright role/state/a11y UAT,e2e evidence,critical journey green,QA,FE/Compliance,12,"AEG-S8-04,AEG-S11-04,AEG-S12-04",Y,Source
|
||||||
|
AEG-S14-01,S14,Performance,DBA,Plan/index/bloat/partition evidence,performance report,P95/lock 기준,DBA,BE,10,AEG-S11-02,N,Design
|
||||||
|
AEG-S14-02,S14,Backfill,Operations,Chunk/checkpoint/resume/replay,maintenance jobs,restart/reconcile 100%,Data/SRE,DBA,12,AEG-S13-03,Y,Source
|
||||||
|
AEG-S14-03,S14,Release,DevOps,Release Evidence Pack 자동화,CI artifacts,문서/DDL/OpenAPI/Test hash,DevOps,QA/PM,10,AEG-S0-07,Y,Source
|
||||||
|
AEG-S14-04,S14,Cutover,Operations,Cutover/rollback rehearsal,runbooks/cutover,rollback RTO 내,SRE,All,10,"AEG-S14-02,AEG-S14-03",Y,Source
|
||||||
|
AEG-S15-01,S15,GoLive,Governance,Advisory Go/No-Go,release decision,RG/AF/DQ/DR 모두 통과,Steering,All,4,AEG-S14-04,Y,Source
|
||||||
|
AEG-S15-02,S15,Hypercare,Operations,P1/P2 monitoring/on-call,dashboards/runbooks,Owner/Secondary 응답,SRE/Ops,BE/Data,10,AEG-S15-01,Y,Source
|
||||||
|
AEG-S15-03,S15,Shadow,Governance,252거래일 Shadow 누적 시작,model/evaluation manifest,자동주문 OFF 확인,Quant/Risk,Compliance,6,AEG-S15-01,Y,Source
|
||||||
|
@@ -0,0 +1,19 @@
|
|||||||
|
DebtId,Title,RiskClass,Priority,Impact,Owner,Secondary,DueSprint,Remediation,ExitTest,Decision
|
||||||
|
TD-H-001,Raw data/환경 lock 부재,Data/Model,P0,재현 불가,Quant Lead,Data Lead,S0,manifest+checksum+lock+image digest,clean-room replay hash,Fix
|
||||||
|
TD-H-002,Scalar position이 Core/Tactical lot 혼합,Model,P0,보호선·재진입 왜곡,BE Lead,Quant Lead,S3,Lot/Cycle/Protection/Reentry model,property+golden,Fix
|
||||||
|
TD-H-003,KR 기업행사 추정 소급조정,Data,P0,가격·ATR·수익 왜곡,Data Lead,DBA,S2,공식 CA master+quarantine,CA reconciliation,Fix
|
||||||
|
TD-H-004,총수익/PIT/상폐/세금/FX 불완전,Data/Model,P0,생산 판단 불가,Data Lead,Risk,S2,canonical PIT sources,DQ/replay,Fix
|
||||||
|
TD-H-005,비용 전역상수/라벨 불일치,Model,P0,성과 왜곡,Quant Lead,QA,S2,FeeSchedule PIT contract,cost scenario diff,Fix
|
||||||
|
TD-H-006,Internal research endpoint AllowAnonymous,Security,P0,무권한 정책 실행,Security,BE Lead,S0,auth policy+access test,anonymous 0,Fix
|
||||||
|
TD-H-007,FE pnpm-lock 누락,Engineering,P0,CI 비결정/현재 CI 실패,FE Lead,DevOps,S0,lockfile commit,frozen install,Fix
|
||||||
|
TD-H-008,Handler/Validator/DB/Outbox 없는 endpoint,Architecture,P1,Vertical Slice 미완성,BE Lead,Architect,S4,full slice packet,integration/trace,Fix
|
||||||
|
TD-H-009,Survival/집중/기회비용 정책 미구현,Model,P1,정책 우선순위 불완전,Quant Lead,BE Lead,S4,ALG-PORT/SELL-004/005,golden/property,Fix
|
||||||
|
TD-H-010,sell_fraction 단위 모호,Contract,P1,core floor 계산 오류 위험,Quant Lead,Architect,S4,ratio/quantity/target weight 분리,contract tests,Fix
|
||||||
|
TD-H-011,Reentry multi-stage 상태 전이 불완전,Model,P1,단계 재진입/새 cycle 오류,BE Lead,Quant Lead,S5,explicit transition table,calendar/stage tests,Fix
|
||||||
|
TD-H-012,SignalDecision immutable trigger 누락,Data/Audit,P1,감사·재현 훼손,DBA,BE Lead,S4,DB trigger+privilege,update/delete test,Fix
|
||||||
|
TD-H-013,Architecture test가 문자열 1종만 검사,Quality,P1,경계 회귀 탐지 불가,Architect,QA,S0,AF-01~20,CI gate,Fix
|
||||||
|
TD-H-014,FE DTO 수동 중복/Idempotency retry key 변경,Frontend,P1,계약 drift/중복 명령,FE Lead,BE Lead,S7,generated/versioned contract+stable key,Vitest/E2E,Fix
|
||||||
|
TD-H-015,Outbox publisher/Inbox consumer/dead-letter 미구현,Reliability,P1,이벤트 미전달/중복,BE Lead,SRE,S4,dispatcher/inbox/replay,fault tests,Fix
|
||||||
|
TD-H-016,Read Model rebuild/staleness 미구현,Operations,P2,복구·오래된 화면,Data Lead,SRE,S6,projection registry/rebuild,DR rebuild,Fix
|
||||||
|
TD-H-017,Swagger 상시 노출,Security,P2,공격표면 증가,Security,BE Lead,S0,environment/role gate,security test,Fix
|
||||||
|
TD-H-018,No dependency vulnerability/license evidence,SupplyChain,P2,공급망 위험,DevOps,Security,S0,audit/SBOM/license report,release evidence,Fix
|
||||||
|
Vendored
+13
@@ -0,0 +1,13 @@
|
|||||||
|
# ADR-XXX Title
|
||||||
|
|
||||||
|
- Status: Proposed / Accepted / Superseded / Deprecated
|
||||||
|
- Date:
|
||||||
|
- Owners:
|
||||||
|
- Source:
|
||||||
|
- Context:
|
||||||
|
- Decision:
|
||||||
|
- Alternatives:
|
||||||
|
- Consequences:
|
||||||
|
- Fitness Functions:
|
||||||
|
- Migration/Rollback:
|
||||||
|
- Supersedes:
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
# AI Change Checklist
|
||||||
|
|
||||||
|
- [ ] Source와 문서 위치가 있다.
|
||||||
|
- [ ] Assumption/Unknown/Design Proposal을 구분했다.
|
||||||
|
- [ ] 새 정책·임계값·컬럼·API를 임의 생성하지 않았다.
|
||||||
|
- [ ] 변경 범위는 한 Slice/목적이다.
|
||||||
|
- [ ] 실행한 명령과 exit code를 기록했다.
|
||||||
|
- [ ] 실패/skip/미실행 테스트를 기록했다.
|
||||||
|
- [ ] Golden/Data/Architecture/E2E 영향이 있다.
|
||||||
|
- [ ] 민감정보가 없다.
|
||||||
|
- [ ] rollback과 잔여위험이 있다.
|
||||||
|
- [ ] 사람 승인자가 명시됐다.
|
||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# Data Contract
|
||||||
|
|
||||||
|
- Source/license/SLA/schema version:
|
||||||
|
- Timezone/unit/currency:
|
||||||
|
- source_event_time / published_at / ingested_at:
|
||||||
|
- effective_from/to / revision_no:
|
||||||
|
- source_id / content_hash / dataset_id:
|
||||||
|
- DQ PASS/WARN/QUARANTINED rules:
|
||||||
|
- tradable_session rule:
|
||||||
|
- lineage / watermark / replay:
|
||||||
|
- Owner / steward / retention:
|
||||||
Vendored
+15
@@ -0,0 +1,15 @@
|
|||||||
|
# Feature Packet
|
||||||
|
|
||||||
|
- Requirement ID:
|
||||||
|
- Slice ID:
|
||||||
|
- User outcome:
|
||||||
|
- Non-goals:
|
||||||
|
- Source / Assumption / Unknown / Decision Required:
|
||||||
|
- Policy/Data/API/DB/Job/UI/Test IDs:
|
||||||
|
- PIT cutoff and units:
|
||||||
|
- State transitions / invariants:
|
||||||
|
- Failure paths / ProblemDetails:
|
||||||
|
- Idempotency / concurrency / transaction:
|
||||||
|
- Metrics / alerts / runbook / rollback:
|
||||||
|
- Commands actually executed and artifacts:
|
||||||
|
- Owner / reviewer / approver:
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
# Model Improvement Proposal
|
||||||
|
|
||||||
|
- Proposal ID / Expiry:
|
||||||
|
- Base Model Version:
|
||||||
|
- Proposal Type:
|
||||||
|
- Problem statement:
|
||||||
|
- Evidence IDs and hashes:
|
||||||
|
- Counter-evidence:
|
||||||
|
- Root-cause hypothesis:
|
||||||
|
- Expected benefit:
|
||||||
|
- Customer/operational/regulatory risks:
|
||||||
|
- Data and license impact:
|
||||||
|
- Algorithm/policy/metric contract impact:
|
||||||
|
- Required Golden/OOS/PBO/DSR/cost tests:
|
||||||
|
- Rollback plan:
|
||||||
|
- Owner / Secondary:
|
||||||
|
- Status: DRAFT / REVIEW_REQUIRED / APPROVED_FOR_RESEARCH / REJECTED / EXPIRED
|
||||||
|
- Explicit boundary: no automatic code/config/model activation
|
||||||
Vendored
+18
@@ -0,0 +1,18 @@
|
|||||||
|
# Model/Policy Change
|
||||||
|
|
||||||
|
- Change ID:
|
||||||
|
- Policy ID:
|
||||||
|
- Source:
|
||||||
|
- Assumption:
|
||||||
|
- Unknown / Decision Required:
|
||||||
|
- Old Version Set:
|
||||||
|
- New Version Set:
|
||||||
|
- Formula / threshold diff:
|
||||||
|
- Characterization diff:
|
||||||
|
- Golden diff:
|
||||||
|
- Frozen OOS result:
|
||||||
|
- Cost x2 result:
|
||||||
|
- Market/asset/regime impact:
|
||||||
|
- False-exit/Reentry/ES impact:
|
||||||
|
- Rollback trigger:
|
||||||
|
- Quant/Risk approvers:
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
# Model Evaluation Evidence
|
||||||
|
|
||||||
|
- Evaluation ID:
|
||||||
|
- Operation Code / Schedule Version:
|
||||||
|
- Scope / Cohort / Window:
|
||||||
|
- Dataset ID / Hash:
|
||||||
|
- Model / Config / Code / Contract Version:
|
||||||
|
- Metric Definition Version:
|
||||||
|
- PIT cutoff / Published-at rule:
|
||||||
|
- Sample size / Missing / Quarantine:
|
||||||
|
- Results and confidence intervals:
|
||||||
|
- Baseline / Champion / Challenger:
|
||||||
|
- Costs / Tax / FX / Slippage scenario:
|
||||||
|
- Counter-evidence:
|
||||||
|
- Operational integrity errors:
|
||||||
|
- Gate result and blocking reasons:
|
||||||
|
- Source / Assumption / Unknown / Decision Required:
|
||||||
|
- Commands / Artifact hashes:
|
||||||
|
- Independent validator:
|
||||||
|
- Maker / Checker:
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
# Model Operations Runbook
|
||||||
|
|
||||||
|
- Operation Code / Queue / Scope:
|
||||||
|
- Owner / Secondary:
|
||||||
|
- Due SLA / Max lag:
|
||||||
|
- Inputs and frozen VersionSet:
|
||||||
|
- Expected output:
|
||||||
|
- Metrics and alerts:
|
||||||
|
- TRANSIENT retry policy:
|
||||||
|
- BUSINESS_HOLD resolution:
|
||||||
|
- QUARANTINE resolution:
|
||||||
|
- Dead-letter replay procedure:
|
||||||
|
- Duplicate/idempotency check:
|
||||||
|
- Data revision/correction procedure:
|
||||||
|
- Rollback/disable scheduler procedure:
|
||||||
|
- PII/secret handling:
|
||||||
|
- Last rehearsal / Evidence hash:
|
||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# Release Evidence
|
||||||
|
|
||||||
|
- Release/commit/container digest:
|
||||||
|
- Source coverage and supersession diff:
|
||||||
|
- OpenAPI/DDL/Event/Job/UI contract diff:
|
||||||
|
- Build/test/migration commands and results:
|
||||||
|
- Golden/OOS/data/replay evidence:
|
||||||
|
- Security/PII/license/SBOM evidence:
|
||||||
|
- Metrics/alerts/runbooks/rollback rehearsal:
|
||||||
|
- Capability flags and kill-switch state:
|
||||||
|
- Approvals:
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
# Runbook
|
||||||
|
|
||||||
|
- Service/Job/Slice:
|
||||||
|
- Owner / Secondary:
|
||||||
|
- SLO/SLA:
|
||||||
|
- Metrics/Alerts:
|
||||||
|
- Detection:
|
||||||
|
- Triage:
|
||||||
|
- Kill-switch scope:
|
||||||
|
- Safe retry/replay:
|
||||||
|
- Reconciliation:
|
||||||
|
- Rollback:
|
||||||
|
- Evidence to retain:
|
||||||
|
- Escalation:
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
# Slice Spec: <VS-ID> <Name>
|
||||||
|
|
||||||
|
- Requirement ID:
|
||||||
|
- Policy/Data/Screen ID:
|
||||||
|
- 사용자 결과:
|
||||||
|
- 비목표:
|
||||||
|
- 권한/Capability:
|
||||||
|
- 선행 데이터와 PIT cutoff:
|
||||||
|
- 상태전이:
|
||||||
|
- Endpoint/Event/Job:
|
||||||
|
- DB Migration/Read Model:
|
||||||
|
- Idempotency/Concurrency:
|
||||||
|
- Given/When/Then:
|
||||||
|
- Tests:
|
||||||
|
- Metrics/Alerts:
|
||||||
|
- Runbook/Rollback:
|
||||||
|
- Owner/Secondary:
|
||||||
|
- Source:
|
||||||
|
- Assumption:
|
||||||
|
- Unknown/Decision Required:
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
# Technical Debt Item
|
||||||
|
|
||||||
|
- ID / priority:
|
||||||
|
- Risk and interest:
|
||||||
|
- Root cause:
|
||||||
|
- Owner / secondary:
|
||||||
|
- Remediation:
|
||||||
|
- Trigger / due / gate:
|
||||||
|
- Exit test:
|
||||||
|
- Temporary control and expiry:
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
# Traceability
|
||||||
|
|
||||||
|
| REQ | POLICY/DATA | SLICE | ENDPOINT/JOB | DB/EVENT | SCREEN/COMPONENT | TEST | METRIC/RUNBOOK | PR |
|
||||||
|
|---|---|---|---|---|---|---|---|---|
|
||||||
|
| | | | | | | | | |
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# K-ArtSell Aegis v12.0 누적 통합 고도화 제안
|
||||||
|
|
||||||
|
상태: `IMPLEMENTATION_TEMPLATE / STATIC_VALIDATED / NOT_DOTNET_BUILD_VERIFIED`
|
||||||
|
제품 경계: `투자자문형 우선 · 자동주문 OFF · RESEARCH_CANDIDATE_NOT_PRODUCTION`
|
||||||
|
|
||||||
|
## 1. 경영진 결론
|
||||||
|
|
||||||
|
이번 패키지는 v10.0 기준서, K-ArtSell 12.2 연구 번들, v11 구현 가속본, v11.1 하드닝본을 폐기하거나 요약본으로 대체하지 않는다. 기존 첨부파일을 원본 그대로 포함하고, 그 위에 다음 Delta를 누적한다.
|
||||||
|
|
||||||
|
1. **정책·데이터·코드 단위의 의미 분리**: `SellRatioOfLot`, `TargetPortfolioWeightAfter`, `StrategicCoreFloorWeight`를 분리하여 단위 혼동을 제거한다.
|
||||||
|
2. **서버 주도 Evidence 계약**: 생산형 Endpoint는 Evidence/Model/Config 값을 클라이언트에서 받지 않고 승인된 PIT Read Model에서 조회한다.
|
||||||
|
3. **불변 이력과 재현성**: Evidence, Decision, Audit는 update/delete가 아닌 append/correction event로 보존하고 SHA를 기록한다.
|
||||||
|
4. **Fail-closed 보안**: 개발 전용 Header 인증은 Development에서만 허용하고 그 외 환경은 인증 공급자 미구성 시 401로 닫힌다.
|
||||||
|
5. **Vertical Slice 완결성**: Endpoint→Application→Pure Policy→Dapper→Outbox→DB→FE→Tests→Observability를 하나의 Done 단위로 묶는다.
|
||||||
|
6. **과유불급 통제**: Generic Repository, 범용 Mediator wrapper, 자동 plugin discovery, 조기 microservice 분리는 금지한다.
|
||||||
|
7. **상세 WBS 재정렬**: 화면 선행이 아니라 `PIT Data → Evidence → Sell/Reentry → Recommendation → Evaluation → Reconciliation/DR` Critical Path를 고정한다.
|
||||||
|
|
||||||
|
## 2. 이번 버전의 실질 개선
|
||||||
|
|
||||||
|
| 영역 | 기존 위험 | v12.0 개선 |
|
||||||
|
|---|---|---|
|
||||||
|
| 알고리즘 | Lot 비율과 포트폴리오 비중 혼동 | 명시적 단위 계약과 정책별 우선순위 고정 |
|
||||||
|
| 데이터 | 원시/PIT/Projection 혼재 | L0~L7 계층, immutable raw, revision, lineage, rebuildable read model |
|
||||||
|
| BE | 연구 Endpoint가 생산형 계약처럼 보임 | 연구 전용 Endpoint와 생산형 Command 분리 |
|
||||||
|
| DB | Decision의 Version Set 부족 | Dataset/Model/Config/Code SHA, idempotency, correlation, hash 추가 |
|
||||||
|
| FE | DTO 수동 중복과 응답 무검증 | Zod를 계약 기준으로 사용하고 응답까지 runtime validation |
|
||||||
|
| 보안 | 인증 미구성 상태의 모호성 | DevelopmentHeader 또는 FailClosed 두 상태만 허용 |
|
||||||
|
| 운영 | Queue와 재처리 의미 불명확 | 9개 Queue 분리, JobRun/Watermark/Idempotency 계약 유지 |
|
||||||
|
| 바이브코딩 | AI 생성 코드가 근거 없이 확장될 가능성 | Source/Assumption/Unknown/Decision Required와 PR 증거 강제 |
|
||||||
|
| 기술부채 | 목록은 있으나 상환 순서가 약함 | Safety/Integrity/Delivery/Convenience 4등급과 WBS 연계 |
|
||||||
|
|
||||||
|
## 3. 착수 우선순위
|
||||||
|
|
||||||
|
- **P0**: 원본 데이터 권리·manifest·PIT·기업행사·상폐·총수익·비용·FX.
|
||||||
|
- **P1**: EvidenceSnapshot, Lot/Cycle, Sell/Reentry Policy Chain, Golden Vector.
|
||||||
|
- **P2**: 추천 검토·승인·공개·사후평가와 감사추적.
|
||||||
|
- **P3**: 포트폴리오 위험·리밸런싱·대체상품.
|
||||||
|
- **P4**: KIS Capability, 대사, Pilot. 주문 Capability는 계속 OFF.
|
||||||
|
|
||||||
|
## 4. Go/No-Go
|
||||||
|
|
||||||
|
다음 중 하나라도 미충족이면 해당 Slice는 코딩 또는 승격하지 않는다.
|
||||||
|
|
||||||
|
- Requirement/Policy/Data/API/DB/Test/PR Trace가 연결되지 않음.
|
||||||
|
- PIT `published_at` 또는 revision 계약이 없음.
|
||||||
|
- Evidence/Decision/Outbox가 같은 트랜잭션 또는 명시적 보상계약으로 묶이지 않음.
|
||||||
|
- 미승인 데이터가 Recommendation에 유입될 수 있음.
|
||||||
|
- Golden/OOS/비용 2배/룩어헤드/상폐/기업행사 테스트가 없음.
|
||||||
|
- Owner, Alert, Runbook, Rollback이 없음.
|
||||||
|
- 자동주문 또는 KIS 제출 Capability가 활성화됨.
|
||||||
|
|
||||||
|
## 5. 검증 상태
|
||||||
|
|
||||||
|
Python 연구 계약 테스트는 실행해 통과했다. JSON/XML/CSV/Python 정적 검증과 금지 패턴 검사를 수행한다. 현재 작업 환경에는 .NET SDK와 pnpm이 없으므로 `dotnet restore/build/test`, PostgreSQL migration rehearsal, `pnpm install/test/build`는 실행하지 못했다. 이 항목은 G0의 차단 조건으로 남긴다.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# 첨부 소스 감사와 비회귀 Delta
|
||||||
|
|
||||||
|
## 1. 감사 대상
|
||||||
|
|
||||||
|
| Source | 역할 | 처리 |
|
||||||
|
|---|---|---|
|
||||||
|
| K-ArtSell 12.2 complete package | 연구 코드, 결과 CSV, 정량 검토, 구성안 | 원본 보존 + 연구 계약 하드닝 |
|
||||||
|
| SI 누적 통합 실행기준서 v10.0 | 47개 장 상세, 26 Slice, 16 Sprint, Gate | 최상위 기준선으로 보존 |
|
||||||
|
| v11 implementation acceleration | 최초 .NET/Vue 실행 골격 | 코드 Delta의 시작점 |
|
||||||
|
| v11.1 hardening | 보안·불변성·리팩터링 보강 | v12.0에 누적, testfile 제거 |
|
||||||
|
|
||||||
|
원본 4개 첨부파일은 `attachments/original`에 그대로 포함한다. 압축 해제본은 `attachments/extracted`에 별도 보관한다.
|
||||||
|
|
||||||
|
## 2. 연구 번들에서 유지해야 할 결론
|
||||||
|
|
||||||
|
- 알고리즘 상태는 생산 모델이 아니라 연구후보다.
|
||||||
|
- 매도 우선순위는 `Hard impairment → Portfolio survival → Profit floor → Concentration/Liquidity → Opportunity cost → Reentry`다.
|
||||||
|
- 일평가는 단타 적중률이 아니라 비용후 기대효용, calibration, ES/MDD, false-exit, 재진입 포착, 운영 무결성을 누적하는 품질관리다.
|
||||||
|
- 최소 252 거래일 Shadow, 복수 시장국면, PBO/DSR, 비용 2배 스트레스, 운영·준법 Gate가 필요하다.
|
||||||
|
- 원시 데이터, PIT 재무/컨센서스, 총수익, 상폐수익, 기업행사, Fee/Tax/FX가 완전하지 않다.
|
||||||
|
|
||||||
|
## 3. 코드 감사에서 확인한 개선 필요점
|
||||||
|
|
||||||
|
### P0
|
||||||
|
|
||||||
|
1. v11/v11.1에는 실제 .NET 빌드 증거가 없고 현재 환경에서도 SDK가 없다.
|
||||||
|
2. FE lockfile이 없어 reproducible install이 불가능하다.
|
||||||
|
3. 기존 연구 Endpoint는 Evidence/Model/Config를 클라이언트가 전달했다.
|
||||||
|
4. Decision 테이블의 `sell_fraction`은 Lot 비율인지 포트폴리오 비중인지 모호했다.
|
||||||
|
5. 데이터 Read Model의 owner/version/watermark/rebuild 계약이 코드에 없었다.
|
||||||
|
|
||||||
|
### P1
|
||||||
|
|
||||||
|
1. 정책 구현이 Hard/Gap/Two-close에 치우쳐 Portfolio survival, Concentration, Opportunity cost가 누락됐다.
|
||||||
|
2. Context 조회, Decision append, Outbox append의 생산형 트랜잭션 예제가 없었다.
|
||||||
|
3. Fail-closed 인증은 있었으나 개발용 안전한 실행 경로가 분리되지 않았다.
|
||||||
|
4. FE 응답 계약은 TypeScript interface만 있고 runtime 검증이 없었다.
|
||||||
|
5. Architecture Test가 문자열 검색 위주라 프로젝트 의존과 SQL schema contract를 충분히 확인하지 못했다.
|
||||||
|
|
||||||
|
## 4. v12.0 Delta 상태
|
||||||
|
|
||||||
|
| 항목 | 상태 | 증거 |
|
||||||
|
|---|---|---|
|
||||||
|
| 6개 Sell Policy 순서 | 구현 | Domain/Policies + Unit Test |
|
||||||
|
| Lot ratio/portfolio weight 분리 | 구현 | Domain contract + DB migration + FE schema |
|
||||||
|
| 생산형 Endpoint 서버 Evidence 조회 | 구현 템플릿 | GenerateSellDecision Slice |
|
||||||
|
| Research Endpoint 명시적 분리 | 구현 | EvaluateResearchSellPolicy Slice |
|
||||||
|
| Decision/Context/Audit 불변성 | 구현 | 0012 migration trigger |
|
||||||
|
| Auth fail-closed/dev-only 분리 | 구현 | Host/Security |
|
||||||
|
| Python Golden Contract | 실행 검증 | research/hardening/TEST_RESULTS.txt |
|
||||||
|
| .NET build/test | 미검증 | G0 Decision Required |
|
||||||
|
| pnpm frozen install/build | 미검증 | lockfile 생성·승인 필요 |
|
||||||
|
| PostgreSQL fresh/upgrade/re-run | 미검증 | G0 DBA rehearsal 필요 |
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# 아키텍처 표준: Modular Monolith + Vertical Slice
|
||||||
|
|
||||||
|
## 1. 구조적 선택
|
||||||
|
|
||||||
|
단일 배포를 유지하되 모듈과 PostgreSQL schema의 소유권을 분리한다. Microservice 분리는 조직·배포·데이터 소유권·SLO가 실제로 독립될 때만 ADR로 검토한다.
|
||||||
|
|
||||||
|
```text
|
||||||
|
Host
|
||||||
|
├─ BuildingBlocks
|
||||||
|
├─ IdentityAccess
|
||||||
|
├─ SecurityMaster / MarketData / FundamentalsPIT
|
||||||
|
├─ ResearchFactors / ValuationForecast
|
||||||
|
├─ SignalEngine
|
||||||
|
├─ PortfolioRisk / ClientAdvisory
|
||||||
|
├─ BacktestingEvaluation
|
||||||
|
├─ ExecutionReconciliation
|
||||||
|
├─ ReportingNotifications
|
||||||
|
└─ GovernanceAudit
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 의존 방향
|
||||||
|
|
||||||
|
- Domain은 FastEndpoints, Dapper, Npgsql, Hangfire, HTTP를 참조하지 않는다.
|
||||||
|
- Application은 Domain과 좁은 Port를 사용한다.
|
||||||
|
- Infrastructure는 Dapper/Npgsql/Adapter를 구현한다.
|
||||||
|
- Host는 composition root다.
|
||||||
|
- 모듈 간 Source Table 직접 조회를 금지하고 Contract 또는 승인된 Read Model을 사용한다.
|
||||||
|
|
||||||
|
## 3. SOLID의 적용 범위
|
||||||
|
|
||||||
|
| 원칙 | 실무 적용 | 금지 |
|
||||||
|
|---|---|---|
|
||||||
|
| SRP | Endpoint=HTTP, Handler=use case, Policy=decision, Adapter=I/O | God Service, Job 내 정책 |
|
||||||
|
| OCP | Policy/DQ/Adapter는 명시적 registry로 추가 | Reflection plugin framework |
|
||||||
|
| LSP | Adapter 교체 시 시간·단위·오류 contract test | Mock 성공만으로 교체 승인 |
|
||||||
|
| ISP | 작은 Port (`IClock`, `ISellDecisionContextReader`) | 범용 Repository |
|
||||||
|
| DIP | Domain은 외부 기술을 모름 | Npgsql type의 Domain 침투 |
|
||||||
|
|
||||||
|
추상화는 두 번째 실제 구현과 동일한 변경축이 확인된 후 승격한다.
|
||||||
|
|
||||||
|
## 4. Vertical Slice 표준
|
||||||
|
|
||||||
|
```text
|
||||||
|
Features/<Slice>/
|
||||||
|
Endpoint.cs
|
||||||
|
Request.cs
|
||||||
|
Response.cs
|
||||||
|
Validator.cs
|
||||||
|
Handler/Service.cs
|
||||||
|
Sql.cs
|
||||||
|
Mapper.cs
|
||||||
|
Contracts/
|
||||||
|
Tests/
|
||||||
|
README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
한 Slice는 Endpoint, DB migration, Event/Job, FE route/component, unit/integration/E2E, metric/alert/runbook까지 완결되어야 Done이다.
|
||||||
|
|
||||||
|
## 5. 트랜잭션 경계
|
||||||
|
|
||||||
|
생산형 Decision 생성은 같은 PostgreSQL 트랜잭션에서 다음을 수행한다.
|
||||||
|
|
||||||
|
1. Idempotency 기존 결과 확인.
|
||||||
|
2. 승인된 immutable Context 조회.
|
||||||
|
3. 순수 Policy 평가.
|
||||||
|
4. Decision append와 hash 저장.
|
||||||
|
5. Outbox append.
|
||||||
|
6. Commit.
|
||||||
|
|
||||||
|
외부 API 호출은 트랜잭션 밖에서 수행하고 Raw immutable store에 먼저 적재한다.
|
||||||
|
|
||||||
|
## 6. 정규화와 역정규화
|
||||||
|
|
||||||
|
- Write Model: 3NF, append/reversal, valid_from/to, revision.
|
||||||
|
- Evidence: 원본 JSONB + 제약/검색에 필요한 핵심 컬럼.
|
||||||
|
- Read Model: Owner, ProjectionVersion, SourceWatermark, ContentHash, Rebuild 명령을 가져야 한다.
|
||||||
|
- 화면 성능을 이유로 Source Table을 직접 join하는 것을 금지한다.
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# 알고리즘·데이터 계약
|
||||||
|
|
||||||
|
## 1. 매도 정책 체인
|
||||||
|
|
||||||
|
고정 순서:
|
||||||
|
|
||||||
|
1. `ALG-SELL-001` Hard impairment.
|
||||||
|
2. `ALG-SELL-PORT-001` Portfolio survival/capital floor.
|
||||||
|
3. `ALG-SELL-002` Gap floor breach.
|
||||||
|
4. `ALG-SELL-003` Two-close breach.
|
||||||
|
5. `ALG-SELL-004` Concentration/liquidity.
|
||||||
|
6. `ALG-SELL-005` Opportunity replacement.
|
||||||
|
7. `ALG-HOLD-001` Hold.
|
||||||
|
|
||||||
|
상위 정책이 결정을 생성하면 하위 정책은 평가 결과를 상쇄하지 않는다.
|
||||||
|
|
||||||
|
## 2. 단위 계약
|
||||||
|
|
||||||
|
| 필드 | 의미 | 단위 |
|
||||||
|
|---|---|---|
|
||||||
|
| `SellRatioOfLot` | 현재 Lot 수량 중 매도 비율 | 0~1 |
|
||||||
|
| `CurrentPortfolioWeight` | 해당 보유의 현재 포트폴리오 비중 | 0~1 |
|
||||||
|
| `StrategicCoreFloorWeight` | 매도 후 보존할 절대 포트폴리오 비중 | 0~1 |
|
||||||
|
| `TargetPortfolioWeightAfter` | 정책 실행 후 예상 포트폴리오 비중 | 0~1 |
|
||||||
|
| `OpportunityEdgeLowerBound` | 비용후 교체우위 신뢰구간 하단 | 수익률 |
|
||||||
|
|
||||||
|
Profit floor, concentration, opportunity 정책은 strategic core를 보존한다. Portfolio survival은 생존 우선순위 때문에 core 아래 축소가 가능하다. Hard impairment는 전량매도와 자동 재진입 금지가 기본이다.
|
||||||
|
|
||||||
|
## 3. Evidence Version Set
|
||||||
|
|
||||||
|
Decision은 다음 값 없이는 저장하지 않는다.
|
||||||
|
|
||||||
|
- PositionLotId, CycleId.
|
||||||
|
- EvidenceId, DatasetId.
|
||||||
|
- ModelVersion, ConfigVersion, CodeSha.
|
||||||
|
- AsOf, PublishedAtCutoff.
|
||||||
|
- PolicyId, Priority, ReasonCode.
|
||||||
|
- DecisionHash, IdempotencyKey, CorrelationId.
|
||||||
|
|
||||||
|
## 4. Reentry 상태기계
|
||||||
|
|
||||||
|
`WATCHING → READY → REENTERED → WATCHING/OPEN`이며 Hard impairment는 `CLOSED`, 126 거래일 만료는 `EXPIRED`다.
|
||||||
|
|
||||||
|
Ready 조건:
|
||||||
|
|
||||||
|
- 매도 후 최소 10 거래일.
|
||||||
|
- 직전 단계 후 최소 10 거래일.
|
||||||
|
- 상승 중인 50일선 회복.
|
||||||
|
- 직전 20 거래일 고점 돌파.
|
||||||
|
- 자산유형별 추가 확인조건.
|
||||||
|
|
||||||
|
재진입은 새 CycleId와 새 Lot을 생성한다.
|
||||||
|
|
||||||
|
## 5. 데이터 계층
|
||||||
|
|
||||||
|
| Layer | 내용 | 불변조건 |
|
||||||
|
|---|---|---|
|
||||||
|
| L0 | Source Catalog/License/SLA | 승인 없는 소스 사용 금지 |
|
||||||
|
| L1 | Raw payload/hash | overwrite 금지 |
|
||||||
|
| L2 | Canonical PIT/revision | published_at 이후 사용 |
|
||||||
|
| L3 | DQ/lineage/dataset manifest | quarantine 사용 금지 |
|
||||||
|
| L4 | Feature/Forecast/Risk/Evidence | code/config/data hash |
|
||||||
|
| L5 | Decision/Review/Publish/Outcome | append-only audit |
|
||||||
|
| L6 | Read Model | version/watermark/rebuild |
|
||||||
|
| L7 | Backtest/ModelCard/Release | artifact hash |
|
||||||
|
|
||||||
|
## 6. 검증
|
||||||
|
|
||||||
|
- Lookahead 0.
|
||||||
|
- 당시 유니버스와 상폐수익 포함.
|
||||||
|
- 기업행사·총수익·Fee/Tax/FX PIT.
|
||||||
|
- deterministic seed와 frozen manifest.
|
||||||
|
- 비용 2배에서도 기대효용 양수.
|
||||||
|
- PBO ≤20%, DSR ≥95%는 승격 Gate이며 현재 달성 주장 아님.
|
||||||
|
- 재진입 포착률 ≥65%, false-exit 연 2% 이하도 Shadow 검증 목표다.
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# BE/FE 컴포넌트 표준
|
||||||
|
|
||||||
|
## 1. Backend
|
||||||
|
|
||||||
|
### 1.1 Endpoint
|
||||||
|
|
||||||
|
- HTTP parsing, auth, idempotency header, ProblemDetails 변환만 수행한다.
|
||||||
|
- 생산형 Command는 `PositionLotId`, `AsOf` 등 업무 식별자만 받는다.
|
||||||
|
- 모델버전·임계값·Evidence를 클라이언트가 지정하지 못한다.
|
||||||
|
|
||||||
|
### 1.2 Application
|
||||||
|
|
||||||
|
- 트랜잭션과 유스케이스 오케스트레이션을 담당한다.
|
||||||
|
- 재시도 가능한 Command는 IdempotencyKey를 필수로 한다.
|
||||||
|
- 외부 호출과 DB transaction을 혼합하지 않는다.
|
||||||
|
|
||||||
|
### 1.3 Domain Policy
|
||||||
|
|
||||||
|
- 순수 함수다.
|
||||||
|
- 시간, DB, 네트워크, 랜덤을 직접 사용하지 않는다.
|
||||||
|
- 순서·단위·경계값을 Unit/Golden test로 고정한다.
|
||||||
|
|
||||||
|
### 1.4 Dapper/SQL
|
||||||
|
|
||||||
|
- schema-qualified table과 명시적 column만 사용한다.
|
||||||
|
- `SELECT *` 금지.
|
||||||
|
- SQL은 Slice 가까이에 두되 공통 query abstraction을 과도하게 만들지 않는다.
|
||||||
|
- immutable table은 trigger와 권한으로 update/delete를 차단한다.
|
||||||
|
|
||||||
|
## 2. Frontend
|
||||||
|
|
||||||
|
### 2.1 상태 소유권
|
||||||
|
|
||||||
|
- Server state: TanStack Query.
|
||||||
|
- User/session/role/UI preference: Pinia.
|
||||||
|
- Form: vee-validate + Zod.
|
||||||
|
- URL shareable state: vue-router query/params.
|
||||||
|
- 대량 표: AG Grid server-side model.
|
||||||
|
|
||||||
|
### 2.2 계약
|
||||||
|
|
||||||
|
- Zod schema를 request/response runtime validation에 사용한다.
|
||||||
|
- TypeScript type은 `z.infer`로 파생한다.
|
||||||
|
- 같은 명령의 retry는 동일 Idempotency-Key를 재사용한다.
|
||||||
|
- 409/422/429/503을 서로 다른 UX로 처리한다.
|
||||||
|
|
||||||
|
### 2.3 공통 컴포넌트
|
||||||
|
|
||||||
|
- `QueryStateBoundary`: loading/empty/partial/stale/warn/error/401/403/409/expired/readonly.
|
||||||
|
- `PermissionGuard`: 역할 기반 표시경계. 서버 권한검사를 대체하지 않는다.
|
||||||
|
- `DataFreshnessBadge`: as-of와 stale 상태.
|
||||||
|
- `VersionConflictDialog`: If-Match/409 처리.
|
||||||
|
- `DataGridShell`, `CrudForm`은 실제 반복이 확인된 후 추가한다.
|
||||||
|
|
||||||
|
### 2.4 도메인 컴포넌트
|
||||||
|
|
||||||
|
- EvidencePanel.
|
||||||
|
- ProtectionFloorPanel.
|
||||||
|
- ReentryTimeline.
|
||||||
|
- ApprovalPanel.
|
||||||
|
- OutcomeAttributionPanel.
|
||||||
|
|
||||||
|
업무 의미가 다른 화면을 props가 많은 범용 컴포넌트 하나로 합치지 않는다.
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# 바이브코딩·홀루시네이션 통제
|
||||||
|
|
||||||
|
## 1. 기본 원칙
|
||||||
|
|
||||||
|
AI는 구현 초안을 만든다. 정책·증거·리스크·승격은 사람이 승인한다. 채팅, 자동완성, 생성 코드 자체는 Source of Truth가 아니다.
|
||||||
|
|
||||||
|
## 2. 모든 변경의 4분류
|
||||||
|
|
||||||
|
- `SOURCE`: 첨부 기준서, 승인 ADR, 계약, 데이터 증거에 직접 근거.
|
||||||
|
- `ASSUMPTION`: 착수 편의를 위한 가정. 만료일과 승인자가 필요.
|
||||||
|
- `UNKNOWN`: 자료로 판단할 수 없음.
|
||||||
|
- `DECISION_REQUIRED`: 코딩 전 결정이 필요한 차단 항목.
|
||||||
|
|
||||||
|
## 3. AI 작업 패킷
|
||||||
|
|
||||||
|
AI에 전달하는 작업은 최소 다음을 포함한다.
|
||||||
|
|
||||||
|
1. Requirement ID / Slice ID.
|
||||||
|
2. 사용자 결과와 비목표.
|
||||||
|
3. Policy ID와 단위·우선순위.
|
||||||
|
4. Data source/PIT/revision/quality.
|
||||||
|
5. API/DB/Event/Job/UI 계약.
|
||||||
|
6. Given/When/Then과 실패상태.
|
||||||
|
7. 금지 패턴.
|
||||||
|
8. 검증 명령과 완료 증거.
|
||||||
|
|
||||||
|
## 4. PR 차단 규칙
|
||||||
|
|
||||||
|
- Source/Assumption/Unknown 표기가 없음.
|
||||||
|
- 새 library/pattern/table/threshold에 ADR이 없음.
|
||||||
|
- Migration fresh/upgrade/re-run evidence가 없음.
|
||||||
|
- Golden/OOS/Architecture/Data/E2E test가 없음.
|
||||||
|
- 실행하지 않은 test를 통과로 기록함.
|
||||||
|
- 실고객 데이터·계좌·token·secret가 prompt/log/fixture에 포함됨.
|
||||||
|
- 자동주문 Capability를 우회하거나 기본 ON으로 변경함.
|
||||||
|
|
||||||
|
## 5. 리팩터링 원칙
|
||||||
|
|
||||||
|
- 동작 보존 refactoring과 정책 변경을 한 PR에 섞지 않는다.
|
||||||
|
- 먼저 Characterization/Golden test를 만든다.
|
||||||
|
- God Service를 Endpoint/Application/Policy/Adapter로 분리한다.
|
||||||
|
- Generic Repository로 Dapper SQL 의미를 숨기지 않는다.
|
||||||
|
- 중복은 의미와 변경축이 같을 때만 추상화한다.
|
||||||
|
- 기술부채는 등록, owner, impact, repayment trigger, deadline을 가진다.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Delivery Gate
|
||||||
|
|
||||||
|
## G0 Toolchain/Repository
|
||||||
|
|
||||||
|
- .NET 10 SDK, Node 22, pnpm 10 설치.
|
||||||
|
- `pnpm-lock.yaml` 생성·검토·커밋.
|
||||||
|
- `dotnet restore/build/test`와 `pnpm install --frozen-lockfile/typecheck/test/build` 통과.
|
||||||
|
- PostgreSQL 17 fresh/upgrade/re-run migration.
|
||||||
|
|
||||||
|
## G1 Data Minimum
|
||||||
|
|
||||||
|
- SecurityMaster, MarketCalendar, Raw immutable, PIT timestamp, revision, DQ.
|
||||||
|
- 기업행사·총수익·상폐·FX·Fee/Tax contract.
|
||||||
|
- Replay same manifest/hash.
|
||||||
|
|
||||||
|
## G2 Algorithm Contract
|
||||||
|
|
||||||
|
- 6개 Sell Policy와 Reentry state machine Golden.
|
||||||
|
- Lot/Cycle reset.
|
||||||
|
- Evidence Version Set 100%.
|
||||||
|
- 비용 2배, boundary ±epsilon, lookahead tests.
|
||||||
|
|
||||||
|
## G3 Advisory MVP
|
||||||
|
|
||||||
|
- Recommendation→Review→Publish→ClientDecision→Outcome E2E.
|
||||||
|
- maker-checker, approval expiry, unapproved publication 0.
|
||||||
|
- 고객 화면에 근거·반대증거·불확실성·비용·재진입 표시.
|
||||||
|
|
||||||
|
## G4 Shadow
|
||||||
|
|
||||||
|
- 최소 252 거래일, 복수 국면.
|
||||||
|
- 운영 무결성 오류 0.
|
||||||
|
- 매도/재진입/예측 calibration/위험감소 KPI 누적.
|
||||||
|
|
||||||
|
## G5 Pilot Readiness
|
||||||
|
|
||||||
|
- AuthN/AuthZ, PII, audit, reconciliation, kill-switch, DR.
|
||||||
|
- SLO/RPO/RTO와 Runbook.
|
||||||
|
- 법무·준법·정보보호 승인.
|
||||||
|
|
||||||
|
## G6 Advisory Go-Live
|
||||||
|
|
||||||
|
- 자동주문 OFF.
|
||||||
|
- backfill/reconciliation/cutover/rollback rehearsal.
|
||||||
|
- Release Evidence와 residual risk 승인.
|
||||||
|
|
||||||
|
## 일임형 별도 검토 Gate
|
||||||
|
|
||||||
|
Shadow 기간·OOS·PBO/DSR·비용후 효용·운영/준법/고객보호를 모두 통과한 뒤 별도 프로젝트로 검토한다. 적중률 하나로 전환하지 않는다.
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
WBS_ID,Sprint,Weeks,Vertical_Slice,Domain,Workstream,Sprint_Goal,Task,Artifact,Acceptance_Criteria,Owner,Reviewer,PD,Dependencies,Source_Status,Gate,Priority,Status
|
||||||
|
AEG-S0-01,S0,W1-2,VS-00,Foundation,GOV,착수·통제·Walking Skeleton,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,,SOURCE+DESIGN_PROPOSAL,G0,P0,PLANNED
|
||||||
|
AEG-S0-02,S0,W1-2,VS-00,Foundation,DATA,착수·통제·Walking Skeleton,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,,SOURCE+DESIGN_PROPOSAL,G0,P0,PLANNED
|
||||||
|
AEG-S0-03,S0,W1-2,VS-00,Foundation,BE,착수·통제·Walking Skeleton,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,,SOURCE+DESIGN_PROPOSAL,G0,P0,PLANNED
|
||||||
|
AEG-S0-04,S0,W1-2,VS-00,Foundation,FE,착수·통제·Walking Skeleton,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,,SOURCE+DESIGN_PROPOSAL,G0,P1,PLANNED
|
||||||
|
AEG-S0-05,S0,W1-2,VS-00,Foundation,TEST,착수·통제·Walking Skeleton,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,,SOURCE+DESIGN_PROPOSAL,G0,P0,PLANNED
|
||||||
|
AEG-S0-06,S0,W1-2,VS-00,Foundation,OPS,착수·통제·Walking Skeleton,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,,SOURCE+DESIGN_PROPOSAL,G0,P1,PLANNED
|
||||||
|
AEG-S0-07,S0,W1-2,VS-00,Foundation,TOOLCHAIN,,SDK/lockfile/CI 재현성 확보,"global.json, pnpm-lock.yaml, CI logs",dotnet/pnpm frozen build green,DevOps,Architect,8,,SOURCE+DESIGN_PROPOSAL,G0,P0,PLANNED
|
||||||
|
AEG-S1-01,S1,W3-4,VS-01/02,Identity/SecurityMaster,GOV,인증·권한·상품기준·시장캘린더,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P0,PLANNED
|
||||||
|
AEG-S1-02,S1,W3-4,VS-01/02,Identity/SecurityMaster,DATA,인증·권한·상품기준·시장캘린더,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P0,PLANNED
|
||||||
|
AEG-S1-03,S1,W3-4,VS-01/02,Identity/SecurityMaster,BE,인증·권한·상품기준·시장캘린더,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P0,PLANNED
|
||||||
|
AEG-S1-04,S1,W3-4,VS-01/02,Identity/SecurityMaster,FE,인증·권한·상품기준·시장캘린더,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P1,PLANNED
|
||||||
|
AEG-S1-05,S1,W3-4,VS-01/02,Identity/SecurityMaster,TEST,인증·권한·상품기준·시장캘린더,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P0,PLANNED
|
||||||
|
AEG-S1-06,S1,W3-4,VS-01/02,Identity/SecurityMaster,OPS,인증·권한·상품기준·시장캘린더,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S0-DONE,SOURCE+DESIGN_PROPOSAL,G1-A,P1,PLANNED
|
||||||
|
AEG-S10-01,S10,W21-22,VS-12/22,Buy/Replacement,GOV,매수후보·대체상품·상품탐색,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P0,PLANNED
|
||||||
|
AEG-S10-02,S10,W21-22,VS-12/22,Buy/Replacement,DATA,매수후보·대체상품·상품탐색,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P0,PLANNED
|
||||||
|
AEG-S10-03,S10,W21-22,VS-12/22,Buy/Replacement,BE,매수후보·대체상품·상품탐색,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P0,PLANNED
|
||||||
|
AEG-S10-04,S10,W21-22,VS-12/22,Buy/Replacement,FE,매수후보·대체상품·상품탐색,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P1,PLANNED
|
||||||
|
AEG-S10-05,S10,W21-22,VS-12/22,Buy/Replacement,TEST,매수후보·대체상품·상품탐색,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P0,PLANNED
|
||||||
|
AEG-S10-06,S10,W21-22,VS-12/22,Buy/Replacement,OPS,매수후보·대체상품·상품탐색,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S9-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio Gate,P1,PLANNED
|
||||||
|
AEG-S11-01,S11,W23-24,VS-18/24,Shadow/Scorecard,GOV,가상체결·일평가·drift,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P0,PLANNED
|
||||||
|
AEG-S11-02,S11,W23-24,VS-18/24,Shadow/Scorecard,DATA,가상체결·일평가·drift,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P0,PLANNED
|
||||||
|
AEG-S11-03,S11,W23-24,VS-18/24,Shadow/Scorecard,BE,가상체결·일평가·drift,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P0,PLANNED
|
||||||
|
AEG-S11-04,S11,W23-24,VS-18/24,Shadow/Scorecard,FE,가상체결·일평가·drift,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P1,PLANNED
|
||||||
|
AEG-S11-05,S11,W23-24,VS-18/24,Shadow/Scorecard,TEST,가상체결·일평가·drift,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P0,PLANNED
|
||||||
|
AEG-S11-06,S11,W23-24,VS-18/24,Shadow/Scorecard,OPS,가상체결·일평가·drift,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S10-DONE,SOURCE+DESIGN_PROPOSAL,G4-A,P1,PLANNED
|
||||||
|
AEG-S12-01,S12,W25-26,VS-23,KIS/Reconciliation,GOV,Capability OFF Adapter·대사,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P0,PLANNED
|
||||||
|
AEG-S12-02,S12,W25-26,VS-23,KIS/Reconciliation,DATA,Capability OFF Adapter·대사,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P0,PLANNED
|
||||||
|
AEG-S12-03,S12,W25-26,VS-23,KIS/Reconciliation,BE,Capability OFF Adapter·대사,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P0,PLANNED
|
||||||
|
AEG-S12-04,S12,W25-26,VS-23,KIS/Reconciliation,FE,Capability OFF Adapter·대사,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P1,PLANNED
|
||||||
|
AEG-S12-05,S12,W25-26,VS-23,KIS/Reconciliation,TEST,Capability OFF Adapter·대사,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P0,PLANNED
|
||||||
|
AEG-S12-06,S12,W25-26,VS-23,KIS/Reconciliation,OPS,Capability OFF Adapter·대사,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S11-DONE,SOURCE+DESIGN_PROPOSAL,Pilot-A,P1,PLANNED
|
||||||
|
AEG-S12-07,S12,W25-26,VS-23,Execution,CAPABILITY,,KIS Capability OFF 및 대사,"adapter stub, capability tests","외부 주문 호출 0, partial/duplicate/out-of-order fill break 생성",BE/Ops,Security/Compliance,10,AEG-S11-06,SOURCE+DESIGN_PROPOSAL,Pilot-A,P0,PLANNED
|
||||||
|
AEG-S13-01,S13,W27-28,VS-25,Security/DR/UAT,GOV,보안·kill-switch·DR·UAT,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P0,PLANNED
|
||||||
|
AEG-S13-02,S13,W27-28,VS-25,Security/DR/UAT,DATA,보안·kill-switch·DR·UAT,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P0,PLANNED
|
||||||
|
AEG-S13-03,S13,W27-28,VS-25,Security/DR/UAT,BE,보안·kill-switch·DR·UAT,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P0,PLANNED
|
||||||
|
AEG-S13-04,S13,W27-28,VS-25,Security/DR/UAT,FE,보안·kill-switch·DR·UAT,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P1,PLANNED
|
||||||
|
AEG-S13-05,S13,W27-28,VS-25,Security/DR/UAT,TEST,보안·kill-switch·DR·UAT,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P0,PLANNED
|
||||||
|
AEG-S13-06,S13,W27-28,VS-25,Security/DR/UAT,OPS,보안·kill-switch·DR·UAT,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S12-DONE,SOURCE+DESIGN_PROPOSAL,G5,P1,PLANNED
|
||||||
|
AEG-S14-01,S14,W29-30,Cross,Performance/Cutover,GOV,SLA·backfill·전환리허설,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P0,PLANNED
|
||||||
|
AEG-S14-02,S14,W29-30,Cross,Performance/Cutover,DATA,SLA·backfill·전환리허설,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P0,PLANNED
|
||||||
|
AEG-S14-03,S14,W29-30,Cross,Performance/Cutover,BE,SLA·backfill·전환리허설,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P0,PLANNED
|
||||||
|
AEG-S14-04,S14,W29-30,Cross,Performance/Cutover,FE,SLA·backfill·전환리허설,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P1,PLANNED
|
||||||
|
AEG-S14-05,S14,W29-30,Cross,Performance/Cutover,TEST,SLA·backfill·전환리허설,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P0,PLANNED
|
||||||
|
AEG-S14-06,S14,W29-30,Cross,Performance/Cutover,OPS,SLA·backfill·전환리허설,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S13-DONE,SOURCE+DESIGN_PROPOSAL,G6-A,P1,PLANNED
|
||||||
|
AEG-S15-01,S15,W31-32,Cross,Go-Live/Hypercare,GOV,자문형 전환·초기안정화,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P0,PLANNED
|
||||||
|
AEG-S15-02,S15,W31-32,Cross,Go-Live/Hypercare,DATA,자문형 전환·초기안정화,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P0,PLANNED
|
||||||
|
AEG-S15-03,S15,W31-32,Cross,Go-Live/Hypercare,BE,자문형 전환·초기안정화,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P0,PLANNED
|
||||||
|
AEG-S15-04,S15,W31-32,Cross,Go-Live/Hypercare,FE,자문형 전환·초기안정화,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P1,PLANNED
|
||||||
|
AEG-S15-05,S15,W31-32,Cross,Go-Live/Hypercare,TEST,자문형 전환·초기안정화,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P0,PLANNED
|
||||||
|
AEG-S15-06,S15,W31-32,Cross,Go-Live/Hypercare,OPS,자문형 전환·초기안정화,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S14-DONE,SOURCE+DESIGN_PROPOSAL,G6,P1,PLANNED
|
||||||
|
AEG-S2-01,S2,W5-6,VS-03/04,MarketData,GOV,PIT 시세·기업행사·총수익·DQ,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P0,PLANNED
|
||||||
|
AEG-S2-02,S2,W5-6,VS-03/04,MarketData,DATA,PIT 시세·기업행사·총수익·DQ,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P0,PLANNED
|
||||||
|
AEG-S2-03,S2,W5-6,VS-03/04,MarketData,BE,PIT 시세·기업행사·총수익·DQ,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P0,PLANNED
|
||||||
|
AEG-S2-04,S2,W5-6,VS-03/04,MarketData,FE,PIT 시세·기업행사·총수익·DQ,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P1,PLANNED
|
||||||
|
AEG-S2-05,S2,W5-6,VS-03/04,MarketData,TEST,PIT 시세·기업행사·총수익·DQ,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P0,PLANNED
|
||||||
|
AEG-S2-06,S2,W5-6,VS-03/04,MarketData,OPS,PIT 시세·기업행사·총수익·DQ,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S1-DONE,SOURCE+DESIGN_PROPOSAL,G1-B,P1,PLANNED
|
||||||
|
AEG-S2-07,S2,W5-6,VS-03/04,MarketData,GOLDEN,,기업행사·상폐·총수익 Golden,"Golden fixtures, replay report",삼성전자/하이닉스/JYP/AAMRQ 포함 회귀 통과,Data/Quant,QA,8,AEG-S1-02,SOURCE+DESIGN_PROPOSAL,G1-B,P0,PLANNED
|
||||||
|
AEG-S3-01,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,GOV,OPENDART·비용·원장,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P0,PLANNED
|
||||||
|
AEG-S3-02,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,DATA,OPENDART·비용·원장,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P0,PLANNED
|
||||||
|
AEG-S3-03,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,BE,OPENDART·비용·원장,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P0,PLANNED
|
||||||
|
AEG-S3-04,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,FE,OPENDART·비용·원장,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P1,PLANNED
|
||||||
|
AEG-S3-05,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,TEST,OPENDART·비용·원장,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P0,PLANNED
|
||||||
|
AEG-S3-06,S3,W7-8,VS-05/06/08,Fundamentals/Cost/Ledger,OPS,OPENDART·비용·원장,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S2-DONE,SOURCE+DESIGN_PROPOSAL,G1,P1,PLANNED
|
||||||
|
AEG-S4-01,S4,W9-10,VS-09/10,Evidence/Sell,GOV,EvidenceSnapshot·Sell Policy Chain,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P0,PLANNED
|
||||||
|
AEG-S4-02,S4,W9-10,VS-09/10,Evidence/Sell,DATA,EvidenceSnapshot·Sell Policy Chain,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P0,PLANNED
|
||||||
|
AEG-S4-03,S4,W9-10,VS-09/10,Evidence/Sell,BE,EvidenceSnapshot·Sell Policy Chain,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P0,PLANNED
|
||||||
|
AEG-S4-04,S4,W9-10,VS-09/10,Evidence/Sell,FE,EvidenceSnapshot·Sell Policy Chain,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P1,PLANNED
|
||||||
|
AEG-S4-05,S4,W9-10,VS-09/10,Evidence/Sell,TEST,EvidenceSnapshot·Sell Policy Chain,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P0,PLANNED
|
||||||
|
AEG-S4-06,S4,W9-10,VS-09/10,Evidence/Sell,OPS,EvidenceSnapshot·Sell Policy Chain,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S3-DONE,SOURCE+DESIGN_PROPOSAL,G2-A,P1,PLANNED
|
||||||
|
AEG-S4-07,S4,W9-10,VS-10,SignalEngine,POLICY,,6개 Sell Policy와 단위계약,"Policy IDs, Golden vectors",우선순위·core floor·lot ratio/weight 불변조건 통과,Quant/BE,Risk/QA,10,AEG-S3-02,SOURCE+DESIGN_PROPOSAL,G2-A,P0,PLANNED
|
||||||
|
AEG-S5-01,S5,W11-12,VS-11/19,Reentry/Backtest,GOV,재진입·동결 OOS·Golden,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P0,PLANNED
|
||||||
|
AEG-S5-02,S5,W11-12,VS-11/19,Reentry/Backtest,DATA,재진입·동결 OOS·Golden,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P0,PLANNED
|
||||||
|
AEG-S5-03,S5,W11-12,VS-11/19,Reentry/Backtest,BE,재진입·동결 OOS·Golden,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P0,PLANNED
|
||||||
|
AEG-S5-04,S5,W11-12,VS-11/19,Reentry/Backtest,FE,재진입·동결 OOS·Golden,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P1,PLANNED
|
||||||
|
AEG-S5-05,S5,W11-12,VS-11/19,Reentry/Backtest,TEST,재진입·동결 OOS·Golden,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P0,PLANNED
|
||||||
|
AEG-S5-06,S5,W11-12,VS-11/19,Reentry/Backtest,OPS,재진입·동결 OOS·Golden,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S4-DONE,SOURCE+DESIGN_PROPOSAL,G2,P1,PLANNED
|
||||||
|
AEG-S5-07,S5,W11-12,VS-11,SignalEngine,REENTRY,,ReentryWatch 다단계 상태기계,state transition tests,10세션/20고점/50일선/추가조건/126일 만료 통과,Quant/BE,QA,8,AEG-S4-07,SOURCE+DESIGN_PROPOSAL,G2,P0,PLANNED
|
||||||
|
AEG-S6-01,S6,W13-14,VS-07/08,Client/Portfolio,GOV,고객·IPS·계좌·보유·수익률,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P0,PLANNED
|
||||||
|
AEG-S6-02,S6,W13-14,VS-07/08,Client/Portfolio,DATA,고객·IPS·계좌·보유·수익률,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P0,PLANNED
|
||||||
|
AEG-S6-03,S6,W13-14,VS-07/08,Client/Portfolio,BE,고객·IPS·계좌·보유·수익률,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P0,PLANNED
|
||||||
|
AEG-S6-04,S6,W13-14,VS-07/08,Client/Portfolio,FE,고객·IPS·계좌·보유·수익률,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P1,PLANNED
|
||||||
|
AEG-S6-05,S6,W13-14,VS-07/08,Client/Portfolio,TEST,고객·IPS·계좌·보유·수익률,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P0,PLANNED
|
||||||
|
AEG-S6-06,S6,W13-14,VS-07/08,Client/Portfolio,OPS,고객·IPS·계좌·보유·수익률,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S5-DONE,SOURCE+DESIGN_PROPOSAL,MVP-A,P1,PLANNED
|
||||||
|
AEG-S7-01,S7,W15-16,VS-14/15,Recommendation/Review,GOV,추천 생성·maker-checker,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P0,PLANNED
|
||||||
|
AEG-S7-02,S7,W15-16,VS-14/15,Recommendation/Review,DATA,추천 생성·maker-checker,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P0,PLANNED
|
||||||
|
AEG-S7-03,S7,W15-16,VS-14/15,Recommendation/Review,BE,추천 생성·maker-checker,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P0,PLANNED
|
||||||
|
AEG-S7-04,S7,W15-16,VS-14/15,Recommendation/Review,FE,추천 생성·maker-checker,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P1,PLANNED
|
||||||
|
AEG-S7-05,S7,W15-16,VS-14/15,Recommendation/Review,TEST,추천 생성·maker-checker,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P0,PLANNED
|
||||||
|
AEG-S7-06,S7,W15-16,VS-14/15,Recommendation/Review,OPS,추천 생성·maker-checker,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S6-DONE,SOURCE+DESIGN_PROPOSAL,MVP-B,P1,PLANNED
|
||||||
|
AEG-S8-01,S8,W17-18,VS-16/17/18,Publish/Outcome,GOV,고객공개·행동·사후평가·감사,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P0,PLANNED
|
||||||
|
AEG-S8-02,S8,W17-18,VS-16/17/18,Publish/Outcome,DATA,고객공개·행동·사후평가·감사,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P0,PLANNED
|
||||||
|
AEG-S8-03,S8,W17-18,VS-16/17/18,Publish/Outcome,BE,고객공개·행동·사후평가·감사,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P0,PLANNED
|
||||||
|
AEG-S8-04,S8,W17-18,VS-16/17/18,Publish/Outcome,FE,고객공개·행동·사후평가·감사,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P1,PLANNED
|
||||||
|
AEG-S8-05,S8,W17-18,VS-16/17/18,Publish/Outcome,TEST,고객공개·행동·사후평가·감사,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P0,PLANNED
|
||||||
|
AEG-S8-06,S8,W17-18,VS-16/17/18,Publish/Outcome,OPS,고객공개·행동·사후평가·감사,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S7-DONE,SOURCE+DESIGN_PROPOSAL,G3,P1,PLANNED
|
||||||
|
AEG-S8-07,S8,W17-18,VS-16/18,Advisory/Evaluation,AUDIT,,Evidence→Decision→Review→Publish→Outcome 추적,audit trace endpoint/test,publicationId 기준 100% E2E trace,BE/QA,Compliance/Audit,8,AEG-S7-03,SOURCE+DESIGN_PROPOSAL,G3,P0,PLANNED
|
||||||
|
AEG-S9-01,S9,W19-20,VS-13/21,Risk/Rebalance,GOV,ES·집중·상관·리밸런싱,요구사항·정책·Decision Log 확정,"docs/SLICE_SPEC, TRACEABILITY, ADR",승인자·비목표·실패상태·Source 상태가 명시됨,PM/Architect,Compliance/Quant,3,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P0,PLANNED
|
||||||
|
AEG-S9-02,S9,W19-20,VS-13/21,Risk/Rebalance,DATA,ES·집중·상관·리밸런싱,데이터 계약·PIT·DQ·lineage 구현,"DB migration, source contract, DQ rules",published_at/revision/hash/watermark와 quarantine 경로 통과,Data/DBA,Quant/QA,6,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P0,PLANNED
|
||||||
|
AEG-S9-03,S9,W19-20,VS-13/21,Risk/Rebalance,BE,ES·집중·상관·리밸런싱,Vertical Slice Backend 구현,"Endpoint, Validator, Application, Policy, Dapper SQL, Outbox",멱등·트랜잭션·불변조건·ProblemDetails·trace 통과,BE Lead,Architect/QA,8,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P0,PLANNED
|
||||||
|
AEG-S9-04,S9,W19-20,VS-13/21,Risk/Rebalance,FE,ES·집중·상관·리밸런싱,화면·컴포넌트·상태 계약 구현,"Vue route, Zod, Query, components",loading/empty/warn/error/401/403/409/expired와 접근성 통과,FE Lead,UX/QA,6,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P1,PLANNED
|
||||||
|
AEG-S9-05,S9,W19-20,VS-13/21,Risk/Rebalance,TEST,ES·집중·상관·리밸런싱,자동화 테스트와 Golden/Regression,"xUnit, Vitest, Playwright, Data/Architecture tests","Given/When/Then, boundary, replay, failure path 자동화",QA Lead,Quant/BE/FE,6,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P0,PLANNED
|
||||||
|
AEG-S9-06,S9,W19-20,VS-13/21,Risk/Rebalance,OPS,ES·집중·상관·리밸런싱,관제·Job·Runbook·Rollback,"OTel metric/alert, Hangfire job, runbook","Owner/Secondary, SLA, retry/reprocess, rollback rehearsal",SRE/Ops,Security/PM,4,S8-DONE,SOURCE+DESIGN_PROPOSAL,Portfolio-A,P1,PLANNED
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
ID,Category,Priority,Debt,Impact,Repayment_Action,Owner,Trigger/Gate,Status
|
||||||
|
TD-001,Safety,P0,FE lockfile 없음,재현 불가능,G0 전 pnpm-lock 생성·review·commit,DevOps,G0,OPEN
|
||||||
|
TD-002,Safety,P0,.NET build 미검증,컴파일 결함 가능,승인 환경에서 restore/build/test,BE Lead,G0,OPEN
|
||||||
|
TD-003,Integrity,P0,PostgreSQL migration rehearsal 미실행,fresh/upgrade 실패 가능,fresh/upgrade/re-run/failure 복구,DBA,G0,OPEN
|
||||||
|
TD-004,Integrity,P0,원시 연구 데이터 미포함/권리 미확정,clean-room 재현 불가,Source catalog·license·checksum 확보,Data Owner,G1,OPEN
|
||||||
|
TD-005,Integrity,P0,KR 검증 종료 2021-04-16,최근 국면 검증 공백,PIT 데이터 보충 후 frozen OOS,Quant/Data,G4,OPEN
|
||||||
|
TD-006,Safety,P0,실제 Auth provider 미결정,생산 접근통제 불가,OIDC/JWT ADR와 E2E,Security,G5,OPEN
|
||||||
|
TD-007,Integrity,P0,총수익·상폐수익 공급원 미확정,생존편향/성과왜곡,상용/공식 source 계약,Data Owner,G1,OPEN
|
||||||
|
TD-008,Integrity,P0,Fee/Tax/FX PIT 표 미확정,비용후 효용 오류,valid_from/to schedule 승인,Quant/Compliance,G1,OPEN
|
||||||
|
TD-009,Delivery,P1,Outbox publisher/Inbox consumer 미완성,비동기 side effect 누락/중복,lease/dead-letter/replay 구현,BE/SRE,G3,OPEN
|
||||||
|
TD-010,Delivery,P1,Hangfire JobRun 표준 미완성,재처리·감사 취약,JobRunId/Scope/Watermark/hash 공통화,BE/SRE,G1,OPEN
|
||||||
|
TD-011,Integrity,P1,Architecture test가 일부 문자열 기반,의존 위반 누락,csproj/namespace/schema 검사 확대,Architect,G0,IN_PROGRESS
|
||||||
|
TD-012,Delivery,P1,OpenAPI DTO generation 미도입,BE/FE 계약 drift,OpenAPI artifact와 CI diff,BE/FE,G3,OPEN
|
||||||
|
TD-013,Safety,P1,PII masking test 미완성,로그/Telegram 노출,redaction policy+security tests,Security/SRE,G5,OPEN
|
||||||
|
TD-014,Integrity,P1,Model promotion workflow 미구현,무단 모델 활성화,maker-checker/model card/rollback,Governance,G4,OPEN
|
||||||
|
TD-015,Integrity,P1,Read Model rebuild 도구 미구현,stale projection 복구 불가,projection version/watermark/rebuild command,BE/Data,G3,OPEN
|
||||||
|
TD-016,Delivery,P1,SLO/RPO/RTO 미확정,운영 준비도 판단 불가,용량시험·DR ADR,SRE/Ops,G5,OPEN
|
||||||
|
TD-017,Convenience,P2,공통 DataGridShell 미구현,화면 중복,3회 이상 반복 확인 후 승격,FE Lead,S10,OPEN
|
||||||
|
TD-018,Integrity,P1,PBO/DSR 전체 탐색 미완료,과최적화 위험,모든 시도 원장+CSCV/DSR,Quant,G4,OPEN
|
||||||
|
TD-019,Integrity,P1,Reentry asset confirmation provider 미구현,재진입 품질 저하,자산유형 contract와 PIT source,Quant/Data,G2,OPEN
|
||||||
|
TD-020,Safety,P0,자동주문 기능은 금지 상태,오활성화 위험,Options ValidateOnStart+CI config scan 유지,Security/Compliance,ALL,MITIGATED
|
||||||
|
@@ -0,0 +1,19 @@
|
|||||||
|
Requirement_ID,Requirement,Evidence_Status,Policy_or_Contract,Code,DB_or_Artifact,Test_ID,Gate
|
||||||
|
REQ-001,투자자문형 우선·자동주문 OFF,SOURCE,CAP-ORDER-OFF,Capabilities options,Host startup validation,TC-CAP-001,G0
|
||||||
|
REQ-002,Hard impairment 최우선,SOURCE,ALG-SELL-001,HardImpairmentPolicy,signal_decision,TC-SELL-001,G2
|
||||||
|
REQ-003,Portfolio survival 2순위,SOURCE,ALG-SELL-PORT-001,PortfolioSurvivalPolicy,signal_decision,TC-SELL-002,G2
|
||||||
|
REQ-004,Gap 1.5 ATR 부분매도,SOURCE,ALG-SELL-002,GapFloorBreachPolicy,signal_decision,TC-SELL-003,G2
|
||||||
|
REQ-005,2종가 보호선 이탈,SOURCE,ALG-SELL-003,TwoCloseFloorBreachPolicy,signal_decision,TC-SELL-004,G2
|
||||||
|
REQ-006,집중/유동성 축소,SOURCE,ALG-SELL-004,ConcentrationLiquidityPolicy,signal_decision,TC-SELL-005,G2
|
||||||
|
REQ-007,기회비용 신뢰하단>0,SOURCE,ALG-SELL-005,OpportunityCostPolicy,signal_decision,TC-SELL-006,G2
|
||||||
|
REQ-008,Lot 비율과 포트폴리오 비중 분리,DESIGN_PROPOSAL,DATA-UNIT-001,SellDecisionInput/Decision,0012 migration,TC-UNIT-001,G2
|
||||||
|
REQ-009,PIT published_at,SOURCE,DQ-01,ContextReader,sell_decision_context,TC-PIT-001,G1
|
||||||
|
REQ-010,Evidence Version Set,SOURCE,EVID-001,SellDecisionService,signal_decision,TC-EVID-001,G2
|
||||||
|
REQ-011,Idempotency+Outbox,SOURCE,REL-001,SellDecisionService,outbox_message,TC-OUT-001,G2
|
||||||
|
REQ-012,Reentry 최소 10세션,SOURCE,ALG-REENTRY-001,ReentryStateMachine,reentry_watch/stage,TC-RE-001,G2
|
||||||
|
REQ-013,Research/production endpoint 분리,DESIGN_PROPOSAL,API-BOUNDARY-001,EvaluateResearch/GenerateSell,N/A,TC-API-001,G0
|
||||||
|
REQ-014,Fail-closed 인증,SOURCE,SEC-001,Host Security,N/A,TC-AUTH-001,G0
|
||||||
|
REQ-015,FE runtime contract,DESIGN_PROPOSAL,FE-CONTRACT-001,Zod schema/api,N/A,TC-FE-001,G3
|
||||||
|
REQ-016,Immutable Decision/Audit,SOURCE,AUD-001,DB trigger,0011/0012,TC-AUD-001,G2
|
||||||
|
REQ-017,252일 Shadow 복수국면,SOURCE,GATE-SHADOW-001,Evaluation module,outcome/scorecard,TC-SHD-001,G4
|
||||||
|
REQ-018,PBO/DSR/비용2배,SOURCE,GATE-MODEL-001,Backtesting,backtest artifact,TC-BKT-001,G4
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
Decision_ID,Decision_Required,Status,Owner,Due_Gate,Blocked_Action
|
||||||
|
DEC-001,상용 총수익·상폐·컨센서스 공급계약,OPEN,Data Owner/Compliance,G1,생산 성과 주장 금지
|
||||||
|
DEC-002,OIDC/JWT 인증 공급자와 role mapping,OPEN,Security/Architect,G5,외부 Pilot 금지
|
||||||
|
DEC-003,Fee/Tax/FX valid-time schedule,OPEN,Quant/Compliance,G1,현재 단일 비용값 금지
|
||||||
|
DEC-004,고객군별 IPS·적합성 문구,OPEN,Product/Compliance,G3,고객 공개 금지
|
||||||
|
DEC-005,SLO/RPO/RTO/DR topology,OPEN,SRE/Ops,G5,Go-Live 금지
|
||||||
|
DEC-006,KIS 시장·계좌·부분체결 Capability,OPEN,Execution/Compliance,Pilot-A,KIS submit 금지
|
||||||
|
DEC-007,pnpm lockfile 최종 dependency set,OPEN,FE/DevOps,G0,frozen CI 금지
|
||||||
|
@@ -0,0 +1,12 @@
|
|||||||
|
# 20영업일 재착수 계획
|
||||||
|
|
||||||
|
| 기간 | 작업 | 완료 증거 |
|
||||||
|
|---|---|---|
|
||||||
|
| D1~D3 | 첨부 기준선 승인, Coverage Matrix, Decision Log, 자동주문 OFF | Steering sign-off |
|
||||||
|
| D4~D6 | SDK/pnpm/lockfile, secret/env, Gitea CI, static validation | CI bootstrap green |
|
||||||
|
| D7~D10 | DbUp fresh/upgrade/re-run, Outbox/Inbox, Auth fail-closed, Architecture tests | G0 통과 |
|
||||||
|
| D11~D14 | SecurityMaster/MarketData/PIT/CorporateAction/DQ Critical Path | replay hash 동일, lookahead 0 |
|
||||||
|
| D15~D17 | Evidence/Decision/Policy/Reentry Golden과 DB invariant | G2-A 통과 |
|
||||||
|
| D18~D20 | 연구 콘솔과 생산형 Decision Slice contract/E2E, OTel trace | 첫 Vertical Slice Done |
|
||||||
|
|
||||||
|
20일 안에 전체 제품을 만들지 않는다. 첫 Slice를 완전하게 통과시켜 이후 반복 가능한 패턴을 만드는 것이 목표다.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# 기본 템플릿 사용법
|
||||||
|
|
||||||
|
## 1. 사전 준비
|
||||||
|
|
||||||
|
- .NET SDK 10.0.100 이상.
|
||||||
|
- Node.js 22.
|
||||||
|
- pnpm 10.
|
||||||
|
- PostgreSQL 17.
|
||||||
|
|
||||||
|
현재 패키지에는 registry 접근이 불가능한 환경에서 생성되었으므로 `pnpm-lock.yaml`이 없다. 네트워크가 가능한 승인 환경에서 한 번 생성하고 dependency review 후 커밋한다.
|
||||||
|
|
||||||
|
## 2. 실행 순서
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp frontend/.env.example frontend/.env.local
|
||||||
|
docker compose up -d postgres
|
||||||
|
|
||||||
|
dotnet restore KArtSell.sln
|
||||||
|
dotnet run --project src/KArtSell.DbMigrator
|
||||||
|
dotnet test KArtSell.sln
|
||||||
|
dotnet run --project src/KArtSell.Host
|
||||||
|
|
||||||
|
cd frontend
|
||||||
|
pnpm install
|
||||||
|
pnpm typecheck
|
||||||
|
pnpm test
|
||||||
|
pnpm build
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Development 연구 Endpoint 호출 시 `X-KArtSell-User`, `X-KArtSell-Role=Quant`가 필요하다. Frontend는 `.env.local` 값이 있을 때 개발 환경에서만 해당 Header를 추가한다.
|
||||||
|
|
||||||
|
## 3. 생산 전 필수 교체
|
||||||
|
|
||||||
|
- DevelopmentHeader 인증을 승인된 OIDC/JWT 공급자로 교체.
|
||||||
|
- Connection string과 secret를 vault/secret store로 이동.
|
||||||
|
- OTLP endpoint, Telegram alert, SLO/Runbook 설정.
|
||||||
|
- Source adapter 계약과 라이선스 승인.
|
||||||
|
- pnpm lockfile과 Software Bill of Materials.
|
||||||
|
|
||||||
|
## 4. 금지
|
||||||
|
|
||||||
|
- `Capabilities:AutomaticOrder=true`.
|
||||||
|
- `Capabilities:KisOrderAdapter=true`.
|
||||||
|
- 실계좌/실주문 credential 저장.
|
||||||
|
- Research Endpoint를 고객 화면에서 호출.
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
Version/Source,Role,Coverage,Evidence,Status
|
||||||
|
v10.0,Baseline,"47개 장, 26 Slice, 16 Sprint, Gate",원본 DOCX 포함,RETAINED
|
||||||
|
12.2 Research,Research Evidence,정량결과·코드·CSV·구성안,원본 ZIP/압축해제 포함,RETAINED
|
||||||
|
v11,Implementation Skeleton,.NET/Vue 최초 템플릿,원본 ZIP/압축해제 포함,RETAINED
|
||||||
|
v11.1,Hardening Delta,보안·불변·WBS·기술부채,원본 ZIP/압축해제 포함,RETAINED
|
||||||
|
v12.0,Integrated Delta,정책단위·서버 Evidence·FailClosed·WBS,본 패키지,IMPROVED
|
||||||
|
@@ -0,0 +1,43 @@
|
|||||||
|
# K-ArtSell Aegis v12.1 실행준비 고도화 제안
|
||||||
|
|
||||||
|
상태: `IMPLEMENTATION_TEMPLATE / STATIC_VALIDATED / BUILD_AND_DB_REHEARSAL_REQUIRED`
|
||||||
|
운영 경계: **투자자문형 우선 · RESEARCH_CANDIDATE_NOT_PRODUCTION · 자동주문/KIS 제출 OFF**
|
||||||
|
|
||||||
|
## 1. 경영진 결론
|
||||||
|
|
||||||
|
v12.1은 기존 문서를 다시 쓰는 요약본이 아니다. v10.0의 `Baseline Preservation + Delta + Supersession + Traceability`를 유지하고, K-ArtSell 12.2 연구근거, v11 구현 골격, v11.1 하드닝, v12.0 통합 패키지 위에 **실행준비도 Delta**를 추가한다.
|
||||||
|
|
||||||
|
핵심은 기능 수가 아니라 다음 Critical Path의 완결성이다.
|
||||||
|
|
||||||
|
`Source/License → PIT/Revision/DQ → Evidence/Version Set → Sell/Reentry Policy → Recommendation → Maker-Checker → Publish → Outcome → Reconciliation/DR`
|
||||||
|
|
||||||
|
대시보드나 상품탐색을 앞당겨도 이 경로가 끊기면 생산준비도는 올라가지 않는다.
|
||||||
|
|
||||||
|
## 2. v12.1에서 보강한 것
|
||||||
|
|
||||||
|
- 현재 세션 첨부파일 **8개를 원본 그대로 보존**하고 SHA-256·중복그룹을 기록했다.
|
||||||
|
- 26개 Vertical Slice를 Requirement/API/DB/Job/UI/Test/Gate에 연결했다.
|
||||||
|
- 상세 WBS를 **202개 실행 작업**으로 재구성했다. 각 행은 산출물·수용증거·Owner·의존성·Gate·PD를 가진다.
|
||||||
|
- Generic Repository/God Service/조기 microservice/현재값 overwrite/무승인 자동 추상화를 금지한다.
|
||||||
|
- Outbox/Inbox, JobRun, Projection checkpoint, PIT/DQ, immutable audit의 기본 템플릿을 보강한다.
|
||||||
|
- FE는 TanStack Query=서버상태, Pinia=세션/권한/UI 선호, vee-validate+Zod=폼, vue-router=공유상태로 책임을 고정한다.
|
||||||
|
- 바이브코딩은 `SOURCE / ASSUMPTION / UNKNOWN / DECISION_REQUIRED`를 강제하고 실행하지 않은 검증은 통과로 기록하지 않는다.
|
||||||
|
|
||||||
|
## 3. 즉시 Go/No-Go
|
||||||
|
|
||||||
|
현재는 **코딩 착수용 템플릿은 Go, 생산/Shadow 승격은 No-Go**다.
|
||||||
|
|
||||||
|
Go 전 필수:
|
||||||
|
1. 승인 runner의 `.NET 10 restore/build/test`.
|
||||||
|
2. `pnpm-lock.yaml` 생성·검토 후 frozen install/typecheck/test/build.
|
||||||
|
3. PostgreSQL fresh/upgrade/re-run/failure migration rehearsal.
|
||||||
|
4. OIDC/JWT, 데이터 라이선스, Fee/Tax/FX, SLO/RPO/RTO 결정.
|
||||||
|
5. 252거래일·복수 국면 Shadow와 PBO/DSR/비용 2배 검증.
|
||||||
|
|
||||||
|
## 4. 과유불급 원칙
|
||||||
|
|
||||||
|
- 초기 배포는 Modular Monolith다. 실제 독립 배포·확장·장애 격리 요구가 증명되기 전 microservice로 분리하지 않는다.
|
||||||
|
- 동일 업무 의미와 변경축이 3회 이상 반복될 때만 공통 컴포넌트로 승격한다.
|
||||||
|
- 한 번 쓰는 Interface/Wrapper/Factory는 만들지 않는다.
|
||||||
|
- 정책 변경과 동작보존 리팩터링은 별도 PR로 분리한다.
|
||||||
|
- 정규화 Write Model과 역정규화 Read Model을 분리하며, Read Model에는 Owner/Version/Watermark/Rebuild/Staleness가 필수다.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Attachment,Bytes,SHA256,Duplicate_Group,Role,Treatment,Evidence_Status
|
||||||
|
K-ArtSell_12_2_complete_package(1).zip,2513047,1e9df605a91f227fb5ff4ea057e55f4319e62060fbaf8e64551756ee2931c5ea,-,연구 코드·CSV·정량 감사·구성안,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
K-ArtSell_Aegis_v12_통합고도화_실행제안서(1).docx,54732,62845eaf5382ed78e6b6065f3e95c4af9cd87f71bc418bf0077b68e727fce832,K-ArtSell_Aegis_v12_통합고도화_실행제안서(1).docx | K-ArtSell_Aegis_v12_통합고도화_실행제안서.docx,v12.0 실행제안서,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
K-ArtSell_Aegis_v12_통합고도화_실행제안서.docx,54732,62845eaf5382ed78e6b6065f3e95c4af9cd87f71bc418bf0077b68e727fce832,K-ArtSell_Aegis_v12_통합고도화_실행제안서(1).docx | K-ArtSell_Aegis_v12_통합고도화_실행제안서.docx,v12.0 실행제안서,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
K-ArtSell_퀀트투자자문_SI_본프로그램착수_누적고도화_통합실행기준서_v10.0(1).docx,402134,d86795186ec5f578741d64618eb53278a1c3a55795e73307e5bee245980a83a6,-,최상위 누적 실행기준서,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
KArtSell_Aegis_v11_1_hardening(1).zip,89397,01b3d3025dfb3a6cafcff4d751851240a6087c2329e5c1472ec31703f209ccbd,-,보안·불변성·기술부채 Delta,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
KArtSell_Aegis_v12_0_integrated_complete(1).zip,8493363,8ccc4403cdd0fcb2ddf7bdcdcd18719dbc22497fcecdaa0082a1c98b4cd82c04,KArtSell_Aegis_v12_0_integrated_complete(1).zip | KArtSell_Aegis_v12_0_integrated_complete.zip,v12.0 통합 구현 패키지,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
KArtSell_Aegis_v12_0_integrated_complete.zip,8493363,8ccc4403cdd0fcb2ddf7bdcdcd18719dbc22497fcecdaa0082a1c98b4cd82c04,KArtSell_Aegis_v12_0_integrated_complete(1).zip | KArtSell_Aegis_v12_0_integrated_complete.zip,v12.0 통합 구현 패키지,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
KArtSell_v11_implementation_acceleration(1).zip,56738,2bd5713b98104bf7ac45362105d9b3175d5ca818c06753e572aaf79a936658a2,-,최초 .NET/Vue 구현 골격,원본 무변경 보존; v12.1은 Delta만 추가,SOURCE
|
||||||
|
@@ -0,0 +1,39 @@
|
|||||||
|
# 전략 아키텍처·SOLID·리팩터링 기준
|
||||||
|
|
||||||
|
## 아키텍처 경계
|
||||||
|
|
||||||
|
- Host: composition root, 인증/관제/Endpoint 조립만 담당한다.
|
||||||
|
- Module: Vertical Slice와 모듈 내부 정책·저장소를 소유한다.
|
||||||
|
- Domain: FastEndpoints, Dapper, Npgsql, Hangfire, HTTP를 참조하지 않는다.
|
||||||
|
- Application: use case, idempotency, transaction, context loading, orchestration을 담당한다.
|
||||||
|
- Infrastructure: SQL, 외부 Adapter, Outbox/Inbox, Projection 구현을 담당한다.
|
||||||
|
- Contracts: 모듈 간 최소 integration event만 공유한다. 타 모듈 테이블 직접 조회를 금지한다.
|
||||||
|
|
||||||
|
## SOLID의 현장 적용
|
||||||
|
|
||||||
|
| 원칙 | 적용 | 금지 |
|
||||||
|
|---|---|---|
|
||||||
|
| SRP | Endpoint=HTTP, Handler=유스케이스, Policy=결정, Adapter=I/O | God Service, Hangfire Job 내 정책 |
|
||||||
|
| OCP | 승인된 Policy/DQ/Adapter registry | reflection plugin framework |
|
||||||
|
| LSP | Adapter contract test로 시간·단위·오류 의미 보장 | mock 성공만으로 교체 가능 판정 |
|
||||||
|
| ISP | IClock, ContextReader, OutboxWriter 등 좁은 Port | 범용 Repository/Manager |
|
||||||
|
| DIP | Domain은 외부 기술을 모름 | Npgsql/HTTP 타입의 Domain 침투 |
|
||||||
|
|
||||||
|
## 리팩터링 순서
|
||||||
|
|
||||||
|
1. Characterization/Golden test로 현재 동작을 고정한다.
|
||||||
|
2. 정책 변경과 구조 변경을 분리한다.
|
||||||
|
3. 이름·단위·시간 의미를 먼저 교정한다.
|
||||||
|
4. 중복은 문장이 아니라 **업무 의미와 변경축**이 같을 때만 통합한다.
|
||||||
|
5. PR마다 성능·데이터·감사·운영 영향과 rollback을 기록한다.
|
||||||
|
6. 기술부채는 Owner, Interest, Trigger, Gate, Exit Test를 가진다.
|
||||||
|
|
||||||
|
## Fitness Functions
|
||||||
|
|
||||||
|
- 모듈→모듈 직접 project reference allowlist.
|
||||||
|
- Domain의 Infrastructure namespace/package 참조 0.
|
||||||
|
- 모듈 소유 schema 외 SQL 접근 0.
|
||||||
|
- Endpoint마다 인증/권한 선언 100%.
|
||||||
|
- API/DDL/Event/Job/UI/Test ID 중복 0.
|
||||||
|
- 문서/DDL/OpenAPI/Test contract CI diff.
|
||||||
|
- `AutomaticOrder=false`, `KisOrderAdapter=false` config scan.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# 알고리즘 거버넌스와 구현 계약
|
||||||
|
|
||||||
|
## 고정 우선순위
|
||||||
|
|
||||||
|
`HARD_IMPAIRMENT → PORTFOLIO_SURVIVAL → DYNAMIC_PROFIT_FLOOR → CONCENTRATION/LIQUIDITY → OPPORTUNITY_COST → REENTRY_OPTION`
|
||||||
|
|
||||||
|
상위 사유는 하위 점수로 상쇄하지 않는다. 회계부정·지급불능·상장폐지·구조적 ETF 훼손은 기대수익 비교가 아니라 승인된 증거등급의 Hard Exit로 처리한다.
|
||||||
|
|
||||||
|
## 단위 계약
|
||||||
|
|
||||||
|
- `SellRatioOfLot`: 현재 Lot 수량 중 매도 비율, 0..1.
|
||||||
|
- `CurrentPortfolioWeight`: 현재 포트폴리오 절대비중, 0..1.
|
||||||
|
- `StrategicCoreFloorWeight`: 비가치훼손 Soft Sell에서 보존할 절대비중.
|
||||||
|
- `TargetPortfolioWeightAfter`: 결정 후 예상 절대비중.
|
||||||
|
- `OpportunityEdgeLowerBound`: 비용·세금·FX·재진입 옵션손실을 반영한 교체우위 신뢰하단.
|
||||||
|
|
||||||
|
## 정책
|
||||||
|
|
||||||
|
| ID | 조건 | 행동 | 재진입 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| ALG-SELL-001 | 승인된 영구가치훼손 | 80~100% 또는 전량; 운영승인 | 금지 |
|
||||||
|
| ALG-SELL-PORT-001 | 자본바닥/생존 위반 | 위험예산까지 축소 | 별도 승인 |
|
||||||
|
| ALG-SELL-002 | 보호선 1.5 ATR 이상 Gap | Lot 30~50% 부분매도 | 가능 |
|
||||||
|
| ALG-SELL-003 | 2개 종가 연속 이탈 | Lot 15~25% 부분매도 | 가능 |
|
||||||
|
| ALG-SELL-004 | 단일/섹터/클러스터/ADV 한도 초과 | 초과분+버퍼 축소 | 가능 |
|
||||||
|
| ALG-SELL-005 | 비용후 교체우위 4~5%p, 하단>0 | Lot 10~25% 단계교체 | 가능 |
|
||||||
|
|
||||||
|
정책 비율의 단일값 고정은 설계제안이며 모델카드·Golden·OOS 승인 전 생산값이 아니다. v12.2가 제시한 범위와 자산유형별 정책을 보존한다.
|
||||||
|
|
||||||
|
## 재진입
|
||||||
|
|
||||||
|
비가치훼손 매도는 `ReentryWatch`를 생성한다. 최소 10거래일 대기, 상승 SMA50, 직전 20거래일 고점 돌파, 자산유형 확인팩터, 단계 간 10거래일, 126거래일 만료를 적용한다. 각 단계는 unique key를 가지며 새 Lot과 새 CycleId를 만든다.
|
||||||
|
|
||||||
|
## 평가
|
||||||
|
|
||||||
|
적중률 단독 최적화를 금지한다. 1/5/20/63/126/252일 창에서 calibration, 비용후 기대효용, ES/MDD 감소, 영구손실 회피, false-exit 비용, reentry capture, 운영무결성을 분리해 측정한다. 투자일임형 검토는 최소 252거래일·복수 국면 Shadow, PBO≤20%, DSR≥95%, 비용 2배 기대효용 양수, 독립검증·준법·보안·DR 승인을 모두 요구한다.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# 데이터 정합성·정규화·역정규화 실행계약
|
||||||
|
|
||||||
|
## L0~L7
|
||||||
|
|
||||||
|
| Layer | 내용 | 불변조건 |
|
||||||
|
|---|---|---|
|
||||||
|
| L0 | Source catalog/license/SLA/schema/timezone/unit | 승인 없는 소스 사용 금지 |
|
||||||
|
| L1 | Raw payload/hash/event/published/ingested | overwrite 금지 |
|
||||||
|
| L2 | Canonical PIT price/CA/fundamental/consensus/cost | revision+valid time |
|
||||||
|
| L3 | DQ/quarantine/lineage/dataset manifest | QUARANTINED 추천 금지 |
|
||||||
|
| L4 | Feature/Forecast/Risk/Evidence | data/model/config/code SHA |
|
||||||
|
| L5 | Ledger/Decision/Review/Publish/Fill/Outcome | append/reversal/correction event |
|
||||||
|
| L6 | UI/report Read Model | Owner/version/watermark/rebuild/staleness |
|
||||||
|
| L7 | Backtest/ModelCard/Release artifact | artifact hash |
|
||||||
|
|
||||||
|
## 정규화
|
||||||
|
|
||||||
|
원장·현금·Lot·주문·체결은 3NF와 append/reversal을 기본으로 한다. 현재상태와 이력, 추천과 공개, 모델버전과 승격 이벤트, 수수료 설정과 유효기간을 분리한다. `current=true` 하나로 과거값을 잃지 않는다.
|
||||||
|
|
||||||
|
## 역정규화
|
||||||
|
|
||||||
|
Read Model에만 허용한다. 화면 성능을 이유로 Source Table을 임의 join하거나 현재값을 복사하지 않는다. Projection은 `ProjectionName, Version, SourceWatermark, LastEventId, BuiltAt, ContentHash`를 보존하고 재구축·diff가 가능해야 한다.
|
||||||
|
|
||||||
|
## PIT 최소 필드
|
||||||
|
|
||||||
|
`source_event_time, published_at, ingested_at, effective_from/to, revision_no, source_id, content_hash, quality_status, tradable_session, dataset_id`.
|
||||||
|
|
||||||
|
## DQ Release Blocker
|
||||||
|
|
||||||
|
- same-session lookahead 0.
|
||||||
|
- 기업행사 가격·수량·원가·배당 공식대사.
|
||||||
|
- 가격수익/총수익 구분.
|
||||||
|
- 당시 유니버스와 상폐수익 포함.
|
||||||
|
- OHLC/단위/통화/비정상 gap 격리.
|
||||||
|
- key 중복·거래일 결측·watermark 연속성.
|
||||||
|
- Fee/Tax/FX valid-time.
|
||||||
|
- 동일 dataset/code/config hash 결과 재현.
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# BE·FE·Hangfire·컴포넌트 표준
|
||||||
|
|
||||||
|
## Backend Slice
|
||||||
|
|
||||||
|
`Endpoint → Request/Validator → Application UseCase → Domain Policy → Dapper SQL → Outbox → Tests`
|
||||||
|
|
||||||
|
생산형 Command는 클라이언트가 Evidence/Model/Config를 임의 제공하지 못하게 한다. 서버가 승인된 PIT Read Model과 Version Set을 조회한다. Decision과 Outbox는 동일 트랜잭션이며, idempotency key 충돌 시 원결과를 반환하거나 409를 명시한다.
|
||||||
|
|
||||||
|
## Outbox/Inbox
|
||||||
|
|
||||||
|
- Outbox: 미발행 lease, attempt, next_attempt_at, dead-letter, payload hash.
|
||||||
|
- Inbox: consumer+message unique, processing lease, result hash.
|
||||||
|
- Exactly-once를 주장하지 않고 at-least-once + idempotent side effect를 구현한다.
|
||||||
|
- replay는 승인·범위·watermark·dry-run·영향분석이 있어야 한다.
|
||||||
|
|
||||||
|
## Hangfire
|
||||||
|
|
||||||
|
모든 Job은 `JobRunId, JobType/Version, ScopeKey, IdempotencyKey, Watermark, Dataset/Model/Config/Code SHA, Input/Output Hash, Attempt, TraceId`를 가진다. transient retry, business hold, DQ quarantine, poison event를 분리한다.
|
||||||
|
|
||||||
|
## Frontend
|
||||||
|
|
||||||
|
- TanStack Query: 서버 상태와 캐시.
|
||||||
|
- Pinia: 세션·역할·UI preference. 서버 데이터를 복제하지 않는다.
|
||||||
|
- vee-validate+Zod: 폼·요청/응답 runtime validation.
|
||||||
|
- vue-router: 공유·복구 가능한 URL 상태.
|
||||||
|
- AG Grid: 대량 목록의 server-side pagination/filter/sort.
|
||||||
|
|
||||||
|
공통 컴포넌트는 `QueryStateBoundary`, `PermissionGuard`, `DataFreshnessBadge`, `EvidenceVersionSet`, `VersionConflictDialog`, `DataGridShell` 후보로 한정한다. 동일 업무 의미와 변경축이 반복될 때만 승격한다.
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
Slice_ID,Slice,Module,Sprint,Weeks,Gate,Requirement_ID,Endpoint_ID,DB_ID,Job_ID,UI_ID,Test_ID,User_Result,Dependency,Status
|
||||||
|
VS-00,PlatformBootstrap,Host/BuildingBlocks,S0,W1-2,G0,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,빌드·마이그레이션·관제 가능한 단일 배포 골격,-,PLANNED
|
||||||
|
VS-01,ManageIdentityAndRoles,IdentityAccess,S1,W3-4,G1-A,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,MFA·RBAC·업무분장과 승인 경계,VS-00,PLANNED
|
||||||
|
VS-02,SynchronizeSecurityMaster,SecurityMaster,S1,W3-4,G1-A,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,상장·상폐·상품구조·거래가능성의 PIT 기준,VS-00,PLANNED
|
||||||
|
VS-03,IngestMarketDataPIT,MarketData,S2,W5-6,G1-B,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,원시·조정 OHLCV·FX·금리의 revision 적재,VS-02,PLANNED
|
||||||
|
VS-04,ApplyCorporateActions,SecurityMaster,S2,W5-6,G1-B,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,분할·배당·증자·합병·상폐의 가격·수량·원가 일관성,"VS-02,VS-03",PLANNED
|
||||||
|
VS-05,IngestFundamentalsPIT,FundamentalsPIT,S3,W7-8,G1,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,공시·재무·컨센서스 공개시각과 정정 이력,VS-02,PLANNED
|
||||||
|
VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,S3,W7-8,G1,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,계좌·시장·상품별 Fee/Tax/FX valid-time 계약,VS-02,PLANNED
|
||||||
|
VS-07,ManageClientIPS,ClientAdvisory,S6,W13-14,MVP-A,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,고객 목표·위험성향·제한상품의 버전 관리,VS-01,PLANNED
|
||||||
|
VS-08,MaintainPortfolioLedger,PortfolioRisk,S3,W7-8,G1,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,현금·체결·Lot·Cycle 불변 원장과 대사 기준,"VS-02,VS-06",PLANNED
|
||||||
|
VS-09,BuildEvidenceSnapshot,ResearchFactors,S4,W9-10,G2-A,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,Dataset/Model/Config/Code SHA가 동결된 Evidence,"VS-03,VS-04,VS-05,VS-06",PLANNED
|
||||||
|
VS-10,GenerateSellDecision,SignalEngine,S4,W9-10,G2-A,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,우선순위가 보존된 HOLD/부분매도/전량매도 결정,"VS-08,VS-09,VS-13",PLANNED
|
||||||
|
VS-11,ManageReentryWatch,SignalEngine,S5,W11-12,G2,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,비가치훼손 매도의 재진입 계약·단계·만료,VS-10,PLANNED
|
||||||
|
VS-12,RankBuyCandidates,ValuationForecast,S10,W21-22,Portfolio Gate,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,PIT 품질·밸류·수정·모멘텀을 결합한 후보 순위,"VS-03,VS-05,VS-06,VS-09",PLANNED
|
||||||
|
VS-13,CalculatePortfolioRisk,PortfolioRisk,S9,W19-20,Portfolio-A,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,ES·집중·상관·자본바닥 위험 스냅샷,"VS-03,VS-08",PLANNED
|
||||||
|
VS-14,GenerateDailyRecommendations,ClientAdvisory,S7,W15-16,MVP-B,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,고객별 BUY/HOLD/SELL/REENTER/REBALANCE 제안 패키지,"VS-07,VS-10,VS-12,VS-13",PLANNED
|
||||||
|
VS-15,ReviewRecommendation,ClientAdvisory,S7,W15-16,MVP-B,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,maker-checker 승인·보류·기각과 낙관적 동시성,VS-14,PLANNED
|
||||||
|
VS-16,PublishClientAdvice,ClientAdvisory,S8,W17-18,G3,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,승인·유효·데이터 정상 제안만 고객 공개,VS-15,PLANNED
|
||||||
|
VS-17,RecordClientDecision,ClientAdvisory,S8,W17-18,G3,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,고객 수락·거절·보류와 attribution 연결,VS-16,PLANNED
|
||||||
|
VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,S8,W17-18,G3,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,1/5/20/63/126/252일 결과·매도·재진입 품질 평가,"VS-10,VS-11,VS-16,VS-17",PLANNED
|
||||||
|
VS-19,RunFrozenBacktest,BacktestingEvaluation,S5,W11-12,G2,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,동결 manifest 기반 워크포워드·OOS·비용 스트레스 재현,"VS-03,VS-04,VS-05,VS-06,VS-09",PLANNED
|
||||||
|
VS-20,PromoteModelVersion,GovernanceAudit,S11,W23-24,G4-A,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,모델 승격 증거·승인·롤백·챔피언/챌린저,"VS-18,VS-19",PLANNED
|
||||||
|
VS-21,BuildRebalanceProposal,PortfolioRisk,S9,W19-20,Portfolio-A,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,비용·세금·위험예산·제약을 만족하는 리밸런싱,"VS-07,VS-08,VS-12,VS-13",PLANNED
|
||||||
|
VS-22,SuggestReplacementProducts,PortfolioRisk,S10,W21-22,Portfolio Gate,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,적합성·유동성·비용후 기회우위 대체상품 비교,"VS-07,VS-12,VS-13",PLANNED
|
||||||
|
VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,S12,W25-26,Pilot-A,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,브로커·내부 주문·체결·보유·현금 break와 승인 정정,"VS-08,VS-16",PLANNED
|
||||||
|
VS-24,ReportAndNotify,ReportingNotifications,S11,W23-24,G4-A,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,고객 리포트·SignalR·Telegram 운영 경보,"VS-16,VS-18",PLANNED
|
||||||
|
VS-25,AuditAndKillSwitch,GovernanceAudit,S13,W27-28,G5,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,입력→결정→승인→공개→실행→평가 추적과 단계별 차단,"VS-01,VS-16,VS-20,VS-23",PLANNED
|
||||||
|
@@ -0,0 +1,203 @@
|
|||||||
|
WBS_ID,Sprint,Weeks,Slice_ID,Slice,Module,Workstream,Requirement_ID,API_ID,DB_Migration_ID,Job_Event_ID,UI_ID,Test_ID,Task,Artifact,Acceptance_Evidence,Primary_Owner,Secondary,PD,Dependency,Gate,Evidence_Class,Risk,Status
|
||||||
|
AEG-X-001,S0,W1-2,Cross,Cross-cutting,Governance,GOV,DOC-NR-01~08,Cross,Cross,Cross,Cross,Cross,Version Coverage Matrix 고도화,Version Coverage Matrix·Supersession Registry,모든 첨부와 v10/v12/v12.1의 Retained/Improved/Superseded 상태 100%,PM/Architect,Architect/QA,5,-,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-002,S0,W1-2,Cross,Cross-cutting,Toolchain,DEVEX,REQ-PLAT-TOOL,Cross,Cross,Cross,Cross,Cross,global.json 고도화,global.json·Directory.Packages·node/packageManager·lock 정책,승인 runner에서 dotnet restore/build/test 및 pnpm frozen build 재현,DevOps,Architect/QA,6,AEG-X-001,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-003,S0,W1-2,Cross,Cross-cutting,Architecture,FITNESS,REQ-ARCH-001,Cross,Cross,Cross,Cross,Cross,모듈/namespace/schema/API 금지 의존 Architecture tests 고도화,모듈/namespace/schema/API 금지 의존 Architecture tests,"Domain 기술의존 0, 모듈 직접 DB 접근 0, ID 중복 0",Architect/QA,Architect/QA,7,AEG-X-002,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-004,S0,W1-2,Cross,Cross-cutting,Database,DBA,REQ-DB-001,Cross,Cross,Cross,Cross,Cross,DbUp fresh/upgrade/re-run/failure 복구 rehearsal 고도화,DbUp fresh/upgrade/re-run/failure 복구 rehearsal,PostgreSQL 승인 버전에서 4 시나리오와 checksum 변경 차단 통과,DBA/BE,Architect/QA,8,AEG-X-002,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-005,S0,W1-2,Cross,Cross-cutting,Security,SEC,REQ-SEC-BASE,Cross,Cross,Cross,Cross,Cross,"OIDC/JWT ADR, DevelopmentHeader 제한, fail-closed 고도화","OIDC/JWT ADR, DevelopmentHeader 제한, fail-closed","비개발 무인증 접근 0, secret/log/prompt 노출 0",Security/BE,Architect/QA,7,AEG-X-001,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-006,S0,W1-2,Cross,Cross-cutting,Reliability,ASYNC,REQ-ASYNC-001,Cross,Cross,Cross,Cross,Cross,Outbox publisher 고도화,Outbox publisher·Inbox lease·dead-letter·replay,"duplicate 0, crash-before/after-publish 시나리오와 replay hash 통과",BE/SRE,Architect/QA,10,AEG-X-004,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-007,S0,W1-2,Cross,Cross-cutting,Observability,OPS,REQ-OBS-001,Cross,Cross,Cross,Cross,Cross,Serilog/OTel correlation 고도화,Serilog/OTel correlation·metric naming·Telegram redaction,"trace→job→decision→outbox 연결, PII redaction test 통과",SRE/Security,Architect/QA,7,AEG-X-005,G0,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-X-008,S0,W1-2,Cross,Cross-cutting,API Contract,CONTRACT,REQ-API-001,Cross,Cross,Cross,Cross,Cross,OpenAPI artifact 고도화,OpenAPI artifact·ProblemDetails taxonomy·FE contract generation,OpenAPI diff와 breaking change approval 없이는 Release 차단,BE/FE Architect,Architect/QA,8,AEG-X-003,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-00-01,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,GOV,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,정책·범위·실패상태 계약 확정,"REQ-PLAT-001, VS-00 SLICE_SPEC, ADR/Decision Log",사용자 결과 '빌드·마이그레이션·관제 가능한 단일 배포 골격'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,-,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-00-02,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,DATA,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,데이터 시점·스키마·정합성 계약,"MIG-0000/0013, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-00-01,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-00-03,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,DOMAIN,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,도메인 불변조건·상태전이 구현,"src/Modules/Host/BuildingBlocks/PlatformBootstrap/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-00-02,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-00-04,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,BE,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,Vertical Slice API/Application/SQL 구현,HEALTH-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-00-03,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-00-05,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,ASYNC,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,Event/Job/Inbox·재처리 구현,"-; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-00-04,G0,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-00-06,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,FE,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,Vue feature·Zod·Query·컴포넌트 구현,UI-PLAT-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-00-05,G0,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-00-07,S0,W1-2,VS-00,PlatformBootstrap,Host/BuildingBlocks,TESTOPS,REQ-PLAT-001,HEALTH-01,MIG-0000/0013,-,UI-PLAT-01,T-ARCH-001,회귀·관제·Runbook·Rollback 증거,T-ARCH-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-00-06,G0,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-009,S1,W3-4,Cross,Cross-cutting,Data Governance,DATA,REQ-DATA-SOURCE,Cross,Cross,Cross,Cross,Cross,Source catalog/license/SLA/timezone/unit/checksum 고도화,Source catalog/license/SLA/timezone/unit/checksum,승인 없는 source가 ingestion 또는 추천으로 진입하지 않음,Data Governance,Architect/QA,8,AEG-X-001,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-01-01,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,GOV,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,정책·범위·실패상태 계약 확정,"REQ-IAM-001, VS-01 SLICE_SPEC, ADR/Decision Log",사용자 결과 'MFA·RBAC·업무분장과 승인 경계'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-00,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-01-02,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,DATA,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,데이터 시점·스키마·정합성 계약,"MIG-IAM-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-01-01,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-01-03,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,DOMAIN,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,도메인 불변조건·상태전이 구현,"src/Modules/IdentityAccess/ManageIdentityAndRoles/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-01-02,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-01-04,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,BE,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,Vertical Slice API/Application/SQL 구현,IAM-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-01-03,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-01-05,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,ASYNC,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,Event/Job/Inbox·재처리 구현,"-; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-01-04,G1-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-01-06,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,FE,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,Vue feature·Zod·Query·컴포넌트 구현,UI-IAM-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-01-05,G1-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-01-07,S1,W3-4,VS-01,ManageIdentityAndRoles,IdentityAccess,TESTOPS,REQ-IAM-001,IAM-01/02,MIG-IAM-001,-,UI-IAM-01,T-IAM-001,회귀·관제·Runbook·Rollback 증거,T-IAM-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-01-06,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-02-01,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,GOV,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,정책·범위·실패상태 계약 확정,"REQ-SEC-001, VS-02 SLICE_SPEC, ADR/Decision Log",사용자 결과 '상장·상폐·상품구조·거래가능성의 PIT 기준'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-00,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-02-02,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,DATA,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,데이터 시점·스키마·정합성 계약,"MIG-SEC-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-02-01,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-02-03,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,DOMAIN,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,도메인 불변조건·상태전이 구현,"src/Modules/SecurityMaster/SynchronizeSecurityMaster/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-02-02,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-02-04,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,BE,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,Vertical Slice API/Application/SQL 구현,"SEC-01/02,DAT-01; Endpoint/Validator/Application/Dapper/Outbox",인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-02-03,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-02-05,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,ASYNC,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,Event/Job/Inbox·재처리 구현,"J01; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-02-04,G1-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-02-06,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,FE,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,Vue feature·Zod·Query·컴포넌트 구현,UI-SEC-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-02-05,G1-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-02-07,S1,W3-4,VS-02,SynchronizeSecurityMaster,SecurityMaster,TESTOPS,REQ-SEC-001,"SEC-01/02,DAT-01",MIG-SEC-001,J01,UI-SEC-01,T-SEC-001,회귀·관제·Runbook·Rollback 증거,T-SEC-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-02-06,G1-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-010,S2,W5-6,Cross,Cross-cutting,Read Model,PROJECTION,REQ-RM-001,Cross,Cross,Cross,Cross,Cross,projection owner/version/watermark/rebuild/staleness 고도화,projection owner/version/watermark/rebuild/staleness,"write model 직접 UI join 0, rebuild 결과 hash 동일",BE/Data,Architect/QA,8,AEG-X-006,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-03-01,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,GOV,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,정책·범위·실패상태 계약 확정,"REQ-DAT-001, VS-03 SLICE_SPEC, ADR/Decision Log",사용자 결과 '원시·조정 OHLCV·FX·금리의 revision 적재'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-02,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-03-02,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,DATA,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,데이터 시점·스키마·정합성 계약,"MIG-MD-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-03-01,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-03-03,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,DOMAIN,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,도메인 불변조건·상태전이 구현,"src/Modules/MarketData/IngestMarketDataPIT/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-03-02,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-03-04,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,BE,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,Vertical Slice API/Application/SQL 구현,DAT-02/03; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-03-03,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-03-05,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,ASYNC,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,Event/Job/Inbox·재처리 구현,"J02; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-03-04,G1-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-03-06,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,FE,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,Vue feature·Zod·Query·컴포넌트 구현,UI-DQ-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-03-05,G1-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-03-07,S2,W5-6,VS-03,IngestMarketDataPIT,MarketData,TESTOPS,REQ-DAT-001,DAT-02/03,MIG-MD-001/002,J02,UI-DQ-01,T-DQ-001,회귀·관제·Runbook·Rollback 증거,T-DQ-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-03-06,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-04-01,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,GOV,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,정책·범위·실패상태 계약 확정,"REQ-CA-001, VS-04 SLICE_SPEC, ADR/Decision Log",사용자 결과 '분할·배당·증자·합병·상폐의 가격·수량·원가 일관성'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-02,VS-03",G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-04-02,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,DATA,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,데이터 시점·스키마·정합성 계약,"MIG-CA-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-04-01,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-04-03,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,DOMAIN,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,도메인 불변조건·상태전이 구현,"src/Modules/SecurityMaster/ApplyCorporateActions/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-04-02,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-04-04,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,BE,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,Vertical Slice API/Application/SQL 구현,DAT-04; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-04-03,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-04-05,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,ASYNC,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,Event/Job/Inbox·재처리 구현,"J03; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-04-04,G1-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-04-06,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,FE,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,Vue feature·Zod·Query·컴포넌트 구현,UI-DQ-02; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-04-05,G1-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-04-07,S2,W5-6,VS-04,ApplyCorporateActions,SecurityMaster,TESTOPS,REQ-CA-001,DAT-04,MIG-CA-001,J03,UI-DQ-02,T-CA-001,회귀·관제·Runbook·Rollback 증거,T-CA-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-04-06,G1-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-05-01,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,GOV,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,정책·범위·실패상태 계약 확정,"REQ-FND-001, VS-05 SLICE_SPEC, ADR/Decision Log",사용자 결과 '공시·재무·컨센서스 공개시각과 정정 이력'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-02,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-05-02,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,DATA,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,데이터 시점·스키마·정합성 계약,"MIG-FND-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-05-01,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-05-03,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,DOMAIN,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,도메인 불변조건·상태전이 구현,"src/Modules/FundamentalsPIT/IngestFundamentalsPIT/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-05-02,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-05-04,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,BE,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,Vertical Slice API/Application/SQL 구현,DAT-05; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-05-03,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-05-05,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,ASYNC,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,Event/Job/Inbox·재처리 구현,"J04; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-05-04,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-05-06,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,FE,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,Vue feature·Zod·Query·컴포넌트 구현,UI-FND-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-05-05,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-05-07,S3,W7-8,VS-05,IngestFundamentalsPIT,FundamentalsPIT,TESTOPS,REQ-FND-001,DAT-05,MIG-FND-001/002,J04,UI-FND-01,T-FND-001,회귀·관제·Runbook·Rollback 증거,T-FND-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-05-06,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-06-01,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,GOV,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,정책·범위·실패상태 계약 확정,"REQ-COST-001, VS-06 SLICE_SPEC, ADR/Decision Log",사용자 결과 '계좌·시장·상품별 Fee/Tax/FX valid-time 계약'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-02,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-06-02,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,DATA,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,데이터 시점·스키마·정합성 계약,"MIG-COST-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-06-01,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-06-03,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,DOMAIN,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,도메인 불변조건·상태전이 구현,"src/Modules/PortfolioRisk/MaintainFeeTaxFxSchedule/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-06-02,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-06-04,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,BE,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,Vertical Slice API/Application/SQL 구현,COST-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-06-03,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-06-05,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,ASYNC,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,Event/Job/Inbox·재처리 구현,"J04C; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-06-04,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-06-06,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,FE,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,Vue feature·Zod·Query·컴포넌트 구현,UI-COST-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-06-05,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-06-07,S3,W7-8,VS-06,MaintainFeeTaxFxSchedule,PortfolioRisk,TESTOPS,REQ-COST-001,COST-01/02,MIG-COST-001,J04C,UI-COST-01,T-COST-001,회귀·관제·Runbook·Rollback 증거,T-COST-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-06-06,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-08-01,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,GOV,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,정책·범위·실패상태 계약 확정,"REQ-LED-001, VS-08 SLICE_SPEC, ADR/Decision Log",사용자 결과 '현금·체결·Lot·Cycle 불변 원장과 대사 기준'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-02,VS-06",G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-08-02,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,DATA,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,데이터 시점·스키마·정합성 계약,"MIG-LED-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-08-01,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-08-03,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,DOMAIN,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,도메인 불변조건·상태전이 구현,"src/Modules/PortfolioRisk/MaintainPortfolioLedger/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-08-02,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-08-04,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,BE,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,Vertical Slice API/Application/SQL 구현,POR-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-08-03,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-08-05,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,ASYNC,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,Event/Job/Inbox·재처리 구현,"J12L; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-08-04,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-08-06,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,FE,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,Vue feature·Zod·Query·컴포넌트 구현,UI-POR-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-08-05,G1,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-08-07,S3,W7-8,VS-08,MaintainPortfolioLedger,PortfolioRisk,TESTOPS,REQ-LED-001,POR-01,MIG-LED-001/002,J12L,UI-POR-01,T-LED-001,회귀·관제·Runbook·Rollback 증거,T-LED-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-08-06,G1,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-011,S4,W9-10,Cross,Cross-cutting,Algorithm,GOLDEN,REQ-ALG-GOLDEN,Cross,Cross,Cross,Cross,Cross,Python↔C# Golden vector 고도화,Python↔C# Golden vector·epsilon·rounding 계약,정책 ID별 경계·우선순위·cost×2 결과 허용오차 내 동일,Quant/QA,Architect/QA,10,VS-09,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-09-01,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,GOV,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,정책·범위·실패상태 계약 확정,"REQ-EVD-001, VS-09 SLICE_SPEC, ADR/Decision Log",사용자 결과 'Dataset/Model/Config/Code SHA가 동결된 Evidence'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-03,VS-04,VS-05,VS-06",G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-09-02,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,DATA,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,데이터 시점·스키마·정합성 계약,"MIG-EVD-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-09-01,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-09-03,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,DOMAIN,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,도메인 불변조건·상태전이 구현,"src/Modules/ResearchFactors/BuildEvidenceSnapshot/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-09-02,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-09-04,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,BE,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,Vertical Slice API/Application/SQL 구현,EVD-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-09-03,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-09-05,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,ASYNC,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,Event/Job/Inbox·재처리 구현,"J06; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-09-04,G2-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-09-06,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,FE,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,Vue feature·Zod·Query·컴포넌트 구현,UI-EVD-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-09-05,G2-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-09-07,S4,W9-10,VS-09,BuildEvidenceSnapshot,ResearchFactors,TESTOPS,REQ-EVD-001,EVD-01,MIG-EVD-001,J06,UI-EVD-01,T-EVD-001,회귀·관제·Runbook·Rollback 증거,T-EVD-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-09-06,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-10-01,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,GOV,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,정책·범위·실패상태 계약 확정,"REQ-SELL-001, VS-10 SLICE_SPEC, ADR/Decision Log",사용자 결과 '우선순위가 보존된 HOLD/부분매도/전량매도 결정'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-08,VS-09,VS-13",G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-10-02,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,DATA,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,데이터 시점·스키마·정합성 계약,"MIG-SIG-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-10-01,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-10-03,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,DOMAIN,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,도메인 불변조건·상태전이 구현,"src/Modules/SignalEngine/GenerateSellDecision/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-10-02,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-10-04,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,BE,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,Vertical Slice API/Application/SQL 구현,SIG-SELL-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-10-03,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-10-05,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,ASYNC,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,Event/Job/Inbox·재처리 구현,"J08S; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-10-04,G2-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-10-06,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,FE,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,Vue feature·Zod·Query·컴포넌트 구현,UI-SELL-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-10-05,G2-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-10-07,S4,W9-10,VS-10,GenerateSellDecision,SignalEngine,TESTOPS,REQ-SELL-001,SIG-SELL-01,MIG-SIG-001,J08S,UI-SELL-01,T-SELL-001,회귀·관제·Runbook·Rollback 증거,T-SELL-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-10-06,G2-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-012,S5,W11-12,Cross,Cross-cutting,Research,REPRO,REQ-REPRO-001,Cross,Cross,Cross,Cross,Cross,dataset/code/config/environment manifest와 artifact hash 고도화,dataset/code/config/environment manifest와 artifact hash,"동일 manifest·seed 결과 재현, 실패 artifact 보존",Quant/Data,Architect/QA,12,AEG-X-009,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-11-01,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,GOV,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,정책·범위·실패상태 계약 확정,"REQ-RE-001, VS-11 SLICE_SPEC, ADR/Decision Log",사용자 결과 '비가치훼손 매도의 재진입 계약·단계·만료'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-10,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-11-02,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,DATA,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,데이터 시점·스키마·정합성 계약,"MIG-RE-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-11-01,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-11-03,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,DOMAIN,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,도메인 불변조건·상태전이 구현,"src/Modules/SignalEngine/ManageReentryWatch/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-11-02,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-11-04,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,BE,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,Vertical Slice API/Application/SQL 구현,RE-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-11-03,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-11-05,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,ASYNC,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,Event/Job/Inbox·재처리 구현,"J09; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-11-04,G2,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-11-06,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,FE,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,Vue feature·Zod·Query·컴포넌트 구현,UI-RE-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-11-05,G2,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-11-07,S5,W11-12,VS-11,ManageReentryWatch,SignalEngine,TESTOPS,REQ-RE-001,RE-01/02,MIG-RE-001,J09,UI-RE-01,T-RE-001,회귀·관제·Runbook·Rollback 증거,T-RE-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-11-06,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-19-01,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,GOV,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,정책·범위·실패상태 계약 확정,"REQ-BKT-001, VS-19 SLICE_SPEC, ADR/Decision Log",사용자 결과 '동결 manifest 기반 워크포워드·OOS·비용 스트레스 재현'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-03,VS-04,VS-05,VS-06,VS-09",G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-19-02,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,DATA,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,데이터 시점·스키마·정합성 계약,"MIG-BKT-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-19-01,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-19-03,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,DOMAIN,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,도메인 불변조건·상태전이 구현,"src/Modules/BacktestingEvaluation/RunFrozenBacktest/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-19-02,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-19-04,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,BE,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,Vertical Slice API/Application/SQL 구현,BKT-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-19-03,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-19-05,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,ASYNC,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,Event/Job/Inbox·재처리 구현,"J-BKT; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-19-04,G2,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-19-06,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,FE,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,Vue feature·Zod·Query·컴포넌트 구현,UI-BKT-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-19-05,G2,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-19-07,S5,W11-12,VS-19,RunFrozenBacktest,BacktestingEvaluation,TESTOPS,REQ-BKT-001,BKT-01/02,MIG-BKT-001,J-BKT,UI-BKT-01,T-BKT-001,회귀·관제·Runbook·Rollback 증거,T-BKT-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-19-06,G2,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-07-01,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,GOV,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,정책·범위·실패상태 계약 확정,"REQ-CLI-001, VS-07 SLICE_SPEC, ADR/Decision Log",사용자 결과 '고객 목표·위험성향·제한상품의 버전 관리'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-01,MVP-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-07-02,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,DATA,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,데이터 시점·스키마·정합성 계약,"MIG-CLI-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-07-01,MVP-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-07-03,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,DOMAIN,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,도메인 불변조건·상태전이 구현,"src/Modules/ClientAdvisory/ManageClientIPS/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-07-02,MVP-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-07-04,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,BE,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,Vertical Slice API/Application/SQL 구현,CLI-01/02/03; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-07-03,MVP-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-07-05,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,ASYNC,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,Event/Job/Inbox·재처리 구현,"-; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-07-04,MVP-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-07-06,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,FE,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,Vue feature·Zod·Query·컴포넌트 구현,UI-CLI-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-07-05,MVP-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-07-07,S6,W13-14,VS-07,ManageClientIPS,ClientAdvisory,TESTOPS,REQ-CLI-001,CLI-01/02/03,MIG-CLI-001,-,UI-CLI-01,T-CLI-001,회귀·관제·Runbook·Rollback 증거,T-CLI-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-07-06,MVP-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-14-01,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,GOV,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,정책·범위·실패상태 계약 확정,"REQ-REC-001, VS-14 SLICE_SPEC, ADR/Decision Log",사용자 결과 '고객별 BUY/HOLD/SELL/REENTER/REBALANCE 제안 패키지'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-07,VS-10,VS-12,VS-13",MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-14-02,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,DATA,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,데이터 시점·스키마·정합성 계약,"MIG-REC-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-14-01,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-14-03,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,DOMAIN,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,도메인 불변조건·상태전이 구현,"src/Modules/ClientAdvisory/GenerateDailyRecommendations/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-14-02,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-14-04,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,BE,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,Vertical Slice API/Application/SQL 구현,SIG-01/02/03; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-14-03,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-14-05,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,ASYNC,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,Event/Job/Inbox·재처리 구현,"J08; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-14-04,MVP-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-14-06,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,FE,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,Vue feature·Zod·Query·컴포넌트 구현,UI-REC-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-14-05,MVP-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-14-07,S7,W15-16,VS-14,GenerateDailyRecommendations,ClientAdvisory,TESTOPS,REQ-REC-001,SIG-01/02/03,MIG-REC-001/002,J08,UI-REC-01,T-REC-001,회귀·관제·Runbook·Rollback 증거,T-REC-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-14-06,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-15-01,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,GOV,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,정책·범위·실패상태 계약 확정,"REQ-REV-001, VS-15 SLICE_SPEC, ADR/Decision Log",사용자 결과 'maker-checker 승인·보류·기각과 낙관적 동시성'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-14,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-15-02,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,DATA,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,데이터 시점·스키마·정합성 계약,"MIG-REV-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-15-01,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-15-03,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,DOMAIN,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,도메인 불변조건·상태전이 구현,"src/Modules/ClientAdvisory/ReviewRecommendation/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-15-02,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-15-04,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,BE,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,Vertical Slice API/Application/SQL 구현,SIG-04; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-15-03,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-15-05,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,ASYNC,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,Event/Job/Inbox·재처리 구현,"-; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-15-04,MVP-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-15-06,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,FE,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,Vue feature·Zod·Query·컴포넌트 구현,UI-REV-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-15-05,MVP-B,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-15-07,S7,W15-16,VS-15,ReviewRecommendation,ClientAdvisory,TESTOPS,REQ-REV-001,SIG-04,MIG-REV-001,-,UI-REV-01,T-REV-001,회귀·관제·Runbook·Rollback 증거,T-REV-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-15-06,MVP-B,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-013,S8,W17-18,Cross,Cross-cutting,Audit,TRACE,REQ-AUDIT-E2E,Cross,Cross,Cross,Cross,Cross,Evidence→Decision→Review→Publish→Outcome trace API 고도화,Evidence→Decision→Review→Publish→Outcome trace API,"publication/decision 기준 누락 링크 0, correction event 보존",Compliance/BE,Architect/QA,8,VS-18,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-16-01,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,GOV,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,정책·범위·실패상태 계약 확정,"REQ-PUB-001, VS-16 SLICE_SPEC, ADR/Decision Log",사용자 결과 '승인·유효·데이터 정상 제안만 고객 공개'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-15,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-16-02,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,DATA,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,데이터 시점·스키마·정합성 계약,"MIG-PUB-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-16-01,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-16-03,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,DOMAIN,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,도메인 불변조건·상태전이 구현,"src/Modules/ClientAdvisory/PublishClientAdvice/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-16-02,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-16-04,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,BE,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,Vertical Slice API/Application/SQL 구현,SIG-05; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-16-03,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-16-05,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,ASYNC,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,Event/Job/Inbox·재처리 구현,"J-PUB; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-16-04,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-16-06,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,FE,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,Vue feature·Zod·Query·컴포넌트 구현,UI-ADV-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-16-05,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-16-07,S8,W17-18,VS-16,PublishClientAdvice,ClientAdvisory,TESTOPS,REQ-PUB-001,SIG-05,MIG-PUB-001,J-PUB,UI-ADV-01,T-PUB-001,회귀·관제·Runbook·Rollback 증거,T-PUB-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-16-06,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-17-01,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,GOV,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,정책·범위·실패상태 계약 확정,"REQ-CLD-001, VS-17 SLICE_SPEC, ADR/Decision Log",사용자 결과 '고객 수락·거절·보류와 attribution 연결'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,VS-16,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-17-02,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,DATA,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,데이터 시점·스키마·정합성 계약,"MIG-CLD-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-17-01,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-17-03,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,DOMAIN,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,도메인 불변조건·상태전이 구현,"src/Modules/ClientAdvisory/RecordClientDecision/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-17-02,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-17-04,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,BE,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,Vertical Slice API/Application/SQL 구현,SIG-06; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-17-03,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-17-05,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,ASYNC,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,Event/Job/Inbox·재처리 구현,"-; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-17-04,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-17-06,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,FE,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,Vue feature·Zod·Query·컴포넌트 구현,UI-CLD-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-17-05,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-17-07,S8,W17-18,VS-17,RecordClientDecision,ClientAdvisory,TESTOPS,REQ-CLD-001,SIG-06,MIG-CLD-001,-,UI-CLD-01,T-CLD-001,회귀·관제·Runbook·Rollback 증거,T-CLD-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-17-06,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-18-01,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,GOV,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,정책·범위·실패상태 계약 확정,"REQ-EVA-001, VS-18 SLICE_SPEC, ADR/Decision Log",사용자 결과 '1/5/20/63/126/252일 결과·매도·재진입 품질 평가'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-10,VS-11,VS-16,VS-17",G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-18-02,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,DATA,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,데이터 시점·스키마·정합성 계약,"MIG-EVA-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-18-01,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-18-03,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,DOMAIN,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,도메인 불변조건·상태전이 구현,"src/Modules/BacktestingEvaluation/EvaluateDecisionOutcome/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-18-02,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-18-04,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,BE,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,Vertical Slice API/Application/SQL 구현,EVA-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-18-03,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-18-05,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,ASYNC,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,Event/Job/Inbox·재처리 구현,"J10/J11; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-18-04,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-18-06,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,FE,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,Vue feature·Zod·Query·컴포넌트 구현,UI-EVA-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-18-05,G3,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-18-07,S8,W17-18,VS-18,EvaluateDecisionOutcome,BacktestingEvaluation,TESTOPS,REQ-EVA-001,EVA-01/02,MIG-EVA-001/002,J10/J11,UI-EVA-01,T-EVA-001,회귀·관제·Runbook·Rollback 증거,T-EVA-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-18-06,G3,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-13-01,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,GOV,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,정책·범위·실패상태 계약 확정,"REQ-RISK-001, VS-13 SLICE_SPEC, ADR/Decision Log",사용자 결과 'ES·집중·상관·자본바닥 위험 스냅샷'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-03,VS-08",Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-13-02,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,DATA,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,데이터 시점·스키마·정합성 계약,"MIG-RISK-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-13-01,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-13-03,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,DOMAIN,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,도메인 불변조건·상태전이 구현,"src/Modules/PortfolioRisk/CalculatePortfolioRisk/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-13-02,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-13-04,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,BE,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,Vertical Slice API/Application/SQL 구현,POR-02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-13-03,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-13-05,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,ASYNC,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,Event/Job/Inbox·재처리 구현,"J07; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-13-04,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-13-06,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,FE,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,Vue feature·Zod·Query·컴포넌트 구현,UI-RISK-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-13-05,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-13-07,S9,W19-20,VS-13,CalculatePortfolioRisk,PortfolioRisk,TESTOPS,REQ-RISK-001,POR-02,MIG-RISK-001,J07,UI-RISK-01,T-RISK-001,회귀·관제·Runbook·Rollback 증거,T-RISK-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-13-06,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-21-01,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,GOV,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,정책·범위·실패상태 계약 확정,"REQ-REB-001, VS-21 SLICE_SPEC, ADR/Decision Log",사용자 결과 '비용·세금·위험예산·제약을 만족하는 리밸런싱'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-07,VS-08,VS-12,VS-13",Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-21-02,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,DATA,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,데이터 시점·스키마·정합성 계약,"MIG-REB-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-21-01,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-21-03,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,DOMAIN,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,도메인 불변조건·상태전이 구현,"src/Modules/PortfolioRisk/BuildRebalanceProposal/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-21-02,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-21-04,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,BE,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,Vertical Slice API/Application/SQL 구현,REB-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-21-03,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-21-05,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,ASYNC,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,Event/Job/Inbox·재처리 구현,"J-REB; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-21-04,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-21-06,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,FE,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,Vue feature·Zod·Query·컴포넌트 구현,UI-REB-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-21-05,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-21-07,S9,W19-20,VS-21,BuildRebalanceProposal,PortfolioRisk,TESTOPS,REQ-REB-001,REB-01/02,MIG-REB-001,J-REB,UI-REB-01,T-REB-001,회귀·관제·Runbook·Rollback 증거,T-REB-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-21-06,Portfolio-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-12-01,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,GOV,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,정책·범위·실패상태 계약 확정,"REQ-BUY-001, VS-12 SLICE_SPEC, ADR/Decision Log",사용자 결과 'PIT 품질·밸류·수정·모멘텀을 결합한 후보 순위'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-03,VS-05,VS-06,VS-09",Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-12-02,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,DATA,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,데이터 시점·스키마·정합성 계약,"MIG-BUY-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-12-01,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-12-03,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,DOMAIN,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,도메인 불변조건·상태전이 구현,"src/Modules/ValuationForecast/RankBuyCandidates/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-12-02,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-12-04,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,BE,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,Vertical Slice API/Application/SQL 구현,BUY-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-12-03,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-12-05,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,ASYNC,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,Event/Job/Inbox·재처리 구현,"J08B; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-12-04,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-12-06,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,FE,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,Vue feature·Zod·Query·컴포넌트 구현,UI-BUY-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-12-05,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-12-07,S10,W21-22,VS-12,RankBuyCandidates,ValuationForecast,TESTOPS,REQ-BUY-001,BUY-01,MIG-BUY-001,J08B,UI-BUY-01,T-BUY-001,회귀·관제·Runbook·Rollback 증거,T-BUY-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-12-06,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-22-01,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,GOV,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,정책·범위·실패상태 계약 확정,"REQ-RPL-001, VS-22 SLICE_SPEC, ADR/Decision Log",사용자 결과 '적합성·유동성·비용후 기회우위 대체상품 비교'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-07,VS-12,VS-13",Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-22-02,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,DATA,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,데이터 시점·스키마·정합성 계약,"MIG-RPL-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-22-01,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-22-03,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,DOMAIN,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,도메인 불변조건·상태전이 구현,"src/Modules/PortfolioRisk/SuggestReplacementProducts/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-22-02,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-22-04,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,BE,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,Vertical Slice API/Application/SQL 구현,RPL-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-22-03,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-22-05,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,ASYNC,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,Event/Job/Inbox·재처리 구현,"J-RPL; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-22-04,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-22-06,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,FE,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,Vue feature·Zod·Query·컴포넌트 구현,UI-RPL-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-22-05,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-22-07,S10,W21-22,VS-22,SuggestReplacementProducts,PortfolioRisk,TESTOPS,REQ-RPL-001,RPL-01,MIG-RPL-001,J-RPL,UI-RPL-01,T-RPL-001,회귀·관제·Runbook·Rollback 증거,T-RPL-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-22-06,Portfolio Gate,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-014,S11,W23-24,Cross,Cross-cutting,Model Risk,VALIDATION,REQ-MODEL-RISK,Cross,Cross,Cross,Cross,Cross,CSCV/PBO 고도화,CSCV/PBO·DSR·block bootstrap·시도 원장,"PBO≤20%, DSR≥95%, cost×2 utility 양수 또는 승격 차단",Quant/Risk,Architect/QA,15,AEG-X-012,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-015,S11,W23-24,Cross,Cross-cutting,Shadow,EVAL,REQ-SHADOW-001,Cross,Cross,Cross,Cross,Cross,252거래일 고도화,252거래일·복수 국면 일평가 scorecard,적중률 단독 아닌 calibration/ES/false-exit/reentry/운영무결성 판정,Quant/Ops,Architect/QA,14,VS-18,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-20-01,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,GOV,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,정책·범위·실패상태 계약 확정,"REQ-MOD-001, VS-20 SLICE_SPEC, ADR/Decision Log",사용자 결과 '모델 승격 증거·승인·롤백·챔피언/챌린저'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-18,VS-19",G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-20-02,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,DATA,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,데이터 시점·스키마·정합성 계약,"MIG-MOD-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-20-01,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-20-03,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,DOMAIN,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,도메인 불변조건·상태전이 구현,"src/Modules/GovernanceAudit/PromoteModelVersion/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-20-02,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-20-04,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,BE,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,Vertical Slice API/Application/SQL 구현,MOD-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-20-03,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-20-05,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,ASYNC,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,Event/Job/Inbox·재처리 구현,"J-MOD; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-20-04,G4-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-20-06,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,FE,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,Vue feature·Zod·Query·컴포넌트 구현,UI-MOD-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-20-05,G4-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-20-07,S11,W23-24,VS-20,PromoteModelVersion,GovernanceAudit,TESTOPS,REQ-MOD-001,MOD-01/02,MIG-MOD-001,J-MOD,UI-MOD-01,T-MOD-001,회귀·관제·Runbook·Rollback 증거,T-MOD-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-20-06,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-24-01,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,GOV,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,정책·범위·실패상태 계약 확정,"REQ-RPT-001, VS-24 SLICE_SPEC, ADR/Decision Log",사용자 결과 '고객 리포트·SignalR·Telegram 운영 경보'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-16,VS-18",G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-24-02,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,DATA,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,데이터 시점·스키마·정합성 계약,"MIG-RPT-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-24-01,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-24-03,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,DOMAIN,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,도메인 불변조건·상태전이 구현,"src/Modules/ReportingNotifications/ReportAndNotify/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-24-02,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-24-04,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,BE,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,Vertical Slice API/Application/SQL 구현,RPT-01; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-24-03,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-24-05,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,ASYNC,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,Event/Job/Inbox·재처리 구현,"J11R; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-24-04,G4-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-24-06,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,FE,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,Vue feature·Zod·Query·컴포넌트 구현,UI-RPT-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-24-05,G4-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-24-07,S11,W23-24,VS-24,ReportAndNotify,ReportingNotifications,TESTOPS,REQ-RPT-001,RPT-01,MIG-RPT-001,J11R,UI-RPT-01,T-RPT-001,회귀·관제·Runbook·Rollback 증거,T-RPT-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-24-06,G4-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-016,S12,W25-26,Cross,Cross-cutting,Broker,CAPABILITY,REQ-KIS-OFF,Cross,Cross,Cross,Cross,Cross,KIS 주문 제출 startup/CI/runtime 차단 고도화,KIS 주문 제출 startup/CI/runtime 차단,"외부 주문 호출 0, capability override 감사·kill-switch 통과",Security/Ops,Architect/QA,7,AEG-X-005,ALL,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-23-01,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,GOV,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,정책·범위·실패상태 계약 확정,"REQ-RECON-001, VS-23 SLICE_SPEC, ADR/Decision Log",사용자 결과 '브로커·내부 주문·체결·보유·현금 break와 승인 정정'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-08,VS-16",Pilot-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-23-02,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,DATA,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,데이터 시점·스키마·정합성 계약,"MIG-EXE-001/002, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-23-01,Pilot-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-23-03,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,DOMAIN,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,도메인 불변조건·상태전이 구현,"src/Modules/ExecutionReconciliation/ReconcilePositionsAndFills/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-23-02,Pilot-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-23-04,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,BE,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,Vertical Slice API/Application/SQL 구현,"EXE-01/02,REC-01/02; Endpoint/Validator/Application/Dapper/Outbox",인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-23-03,Pilot-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-23-05,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,ASYNC,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,Event/Job/Inbox·재처리 구현,"J12; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-23-04,Pilot-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-23-06,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,FE,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,Vue feature·Zod·Query·컴포넌트 구현,UI-RECON-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-23-05,Pilot-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-23-07,S12,W25-26,VS-23,ReconcilePositionsAndFills,ExecutionReconciliation,TESTOPS,REQ-RECON-001,"EXE-01/02,REC-01/02",MIG-EXE-001/002,J12,UI-RECON-01,T-RECON-001,회귀·관제·Runbook·Rollback 증거,T-RECON-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-23-06,Pilot-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-017,S13,W27-28,Cross,Cross-cutting,DR,OPS,REQ-DR-001,Cross,Cross,Cross,Cross,Cross,RPO/RTO 고도화,RPO/RTO·backup/restore·region/host failure rehearsal,"승인 RPO/RTO 내 복구, 원장·outbox·projection 대사 100%",SRE/DBA,Architect/QA,12,AEG-X-006,G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-25-01,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,GOV,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,정책·범위·실패상태 계약 확정,"REQ-GOV-001, VS-25 SLICE_SPEC, ADR/Decision Log",사용자 결과 '입력→결정→승인→공개→실행→평가 추적과 단계별 차단'·비목표·권한·예외·Source/Assumption/Unknown이 승인됨,PM/Architect,Compliance/Owner,3,"VS-01,VS-16,VS-20,VS-23",G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-25-02,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,DATA,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,데이터 시점·스키마·정합성 계약,"MIG-GOV-001, DATA_CONTRACT, DQ/lineage 규칙",published_at/revision/valid-time/hash/단위/격리/재처리와 소유자가 정의되고 overwrite 경로가 없음,Data Architect/DBA,Quant/QA,5,AEG-VS-25-01,G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-25-03,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,DOMAIN,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,도메인 불변조건·상태전이 구현,"src/Modules/GovernanceAudit/AuditAndKillSwitch/Domain, 정책 결정표",순수 정책 테스트에서 우선순위·경계값·단조성·금지 전이가 통과하고 Infrastructure 의존이 없음,BE/Quant Lead,Architect/QA,6,AEG-VS-25-02,G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-25-04,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,BE,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,Vertical Slice API/Application/SQL 구현,GOV-01/02; Endpoint/Validator/Application/Dapper/Outbox,인증·권한·멱등·트랜잭션·ProblemDetails·낙관적 동시성·correlation이 수용기준과 일치,BE Lead,Security/QA,8,AEG-VS-25-03,G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-VS-25-05,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,ASYNC,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,Event/Job/Inbox·재처리 구현,"J-GOV; integration event, JobRun, watermark, inbox","동일 ScopeKey 재실행 결과가 동일하고 중복 side effect 0, transient/business hold/poison이 분리됨",BE/SRE,Data/Ops,5,AEG-VS-25-04,G5,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-25-06,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,FE,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,Vue feature·Zod·Query·컴포넌트 구현,UI-GOV-01; route/api/schema/queries/pages/components,loading/empty/partial/stale/warn/error/401/403/409/expired/readonly와 접근성·권한 경계가 검증됨,FE Lead,UX/QA,6,AEG-VS-25-05,G5,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-VS-25-07,S13,W27-28,VS-25,AuditAndKillSwitch,GovernanceAudit,TESTOPS,REQ-GOV-001,GOV-01/02,MIG-GOV-001,J-GOV,UI-GOV-01,T-GOV-001,회귀·관제·Runbook·Rollback 증거,T-GOV-001; xUnit/Vitest/Playwright/Data/Replay; OTel/alert/runbook,Golden·integration·failure·replay·E2E와 metric/alert/Owner/Secondary/rollback rehearsal가 Release Evidence에 연결됨,QA/SRE,Module Owner,7,AEG-VS-25-06,G5,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-018,S14,W29-30,Cross,Cross-cutting,Performance,NFR,REQ-NFR-001,Cross,Cross,Cross,Cross,Cross,API P95 고도화,API P95·batch SLA·portfolio 규모·backfill 부하시험,개장 전 추천 SLA와 고객 API SLO가 동시에 충족,SRE/QA,Architect/QA,10,AEG-X-017,G6-A,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
AEG-X-019,S14,W29-30,Cross,Cross-cutting,Cutover,RELEASE,REQ-CUT-001,Cross,Cross,Cross,Cross,Cross,dry-run/backfill/recon/rollback/release evidence 고도화,dry-run/backfill/recon/rollback/release evidence,"미승인 공개 0, duplicate 0, rollback 리허설과 승인 서명",PM/Ops,Architect/QA,10,AEG-X-018,G6-A,SOURCE+DESIGN_PROPOSAL,P0,PLANNED
|
||||||
|
AEG-X-020,S15,W31-32,Cross,Cross-cutting,Hypercare,OPS,REQ-HYP-001,Cross,Cross,Cross,Cross,Cross,P1/P2 triage 고도화,P1/P2 triage·daily reconciliation·debt burn-down,초기 안정화 Exit 기준·Owner·잔여 부채 승인,Ops/PM,Architect/QA,8,AEG-X-019,G6,SOURCE+DESIGN_PROPOSAL,P1,PLANNED
|
||||||
|
@@ -0,0 +1,26 @@
|
|||||||
|
ID,Priority,Debt,Impact,Remediation,Gate,Owner,Status
|
||||||
|
TD-001,P0,도구체인 실빌드 미검증,C# 컴파일/패키지 호환 결함 가능,승인 .NET 10 runner에서 restore/build/test,G0,DevOps,OPEN
|
||||||
|
TD-002,P0,pnpm-lock.yaml 부재,FE 공급망·재현성 미확보,승인 네트워크에서 pnpm install 후 lock review/commit,G0,FE Lead,OPEN
|
||||||
|
TD-003,P0,PostgreSQL migration rehearsal 미실행,fresh/upgrade/re-run/복구 실패 가능,PostgreSQL 승인 버전 4시나리오 자동화,G0,DBA,OPEN
|
||||||
|
TD-004,P0,원시 연구 데이터 권리·checksum·환경 lock 미완전,제3자 clean-room 재현 불가,Source catalog/license/raw checksum/container digest 확보,G1,Data Governance,OPEN
|
||||||
|
TD-005,P0,KR 검증 종료 2021-04-16,최근 시장국면 검증 공백,2026 현재까지 PIT 총수익·상폐·기업행사 보충 후 frozen OOS,G4,Quant/Data,OPEN
|
||||||
|
TD-006,P0,실제 OIDC/JWT 공급자 미결정,외부 Pilot 접근통제 불가,"Auth ADR, key rotation, claims/RBAC E2E",G5,Security,OPEN
|
||||||
|
TD-007,P0,총수익·상폐수익·컨센서스 공급계약 미확정,생존편향·성과왜곡,공식/상용 source 계약·SLA·재배포 권리 승인,G1,Data Governance,OPEN
|
||||||
|
TD-008,P0,Fee/Tax/FX PIT 표 미확정,비용후 기대효용 왜곡,valid_from/to 계좌·venue·상품·side·band schedule,G1,DBA/Quant,OPEN
|
||||||
|
TD-009,P0,Outbox/Inbox crash/replay 실증 미완료,side effect 누락·중복,lease/dead-letter/replay chaos test,G3,BE/SRE,IN_PROGRESS
|
||||||
|
TD-010,P1,JobRun·Watermark 표준의 일부 구현만 존재,배치 재처리·감사 불완전,공통 JobRun scope/version/hash/heartbeat 정책 적용,G1,BE/SRE,IN_PROGRESS
|
||||||
|
TD-011,P1,Architecture test가 정적 문자열 규칙 중심,금지 의존 누락 가능,assembly/namespace/schema/API fitness function 확대,G0,Architect,IN_PROGRESS
|
||||||
|
TD-012,P1,OpenAPI→FE contract 자동생성 미도입,DTO drift·홀루시네이션 위험,OpenAPI artifact diff + generated client/schema gate,G3,BE/FE,OPEN
|
||||||
|
TD-013,P1,PII redaction·Telegram 보안 테스트 미완성,고객정보 노출 가능,classification/redaction test와 secret scan,G5,Security/SRE,OPEN
|
||||||
|
TD-014,P1,Model promotion workflow 미완성,무단 모델 활성화 위험,model card/maker-checker/effective_at/rollback 구현,G4,Risk/BE,OPEN
|
||||||
|
TD-015,P1,Read Model rebuild runner 미완성,stale projection 복구 불가,projection version/watermark/rebuild/diff 도구,G3,BE/Data,IN_PROGRESS
|
||||||
|
TD-016,P1,SLO/RPO/RTO 미승인,운영 Go 판단 불가,부하시험·백업복구·DR ADR 승인,G5,SRE/DBA,OPEN
|
||||||
|
TD-017,P2,공통 UI 컴포넌트 승격 기준 미운영,중복 또는 과도한 추상화,3회 반복+동일 의미/변경축 확인 후 승격,S10,FE Lead,OPEN
|
||||||
|
TD-018,P1,PBO/DSR 전체 탐색·시도 원장 미완성,과최적화 위험,전체 실험 registry+CSCV/PBO/DSR/block bootstrap,G4,Quant/Risk,OPEN
|
||||||
|
TD-019,P1,자산유형별 재진입 확인팩터 공급원 미완성,재진입 품질 저하,asset policy contract+PIT source+missing evidence downgrade,G2,Quant/Data,OPEN
|
||||||
|
TD-020,P0,자동주문/KIS 제출은 금지 상태,오활성화 사고 위험,Options ValidateOnStart+CI config scan+runtime kill switch 유지,ALL,Security/Ops,MITIGATED
|
||||||
|
TD-021,P1,정책 임계값이 문서·YAML·C#에 중복될 가능성,계약 drift,승인 config registry+schema+hash+generated constants,G2,Quant/BE,OPEN
|
||||||
|
TD-022,P1,DB immutable trigger와 correction event 운영절차 미실증,정정/감사 장애 가능,maker-checker correction replay와 audit trace E2E,G3,DBA/Compliance,OPEN
|
||||||
|
TD-023,P2,프런트 서버상태/Pinia 책임 경계의 팀 규율 미검증,중복 캐시·stale UI,lint/review checklist+query key registry,MVP-B,FE Lead,OPEN
|
||||||
|
TD-024,P1,Dependency vulnerability/license 자동검사 미구성,공급망 리스크,NuGet/npm SBOM·license allowlist·vulnerability gate,G5,Security/DevOps,OPEN
|
||||||
|
TD-025,P1,성능 규모 가정 미확정,배치 SLA/DB index 과·소설계,portfolio/security/client volume 결정·capacity test,G6-A,PM/SRE,OPEN
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user