From c76f763e6442a978d668810cc860f2f0cafe304f Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 21 Jun 2026 22:50:42 +0900 Subject: [PATCH] docs: snapshot WBS-4 gated status --- docs/ROADMAP_WBS.md | 65 +++++++++++++++++++++++---- docs/WBS_4_1_4_3_STATUS_2026_06_21.md | 62 +++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 docs/WBS_4_1_4_3_STATUS_2026_06_21.md diff --git a/docs/ROADMAP_WBS.md b/docs/ROADMAP_WBS.md index 842f307..7bc01b6 100644 --- a/docs/ROADMAP_WBS.md +++ b/docs/ROADMAP_WBS.md @@ -436,6 +436,9 @@ MDD = (peak_total_asset - current_total_asset) / peak_total_asset × 100 | **진척 아티팩트** | `Temp/data_gated_progress_v1.json` | | **현재 상태** | 스키마 완성, 데이터 0건 | +> 2026-06-21 누적 상태: `Temp/realized_performance_v1.json` 기준 `t1_operational.n=68`, `t5_operational.n=0`, `t20_replay_estimated.n=0`. 레저 구조는 있으나 T+20 실측 종료 조건은 아직 충족하지 못했다. +> 상세 상태 스냅샷: [`docs/WBS_4_1_4_3_STATUS_2026_06_21.md`](/C:/Temp/data_feed/docs/WBS_4_1_4_3_STATUS_2026_06_21.md) + **성공 하네스 (데이터 기준)**: ``` 활성화 체크: @@ -472,6 +475,8 @@ match_rate_pct = 예측방향 맞춘 건수 / 전체 예측 건수 × 100 현재: 데이터 부족으로 산출 불가 → WBS-4.1 완료 선행 ``` +> 2026-06-21 누적 상태: `Temp/prediction_accuracy_harness_v2.json` 기준 `calibration_state=INSUFFICIENT_SAMPLES`, `t1_sample=68`, `t5_sample=0`, `t20_sample=0`, `t20_replay_sample=0`. + --- #### WBS-4.3 알파 보정 루프 (ALPHA_CALIBRATION_V2) @@ -493,6 +498,8 @@ match_rate_pct = 예측방향 맞춘 건수 / 전체 예측 건수 × 100 calibration_registry_v1.json 업데이트 타임스탬프 IS NOT NULL ``` +> 2026-06-21 누적 상태: `Temp/alpha_feedback_loop_v2.json` 기준 `status=DATA_INSUFFICIENT`, `cases_analyzed=0`, `recommended_adjustments={}`. + --- #### WBS-4.4 성과 모니터링 대시보드 (EVALUATION_DASHBOARD_V1) @@ -728,14 +735,14 @@ python tools/validate_specs.py → PASS (이 마이그레이션 상태는 현재 | **작업** | `spec/aliases.yaml`의 deprecated 경로 17건을 데드라인 전 코드/spec 참조에서 전수 제거 | | **현재 상태** | `remove_after: 2026-06-30` — 오늘(2026-06-21) 기준 9일 남음, 추적 항목 없었음 | | **담당 파일** | `spec/aliases.yaml`, `tools/validate_specs.py` | -| **상태** | TODO — **긴급(데드라인 임박)** | +| **상태** | ✅ 완료 (2026-06-21) — alias 17건 제거, `python tools/validate_specs.py` PASS | **성공 하네스 (데이터 기준)**: ``` 검증: grep -rl "old_portfolio_exposure_framework\|old_risk_control" spec/ src/ tools/ | wc -l -현재: deprecated 별칭 17건 등록, 참조 잔존 여부 미확인 +결과: 참조 0건, `spec/aliases.yaml`은 비워짐 +추가 검증: python tools/validate_specs.py → PASS 목표: 2026-06-30 이전 참조 0건 + spec/aliases.yaml에서 deprecated 항목 제거 - python tools/validate_specs.py → deprecated 경로 사용 시 FAIL 처리로 전환 ``` --- @@ -849,9 +856,9 @@ python tools/validate_specs.py → PASS | 항목 | 내용 | |------|------| | **작업** | `src/quant_engine/snapshot_admin_server_v1.py`(Python 어드민 웹 UI)를 Gitea CI/CD 배포 스텝을 통해 Synology NAS에서 상시 서비스로 운영할 수 있는지 검토 | -| **현재 상태** | **기술적으로는 가능, 단 3가지 제약 확인됨** (아래) | -| **담당 파일** | `.gitea/workflows/ci.yml`, `tools/run_snapshot_admin_server_v1.py`, `src/quant_engine/snapshot_admin_server_v1.py` | -| **상태** | TODO — 구현 전 보안·접근 정책 결정 필요 | +| **현재 상태** | **기술적으로는 가능**. 기본 루프백 보호 + Basic Auth 게이트를 추가했고, Synology 외부 노출은 리버스 프록시 기반 POC로 가이드함. 실배포 검증은 아직 필요 | +| **담당 파일** | `.gitea/workflows/ci.yml`, `tools/run_snapshot_admin_server_v1.py`, `src/quant_engine/snapshot_admin_server_v1.py`, `docs/SYNOLOGY_SNAPSHOT_ADMIN_POC.md`, `docs/WBS_7_9_EVIDENCE_PACKET_FINAL.md` | +| **상태** | 부분 완료 — POC 절차/보안 게이트 구현 완료, Synology live verification pending | **조사 결과**: @@ -869,7 +876,49 @@ python tools/validate_specs.py → PASS 검증: 배포 후 curl http://127.0.0.1:8787/api/state → 200 응답 + CI 잡 종료 후 5분 뒤에도 프로세스 생존 확인 ``` -> **이 항목은 "구현 가능"으로 결론났으나, 인증 부재 상태로 상시 서비스화하는 것은 보안 리스크이므로 사용자의 명시적 정책 결정(인증 추가 여부, 노출 범위) 없이는 실제 배포 스텝을 작성하지 않는다.** +> **이 항목은 "구현 가능"으로 결론났고, 기본 보안 게이트는 추가되었다. 다만 Synology 실배포/외부 노출 검증은 아직 남아 있으므로, 리버스 프록시·방화벽·인증을 함께 적용하는 POC 절차만 제시한다.** + +**실측 절차 (WBS-7.9 live verification)**: +``` +1) NAS 내부 확인 + curl -i http://127.0.0.1:8787/api/state + 기대: 200 OK, JSON 응답, version.app=snapshot-admin-web-v7 + +2) 외부 경유 확인 + curl -i https:///api/state + 기대: 인증 미제공 시 401 Unauthorized + WWW-Authenticate: Basic + +3) 인증 확인 + curl -u ':' https:///api/state + 기대: 200 OK, JSON 응답 + +4) UI 확인 + 브라우저에서 https:///, /tables 접속 + 기대: Basic Auth 프롬프트 후 페이지 렌더링 + +5) 지속성 확인 + Python 서비스 재시작 또는 NAS 재부팅 후 5분 이내 재접속 + 기대: 동일 URL이 다시 200/401 규칙대로 동작 + +6) 증빙 보관 + - curl 출력 2개 이상 + - 브라우저 스크린샷 2장 + - DSM Reverse Proxy 규칙 스크린샷 + - 인증서/호스트명/포트 기록 +``` + +**완료 판정 기준**: +- `tools/run_snapshot_admin_synology.sh start` 실행 후 `healthcheck ok` 확인 +- `curl -i http://127.0.0.1:8787/api/state` 가 200 응답 +- `curl -i https:///api/state` 가 인증 없이는 401 응답 +- `curl -u ':' https:///api/state` 가 200 응답 +- 브라우저에서 `https:///` 및 `/tables` 가 인증 후 렌더링 +- NAS 재시작 또는 서비스 재시작 뒤에도 위 동작이 동일하게 재현 +- `docs/SYNOLOGY_SNAPSHOT_ADMIN_EVIDENCE_TEMPLATE.md` 양식에 맞춰 증빙을 채우고 보관 +- 최종 완료 문구는 `docs/SYNOLOGY_SNAPSHOT_ADMIN_DEPLOYMENT_CHECKLIST.md` §8 템플릿을 사용 +- 현장용 채움본은 `docs/SYNOLOGY_SNAPSHOT_ADMIN_DEPLOYMENT_CHECKLIST_FILLED.md` 참조 +- DSM 입력 표는 `docs/SYNOLOGY_SNAPSHOT_ADMIN_FIREWALL_PROXY_TABLE.md` 또는 `docs/SYNOLOGY_SNAPSHOT_ADMIN_FIREWALL_PROXY_COPYPASTE.md` 참조 +- 최종 점검 10개는 `docs/SYNOLOGY_SNAPSHOT_ADMIN_FINAL_PREFLIGHT_10.md` 참조 --- @@ -968,7 +1017,7 @@ LLM이 런타임에 이런 stale spec을 사실로 읽으면 할루시네이션 | 7.6 슬리피지 실측 보정 | 🟡 Medium | 낮음 | 체결 5건↑ | 스캐폴딩완료, 비교는 DATA_GATED | **100%** ✅ (캡처 도구, 비교는 표본 대기) | | 7.7 E2E 통합테스트 | 🟠 High | 중간 | 없음 | 완료 | **100%** ✅ (2026-06-21, 3 passed) | | 7.8 ETF NAV 수집경로 확정 | 🟡 Medium | 높음 | KRX/KIND 정책 | 완료(재검토주기 설정) | **100%** ✅ (next_review: 2026-09-30) | -| 7.9 Synology 배포 검토 | 🟡 Medium | 중간 | 보안정책 결정 | 완료(검토만) | **100%** ✅ (구현은 정책 결정 대기) | +| 7.9 Synology 배포 검토 | 🟡 Medium | 중간 | 보안정책 결정 | 부분완료 | **부분완료** (외부 접근 POC 가이드 + Basic Auth 게이트 추가, live verification pending) | | 7.10 어드민 테이블 그리드(Tabler) | 🟢 Low | 낮음 | 없음 | 완료 | **100%** ✅ (2026-06-21, 8 passed) | | 7.11 spec-코드 동기화 게이트 | 🔴 Critical | 중간 | 없음 | 완료 | **100%** ✅ (2026-06-22, 12/159 태깅, 85 passed) | diff --git a/docs/WBS_4_1_4_3_STATUS_2026_06_21.md b/docs/WBS_4_1_4_3_STATUS_2026_06_21.md new file mode 100644 index 0000000..ff425dc --- /dev/null +++ b/docs/WBS_4_1_4_3_STATUS_2026_06_21.md @@ -0,0 +1,62 @@ +# WBS-4.1 / 4.2 / 4.3 Status Snapshot + +## Snapshot + +As of `2026-06-21`, the performance-intelligence phase remains `DATA_GATED`. +The current outputs are enough to prove the structure exists, but not enough to claim live operational completion. +The KIS collection and qualitative sell workflows now run successfully on Gitea with the triggering ref checkout and seed recovery path in place. + +## WBS-4.1 T+20 outcome ledger + +Source: `Temp/realized_performance_v1.json` + +- `t1_operational.n = 68` +- `t1_operational.mean_return_pct = 2.68` +- `t5_operational.n = 0` +- `t20_replay_estimated.n = 0` +- `current_drawdown_pct = -3.42` +- `worst_case_mdd_pct = 30.26` + +Interpretation: + +- There is operational history, but not enough T+20 live outcomes to close the ledger target. +- The portfolio-level evidence is still marked as `insufficient_data`. +- The collection pipeline blocker is cleared; the remaining blocker is live T+20 accumulation. + +## WBS-4.2 prediction accuracy harness + +Source: `Temp/prediction_accuracy_harness_v2.json` + +- `calibration_state = INSUFFICIENT_SAMPLES` +- `evaluation_methodology = ACTIVE_PASSIVE_SPLIT_V1_INCONCLUSIVE_EXCLUDED` +- `t1_sample = 68` +- `t5_sample = 0` +- `t20_sample = 0` +- `t20_replay_sample = 0` +- `macro_event_excluded_count = 0` + +Interpretation: + +- The harness is structurally present. +- There is no valid T+5/T+20 sample set yet, so `match_rate` cannot be promoted. +- The harness can now consume the tracked seed snapshot in CI, but the sample set is still too small for promotion. + +## WBS-4.3 alpha calibration loop + +Source: `Temp/alpha_feedback_loop_v2.json` + +- `status = DATA_INSUFFICIENT` +- `cases_analyzed = 0` +- `recommended_adjustments = {}` + +Interpretation: + +- The calibration loop is not yet receiving enough real outcome data to produce stable reweighting. +- `run 165` and `run 166` confirm the upstream seed and collection stages are unblocked. + +## Bottom line + +- WBS-4.1: not complete +- WBS-4.2: not complete +- WBS-4.3: not complete +- Shared blocker: insufficient live T+20 accumulation