Initial commit: Add project files
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user