docs/ROADMAP_WBS.md and docs/ROADMAP_ENTERPRISE_TEMPLATES_WBS.md were
archived in an earlier commit today as "superseded planning docs," but
that judgment only checked CLAUDE.md/README/other docs for references
- not the actual validator scripts, spec YAMLs, and unit tests that
drive the release gate. Both paths turn out to be load-bearing:
- docs/ROADMAP_WBS.md is read directly by
tools/validate_quant_engine_wbs_v1.py,
tools/validate_platform_transition_wbs_v1.py,
tests/unit/test_validate_quant_engine_wbs_v1.py, and referenced by
spec/60_quant_engine_wbs.yaml and others.
- docs/ROADMAP_ENTERPRISE_TEMPLATES_WBS.md is read by
tools/validate_enterprise_crud_specification_v1.py, which runs as
the "Enterprise Contract Parity Test" step in
.gitea/workflows/ci-frontend.yml.
Moved both back to their original path, replaced the stale "ARCHIVED"
banner with a note explaining why they can't be archived without first
updating the validators, and fixed the 4 doc cross-references that had
been repointed at docs/archive/. Verified all three affected validators
now exit 0 by actually running them locally.
The other 9 docs archived earlier today (5 CI/CD docs + CICD_ROADMAP.md,
EXECUTION_PLAN_PHASE0_CLOSEOUT_AND_PHASE1_KICKOFF.md,
MODERNIZATION_ROADMAP_VISUAL.md,
MODERNIZATION_STRATEGY_ROADMAP_2026-2027.md) were checked against the
same grep sweep (*.py/*.yaml/*.yml/*.js/*.ts/*.cs/*.json, whole repo)
and have zero references outside markdown - those archivals stand.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Archives 6 more superseded planning docs to docs/archive/ (ROADMAP_WBS.md,
MODERNIZATION_ROADMAP_VISUAL.md, MODERNIZATION_STRATEGY_ROADMAP_2026-2027.md,
ROADMAP_ENTERPRISE_TEMPLATES_WBS.md, EXECUTION_PLAN_PHASE0_CLOSEOUT_AND_PHASE1_KICKOFF.md,
CICD_ROADMAP.md), each replaced by a current source of truth (CLAUDE.md,
docs/MIGRATION_STATUS.md, or the OMS·WMS·ERP spec/playbook), and repoints
4 files that linked to the pre-archive path.
Fixes README's top-of-file install instructions and package.json's
"ops:dev" script, both of which pointed at core_satellite_collector.js -
a file that has never existed anywhere in this repo's git history. The
real, working entry point (tools/run_kis_data_collection_v1.py /
npm run ops:data-collect) was already correctly documented further
down the same README.
Also finishes retiring pre-existing stale state that predates this
session: removes the superseded deploy-prod.yml.backup, completes the
already-in-progress removal of the old src/client/ Vue+AG-Grid
prototype (superseded by src/frontend/), and untracks
test-results/.last-run.json (Playwright's own run-metadata file,
regenerated every test run - shouldn't be version controlled).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Critical re-review of the QuantEngine WBS evidence system found several
regressions of the "no fake gates" discipline established by M0, plus a
still-unwired M1 collection path. This closes 10 more WBS tasks
(QE-M1-01..06, QE-M2-01/02/04/05/06 — see spec/60_quant_engine_wbs.yaml)
with real, gate-verified evidence (18/34 total).
M1 — real KIS data now lands in PostgreSQL end-to-end:
- SchedulerService: load ticker universe from GatherTradingData.json instead
of a hardcoded array; fix a Hangfire scoped-service resolution bug.
- KisDataCollectionOrchestrator: restore logging on the lineage-event write
path (was a bare `catch {}` swallowing all failures silently); persist
daily OHLCV bars into quantengine.price_history_daily per run.
- Verified live: POST /api/collection/run -> Hangfire -> orchestrator ->
KIS mock API -> PostgreSQL, with Playwright DOM/API parity evidence.
M2 — historical price-history pipeline:
- CollectionRepository: SavePriceHistoryDailyAsync (idempotent upsert),
GetPriceHistorySummaryAsync (per-ticker aggregation) + a new
DateOnlyTypeHandler registered globally, since Dapper has no built-in
System.DateOnly support in either direction (write threw
NotSupportedException, read threw a constructor-mismatch
InvalidOperationException — found by exercising both paths live).
- tools/validate_price_history_integrity_v1.py: gap-freeness (vs KIS
trading calendar) + price-sanity gate over collected history.
- Admin Collection page: new "히스토리 현황" summary table +
GET /api/collection/history-summary, with Playwright evidence.
Governance/gate fixes:
- validate_market_time_series_schema_v1.py mislabeled its own output
"runtime_database_query": "DATA_GATED" despite never opening a DB
connection (pure file/regex check) — relabeled "check_scope":
"STATIC_STRUCTURAL_ONLY" and wired the node into the release DAG so it
isn't only reachable from ci.yml, matching every other validator.
Live-data authority for the same claim stays with QE-M2-01's pg_query
gate (spec/60), documented in spec/64.
- Fixed a WBS log_pattern check (QE-M1-06) that couldn't match its own
multi-line target; loosened two depends_on edges (QE-M1-05/06,
QE-M2-04/05) that encoded "needs X verified" when the real requirement
was only "needs X's code merged."
- Discovered and fixed admin-pages.spec.ts logging in with the wrong
seeded password (admin/admin instead of admin/quant123!, per CLAUDE.md)
— every test in that suite had been silently failing at the login step.
Deferred: QE-M2-03 (2-year backfill) — the KIS mock/VTS token endpoint
started returning 403 after the first successful call this session; looks
like a token-issuance rate limit or credential issue on KIS's side, not a
code defect. Backfilling at scale right now would just generate more 403s,
so left QE-M2-03 PENDING pending KIS account/console verification.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fluent UI Blazor v5 / InteractiveServer 방침을 폐기하고 MudBlazor 컴포넌트 +
Interactive WebAssembly 렌더 모드 + API-First 를 신규 표준으로 확정한다.
기존 CLAUDE.md(Fluent UI)와 AGENTS.md §5b(MudBlazor)의 상충을 해소한다.
- CLAUDE.md: Framework & Design System, Component Rules, 매핑표를 MudBlazor 로 갱신
- AGENTS.md §5b: 렌더 모드 표준(Interactive WebAssembly) 신설, Server 표기 정렬
- ROADMAP_WBS.md: WBS-10 보강 문서 상호 참조 링크 추가
- WBS_10_DOTNET_MIGRATION_HARDENING: 마이그레이션 완성/상용화 로드맵 신규,
UI 코드 전환을 WBS-A7 로 등록
코드 전환(csproj/Program.cs/.razor)은 미수행, 본 커밋은 방침 문서만 수정.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
WBS-9.8 (Slack 통합 모니터링) 항목 제거.
Slack API 연동하지 않음 — 모니터링은 로그/상태 파일로 관리.
WBS-9: 7개 항목으로 축소
1. GAS 마이그레이션 완결 (F14)
2. snapshot_admin 성능 최적화
3. 데이터 품질 강화
4. 장애 대응 플레이북
5. 섹터 플로우 신호 신뢰도
6. 문서 신뢰도 맵
7. 자동 백업 & 복구
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## WBS-9 개요
WBS-8의 실증 검증 완료 후, 성능 최적화와 운영 안정성을 극대화하는 단계.
예상 기간: 2026-08-01 ~ 2026-10-31
## 8개 항목
1. **WBS-9.1**: GAS 마이그레이션 완결 (F14 미해결 항목)
2. **WBS-9.2**: snapshot_admin 성능 최적화 (<2초 로딩)
3. **WBS-9.3**: 데이터 품질 강화 (NULL 처리 정책)
4. **WBS-9.4**: 장애 대응 플레이북 (5가지 시나리오)
5. **WBS-9.5**: 섹터 플로우 신호 신뢰도 측정
6. **WBS-9.6**: LLM 레이더 문서 최적화
7. **WBS-9.7**: 자동 백업 & 복구 체계
8. **WBS-9.8**: Slack 통합 모니터링
## 의존성 구조
- 독립 병렬: 9.1, 9.2, 9.3, 9.4, 9.6, 9.7, 9.8
- 선행 의존: WBS-8.5 완료 → WBS-9.5
## 테스트 상태
179/179 PASS (parity + unit tests)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## WBS-8 개요
WBS-7 구조적 경화 완료 후, 실거래 데이터 누적을 통한 이론적 임계값의 실증적 검증 및 운영 안정화.
예상 기간: 2026-07-01 ~ 2026-09-30
현재 parity 테스트: 95/95 PASS
## 8개 항목
1. **WBS-8.1**: T+20 레저 30건 달성 & 예측 정확도 활성화 (~2026-07-15)
2. **WBS-8.2**: 알파 보정 루프 1차 실행 (8.1 의존)
3. **WBS-8.3**: 캘리브레이션 실증 전환 1차 (8.1 의존)
4. **WBS-8.4**: 슬리피지 실측 보정 (체결 5건↑)
5. **WBS-8.5**: 섹터 플로우 30일 누적 검증 (~2026-07-21)
6. **WBS-8.6**: Synology snapshot_admin 라이브 배포 검증
7. **WBS-8.7**: spec-코드 동기화 게이트 커버리지 확장 (12.5%→50%↑)
8. **WBS-8.8**: KIS 수집기 리팩터 (원격 병행 중)
## 의존성 구조
- 병렬 진행 가능: 8.5, 8.6, 8.7, 8.8
- 순차 의존: 8.1 → {8.2, 8.3, 8.4}
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
GAS calcDistributionRiskRow_의 "THIN_ADAPTER: delegated to Python" 주석이
틀린 주석이었음을 발견 — GAS(DISTRIBUTION_RISK_SCORE_V1, 점수식 BUY 차단
게이트)와 Python calc_distribution_detector_per_ticker(DISTRIBUTION_SELL_DETECTOR_V1,
6신호 카운트, PRE_DISTRIBUTION_EARLY_WARNING 정밀도 보완)는 이미 spec에
서로 다른 고유 formula_id로 등록된 독립 공식이었다. "GAS가 Python의 중복"
이라는 ledger 전제가 거짓이었을 뿐, 코드는 원래부터 올바르게 분리돼 있었다.
사용자 결정(둘 다 유지, 역할 분리)에 따라:
- GAS 소스의 잘못된 주석 정정(gdf_03_portfolio_gates.gs) + 번들 재생성
- 양쪽 formula_registry에 상호 related_formula 참조 추가(향후 혼동 방지)
- governance/gas_logic_migration_ledger_v1.yaml: migration_action을
DELETE_DISTRIBUTION_RISK_GAS → KEEP_BOTH_SEPARATE_ROLES로 변경, DONE
Synology 실배포는 검증 불가하지만, 인증 게이트 자체(401/wrong-401/correct-200,
WWW-Authenticate 헤더)는 로컬에서 --auth-user/--auth-password로 재현해 문서의
실측 절차 1)·3) 기대값과 정확히 일치함을 확인했다. 2)/5)/6)은 실제 NAS·공개
호스트명이 필요해 사용자가 직접 수행해야 함을 명시했다.
이미 harness_file:/python_tool:/validator: 필드로 1:1 코드 매핑을
스스로 명시하고 있던 H001~H008 결정론적 하네스 계약 7개(spec/52~58)와
spec/32(canonical_artifact_resolver), spec/37(evaluation_dashboard_contract)에
has_code_implementation/code_path를 추가했다. 모든 대상 파일의 code_path
실존을 사전 확인했다.
governance/rules/00~05, spec/40·45·46·gas_adapter_contract 등 다중 구현체에
걸친 계약은 단일 code_path로 환원하면 거짓 1:1 매핑이 되므로 의도적으로
제외했다(WBS-7.11 핵심 원칙 유지).