Merge WBS-7 완료: GAS→Python 마이그레이션 + 보완고도화

## 주요 변경사항

###  완료된 11개 항목

- WBS-7.1: 캘리브레이션 실증 전환 도구
- WBS-7.2: T+5 지표 단일 진실원천 통일
- WBS-7.3: GAS→Python 공식 마이그레이션 재검토 + F05/F10 포팅 
- WBS-7.4: Deprecated 별칭·시트 정리
- WBS-7.5: 임시 하드코딩 폴백 비례화
- WBS-7.6: 슬리피지 실측 보정 스캐폴딩
- WBS-7.7: E2E 통합 테스트 구축
- WBS-7.8: ETF NAV/공매도 자동화 검토 및 운영절차 명문화
- WBS-7.9: snapshot_admin Synology POC 기본 보안 게이트
- WBS-7.10: 어드민 페이지 Tabler 그리드 조회
- WBS-7.11: spec-코드 동기화 게이트

### F05/F10 포팅 (이번 세션)

**F05 (calc_exit_sell_action)**
- 7단계 우선순위 계층 구현
- JavaScript Number.isFinite() 의미론 보장 via safe_float()
- 가격 폴백 체인 (tp2 → tp1 → close)
- 17개 parity 테스트 PASS

**F10 (run_route_flow)**
- 5개 게이트 순차 필터링
- Stop_Breach → Relative_Stop → Intraday_Lock → Heat_Gate → Mean_Reversion
- 17개 parity 테스트 PASS

### 📊 테스트 상태

**Parity 테스트**: 64/64 PASS
- F02/F04/F06 (price_basis): 8개
- F05 (execution_decision): 17개
- F07 (score_thresholds): 9개
- F10 (routing_decision): 17개
- F11 (classify_order_type): 13개

### 🎯 최종 상태

Phase 1~6 모두 완료, Phase 7 보완·고도화 DONE → 엔진 전체 경화 완료.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

# Conflicts:
#	GatherTradingData.json
#	governance/gas_logic_migration_ledger_v1.yaml
This commit is contained in:
2026-06-22 23:22:32 +09:00
74 changed files with 8761 additions and 2463 deletions
+3 -1
View File
@@ -344,7 +344,7 @@ def main() -> int:
if not ready:
raise SystemExit("PACKAGE_ONLY_BLOCKED: " + ";".join(reasons))
skipped_steps.append("all-validation-reused-existing-gate")
gate_status = "OK"
gate_status = "SKIPPED"
plan = []
if not args.skip_convert:
plan.append({"name": "prepare", "command": ["tools/convert_xlsx_to_json.py"]})
@@ -374,6 +374,8 @@ def main() -> int:
skipped_duplicate_steps=skipped_steps,
gate_status=gate_status,
)
payload["allowed_use"] = "production_investment_decisions" if args.validation_mode in {"release", "quick"} else "packaging_only"
payload["validation_mode"] = args.validation_mode
min_samples = 1 if args.validation_mode == "package-only" else 5
analysis = finalize_runtime_profile(profile_path=RUNTIME_PROFILE, payload=payload, min_samples=min_samples)
if analysis.get("status") == "ALERT":