diff --git a/spec/22_pipeline_runtime_contract.yaml b/spec/22_pipeline_runtime_contract.yaml index e0da3fb..7921b96 100644 --- a/spec/22_pipeline_runtime_contract.yaml +++ b/spec/22_pipeline_runtime_contract.yaml @@ -1,36 +1,38 @@ +meta: + has_code_implementation: false pipeline_runtime_contract: - formula_id: PIPELINE_RUNTIME_CONTRACT_V1 - has_code_implementation: true - code_path: "tools/profile_pipeline_runtime.py" - version: 1 - modes: - bundle: - purpose: build normalized bundle artifacts before upload packaging - max_elapsed_sec_target: 15 - release: - purpose: final upload package with full gate once - max_elapsed_sec_target: 180 - required_steps: - - release-gate - - build-bundle - - build-zip - forbidden_duplicate_steps: - - daily-feedback-report-after-validate-engine-strict - quick: - purpose: fast package with recent gate artifacts - max_elapsed_sec_target: 60 - freshness_max_minutes: 60 - required_fresh_artifacts: - - Temp/engine_harness_gate_result.json - - Temp/strategy_hardening_harness_v2.json - - Temp/data_integrity_100_lock_v2.json - package-only: - purpose: zip without rerunning heavy validation - max_elapsed_sec_target: 10 - require_previous_gate_ok: true - freshness_max_minutes: 1440 acceptance: - engine_gate_status: OK engine_failed_checks_count: 0 + engine_gate_status: OK runtime_profile_required: true zip_created: true + code_path: tools/profile_pipeline_runtime.py + formula_id: PIPELINE_RUNTIME_CONTRACT_V1 + has_code_implementation: true + modes: + bundle: + max_elapsed_sec_target: 15 + purpose: build normalized bundle artifacts before upload packaging + package-only: + freshness_max_minutes: 1440 + max_elapsed_sec_target: 10 + purpose: zip without rerunning heavy validation + require_previous_gate_ok: true + quick: + freshness_max_minutes: 60 + max_elapsed_sec_target: 60 + purpose: fast package with recent gate artifacts + required_fresh_artifacts: + - Temp/engine_harness_gate_result.json + - Temp/strategy_hardening_harness_v2.json + - Temp/data_integrity_100_lock_v2.json + release: + forbidden_duplicate_steps: + - daily-feedback-report-after-validate-engine-strict + max_elapsed_sec_target: 180 + purpose: final upload package with full gate once + required_steps: + - release-gate + - build-bundle + - build-zip + version: 1 diff --git a/spec/25_canonical_metrics_registry.yaml b/spec/25_canonical_metrics_registry.yaml index 3b344bb..bee0a98 100644 --- a/spec/25_canonical_metrics_registry.yaml +++ b/spec/25_canonical_metrics_registry.yaml @@ -1,351 +1,336 @@ -# Canonical Metrics Registry V1 -# 목적: 같은 논리 지표를 여러 JSON 객체/키에서 읽는 "단일 진실원천 부재" 버그를 방지. -# 각 metric_id는 canonical_source 하나에서만 읽어야 하며, -# 렌더러(render_operational_report.py)는 build_canonical_metrics_v1.py가 산출한 -# Temp/canonical_metrics_v1.json을 통해서만 이 값을 조회한다. -# -# 변경 정책 (spec/06_exit_policy.yaml Surgical Update와 동일): -# - canonical_source 변경 시 consumers 전부 업데이트 확인 필수 -# - tolerance_abs: 두 원천 값이 이 차이 이내면 일치로 간주 (교차섹션 정합성 검사용) - -formula_id: CANONICAL_METRICS_REGISTRY_V1 -has_code_implementation: true -code_path: "tools/build_canonical_metrics_v1.py" -version: "2026-05-29" - -# ───────────────────────────────────────────────────────── -# 스칼라 지표 (per_ticker: false) -# ───────────────────────────────────────────────────────── -metrics: - - cluster_pct: - description: 반도체 클러스터(삼성전자+SK하이닉스+KODEX반도체) 합산 비중(%) - canonical_source: semiconductor_cluster_json.combined_pct - fallback_sources: - - mandatory_reduction_json.cluster_pct - - cluster_sync_result_json.cluster_pct - consumers: - - cluster_sync_audit - - portfolio_structure_risks - - mandatory_reduction_plan - tolerance_abs: 0.05 - unit: percent - notes: > - cluster_sync_result_json.cluster_pct=0 버그가 있음. - mandatory_reduction_json.cluster_pct=62.79는 소수점 반올림 차이이므로 tolerance 허용. - canonical = semiconductor_cluster_json.combined_pct(62.93). - - cash_min_required_krw: - description: 현금 최소 필요액(원) — cash_floor 확보를 위한 최소 매도 필요 금액 - canonical_source: cash_recovery_display_json.min_required_krw - fallback_sources: - - cash_shortfall_min_krw - - trim_plan_to_min_cash_json.cash_shortfall_min_krw - consumers: - - exec_safety_declaration - - cash_recovery_plan_crdl - - single_conclusion - - QEH_AUDIT_BLOCK - tolerance_abs: 0 - unit: krw - notes: > - cash_shortfall_json 객체가 None이므로 cash_shortfall_json.cash_shortfall_min_krw 읽기 불가. - harness_context 최상위 cash_shortfall_min_krw=39797073이 대안이나, - canonical = cash_recovery_display_json.min_required_krw(39797073). - - cash_reference_total_krw: - description: 현금확보 전체 후보 누적 금액(원) — 주문 아님, 참고용 - canonical_source: trim_plan_to_min_cash_json.total_plan_krw - fallback_sources: - - cash_recovery_display_json.reference_total_krw - consumers: - - cash_recovery_plan_crdl - tolerance_abs: 0 - unit: krw - notes: > - cash_recovery_display_json.reference_total_krw=0(미산출). - 올바른 원천 = trim_plan_to_min_cash_json.total_plan_krw(227,868,540). - -# ───────────────────────────────────────────────────────── -# 종목별 지표 (per_ticker: true) -# harness_context에서 list를 ticker 키로 인덱싱한 딕셔너리로 변환 -# ───────────────────────────────────────────────────────── -per_ticker_metrics: - - scrs_immediate_qty: - description: SCRS-V2 즉시 매도 수량(주) - canonical_source: scrs_v2_json.selected_combo[ticker].immediate_qty - alias_in_data: immediate_qty - wrong_alias_in_renderer: immediate_sell_qty - consumers: - - scrs_v2_sell_table - notes: > - 렌더러가 immediate_sell_qty를 찾지만 데이터에는 immediate_qty가 있음. - AGENTS.md 5b: "immediate_sell_qty는 '-' 출력 금지 (키 불일치)" 명시 위반. - - scrs_rebound_qty: - description: SCRS-V2 반등 대기 수량(주) - canonical_source: scrs_v2_json.selected_combo[ticker].rebound_wait_qty - alias_in_data: rebound_wait_qty - consumers: - - scrs_v2_sell_table - - ticker_profit_pct: - description: 종목별 미실현 손익률(%) - canonical_source: prices_json[ticker].profit_pct - alias_in_renderer_wrong: unrealized_pnl_pct - alias_in_renderer_correct: profit_pct - consumers: - - profit_preservation_table - notes: > - profit_preservation_json[].unrealized_pnl_pct=None. - 올바른 원천 = prices_json[].profit_pct. - - ticker_stop_price: - description: 종목별 손절가(원) - canonical_source: prices_json[ticker].stop_price - consumers: - - shadow_ledger_table - - profit_preservation_table - notes: shadow_ledger_json의 stop_loss_calc=None이므로 prices_json 직접 사용. - - ticker_limit_price: - description: 종목별 산출 지정가(원) — 차단 종목 포함 전체 표시(H10) - canonical_source: proposal_reference_json[ticker].proposed_limit_price_krw - fallback_sources: - - prices_json[ticker].stop_price - consumers: - - shadow_ledger_table - notes: > - AGENTS.md H10: 차단 종목도 산출 지표 은폐 금지. - proposal_reference_json에 proposed_limit_price_krw가 있으면 사용, - 없으면 prices_json.stop_price를 참고방어가로 표시. - - ticker_base_qty: - description: 종목별 기준 매도 수량(주) - canonical_source: sell_quantities_json[ticker].sell_qty - fallback_sources: - - comprehensive_proposal_json[ticker].quantity - consumers: - - shadow_ledger_table - notes: > - shadow_ledger_json의 base_qty_calc=None. - sell_quantities_json[].sell_qty 또는 comprehensive_proposal_json[].quantity 사용. - - ticker_tp1_price: - description: 종목별 1차 익절가(원) - canonical_source: prices_json[ticker].tp1_price - consumers: - - shadow_ledger_table - -# ───────────────────────────────────────────────────────── -# v11 추가 지표 — 12개 모순 해소 (SINGLE_TRUTH_LEDGER_V3) -# P0-1: 보고서 섹션별 재계산 금지 — ledger 조회만 허용 -# ───────────────────────────────────────────────────────── -v11_contradiction_metrics: - - value_damage_pct: - description: 현금확보 매도의 가치훼손율(%) — raw 기준 - canonical_source: smart_cash_recovery_v8.json.raw_value_damage_pct_avg - fallback_sources: - - smart_cash_recovery_v7.json.raw_value_damage_pct_avg - - smart_cash_recovery_v9.json.raw_value_damage_pct_avg - tolerance_abs: 0.1 - unit: percent - contradiction_sites: - - {section: final_execution_decision, wrong_value: 0.0, correct_value: 15.7} - - {section: cash_recovery_plan_crdl, wrong_value: 0.0, correct_value: 15.7} - notes: "raw=15.7%가 canonical. adjusted=0.0 단독 표기는 RAW_VS_ADJUSTED_DISCLOSURE_V1 위반." - - performance_readiness_score: - description: 성과 준비도 점수(0~100) - canonical_source: operational_truth_score_v1.json.performance_readiness_score - tolerance_abs: 0.1 - unit: score - contradiction_sites: - - {section: operational_truth_score_section, value: 37.2} - - {section: performance_monitoring_dashboard, value: 50.0, note: "50은 비활성 기본값 — canonical 37.2 사용"} - - operational_truth_score: - description: 운영 진실 점수(0~100) - canonical_source: operational_truth_score_v1.json.score_0_100 - tolerance_abs: 0.1 - unit: score - contradiction_sites: - - {section: operational_truth_score_section, value: 80.86} - - {section: performance_monitoring_dashboard, value: 89.12, note: "재계산값 — canonical 80.86 사용"} - - short_horizon_pct: - description: 단기 호라이즌 비중(%) - canonical_source: horizon_classification_v1.json.allocation_pct.SHORT - tolerance_abs: 0.1 - unit: percent - contradiction_sites: - - {section: horizon_allocation_lock_v1, value: 14.3} - - {section: performance_monitoring_dashboard, value: 71.4, note: "보유종목 SHORT비중과 전략노출 혼동"} - - mid_horizon_pct: - description: 중기 호라이즌 비중(%) - canonical_source: horizon_classification_v1.json.allocation_pct.MID - tolerance_abs: 0.1 - unit: percent - - horizon_cap_short_pct: - description: 단기 호라이즌 비중 상한(%) - canonical_source: horizon_allocation_guard_v2.json.short_cap - fallback_sources: - - spec/strategy/horizon_allocation_v1.yaml.rules.HA002.condition - tolerance_abs: 1.0 - unit: percent - notes: "엔진 감사 short_cap=40%, horizon_routing_lock short_threshold=40%" - - horizon_cap_mid_pct: - description: 중기 호라이즌 비중 상한(%) - canonical_source: horizon_allocation_guard_v2.json.mid_cap - tolerance_abs: 1.0 - unit: percent - contradiction_sites: - - {section: horizon_allocation_lock_v1, value: 45} - - {section: engine_audit_routing, value: 50} - - final_score: - description: 종합 전략 점수(0~100) - canonical_source: scores_harness_v1.json.final_score.value - tolerance_abs: 0.5 - unit: score - contradiction_sites: - - {section: engine_audit_scores, value: 40.5} - - {section: performance_monitoring_dashboard, value: 45.3, note: "재계산값 — canonical 40.5 사용"} - - t5_match_rate_pct: - description: T+5 예측 방향 일치율(%) - canonical_source: prediction_accuracy_harness_v5.json.prediction_match_rate_pct - fallback_sources: - - outcome_quality_score_v1.json.metrics.t5_operational_pass_rate - tolerance_abs: 0.5 - unit: percent - contradiction_sites: - - {section: outcome_eval_window_monitor, value: 35.69, note: "전체 이력 기준"} - - {section: performance_monitoring_dashboard, value: 73.24, note: "decisive 케이스만 — 혼용 금지"} - notes: "canonical = prediction_accuracy_harness_v5.prediction_match_rate_pct(47.28). 표본 정의 혼용 금지." - - cash_immediately_raisable_krw: - description: 즉시 조달 가능 현금(원) - canonical_source: cash_recovery_optimizer_v4.json.cash_shortfall_min_krw - fallback_sources: - - smart_cash_recovery_v8.json.cash_recovered_krw - tolerance_abs: 0 - unit: krw - contradiction_sites: - - {section: cash_recovery_plan_crdl, value: 57841575} - - {section: engine_audit_sell_classification, value: 59399085} - - cash_shortfall_target_krw: - description: 현금 목표 부족액(원) - canonical_source: cash_recovery_optimizer_v4.json.cash_shortfall_min_krw - fallback_sources: - - operational_truth_score_v1.json.cash_shortfall_min_krw - tolerance_abs: 0 - unit: krw - contradiction_sites: - - {section: executive_brief, value: 38671178} - - {section: single_conclusion, value: 47769737} - - confidence_cap: - description: 신뢰도 캡(0~100) — honest 기준 - canonical_source: imputed_data_exposure_gate_v2.json.effective_confidence_honest - tolerance_abs: 0.1 - unit: score - contradiction_sites: - - {section: investment_quality_headline, value: 93.0, note: "schema_presence 기반 — 거짓"} - - {section: engine_audit_imputed_exposure_honest, value: 88.4, note: "honest 기반 — canonical"} - notes: "88.4가 canonical. 93.0은 schema_presence 기반 거짓 캡이므로 폐기." - - position_weight_pct: - description: 종목별 포트폴리오 비중(%) - canonical_source: portfolio_exposure_v1.json[ticker].weight_pct - fallback_sources: - - prices_json[ticker].position_weight_pct - per_ticker: true - tolerance_abs: 0.1 - unit: percent - contradiction_sites: - - {section: portfolio_risk_panel, samsung: 44.5} - - {section: ejce, samsung: 44.35} - - {section: executive, samsung: 45.5} - - unrealized_return_pct: - description: 종목별 미실현 수익률(%) - canonical_source: prices_json[ticker].profit_pct - per_ticker: true - tolerance_abs: 0.1 - unit: percent - contradiction_sites: - - {section: position_dashboard, samsung: 98.0} - - {section: profit_preservation_table, samsung: 96.44} - - {section: decision_trace, samsung: 96.4} - -# ───────────────────────────────────────────────────────── -# 예측 성과 지표 (평가창 정직성 — EVALUATION_WINDOW_HONESTY_V1) -# RC5 수정: proxy를 T+20으로 인용하는 평가창 위조 차단 -# ───────────────────────────────────────────────────────── -evaluation_window_metrics: - - t20_pass_rate: - description: T+20 벤치마크 초과수익률 달성 비율(%) - canonical_source: outcome_quality_score_v1.json.metrics.t20_effective_rate - formula_id: EVALUATION_WINDOW_HONESTY_V1 - proxy_detection: - source_field: outcome_quality_score_v1.json.metrics.t20_source - proxy_value: t5_operational_proxy - proxy_flag_field: t20_is_proxy - enforcement: - - "t20_source != operational_t20 이면 지표명을 'T+20(추정,프록시)'로 강제 라벨링" - - "T20_PROXY=true 인 동안 t20_pass_rate를 release_gate t20_alpha 합격 근거로 사용 금지" - current_state: - t20_source: t5_operational_proxy - t20_is_proxy: true - t20_effective_rate: 40.92 - label: "T+20(추정,프록시)" - proxy_note: "[T20_PROXY: 실측 T+20 표본 0건 — t5_operational_proxy 사용 중]" - consumers: - - release_gate_t20_alpha - - operational_report.summary.t20_is_proxy - tolerance_abs: 0.1 - unit: percent - notes: > - t20_source=t5_operational_proxy이므로 보고서에서 T+20으로 인용 금지. - 실측 T+20 표본 30건 누적 후 t20_source=operational_t20으로 전환. - 전환 전까지 release_gate t20_alpha(55%) 판단에 이 값 사용 불가. - - prediction_match_rate: - description: 예측 방향 일치율(%) — T+5 기준 - canonical_source: prediction_accuracy_harness_v5.json.prediction_match_rate_pct - fallback_sources: - - algorithm_guidance_proof_v1.json.honest_components.prediction_match_rate - current_state: - value: 47.28 - target: 58.0 - gap: -10.72 - label: "[UNVALIDATED_LIVE: n=0 live samples]" - consumers: - - release_gate_prediction_quality - unit: percent - -# ───────────────────────────────────────────────────────── -# 교차섹션 정합성 검사 규칙 -# ───────────────────────────────────────────────────────── +code_path: tools/build_canonical_metrics_v1.py consistency_rules: - enforcement_mode_until: "2026-06-15" - warn_threshold_conflict_count: 1 + enforcement_mode_until: '2026-06-15' fail_threshold_conflict_count: 1 forbidden_uniform_labels: - - "데이터 누락" - - "DATA_MISSING" - - "중립" - - "NEUTRAL" - - "LOSING" - - "정상" + - 데이터 누락 + - DATA_MISSING + - 중립 + - NEUTRAL + - LOSING + - 정상 forbidden_uniform_labels_whitelist_columns: - - "비고" - - "해제조건" + - 비고 + - 해제조건 + warn_threshold_conflict_count: 1 +evaluation_window_metrics: + prediction_match_rate: + canonical_source: prediction_accuracy_harness_v5.json.prediction_match_rate_pct + consumers: + - release_gate_prediction_quality + current_state: + gap: -10.72 + label: '[UNVALIDATED_LIVE: n=0 live samples]' + target: 58.0 + value: 47.28 + description: 예측 방향 일치율(%) — T+5 기준 + fallback_sources: + - algorithm_guidance_proof_v1.json.honest_components.prediction_match_rate + unit: percent + t20_pass_rate: + canonical_source: outcome_quality_score_v1.json.metrics.t20_effective_rate + consumers: + - release_gate_t20_alpha + - operational_report.summary.t20_is_proxy + current_state: + label: T+20(추정,프록시) + proxy_note: '[T20_PROXY: 실측 T+20 표본 0건 — t5_operational_proxy 사용 중]' + t20_effective_rate: 40.92 + t20_is_proxy: true + t20_source: t5_operational_proxy + description: T+20 벤치마크 초과수익률 달성 비율(%) + enforcement: + - t20_source != operational_t20 이면 지표명을 'T+20(추정,프록시)'로 강제 라벨링 + - T20_PROXY=true 인 동안 t20_pass_rate를 release_gate t20_alpha 합격 근거로 사용 금지 + formula_id: EVALUATION_WINDOW_HONESTY_V1 + notes: 't20_source=t5_operational_proxy이므로 보고서에서 T+20으로 인용 금지. 실측 T+20 표본 30건 + 누적 후 t20_source=operational_t20으로 전환. 전환 전까지 release_gate t20_alpha(55%) 판단에 + 이 값 사용 불가. + + ' + proxy_detection: + proxy_flag_field: t20_is_proxy + proxy_value: t5_operational_proxy + source_field: outcome_quality_score_v1.json.metrics.t20_source + tolerance_abs: 0.1 + unit: percent +formula_id: CANONICAL_METRICS_REGISTRY_V1 +has_code_implementation: true +meta: + has_code_implementation: false +metrics: + cash_min_required_krw: + canonical_source: cash_recovery_display_json.min_required_krw + consumers: + - exec_safety_declaration + - cash_recovery_plan_crdl + - single_conclusion + - QEH_AUDIT_BLOCK + description: 현금 최소 필요액(원) — cash_floor 확보를 위한 최소 매도 필요 금액 + fallback_sources: + - cash_shortfall_min_krw + - trim_plan_to_min_cash_json.cash_shortfall_min_krw + notes: 'cash_shortfall_json 객체가 None이므로 cash_shortfall_json.cash_shortfall_min_krw + 읽기 불가. harness_context 최상위 cash_shortfall_min_krw=39797073이 대안이나, canonical + = cash_recovery_display_json.min_required_krw(39797073). + + ' + tolerance_abs: 0 + unit: krw + cash_reference_total_krw: + canonical_source: trim_plan_to_min_cash_json.total_plan_krw + consumers: + - cash_recovery_plan_crdl + description: 현금확보 전체 후보 누적 금액(원) — 주문 아님, 참고용 + fallback_sources: + - cash_recovery_display_json.reference_total_krw + notes: 'cash_recovery_display_json.reference_total_krw=0(미산출). 올바른 원천 = trim_plan_to_min_cash_json.total_plan_krw(227,868,540). + + ' + tolerance_abs: 0 + unit: krw + cluster_pct: + canonical_source: semiconductor_cluster_json.combined_pct + consumers: + - cluster_sync_audit + - portfolio_structure_risks + - mandatory_reduction_plan + description: 반도체 클러스터(삼성전자+SK하이닉스+KODEX반도체) 합산 비중(%) + fallback_sources: + - mandatory_reduction_json.cluster_pct + - cluster_sync_result_json.cluster_pct + notes: 'cluster_sync_result_json.cluster_pct=0 버그가 있음. mandatory_reduction_json.cluster_pct=62.79는 + 소수점 반올림 차이이므로 tolerance 허용. canonical = semiconductor_cluster_json.combined_pct(62.93). + + ' + tolerance_abs: 0.05 + unit: percent +per_ticker_metrics: + scrs_immediate_qty: + alias_in_data: immediate_qty + canonical_source: scrs_v2_json.selected_combo[ticker].immediate_qty + consumers: + - scrs_v2_sell_table + description: SCRS-V2 즉시 매도 수량(주) + notes: '렌더러가 immediate_sell_qty를 찾지만 데이터에는 immediate_qty가 있음. AGENTS.md 5b: "immediate_sell_qty는 + ''-'' 출력 금지 (키 불일치)" 명시 위반. + + ' + wrong_alias_in_renderer: immediate_sell_qty + scrs_rebound_qty: + alias_in_data: rebound_wait_qty + canonical_source: scrs_v2_json.selected_combo[ticker].rebound_wait_qty + consumers: + - scrs_v2_sell_table + description: SCRS-V2 반등 대기 수량(주) + ticker_base_qty: + canonical_source: sell_quantities_json[ticker].sell_qty + consumers: + - shadow_ledger_table + description: 종목별 기준 매도 수량(주) + fallback_sources: + - comprehensive_proposal_json[ticker].quantity + notes: 'shadow_ledger_json의 base_qty_calc=None. sell_quantities_json[].sell_qty + 또는 comprehensive_proposal_json[].quantity 사용. + + ' + ticker_limit_price: + canonical_source: proposal_reference_json[ticker].proposed_limit_price_krw + consumers: + - shadow_ledger_table + description: 종목별 산출 지정가(원) — 차단 종목 포함 전체 표시(H10) + fallback_sources: + - prices_json[ticker].stop_price + notes: 'AGENTS.md H10: 차단 종목도 산출 지표 은폐 금지. proposal_reference_json에 proposed_limit_price_krw가 + 있으면 사용, 없으면 prices_json.stop_price를 참고방어가로 표시. + + ' + ticker_profit_pct: + alias_in_renderer_correct: profit_pct + alias_in_renderer_wrong: unrealized_pnl_pct + canonical_source: prices_json[ticker].profit_pct + consumers: + - profit_preservation_table + description: 종목별 미실현 손익률(%) + notes: 'profit_preservation_json[].unrealized_pnl_pct=None. 올바른 원천 = prices_json[].profit_pct. + + ' + ticker_stop_price: + canonical_source: prices_json[ticker].stop_price + consumers: + - shadow_ledger_table + - profit_preservation_table + description: 종목별 손절가(원) + notes: shadow_ledger_json의 stop_loss_calc=None이므로 prices_json 직접 사용. + ticker_tp1_price: + canonical_source: prices_json[ticker].tp1_price + consumers: + - shadow_ledger_table + description: 종목별 1차 익절가(원) +v11_contradiction_metrics: + cash_immediately_raisable_krw: + canonical_source: cash_recovery_optimizer_v4.json.cash_shortfall_min_krw + contradiction_sites: + - section: cash_recovery_plan_crdl + value: 57841575 + - section: engine_audit_sell_classification + value: 59399085 + description: 즉시 조달 가능 현금(원) + fallback_sources: + - smart_cash_recovery_v8.json.cash_recovered_krw + tolerance_abs: 0 + unit: krw + cash_shortfall_target_krw: + canonical_source: cash_recovery_optimizer_v4.json.cash_shortfall_min_krw + contradiction_sites: + - section: executive_brief + value: 38671178 + - section: single_conclusion + value: 47769737 + description: 현금 목표 부족액(원) + fallback_sources: + - operational_truth_score_v1.json.cash_shortfall_min_krw + tolerance_abs: 0 + unit: krw + confidence_cap: + canonical_source: imputed_data_exposure_gate_v2.json.effective_confidence_honest + contradiction_sites: + - note: schema_presence 기반 — 거짓 + section: investment_quality_headline + value: 93.0 + - note: honest 기반 — canonical + section: engine_audit_imputed_exposure_honest + value: 88.4 + description: 신뢰도 캡(0~100) — honest 기준 + notes: 88.4가 canonical. 93.0은 schema_presence 기반 거짓 캡이므로 폐기. + tolerance_abs: 0.1 + unit: score + final_score: + canonical_source: scores_harness_v1.json.final_score.value + contradiction_sites: + - section: engine_audit_scores + value: 40.5 + - note: 재계산값 — canonical 40.5 사용 + section: performance_monitoring_dashboard + value: 45.3 + description: 종합 전략 점수(0~100) + tolerance_abs: 0.5 + unit: score + horizon_cap_mid_pct: + canonical_source: horizon_allocation_guard_v2.json.mid_cap + contradiction_sites: + - section: horizon_allocation_lock_v1 + value: 45 + - section: engine_audit_routing + value: 50 + description: 중기 호라이즌 비중 상한(%) + tolerance_abs: 1.0 + unit: percent + horizon_cap_short_pct: + canonical_source: horizon_allocation_guard_v2.json.short_cap + description: 단기 호라이즌 비중 상한(%) + fallback_sources: + - spec/strategy/horizon_allocation_v1.yaml.rules.HA002.condition + notes: 엔진 감사 short_cap=40%, horizon_routing_lock short_threshold=40% + tolerance_abs: 1.0 + unit: percent + mid_horizon_pct: + canonical_source: horizon_classification_v1.json.allocation_pct.MID + description: 중기 호라이즌 비중(%) + tolerance_abs: 0.1 + unit: percent + operational_truth_score: + canonical_source: operational_truth_score_v1.json.score_0_100 + contradiction_sites: + - section: operational_truth_score_section + value: 80.86 + - note: 재계산값 — canonical 80.86 사용 + section: performance_monitoring_dashboard + value: 89.12 + description: 운영 진실 점수(0~100) + tolerance_abs: 0.1 + unit: score + performance_readiness_score: + canonical_source: operational_truth_score_v1.json.performance_readiness_score + contradiction_sites: + - section: operational_truth_score_section + value: 37.2 + - note: 50은 비활성 기본값 — canonical 37.2 사용 + section: performance_monitoring_dashboard + value: 50.0 + description: 성과 준비도 점수(0~100) + tolerance_abs: 0.1 + unit: score + position_weight_pct: + canonical_source: portfolio_exposure_v1.json[ticker].weight_pct + contradiction_sites: + - samsung: 44.5 + section: portfolio_risk_panel + - samsung: 44.35 + section: ejce + - samsung: 45.5 + section: executive + description: 종목별 포트폴리오 비중(%) + fallback_sources: + - prices_json[ticker].position_weight_pct + per_ticker: true + tolerance_abs: 0.1 + unit: percent + short_horizon_pct: + canonical_source: horizon_classification_v1.json.allocation_pct.SHORT + contradiction_sites: + - section: horizon_allocation_lock_v1 + value: 14.3 + - note: 보유종목 SHORT비중과 전략노출 혼동 + section: performance_monitoring_dashboard + value: 71.4 + description: 단기 호라이즌 비중(%) + tolerance_abs: 0.1 + unit: percent + t5_match_rate_pct: + canonical_source: prediction_accuracy_harness_v5.json.prediction_match_rate_pct + contradiction_sites: + - note: 전체 이력 기준 + section: outcome_eval_window_monitor + value: 35.69 + - note: decisive 케이스만 — 혼용 금지 + section: performance_monitoring_dashboard + value: 73.24 + description: T+5 예측 방향 일치율(%) + fallback_sources: + - outcome_quality_score_v1.json.metrics.t5_operational_pass_rate + notes: canonical = prediction_accuracy_harness_v5.prediction_match_rate_pct(47.28). + 표본 정의 혼용 금지. + tolerance_abs: 0.5 + unit: percent + unrealized_return_pct: + canonical_source: prices_json[ticker].profit_pct + contradiction_sites: + - samsung: 98.0 + section: position_dashboard + - samsung: 96.44 + section: profit_preservation_table + - samsung: 96.4 + section: decision_trace + description: 종목별 미실현 수익률(%) + per_ticker: true + tolerance_abs: 0.1 + unit: percent + value_damage_pct: + canonical_source: smart_cash_recovery_v8.json.raw_value_damage_pct_avg + contradiction_sites: + - correct_value: 15.7 + section: final_execution_decision + wrong_value: 0.0 + - correct_value: 15.7 + section: cash_recovery_plan_crdl + wrong_value: 0.0 + description: 현금확보 매도의 가치훼손율(%) — raw 기준 + fallback_sources: + - smart_cash_recovery_v7.json.raw_value_damage_pct_avg + - smart_cash_recovery_v9.json.raw_value_damage_pct_avg + notes: raw=15.7%가 canonical. adjusted=0.0 단독 표기는 RAW_VS_ADJUSTED_DISCLOSURE_V1 + 위반. + tolerance_abs: 0.1 + unit: percent +version: '2026-05-29' diff --git a/spec/26_behavioral_coverage_contract.yaml b/spec/26_behavioral_coverage_contract.yaml index afcb8c5..8e93b86 100644 --- a/spec/26_behavioral_coverage_contract.yaml +++ b/spec/26_behavioral_coverage_contract.yaml @@ -1,408 +1,365 @@ behavioral_coverage_contract: + behavioral_coverage_definition: + denominator: 숫자·enum 출력을 가진 decision-critical 공식 수 + formula: behavioral_coverage_pct = (numerator / denominator) * 100 + numerator: ≥1개 golden case가 PASS인 decision-critical 공식 수 + pass_threshold: 100.0 + code_path: tools/validate_behavioral_coverage_v1.py + completion_gate: + behavioral_coverage_pct_min: 100.0 + golden_case_min_per_formula: 1 + implementation_divergence_count_max: 0 + provenance_allowed: + - HAND_COMPUTED + - SPEC_DERIVED + decision_critical_formulas: + - category: price + gas_file: gas_lib.gs + gas_function: tickNormalize_ + id: TICK_NORMALIZER_V1 + known_divergence: GAS=Math.floor, Python=round → 비정확 배수에서 결과 상이 + milestone: 1 + python_mirror: compute_formula_outputs.normalize_tick + spec_intent: KRX HTS 입력용 floor-to-tick (GAS 동작이 spec 의도에 부합) + - category: price + gas_file: gas_data_feed.gs + gas_function: calcSellPriceSanityV2_ + id: SELL_PRICE_SANITY_V1 + milestone: 1 + note: GAS V2 함수명 상이 — 로직 일치 여부 검증 필요 + python_mirror: compute_formula_outputs.check_sell_price_sanity + - category: price + gas_file: gas_data_feed.gs + gas_function: null + id: PULLBACK_ENTRY_TRIGGER_V1 + milestone: 1 + note: GAS에서 calcPullbackTrigger_ 독립 함수 미확인 — calcAntiLateEntryGateV2Impl_ 내부 로직으로 + 통합 + python_mirror: compute_formula_outputs.compute_pullback_trigger + - category: price + gas_file: gas_data_feed.gs + gas_function: null + id: PROFIT_RATCHET_TIERED_V2 + milestone: 1 + note: GAS calcPrices_ 내부에 인라인 — 독립 함수 미확인 + python_mirror: compute_formula_outputs.compute_trailing_stop_v2 + - category: price + gas_file: gas_data_feed.gs + gas_function: null + id: PROFIT_LOCK_STAGE_V1 + known_divergence: 'Python: APEX_SUPER(>=60),APEX_TRAILING(>=40),PROFIT_LOCK_30,PROFIT_LOCK_20,PROFIT_LOCK_10,BREAKEVEN_RATCHET,NORMAL + + GAS calcPrices_: PROFIT_LOCK_STAGE_50(>=50),PROFIT_LOCK_STAGE_30,PROFIT_LOCK_STAGE_20,PROFIT_LOCK_STAGE_10,NORMAL + + stage 명칭·임계값 모두 불일치 — B06 정정 필수 + + ' + milestone: 1 + python_mirror: compute_formula_outputs.classify_profit_lock_stage + - category: price + gas_file: gas_data_feed.gs + gas_function: calcStopAdequacyRows_ + id: STOP_PRICE_ADEQUACY_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 필요 + python_mirror: null + - category: sizing + gas_file: gas_data_feed.gs + gas_function: calcRegimeSizeScale_ + id: POSITION_SIZE_REGIME_SCALE_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: sizing + gas_file: gas_data_feed.gs + gas_function: calcDrawdownGuard_ + id: DRAWDOWN_GUARD_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: sizing + gas_file: null + gas_function: null + id: CASH_RECOVERY_OPTIMIZER_V1 + milestone: 1 + note: Python-only formula. GAS 미러 없음(Python tool 전용). + python_mirror: compute_formula_outputs.compute_cash_recovery_optimizer + - category: sizing + gas_function: null + id: VALUE_PRESERVATION_SCORER_V1 + milestone: 1 + note: tools/build_value_preservation_scorer_v1.py 전용 — Python 미러 추출 필요 + python_mirror: null + - category: sizing + gas_file: gas_data_feed.gs + gas_function: calcTpQuantityLadder_ + id: TP_QUANTITY_LADDER_V1 + milestone: 2 + - category: entry_gate + gas_function: inline_calcAntiLateEntryGateV2Impl_ + id: VELOCITY_V1 + milestone: 1 + note: velocity_1d = (close-prevClose)/prevClose*100 — 양측 인라인 계산 + python_mirror: inline + - category: entry_gate + gas_file: gas_apex_alpha_watch.gs + gas_function: calcAntiLateEntryGateV2Impl_ + id: ANTI_LATE_ENTRY_GATE_V2 + milestone: 1 + note: Python에서 gate1만 compute_anti_chasing으로 분리됨 — 전체 3-gate 검증은 GAS 위주 + python_mirror: null + - category: entry_gate + gas_function: null + id: ANTI_CHASING_VELOCITY_V1 + milestone: 1 + note: ANTI_LATE_ENTRY_GATE_V2의 gate1 서브셋 — Python 독립 구현 + python_mirror: compute_formula_outputs.compute_anti_chasing + - category: entry_gate + gas_function: null + id: FLOW_CREDIT_V1 + milestone: 2 + note: GAS 내부 인라인 — spec/13_formula_registry.yaml expression 존재 + - category: entry_gate + gas_file: gas_data_feed.gs + gas_function: calcBreakoutQualityGate_ + id: BREAKOUT_QUALITY_GATE_V2 + milestone: 2 + - category: entry_gate + gas_file: gas_data_feed.gs + gas_function: calcAntiWhipsawGate_ + id: ANTI_WHIPSAW_GATE_V1 + milestone: 2 + - category: entry_gate + gas_file: gas_data_feed.gs + gas_function: calcPositionCountLimit_ + id: POSITION_COUNT_LIMIT_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: entry_gate + gas_file: gas_data_feed.gs + gas_function: calcWinLossStreakGuard_ + id: WIN_LOSS_STREAK_GUARD_V1 + milestone: 2 + - category: distribution + gas_file: gas_data_feed.gs + gas_function: calcDistributionRiskRow_ + id: DISTRIBUTION_SELL_DETECTOR_V1 + milestone: 2 + note: 6+2 신호 가중합산. SIG_5(OBV기울기) GAS 구현 확인 필요 + - category: distribution + gas_file: gas_data_feed.gs + gas_function: calcDistributionRiskRow_ + id: PRE_DISTRIBUTION_EARLY_WARNING_V1 + milestone: 2 + note: calcDistributionRiskRow_ 내 pre_distribution_warning 필드로 출력 + - category: distribution + gas_file: gas_data_feed.gs + gas_function: calcSectorRotationMomentum_ + id: SECTOR_ROTATION_MOMENTUM_V1 + milestone: 2 + - category: cash_sell + gas_file: gas_data_feed.gs + gas_function: calcDynamicHeatThresholds_ + id: DYNAMIC_HEAT_GATE_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: cash_sell + gas_file: gas_data_feed.gs + gas_function: calcCashFloor_ + id: CASH_FLOOR_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: cash_sell + gas_file: gas_data_feed.gs + gas_function: calcCashShortfallHarness_ + id: CASH_SHORTFALL_V1 + milestone: 2 + - category: cash_sell + gas_function: null + id: K2_STAGED_REBOUND_SELL_V1 + milestone: 2 + note: spec/13b_harness_formulas.yaml에 정의. GAS calcApexTradePlan_ 내부 + - category: cash_sell + id: SELL_WATERFALL_ENGINE_V2 + milestone: 2 + note: tools/build_sell_waterfall_engine_v2.py 전용 + python_mirror: null + - category: cash_sell + gas_file: gas_data_feed.gs + gas_function: calcRegimeTrimGuidance_ + id: REGIME_TRIM_GUIDANCE_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcRegimeCashUplift_ + id: REGIME_CASH_UPLIFT_V1 + milestone: 1 + note: Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 + python_mirror: null + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcSemiconductorClusterGate_ + id: SEMICONDUCTOR_CLUSTER_GATE_V1 + milestone: 1 + note: Python 미러 미구현 + python_mirror: null + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcSinglePositionWeightCap_ + id: SINGLE_POSITION_WEIGHT_CAP_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcPortfolioBetaGate_ + id: PORTFOLIO_BETA_GATE_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcSectorConcentrationGate_ + id: SECTOR_CONCENTRATION_LIMIT_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcPortfolioDrawdownGate_ + id: PORTFOLIO_DRAWDOWN_GATE_V1 + milestone: 2 + - category: portfolio_gate + id: FINAL_JUDGMENT_GATE_V1 + milestone: 2 + note: tools/build_final_judgment_gate_v1.py 전용 — AND-11 복합 게이트 + python_mirror: null + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcStopBreachAlert_ + id: STOP_BREACH_ALERT_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcTpTriggerAlert_ + id: TP_TRIGGER_ALERT_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcHeatConcentrationAlert_ + id: HEAT_CONCENTRATION_ALERT_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcPortfolioHealthScore_ + id: PORTFOLIO_HEALTH_SCORE_V1 + milestone: 2 + - category: portfolio_gate + gas_file: gas_data_feed.gs + gas_function: calcProfitPreservationRow_ + id: BREAKEVEN_RATCHET_V1 + milestone: 2 + evidence_artifacts: + - Temp/formula_behavioral_coverage_v1.json + - Temp/formula_gas_parity_v1.json formula_id: BEHAVIORAL_COVERAGE_CONTRACT_V1 has_code_implementation: true - code_path: "tools/validate_behavioral_coverage_v1.py" - version: "2026-05-30" - objective: | - "formula_id 문자열이 .gs 텍스트에 등장한다" 는 문자열 커버리지(presence-based)를 폐기하고 - "주어진 입력에 대해 golden(손계산 정답) == Python미러 == GAS미러 가 허용오차 내 일치한다" - 는 행위기반 커버리지(behavioral coverage)로 전환한다. - 구조적 거짓(결함 1)을 제거하기 위한 근본 측정 기반. - - # 수치로 정의된 완료점 (completion gate) - completion_gate: - behavioral_coverage_pct_min: 100.0 # decision-critical 공식 전부 1개 이상 통과 케이스 - implementation_divergence_count_max: 0 # Python 미러 ≠ GAS 미러 건수 반드시 0 - golden_case_min_per_formula: 1 # 공식당 최소 1개 golden case 필수 - provenance_allowed: # expected 값의 허용 출처 — 구현 역복사 금지 - - HAND_COMPUTED # 공식 정의(spec/13)에서 손으로 1회 계산 - - SPEC_DERIVED # spec/13 expression을 기계적 치환한 결과 - - # 행위기반 커버리지 정의 - behavioral_coverage_definition: - numerator: "≥1개 golden case가 PASS인 decision-critical 공식 수" - denominator: "숫자·enum 출력을 가진 decision-critical 공식 수" - formula: "behavioral_coverage_pct = (numerator / denominator) * 100" - pass_threshold: 100.0 - - # 3-way 동등성 게이트 - three_way_gate: - python_vs_golden_tolerance: "각 공식 케이스 yaml의 tolerance 필드 기준" - gas_vs_golden_tolerance: "동일" - divergence_definition: | - python_output ≠ gas_output (허용오차 초과) 이면 IMPLEMENTATION_DIVERGENCE. - 이는 "yaml 지침과 구현이 다른 숫자를 낸다"는 직접 증거이며 B06에서 근본 정정 필요. - divergence_resolution: | - spec/13_formula_registry.yaml 의 expression이 기준. - GAS 또는 Python 중 spec에서 벗어난 쪽을 수정한다. - LLM 추정으로 수정 금지. spec expression 기계적 적용. - - # decision-critical 40개 공식 명단 - # milestone_1 = 이번 작업(golden case 작성 + 3-way 검증 대상) - # milestone_2 = 후속 단계 - decision_critical_formulas: - - # ── 가격 산출 공식 (6) ────────────────────────────────────────────── - - id: TICK_NORMALIZER_V1 - milestone: 1 - category: price - python_mirror: compute_formula_outputs.normalize_tick - gas_function: tickNormalize_ - gas_file: gas_lib.gs - known_divergence: "GAS=Math.floor, Python=round → 비정확 배수에서 결과 상이" - spec_intent: "KRX HTS 입력용 floor-to-tick (GAS 동작이 spec 의도에 부합)" - - - id: SELL_PRICE_SANITY_V1 - milestone: 1 - category: price - python_mirror: compute_formula_outputs.check_sell_price_sanity - gas_function: calcSellPriceSanityV2_ - gas_file: gas_data_feed.gs - note: "GAS V2 함수명 상이 — 로직 일치 여부 검증 필요" - - - id: PULLBACK_ENTRY_TRIGGER_V1 - milestone: 1 - category: price - python_mirror: compute_formula_outputs.compute_pullback_trigger - gas_function: null - gas_file: gas_data_feed.gs - note: "GAS에서 calcPullbackTrigger_ 독립 함수 미확인 — calcAntiLateEntryGateV2Impl_ 내부 로직으로 통합" - - - id: PROFIT_RATCHET_TIERED_V2 - milestone: 1 - category: price - python_mirror: compute_formula_outputs.compute_trailing_stop_v2 - gas_function: null - gas_file: gas_data_feed.gs - note: "GAS calcPrices_ 내부에 인라인 — 독립 함수 미확인" - - - id: PROFIT_LOCK_STAGE_V1 - milestone: 1 - category: price - python_mirror: compute_formula_outputs.classify_profit_lock_stage - gas_function: null - gas_file: gas_data_feed.gs - known_divergence: | - Python: APEX_SUPER(>=60),APEX_TRAILING(>=40),PROFIT_LOCK_30,PROFIT_LOCK_20,PROFIT_LOCK_10,BREAKEVEN_RATCHET,NORMAL - GAS calcPrices_: PROFIT_LOCK_STAGE_50(>=50),PROFIT_LOCK_STAGE_30,PROFIT_LOCK_STAGE_20,PROFIT_LOCK_STAGE_10,NORMAL - stage 명칭·임계값 모두 불일치 — B06 정정 필수 - - - id: STOP_PRICE_ADEQUACY_V1 - milestone: 1 - category: price - python_mirror: null - gas_function: calcStopAdequacyRows_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가 필요" - - # ── 수량·사이징 공식 (5) ──────────────────────────────────────────── - - id: POSITION_SIZE_REGIME_SCALE_V1 - milestone: 1 - category: sizing - python_mirror: null - gas_function: calcRegimeSizeScale_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: DRAWDOWN_GUARD_V1 - milestone: 1 - category: sizing - python_mirror: null - gas_function: calcDrawdownGuard_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: CASH_RECOVERY_OPTIMIZER_V1 - milestone: 1 - category: sizing - python_mirror: compute_formula_outputs.compute_cash_recovery_optimizer - gas_function: null - gas_file: null - note: "Python-only formula. GAS 미러 없음(Python tool 전용)." - - - id: VALUE_PRESERVATION_SCORER_V1 - milestone: 1 - category: sizing - python_mirror: null - gas_function: null - note: "tools/build_value_preservation_scorer_v1.py 전용 — Python 미러 추출 필요" - - - id: TP_QUANTITY_LADDER_V1 - milestone: 2 - category: sizing - gas_function: calcTpQuantityLadder_ - gas_file: gas_data_feed.gs - - # ── 진입 게이트 공식 (8) ──────────────────────────────────────────── - - id: VELOCITY_V1 - milestone: 1 - category: entry_gate - python_mirror: inline - gas_function: inline_calcAntiLateEntryGateV2Impl_ - note: "velocity_1d = (close-prevClose)/prevClose*100 — 양측 인라인 계산" - - - id: ANTI_LATE_ENTRY_GATE_V2 - milestone: 1 - category: entry_gate - python_mirror: null - gas_function: calcAntiLateEntryGateV2Impl_ - gas_file: gas_apex_alpha_watch.gs - note: "Python에서 gate1만 compute_anti_chasing으로 분리됨 — 전체 3-gate 검증은 GAS 위주" - - - id: ANTI_CHASING_VELOCITY_V1 - milestone: 1 - category: entry_gate - python_mirror: compute_formula_outputs.compute_anti_chasing - gas_function: null - note: "ANTI_LATE_ENTRY_GATE_V2의 gate1 서브셋 — Python 독립 구현" - - - id: FLOW_CREDIT_V1 - milestone: 2 - category: entry_gate - gas_function: null - note: "GAS 내부 인라인 — spec/13_formula_registry.yaml expression 존재" - - - id: BREAKOUT_QUALITY_GATE_V2 - milestone: 2 - category: entry_gate - gas_function: calcBreakoutQualityGate_ - gas_file: gas_data_feed.gs - - - id: ANTI_WHIPSAW_GATE_V1 - milestone: 2 - category: entry_gate - gas_function: calcAntiWhipsawGate_ - gas_file: gas_data_feed.gs - - - id: POSITION_COUNT_LIMIT_V1 - milestone: 1 - category: entry_gate - python_mirror: null - gas_function: calcPositionCountLimit_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: WIN_LOSS_STREAK_GUARD_V1 - milestone: 2 - category: entry_gate - gas_function: calcWinLossStreakGuard_ - gas_file: gas_data_feed.gs - - # ── 분배·설거지 탐지 공식 (3) ────────────────────────────────────── - - id: DISTRIBUTION_SELL_DETECTOR_V1 - milestone: 2 - category: distribution - gas_function: calcDistributionRiskRow_ - gas_file: gas_data_feed.gs - note: "6+2 신호 가중합산. SIG_5(OBV기울기) GAS 구현 확인 필요" - - - id: PRE_DISTRIBUTION_EARLY_WARNING_V1 - milestone: 2 - category: distribution - gas_function: calcDistributionRiskRow_ - gas_file: gas_data_feed.gs - note: "calcDistributionRiskRow_ 내 pre_distribution_warning 필드로 출력" - - - id: SECTOR_ROTATION_MOMENTUM_V1 - milestone: 2 - category: distribution - gas_function: calcSectorRotationMomentum_ - gas_file: gas_data_feed.gs - - # ── 현금·매도 엔진 공식 (6) ──────────────────────────────────────── - - id: DYNAMIC_HEAT_GATE_V1 - milestone: 1 - category: cash_sell - python_mirror: null - gas_function: calcDynamicHeatThresholds_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: CASH_FLOOR_V1 - milestone: 1 - category: cash_sell - python_mirror: null - gas_function: calcCashFloor_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: CASH_SHORTFALL_V1 - milestone: 2 - category: cash_sell - gas_function: calcCashShortfallHarness_ - gas_file: gas_data_feed.gs - - - id: K2_STAGED_REBOUND_SELL_V1 - milestone: 2 - category: cash_sell - gas_function: null - note: "spec/13b_harness_formulas.yaml에 정의. GAS calcApexTradePlan_ 내부" - - - id: SELL_WATERFALL_ENGINE_V2 - milestone: 2 - category: cash_sell - python_mirror: null - note: "tools/build_sell_waterfall_engine_v2.py 전용" - - - id: REGIME_TRIM_GUIDANCE_V1 - milestone: 2 - category: cash_sell - gas_function: calcRegimeTrimGuidance_ - gas_file: gas_data_feed.gs - - # ── 포트폴리오 게이트 공식 (12) ──────────────────────────────────── - - id: REGIME_CASH_UPLIFT_V1 - milestone: 1 - category: portfolio_gate - python_mirror: null - gas_function: calcRegimeCashUplift_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현 — run_formula_golden_cases_v2.py에 추가" - - - id: SEMICONDUCTOR_CLUSTER_GATE_V1 - milestone: 1 - category: portfolio_gate - python_mirror: null - gas_function: calcSemiconductorClusterGate_ - gas_file: gas_data_feed.gs - note: "Python 미러 미구현" - - - id: SINGLE_POSITION_WEIGHT_CAP_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcSinglePositionWeightCap_ - gas_file: gas_data_feed.gs - - - id: PORTFOLIO_BETA_GATE_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcPortfolioBetaGate_ - gas_file: gas_data_feed.gs - - - id: SECTOR_CONCENTRATION_LIMIT_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcSectorConcentrationGate_ - gas_file: gas_data_feed.gs - - - id: PORTFOLIO_DRAWDOWN_GATE_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcPortfolioDrawdownGate_ - gas_file: gas_data_feed.gs - - - id: FINAL_JUDGMENT_GATE_V1 - milestone: 2 - category: portfolio_gate - python_mirror: null - note: "tools/build_final_judgment_gate_v1.py 전용 — AND-11 복합 게이트" - - - id: STOP_BREACH_ALERT_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcStopBreachAlert_ - gas_file: gas_data_feed.gs - - - id: TP_TRIGGER_ALERT_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcTpTriggerAlert_ - gas_file: gas_data_feed.gs - - - id: HEAT_CONCENTRATION_ALERT_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcHeatConcentrationAlert_ - gas_file: gas_data_feed.gs - - - id: PORTFOLIO_HEALTH_SCORE_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcPortfolioHealthScore_ - gas_file: gas_data_feed.gs - - - id: BREAKEVEN_RATCHET_V1 - milestone: 2 - category: portfolio_gate - gas_function: calcProfitPreservationRow_ - gas_file: gas_data_feed.gs - - # milestone_1+2 달성 현황 (2026-05-30 기준) — 실제 골든케이스 보유 공식 milestone_1_count: 37 milestone_1_target_formulas: - # 원래 milestone_1 (18개) - - TICK_NORMALIZER_V1 - - SELL_PRICE_SANITY_V1 - - PULLBACK_ENTRY_TRIGGER_V1 - - PROFIT_RATCHET_TIERED_V2 - - PROFIT_LOCK_STAGE_V1 - - STOP_PRICE_ADEQUACY_V1 - - POSITION_SIZE_REGIME_SCALE_V1 - - DRAWDOWN_GUARD_V1 - - CASH_RECOVERY_OPTIMIZER_V1 - - VALUE_PRESERVATION_SCORER_V1 - - VELOCITY_V1 - - ANTI_LATE_ENTRY_GATE_V2 - - ANTI_CHASING_VELOCITY_V1 - - POSITION_COUNT_LIMIT_V1 - - DYNAMIC_HEAT_GATE_V1 - - CASH_FLOOR_V1 - - REGIME_CASH_UPLIFT_V1 - - SEMICONDUCTOR_CLUSTER_GATE_V1 - # milestone_2 달성 (추가 19개) - - WIN_LOSS_STREAK_GUARD_V1 - - SINGLE_POSITION_WEIGHT_CAP_V1 # LEADER_POSITION_WEIGHT_CAP_V1로 강화 - - REGIME_TRIM_GUIDANCE_V1 - - HEAT_CONCENTRATION_ALERT_V1 - - SECTOR_CONCENTRATION_LIMIT_V1 - - CASH_SHORTFALL_V1 - - K2_STAGED_REBOUND_SELL_V1 - - PORTFOLIO_DRAWDOWN_GATE_V1 - - PROFIT_LOCK_STAGE_V1 # GAS 단계명 정정 포함 (B06) - # 반도체 집중 허용 하네스 (신규) - - MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - - LEADER_POSITION_WEIGHT_CAP_V1 + - TICK_NORMALIZER_V1 + - SELL_PRICE_SANITY_V1 + - PULLBACK_ENTRY_TRIGGER_V1 + - PROFIT_RATCHET_TIERED_V2 + - PROFIT_LOCK_STAGE_V1 + - STOP_PRICE_ADEQUACY_V1 + - POSITION_SIZE_REGIME_SCALE_V1 + - DRAWDOWN_GUARD_V1 + - CASH_RECOVERY_OPTIMIZER_V1 + - VALUE_PRESERVATION_SCORER_V1 + - VELOCITY_V1 + - ANTI_LATE_ENTRY_GATE_V2 + - ANTI_CHASING_VELOCITY_V1 + - POSITION_COUNT_LIMIT_V1 + - DYNAMIC_HEAT_GATE_V1 + - CASH_FLOOR_V1 + - REGIME_CASH_UPLIFT_V1 + - SEMICONDUCTOR_CLUSTER_GATE_V1 + - WIN_LOSS_STREAK_GUARD_V1 + - SINGLE_POSITION_WEIGHT_CAP_V1 + - REGIME_TRIM_GUIDANCE_V1 + - HEAT_CONCENTRATION_ALERT_V1 + - SECTOR_CONCENTRATION_LIMIT_V1 + - CASH_SHORTFALL_V1 + - K2_STAGED_REBOUND_SELL_V1 + - PORTFOLIO_DRAWDOWN_GATE_V1 + - PROFIT_LOCK_STAGE_V1 + - MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + - LEADER_POSITION_WEIGHT_CAP_V1 + objective: '"formula_id 문자열이 .gs 텍스트에 등장한다" 는 문자열 커버리지(presence-based)를 폐기하고 - # 산출 증빙 아티팩트 - evidence_artifacts: - - Temp/formula_behavioral_coverage_v1.json - - Temp/formula_gas_parity_v1.json + "주어진 입력에 대해 golden(손계산 정답) == Python미러 == GAS미러 가 허용오차 내 일치한다" - # 완료 거부 조건 (Reject Conditions) - reject_conditions: - - "implementation_divergence_count > 0 인데 '완료' 선언" - - "golden expected 값을 .gs 출력에서 역복사 (순환논리 — spec/13 expression에서 독립 계산해야 함)" - - "예측 정확도를 '100% 달성'으로 서술 (truthfulness_guard 위반)" - - "임계값·가격·수량을 LLM 추정으로 생성" + 는 행위기반 커버리지(behavioral coverage)로 전환한다. - # 명령어 목록 (저성능 LLM도 따라 실행 가능) + 구조적 거짓(결함 1)을 제거하기 위한 근본 측정 기반. + + ' ordered_commands: - - id: B01 - command: "# 이 파일 생성 완료" - expect: {file_exists: "spec/26_behavioral_coverage_contract.yaml"} - - id: B02 - command: "# spec/formula_golden_cases_v2.yaml 작성" - expect: {cases_total_min: 18, provenance: "HAND_COMPUTED or SPEC_DERIVED only"} - - id: B03 - command: "python tools/run_formula_golden_cases_v2.py" - expect: {python_fail: 0, output: "Temp/formula_behavioral_coverage_v1.json"} - fail_code: BCH_PY_MIRROR_FAIL - - id: B04 - command: "node tools/run_gas_golden_parity.js" - expect: {gas_pass_min: 1, output: "Temp/formula_gas_parity_v1.json"} - fail_code: BCH_GAS_PARITY_FAIL - - id: B05 - command: "python tools/validate_behavioral_coverage_v1.py" - expect: - status_token: BEHAVIORAL_COVERAGE_V1_OK - behavioral_coverage_pct: 100.0 - implementation_divergence_count: 0 - fail_code: BEHAVIORAL_COVERAGE_V1_FAIL - - id: B06 - command: "# divergence 발견 시 spec/13 기준으로 GAS 또는 Python 수정" - expect: {divergence_count: 0} - fail_code: BCH_DIVERGENCE_OPEN - - id: B07 - command: "npm run validate-behavioral-coverage" - expect: {exit_code: 0} - fail_code: BCH_WIRING_FAIL + - command: '# 이 파일 생성 완료' + expect: + file_exists: spec/26_behavioral_coverage_contract.yaml + id: B01 + - command: '# spec/formula_golden_cases_v2.yaml 작성' + expect: + cases_total_min: 18 + provenance: HAND_COMPUTED or SPEC_DERIVED only + id: B02 + - command: python tools/run_formula_golden_cases_v2.py + expect: + output: Temp/formula_behavioral_coverage_v1.json + python_fail: 0 + fail_code: BCH_PY_MIRROR_FAIL + id: B03 + - command: node tools/run_gas_golden_parity.js + expect: + gas_pass_min: 1 + output: Temp/formula_gas_parity_v1.json + fail_code: BCH_GAS_PARITY_FAIL + id: B04 + - command: python tools/validate_behavioral_coverage_v1.py + expect: + behavioral_coverage_pct: 100.0 + implementation_divergence_count: 0 + status_token: BEHAVIORAL_COVERAGE_V1_OK + fail_code: BEHAVIORAL_COVERAGE_V1_FAIL + id: B05 + - command: '# divergence 발견 시 spec/13 기준으로 GAS 또는 Python 수정' + expect: + divergence_count: 0 + fail_code: BCH_DIVERGENCE_OPEN + id: B06 + - command: npm run validate-behavioral-coverage + expect: + exit_code: 0 + fail_code: BCH_WIRING_FAIL + id: B07 + reject_conditions: + - implementation_divergence_count > 0 인데 '완료' 선언 + - golden expected 값을 .gs 출력에서 역복사 (순환논리 — spec/13 expression에서 독립 계산해야 함) + - 예측 정확도를 '100% 달성'으로 서술 (truthfulness_guard 위반) + - 임계값·가격·수량을 LLM 추정으로 생성 + three_way_gate: + divergence_definition: 'python_output ≠ gas_output (허용오차 초과) 이면 IMPLEMENTATION_DIVERGENCE. + + 이는 "yaml 지침과 구현이 다른 숫자를 낸다"는 직접 증거이며 B06에서 근본 정정 필요. + + ' + divergence_resolution: 'spec/13_formula_registry.yaml 의 expression이 기준. + + GAS 또는 Python 중 spec에서 벗어난 쪽을 수정한다. + + LLM 추정으로 수정 금지. spec expression 기계적 적용. + + ' + gas_vs_golden_tolerance: 동일 + python_vs_golden_tolerance: 각 공식 케이스 yaml의 tolerance 필드 기준 + version: '2026-05-30' +meta: + has_code_implementation: false diff --git a/spec/32_canonical_artifact_resolver.yaml b/spec/32_canonical_artifact_resolver.yaml index 1a8bb68..d3434b8 100644 --- a/spec/32_canonical_artifact_resolver.yaml +++ b/spec/32_canonical_artifact_resolver.yaml @@ -1,106 +1,99 @@ -schema_version: 2026-06-03-canonical-artifact-resolver-v2 -formula_id: CANONICAL_ARTIFACT_RESOLVER_V2 -supersedes: CANONICAL_ARTIFACT_RESOLVER_V1 -has_code_implementation: true -code_path: - - "tools/build_canonical_artifact_resolver_v1.py" - - "tools/validate_canonical_artifact_resolver_v1.py" -purpose: > - 산출물 단일 진실원장과 stale reference 차단. - RC5 수정: 동일 개념의 다중 버전이 상호충돌·기술부채를 만든다. - 버전별 1개 canonical만 게이트 입력으로 허용. - -# ── canonical 버전 맵 (개념별 최신·권위 버전 단일 지정) ───────────────────── +acceptance_criteria: + canonical_per_concept: + note: 개념별 canonical == 1 (다중 권위본 0건) + op: == + target: 1 + gate_input_canonical_pct: + note: 게이트 입력 파일 100%가 canonical map에 존재 + op: == + target: 100 +canonical_source_precedence: +- final_decision_packet_active +- final_execution_decision_v4 +- smart_cash_recovery_v9 +- smart_cash_recovery_v8 +- engine_audit_v1 +- sell_engine_audit_v1 canonical_versions: - smart_cash_recovery: - canonical: smart_cash_recovery_v9.json - deprecated: - - smart_cash_recovery_v8.json - - smart_cash_recovery_v7.json - - smart_cash_recovery_v6.json - - smart_cash_recovery_v5.json - - smart_cash_recovery_v4.json - - smart_cash_recovery_v3.json - gate_input_allowed: smart_cash_recovery_v9.json - note: "v9부터 VALUE_PRESERVING_CASH_RAISE_V9 정책 적용 (BREACH_FULL_LIQUIDATION 금지)" - - distribution_risk_score: - canonical: distribution_risk_score_v4.json - deprecated: - - distribution_risk_score_v3.json - - distribution_risk_score_v2.json - gate_input_allowed: distribution_risk_score_v4.json - - final_execution_decision: - canonical: final_execution_decision_v4.json - deprecated: - - final_execution_decision_v3.json - - final_execution_decision_v2.json - - final_execution_decision_v1.json - gate_input_allowed: final_execution_decision_v4.json - alpha_lead_threshold_optimizer: canonical: alpha_lead_threshold_optimizer_v3.json deprecated: - - alpha_lead_threshold_optimizer_v2.json - - alpha_lead_threshold_optimizer_v1.json + - alpha_lead_threshold_optimizer_v2.json + - alpha_lead_threshold_optimizer_v1.json gate_input_allowed: alpha_lead_threshold_optimizer_v3.json - - pass_100_criteria: - canonical: pass_100_criteria_v3.json - deprecated: - - pass_100_criteria_v2.json - - pass_100_criteria_v1.json - gate_input_allowed: pass_100_criteria_v3.json - note: "v3에 RELEASE_GATE_TRUTH_V1 추가됨 (TASK-001)" - - prediction_accuracy_harness: - canonical: prediction_accuracy_harness_v5.json - deprecated: - - prediction_accuracy_harness_v4.json - - prediction_accuracy_harness_v3.json - - prediction_accuracy_harness_v2.json - gate_input_allowed: prediction_accuracy_harness_v5.json - - smart_money_liquidity_evidence_gate: - canonical: smart_money_liquidity_evidence_gate_v5.json - deprecated: - - smart_money_liquidity_evidence_gate_v4.json - - smart_money_liquidity_evidence_gate_v3.json - - smart_money_liquidity_evidence_gate_v2.json - gate_input_allowed: smart_money_liquidity_evidence_gate_v5.json - - canonical_metrics: - canonical: canonical_metrics_v4.json - deprecated: - - canonical_metrics_v3.json - - canonical_metrics_v2.json - - canonical_metrics_v1.json - gate_input_allowed: canonical_metrics_v4.json - anti_late_entry_pullback_gate: canonical: anti_late_entry_pullback_gate_v4.json deprecated: - - anti_late_entry_pullback_gate_v3.json + - anti_late_entry_pullback_gate_v3.json gate_input_allowed: anti_late_entry_pullback_gate_v4.json + canonical_metrics: + canonical: canonical_metrics_v4.json + deprecated: + - canonical_metrics_v3.json + - canonical_metrics_v2.json + - canonical_metrics_v1.json + gate_input_allowed: canonical_metrics_v4.json + distribution_risk_score: + canonical: distribution_risk_score_v4.json + deprecated: + - distribution_risk_score_v3.json + - distribution_risk_score_v2.json + gate_input_allowed: distribution_risk_score_v4.json + final_execution_decision: + canonical: final_execution_decision_v4.json + deprecated: + - final_execution_decision_v3.json + - final_execution_decision_v2.json + - final_execution_decision_v1.json + gate_input_allowed: final_execution_decision_v4.json + pass_100_criteria: + canonical: pass_100_criteria_v3.json + deprecated: + - pass_100_criteria_v2.json + - pass_100_criteria_v1.json + gate_input_allowed: pass_100_criteria_v3.json + note: v3에 RELEASE_GATE_TRUTH_V1 추가됨 (TASK-001) + prediction_accuracy_harness: + canonical: prediction_accuracy_harness_v5.json + deprecated: + - prediction_accuracy_harness_v4.json + - prediction_accuracy_harness_v3.json + - prediction_accuracy_harness_v2.json + gate_input_allowed: prediction_accuracy_harness_v5.json + smart_cash_recovery: + canonical: smart_cash_recovery_v9.json + deprecated: + - smart_cash_recovery_v8.json + - smart_cash_recovery_v7.json + - smart_cash_recovery_v6.json + - smart_cash_recovery_v5.json + - smart_cash_recovery_v4.json + - smart_cash_recovery_v3.json + gate_input_allowed: smart_cash_recovery_v9.json + note: v9부터 VALUE_PRESERVING_CASH_RAISE_V9 정책 적용 (BREACH_FULL_LIQUIDATION 금지) + smart_money_liquidity_evidence_gate: + canonical: smart_money_liquidity_evidence_gate_v5.json + deprecated: + - smart_money_liquidity_evidence_gate_v4.json + - smart_money_liquidity_evidence_gate_v3.json + - smart_money_liquidity_evidence_gate_v2.json + gate_input_allowed: smart_money_liquidity_evidence_gate_v5.json +code_path: +- tools/build_canonical_artifact_resolver_v1.py +- tools/validate_canonical_artifact_resolver_v1.py +formula_id: CANONICAL_ARTIFACT_RESOLVER_V2 +has_code_implementation: true +meta: + has_code_implementation: false +purpose: '산출물 단일 진실원장과 stale reference 차단. RC5 수정: 동일 개념의 다중 버전이 상호충돌·기술부채를 만든다. 버전별 + 1개 canonical만 게이트 입력으로 허용. -# ── 이전 단일 원천 우선순위 (하위호환 유지) ───────────────────────────────── -canonical_source_precedence: - - final_decision_packet_active - - final_execution_decision_v4 - - smart_cash_recovery_v9 - - smart_cash_recovery_v8 - - engine_audit_v1 - - sell_engine_audit_v1 - -required_outputs: - - canonical_metrics.cash_shortfall_min_krw - - distinct_cash_shortfall_values - - stale_artifact_reference_count - -acceptance_criteria: - canonical_per_concept: {op: "==", target: 1, note: "개념별 canonical == 1 (다중 권위본 0건)"} - gate_input_canonical_pct: {op: "==", target: 100, note: "게이트 입력 파일 100%가 canonical map에 존재"} - + ' python_tool: tools/build_canonical_artifact_resolver_v1.py +required_outputs: +- canonical_metrics.cash_shortfall_min_krw +- distinct_cash_shortfall_values +- stale_artifact_reference_count +schema_version: 2026-06-03-canonical-artifact-resolver-v2 +supersedes: CANONICAL_ARTIFACT_RESOLVER_V1 validator: tools/validate_canonical_artifact_resolver_v1.py diff --git a/spec/36_goal_risk_budget_harness.yaml b/spec/36_goal_risk_budget_harness.yaml index bf1b743..45c02cd 100644 --- a/spec/36_goal_risk_budget_harness.yaml +++ b/spec/36_goal_risk_budget_harness.yaml @@ -1,35 +1,35 @@ -schema_version: 2026-06-10-goal-risk-budget-harness-v2 -formula_id: GOAL_RISK_BUDGET_HARNESS_V2 -has_code_implementation: true -code_path: "src/quant_engine/orchestration_harness_v1.py" -purpose: 5억 목표와 리스크 예산/현금 방어선 연결. 매 릴리즈 drift 추적 포함. -goal_target_krw: 500000000 -required_fields: - - goal_achievement_pct - - goal_remaining_krw - - cash_defense_line_d2_used - # P9-T03 추가: 성과 분해 필드 - - net_return_pct # 거래비용·슬리피지 제거 후 순수익률 - - gross_return_pct # 세전 총수익률 - - max_drawdown_pct # 최대낙폭 (운영 기간 전체) - - hit_rate_pct # 매수 후 T+5 기준 수익 달성 비율 - - late_entry_loss_rate_pct # 추격매수 진입 후 손실 비율 - - profit_giveback_pct # 최고점 대비 이익 반납 비율 - # P9-T03 추가: drift 추적 필드 - - risk_budget_drift_pct # 이전 릴리즈 대비 MDD 예산 변화량 - - cash_defense_drift_krw # D+2 현금 방어선 이전 릴리즈 대비 변화량 - - goal_drift_months # 목표 달성 ETA 이전 릴리즈 대비 변화량(월) -performance_decomposition_rules: - - gross_return은 표시용으로만 사용. 사이징·게이트 판단은 net_return 기준. - - max_drawdown 상한(20%)을 초과하면 신규 매수를 차단. - - 목표 달성 압박을 이유로 MDD 상한·stop 규칙을 완화하는 것을 금지. - - late_entry_loss_rate가 15%를 초과하면 anti-late-entry gate를 강화한다. - - profit_giveback이 30%를 초과하면 trailing stop 파라미터를 조정한다. +code_path: src/quant_engine/orchestration_harness_v1.py drift_gate: - risk_budget_drift_max_pct: 2.0 # 단일 릴리즈에서 MDD 예산 ±2% 초과 시 경고 - cash_defense_drift_max_krw: 5000000 # 현금 방어선 500만원 이상 축소 시 경고 - goal_drift_months_max: 1 # ETA 1개월 이상 연장 시 경고 + cash_defense_drift_max_krw: 5000000 + goal_drift_months_max: 1 + risk_budget_drift_max_pct: 2.0 +formula_id: GOAL_RISK_BUDGET_HARNESS_V2 +goal_target_krw: 500000000 +has_code_implementation: true +lifecycle_state: active +meta: + has_code_implementation: false output_in_final_packet: true owner: risk_manager -lifecycle_state: active +performance_decomposition_rules: +- gross_return은 표시용으로만 사용. 사이징·게이트 판단은 net_return 기준. +- max_drawdown 상한(20%)을 초과하면 신규 매수를 차단. +- 목표 달성 압박을 이유로 MDD 상한·stop 규칙을 완화하는 것을 금지. +- late_entry_loss_rate가 15%를 초과하면 anti-late-entry gate를 강화한다. +- profit_giveback이 30%를 초과하면 trailing stop 파라미터를 조정한다. +purpose: 5억 목표와 리스크 예산/현금 방어선 연결. 매 릴리즈 drift 추적 포함. +required_fields: +- goal_achievement_pct +- goal_remaining_krw +- cash_defense_line_d2_used +- net_return_pct +- gross_return_pct +- max_drawdown_pct +- hit_rate_pct +- late_entry_loss_rate_pct +- profit_giveback_pct +- risk_budget_drift_pct +- cash_defense_drift_krw +- goal_drift_months +schema_version: 2026-06-10-goal-risk-budget-harness-v2 updated_at: '2026-06-10T23:29:00+09:00' diff --git a/spec/37_evaluation_dashboard_contract.yaml b/spec/37_evaluation_dashboard_contract.yaml index 4d951cb..bf397c5 100644 --- a/spec/37_evaluation_dashboard_contract.yaml +++ b/spec/37_evaluation_dashboard_contract.yaml @@ -1,60 +1,57 @@ -schema_version: evaluation_dashboard_contract.v2 +code_path: tools/build_continuous_evaluation_dashboard_v1.py formula_id: CONTINUOUS_EVALUATION_DASHBOARD_V1 -purpose: > - P2-020: 주간 성과 대시보드. LIVE T+20 표본 기반 기대수익/승률/MDD/수익반납 지표 산출. - REPLAY 표본은 informational 섹션에만 집계되며 성과 지표 계산에 혼입 금지. - -python_tool: tools/build_continuous_evaluation_dashboard_v1.py -has_code_implementation: true -code_path: "tools/build_continuous_evaluation_dashboard_v1.py" -sources: - - Temp/proposal_evaluation_history.json -output: Temp/continuous_evaluation_dashboard_v1.json - -# -- 필수 필드 -- -required_fields: - - weekly_scorecard_generated # bool: 주간 스코어카드 생성 여부 - - expectancy_pct # float: 평균 T+20 기대수익률 (LIVE만) - - win_rate_pct # float: 수익 거래 비율 (T+20 > 0) - - max_drawdown_pct # float: 단일 거래 최대 손실 (T+20 기준) - - profit_giveback_pct # float: 수익의 50% 이상 반납 비율 - -# -- 지표 정의 -- -metric_definitions: - expectancy_pct: - formula: "mean(t20_return_pct) for LIVE EVALUATED_T20 records" - target: "> 0" - note: "T+20 표본이 30건 미만이면 INSUFFICIENT_DATA" - win_rate_pct: - formula: "count(t20_return_pct > 0) / count(EVALUATED_T20) * 100" - target: ">= 50%" - max_drawdown_pct: - formula: "min(t20_return_pct) for EVALUATED_T20 records" - note: "음수가 클수록 나쁨" - profit_giveback_pct: - formula: > - count(proposals where t20_return > 0 AND subsequent outcome showed >50% giveback) - / count(profitable_t20) * 100 - note: "현재 giveback 추적 미구현 → None 반환" - -# -- 주간 스코어카드 구조 -- -weekly_scorecard: - group_by: ISO_week - min_records_per_week: 3 - fields: [win_rate_pct, expectancy_pct, trade_count, avg_t20_days] - -# -- gate 판정 -- gate_logic: INSUFFICIENT_DATA: - condition: "live_t20_count < 30" - effect: "성과 지표를 None으로 표기 (게이트 실패 아님)" + condition: live_t20_count < 30 + effect: 성과 지표를 None으로 표기 (게이트 실패 아님) PASS: - condition: "live_t20_count >= 30" + condition: live_t20_count >= 30 WARNING: - condition: "expectancy_pct < 0 OR win_rate_pct < 40" + condition: expectancy_pct < 0 OR win_rate_pct < 40 +has_code_implementation: true +meta: + has_code_implementation: false +metric_definitions: + expectancy_pct: + formula: mean(t20_return_pct) for LIVE EVALUATED_T20 records + note: T+20 표본이 30건 미만이면 INSUFFICIENT_DATA + target: '> 0' + max_drawdown_pct: + formula: min(t20_return_pct) for EVALUATED_T20 records + note: 음수가 클수록 나쁨 + profit_giveback_pct: + formula: 'count(proposals where t20_return > 0 AND subsequent outcome showed >50% + giveback) / count(profitable_t20) * 100 -# -- 금지 사항 -- + ' + note: 현재 giveback 추적 미구현 → None 반환 + win_rate_pct: + formula: count(t20_return_pct > 0) / count(EVALUATED_T20) * 100 + target: '>= 50%' +output: Temp/continuous_evaluation_dashboard_v1.json prohibitions: - - "REPLAY 표본을 성과 지표(win_rate/expectancy/MDD) 계산에 포함 금지" - - "T+20 미확정 LIVE 거래를 EVALUATED_T20으로 분류 금지" - - "외부 가격 데이터를 직접 조회해 T+20 수익률 계산 금지 (history 기록 기준만 사용)" +- REPLAY 표본을 성과 지표(win_rate/expectancy/MDD) 계산에 포함 금지 +- T+20 미확정 LIVE 거래를 EVALUATED_T20으로 분류 금지 +- 외부 가격 데이터를 직접 조회해 T+20 수익률 계산 금지 (history 기록 기준만 사용) +purpose: 'P2-020: 주간 성과 대시보드. LIVE T+20 표본 기반 기대수익/승률/MDD/수익반납 지표 산출. REPLAY 표본은 informational + 섹션에만 집계되며 성과 지표 계산에 혼입 금지. + + ' +python_tool: tools/build_continuous_evaluation_dashboard_v1.py +required_fields: +- weekly_scorecard_generated +- expectancy_pct +- win_rate_pct +- max_drawdown_pct +- profit_giveback_pct +schema_version: evaluation_dashboard_contract.v2 +sources: +- Temp/proposal_evaluation_history.json +weekly_scorecard: + fields: + - win_rate_pct + - expectancy_pct + - trade_count + - avg_t20_days + group_by: ISO_week + min_records_per_week: 3 diff --git a/spec/39_gas_thin_adapter_policy.yaml b/spec/39_gas_thin_adapter_policy.yaml index 2a93250..6a97dba 100644 --- a/spec/39_gas_thin_adapter_policy.yaml +++ b/spec/39_gas_thin_adapter_policy.yaml @@ -1,42 +1,45 @@ -schema_version: 2026-06-06-gas-thin-adapter-policy-v1 -policy_id: GAS_THIN_ADAPTER_POLICY_V1 -has_code_implementation: true -code_path: "tools/validate_gas_thin_adapter_v1.py" -purpose: > - GAS에서 collect, normalize, export, display만 남기고 decision, sizing, - stop_loss, take_profit, risk_score 로직은 Python으로 이전하기 위한 migration plan. allowed_responsibilities: - - collect - - normalize - - export - - display -forbidden_responsibilities: - - decision - - sizing - - stop_loss - - take_profit - - risk_score -migration_plan: - status: DONE - phases: - - phase: inventory - status: DONE - target: Temp/gas_business_logic_audit_v1.json - action: 분류된 GAS 함수 목록을 확정한다. - - phase: extract - status: DONE - target: tools/ - action: business_logic 함수를 Python compiler/stub layer로 이전한다. - - phase: thin_adapter - status: DONE - target: gas_*.gs - action: collect/normalize/export/display만 남기고 나머지를 호출 위임으로 전환한다. - - phase: verify - status: DONE - target: tools/validate_gas_thin_adapter_v1.py - action: forbidden_count가 줄어드는지 지속 검증한다. +- collect +- normalize +- export +- display +code_path: tools/validate_gas_thin_adapter_v1.py exceptions: - - name: runtime_report_rendering - reason: 표 렌더링을 위한 문자열 포맷은 허용된다. - - name: data_collection_helpers - reason: 외부 JSON/시트 수집은 허용된다. +- name: runtime_report_rendering + reason: 표 렌더링을 위한 문자열 포맷은 허용된다. +- name: data_collection_helpers + reason: 외부 JSON/시트 수집은 허용된다. +forbidden_responsibilities: +- decision +- sizing +- stop_loss +- take_profit +- risk_score +has_code_implementation: true +meta: + has_code_implementation: false +migration_plan: + phases: + - action: 분류된 GAS 함수 목록을 확정한다. + phase: inventory + status: DONE + target: Temp/gas_business_logic_audit_v1.json + - action: business_logic 함수를 Python compiler/stub layer로 이전한다. + phase: extract + status: DONE + target: tools/ + - action: collect/normalize/export/display만 남기고 나머지를 호출 위임으로 전환한다. + phase: thin_adapter + status: DONE + target: gas_*.gs + - action: forbidden_count가 줄어드는지 지속 검증한다. + phase: verify + status: DONE + target: tools/validate_gas_thin_adapter_v1.py + status: DONE +policy_id: GAS_THIN_ADAPTER_POLICY_V1 +purpose: 'GAS에서 collect, normalize, export, display만 남기고 decision, sizing, stop_loss, + take_profit, risk_score 로직은 Python으로 이전하기 위한 migration plan. + + ' +schema_version: 2026-06-06-gas-thin-adapter-policy-v1 diff --git a/spec/41_release_dag.yaml b/spec/41_release_dag.yaml index 07d0f35..dc852be 100644 --- a/spec/41_release_dag.yaml +++ b/spec/41_release_dag.yaml @@ -1,1707 +1,2426 @@ -schema_version: release_dag.v3 -step_count: 104 -goal: Linearize package.json scripts into a validated DAG execution graph. -has_code_implementation: true -code_path: "tools/run_release_dag_v3.py" -execution_order: - # 토폴로지 정렬 기준 병렬 실행 wave (의존성 없는 노드들을 동시에 실행 가능) - wave_0: - - audit_entropy - - build_bundle - - build_gas_bundle - - build_macro_event_ticker_impact - - build_engine_health_card - - build_late_chase_attribution - - build_live_replay_separation - - build_module_io_coverage - - build_operating_cadence_signal - - build_profit_giveback_ratchet - - build_schema_models - - build_shadow_ledger - - convert_xlsx - - validate_active_manifest - - validate_agents_shrink - - validate_docs_no_formula_duplication - - validate_calibration - - validate_cash_ledger - - validate_change_requests - - validate_completion_harness_instructions - - validate_factor_lifecycle - - validate_factor_lifecycle_registry_v1 - - validate_factor_lifecycle_completeness - - validate_field_dict - - validate_gas_adapter - - validate_gas_adapter_contract - - validate_golden_coverage - - validate_live_activation - - validate_metric_alias_collision - - validate_packaged_refs - - validate_property_invariants - - validate_renderer_no_calc - - validate_runtime_source_whitelist - - validate_sector_universe_monthly_refresh - - validate_specs - wave_1: - - validate_gas_bundle_sync - - build_anti_whipsaw_gate - - build_data_gated_progress - - build_ejce_view_renderer - - build_etf_representative_monitor - - build_factor_shadow_eligibility - - build_formula_outputs - - build_sector_flow_history_progress - - build_realized_performance - - build_missing_formula_bridge - - build_ratchet_trailing_general - - build_rebalance_sheet - - build_regime_trim_guidance - - build_routing_execution_log - - build_sector_trend_analysis - - build_shadow_promotion - - build_value_preservation_scorer - - build_velocity - - validate_anti_late_entry - - validate_engine_health_card - - validate_module_io_coverage - - validate_no_replay_live_mix - - validate_realized_performance - - validate_rule_lifecycle - - validate_schema_model - wave_2: - - build_smart_cash_recovery_v3 - - build_time_stop_forecast - - inject_harness - - validate_artifact_sync - - validate_no_lookahead - wave_3: - - apply_strategy_execution_locks - - build_strategy_routing_audit - - finalize_packet - wave_4: - - build_final_decision - - build_horizon_rebalance_plan - - validate_decision_trace - - validate_execution_sim - - validate_factor_conflicts - wave_5: - - build_final_context - - build_provenance_ledger - - build_report - - update_proposal_evaluation_history - - build_operational_eval_queue - - build_operational_outcome_lock - wave_6: - - build_algorithm_guidance_proof - - build_artifact_chain_hash - - build_calibration_priority - - build_calibration_change_ledger - - build_calibration_review_report - - build_calibration_approval_list - - build_calibration_decision_draft - - build_alpha_feedback_loop - - build_honest_proof_gap_analyzer - - build_operational_alpha_calibration - - build_prediction_accuracy_harness - - validate_data_gated_progress - - validate_sector_flow_history_progress - - validate_json_generator_outputs - - validate_alpha_feedback_loop - - validate_llm_copy_only - - validate_llm_determinism - - validate_llm_regression - - validate_low_capability - - validate_low_capability_pipeline_todo_v2 - - validate_execution_precedence_lock_v2 - - validate_order_grammar_v1 - - validate_provenance - - validate_prediction_accuracy_harness - - validate_operational_alpha_calibration - - validate_render_diff - - validate_report_numeric_consistency - - validate_report_section_completeness - - validate_report_sync - wave_7: - - build_architecture_boundaries - - validate_artifact_chain_hash - wave_8: - - validate_architecture_boundaries - wave_9: - - prepare_zip +code_path: tools/run_release_dag_v3.py dag: nodes: - build_gas_bundle: - id: build_gas_bundle - command: ["python", "tools/build_gas_bundle_v1.py"] - inputs: - - "tools/build_gas_bundle_v1.py" - - "src/gas/core/gas_lib.gs" - - "src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs" - - "src/gas_adapter_parts/gdc_02_account_satellite.gs" - - "src/gas_adapter_parts/gdf_01_price_metrics.gs" - - "src/gas_adapter_parts/gdf_02_harness_assembly.gs" - - "src/gas_adapter_parts/gdf_03_portfolio_gates.gs" - - "src/gas_adapter_parts/gdf_04_execution_quality.gs" - - "src/gas_adapter_parts/gdf_05_alpha_engines.gs" - - "src/gas_adapter_parts/gdf_06_rebalance.gs" - outputs: - - "gas_lib.gs" - - "gas_data_collect.gs" - - "gas_data_feed.gs" - depends_on: [] - timeout_sec: 30 - cache_key: "build_gas_bundle_v1" - strict: true - artifact_policy: "keep" - - validate_gas_adapter_contract: - id: validate_gas_adapter_contract - command: ["python", "tools/validate_gas_adapter_contract_v1.py"] - inputs: - - "tools/validate_gas_adapter_contract_v1.py" - - "spec/gas_adapter_contract.yaml" - - "schemas/generated/gas_adapter_contract.schema.json" - - "spec/14_raw_workbook_mapping.yaml" - - "spec/15_account_snapshot_contract.yaml" - outputs: - - "Temp/gas_adapter_contract_validation_v1.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_gas_adapter_contract_v1" - strict: true - artifact_policy: "keep" - - validate_gas_bundle_sync: - id: validate_gas_bundle_sync - command: ["python", "tools/validate_gas_bundle_sync_v1.py"] - inputs: - - "tools/validate_gas_bundle_sync_v1.py" - - "gas_lib.gs" - - "gas_data_collect.gs" - - "gas_data_feed.gs" - - "src/gas/core/gas_lib.gs" - - "src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs" - - "src/gas_adapter_parts/gdc_02_account_satellite.gs" - - "src/gas_adapter_parts/gdf_01_price_metrics.gs" - - "src/gas_adapter_parts/gdf_02_harness_assembly.gs" - - "src/gas_adapter_parts/gdf_03_portfolio_gates.gs" - - "src/gas_adapter_parts/gdf_04_execution_quality.gs" - - "src/gas_adapter_parts/gdf_05_alpha_engines.gs" - - "src/gas_adapter_parts/gdf_06_rebalance.gs" - outputs: - - "Temp/gas_bundle_validation_v1.json" - depends_on: ["build_gas_bundle"] - timeout_sec: 30 - cache_key: "validate_gas_bundle_sync_v1" - strict: true - artifact_policy: "keep" - - convert_xlsx: - id: convert_xlsx - command: ["python", "tools/convert_xlsx_to_json.py"] - inputs: ["GatherTradingData.xlsx"] - outputs: ["GatherTradingData.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "convert_xlsx_v1" - strict: true - artifact_policy: "keep" - - build_macro_event_ticker_impact: - id: build_macro_event_ticker_impact - command: ["python", "tools/build_macro_event_ticker_impact_v1.py"] - inputs: ["tools/build_macro_event_ticker_impact_v1.py", "GatherTradingData.json"] - outputs: ["Temp/macro_event_ticker_impact_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_macro_event_ticker_impact_v1" - strict: false - artifact_policy: "keep" - note: "core_satellite 종목별 매크로 이벤트 임팩트 레지스터 — MACRO_EVENT_TICKER_IMPACT_V1" - - build_formula_outputs: - id: build_formula_outputs - command: ["python", "src/quant_engine/compute_formula_outputs.py", "--output", "Temp/computed_harness_v1.json"] - inputs: ["src/quant_engine/compute_formula_outputs.py", "GatherTradingData.json"] - outputs: ["Temp/computed_harness_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_formula_outputs_v1" - strict: true - artifact_policy: "keep" - - build_data_gated_progress: - id: build_data_gated_progress - command: ["python", "tools/build_data_gated_progress_v1.py"] - inputs: ["tools/build_data_gated_progress_v1.py", "GatherTradingData.json"] - outputs: ["Temp/data_gated_progress_v1.json"] - depends_on: ["build_live_replay_separation"] - timeout_sec: 30 - cache_key: "build_data_gated_progress_v1" - strict: false - artifact_policy: "keep" - note: "DATA_GATED 항목별 실측 진척도 — non-blocking diagnostic" - - validate_data_gated_progress: - id: validate_data_gated_progress - command: ["python", "tools/validate_data_gated_progress_v1.py"] - inputs: ["tools/validate_data_gated_progress_v1.py", "Temp/data_gated_progress_v1.json"] - outputs: ["Temp/validate_data_gated_progress_v1.json"] - depends_on: ["build_data_gated_progress"] - timeout_sec: 30 - cache_key: "validate_data_gated_progress_v1" - strict: true - artifact_policy: "keep" - note: "WBS-4.x DATA_GATED 진척도 계약 검증" - - build_sector_flow_history_progress: - id: build_sector_flow_history_progress - command: ["python", "tools/build_sector_flow_history_progress_v1.py"] - inputs: ["tools/build_sector_flow_history_progress_v1.py", "GatherTradingData.json"] - outputs: ["Temp/sector_flow_history_progress_v1.json"] - depends_on: ["build_data_gated_progress"] - timeout_sec: 30 - cache_key: "build_sector_flow_history_progress_v1" - strict: false - artifact_policy: "keep" - note: "WBS-2.5 sector_flow_history 30일 누적 진척도 — non-blocking diagnostic" - - build_realized_performance: - id: build_realized_performance - command: ["python", "tools/build_realized_performance_v1.py"] - inputs: ["tools/build_realized_performance_v1.py", "GatherTradingData.json", "Temp/proposal_evaluation_history.json"] - outputs: ["Temp/realized_performance_v1.json"] - depends_on: ["build_data_gated_progress"] - timeout_sec: 30 - cache_key: "build_realized_performance_v1" - strict: false - artifact_policy: "keep" - note: "WBS-4.1 realized performance replay summary — non-blocking diagnostic" - - build_prediction_accuracy_harness: - id: build_prediction_accuracy_harness - command: ["python", "tools/build_prediction_accuracy_harness_v2.py"] - inputs: ["tools/build_prediction_accuracy_harness_v2.py", "Temp/proposal_evaluation_history.json"] - outputs: ["Temp/prediction_accuracy_harness_v2.json"] - depends_on: ["update_proposal_evaluation_history"] - timeout_sec: 30 - cache_key: "build_prediction_accuracy_harness_v2" - strict: false - artifact_policy: "keep" - note: "WBS-4.2 prediction accuracy harness — non-blocking diagnostic" - - build_alpha_feedback_loop: - id: build_alpha_feedback_loop - command: ["python", "tools/build_alpha_feedback_loop_v2.py"] - inputs: ["tools/build_alpha_feedback_loop_v2.py", "Temp/proposal_evaluation_history.json"] - outputs: ["Temp/alpha_feedback_loop_v2.json"] - depends_on: ["update_proposal_evaluation_history"] - timeout_sec: 30 - cache_key: "build_alpha_feedback_loop_v2" - strict: false - artifact_policy: "keep" - note: "WBS-4.3 alpha feedback loop — non-blocking diagnostic" - - build_calibration_priority: - id: build_calibration_priority - command: ["python", "tools/build_calibration_priority_v1.py"] - inputs: ["tools/build_calibration_priority_v1.py", "Temp/alpha_feedback_loop_v2.json", "spec/calibration_registry.yaml"] - outputs: ["Temp/calibration_priority_v1.json"] - depends_on: ["build_alpha_feedback_loop"] - timeout_sec: 30 - cache_key: "build_calibration_priority_v1" - strict: false - artifact_policy: "keep" - note: "CALIBRATION_PRIORITY_V1 — registry warning fallback 포함 보정 우선순위 리포트" - - build_calibration_change_ledger: - id: build_calibration_change_ledger - command: ["python", "tools/build_calibration_change_ledger_v4.py"] - inputs: ["tools/build_calibration_change_ledger_v4.py", "Temp/calibration_priority_v1.json", "Temp/outcome_ledger_v1.json", "Temp/calibration_registry_v1.json"] - outputs: ["Temp/calibration_change_ledger_v4.json"] - depends_on: ["build_calibration_priority", "build_realized_performance"] - timeout_sec: 30 - cache_key: "build_calibration_change_ledger_v4" - strict: false - artifact_policy: "keep" - note: "CALIBRATION_CHANGE_LEDGER_V4 — change ledger linkage 유지" - - build_calibration_review_report: - id: build_calibration_review_report - command: ["python", "tools/build_calibration_review_report_v1.py"] - inputs: ["tools/build_calibration_review_report_v1.py", "Temp/calibration_priority_v1.json", "Temp/calibration_change_ledger_v4.json", "spec/calibration_registry.yaml"] - outputs: ["Temp/calibration_review_report_v1.json", "Temp/calibration_review_report_v1.md"] - depends_on: ["build_calibration_change_ledger"] - timeout_sec: 30 - cache_key: "build_calibration_review_report_v1" - strict: false - artifact_policy: "keep" - note: "CALIBRATION_REVIEW_REPORT_V1 — 월간 운영용 읽기 쉬운 보정 리포트" - - build_calibration_approval_list: - id: build_calibration_approval_list - command: ["python", "tools/build_calibration_approval_list_v1.py"] - inputs: ["tools/build_calibration_approval_list_v1.py", "Temp/calibration_review_report_v1.json"] - outputs: ["Temp/calibration_approval_list_v1.json", "Temp/calibration_approval_list_v1.md"] - depends_on: ["build_calibration_review_report"] - timeout_sec: 30 - cache_key: "build_calibration_approval_list_v1" - strict: false - artifact_policy: "keep" - note: "CALIBRATION_APPROVAL_LIST_V1 — PROVISIONAL 승인/검토 분리" - - build_calibration_decision_draft: - id: build_calibration_decision_draft - command: ["python", "tools/build_calibration_decision_draft_v1.py"] - inputs: ["tools/build_calibration_decision_draft_v1.py", "Temp/calibration_review_report_v1.json", "Temp/calibration_approval_list_v1.json"] - outputs: ["Temp/calibration_decision_draft_v1.json", "Temp/calibration_decision_draft_v1.md"] - depends_on: ["build_calibration_approval_list"] - timeout_sec: 30 - cache_key: "build_calibration_decision_draft_v1" - strict: false - artifact_policy: "keep" - note: "CALIBRATION_DECISION_DRAFT_V1 — APPROVE/HOLD/REJECT 초안" - - build_operational_alpha_calibration: - id: build_operational_alpha_calibration - command: ["python", "tools/build_operational_alpha_calibration_v2.py"] - inputs: ["tools/build_operational_alpha_calibration_v2.py", "Temp/outcome_quality_score_v1.json", "Temp/prediction_accuracy_harness_v2.json", "Temp/trade_quality_from_t5_v1.json", "Temp/smart_cash_recovery_v5.json"] - outputs: ["Temp/operational_alpha_calibration_v2.json"] - depends_on: ["build_prediction_accuracy_harness", "build_alpha_feedback_loop", "build_realized_performance"] - timeout_sec: 30 - cache_key: "build_operational_alpha_calibration_v2" - strict: false - artifact_policy: "keep" - note: "WBS-4.3 operational alpha calibration — non-blocking diagnostic" - - build_factor_shadow_eligibility: - id: build_factor_shadow_eligibility - command: ["python", "tools/build_factor_shadow_eligibility_v1.py"] - inputs: ["tools/build_factor_shadow_eligibility_v1.py", "GatherTradingData.json", "spec/factor_lifecycle_registry.yaml"] - outputs: ["Temp/factor_shadow_eligibility_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_factor_shadow_eligibility_v1" - strict: false - artifact_policy: "keep" - note: "149개 팩터 shadow 승격 자격 평가 — non-blocking diagnostic" - - build_ejce_view_renderer: - id: build_ejce_view_renderer - command: ["python", "tools/build_ejce_view_renderer_v1.py"] - inputs: ["tools/build_ejce_view_renderer_v1.py", "GatherTradingData.json"] - outputs: ["Temp/ejce_view_renderer_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_ejce_view_renderer_v1" - strict: false - artifact_policy: "keep" - note: "phase1_gate: blank_view_count=0 검증" - - build_ratchet_trailing_general: - id: build_ratchet_trailing_general - command: ["python", "tools/build_ratchet_trailing_general_v1.py"] - inputs: ["tools/build_ratchet_trailing_general_v1.py", "GatherTradingData.json"] - outputs: ["Temp/ratchet_trailing_general_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_ratchet_trailing_general_v1" - strict: false - artifact_policy: "keep" - note: "phase1_gate: profit ratchet coverage_pct >= 99 검증" - - build_anti_whipsaw_gate: - id: build_anti_whipsaw_gate - command: ["python", "tools/build_anti_whipsaw_gate_v1.py"] - inputs: ["tools/build_anti_whipsaw_gate_v1.py", "GatherTradingData.json"] - outputs: ["Temp/anti_whipsaw_gate_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_anti_whipsaw_gate_v1" - strict: false - artifact_policy: "keep" - note: "ANTI_WHIPSAW_GATE_V1 — anti_whipsaw_status 스칼라 추출 (anti_whipsaw_gate_json)" - - build_velocity: - id: build_velocity - command: ["python", "tools/build_velocity_v1.py"] - inputs: ["tools/build_velocity_v1.py", "GatherTradingData.json"] - outputs: ["Temp/velocity_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_velocity_v1" - strict: false - artifact_policy: "keep" - note: "VELOCITY_V1 — velocity_1d/velocity_5d 포트폴리오 중앙값 집계 (anti_late_entry_json)" - - build_regime_trim_guidance: - id: build_regime_trim_guidance - command: ["python", "tools/build_regime_trim_guidance_v1.py"] - inputs: ["tools/build_regime_trim_guidance_v1.py", "GatherTradingData.json"] - outputs: ["Temp/regime_trim_guidance_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_regime_trim_guidance_v1" - strict: false - artifact_policy: "keep" - note: "REGIME_TRIM_GUIDANCE_V1 — regime_trim_guidance 딕셔너리 추출 (regime_trim_guidance_json)" - - build_missing_formula_bridge: - id: build_missing_formula_bridge - command: ["python", "tools/build_missing_formula_bridge_v1.py"] - inputs: ["tools/build_missing_formula_bridge_v1.py"] - outputs: ["Temp/missing_formula_bridge_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_missing_formula_bridge_v1" - strict: false - artifact_policy: "keep" - note: "MISSING_FORMULA_BRIDGE_V1 — 10개 공식 커버리지 앵커 등록 (harness auditor PY_FILES)" - - build_sector_trend_analysis: - id: build_sector_trend_analysis - command: ["python", "tools/build_sector_trend_analysis_v1.py"] - inputs: ["tools/build_sector_trend_analysis_v1.py", "GatherTradingData.json"] - outputs: ["Temp/sector_trend_analysis_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_sector_trend_analysis_v1" - strict: false - artifact_policy: "keep" - note: "SECTOR_TREND_ANALYSIS_V1 — ETF proxy 기반 섹터 동향 + smart money 렌즈 집계" - - build_etf_representative_monitor: - id: build_etf_representative_monitor - command: ["python", "tools/build_etf_representative_monitor_v1.py"] - inputs: ["tools/build_etf_representative_monitor_v1.py", "GatherTradingData.json"] - outputs: ["Temp/etf_representative_monitor_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_etf_representative_monitor_v1" - strict: false - artifact_policy: "keep" - note: "ETF_REPRESENTATIVE_MONITOR_V1 — ETF 대표 종목 추적 + 벤치마크 연동" - - build_routing_execution_log: - id: build_routing_execution_log - command: ["python", "tools/build_routing_execution_log_v1.py"] - inputs: ["tools/build_routing_execution_log_v1.py", "GatherTradingData.json"] - outputs: ["Temp/routing_execution_log_v1.json", "Temp/routing_execution_log_table_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_routing_execution_log_v1" - strict: false - artifact_policy: "keep" - note: "phase1_gate: routing decision path completeness + stage_coverage_pct/request_route" - - build_value_preservation_scorer: - id: build_value_preservation_scorer - command: ["python", "tools/build_value_preservation_scorer_v1.py"] - inputs: ["tools/build_value_preservation_scorer_v1.py", "GatherTradingData.json"] - outputs: ["Temp/value_preservation_scorer_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_value_preservation_scorer_v1" - strict: false - artifact_policy: "keep" - note: "phase1_gate: value preservation gate=PASS/CAUTION/WATCH_PENDING_SAMPLE" - - build_smart_cash_recovery_v3: - id: build_smart_cash_recovery_v3 - command: ["python", "tools/build_smart_cash_recovery_v3.py"] - inputs: ["tools/build_smart_cash_recovery_v3.py", "GatherTradingData.json", - "Temp/value_preservation_scorer_v1.json"] - outputs: ["Temp/smart_cash_recovery_v3.json"] - depends_on: ["build_value_preservation_scorer"] - timeout_sec: 30 - cache_key: "build_smart_cash_recovery_v3" - strict: false - artifact_policy: "keep" - note: "phase1_gate: smart cash recovery V3 gate=PASS/CAUTION" - - build_algorithm_guidance_proof: - id: build_algorithm_guidance_proof - command: ["python", "tools/build_algorithm_guidance_proof_v1.py"] - inputs: ["tools/build_algorithm_guidance_proof_v1.py", - "GatherTradingData.json", - "Temp/operational_report.json", - "Temp/ejce_view_renderer_v1.json", - "Temp/ratchet_trailing_general_v1.json", - "Temp/value_preservation_scorer_v1.json", - "Temp/smart_cash_recovery_v3.json", - "Temp/routing_execution_log_v1.json", - "Temp/canonical_metrics_v1.json"] - outputs: ["Temp/algorithm_guidance_proof_v1.json"] - depends_on: ["build_report", "build_ejce_view_renderer", "build_ratchet_trailing_general", - "build_value_preservation_scorer", "build_smart_cash_recovery_v3", - "build_routing_execution_log", "build_operational_outcome_lock"] - timeout_sec: 30 - cache_key: "build_algorithm_guidance_proof_v1" - strict: false - artifact_policy: "keep" - note: "honest_proof_score + phase1_gate 7개 검증 — RELEASE_GATE_TRUTH 원천" - - build_rebalance_sheet: - id: build_rebalance_sheet - command: ["python", "tools/build_rebalance_engine_v1.py", "--json", "GatherTradingData.json", "--harness", "Temp/computed_harness_v1.json"] - inputs: ["tools/build_rebalance_engine_v1.py", "GatherTradingData.json"] - outputs: ["Temp/rebalance_engine_v1.json"] - depends_on: ["convert_xlsx"] - timeout_sec: 30 - cache_key: "build_rebalance_engine_v1" - strict: false - artifact_policy: "keep" - note: "computed_harness_v1.json 없으면 regime=NEUTRAL fallback — WARN 허용" - - inject_harness: - id: inject_harness - command: ["python", "src/quant_engine/inject_computed_harness.py", "GatherTradingData.json", "--output", "Temp/final_decision_packet_active.json"] - inputs: ["src/quant_engine/inject_computed_harness.py", "GatherTradingData.json", "Temp/computed_harness_v1.json"] - outputs: ["Temp/final_decision_packet_active.json"] - depends_on: ["build_formula_outputs"] - timeout_sec: 30 - cache_key: "inject_harness_v1" - strict: true - artifact_policy: "keep" - apply_strategy_execution_locks: + artifact_policy: keep + cache_key: apply_strategy_execution_locks_v1 + command: + - python + - tools/apply_strategy_execution_locks.py + depends_on: + - inject_harness + - build_late_chase_attribution id: apply_strategy_execution_locks - command: ["python", "tools/apply_strategy_execution_locks.py"] - inputs: ["tools/apply_strategy_execution_locks.py", "GatherTradingData.json", - "Temp/late_chase_attribution_v1.json", "Temp/data_integrity_score_v1.json", - "Temp/derivation_validity_score_v1.json", "Temp/decision_evidence_score_v1.json", - "Temp/outcome_quality_score_v1.json"] + inputs: + - tools/apply_strategy_execution_locks.py + - GatherTradingData.json + - Temp/late_chase_attribution_v1.json + - Temp/data_integrity_score_v1.json + - Temp/derivation_validity_score_v1.json + - Temp/decision_evidence_score_v1.json + - Temp/outcome_quality_score_v1.json + note: STRATEGY_EXECUTION_LOCKS_V1 필드를 GatherTradingData.json 하네스에 주입 outputs: [] - depends_on: ["inject_harness", "build_late_chase_attribution"] - timeout_sec: 30 - cache_key: "apply_strategy_execution_locks_v1" strict: false - artifact_policy: "keep" - note: "STRATEGY_EXECUTION_LOCKS_V1 필드를 GatherTradingData.json 하네스에 주입" - - finalize_packet: - id: finalize_packet - command: ["python", "tools/build_packet_from_context_v1.py"] - inputs: ["tools/build_packet_from_context_v1.py", "Temp/final_decision_packet_active.json"] - outputs: ["Temp/final_decision_packet_active.json"] - depends_on: ["inject_harness"] timeout_sec: 30 - cache_key: "finalize_packet_v1" - strict: true - artifact_policy: "keep" - - build_strategy_routing_audit: - id: build_strategy_routing_audit - command: ["python", "tools/build_strategy_routing_audit_v1.py"] - inputs: ["tools/build_strategy_routing_audit_v1.py", "GatherTradingData.json", - "Temp/horizon_classification_v1.json", "Temp/capital_style_allocation_v1.json"] - outputs: ["Temp/strategy_routing_audit_v1.json"] - depends_on: ["inject_harness"] - timeout_sec: 30 - cache_key: "build_strategy_routing_audit_v1" - strict: false - artifact_policy: "keep" - note: "routing_gate 공식 산출 — MID/SHORT/LONG 호라이즌 상한 검증" - - build_horizon_rebalance_plan: - id: build_horizon_rebalance_plan - command: ["python", "tools/build_horizon_rebalance_plan_v1.py"] - inputs: ["tools/build_horizon_rebalance_plan_v1.py", "GatherTradingData.json", - "Temp/strategy_routing_audit_v1.json", "Temp/horizon_classification_v1.json"] - outputs: ["Temp/horizon_rebalance_plan_v1.json"] - depends_on: ["build_strategy_routing_audit", "finalize_packet"] - timeout_sec: 30 - cache_key: "build_horizon_rebalance_plan_v1" - strict: false - artifact_policy: "keep" - note: "routing_gate FAIL 시 리밸런싱 우선순위 플랜 산출 — non-blocking" - audit_entropy: + artifact_policy: keep + cache_key: audit_entropy_v1 + command: + - python + - tools/audit_repository_entropy_v2.py + - --out + - runtime/refactor_baseline_v1.yaml + depends_on: [] id: audit_entropy - command: ["python", "tools/audit_repository_entropy_v2.py", "--out", "runtime/refactor_baseline_v1.yaml"] - inputs: ["tools/audit_repository_entropy_v2.py"] - outputs: ["runtime/refactor_baseline_v1.yaml"] - depends_on: [] - timeout_sec: 30 - cache_key: "audit_entropy_v1" - strict: true - artifact_policy: "keep" - - validate_specs: - id: validate_specs - command: ["python", "tools/validate_specs.py"] - inputs: ["tools/validate_specs.py", "spec/13_formula_registry.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 60 - cache_key: "validate_specs_v1" - strict: true - artifact_policy: "keep" - - validate_no_direct_api_trading: - id: validate_no_direct_api_trading - command: ["python", "tools/validate_no_direct_api_trading_v1.py"] - inputs: ["tools/validate_no_direct_api_trading_v1.py", "src/quant_engine/kis_api_client_v1.py", "governance/rules/06_no_direct_api_trading.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_no_direct_api_trading_v1" - strict: true - artifact_policy: "keep" - note: "[CRITICAL] 매수/매도 API 직접 실행 절대 금지 게이트 — warn_only 불가, 완화 대상 - 아님(사용자 직접 지시 2026-06-21). 순수 stdlib만 사용해 Synology ARMv7 CI에서도 - 항상 실행 가능." - - validate_active_manifest: - id: validate_active_manifest - command: ["python", "tools/validate_active_manifest.py", "--manifest", "runtime/active_artifact_manifest.yaml", "--strict"] - inputs: ["tools/validate_active_manifest.py", "runtime/active_artifact_manifest.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_active_manifest_v1" - strict: true - artifact_policy: "keep" - - validate_report_sync: - id: validate_report_sync - command: ["python", "tools/validate_report_packet_sync_v1.py", "--packet", "Temp/final_decision_packet_active.json", "--report", "Temp/operational_report.json"] - inputs: ["tools/validate_report_packet_sync_v1.py", "Temp/final_decision_packet_active.json", "Temp/operational_report.json"] - outputs: [] - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "validate_report_sync_v1" - strict: true - artifact_policy: "keep" - - validate_report_numeric_consistency: - id: validate_report_numeric_consistency - command: ["python", "tools/validate_report_numeric_consistency_guard_v2.py", "--packet", "Temp/final_decision_packet_active.json", "--report", "Temp/operational_report.json"] - inputs: ["tools/validate_report_numeric_consistency_guard_v2.py", "Temp/final_decision_packet_active.json", "Temp/operational_report.json"] - outputs: [] - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "validate_report_numeric_consistency_v1" - strict: true - artifact_policy: "keep" - - validate_report_section_completeness: - id: validate_report_section_completeness - command: ["python", "tools/validate_report_section_completeness_v1.py", "--report-json", "Temp/operational_report.json"] - inputs: ["tools/validate_report_section_completeness_v1.py", "Temp/operational_report.json"] - outputs: ["Temp/report_section_completeness.json"] - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "validate_report_section_completeness_v1" - strict: true - artifact_policy: "keep" - - validate_json_generator_outputs: - id: validate_json_generator_outputs - command: ["python", "tools/validate_json_generator_outputs_v1.py"] - inputs: ["tools/validate_json_generator_outputs_v1.py", "Temp/computed_harness_v1.json", "Temp/final_decision_packet_active.json", "Temp/operational_report.json"] - outputs: ["Temp/json_generator_outputs_v1.json"] - depends_on: ["inject_harness", "finalize_packet", "build_report"] - timeout_sec: 30 - cache_key: "validate_json_generator_outputs_v1" - strict: true - artifact_policy: "keep" - - validate_field_dict: - id: validate_field_dict - command: ["python", "tools/validate_field_dictionary.py"] - inputs: ["tools/validate_field_dictionary.py", "spec/12_field_dictionary.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_field_dict_v1" - strict: true - artifact_policy: "keep" - - validate_provenance: - id: validate_provenance - command: ["python", "tools/validate_number_provenance_strict_v3.py", "--ledger", "Temp/number_provenance_ledger_v4.json", "--report", "Temp/operational_report.md"] - inputs: ["tools/validate_number_provenance_strict_v3.py", "Temp/number_provenance_ledger_v4.json", "Temp/operational_report.md"] - depends_on: ["build_provenance_ledger", "build_report"] - outputs: [] - timeout_sec: 30 - cache_key: "validate_provenance_v1" - strict: true - artifact_policy: "keep" - - validate_low_capability: - id: validate_low_capability - command: ["python", "tools/validate_low_capability_pack_v1.py", "--context", "Temp/final_context_for_llm_v5.yaml", "--contract", "spec/46_low_capability_execution_pack.yaml"] - inputs: ["tools/validate_low_capability_pack_v1.py", "Temp/final_context_for_llm_v5.yaml", "spec/46_low_capability_execution_pack.yaml"] - outputs: [] - depends_on: ["build_final_context"] - timeout_sec: 30 - cache_key: "validate_low_capability_v1" - strict: true - artifact_policy: "keep" - - validate_low_capability_pipeline_todo_v2: - id: validate_low_capability_pipeline_todo_v2 - command: ["python", "tools/validate_low_capability_pipeline_todo_v2.py"] inputs: - - "tools/validate_low_capability_pipeline_todo_v2.py" - - "spec/23_low_capability_llm_pipeline_todo.yaml" + - tools/audit_repository_entropy_v2.py outputs: - - "Temp/low_capability_pipeline_todo_validation_v2.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_low_capability_pipeline_todo_v2" + - runtime/refactor_baseline_v1.yaml strict: true - artifact_policy: "keep" - - validate_golden_coverage: - id: validate_golden_coverage - command: ["python", "tools/validate_golden_coverage_100.py"] - inputs: ["tools/validate_golden_coverage_100.py"] - outputs: [] - depends_on: [] timeout_sec: 30 - cache_key: "validate_golden_coverage_v1" - strict: true - artifact_policy: "keep" - - validate_calibration: - id: validate_calibration - command: ["python", "tools/validate_calibration_registry_v1.py"] - inputs: ["tools/validate_calibration_registry_v1.py"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_calibration_v1" - strict: true - artifact_policy: "keep" - - validate_schema_model: - id: validate_schema_model - command: ["python", "tools/validate_schema_model_generation_v1.py"] - inputs: ["tools/validate_schema_model_generation_v1.py", "Temp/schema_model_generation_v1.json"] - outputs: [] - depends_on: ["build_schema_models"] - timeout_sec: 30 - cache_key: "validate_schema_model_v1" - strict: true - artifact_policy: "keep" - - validate_gas_adapter: - id: validate_gas_adapter - command: ["python", "tools/validate_gas_thin_adapter_v1.py"] - inputs: ["tools/validate_gas_thin_adapter_v1.py"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_gas_adapter_v1" - strict: true - artifact_policy: "keep" - - validate_agents_shrink: - id: validate_agents_shrink - command: ["python", "tools/validate_agents_shrink_v1.py"] - inputs: ["tools/validate_agents_shrink_v1.py", "AGENTS.md"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_agents_shrink_v1" - strict: true - artifact_policy: "keep" - - validate_docs_no_formula_duplication: - id: validate_docs_no_formula_duplication - command: ["python", "tools/validate_docs_no_formula_duplication_v1.py"] + build_algorithm_guidance_proof: + artifact_policy: keep + cache_key: build_algorithm_guidance_proof_v1 + command: + - python + - tools/build_algorithm_guidance_proof_v1.py + depends_on: + - build_report + - build_ejce_view_renderer + - build_ratchet_trailing_general + - build_value_preservation_scorer + - build_smart_cash_recovery_v3 + - build_routing_execution_log + - build_operational_outcome_lock + id: build_algorithm_guidance_proof inputs: - - "tools/validate_docs_no_formula_duplication_v1.py" - - "AGENTS.md" - - "docs/doctrine.md" - - "docs/runbook.md" + - tools/build_algorithm_guidance_proof_v1.py + - GatherTradingData.json + - Temp/operational_report.json + - Temp/ejce_view_renderer_v1.json + - Temp/ratchet_trailing_general_v1.json + - Temp/value_preservation_scorer_v1.json + - Temp/smart_cash_recovery_v3.json + - Temp/routing_execution_log_v1.json + - Temp/canonical_metrics_v1.json + note: honest_proof_score + phase1_gate 7개 검증 — RELEASE_GATE_TRUTH 원천 outputs: - - "Temp/docs_no_formula_duplication_v1.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_docs_no_formula_duplication_v1" - strict: true - artifact_policy: "keep" - - - validate_no_replay_live_mix: - id: validate_no_replay_live_mix - command: ["python", "tools/validate_no_replay_live_mix_v2.py", "--json", "Temp/live_replay_separation_v3.json", "--strict"] - inputs: ["tools/validate_no_replay_live_mix_v2.py", "Temp/live_replay_separation_v3.json"] - outputs: [] - depends_on: ["build_live_replay_separation"] - timeout_sec: 30 - cache_key: "validate_no_replay_live_mix_v2" - strict: true - artifact_policy: "keep" - - validate_prediction_accuracy_harness: - id: validate_prediction_accuracy_harness - command: ["python", "tools/validate_prediction_accuracy_harness_v2.py"] - inputs: ["tools/validate_prediction_accuracy_harness_v2.py", "Temp/prediction_accuracy_harness_v2.json"] - outputs: ["Temp/validate_prediction_accuracy_harness_v2.json"] - depends_on: ["build_prediction_accuracy_harness"] - timeout_sec: 30 - cache_key: "validate_prediction_accuracy_harness_v2" - strict: true - artifact_policy: "keep" - - validate_sector_flow_history_progress: - id: validate_sector_flow_history_progress - command: ["python", "tools/validate_sector_flow_history_progress_v1.py"] - inputs: ["tools/validate_sector_flow_history_progress_v1.py", "Temp/sector_flow_history_progress_v1.json"] - outputs: ["Temp/validate_sector_flow_history_progress_v1.json"] - depends_on: ["build_sector_flow_history_progress"] - timeout_sec: 30 - cache_key: "validate_sector_flow_history_progress_v1" - strict: true - artifact_policy: "keep" - - validate_alpha_feedback_loop: - id: validate_alpha_feedback_loop - command: ["python", "tools/validate_alpha_feedback_loop_v2.py"] - inputs: ["tools/validate_alpha_feedback_loop_v2.py", "Temp/alpha_feedback_loop_v2.json"] - outputs: ["Temp/validate_alpha_feedback_loop_v2.json"] - depends_on: ["build_alpha_feedback_loop"] - timeout_sec: 30 - cache_key: "validate_alpha_feedback_loop_v2" - strict: true - artifact_policy: "keep" - - validate_operational_alpha_calibration: - id: validate_operational_alpha_calibration - command: ["python", "tools/validate_operational_alpha_calibration_v2.py"] - inputs: ["tools/validate_operational_alpha_calibration_v2.py", "Temp/operational_alpha_calibration_v2.json"] - outputs: ["Temp/validate_operational_alpha_calibration_v2.json"] - depends_on: ["build_operational_alpha_calibration"] - timeout_sec: 30 - cache_key: "validate_operational_alpha_calibration_v2" - strict: true - artifact_policy: "keep" - - validate_realized_performance: - id: validate_realized_performance - command: ["python", "tools/validate_realized_performance_v1.py"] - inputs: ["tools/validate_realized_performance_v1.py", "Temp/realized_performance_v1.json"] - outputs: ["Temp/validate_realized_performance_v1.json"] - depends_on: ["build_realized_performance"] - timeout_sec: 30 - cache_key: "validate_realized_performance_v1" - strict: true - artifact_policy: "keep" - note: "REALIZED_PERFORMANCE_V1 output schema and evidence validation" - - validate_runtime_source_whitelist: - id: validate_runtime_source_whitelist - command: ["python", "tools/validate_runtime_source_whitelist_v1.py", "--manifest", "runtime/active_artifact_manifest.yaml", "--scan", "src", "gas_*.gs"] - inputs: ["tools/validate_runtime_source_whitelist_v1.py", "runtime/active_artifact_manifest.yaml"] - - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_runtime_source_whitelist_v1" - strict: true - artifact_policy: "keep" - - validate_sector_universe_monthly_refresh: - id: validate_sector_universe_monthly_refresh - command: ["python", "tools/validate_sector_universe_monthly_refresh_v1.py"] - inputs: ["tools/validate_sector_universe_monthly_refresh_v1.py", "GatherTradingData.xlsx"] - outputs: ["Temp/sector_universe_refresh_validation.json"] - depends_on: [] - timeout_sec: 60 - cache_key: "validate_sector_universe_monthly_refresh_v1" + - Temp/algorithm_guidance_proof_v1.json strict: false - warn_only: true - artifact_policy: "keep" - note: "섹터 유니버스 월간 갱신 provenance 검증 (warn_only) — GAS 재다운로드 시 Source_URL 소실이 정상. 월간 --apply 실행 후 PASS/WARN 달성. FAIL=비차단 경고만." - - build_qualitative_sell_inputs: - id: build_qualitative_sell_inputs - command: ["python", "tools/build_qualitative_sell_inputs_v1.py", "--batch", "--workbook", "GatherTradingData.xlsx", "--apply"] - inputs: ["tools/build_qualitative_sell_inputs_v1.py", "tools/build_macro_context_from_workbook_v1.py", "tools/fetch_naver_market_data_v1.py", "src/quant_engine/kis_api_client_v1.py", "GatherTradingData.xlsx"] - outputs: ["outputs/qualitative_sell_strategy/*.json"] - depends_on: [] - timeout_sec: 120 - cache_key: "build_qualitative_sell_inputs_v1" + timeout_sec: 30 + build_alpha_feedback_loop: + artifact_policy: keep + cache_key: build_alpha_feedback_loop_v2 + command: + - python + - tools/build_alpha_feedback_loop_v2.py + depends_on: + - update_proposal_evaluation_history + id: build_alpha_feedback_loop + inputs: + - tools/build_alpha_feedback_loop_v2.py + - Temp/proposal_evaluation_history.json + note: WBS-4.3 alpha feedback loop — non-blocking diagnostic + outputs: + - Temp/alpha_feedback_loop_v2.json strict: false - warn_only: true - artifact_policy: "keep" - note: "Naver 시세/수급 실시간 스크래핑 의존(warn_only) — 보유종목별 비기계적 매도전략 - confluence 판단. 공매도잔고율은 --short-csv 수동 주입 전까지 구조적으로 - DATA_MISSING(추정 금지) — 정상 동작. 호가10단계·공매도거래비중은 --kis-account - {real,mock} 옵션으로 KIS Open API(read-only) 조회 가능(2026-06-21 연동) — DAG - 기본 실행에는 미포함(자격증명 의존, 수동 실행 시에만 부여)." - - build_satellite_candidate_recommendations: - id: build_satellite_candidate_recommendations - command: ["python", "tools/build_satellite_candidate_recommendations_v1.py", "--workbook", "GatherTradingData.xlsx", "--apply"] - inputs: ["tools/build_satellite_candidate_recommendations_v1.py", "tools/fetch_naver_market_data_v1.py", "GatherTradingData.xlsx"] - outputs: ["outputs/qualitative_sell_strategy/satellite_recommendations.json"] - depends_on: [] - timeout_sec: 180 - cache_key: "build_satellite_candidate_recommendations_v1" + timeout_sec: 30 + build_anti_whipsaw_gate: + artifact_policy: keep + cache_key: build_anti_whipsaw_gate_v1 + command: + - python + - tools/build_anti_whipsaw_gate_v1.py + depends_on: + - convert_xlsx + id: build_anti_whipsaw_gate + inputs: + - tools/build_anti_whipsaw_gate_v1.py + - GatherTradingData.json + note: ANTI_WHIPSAW_GATE_V1 — anti_whipsaw_status 스칼라 추출 (anti_whipsaw_gate_json) + outputs: + - Temp/anti_whipsaw_gate_v1.json strict: false - warn_only: true - artifact_policy: "keep" - note: "universe 시트 미보유 후보(60종) 전체 Naver 시세 조회 — warn_only. --trade-csv - 없으면 sector_export_trend 전부 DATA_MISSING(정상, 추정 금지)." - - validate_cash_ledger: - id: validate_cash_ledger - command: ["python", "tools/validate_cash_ledger_v2.py", "--snapshot", "GatherTradingData.json", "--contract", "spec/15_account_snapshot_contract.yaml"] - inputs: ["tools/validate_cash_ledger_v2.py", "GatherTradingData.json", "spec/15_account_snapshot_contract.yaml"] - outputs: [] - depends_on: [] timeout_sec: 30 - cache_key: "validate_cash_ledger_v2" - strict: true - artifact_policy: "keep" - - validate_factor_lifecycle: - id: validate_factor_lifecycle - command: ["python", "tools/validate_factor_lifecycle_v1.py", "--taxonomy", "spec/43_quant_factor_taxonomy.yaml"] - inputs: ["tools/validate_factor_lifecycle_v1.py", "spec/43_quant_factor_taxonomy.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_factor_lifecycle_v1" - strict: true - artifact_policy: "keep" - - validate_factor_lifecycle_registry_v1: - id: validate_factor_lifecycle_registry_v1 - command: ["python", "tools/validate_factor_lifecycle_registry_v1.py"] - inputs: - - "tools/validate_factor_lifecycle_registry_v1.py" - - "spec/43_quant_factor_taxonomy.yaml" - - "spec/factor_lifecycle_registry.yaml" - outputs: - - "Temp/factor_lifecycle_registry_validation_v1.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_factor_lifecycle_registry_v1" - strict: true - artifact_policy: "keep" - - validate_anti_late_entry_gate_v5: - id: validate_anti_late_entry_gate_v5 - command: ["python", "tools/validate_anti_late_entry_gate_v5.py"] - inputs: - - "tools/validate_anti_late_entry_gate_v5.py" - - "GatherTradingData.json" - outputs: - - "Temp/anti_late_entry_gate_validation_v5.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_anti_late_entry_gate_v5" - strict: true - artifact_policy: "keep" - - validate_decision_graph_precedence_v1: - id: validate_decision_graph_precedence_v1 - command: ["python", "tools/validate_decision_graph_precedence_v1.py"] - inputs: - - "tools/validate_decision_graph_precedence_v1.py" - - "spec/routing/decision_graph.yaml" - outputs: - - "Temp/decision_graph_precedence_validation_v1.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_decision_graph_precedence_v1" - strict: true - artifact_policy: "keep" - - validate_factor_conflict_precedence_v1: - id: validate_factor_conflict_precedence_v1 - command: ["python", "tools/validate_factor_conflict_precedence_v1.py"] - inputs: - - "tools/validate_factor_conflict_precedence_v1.py" - - "spec/strategy/pre_distribution_early_warning_v4.yaml" - - "spec/strategy/smart_money_liquidity_gate_v1.yaml" - - "spec/09_decision_flow.yaml" - - "GatherTradingData.json" - outputs: - - "Temp/factor_conflict_precedence_validation_v1.json" - depends_on: [] - timeout_sec: 30 - cache_key: "validate_factor_conflict_precedence_v1" - strict: true - artifact_policy: "keep" - - validate_honest_performance_guard_v1: - id: validate_honest_performance_guard_v1 - command: ["python", "tools/validate_honest_performance_guard_v1.py"] - inputs: - - "tools/validate_honest_performance_guard_v1.py" - - "Temp/prediction_accuracy_harness_v2.json" - - "Temp/honest_performance_guard_v1.json" - outputs: - - "Temp/honest_performance_guard_validation_v1.json" - depends_on: ["build_honest_performance_guard"] - timeout_sec: 30 - cache_key: "validate_honest_performance_guard_v1" - strict: true - artifact_policy: "keep" - - validate_execution_precedence_lock_v2: - id: validate_execution_precedence_lock_v2 - command: ["python", "tools/validate_execution_precedence_lock_v2.py"] - inputs: - - "tools/validate_execution_precedence_lock_v2.py" - - "Temp/final_execution_decision_v4.json" - outputs: - - "Temp/execution_precedence_lock_v2.json" - depends_on: ["build_honest_performance_guard"] - timeout_sec: 30 - cache_key: "validate_execution_precedence_lock_v2" - strict: true - artifact_policy: "keep" - - validate_order_grammar_v1: - id: validate_order_grammar_v1 - command: ["python", "tools/validate_order_grammar_v1.py"] - inputs: - - "tools/validate_order_grammar_v1.py" - - "GatherTradingData.json" - outputs: - - "Temp/order_grammar_validation_v1.json" - depends_on: ["build_honest_performance_guard"] - timeout_sec: 30 - cache_key: "validate_order_grammar_v1" - strict: true - artifact_policy: "keep" - - - validate_cash_floor_policy_v1: - id: validate_cash_floor_policy_v1 - command: ["python", "tools/validate_cash_floor_policy_v1.py"] - inputs: - - "tools/validate_cash_floor_policy_v1.py" - - "GatherTradingData.json" - - "Temp/operational_report.json" - outputs: - - "Temp/cash_floor_policy_validation_v1.json" - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "validate_cash_floor_policy_v1" - strict: true - artifact_policy: "keep" - - validate_position_sizing: - id: validate_position_sizing - command: ["python", "tools/validate_position_sizing.py"] - inputs: - - "tools/validate_position_sizing.py" - - "spec/01_objective_profile.yaml" - - "Temp/goal_risk_budget_harness_v3.json" - outputs: - - "Temp/position_sizing_validation_v1.json" - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "validate_position_sizing" - strict: true - artifact_policy: "keep" - - - - - - - validate_factor_lifecycle_completeness: - id: validate_factor_lifecycle_completeness - command: ["python", "tools/validate_factor_lifecycle_completeness_v1.py"] - inputs: ["tools/validate_factor_lifecycle_completeness_v1.py", "spec/factor_lifecycle_registry.yaml", "Temp/factor_shadow_eligibility_v1.json"] - outputs: ["Temp/factor_lifecycle_completeness_v1.json"] - depends_on: ["build_factor_shadow_eligibility"] - timeout_sec: 30 - cache_key: "validate_factor_lifecycle_completeness_v1" - strict: true - artifact_policy: "keep" - - validate_metric_alias_collision: - id: validate_metric_alias_collision - command: ["python", "tools/validate_metric_alias_collision_v1.py", "--registry", "spec/25_canonical_metrics_registry.yaml", "--report", "Temp/operational_report.json"] - inputs: ["tools/validate_metric_alias_collision_v1.py", "spec/25_canonical_metrics_registry.yaml", "Temp/operational_report.json"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_metric_alias_collision_v1" - strict: true - artifact_policy: "keep" - - validate_architecture_boundaries: - id: validate_architecture_boundaries - command: ["python", "tools/validate_architecture_boundaries_v2.py"] - inputs: ["tools/validate_architecture_boundaries_v2.py", "Temp/architecture_boundaries_v2.json"] - outputs: [] - depends_on: ["build_architecture_boundaries"] - timeout_sec: 30 - cache_key: "validate_architecture_boundaries_v2" - strict: true - artifact_policy: "keep" - - build_module_io_coverage: - id: build_module_io_coverage - command: ["python", "tools/build_module_io_coverage_v1.py"] - inputs: ["tools/build_module_io_coverage_v1.py", "spec/48_module_io_contract_registry.yaml"] - outputs: ["Temp/module_io_coverage_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_module_io_coverage_v1" - strict: true - artifact_policy: "keep" - build_architecture_boundaries: + artifact_policy: keep + cache_key: build_architecture_boundaries_v2 + command: + - python + - tools/build_architecture_boundaries_v2.py + depends_on: + - build_module_io_coverage + - build_artifact_chain_hash id: build_architecture_boundaries - command: ["python", "tools/build_architecture_boundaries_v2.py"] - inputs: ["tools/build_architecture_boundaries_v2.py", "Temp/module_io_coverage_v1.json", "Temp/artifact_chain_hash_v4.json"] - outputs: ["Temp/architecture_boundaries_v2.json"] - depends_on: ["build_module_io_coverage", "build_artifact_chain_hash"] - timeout_sec: 30 - cache_key: "build_architecture_boundaries_v2" - strict: true - artifact_policy: "keep" - - validate_module_io_coverage: - id: validate_module_io_coverage - command: ["python", "tools/validate_module_io_coverage_v1.py"] - inputs: ["tools/validate_module_io_coverage_v1.py", "Temp/module_io_coverage_v1.json"] - outputs: [] - depends_on: ["build_module_io_coverage"] - timeout_sec: 30 - cache_key: "validate_module_io_coverage_v1" - strict: true - artifact_policy: "keep" - - build_artifact_chain_hash: - id: build_artifact_chain_hash - command: ["python", "tools/build_artifact_chain_hash_v4.py"] - inputs: ["tools/build_artifact_chain_hash_v4.py"] - outputs: ["Temp/artifact_chain_hash_v4.json"] - depends_on: ["build_provenance_ledger", "build_report"] - timeout_sec: 30 - cache_key: "build_artifact_chain_hash_v4" - strict: true - artifact_policy: "keep" - - validate_artifact_chain_hash: - id: validate_artifact_chain_hash - command: ["python", "tools/validate_artifact_chain_hash_v4.py"] - inputs: ["tools/validate_artifact_chain_hash_v4.py", "Temp/artifact_chain_hash_v4.json"] - outputs: [] - depends_on: ["build_artifact_chain_hash"] - timeout_sec: 30 - cache_key: "validate_artifact_chain_hash_v4" - strict: true - artifact_policy: "keep" - - validate_artifact_sync: - id: validate_artifact_sync - command: ["python", "tools/validate_artifact_sync_v1.py", - "--engine-result", "Temp/engine_harness_gate_result.json", - "--manifest", "runtime/active_artifact_manifest.yaml", - "--registry", "Temp/formula_runtime_registry_v1.json"] - inputs: ["tools/validate_artifact_sync_v1.py", - "Temp/engine_harness_gate_result.json", - "Temp/formula_runtime_registry_v1.json", - "runtime/active_artifact_manifest.yaml"] - outputs: [] - depends_on: ["validate_engine_health_card"] - timeout_sec: 30 - cache_key: "validate_artifact_sync_v1" - strict: false - warn_only: true - artifact_policy: "keep" - - validate_renderer_no_calc: - id: validate_renderer_no_calc - command: ["python", "tools/validate_renderer_no_calculation_v1.py"] - inputs: ["tools/validate_renderer_no_calculation_v1.py"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_renderer_no_calc_v1" - strict: true - artifact_policy: "keep" - - validate_packaged_refs: - id: validate_packaged_refs - command: ["python", "tools/validate_packaged_artifact_references_v1.py", "--strict"] - inputs: ["tools/validate_packaged_artifact_references_v1.py", "runtime/active_artifact_manifest.yaml"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_packaged_refs_v1" - strict: true - artifact_policy: "keep" - - validate_property_invariants: - id: validate_property_invariants - command: ["python", "tools/run_property_tests_v1.py"] - inputs: ["tools/run_property_tests_v1.py", "spec/property_invariants.yaml"] - outputs: ["Temp/property_test_result_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_property_invariants_v1" - strict: true - artifact_policy: "keep" - - validate_anti_late_entry: - id: validate_anti_late_entry - command: ["python", "tools/validate_anti_late_entry_harness_v1.py", "--json", "Temp/late_chase_attribution_v2.json"] - inputs: ["tools/validate_anti_late_entry_harness_v1.py", "Temp/late_chase_attribution_v2.json"] - outputs: [] - depends_on: ["build_late_chase_attribution"] - timeout_sec: 30 - cache_key: "validate_anti_late_entry_v1" - strict: true - artifact_policy: "keep" - - validate_rule_lifecycle: - id: validate_rule_lifecycle - command: ["python", "tools/validate_rule_lifecycle_v2.py", "--strict"] - inputs: ["tools/validate_rule_lifecycle_v2.py", "Temp/shadow_ledger_v2.json"] - outputs: [] - depends_on: ["build_shadow_ledger"] - timeout_sec: 30 - cache_key: "validate_rule_lifecycle_v2" - strict: true - artifact_policy: "keep" - - validate_change_requests: - id: validate_change_requests - command: ["python", "tools/validate_change_requests_v1.py", "--dir", "governance/change_requests", "--strict"] - inputs: ["tools/validate_change_requests_v1.py"] - outputs: [] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_change_requests_v1" - strict: true - artifact_policy: "keep" - - validate_completion_harness_instructions: - id: validate_completion_harness_instructions - command: ["python", "tools/validate_completion_harness_instructions_v1.py"] inputs: - [ - "tools/validate_completion_harness_instructions_v1.py", - "AGENTS.md", - "REPORT_GUIDE.md", - "docs/runbook.md", - "docs/ROADMAP_WBS.md", - "docs/doctrine.md", - "prompts/analysis_prompt.md", - "prompts/review_prompt.md", - "prompts/capture_parse_prompt.md", - "prompts/engine_audit_master_prompt_v2.md", - "prompts/engine_audit_master_prompt_v3.md", - "prompts/engine_audit_prompt.md", - "prompts/low_capability_report_renderer.md", - "prompts/report_renderer_prompt.md", - "prompts/weekly_operational_report_master_prompt_v1.md" - ] - outputs: ["Temp/completion_harness_instructions_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_completion_harness_instructions_v1" - strict: true - artifact_policy: "keep" - - validate_engine_health_card: - id: validate_engine_health_card - command: ["python", "tools/validate_engine_health_card_v1.py", "--json", "Temp/engine_health_card_v1.json"] - inputs: ["tools/validate_engine_health_card_v1.py", "Temp/engine_health_card_v1.json"] - outputs: [] - depends_on: ["build_engine_health_card"] - timeout_sec: 30 - cache_key: "validate_engine_health_card_v1" - strict: true - artifact_policy: "keep" - - validate_llm_regression: - id: validate_llm_regression - command: ["python", "tools/run_low_capability_llm_regression_v1.py", "--fixture", "tests/llm_regression", "--context", "Temp/final_context_for_llm_v5.yaml"] - inputs: ["tools/run_low_capability_llm_regression_v1.py", "Temp/final_context_for_llm_v5.yaml"] - outputs: [] - depends_on: ["build_final_context"] - timeout_sec: 30 - cache_key: "validate_llm_regression_v1" - strict: true - artifact_policy: "keep" - - validate_llm_copy_only: - id: validate_llm_copy_only - command: ["python", "tools/validate_llm_copy_only_output_v1.py", - "--packet", "Temp/final_decision_packet_active.json", - "--report", "Temp/operational_report.json"] - inputs: ["tools/validate_llm_copy_only_output_v1.py", - "Temp/final_decision_packet_active.json", - "Temp/operational_report.json"] - outputs: [] - depends_on: ["build_report", "build_final_decision"] - timeout_sec: 30 - cache_key: "validate_llm_copy_only_v1" - strict: true - artifact_policy: "keep" - - - build_final_decision: - id: build_final_decision - command: ["python", "tools/build_final_decision_packet_v4.py", "--src", "Temp/final_decision_packet_active.json", "--out", "Temp/final_decision_packet_v4.json"] - inputs: ["tools/build_final_decision_packet_v4.py", "Temp/final_decision_packet_active.json"] - outputs: ["Temp/final_decision_packet_v4.json"] - depends_on: ["finalize_packet"] - timeout_sec: 30 - cache_key: "build_final_decision_v1" - strict: true - artifact_policy: "keep" - - build_final_context: - id: build_final_context - command: ["python", "tools/build_low_capability_context_pack_v5.py", "--manifest", "runtime/active_artifact_manifest.yaml", "--packet", "Temp/final_decision_packet_v4.json", "--out", "Temp/final_context_for_llm_v5.yaml"] - inputs: ["tools/build_low_capability_context_pack_v5.py", "runtime/active_artifact_manifest.yaml", "Temp/final_decision_packet_v4.json"] - outputs: ["Temp/final_context_for_llm_v5.yaml"] - depends_on: ["build_final_decision"] - timeout_sec: 30 - cache_key: "build_final_context_v1" - strict: true - artifact_policy: "keep" - - build_provenance_ledger: - id: build_provenance_ledger - command: ["python", "tools/build_number_provenance_ledger_v4.py", "--packet", "Temp/final_decision_packet_v4.json", "--out", "Temp/number_provenance_ledger_v4.json"] - inputs: ["tools/build_number_provenance_ledger_v4.py", "Temp/final_decision_packet_v4.json"] - outputs: ["Temp/number_provenance_ledger_v4.json"] - depends_on: ["build_final_decision"] - timeout_sec: 30 - cache_key: "build_provenance_ledger_v1" - strict: true - artifact_policy: "keep" - - build_live_replay_separation: - id: build_live_replay_separation - command: ["python", "tools/build_live_replay_separation_v3.py", "--out", "Temp/live_replay_separation_v3.json"] - inputs: ["tools/build_live_replay_separation_v3.py"] - outputs: ["Temp/live_replay_separation_v3.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_live_replay_separation_v3" - strict: true - artifact_policy: "keep" - - build_late_chase_attribution: - id: build_late_chase_attribution - command: ["python", "tools/build_late_chase_attribution_v2.py", "--json", "GatherTradingData.json", "--out", "Temp/late_chase_attribution_v2.json"] - inputs: ["tools/build_late_chase_attribution_v2.py", "GatherTradingData.json"] - outputs: ["Temp/late_chase_attribution_v2.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_late_chase_attribution_v2" - strict: true - artifact_policy: "keep" - - build_profit_giveback_ratchet: - id: build_profit_giveback_ratchet - command: ["python", "tools/build_profit_giveback_ratchet_v2.py", "--json", "GatherTradingData.json", "--out", "Temp/profit_giveback_ratchet_v2.json"] - inputs: ["tools/build_profit_giveback_ratchet_v2.py", "GatherTradingData.json"] - outputs: ["Temp/profit_giveback_ratchet_v2.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_profit_giveback_ratchet_v2" - strict: true - artifact_policy: "keep" - - build_shadow_ledger: - id: build_shadow_ledger - command: ["python", "tools/build_shadow_ledger_v2.py", "--out", "Temp/shadow_ledger_v2.json"] - inputs: ["tools/build_shadow_ledger_v2.py"] - outputs: ["Temp/shadow_ledger_v2.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_shadow_ledger_v2" - strict: true - artifact_policy: "keep" - - build_operating_cadence_signal: - id: build_operating_cadence_signal - command: ["python", "tools/build_operating_cadence_signal_v1.py", "--timezone", "Asia/Seoul", "--out", "Temp/operating_cadence_signal_v1.json"] - inputs: ["tools/build_operating_cadence_signal_v1.py"] - outputs: ["Temp/operating_cadence_signal_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_operating_cadence_signal_v1" - strict: true - artifact_policy: "keep" - - build_engine_health_card: - id: build_engine_health_card - command: ["python", "tools/build_engine_health_card_v1.py", "--out", "Temp/engine_health_card_v1.json"] - inputs: ["tools/build_engine_health_card_v1.py"] - outputs: ["Temp/engine_health_card_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_engine_health_card_v1" - strict: true - artifact_policy: "keep" - - build_report: - id: build_report - command: ["python", "tools/render_operational_report.py", "--json", "GatherTradingData.json", "--output", "Temp/operational_report.md", "--report-json-output", "Temp/operational_report.json"] - inputs: ["tools/render_operational_report.py", "GatherTradingData.json", "Temp/final_decision_packet_active.json"] - outputs: ["Temp/operational_report.md", "Temp/operational_report.json"] - depends_on: ["convert_xlsx", "build_final_decision"] - timeout_sec: 60 - cache_key: "build_report_v1" - strict: true - artifact_policy: "keep" - - build_honest_performance_guard: - id: build_honest_performance_guard - command: ["python", "tools/build_honest_performance_guard_v1.py"] - inputs: - - "tools/build_honest_performance_guard_v1.py" - - "Temp/rebound_sell_efficiency_v1.json" - - "Temp/late_chase_attribution_v1.json" - - "Temp/operational_report.json" + - tools/build_architecture_boundaries_v2.py + - Temp/module_io_coverage_v1.json + - Temp/artifact_chain_hash_v4.json outputs: - - "Temp/honest_performance_guard_v1.json" - depends_on: ["build_report"] - timeout_sec: 30 - cache_key: "build_honest_performance_guard_v1" + - Temp/architecture_boundaries_v2.json + strict: true + timeout_sec: 30 + build_artifact_chain_hash: + artifact_policy: keep + cache_key: build_artifact_chain_hash_v4 + command: + - python + - tools/build_artifact_chain_hash_v4.py + depends_on: + - build_provenance_ledger + - build_report + id: build_artifact_chain_hash + inputs: + - tools/build_artifact_chain_hash_v4.py + outputs: + - Temp/artifact_chain_hash_v4.json strict: true - artifact_policy: "keep" - - build_honest_proof_gap_analyzer: - id: build_honest_proof_gap_analyzer - command: ["python", "tools/build_honest_proof_gap_analyzer_v1.py"] - inputs: ["tools/build_honest_proof_gap_analyzer_v1.py", - "Temp/algorithm_guidance_proof_v1.json", - "Temp/prediction_accuracy_harness_v2.json", - "Temp/imputed_data_exposure_gate_v2.json"] - outputs: ["Temp/honest_proof_gap_analyzer_v1.json"] - - depends_on: ["build_algorithm_guidance_proof"] timeout_sec: 30 - cache_key: "build_honest_proof_gap_analyzer_v1" - strict: false - artifact_policy: "keep" - note: "RELEASE_GATE_TRUTH 45.1→70 경로 분석 — non-blocking diagnostic" - build_bundle: + artifact_policy: keep + cache_key: build_bundle_v1 + command: + - python + - tools/build_bundle.py + depends_on: [] id: build_bundle - command: ["python", "tools/build_bundle.py"] - inputs: ["tools/build_bundle.py"] - outputs: ["dist/retirement_portfolio_compact.yaml", "dist/retirement_portfolio_ultra_compact.yaml"] - depends_on: [] - timeout_sec: 30 - cache_key: "build_bundle_v1" + inputs: + - tools/build_bundle.py + outputs: + - dist/retirement_portfolio_compact.yaml + - dist/retirement_portfolio_ultra_compact.yaml strict: true - artifact_policy: "keep" - - build_schema_models: - id: build_schema_models - command: ["python", "tools/generate_models_from_schema.py"] - inputs: ["tools/generate_models_from_schema.py", "schemas/generated"] - outputs: ["Temp/schema_model_generation_v1.json"] - depends_on: [] timeout_sec: 30 - cache_key: "build_schema_models_v1" - strict: true - artifact_policy: "keep" - - # ── P1-2: live data 자동 전환 게이트 ───────────────────────────────────── - - validate_live_activation: - id: validate_live_activation - command: ["python", "tools/validate_live_data_activation_gate_v1.py"] - inputs: ["tools/validate_live_data_activation_gate_v1.py", - "Temp/continuous_evaluation_dashboard_v1.json", - "Temp/prediction_accuracy_harness_v2.json", - "Temp/algorithm_guidance_proof_v1.json", - "Temp/pass_100_criteria_v3.json"] - outputs: ["Temp/live_data_activation_gate_v1.json"] - depends_on: [] - timeout_sec: 30 - cache_key: "validate_live_activation_v1" + build_calibration_approval_list: + artifact_policy: keep + cache_key: build_calibration_approval_list_v1 + command: + - python + - tools/build_calibration_approval_list_v1.py + depends_on: + - build_calibration_review_report + id: build_calibration_approval_list + inputs: + - tools/build_calibration_approval_list_v1.py + - Temp/calibration_review_report_v1.json + note: CALIBRATION_APPROVAL_LIST_V1 — PROVISIONAL 승인/검토 분리 + outputs: + - Temp/calibration_approval_list_v1.json + - Temp/calibration_approval_list_v1.md strict: false - artifact_policy: "keep" - note: "PENDING(live_t20<30) = 정상. FAIL = 전환 조건 미충족. 2026-07-15 자동 활성화 예정." - - # ── P1-1: TIME_STOP 사전 예측 ───────────────────────────────────────────── - - build_time_stop_forecast: - id: build_time_stop_forecast - command: ["python", "tools/build_time_stop_forecast_v1.py", - "--harness", "Temp/computed_harness_v1.json"] - inputs: ["tools/build_time_stop_forecast_v1.py", - "Temp/computed_harness_v1.json"] - outputs: ["Temp/time_stop_forecast_v1.json"] - depends_on: ["build_formula_outputs"] timeout_sec: 30 - cache_key: "build_time_stop_forecast_v1" + build_calibration_change_ledger: + artifact_policy: keep + cache_key: build_calibration_change_ledger_v4 + command: + - python + - tools/build_calibration_change_ledger_v4.py + depends_on: + - build_calibration_priority + - build_realized_performance + id: build_calibration_change_ledger + inputs: + - tools/build_calibration_change_ledger_v4.py + - Temp/calibration_priority_v1.json + - Temp/outcome_ledger_v1.json + - Temp/calibration_registry_v1.json + note: CALIBRATION_CHANGE_LEDGER_V4 — change ledger linkage 유지 + outputs: + - Temp/calibration_change_ledger_v4.json strict: false - artifact_policy: "keep" - note: "WARN 허용 (발동 임박 = 경고, 미발동 = PASS)" - - # ── spec/52~58 H001~H008 ghost contract validators ─────────────────────── - - validate_decision_trace: - id: validate_decision_trace - command: ["python", "tools/validate_decision_trace_replay_v1.py", - "--packet", "Temp/final_decision_packet_active.json", - "--harness", "Temp/computed_harness_v1.json"] - inputs: ["tools/validate_decision_trace_replay_v1.py", - "Temp/final_decision_packet_active.json", - "Temp/computed_harness_v1.json"] - outputs: ["Temp/decision_trace_replay_v1.json"] - depends_on: ["finalize_packet", "build_formula_outputs"] timeout_sec: 30 - cache_key: "validate_decision_trace_v1" - strict: true - artifact_policy: "keep" - contract: "spec/52_decision_trace_replay_contract.yaml" - - validate_factor_conflicts: - id: validate_factor_conflicts - command: ["python", "tools/validate_factor_conflict_matrix_v1.py", - "--taxonomy", "spec/43_quant_factor_taxonomy.yaml", - "--packet", "Temp/final_decision_packet_active.json"] - inputs: ["tools/validate_factor_conflict_matrix_v1.py", - "spec/43_quant_factor_taxonomy.yaml", - "Temp/final_decision_packet_active.json"] - outputs: ["Temp/factor_conflict_matrix_v1.json"] - depends_on: ["finalize_packet"] - timeout_sec: 30 - cache_key: "validate_factor_conflicts_v1" - strict: true - artifact_policy: "keep" - contract: "spec/53_factor_conflict_matrix.yaml" - - validate_no_lookahead: - id: validate_no_lookahead - command: ["python", "tools/validate_no_lookahead_bias_v1.py", - "--harness", "Temp/computed_harness_v1.json"] - inputs: ["tools/validate_no_lookahead_bias_v1.py", - "Temp/computed_harness_v1.json"] - outputs: ["Temp/no_lookahead_bias_v1.json"] - depends_on: ["build_formula_outputs"] - timeout_sec: 30 - cache_key: "validate_no_lookahead_v1" - strict: true - artifact_policy: "keep" - contract: "spec/54_temporal_data_integrity.yaml" - - validate_execution_sim: - id: validate_execution_sim - command: ["python", "tools/validate_execution_simulator_v1.py", - "--packet", "Temp/final_decision_packet_active.json"] - inputs: ["tools/validate_execution_simulator_v1.py", - "Temp/final_decision_packet_active.json"] - outputs: ["Temp/execution_simulator_v1.json"] - depends_on: ["finalize_packet"] - timeout_sec: 30 - cache_key: "validate_execution_sim_v1" - strict: true - artifact_policy: "keep" - contract: "spec/55_execution_simulator_contract.yaml" - - validate_render_diff: - id: validate_render_diff - command: ["python", "tools/validate_report_render_diff_v1.py", - "--packet", "Temp/final_decision_packet_active.json", - "--report", "Temp/operational_report.json"] - inputs: ["tools/validate_report_render_diff_v1.py", - "Temp/final_decision_packet_active.json", - "Temp/operational_report.json"] - outputs: ["Temp/report_render_diff_v1.json"] - depends_on: ["build_report", "finalize_packet"] - timeout_sec: 30 - cache_key: "validate_render_diff_v1" - strict: true - artifact_policy: "keep" - contract: "spec/56_renderer_copy_only_contract.yaml" - - build_shadow_promotion: - id: build_shadow_promotion - command: ["python", "tools/build_shadow_promotion_scorecard_v1.py", - "--shadow", "Temp/shadow_ledger_v2.json", - "--live-replay", "Temp/live_replay_separation_v3.json"] - inputs: ["tools/build_shadow_promotion_scorecard_v1.py", - "Temp/shadow_ledger_v2.json", - "Temp/live_replay_separation_v3.json"] - outputs: ["Temp/shadow_promotion_scorecard_v1.json"] - depends_on: ["build_shadow_ledger", "build_live_replay_separation"] - timeout_sec: 30 - cache_key: "build_shadow_promotion_v1" - strict: true - artifact_policy: "keep" - contract: "spec/57_shadow_promotion_scorecard.yaml" - - validate_llm_determinism: - id: validate_llm_determinism - command: ["python", "tools/validate_llm_determinism_pack_v1.py", - "--context", "Temp/final_context_for_llm_v5.yaml"] - inputs: ["tools/validate_llm_determinism_pack_v1.py", - "Temp/final_context_for_llm_v5.yaml"] - outputs: ["Temp/llm_determinism_pack_v1.json"] - depends_on: ["build_final_context"] - timeout_sec: 30 - cache_key: "validate_llm_determinism_v1" - strict: true - artifact_policy: "keep" - contract: "spec/58_llm_determinism_contract.yaml" - - update_proposal_evaluation_history: - id: update_proposal_evaluation_history - command: ["python", "tools/update_proposal_evaluation_history.py", - "--json", "GatherTradingData.json", - "--history", "Temp/proposal_evaluation_history.json"] - inputs: ["tools/update_proposal_evaluation_history.py", "GatherTradingData.json"] - outputs: ["Temp/proposal_evaluation_history.json"] - depends_on: ["finalize_packet"] - timeout_sec: 30 - cache_key: "update_proposal_evaluation_history_v2" + build_calibration_decision_draft: + artifact_policy: keep + cache_key: build_calibration_decision_draft_v1 + command: + - python + - tools/build_calibration_decision_draft_v1.py + depends_on: + - build_calibration_approval_list + id: build_calibration_decision_draft + inputs: + - tools/build_calibration_decision_draft_v1.py + - Temp/calibration_review_report_v1.json + - Temp/calibration_approval_list_v1.json + note: CALIBRATION_DECISION_DRAFT_V1 — APPROVE/HOLD/REJECT 초안 + outputs: + - Temp/calibration_decision_draft_v1.json + - Temp/calibration_decision_draft_v1.md strict: false - artifact_policy: "keep" - note: "PROPOSAL_EVALUATION_HISTORY — T+1/T+5/T+20 운영 성과 누적 (core_satellite + order_blueprint 기반, 일간 idempotent)" - + timeout_sec: 30 + build_calibration_priority: + artifact_policy: keep + cache_key: build_calibration_priority_v1 + command: + - python + - tools/build_calibration_priority_v1.py + depends_on: + - build_alpha_feedback_loop + id: build_calibration_priority + inputs: + - tools/build_calibration_priority_v1.py + - Temp/alpha_feedback_loop_v2.json + - spec/calibration_registry.yaml + note: CALIBRATION_PRIORITY_V1 — registry warning fallback 포함 보정 우선순위 리포트 + outputs: + - Temp/calibration_priority_v1.json + strict: false + timeout_sec: 30 + build_calibration_review_report: + artifact_policy: keep + cache_key: build_calibration_review_report_v1 + command: + - python + - tools/build_calibration_review_report_v1.py + depends_on: + - build_calibration_change_ledger + id: build_calibration_review_report + inputs: + - tools/build_calibration_review_report_v1.py + - Temp/calibration_priority_v1.json + - Temp/calibration_change_ledger_v4.json + - spec/calibration_registry.yaml + note: CALIBRATION_REVIEW_REPORT_V1 — 월간 운영용 읽기 쉬운 보정 리포트 + outputs: + - Temp/calibration_review_report_v1.json + - Temp/calibration_review_report_v1.md + strict: false + timeout_sec: 30 + build_data_gated_progress: + artifact_policy: keep + cache_key: build_data_gated_progress_v1 + command: + - python + - tools/build_data_gated_progress_v1.py + depends_on: + - build_live_replay_separation + id: build_data_gated_progress + inputs: + - tools/build_data_gated_progress_v1.py + - GatherTradingData.json + note: DATA_GATED 항목별 실측 진척도 — non-blocking diagnostic + outputs: + - Temp/data_gated_progress_v1.json + strict: false + timeout_sec: 30 + build_ejce_view_renderer: + artifact_policy: keep + cache_key: build_ejce_view_renderer_v1 + command: + - python + - tools/build_ejce_view_renderer_v1.py + depends_on: + - convert_xlsx + id: build_ejce_view_renderer + inputs: + - tools/build_ejce_view_renderer_v1.py + - GatherTradingData.json + note: 'phase1_gate: blank_view_count=0 검증' + outputs: + - Temp/ejce_view_renderer_v1.json + strict: false + timeout_sec: 30 + build_engine_health_card: + artifact_policy: keep + cache_key: build_engine_health_card_v1 + command: + - python + - tools/build_engine_health_card_v1.py + - --out + - Temp/engine_health_card_v1.json + depends_on: [] + id: build_engine_health_card + inputs: + - tools/build_engine_health_card_v1.py + outputs: + - Temp/engine_health_card_v1.json + strict: true + timeout_sec: 30 + build_etf_representative_monitor: + artifact_policy: keep + cache_key: build_etf_representative_monitor_v1 + command: + - python + - tools/build_etf_representative_monitor_v1.py + depends_on: + - convert_xlsx + id: build_etf_representative_monitor + inputs: + - tools/build_etf_representative_monitor_v1.py + - GatherTradingData.json + note: ETF_REPRESENTATIVE_MONITOR_V1 — ETF 대표 종목 추적 + 벤치마크 연동 + outputs: + - Temp/etf_representative_monitor_v1.json + strict: false + timeout_sec: 30 + build_factor_shadow_eligibility: + artifact_policy: keep + cache_key: build_factor_shadow_eligibility_v1 + command: + - python + - tools/build_factor_shadow_eligibility_v1.py + depends_on: + - convert_xlsx + id: build_factor_shadow_eligibility + inputs: + - tools/build_factor_shadow_eligibility_v1.py + - GatherTradingData.json + - spec/factor_lifecycle_registry.yaml + note: 149개 팩터 shadow 승격 자격 평가 — non-blocking diagnostic + outputs: + - Temp/factor_shadow_eligibility_v1.json + strict: false + timeout_sec: 30 + build_final_context: + artifact_policy: keep + cache_key: build_final_context_v1 + command: + - python + - tools/build_low_capability_context_pack_v5.py + - --manifest + - runtime/active_artifact_manifest.yaml + - --packet + - Temp/final_decision_packet_v4.json + - --out + - Temp/final_context_for_llm_v5.yaml + depends_on: + - build_final_decision + id: build_final_context + inputs: + - tools/build_low_capability_context_pack_v5.py + - runtime/active_artifact_manifest.yaml + - Temp/final_decision_packet_v4.json + outputs: + - Temp/final_context_for_llm_v5.yaml + strict: true + timeout_sec: 30 + build_final_decision: + artifact_policy: keep + cache_key: build_final_decision_v1 + command: + - python + - tools/build_final_decision_packet_v4.py + - --src + - Temp/final_decision_packet_active.json + - --out + - Temp/final_decision_packet_v4.json + depends_on: + - finalize_packet + id: build_final_decision + inputs: + - tools/build_final_decision_packet_v4.py + - Temp/final_decision_packet_active.json + outputs: + - Temp/final_decision_packet_v4.json + strict: true + timeout_sec: 30 + build_formula_outputs: + artifact_policy: keep + cache_key: build_formula_outputs_v1 + command: + - python + - src/quant_engine/compute_formula_outputs.py + - --output + - Temp/computed_harness_v1.json + depends_on: + - convert_xlsx + id: build_formula_outputs + inputs: + - src/quant_engine/compute_formula_outputs.py + - GatherTradingData.json + outputs: + - Temp/computed_harness_v1.json + strict: true + timeout_sec: 30 + build_gas_bundle: + artifact_policy: keep + cache_key: build_gas_bundle_v1 + command: + - python + - tools/build_gas_bundle_v1.py + depends_on: [] + id: build_gas_bundle + inputs: + - tools/build_gas_bundle_v1.py + - src/gas/core/gas_lib.gs + - src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs + - src/gas_adapter_parts/gdc_02_account_satellite.gs + - src/gas_adapter_parts/gdf_01_price_metrics.gs + - src/gas_adapter_parts/gdf_02_harness_assembly.gs + - src/gas_adapter_parts/gdf_03_portfolio_gates.gs + - src/gas_adapter_parts/gdf_04_execution_quality.gs + - src/gas_adapter_parts/gdf_05_alpha_engines.gs + - src/gas_adapter_parts/gdf_06_rebalance.gs + outputs: + - gas_lib.gs + - gas_data_collect.gs + - gas_data_feed.gs + strict: true + timeout_sec: 30 + build_honest_performance_guard: + artifact_policy: keep + cache_key: build_honest_performance_guard_v1 + command: + - python + - tools/build_honest_performance_guard_v1.py + depends_on: + - build_report + id: build_honest_performance_guard + inputs: + - tools/build_honest_performance_guard_v1.py + - Temp/rebound_sell_efficiency_v1.json + - Temp/late_chase_attribution_v1.json + - Temp/operational_report.json + outputs: + - Temp/honest_performance_guard_v1.json + strict: true + timeout_sec: 30 + build_honest_proof_gap_analyzer: + artifact_policy: keep + cache_key: build_honest_proof_gap_analyzer_v1 + command: + - python + - tools/build_honest_proof_gap_analyzer_v1.py + depends_on: + - build_algorithm_guidance_proof + id: build_honest_proof_gap_analyzer + inputs: + - tools/build_honest_proof_gap_analyzer_v1.py + - Temp/algorithm_guidance_proof_v1.json + - Temp/prediction_accuracy_harness_v2.json + - Temp/imputed_data_exposure_gate_v2.json + note: RELEASE_GATE_TRUTH 45.1→70 경로 분석 — non-blocking diagnostic + outputs: + - Temp/honest_proof_gap_analyzer_v1.json + strict: false + timeout_sec: 30 + build_horizon_rebalance_plan: + artifact_policy: keep + cache_key: build_horizon_rebalance_plan_v1 + command: + - python + - tools/build_horizon_rebalance_plan_v1.py + depends_on: + - build_strategy_routing_audit + - finalize_packet + id: build_horizon_rebalance_plan + inputs: + - tools/build_horizon_rebalance_plan_v1.py + - GatherTradingData.json + - Temp/strategy_routing_audit_v1.json + - Temp/horizon_classification_v1.json + note: routing_gate FAIL 시 리밸런싱 우선순위 플랜 산출 — non-blocking + outputs: + - Temp/horizon_rebalance_plan_v1.json + strict: false + timeout_sec: 30 + build_late_chase_attribution: + artifact_policy: keep + cache_key: build_late_chase_attribution_v2 + command: + - python + - tools/build_late_chase_attribution_v2.py + - --json + - GatherTradingData.json + - --out + - Temp/late_chase_attribution_v2.json + depends_on: [] + id: build_late_chase_attribution + inputs: + - tools/build_late_chase_attribution_v2.py + - GatherTradingData.json + outputs: + - Temp/late_chase_attribution_v2.json + strict: true + timeout_sec: 30 + build_live_replay_separation: + artifact_policy: keep + cache_key: build_live_replay_separation_v3 + command: + - python + - tools/build_live_replay_separation_v3.py + - --out + - Temp/live_replay_separation_v3.json + depends_on: [] + id: build_live_replay_separation + inputs: + - tools/build_live_replay_separation_v3.py + outputs: + - Temp/live_replay_separation_v3.json + strict: true + timeout_sec: 30 + build_macro_event_ticker_impact: + artifact_policy: keep + cache_key: build_macro_event_ticker_impact_v1 + command: + - python + - tools/build_macro_event_ticker_impact_v1.py + depends_on: [] + id: build_macro_event_ticker_impact + inputs: + - tools/build_macro_event_ticker_impact_v1.py + - GatherTradingData.json + note: core_satellite 종목별 매크로 이벤트 임팩트 레지스터 — MACRO_EVENT_TICKER_IMPACT_V1 + outputs: + - Temp/macro_event_ticker_impact_v1.json + strict: false + timeout_sec: 30 + build_missing_formula_bridge: + artifact_policy: keep + cache_key: build_missing_formula_bridge_v1 + command: + - python + - tools/build_missing_formula_bridge_v1.py + depends_on: [] + id: build_missing_formula_bridge + inputs: + - tools/build_missing_formula_bridge_v1.py + note: MISSING_FORMULA_BRIDGE_V1 — 10개 공식 커버리지 앵커 등록 (harness auditor PY_FILES) + outputs: + - Temp/missing_formula_bridge_v1.json + strict: false + timeout_sec: 30 + build_module_io_coverage: + artifact_policy: keep + cache_key: build_module_io_coverage_v1 + command: + - python + - tools/build_module_io_coverage_v1.py + depends_on: [] + id: build_module_io_coverage + inputs: + - tools/build_module_io_coverage_v1.py + - spec/48_module_io_contract_registry.yaml + outputs: + - Temp/module_io_coverage_v1.json + strict: true + timeout_sec: 30 + build_operating_cadence_signal: + artifact_policy: keep + cache_key: build_operating_cadence_signal_v1 + command: + - python + - tools/build_operating_cadence_signal_v1.py + - --timezone + - Asia/Seoul + - --out + - Temp/operating_cadence_signal_v1.json + depends_on: [] + id: build_operating_cadence_signal + inputs: + - tools/build_operating_cadence_signal_v1.py + outputs: + - Temp/operating_cadence_signal_v1.json + strict: true + timeout_sec: 30 + build_operational_alpha_calibration: + artifact_policy: keep + cache_key: build_operational_alpha_calibration_v2 + command: + - python + - tools/build_operational_alpha_calibration_v2.py + depends_on: + - build_prediction_accuracy_harness + - build_alpha_feedback_loop + - build_realized_performance + id: build_operational_alpha_calibration + inputs: + - tools/build_operational_alpha_calibration_v2.py + - Temp/outcome_quality_score_v1.json + - Temp/prediction_accuracy_harness_v2.json + - Temp/trade_quality_from_t5_v1.json + - Temp/smart_cash_recovery_v5.json + note: WBS-4.3 operational alpha calibration — non-blocking diagnostic + outputs: + - Temp/operational_alpha_calibration_v2.json + strict: false + timeout_sec: 30 build_operational_eval_queue: + artifact_policy: keep + cache_key: build_operational_eval_queue_v1 + command: + - python + - tools/build_operational_eval_queue_v1.py + - --history + - Temp/proposal_evaluation_history.json + - --out + - Temp/operational_eval_queue_v1.json + depends_on: + - update_proposal_evaluation_history id: build_operational_eval_queue - command: ["python", "tools/build_operational_eval_queue_v1.py", - "--history", "Temp/proposal_evaluation_history.json", - "--out", "Temp/operational_eval_queue_v1.json"] - inputs: ["tools/build_operational_eval_queue_v1.py", "Temp/proposal_evaluation_history.json"] - outputs: ["Temp/operational_eval_queue_v1.json"] - depends_on: ["update_proposal_evaluation_history"] - timeout_sec: 30 - cache_key: "build_operational_eval_queue_v1" + inputs: + - tools/build_operational_eval_queue_v1.py + - Temp/proposal_evaluation_history.json + note: OPERATIONAL_EVAL_QUEUE_V1 — T+20 평가 대기 큐 (due_date 초과 종목 목록) + outputs: + - Temp/operational_eval_queue_v1.json strict: false - artifact_policy: "keep" - note: "OPERATIONAL_EVAL_QUEUE_V1 — T+20 평가 대기 큐 (due_date 초과 종목 목록)" - + timeout_sec: 30 build_operational_outcome_lock: + artifact_policy: keep + cache_key: build_operational_outcome_lock_v1 + command: + - python + - tools/build_operational_outcome_lock_v1.py + - --history + - Temp/proposal_evaluation_history.json + - --out + - Temp/operational_outcome_lock_v1.json + depends_on: + - update_proposal_evaluation_history id: build_operational_outcome_lock - command: ["python", "tools/build_operational_outcome_lock_v1.py", - "--history", "Temp/proposal_evaluation_history.json", - "--out", "Temp/operational_outcome_lock_v1.json"] - inputs: ["tools/build_operational_outcome_lock_v1.py", "Temp/proposal_evaluation_history.json"] - outputs: ["Temp/operational_outcome_lock_v1.json"] - depends_on: ["update_proposal_evaluation_history"] - timeout_sec: 30 - cache_key: "build_operational_outcome_lock_v1" + inputs: + - tools/build_operational_outcome_lock_v1.py + - Temp/proposal_evaluation_history.json + note: OPERATIONAL_OUTCOME_LOCK_V1 — 실운영 T+20 성과 잠금 (30건 이상 누적 후 활성화) + outputs: + - Temp/operational_outcome_lock_v1.json strict: false - artifact_policy: "keep" - note: "OPERATIONAL_OUTCOME_LOCK_V1 — 실운영 T+20 성과 잠금 (30건 이상 누적 후 활성화)" - - prepare_zip: - id: prepare_zip - command: ["python", "tools/prepare_upload_zip.py", "--skip-validate", "--skip-convert", "--validation-mode", "package-only"] - inputs: ["tools/prepare_upload_zip.py"] - outputs: [] - depends_on: ["audit_entropy", "validate_execution_precedence_lock_v2", "validate_order_grammar_v1", "validate_specs", "validate_no_direct_api_trading", "validate_active_manifest", "validate_report_sync", "validate_report_numeric_consistency", "validate_field_dict", "validate_provenance", "validate_low_capability", "validate_low_capability_pipeline_todo_v2", "validate_golden_coverage", "validate_calibration", "validate_schema_model", "validate_gas_adapter", "build_gas_bundle", "validate_gas_adapter_contract", "validate_gas_bundle_sync", "validate_agents_shrink", "validate_no_replay_live_mix", "validate_prediction_accuracy_harness", "validate_alpha_feedback_loop", "validate_operational_alpha_calibration", "validate_realized_performance", "validate_data_gated_progress", "validate_sector_flow_history_progress", "validate_runtime_source_whitelist", "validate_cash_ledger", "validate_factor_lifecycle", "validate_factor_lifecycle_registry_v1", "validate_factor_lifecycle_completeness", "validate_metric_alias_collision", "validate_architecture_boundaries", "validate_module_io_coverage", "validate_artifact_chain_hash", "validate_artifact_sync", "validate_renderer_no_calc", "validate_packaged_refs", "validate_property_invariants", "validate_anti_late_entry", "validate_rule_lifecycle", "validate_change_requests", "validate_completion_harness_instructions", "validate_engine_health_card", "validate_llm_regression", "validate_llm_copy_only", "build_final_decision", "build_final_context", "build_provenance_ledger", "build_live_replay_separation", "build_late_chase_attribution", "build_profit_giveback_ratchet", "build_shadow_ledger", "build_operating_cadence_signal", "build_engine_health_card", "build_module_io_coverage", "build_artifact_chain_hash", "build_report", "build_bundle", "build_schema_models", "build_architecture_boundaries", "validate_decision_trace", "validate_factor_conflicts", "validate_no_lookahead", "validate_execution_sim", "validate_render_diff", "build_shadow_promotion", "validate_llm_determinism", "build_time_stop_forecast", "validate_live_activation", "build_rebalance_sheet", "build_prediction_accuracy_harness", "build_alpha_feedback_loop", "build_calibration_priority", "build_calibration_change_ledger", "build_calibration_review_report", "build_calibration_approval_list", "build_calibration_decision_draft", "build_operational_alpha_calibration", "build_sector_flow_history_progress"] - timeout_sec: 60 - cache_key: "prepare_zip_v1" + timeout_sec: 30 + build_prediction_accuracy_harness: + artifact_policy: keep + cache_key: build_prediction_accuracy_harness_v2 + command: + - python + - tools/build_prediction_accuracy_harness_v2.py + depends_on: + - update_proposal_evaluation_history + id: build_prediction_accuracy_harness + inputs: + - tools/build_prediction_accuracy_harness_v2.py + - Temp/proposal_evaluation_history.json + note: WBS-4.2 prediction accuracy harness — non-blocking diagnostic + outputs: + - Temp/prediction_accuracy_harness_v2.json + strict: false + timeout_sec: 30 + build_profit_giveback_ratchet: + artifact_policy: keep + cache_key: build_profit_giveback_ratchet_v2 + command: + - python + - tools/build_profit_giveback_ratchet_v2.py + - --json + - GatherTradingData.json + - --out + - Temp/profit_giveback_ratchet_v2.json + depends_on: [] + id: build_profit_giveback_ratchet + inputs: + - tools/build_profit_giveback_ratchet_v2.py + - GatherTradingData.json + outputs: + - Temp/profit_giveback_ratchet_v2.json strict: true - artifact_policy: "keep" + timeout_sec: 30 + build_provenance_ledger: + artifact_policy: keep + cache_key: build_provenance_ledger_v1 + command: + - python + - tools/build_number_provenance_ledger_v4.py + - --packet + - Temp/final_decision_packet_v4.json + - --out + - Temp/number_provenance_ledger_v4.json + depends_on: + - build_final_decision + id: build_provenance_ledger + inputs: + - tools/build_number_provenance_ledger_v4.py + - Temp/final_decision_packet_v4.json + outputs: + - Temp/number_provenance_ledger_v4.json + strict: true + timeout_sec: 30 + build_qualitative_sell_inputs: + artifact_policy: keep + cache_key: build_qualitative_sell_inputs_v1 + command: + - python + - tools/build_qualitative_sell_inputs_v1.py + - --batch + - --workbook + - GatherTradingData.xlsx + - --apply + depends_on: [] + id: build_qualitative_sell_inputs + inputs: + - tools/build_qualitative_sell_inputs_v1.py + - tools/build_macro_context_from_workbook_v1.py + - tools/fetch_naver_market_data_v1.py + - src/quant_engine/kis_api_client_v1.py + - GatherTradingData.xlsx + note: Naver 시세/수급 실시간 스크래핑 의존(warn_only) — 보유종목별 비기계적 매도전략 confluence 판단. 공매도잔고율은 + --short-csv 수동 주입 전까지 구조적으로 DATA_MISSING(추정 금지) — 정상 동작. 호가10단계·공매도거래비중은 --kis-account + {real,mock} 옵션으로 KIS Open API(read-only) 조회 가능(2026-06-21 연동) — DAG 기본 실행에는 + 미포함(자격증명 의존, 수동 실행 시에만 부여). + outputs: + - outputs/qualitative_sell_strategy/*.json + strict: false + timeout_sec: 120 + warn_only: true + build_ratchet_trailing_general: + artifact_policy: keep + cache_key: build_ratchet_trailing_general_v1 + command: + - python + - tools/build_ratchet_trailing_general_v1.py + depends_on: + - convert_xlsx + id: build_ratchet_trailing_general + inputs: + - tools/build_ratchet_trailing_general_v1.py + - GatherTradingData.json + note: 'phase1_gate: profit ratchet coverage_pct >= 99 검증' + outputs: + - Temp/ratchet_trailing_general_v1.json + strict: false + timeout_sec: 30 + build_realized_performance: + artifact_policy: keep + cache_key: build_realized_performance_v1 + command: + - python + - tools/build_realized_performance_v1.py + depends_on: + - build_data_gated_progress + id: build_realized_performance + inputs: + - tools/build_realized_performance_v1.py + - GatherTradingData.json + - Temp/proposal_evaluation_history.json + note: WBS-4.1 realized performance replay summary — non-blocking diagnostic + outputs: + - Temp/realized_performance_v1.json + strict: false + timeout_sec: 30 + build_rebalance_sheet: + artifact_policy: keep + cache_key: build_rebalance_engine_v1 + command: + - python + - tools/build_rebalance_engine_v1.py + - --json + - GatherTradingData.json + - --harness + - Temp/computed_harness_v1.json + depends_on: + - convert_xlsx + id: build_rebalance_sheet + inputs: + - tools/build_rebalance_engine_v1.py + - GatherTradingData.json + note: computed_harness_v1.json 없으면 regime=NEUTRAL fallback — WARN 허용 + outputs: + - Temp/rebalance_engine_v1.json + strict: false + timeout_sec: 30 + build_regime_trim_guidance: + artifact_policy: keep + cache_key: build_regime_trim_guidance_v1 + command: + - python + - tools/build_regime_trim_guidance_v1.py + depends_on: + - convert_xlsx + id: build_regime_trim_guidance + inputs: + - tools/build_regime_trim_guidance_v1.py + - GatherTradingData.json + note: REGIME_TRIM_GUIDANCE_V1 — regime_trim_guidance 딕셔너리 추출 (regime_trim_guidance_json) + outputs: + - Temp/regime_trim_guidance_v1.json + strict: false + timeout_sec: 30 + build_report: + artifact_policy: keep + cache_key: build_report_v1 + command: + - python + - tools/render_operational_report.py + - --json + - GatherTradingData.json + - --output + - Temp/operational_report.md + - --report-json-output + - Temp/operational_report.json + depends_on: + - convert_xlsx + - build_final_decision + id: build_report + inputs: + - tools/render_operational_report.py + - GatherTradingData.json + - Temp/final_decision_packet_active.json + outputs: + - Temp/operational_report.md + - Temp/operational_report.json + strict: true + timeout_sec: 60 + build_routing_execution_log: + artifact_policy: keep + cache_key: build_routing_execution_log_v1 + command: + - python + - tools/build_routing_execution_log_v1.py + depends_on: + - convert_xlsx + id: build_routing_execution_log + inputs: + - tools/build_routing_execution_log_v1.py + - GatherTradingData.json + note: 'phase1_gate: routing decision path completeness + stage_coverage_pct/request_route' + outputs: + - Temp/routing_execution_log_v1.json + - Temp/routing_execution_log_table_v1.json + strict: false + timeout_sec: 30 + build_satellite_candidate_recommendations: + artifact_policy: keep + cache_key: build_satellite_candidate_recommendations_v1 + command: + - python + - tools/build_satellite_candidate_recommendations_v1.py + - --workbook + - GatherTradingData.xlsx + - --apply + depends_on: [] + id: build_satellite_candidate_recommendations + inputs: + - tools/build_satellite_candidate_recommendations_v1.py + - tools/fetch_naver_market_data_v1.py + - GatherTradingData.xlsx + note: universe 시트 미보유 후보(60종) 전체 Naver 시세 조회 — warn_only. --trade-csv 없으면 sector_export_trend + 전부 DATA_MISSING(정상, 추정 금지). + outputs: + - outputs/qualitative_sell_strategy/satellite_recommendations.json + strict: false + timeout_sec: 180 + warn_only: true + build_schema_models: + artifact_policy: keep + cache_key: build_schema_models_v1 + command: + - python + - tools/generate_models_from_schema.py + depends_on: [] + id: build_schema_models + inputs: + - tools/generate_models_from_schema.py + - schemas/generated + outputs: + - Temp/schema_model_generation_v1.json + strict: true + timeout_sec: 30 + build_sector_flow_history_progress: + artifact_policy: keep + cache_key: build_sector_flow_history_progress_v1 + command: + - python + - tools/build_sector_flow_history_progress_v1.py + depends_on: + - build_data_gated_progress + id: build_sector_flow_history_progress + inputs: + - tools/build_sector_flow_history_progress_v1.py + - GatherTradingData.json + note: WBS-2.5 sector_flow_history 30일 누적 진척도 — non-blocking diagnostic + outputs: + - Temp/sector_flow_history_progress_v1.json + strict: false + timeout_sec: 30 + build_sector_trend_analysis: + artifact_policy: keep + cache_key: build_sector_trend_analysis_v1 + command: + - python + - tools/build_sector_trend_analysis_v1.py + depends_on: + - convert_xlsx + id: build_sector_trend_analysis + inputs: + - tools/build_sector_trend_analysis_v1.py + - GatherTradingData.json + note: SECTOR_TREND_ANALYSIS_V1 — ETF proxy 기반 섹터 동향 + smart money 렌즈 집계 + outputs: + - Temp/sector_trend_analysis_v1.json + strict: false + timeout_sec: 30 + build_shadow_ledger: + artifact_policy: keep + cache_key: build_shadow_ledger_v2 + command: + - python + - tools/build_shadow_ledger_v2.py + - --out + - Temp/shadow_ledger_v2.json + depends_on: [] + id: build_shadow_ledger + inputs: + - tools/build_shadow_ledger_v2.py + outputs: + - Temp/shadow_ledger_v2.json + strict: true + timeout_sec: 30 + build_shadow_promotion: + artifact_policy: keep + cache_key: build_shadow_promotion_v1 + command: + - python + - tools/build_shadow_promotion_scorecard_v1.py + - --shadow + - Temp/shadow_ledger_v2.json + - --live-replay + - Temp/live_replay_separation_v3.json + contract: spec/57_shadow_promotion_scorecard.yaml + depends_on: + - build_shadow_ledger + - build_live_replay_separation + id: build_shadow_promotion + inputs: + - tools/build_shadow_promotion_scorecard_v1.py + - Temp/shadow_ledger_v2.json + - Temp/live_replay_separation_v3.json + outputs: + - Temp/shadow_promotion_scorecard_v1.json + strict: true + timeout_sec: 30 + build_smart_cash_recovery_v3: + artifact_policy: keep + cache_key: build_smart_cash_recovery_v3 + command: + - python + - tools/build_smart_cash_recovery_v3.py + depends_on: + - build_value_preservation_scorer + id: build_smart_cash_recovery_v3 + inputs: + - tools/build_smart_cash_recovery_v3.py + - GatherTradingData.json + - Temp/value_preservation_scorer_v1.json + note: 'phase1_gate: smart cash recovery V3 gate=PASS/CAUTION' + outputs: + - Temp/smart_cash_recovery_v3.json + strict: false + timeout_sec: 30 + build_strategy_routing_audit: + artifact_policy: keep + cache_key: build_strategy_routing_audit_v1 + command: + - python + - tools/build_strategy_routing_audit_v1.py + depends_on: + - inject_harness + id: build_strategy_routing_audit + inputs: + - tools/build_strategy_routing_audit_v1.py + - GatherTradingData.json + - Temp/horizon_classification_v1.json + - Temp/capital_style_allocation_v1.json + note: routing_gate 공식 산출 — MID/SHORT/LONG 호라이즌 상한 검증 + outputs: + - Temp/strategy_routing_audit_v1.json + strict: false + timeout_sec: 30 + build_time_stop_forecast: + artifact_policy: keep + cache_key: build_time_stop_forecast_v1 + command: + - python + - tools/build_time_stop_forecast_v1.py + - --harness + - Temp/computed_harness_v1.json + depends_on: + - build_formula_outputs + id: build_time_stop_forecast + inputs: + - tools/build_time_stop_forecast_v1.py + - Temp/computed_harness_v1.json + note: WARN 허용 (발동 임박 = 경고, 미발동 = PASS) + outputs: + - Temp/time_stop_forecast_v1.json + strict: false + timeout_sec: 30 + build_value_preservation_scorer: + artifact_policy: keep + cache_key: build_value_preservation_scorer_v1 + command: + - python + - tools/build_value_preservation_scorer_v1.py + depends_on: + - convert_xlsx + id: build_value_preservation_scorer + inputs: + - tools/build_value_preservation_scorer_v1.py + - GatherTradingData.json + note: 'phase1_gate: value preservation gate=PASS/CAUTION/WATCH_PENDING_SAMPLE' + outputs: + - Temp/value_preservation_scorer_v1.json + strict: false + timeout_sec: 30 + build_velocity: + artifact_policy: keep + cache_key: build_velocity_v1 + command: + - python + - tools/build_velocity_v1.py + depends_on: + - convert_xlsx + id: build_velocity + inputs: + - tools/build_velocity_v1.py + - GatherTradingData.json + note: VELOCITY_V1 — velocity_1d/velocity_5d 포트폴리오 중앙값 집계 (anti_late_entry_json) + outputs: + - Temp/velocity_v1.json + strict: false + timeout_sec: 30 + convert_xlsx: + artifact_policy: keep + cache_key: convert_xlsx_v1 + command: + - python + - tools/convert_xlsx_to_json.py + depends_on: [] + id: convert_xlsx + inputs: + - GatherTradingData.xlsx + outputs: + - GatherTradingData.json + strict: true + timeout_sec: 30 + finalize_packet: + artifact_policy: keep + cache_key: finalize_packet_v1 + command: + - python + - tools/build_packet_from_context_v1.py + depends_on: + - inject_harness + id: finalize_packet + inputs: + - tools/build_packet_from_context_v1.py + - Temp/final_decision_packet_active.json + outputs: + - Temp/final_decision_packet_active.json + strict: true + timeout_sec: 30 + inject_harness: + artifact_policy: keep + cache_key: inject_harness_v1 + command: + - python + - src/quant_engine/inject_computed_harness.py + - GatherTradingData.json + - --output + - Temp/final_decision_packet_active.json + depends_on: + - build_formula_outputs + id: inject_harness + inputs: + - src/quant_engine/inject_computed_harness.py + - GatherTradingData.json + - Temp/computed_harness_v1.json + outputs: + - Temp/final_decision_packet_active.json + strict: true + timeout_sec: 30 + prepare_zip: + artifact_policy: keep + cache_key: prepare_zip_v1 + command: + - python + - tools/prepare_upload_zip.py + - --skip-validate + - --skip-convert + - --validation-mode + - package-only + depends_on: + - audit_entropy + - validate_execution_precedence_lock_v2 + - validate_order_grammar_v1 + - validate_specs + - validate_no_direct_api_trading + - validate_active_manifest + - validate_report_sync + - validate_report_numeric_consistency + - validate_field_dict + - validate_provenance + - validate_low_capability + - validate_low_capability_pipeline_todo_v2 + - validate_golden_coverage + - validate_calibration + - validate_schema_model + - validate_gas_adapter + - build_gas_bundle + - validate_gas_adapter_contract + - validate_gas_bundle_sync + - validate_agents_shrink + - validate_no_replay_live_mix + - validate_prediction_accuracy_harness + - validate_alpha_feedback_loop + - validate_operational_alpha_calibration + - validate_realized_performance + - validate_data_gated_progress + - validate_sector_flow_history_progress + - validate_runtime_source_whitelist + - validate_cash_ledger + - validate_factor_lifecycle + - validate_factor_lifecycle_registry_v1 + - validate_factor_lifecycle_completeness + - validate_metric_alias_collision + - validate_architecture_boundaries + - validate_module_io_coverage + - validate_artifact_chain_hash + - validate_artifact_sync + - validate_renderer_no_calc + - validate_packaged_refs + - validate_property_invariants + - validate_anti_late_entry + - validate_rule_lifecycle + - validate_change_requests + - validate_completion_harness_instructions + - validate_engine_health_card + - validate_llm_regression + - validate_llm_copy_only + - build_final_decision + - build_final_context + - build_provenance_ledger + - build_live_replay_separation + - build_late_chase_attribution + - build_profit_giveback_ratchet + - build_shadow_ledger + - build_operating_cadence_signal + - build_engine_health_card + - build_module_io_coverage + - build_artifact_chain_hash + - build_report + - build_bundle + - build_schema_models + - build_architecture_boundaries + - validate_decision_trace + - validate_factor_conflicts + - validate_no_lookahead + - validate_execution_sim + - validate_render_diff + - build_shadow_promotion + - validate_llm_determinism + - build_time_stop_forecast + - validate_live_activation + - build_rebalance_sheet + - build_prediction_accuracy_harness + - build_alpha_feedback_loop + - build_calibration_priority + - build_calibration_change_ledger + - build_calibration_review_report + - build_calibration_approval_list + - build_calibration_decision_draft + - build_operational_alpha_calibration + - build_sector_flow_history_progress + id: prepare_zip + inputs: + - tools/prepare_upload_zip.py + outputs: [] + strict: true + timeout_sec: 60 + update_proposal_evaluation_history: + artifact_policy: keep + cache_key: update_proposal_evaluation_history_v2 + command: + - python + - tools/update_proposal_evaluation_history.py + - --json + - GatherTradingData.json + - --history + - Temp/proposal_evaluation_history.json + depends_on: + - finalize_packet + id: update_proposal_evaluation_history + inputs: + - tools/update_proposal_evaluation_history.py + - GatherTradingData.json + note: PROPOSAL_EVALUATION_HISTORY — T+1/T+5/T+20 운영 성과 누적 (core_satellite + + order_blueprint 기반, 일간 idempotent) + outputs: + - Temp/proposal_evaluation_history.json + strict: false + timeout_sec: 30 + validate_active_manifest: + artifact_policy: keep + cache_key: validate_active_manifest_v1 + command: + - python + - tools/validate_active_manifest.py + - --manifest + - runtime/active_artifact_manifest.yaml + - --strict + depends_on: [] + id: validate_active_manifest + inputs: + - tools/validate_active_manifest.py + - runtime/active_artifact_manifest.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_agents_shrink: + artifact_policy: keep + cache_key: validate_agents_shrink_v1 + command: + - python + - tools/validate_agents_shrink_v1.py + depends_on: [] + id: validate_agents_shrink + inputs: + - tools/validate_agents_shrink_v1.py + - AGENTS.md + outputs: [] + strict: true + timeout_sec: 30 + validate_alpha_feedback_loop: + artifact_policy: keep + cache_key: validate_alpha_feedback_loop_v2 + command: + - python + - tools/validate_alpha_feedback_loop_v2.py + depends_on: + - build_alpha_feedback_loop + id: validate_alpha_feedback_loop + inputs: + - tools/validate_alpha_feedback_loop_v2.py + - Temp/alpha_feedback_loop_v2.json + outputs: + - Temp/validate_alpha_feedback_loop_v2.json + strict: true + timeout_sec: 30 + validate_anti_late_entry: + artifact_policy: keep + cache_key: validate_anti_late_entry_v1 + command: + - python + - tools/validate_anti_late_entry_harness_v1.py + - --json + - Temp/late_chase_attribution_v2.json + depends_on: + - build_late_chase_attribution + id: validate_anti_late_entry + inputs: + - tools/validate_anti_late_entry_harness_v1.py + - Temp/late_chase_attribution_v2.json + outputs: [] + strict: true + timeout_sec: 30 + validate_anti_late_entry_gate_v5: + artifact_policy: keep + cache_key: validate_anti_late_entry_gate_v5 + command: + - python + - tools/validate_anti_late_entry_gate_v5.py + depends_on: [] + id: validate_anti_late_entry_gate_v5 + inputs: + - tools/validate_anti_late_entry_gate_v5.py + - GatherTradingData.json + outputs: + - Temp/anti_late_entry_gate_validation_v5.json + strict: true + timeout_sec: 30 + validate_architecture_boundaries: + artifact_policy: keep + cache_key: validate_architecture_boundaries_v2 + command: + - python + - tools/validate_architecture_boundaries_v2.py + depends_on: + - build_architecture_boundaries + id: validate_architecture_boundaries + inputs: + - tools/validate_architecture_boundaries_v2.py + - Temp/architecture_boundaries_v2.json + outputs: [] + strict: true + timeout_sec: 30 + validate_artifact_chain_hash: + artifact_policy: keep + cache_key: validate_artifact_chain_hash_v4 + command: + - python + - tools/validate_artifact_chain_hash_v4.py + depends_on: + - build_artifact_chain_hash + id: validate_artifact_chain_hash + inputs: + - tools/validate_artifact_chain_hash_v4.py + - Temp/artifact_chain_hash_v4.json + outputs: [] + strict: true + timeout_sec: 30 + validate_artifact_sync: + artifact_policy: keep + cache_key: validate_artifact_sync_v1 + command: + - python + - tools/validate_artifact_sync_v1.py + - --engine-result + - Temp/engine_harness_gate_result.json + - --manifest + - runtime/active_artifact_manifest.yaml + - --registry + - Temp/formula_runtime_registry_v1.json + depends_on: + - validate_engine_health_card + id: validate_artifact_sync + inputs: + - tools/validate_artifact_sync_v1.py + - Temp/engine_harness_gate_result.json + - Temp/formula_runtime_registry_v1.json + - runtime/active_artifact_manifest.yaml + outputs: [] + strict: false + timeout_sec: 30 + warn_only: true + validate_calibration: + artifact_policy: keep + cache_key: validate_calibration_v1 + command: + - python + - tools/validate_calibration_registry_v1.py + depends_on: [] + id: validate_calibration + inputs: + - tools/validate_calibration_registry_v1.py + outputs: [] + strict: true + timeout_sec: 30 + validate_cash_floor_policy_v1: + artifact_policy: keep + cache_key: validate_cash_floor_policy_v1 + command: + - python + - tools/validate_cash_floor_policy_v1.py + depends_on: + - build_report + id: validate_cash_floor_policy_v1 + inputs: + - tools/validate_cash_floor_policy_v1.py + - GatherTradingData.json + - Temp/operational_report.json + outputs: + - Temp/cash_floor_policy_validation_v1.json + strict: true + timeout_sec: 30 + validate_cash_ledger: + artifact_policy: keep + cache_key: validate_cash_ledger_v2 + command: + - python + - tools/validate_cash_ledger_v2.py + - --snapshot + - GatherTradingData.json + - --contract + - spec/15_account_snapshot_contract.yaml + depends_on: [] + id: validate_cash_ledger + inputs: + - tools/validate_cash_ledger_v2.py + - GatherTradingData.json + - spec/15_account_snapshot_contract.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_change_requests: + artifact_policy: keep + cache_key: validate_change_requests_v1 + command: + - python + - tools/validate_change_requests_v1.py + - --dir + - governance/change_requests + - --strict + depends_on: [] + id: validate_change_requests + inputs: + - tools/validate_change_requests_v1.py + outputs: [] + strict: true + timeout_sec: 30 + validate_completion_harness_instructions: + artifact_policy: keep + cache_key: validate_completion_harness_instructions_v1 + command: + - python + - tools/validate_completion_harness_instructions_v1.py + depends_on: [] + id: validate_completion_harness_instructions + inputs: + - tools/validate_completion_harness_instructions_v1.py + - AGENTS.md + - REPORT_GUIDE.md + - docs/runbook.md + - docs/ROADMAP_WBS.md + - docs/doctrine.md + - prompts/analysis_prompt.md + - prompts/review_prompt.md + - prompts/capture_parse_prompt.md + - prompts/engine_audit_master_prompt_v2.md + - prompts/engine_audit_master_prompt_v3.md + - prompts/engine_audit_prompt.md + - prompts/low_capability_report_renderer.md + - prompts/report_renderer_prompt.md + - prompts/weekly_operational_report_master_prompt_v1.md + outputs: + - Temp/completion_harness_instructions_v1.json + strict: true + timeout_sec: 30 + validate_data_gated_progress: + artifact_policy: keep + cache_key: validate_data_gated_progress_v1 + command: + - python + - tools/validate_data_gated_progress_v1.py + depends_on: + - build_data_gated_progress + id: validate_data_gated_progress + inputs: + - tools/validate_data_gated_progress_v1.py + - Temp/data_gated_progress_v1.json + note: WBS-4.x DATA_GATED 진척도 계약 검증 + outputs: + - Temp/validate_data_gated_progress_v1.json + strict: true + timeout_sec: 30 + validate_decision_graph_precedence_v1: + artifact_policy: keep + cache_key: validate_decision_graph_precedence_v1 + command: + - python + - tools/validate_decision_graph_precedence_v1.py + depends_on: [] + id: validate_decision_graph_precedence_v1 + inputs: + - tools/validate_decision_graph_precedence_v1.py + - spec/routing/decision_graph.yaml + outputs: + - Temp/decision_graph_precedence_validation_v1.json + strict: true + timeout_sec: 30 + validate_decision_trace: + artifact_policy: keep + cache_key: validate_decision_trace_v1 + command: + - python + - tools/validate_decision_trace_replay_v1.py + - --packet + - Temp/final_decision_packet_active.json + - --harness + - Temp/computed_harness_v1.json + contract: spec/52_decision_trace_replay_contract.yaml + depends_on: + - finalize_packet + - build_formula_outputs + id: validate_decision_trace + inputs: + - tools/validate_decision_trace_replay_v1.py + - Temp/final_decision_packet_active.json + - Temp/computed_harness_v1.json + outputs: + - Temp/decision_trace_replay_v1.json + strict: true + timeout_sec: 30 + validate_docs_no_formula_duplication: + artifact_policy: keep + cache_key: validate_docs_no_formula_duplication_v1 + command: + - python + - tools/validate_docs_no_formula_duplication_v1.py + depends_on: [] + id: validate_docs_no_formula_duplication + inputs: + - tools/validate_docs_no_formula_duplication_v1.py + - AGENTS.md + - docs/doctrine.md + - docs/runbook.md + outputs: + - Temp/docs_no_formula_duplication_v1.json + strict: true + timeout_sec: 30 + validate_engine_health_card: + artifact_policy: keep + cache_key: validate_engine_health_card_v1 + command: + - python + - tools/validate_engine_health_card_v1.py + - --json + - Temp/engine_health_card_v1.json + depends_on: + - build_engine_health_card + id: validate_engine_health_card + inputs: + - tools/validate_engine_health_card_v1.py + - Temp/engine_health_card_v1.json + outputs: [] + strict: true + timeout_sec: 30 + validate_execution_precedence_lock_v2: + artifact_policy: keep + cache_key: validate_execution_precedence_lock_v2 + command: + - python + - tools/validate_execution_precedence_lock_v2.py + depends_on: + - build_honest_performance_guard + id: validate_execution_precedence_lock_v2 + inputs: + - tools/validate_execution_precedence_lock_v2.py + - Temp/final_execution_decision_v4.json + outputs: + - Temp/execution_precedence_lock_v2.json + strict: true + timeout_sec: 30 + validate_execution_sim: + artifact_policy: keep + cache_key: validate_execution_sim_v1 + command: + - python + - tools/validate_execution_simulator_v1.py + - --packet + - Temp/final_decision_packet_active.json + contract: spec/55_execution_simulator_contract.yaml + depends_on: + - finalize_packet + id: validate_execution_sim + inputs: + - tools/validate_execution_simulator_v1.py + - Temp/final_decision_packet_active.json + outputs: + - Temp/execution_simulator_v1.json + strict: true + timeout_sec: 30 + validate_factor_conflict_precedence_v1: + artifact_policy: keep + cache_key: validate_factor_conflict_precedence_v1 + command: + - python + - tools/validate_factor_conflict_precedence_v1.py + depends_on: [] + id: validate_factor_conflict_precedence_v1 + inputs: + - tools/validate_factor_conflict_precedence_v1.py + - spec/strategy/pre_distribution_early_warning_v4.yaml + - spec/strategy/smart_money_liquidity_gate_v1.yaml + - spec/09_decision_flow.yaml + - GatherTradingData.json + outputs: + - Temp/factor_conflict_precedence_validation_v1.json + strict: true + timeout_sec: 30 + validate_factor_conflicts: + artifact_policy: keep + cache_key: validate_factor_conflicts_v1 + command: + - python + - tools/validate_factor_conflict_matrix_v1.py + - --taxonomy + - spec/43_quant_factor_taxonomy.yaml + - --packet + - Temp/final_decision_packet_active.json + contract: spec/53_factor_conflict_matrix.yaml + depends_on: + - finalize_packet + id: validate_factor_conflicts + inputs: + - tools/validate_factor_conflict_matrix_v1.py + - spec/43_quant_factor_taxonomy.yaml + - Temp/final_decision_packet_active.json + outputs: + - Temp/factor_conflict_matrix_v1.json + strict: true + timeout_sec: 30 + validate_factor_lifecycle: + artifact_policy: keep + cache_key: validate_factor_lifecycle_v1 + command: + - python + - tools/validate_factor_lifecycle_v1.py + - --taxonomy + - spec/43_quant_factor_taxonomy.yaml + depends_on: [] + id: validate_factor_lifecycle + inputs: + - tools/validate_factor_lifecycle_v1.py + - spec/43_quant_factor_taxonomy.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_factor_lifecycle_completeness: + artifact_policy: keep + cache_key: validate_factor_lifecycle_completeness_v1 + command: + - python + - tools/validate_factor_lifecycle_completeness_v1.py + depends_on: + - build_factor_shadow_eligibility + id: validate_factor_lifecycle_completeness + inputs: + - tools/validate_factor_lifecycle_completeness_v1.py + - spec/factor_lifecycle_registry.yaml + - Temp/factor_shadow_eligibility_v1.json + outputs: + - Temp/factor_lifecycle_completeness_v1.json + strict: true + timeout_sec: 30 + validate_factor_lifecycle_registry_v1: + artifact_policy: keep + cache_key: validate_factor_lifecycle_registry_v1 + command: + - python + - tools/validate_factor_lifecycle_registry_v1.py + depends_on: [] + id: validate_factor_lifecycle_registry_v1 + inputs: + - tools/validate_factor_lifecycle_registry_v1.py + - spec/43_quant_factor_taxonomy.yaml + - spec/factor_lifecycle_registry.yaml + outputs: + - Temp/factor_lifecycle_registry_validation_v1.json + strict: true + timeout_sec: 30 + validate_field_dict: + artifact_policy: keep + cache_key: validate_field_dict_v1 + command: + - python + - tools/validate_field_dictionary.py + depends_on: [] + id: validate_field_dict + inputs: + - tools/validate_field_dictionary.py + - spec/12_field_dictionary.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_gas_adapter: + artifact_policy: keep + cache_key: validate_gas_adapter_v1 + command: + - python + - tools/validate_gas_thin_adapter_v1.py + depends_on: [] + id: validate_gas_adapter + inputs: + - tools/validate_gas_thin_adapter_v1.py + outputs: [] + strict: true + timeout_sec: 30 + validate_gas_adapter_contract: + artifact_policy: keep + cache_key: validate_gas_adapter_contract_v1 + command: + - python + - tools/validate_gas_adapter_contract_v1.py + depends_on: [] + id: validate_gas_adapter_contract + inputs: + - tools/validate_gas_adapter_contract_v1.py + - spec/gas_adapter_contract.yaml + - schemas/generated/gas_adapter_contract.schema.json + - spec/14_raw_workbook_mapping.yaml + - spec/15_account_snapshot_contract.yaml + outputs: + - Temp/gas_adapter_contract_validation_v1.json + strict: true + timeout_sec: 30 + validate_gas_bundle_sync: + artifact_policy: keep + cache_key: validate_gas_bundle_sync_v1 + command: + - python + - tools/validate_gas_bundle_sync_v1.py + depends_on: + - build_gas_bundle + id: validate_gas_bundle_sync + inputs: + - tools/validate_gas_bundle_sync_v1.py + - gas_lib.gs + - gas_data_collect.gs + - gas_data_feed.gs + - src/gas/core/gas_lib.gs + - src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs + - src/gas_adapter_parts/gdc_02_account_satellite.gs + - src/gas_adapter_parts/gdf_01_price_metrics.gs + - src/gas_adapter_parts/gdf_02_harness_assembly.gs + - src/gas_adapter_parts/gdf_03_portfolio_gates.gs + - src/gas_adapter_parts/gdf_04_execution_quality.gs + - src/gas_adapter_parts/gdf_05_alpha_engines.gs + - src/gas_adapter_parts/gdf_06_rebalance.gs + outputs: + - Temp/gas_bundle_validation_v1.json + strict: true + timeout_sec: 30 + validate_golden_coverage: + artifact_policy: keep + cache_key: validate_golden_coverage_v1 + command: + - python + - tools/validate_golden_coverage_100.py + depends_on: [] + id: validate_golden_coverage + inputs: + - tools/validate_golden_coverage_100.py + outputs: [] + strict: true + timeout_sec: 30 + validate_honest_performance_guard_v1: + artifact_policy: keep + cache_key: validate_honest_performance_guard_v1 + command: + - python + - tools/validate_honest_performance_guard_v1.py + depends_on: + - build_honest_performance_guard + id: validate_honest_performance_guard_v1 + inputs: + - tools/validate_honest_performance_guard_v1.py + - Temp/prediction_accuracy_harness_v2.json + - Temp/honest_performance_guard_v1.json + outputs: + - Temp/honest_performance_guard_validation_v1.json + strict: true + timeout_sec: 30 + validate_json_generator_outputs: + artifact_policy: keep + cache_key: validate_json_generator_outputs_v1 + command: + - python + - tools/validate_json_generator_outputs_v1.py + depends_on: + - inject_harness + - finalize_packet + - build_report + id: validate_json_generator_outputs + inputs: + - tools/validate_json_generator_outputs_v1.py + - Temp/computed_harness_v1.json + - Temp/final_decision_packet_active.json + - Temp/operational_report.json + outputs: + - Temp/json_generator_outputs_v1.json + strict: true + timeout_sec: 30 + validate_live_activation: + artifact_policy: keep + cache_key: validate_live_activation_v1 + command: + - python + - tools/validate_live_data_activation_gate_v1.py + depends_on: [] + id: validate_live_activation + inputs: + - tools/validate_live_data_activation_gate_v1.py + - Temp/continuous_evaluation_dashboard_v1.json + - Temp/prediction_accuracy_harness_v2.json + - Temp/algorithm_guidance_proof_v1.json + - Temp/pass_100_criteria_v3.json + note: PENDING(live_t20<30) = 정상. FAIL = 전환 조건 미충족. 2026-07-15 자동 활성화 예정. + outputs: + - Temp/live_data_activation_gate_v1.json + strict: false + timeout_sec: 30 + validate_llm_copy_only: + artifact_policy: keep + cache_key: validate_llm_copy_only_v1 + command: + - python + - tools/validate_llm_copy_only_output_v1.py + - --packet + - Temp/final_decision_packet_active.json + - --report + - Temp/operational_report.json + depends_on: + - build_report + - build_final_decision + id: validate_llm_copy_only + inputs: + - tools/validate_llm_copy_only_output_v1.py + - Temp/final_decision_packet_active.json + - Temp/operational_report.json + outputs: [] + strict: true + timeout_sec: 30 + validate_llm_determinism: + artifact_policy: keep + cache_key: validate_llm_determinism_v1 + command: + - python + - tools/validate_llm_determinism_pack_v1.py + - --context + - Temp/final_context_for_llm_v5.yaml + contract: spec/58_llm_determinism_contract.yaml + depends_on: + - build_final_context + id: validate_llm_determinism + inputs: + - tools/validate_llm_determinism_pack_v1.py + - Temp/final_context_for_llm_v5.yaml + outputs: + - Temp/llm_determinism_pack_v1.json + strict: true + timeout_sec: 30 + validate_llm_regression: + artifact_policy: keep + cache_key: validate_llm_regression_v1 + command: + - python + - tools/run_low_capability_llm_regression_v1.py + - --fixture + - tests/llm_regression + - --context + - Temp/final_context_for_llm_v5.yaml + depends_on: + - build_final_context + id: validate_llm_regression + inputs: + - tools/run_low_capability_llm_regression_v1.py + - Temp/final_context_for_llm_v5.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_low_capability: + artifact_policy: keep + cache_key: validate_low_capability_v1 + command: + - python + - tools/validate_low_capability_pack_v1.py + - --context + - Temp/final_context_for_llm_v5.yaml + - --contract + - spec/46_low_capability_execution_pack.yaml + depends_on: + - build_final_context + id: validate_low_capability + inputs: + - tools/validate_low_capability_pack_v1.py + - Temp/final_context_for_llm_v5.yaml + - spec/46_low_capability_execution_pack.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_low_capability_pipeline_todo_v2: + artifact_policy: keep + cache_key: validate_low_capability_pipeline_todo_v2 + command: + - python + - tools/validate_low_capability_pipeline_todo_v2.py + depends_on: [] + id: validate_low_capability_pipeline_todo_v2 + inputs: + - tools/validate_low_capability_pipeline_todo_v2.py + - spec/23_low_capability_llm_pipeline_todo.yaml + outputs: + - Temp/low_capability_pipeline_todo_validation_v2.json + strict: true + timeout_sec: 30 + validate_metric_alias_collision: + artifact_policy: keep + cache_key: validate_metric_alias_collision_v1 + command: + - python + - tools/validate_metric_alias_collision_v1.py + - --registry + - spec/25_canonical_metrics_registry.yaml + - --report + - Temp/operational_report.json + depends_on: [] + id: validate_metric_alias_collision + inputs: + - tools/validate_metric_alias_collision_v1.py + - spec/25_canonical_metrics_registry.yaml + - Temp/operational_report.json + outputs: [] + strict: true + timeout_sec: 30 + validate_module_io_coverage: + artifact_policy: keep + cache_key: validate_module_io_coverage_v1 + command: + - python + - tools/validate_module_io_coverage_v1.py + depends_on: + - build_module_io_coverage + id: validate_module_io_coverage + inputs: + - tools/validate_module_io_coverage_v1.py + - Temp/module_io_coverage_v1.json + outputs: [] + strict: true + timeout_sec: 30 + validate_no_direct_api_trading: + artifact_policy: keep + cache_key: validate_no_direct_api_trading_v1 + command: + - python + - tools/validate_no_direct_api_trading_v1.py + depends_on: [] + id: validate_no_direct_api_trading + inputs: + - tools/validate_no_direct_api_trading_v1.py + - src/quant_engine/kis_api_client_v1.py + - governance/rules/06_no_direct_api_trading.yaml + note: '[CRITICAL] 매수/매도 API 직접 실행 절대 금지 게이트 — warn_only 불가, 완화 대상 아님(사용자 직접 + 지시 2026-06-21). 순수 stdlib만 사용해 Synology ARMv7 CI에서도 항상 실행 가능.' + outputs: [] + strict: true + timeout_sec: 30 + validate_no_lookahead: + artifact_policy: keep + cache_key: validate_no_lookahead_v1 + command: + - python + - tools/validate_no_lookahead_bias_v1.py + - --harness + - Temp/computed_harness_v1.json + contract: spec/54_temporal_data_integrity.yaml + depends_on: + - build_formula_outputs + id: validate_no_lookahead + inputs: + - tools/validate_no_lookahead_bias_v1.py + - Temp/computed_harness_v1.json + outputs: + - Temp/no_lookahead_bias_v1.json + strict: true + timeout_sec: 30 + validate_no_replay_live_mix: + artifact_policy: keep + cache_key: validate_no_replay_live_mix_v2 + command: + - python + - tools/validate_no_replay_live_mix_v2.py + - --json + - Temp/live_replay_separation_v3.json + - --strict + depends_on: + - build_live_replay_separation + id: validate_no_replay_live_mix + inputs: + - tools/validate_no_replay_live_mix_v2.py + - Temp/live_replay_separation_v3.json + outputs: [] + strict: true + timeout_sec: 30 + validate_operational_alpha_calibration: + artifact_policy: keep + cache_key: validate_operational_alpha_calibration_v2 + command: + - python + - tools/validate_operational_alpha_calibration_v2.py + depends_on: + - build_operational_alpha_calibration + id: validate_operational_alpha_calibration + inputs: + - tools/validate_operational_alpha_calibration_v2.py + - Temp/operational_alpha_calibration_v2.json + outputs: + - Temp/validate_operational_alpha_calibration_v2.json + strict: true + timeout_sec: 30 + validate_order_grammar_v1: + artifact_policy: keep + cache_key: validate_order_grammar_v1 + command: + - python + - tools/validate_order_grammar_v1.py + depends_on: + - build_honest_performance_guard + id: validate_order_grammar_v1 + inputs: + - tools/validate_order_grammar_v1.py + - GatherTradingData.json + outputs: + - Temp/order_grammar_validation_v1.json + strict: true + timeout_sec: 30 + validate_packaged_refs: + artifact_policy: keep + cache_key: validate_packaged_refs_v1 + command: + - python + - tools/validate_packaged_artifact_references_v1.py + - --strict + depends_on: [] + id: validate_packaged_refs + inputs: + - tools/validate_packaged_artifact_references_v1.py + - runtime/active_artifact_manifest.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_position_sizing: + artifact_policy: keep + cache_key: validate_position_sizing + command: + - python + - tools/validate_position_sizing.py + depends_on: + - build_report + id: validate_position_sizing + inputs: + - tools/validate_position_sizing.py + - spec/01_objective_profile.yaml + - Temp/goal_risk_budget_harness_v3.json + outputs: + - Temp/position_sizing_validation_v1.json + strict: true + timeout_sec: 30 + validate_prediction_accuracy_harness: + artifact_policy: keep + cache_key: validate_prediction_accuracy_harness_v2 + command: + - python + - tools/validate_prediction_accuracy_harness_v2.py + depends_on: + - build_prediction_accuracy_harness + id: validate_prediction_accuracy_harness + inputs: + - tools/validate_prediction_accuracy_harness_v2.py + - Temp/prediction_accuracy_harness_v2.json + outputs: + - Temp/validate_prediction_accuracy_harness_v2.json + strict: true + timeout_sec: 30 + validate_property_invariants: + artifact_policy: keep + cache_key: validate_property_invariants_v1 + command: + - python + - tools/run_property_tests_v1.py + depends_on: [] + id: validate_property_invariants + inputs: + - tools/run_property_tests_v1.py + - spec/property_invariants.yaml + outputs: + - Temp/property_test_result_v1.json + strict: true + timeout_sec: 30 + validate_provenance: + artifact_policy: keep + cache_key: validate_provenance_v1 + command: + - python + - tools/validate_number_provenance_strict_v3.py + - --ledger + - Temp/number_provenance_ledger_v4.json + - --report + - Temp/operational_report.md + depends_on: + - build_provenance_ledger + - build_report + id: validate_provenance + inputs: + - tools/validate_number_provenance_strict_v3.py + - Temp/number_provenance_ledger_v4.json + - Temp/operational_report.md + outputs: [] + strict: true + timeout_sec: 30 + validate_realized_performance: + artifact_policy: keep + cache_key: validate_realized_performance_v1 + command: + - python + - tools/validate_realized_performance_v1.py + depends_on: + - build_realized_performance + id: validate_realized_performance + inputs: + - tools/validate_realized_performance_v1.py + - Temp/realized_performance_v1.json + note: REALIZED_PERFORMANCE_V1 output schema and evidence validation + outputs: + - Temp/validate_realized_performance_v1.json + strict: true + timeout_sec: 30 + validate_render_diff: + artifact_policy: keep + cache_key: validate_render_diff_v1 + command: + - python + - tools/validate_report_render_diff_v1.py + - --packet + - Temp/final_decision_packet_active.json + - --report + - Temp/operational_report.json + contract: spec/56_renderer_copy_only_contract.yaml + depends_on: + - build_report + - finalize_packet + id: validate_render_diff + inputs: + - tools/validate_report_render_diff_v1.py + - Temp/final_decision_packet_active.json + - Temp/operational_report.json + outputs: + - Temp/report_render_diff_v1.json + strict: true + timeout_sec: 30 + validate_renderer_no_calc: + artifact_policy: keep + cache_key: validate_renderer_no_calc_v1 + command: + - python + - tools/validate_renderer_no_calculation_v1.py + depends_on: [] + id: validate_renderer_no_calc + inputs: + - tools/validate_renderer_no_calculation_v1.py + outputs: [] + strict: true + timeout_sec: 30 + validate_report_numeric_consistency: + artifact_policy: keep + cache_key: validate_report_numeric_consistency_v1 + command: + - python + - tools/validate_report_numeric_consistency_guard_v2.py + - --packet + - Temp/final_decision_packet_active.json + - --report + - Temp/operational_report.json + depends_on: + - build_report + id: validate_report_numeric_consistency + inputs: + - tools/validate_report_numeric_consistency_guard_v2.py + - Temp/final_decision_packet_active.json + - Temp/operational_report.json + outputs: [] + strict: true + timeout_sec: 30 + validate_report_section_completeness: + artifact_policy: keep + cache_key: validate_report_section_completeness_v1 + command: + - python + - tools/validate_report_section_completeness_v1.py + - --report-json + - Temp/operational_report.json + depends_on: + - build_report + id: validate_report_section_completeness + inputs: + - tools/validate_report_section_completeness_v1.py + - Temp/operational_report.json + outputs: + - Temp/report_section_completeness.json + strict: true + timeout_sec: 30 + validate_report_sync: + artifact_policy: keep + cache_key: validate_report_sync_v1 + command: + - python + - tools/validate_report_packet_sync_v1.py + - --packet + - Temp/final_decision_packet_active.json + - --report + - Temp/operational_report.json + depends_on: + - build_report + id: validate_report_sync + inputs: + - tools/validate_report_packet_sync_v1.py + - Temp/final_decision_packet_active.json + - Temp/operational_report.json + outputs: [] + strict: true + timeout_sec: 30 + validate_rule_lifecycle: + artifact_policy: keep + cache_key: validate_rule_lifecycle_v2 + command: + - python + - tools/validate_rule_lifecycle_v2.py + - --strict + depends_on: + - build_shadow_ledger + id: validate_rule_lifecycle + inputs: + - tools/validate_rule_lifecycle_v2.py + - Temp/shadow_ledger_v2.json + outputs: [] + strict: true + timeout_sec: 30 + validate_runtime_source_whitelist: + artifact_policy: keep + cache_key: validate_runtime_source_whitelist_v1 + command: + - python + - tools/validate_runtime_source_whitelist_v1.py + - --manifest + - runtime/active_artifact_manifest.yaml + - --scan + - src + - gas_*.gs + depends_on: [] + id: validate_runtime_source_whitelist + inputs: + - tools/validate_runtime_source_whitelist_v1.py + - runtime/active_artifact_manifest.yaml + outputs: [] + strict: true + timeout_sec: 30 + validate_schema_model: + artifact_policy: keep + cache_key: validate_schema_model_v1 + command: + - python + - tools/validate_schema_model_generation_v1.py + depends_on: + - build_schema_models + id: validate_schema_model + inputs: + - tools/validate_schema_model_generation_v1.py + - Temp/schema_model_generation_v1.json + outputs: [] + strict: true + timeout_sec: 30 + validate_sector_flow_history_progress: + artifact_policy: keep + cache_key: validate_sector_flow_history_progress_v1 + command: + - python + - tools/validate_sector_flow_history_progress_v1.py + depends_on: + - build_sector_flow_history_progress + id: validate_sector_flow_history_progress + inputs: + - tools/validate_sector_flow_history_progress_v1.py + - Temp/sector_flow_history_progress_v1.json + outputs: + - Temp/validate_sector_flow_history_progress_v1.json + strict: true + timeout_sec: 30 + validate_sector_universe_monthly_refresh: + artifact_policy: keep + cache_key: validate_sector_universe_monthly_refresh_v1 + command: + - python + - tools/validate_sector_universe_monthly_refresh_v1.py + depends_on: [] + id: validate_sector_universe_monthly_refresh + inputs: + - tools/validate_sector_universe_monthly_refresh_v1.py + - GatherTradingData.xlsx + note: 섹터 유니버스 월간 갱신 provenance 검증 (warn_only) — GAS 재다운로드 시 Source_URL 소실이 정상. + 월간 --apply 실행 후 PASS/WARN 달성. FAIL=비차단 경고만. + outputs: + - Temp/sector_universe_refresh_validation.json + strict: false + timeout_sec: 60 + warn_only: true + validate_specs: + artifact_policy: keep + cache_key: validate_specs_v1 + command: + - python + - tools/validate_specs.py + depends_on: [] + id: validate_specs + inputs: + - tools/validate_specs.py + - spec/13_formula_registry.yaml + outputs: [] + strict: true + timeout_sec: 60 +execution_order: + wave_0: + - audit_entropy + - build_bundle + - build_gas_bundle + - build_macro_event_ticker_impact + - build_engine_health_card + - build_late_chase_attribution + - build_live_replay_separation + - build_module_io_coverage + - build_operating_cadence_signal + - build_profit_giveback_ratchet + - build_schema_models + - build_shadow_ledger + - convert_xlsx + - validate_active_manifest + - validate_agents_shrink + - validate_docs_no_formula_duplication + - validate_calibration + - validate_cash_ledger + - validate_change_requests + - validate_completion_harness_instructions + - validate_factor_lifecycle + - validate_factor_lifecycle_registry_v1 + - validate_factor_lifecycle_completeness + - validate_field_dict + - validate_gas_adapter + - validate_gas_adapter_contract + - validate_golden_coverage + - validate_live_activation + - validate_metric_alias_collision + - validate_packaged_refs + - validate_property_invariants + - validate_renderer_no_calc + - validate_runtime_source_whitelist + - validate_sector_universe_monthly_refresh + - validate_specs + wave_1: + - validate_gas_bundle_sync + - build_anti_whipsaw_gate + - build_data_gated_progress + - build_ejce_view_renderer + - build_etf_representative_monitor + - build_factor_shadow_eligibility + - build_formula_outputs + - build_sector_flow_history_progress + - build_realized_performance + - build_missing_formula_bridge + - build_ratchet_trailing_general + - build_rebalance_sheet + - build_regime_trim_guidance + - build_routing_execution_log + - build_sector_trend_analysis + - build_shadow_promotion + - build_value_preservation_scorer + - build_velocity + - validate_anti_late_entry + - validate_engine_health_card + - validate_module_io_coverage + - validate_no_replay_live_mix + - validate_realized_performance + - validate_rule_lifecycle + - validate_schema_model + wave_2: + - build_smart_cash_recovery_v3 + - build_time_stop_forecast + - inject_harness + - validate_artifact_sync + - validate_no_lookahead + wave_3: + - apply_strategy_execution_locks + - build_strategy_routing_audit + - finalize_packet + wave_4: + - build_final_decision + - build_horizon_rebalance_plan + - validate_decision_trace + - validate_execution_sim + - validate_factor_conflicts + wave_5: + - build_final_context + - build_provenance_ledger + - build_report + - update_proposal_evaluation_history + - build_operational_eval_queue + - build_operational_outcome_lock + wave_6: + - build_algorithm_guidance_proof + - build_artifact_chain_hash + - build_calibration_priority + - build_calibration_change_ledger + - build_calibration_review_report + - build_calibration_approval_list + - build_calibration_decision_draft + - build_alpha_feedback_loop + - build_honest_proof_gap_analyzer + - build_operational_alpha_calibration + - build_prediction_accuracy_harness + - validate_data_gated_progress + - validate_sector_flow_history_progress + - validate_json_generator_outputs + - validate_alpha_feedback_loop + - validate_llm_copy_only + - validate_llm_determinism + - validate_llm_regression + - validate_low_capability + - validate_low_capability_pipeline_todo_v2 + - validate_execution_precedence_lock_v2 + - validate_order_grammar_v1 + - validate_provenance + - validate_prediction_accuracy_harness + - validate_operational_alpha_calibration + - validate_render_diff + - validate_report_numeric_consistency + - validate_report_section_completeness + - validate_report_sync + wave_7: + - build_architecture_boundaries + - validate_artifact_chain_hash + wave_8: + - validate_architecture_boundaries + wave_9: + - prepare_zip +goal: Linearize package.json scripts into a validated DAG execution graph. +has_code_implementation: true +meta: + code_path: tools/ or spec/ or .gitea/workflows + has_code_implementation: true +schema_version: release_dag.v3 +step_count: 104 diff --git a/spec/52_decision_trace_replay_contract.yaml b/spec/52_decision_trace_replay_contract.yaml index 36f8d23..5c75f71 100644 --- a/spec/52_decision_trace_replay_contract.yaml +++ b/spec/52_decision_trace_replay_contract.yaml @@ -1,52 +1,50 @@ -schema_version: decision_trace_replay_contract.v1 +acceptance_criteria: +- every_final_verdict_has_ordered_gate_trace: true +- missing_gate_trace_blocks_release: true +- verdict_replay_match_pct: 100.0 +authority: spec/52_decision_trace_replay_contract.yaml +code_path: tools/validate_decision_trace_replay_v1.py contract_id: H001_DECISION_TRACE_REPLAY +created_at: '2026-06-10T23:29:00+09:00' +hard_gates: +- condition: all decisions have gate_trace length >= 1 + gate_id: TRACE_COMPLETE + on_fail: BLOCK_RELEASE +- condition: verdict_replay_match_pct == 100.0 + gate_id: VERDICT_REPLAY_MATCH + on_fail: BLOCK_RELEASE harness_file: tools/validate_decision_trace_replay_v1.py has_code_implementation: true -code_path: "tools/validate_decision_trace_replay_v1.py" -authority: spec/52_decision_trace_replay_contract.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 최종 매수/보유/매도 결론까지 사용된 모든 gate와 feature를 trace로 복원하여, - 결정의 재현성을 보장한다. 결론이 달라지는 trace 불일치는 릴리즈를 차단한다. - inputs: - - field: final_decision_packet_active.json - source: Temp/final_decision_packet_active.json - required: true - - field: computed_harness_v1.json - source: Temp/computed_harness_v1.json - required: true - -output_fields: - - name: gate_trace - type: list[str] - description: 결론까지 순서대로 통과한 gate ID 목록 - - name: feature_trace - type: dict - description: 결론에 사용된 feature key → value 맵 - - name: verdict_replay_match - type: bool - description: 재실행 시 최종 verdict가 동일한지 여부 - -acceptance_criteria: - - every_final_verdict_has_ordered_gate_trace: true - - missing_gate_trace_blocks_release: true - - verdict_replay_match_pct: 100.0 - -hard_gates: - - gate_id: TRACE_COMPLETE - condition: all decisions have gate_trace length >= 1 - on_fail: BLOCK_RELEASE - - gate_id: VERDICT_REPLAY_MATCH - condition: verdict_replay_match_pct == 100.0 - on_fail: BLOCK_RELEASE - -non_negotiable: - - LLM은 gate_trace를 번복하거나 재해석하지 않는다 - - replay 시 동일 packet 입력이면 동일 결론을 내야 한다 - - trace가 없는 결론은 DATA_MISSING으로 표기하고 릴리즈를 차단한다 - -owner: quant_architect +- field: final_decision_packet_active.json + required: true + source: Temp/final_decision_packet_active.json +- field: computed_harness_v1.json + required: true + source: Temp/computed_harness_v1.json lifecycle_state: active -retirement_condition: > - 대체 결정 추적 계약이 이 계약을 명시적으로 교체 선언할 때까지 유효하다. +meta: + has_code_implementation: false +non_negotiable: +- LLM은 gate_trace를 번복하거나 재해석하지 않는다 +- replay 시 동일 packet 입력이면 동일 결론을 내야 한다 +- trace가 없는 결론은 DATA_MISSING으로 표기하고 릴리즈를 차단한다 +output_fields: +- description: 결론까지 순서대로 통과한 gate ID 목록 + name: gate_trace + type: list[str] +- description: 결론에 사용된 feature key → value 맵 + name: feature_trace + type: dict +- description: 재실행 시 최종 verdict가 동일한지 여부 + name: verdict_replay_match + type: bool +owner: quant_architect +purpose: '최종 매수/보유/매도 결론까지 사용된 모든 gate와 feature를 trace로 복원하여, 결정의 재현성을 보장한다. 결론이 달라지는 + trace 불일치는 릴리즈를 차단한다. + + ' +retirement_condition: '대체 결정 추적 계약이 이 계약을 명시적으로 교체 선언할 때까지 유효하다. + + ' +schema_version: decision_trace_replay_contract.v1 diff --git a/spec/53_factor_conflict_matrix.yaml b/spec/53_factor_conflict_matrix.yaml index 0e84e43..2a53b32 100644 --- a/spec/53_factor_conflict_matrix.yaml +++ b/spec/53_factor_conflict_matrix.yaml @@ -1,69 +1,68 @@ -schema_version: factor_conflict_matrix.v1 +acceptance_criteria: +- conflict_precedence_defined_for_every_active_factor: true +- unresolved_conflict_count: 0 +authority: spec/53_factor_conflict_matrix.yaml +code_path: tools/validate_factor_conflict_matrix_v1.py +conflict_precedence_rules: +- family: portfolio_risk_budget + rank: 1 + rationale: 현금방어선·MDD 상한은 어떤 alpha 신호보다 우선한다 +- family: execution_quality + rank: 2 + rationale: 주문 불가 상태(틱 오류·현금 부족)는 매수/매도 모두 차단한다 +- family: entry_timing + rank: 3 + rationale: 추격매수 방지 gate는 smart money 신호보다 우선한다 +- family: smart_money_liquidity + rank: 4 + rationale: 외국인/기관 신호가 fundamental 신호보다 선행성이 높다 +- family: fundamental_quality + rank: 5 + rationale: 장기 생존력 신호 +- family: market_regime + rank: 6 + rationale: 거시 위험 판단으로 포지션 스케일 조정 +- family: exit_value_preservation + rank: 7 + rationale: 수익금 보전 신호 contract_id: H002_FACTOR_CONFLICT_MATRIX +created_at: '2026-06-10T23:29:00+09:00' +hard_gates: +- condition: unresolved_conflict_count == 0 + gate_id: CONFLICT_RESOLVED + on_fail: BLOCK_RELEASE +- condition: every active factor has conflict_precedence rank + gate_id: PRECEDENCE_COMPLETE + on_fail: BLOCK_RELEASE harness_file: tools/validate_factor_conflict_matrix_v1.py has_code_implementation: true -code_path: "tools/validate_factor_conflict_matrix_v1.py" -authority: spec/53_factor_conflict_matrix.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 스마트머니/펀더멘털/모멘텀/리스크 팩터 충돌 시 우선순위를 자동으로 판정한다. - 미해결 충돌이 있으면 릴리즈를 차단한다. - -conflict_precedence_rules: - - rank: 1 - family: portfolio_risk_budget - rationale: 현금방어선·MDD 상한은 어떤 alpha 신호보다 우선한다 - - rank: 2 - family: execution_quality - rationale: 주문 불가 상태(틱 오류·현금 부족)는 매수/매도 모두 차단한다 - - rank: 3 - family: entry_timing - rationale: 추격매수 방지 gate는 smart money 신호보다 우선한다 - - rank: 4 - family: smart_money_liquidity - rationale: 외국인/기관 신호가 fundamental 신호보다 선행성이 높다 - - rank: 5 - family: fundamental_quality - rationale: 장기 생존력 신호 - - rank: 6 - family: market_regime - rationale: 거시 위험 판단으로 포지션 스케일 조정 - - rank: 7 - family: exit_value_preservation - rationale: 수익금 보전 신호 - inputs: - - field: factor_lifecycle_registry.yaml - source: spec/factor_lifecycle_registry.yaml - required: true - - field: final_decision_packet_active.json - source: Temp/final_decision_packet_active.json - required: true - -output_fields: - - name: conflict_matrix - type: list[dict] - description: 충돌 팩터 쌍과 우선순위 결과 - - name: unresolved_conflict_count - type: int - description: 우선순위 미정의 충돌 수 - - name: gate - type: str - enum: [PASS, FAIL] - -acceptance_criteria: - - conflict_precedence_defined_for_every_active_factor: true - - unresolved_conflict_count: 0 - -hard_gates: - - gate_id: CONFLICT_RESOLVED - condition: unresolved_conflict_count == 0 - on_fail: BLOCK_RELEASE - - gate_id: PRECEDENCE_COMPLETE - condition: every active factor has conflict_precedence rank - on_fail: BLOCK_RELEASE - -owner: quant_architect +- field: factor_lifecycle_registry.yaml + required: true + source: spec/factor_lifecycle_registry.yaml +- field: final_decision_packet_active.json + required: true + source: Temp/final_decision_packet_active.json lifecycle_state: active -retirement_condition: > - 팩터 충돌 해소 체계를 전면 재설계하는 계약이 등장할 때까지 유효하다. +meta: + has_code_implementation: false +output_fields: +- description: 충돌 팩터 쌍과 우선순위 결과 + name: conflict_matrix + type: list[dict] +- description: 우선순위 미정의 충돌 수 + name: unresolved_conflict_count + type: int +- enum: + - PASS + - FAIL + name: gate + type: str +owner: quant_architect +purpose: '스마트머니/펀더멘털/모멘텀/리스크 팩터 충돌 시 우선순위를 자동으로 판정한다. 미해결 충돌이 있으면 릴리즈를 차단한다. + + ' +retirement_condition: '팩터 충돌 해소 체계를 전면 재설계하는 계약이 등장할 때까지 유효하다. + + ' +schema_version: factor_conflict_matrix.v1 diff --git a/spec/54_temporal_data_integrity.yaml b/spec/54_temporal_data_integrity.yaml index 8c9bdf3..165522a 100644 --- a/spec/54_temporal_data_integrity.yaml +++ b/spec/54_temporal_data_integrity.yaml @@ -1,61 +1,62 @@ -schema_version: temporal_data_integrity.v1 -contract_id: H003_ANTI_BACKFILL_LOOKAHEAD -harness_file: tools/validate_no_lookahead_bias_v1.py -has_code_implementation: true -code_path: "tools/validate_no_lookahead_bias_v1.py" -authority: spec/54_temporal_data_integrity.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 백필 데이터와 실시간 데이터의 timestamp/freshness 혼입을 차단한다. - feature_timestamp가 decision_timestamp를 초과하는 lookahead는 즉시 차단한다. - -definitions: - lookahead_bias: > - feature 계산에 사용된 데이터의 as_of_date가 - 해당 결정이 내려진 decision_timestamp보다 미래인 경우 - backfill_contamination: > - 과거 결정 평가 시 그 시점에 없던 데이터가 소급 적용된 경우 - -inputs: - - field: computed_harness_v1.json - source: Temp/computed_harness_v1.json - required: true - - field: GatherTradingData.json - source: GatherTradingData.json - required: true - -output_fields: - - name: lookahead_violation_count - type: int - description: feature_timestamp > decision_timestamp 건수 - - name: backfilled_after_decision_count - type: int - description: 결정 이후 소급 backfill된 데이터 건수 - - name: freshness_violation_tickers - type: list[str] - description: freshness 위반 종목 목록 - - name: gate - type: str - enum: [PASS, FAIL] - acceptance_criteria: - - feature_timestamp_lte_decision_timestamp: true - - backfilled_after_decision_count: 0 - -hard_gates: - - gate_id: NO_LOOKAHEAD - condition: lookahead_violation_count == 0 - on_fail: BLOCK_RELEASE - - gate_id: NO_BACKFILL_CONTAMINATION - condition: backfilled_after_decision_count == 0 - on_fail: BLOCK_RELEASE - +- feature_timestamp_lte_decision_timestamp: true +- backfilled_after_decision_count: 0 +authority: spec/54_temporal_data_integrity.yaml +code_path: tools/validate_no_lookahead_bias_v1.py +contract_id: H003_ANTI_BACKFILL_LOOKAHEAD +created_at: '2026-06-10T23:29:00+09:00' data_freshness_sla: - price_data_max_age_hours: 1 fundamental_data_max_age_days: 30 macro_data_max_age_hours: 24 + price_data_max_age_hours: 1 +definitions: + backfill_contamination: '과거 결정 평가 시 그 시점에 없던 데이터가 소급 적용된 경우 -owner: data_engineer + ' + lookahead_bias: 'feature 계산에 사용된 데이터의 as_of_date가 해당 결정이 내려진 decision_timestamp보다 + 미래인 경우 + + ' +hard_gates: +- condition: lookahead_violation_count == 0 + gate_id: NO_LOOKAHEAD + on_fail: BLOCK_RELEASE +- condition: backfilled_after_decision_count == 0 + gate_id: NO_BACKFILL_CONTAMINATION + on_fail: BLOCK_RELEASE +harness_file: tools/validate_no_lookahead_bias_v1.py +has_code_implementation: true +inputs: +- field: computed_harness_v1.json + required: true + source: Temp/computed_harness_v1.json +- field: GatherTradingData.json + required: true + source: GatherTradingData.json lifecycle_state: active -retirement_condition: > - 실시간 스트리밍 파이프라인으로 전환 시 해당 파이프라인 계약으로 교체한다. +meta: + has_code_implementation: false +output_fields: +- description: feature_timestamp > decision_timestamp 건수 + name: lookahead_violation_count + type: int +- description: 결정 이후 소급 backfill된 데이터 건수 + name: backfilled_after_decision_count + type: int +- description: freshness 위반 종목 목록 + name: freshness_violation_tickers + type: list[str] +- enum: + - PASS + - FAIL + name: gate + type: str +owner: data_engineer +purpose: '백필 데이터와 실시간 데이터의 timestamp/freshness 혼입을 차단한다. feature_timestamp가 decision_timestamp를 + 초과하는 lookahead는 즉시 차단한다. + + ' +retirement_condition: '실시간 스트리밍 파이프라인으로 전환 시 해당 파이프라인 계약으로 교체한다. + + ' +schema_version: temporal_data_integrity.v1 diff --git a/spec/55_execution_simulator_contract.yaml b/spec/55_execution_simulator_contract.yaml index 878703d..893585f 100644 --- a/spec/55_execution_simulator_contract.yaml +++ b/spec/55_execution_simulator_contract.yaml @@ -1,74 +1,73 @@ -schema_version: execution_simulator_contract.v1 -contract_id: H004_EXECUTION_SIMULATOR -harness_file: tools/validate_execution_simulator_v1.py +acceptance_criteria: +- invalid_order_count: 0 +- cash_floor_after_orders_krw_gte_required: true authority: spec/55_execution_simulator_contract.yaml -has_code_implementation: true -code_path: "tools/validate_execution_simulator_v1.py" +code_path: tools/validate_execution_simulator_v1.py +contract_id: H004_EXECUTION_SIMULATOR created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 틱 정규화, 최소주문수량, 예수금, D+2 현금, 슬리피지 적용 후 - 실제 주문 가능성을 검증한다. 유효하지 않은 주문이 단 1건이라도 +hard_gates: +- condition: invalid_order_count == 0 + gate_id: NO_INVALID_ORDERS + on_fail: BLOCK_RELEASE +- condition: cash_floor_after_orders_krw >= minimum_reserve_krw + gate_id: CASH_FLOOR_MAINTAINED + on_fail: BLOCK_RELEASE +- condition: all order prices are tick-normalized + gate_id: TICK_NORMALIZED + on_fail: BLOCK_RELEASE +harness_file: tools/validate_execution_simulator_v1.py +has_code_implementation: true +inputs: +- field: final_decision_packet_active.json + required: true + source: Temp/final_decision_packet_active.json +- field: account_snapshot + required: true + source: spec/15_account_snapshot_contract.yaml +lifecycle_state: active +meta: + has_code_implementation: false +output_fields: +- description: 틱·수량·현금 조건 위반 주문 수 + name: invalid_order_count + type: int +- description: 모든 매수 주문 실행 후 예상 잔여 현금 + name: cash_floor_after_orders_krw + type: float +- description: 슬리피지 반영 후 최종 주문 목록 + name: slippage_adjusted_orders + type: list[dict] +- enum: + - PASS + - FAIL + name: gate + type: str +owner: risk_manager +purpose: '틱 정규화, 최소주문수량, 예수금, D+2 현금, 슬리피지 적용 후 실제 주문 가능성을 검증한다. 유효하지 않은 주문이 단 1건이라도 있으면 릴리즈를 차단한다. + ' +retirement_condition: '실제 증권사 API 연동 시뮬레이터로 교체될 때까지 유효하다. + + ' +schema_version: execution_simulator_contract.v1 simulation_parameters: - tick_normalization: - rule: 가격은 해당 종목의 호가단위(tick size)로 내림하여 정규화 - source: spec/13_formula_registry.yaml → TICK_NORMALIZATION_V1 - minimum_order_quantity: - krx_stock: 1주 - etf: 1주 - slippage_model: - type: fixed_spread - bps: calibration_registry.EXECUTION_SLIPPAGE_BPS - note: > - 시장가 주문 기준 평균 슬리피지. WBS-7.6(2026-06-22)에서 - spec/calibration_registry.yaml의 EXECUTION_SLIPPAGE_BPS(5bps, EXPERT_PRIOR)로 - 정규화. 실측 거래 데이터 20건 이상 누적 후 actual_slippage 추적해 - 필요시 보정 (차이 > 1bps 시). cash_floor: d_plus_2_recognition: true minimum_reserve_krw: 10000000 note: D+2 결제 예정 현금은 즉시 가용 현금으로 인정하되, 매수 후 잔여 현금이 최소 준비금 미만이면 차단 goal_target_krw: 500000000 + minimum_order_quantity: + etf: 1주 + krx_stock: 1주 + slippage_model: + bps: calibration_registry.EXECUTION_SLIPPAGE_BPS + note: '시장가 주문 기준 평균 슬리피지. WBS-7.6(2026-06-22)에서 spec/calibration_registry.yaml의 + EXECUTION_SLIPPAGE_BPS(5bps, EXPERT_PRIOR)로 정규화. 실측 거래 데이터 20건 이상 누적 후 actual_slippage + 추적해 필요시 보정 (차이 > 1bps 시). -inputs: - - field: final_decision_packet_active.json - source: Temp/final_decision_packet_active.json - required: true - - field: account_snapshot - source: spec/15_account_snapshot_contract.yaml - required: true - -output_fields: - - name: invalid_order_count - type: int - description: 틱·수량·현금 조건 위반 주문 수 - - name: cash_floor_after_orders_krw - type: float - description: 모든 매수 주문 실행 후 예상 잔여 현금 - - name: slippage_adjusted_orders - type: list[dict] - description: 슬리피지 반영 후 최종 주문 목록 - - name: gate - type: str - enum: [PASS, FAIL] - -acceptance_criteria: - - invalid_order_count: 0 - - cash_floor_after_orders_krw_gte_required: true - -hard_gates: - - gate_id: NO_INVALID_ORDERS - condition: invalid_order_count == 0 - on_fail: BLOCK_RELEASE - - gate_id: CASH_FLOOR_MAINTAINED - condition: cash_floor_after_orders_krw >= minimum_reserve_krw - on_fail: BLOCK_RELEASE - - gate_id: TICK_NORMALIZED - condition: all order prices are tick-normalized - on_fail: BLOCK_RELEASE - -owner: risk_manager -lifecycle_state: active -retirement_condition: > - 실제 증권사 API 연동 시뮬레이터로 교체될 때까지 유효하다. + ' + type: fixed_spread + tick_normalization: + rule: 가격은 해당 종목의 호가단위(tick size)로 내림하여 정규화 + source: spec/13_formula_registry.yaml → TICK_NORMALIZATION_V1 diff --git a/spec/56_renderer_copy_only_contract.yaml b/spec/56_renderer_copy_only_contract.yaml index 43f5609..408d2ca 100644 --- a/spec/56_renderer_copy_only_contract.yaml +++ b/spec/56_renderer_copy_only_contract.yaml @@ -1,72 +1,70 @@ -schema_version: renderer_copy_only_contract.v1 +acceptance_criteria: +- numeric_diff_count: 0 +- narrative_softening_count: 0 +authority: spec/56_renderer_copy_only_contract.yaml +code_path: tools/validate_report_render_diff_v1.py contract_id: H005_REPORT_RENDER_DIFF +created_at: '2026-06-10T23:29:00+09:00' +forbidden_patterns: +- description: 렌더러가 계산을 수행하는 표현 + pattern: .*계산.*하면.* +- description: 렌더러가 평균을 계산하는 표현 + pattern: .*평균을 내면.* +- description: 렌더러가 합산을 수행하는 표현 + pattern: .*합산하면.* +- description: 렌더러가 값을 추정하는 표현 + pattern: .*추정.*하면.* +hard_gates: +- condition: numeric_diff_count == 0 + gate_id: NUMERIC_SYNC + on_fail: BLOCK_RELEASE +- condition: narrative_softening_count == 0 + gate_id: NO_NARRATIVE_SOFTENING + on_fail: BLOCK_RELEASE harness_file: tools/validate_report_render_diff_v1.py has_code_implementation: true -code_path: "tools/validate_report_render_diff_v1.py" -authority: spec/56_renderer_copy_only_contract.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - operational_report.md/json의 숫자가 final_decision_packet과 1:1 복사인지 검증한다. - LLM이 보고서 생성 과정에서 어떠한 계산도 수행하지 않았음을 보장한다. - F08(display_text) 계열은 이 계약의 렌더링 전용 유지 근거를 따른다. - -renderer_rules: - - LLM은 packet에서 이미 계산된 값을 copy-only로 렌더링한다 - - 수량/가격/비중/점수/순위/평균/합계 계산을 하지 않는다 - - 값이 없으면 'DATA_MISSING — 하네스 업데이트 필요'로만 표기한다 - - blocked/limited 종목도 산출된 기준가·손절가·익절가·수량을 숨기지 않는다 - - 투자 결론은 final_execution_decision과 gate_trace를 번복하지 않는다 - - 매도 후보가 2개 이상이면 sell priority table을 먼저 출력한다 - - narrative는 gate를 완화하거나 회피하는 표현을 쓰지 않는다 - -forbidden_patterns: - - pattern: ".*계산.*하면.*" - description: 렌더러가 계산을 수행하는 표현 - - pattern: ".*평균을 내면.*" - description: 렌더러가 평균을 계산하는 표현 - - pattern: ".*합산하면.*" - description: 렌더러가 합산을 수행하는 표현 - - pattern: ".*추정.*하면.*" - description: 렌더러가 값을 추정하는 표현 - inputs: - - field: final_decision_packet_active.json - source: Temp/final_decision_packet_active.json - required: true - - field: operational_report.json - source: Temp/operational_report.json - required: true - - field: operational_report.md - source: Temp/operational_report.md - required: false - -output_fields: - - name: numeric_diff_count - type: int - description: 패킷과 보고서 간 숫자 불일치 건수 - - name: narrative_softening_count - type: int - description: gate를 완화하는 내러티브 표현 건수 - - name: forbidden_phrase_count - type: int - description: 금지 패턴 감지 건수 - - name: gate - type: str - enum: [PASS, FAIL] - -acceptance_criteria: - - numeric_diff_count: 0 - - narrative_softening_count: 0 - -hard_gates: - - gate_id: NUMERIC_SYNC - condition: numeric_diff_count == 0 - on_fail: BLOCK_RELEASE - - gate_id: NO_NARRATIVE_SOFTENING - condition: narrative_softening_count == 0 - on_fail: BLOCK_RELEASE - -owner: pm +- field: final_decision_packet_active.json + required: true + source: Temp/final_decision_packet_active.json +- field: operational_report.json + required: true + source: Temp/operational_report.json +- field: operational_report.md + required: false + source: Temp/operational_report.md lifecycle_state: active -retirement_condition: > - 보고서 생성 파이프라인이 전면 재설계될 때까지 유효하다. +meta: + has_code_implementation: false +output_fields: +- description: 패킷과 보고서 간 숫자 불일치 건수 + name: numeric_diff_count + type: int +- description: gate를 완화하는 내러티브 표현 건수 + name: narrative_softening_count + type: int +- description: 금지 패턴 감지 건수 + name: forbidden_phrase_count + type: int +- enum: + - PASS + - FAIL + name: gate + type: str +owner: pm +purpose: 'operational_report.md/json의 숫자가 final_decision_packet과 1:1 복사인지 검증한다. LLM이 + 보고서 생성 과정에서 어떠한 계산도 수행하지 않았음을 보장한다. F08(display_text) 계열은 이 계약의 렌더링 전용 유지 근거를 따른다. + + ' +renderer_rules: +- LLM은 packet에서 이미 계산된 값을 copy-only로 렌더링한다 +- 수량/가격/비중/점수/순위/평균/합계 계산을 하지 않는다 +- 값이 없으면 'DATA_MISSING — 하네스 업데이트 필요'로만 표기한다 +- blocked/limited 종목도 산출된 기준가·손절가·익절가·수량을 숨기지 않는다 +- 투자 결론은 final_execution_decision과 gate_trace를 번복하지 않는다 +- 매도 후보가 2개 이상이면 sell priority table을 먼저 출력한다 +- narrative는 gate를 완화하거나 회피하는 표현을 쓰지 않는다 +retirement_condition: '보고서 생성 파이프라인이 전면 재설계될 때까지 유효하다. + + ' +schema_version: renderer_copy_only_contract.v1 diff --git a/spec/57_shadow_promotion_scorecard.yaml b/spec/57_shadow_promotion_scorecard.yaml index a23cef9..64f1346 100644 --- a/spec/57_shadow_promotion_scorecard.yaml +++ b/spec/57_shadow_promotion_scorecard.yaml @@ -1,65 +1,65 @@ -schema_version: shadow_promotion_scorecard.v1 +acceptance_criteria: +- live_sample_count_gte_30: true +- edge_improvement_positive: true +- drawdown_not_worse: true +- conflict_rate_within_cap: true +authority: spec/57_shadow_promotion_scorecard.yaml +code_path: tools/build_shadow_promotion_scorecard_v1.py contract_id: H007_SHADOW_PROMOTION_SCORECARD +created_at: '2026-06-10T23:29:00+09:00' +forbidden_promotion_shortcuts: +- replay 성과를 live 성과로 혼용하여 승격 기준 달성 금지 +- shadow 단계를 건너뛰고 바로 active 승격 금지 +- LLM narrative로 promotion gate 완화 금지 +- live_sample_count < 30인 팩터에 PASS_100 등급 부여 금지 harness_file: tools/build_shadow_promotion_scorecard_v1.py has_code_implementation: true -code_path: "tools/build_shadow_promotion_scorecard_v1.py" -authority: spec/57_shadow_promotion_scorecard.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 신규 팩터를 active로 올릴지 수치로 판단한다. - live 표본 30개 미만, 또는 drawdown 악화, 또는 conflict 비율 초과 시 - active 승격을 차단한다. - +inputs: +- field: shadow_ledger_v2.json + required: true + source: Temp/shadow_ledger_v2.json +- field: live_replay_separation_v3.json + required: true + source: Temp/live_replay_separation_v3.json +lifecycle_state: active +meta: + has_code_implementation: false +output_fields: +- description: 승격 가능 팩터 목록 (live_sample >= 30 and all gates pass) + name: promotion_candidates + type: list[dict] +- description: 승격 차단 팩터 목록과 차단 사유 + name: blocked_factors + type: list[dict] +- enum: + - PASS + - FAIL + - WARN + name: gate + type: str +owner: quant_researcher promotion_gate_criteria: - live_sample_count_minimum: 30 + conflict_rate_cap: + max_conflict_rate_pct: 10.0 + note: 다른 active 팩터와 충돌하는 신호 비율 + drawdown_constraint: + rule: 신규 팩터 적용 후 portfolio max drawdown이 기존 대비 악화되지 않아야 한다 + tolerance_pct: 0.5 edge_improvement: metric: prediction_match_rate_improvement minimum_delta_pct: 2.0 note: replay 표본은 포함하지 않는다. live 표본만 집계한다. - drawdown_constraint: - rule: 신규 팩터 적용 후 portfolio max drawdown이 기존 대비 악화되지 않아야 한다 - tolerance_pct: 0.5 false_positive_reduction: minimum_reduction_pct: 5.0 note: false positive = 매수 추천했으나 T+5 기준 손실 발생 건 - conflict_rate_cap: - max_conflict_rate_pct: 10.0 - note: 다른 active 팩터와 충돌하는 신호 비율 + live_sample_count_minimum: 30 provenance_coverage: required_pct: 100.0 +purpose: '신규 팩터를 active로 올릴지 수치로 판단한다. live 표본 30개 미만, 또는 drawdown 악화, 또는 conflict + 비율 초과 시 active 승격을 차단한다. -forbidden_promotion_shortcuts: - - replay 성과를 live 성과로 혼용하여 승격 기준 달성 금지 - - shadow 단계를 건너뛰고 바로 active 승격 금지 - - LLM narrative로 promotion gate 완화 금지 - - live_sample_count < 30인 팩터에 PASS_100 등급 부여 금지 + ' +retirement_condition: '팩터 승격 체계를 전면 재설계하는 계약이 등장할 때까지 유효하다. -inputs: - - field: shadow_ledger_v2.json - source: Temp/shadow_ledger_v2.json - required: true - - field: live_replay_separation_v3.json - source: Temp/live_replay_separation_v3.json - required: true - -output_fields: - - name: promotion_candidates - type: list[dict] - description: 승격 가능 팩터 목록 (live_sample >= 30 and all gates pass) - - name: blocked_factors - type: list[dict] - description: 승격 차단 팩터 목록과 차단 사유 - - name: gate - type: str - enum: [PASS, FAIL, WARN] - -acceptance_criteria: - - live_sample_count_gte_30: true - - edge_improvement_positive: true - - drawdown_not_worse: true - - conflict_rate_within_cap: true - -owner: quant_researcher -lifecycle_state: active -retirement_condition: > - 팩터 승격 체계를 전면 재설계하는 계약이 등장할 때까지 유효하다. + ' +schema_version: shadow_promotion_scorecard.v1 diff --git a/spec/58_llm_determinism_contract.yaml b/spec/58_llm_determinism_contract.yaml index 550aa4c..b276389 100644 --- a/spec/58_llm_determinism_contract.yaml +++ b/spec/58_llm_determinism_contract.yaml @@ -1,82 +1,111 @@ -schema_version: llm_determinism_contract.v1 +acceptance_criteria: +- all_decision_fields_precomputed: true +- all_tables_sorted_in_packet: true +- no_instruction_requires_arithmetic: true +authority: spec/58_llm_determinism_contract.yaml +code_path: tools/validate_llm_determinism_pack_v1.py contract_id: H008_LLM_DETERMINISM_AUDIT +created_at: '2026-06-10T23:29:00+09:00' +hard_gates: +- condition: arithmetic_instruction_count == 0 + gate_id: NO_ARITHMETIC_INSTRUCTION + on_fail: BLOCK_RELEASE +- condition: missing_sections == [] + gate_id: ALL_SECTIONS_PRESENT + on_fail: BLOCK_RELEASE +- condition: precomputed_field_coverage_pct == 100.0 + gate_id: PRECOMPUTED_COVERAGE + on_fail: BLOCK_RELEASE harness_file: tools/validate_llm_determinism_pack_v1.py has_code_implementation: true -code_path: "tools/validate_llm_determinism_pack_v1.py" -authority: spec/58_llm_determinism_contract.yaml -created_at: '2026-06-10T23:29:00+09:00' -purpose: > - 저성능 LLM도 packet copy-only로 같은 결과를 렌더링할 만큼 - final_context_for_llm이 충분히 사전 계산되어 있는지 검증한다. - LLM에게 산술 연산을 요구하는 항목이 있으면 릴리즈를 차단한다. - -required_precomputed_sections: - - section: 01_metadata_and_manifest_alias - must_contain: [document_id, generated_at_kst, active_artifact_alias] - - section: 02_portfolio_health - must_contain: [total_asset_krw, cash_ratio_pct, goal_achievement_pct] - - section: 03_hard_blockers - must_contain: [blocked_tickers, blocker_reasons] - - section: 04_sell_priority_table - must_contain: [rank, ticker, sell_action, sell_reason_code] - note: 이미 정렬된 순서로 제공. LLM은 재정렬하지 않는다. - - section: 05_buy_hold_sell_action_table - must_contain: [ticker, final_action, entry_price, stop_price, quantity] - - section: 06_cash_and_risk_budget - must_contain: [available_cash_krw, d2_cash_krw, max_allowed_mdd_pct] - - section: 07_shadow_ledger_visible_items - must_contain: [formula_id, lifecycle_state, sample_n, promotion_allowed] - - section: 08_data_missing_items - must_contain: [missing_field, reason] - - section: 09_market_regime_summary_precomputed - must_contain: [regime_label, regime_score, position_scale_factor] - - section: 10_education_notes_preapproved - note: 사전 승인된 교육 노트만 포함. LLM이 신규 작성 금지. - - section: 11_forbidden_phrases_and_no_math_rules - must_contain: [forbidden_phrases, no_math_rule] - -validation_rules: - - all_numeric_fields_precomputed: true - - all_tables_pre_sorted: true - - no_arithmetic_instruction_in_prompt: true - - llm_numeric_generation_count: 0 - inputs: - - field: final_context_for_llm_v5.yaml - source: Temp/final_context_for_llm_v5.yaml - required: true - -output_fields: - - name: missing_sections - type: list[str] - description: 누락된 required section 목록 - - name: arithmetic_instruction_count - type: int - description: LLM에게 계산을 요구하는 지시 건수 - - name: precomputed_field_coverage_pct - type: float - description: 사전 계산된 필드 비율 - - name: gate - type: str - enum: [PASS, FAIL] - -acceptance_criteria: - - all_decision_fields_precomputed: true - - all_tables_sorted_in_packet: true - - no_instruction_requires_arithmetic: true - -hard_gates: - - gate_id: NO_ARITHMETIC_INSTRUCTION - condition: arithmetic_instruction_count == 0 - on_fail: BLOCK_RELEASE - - gate_id: ALL_SECTIONS_PRESENT - condition: missing_sections == [] - on_fail: BLOCK_RELEASE - - gate_id: PRECOMPUTED_COVERAGE - condition: precomputed_field_coverage_pct == 100.0 - on_fail: BLOCK_RELEASE - -owner: pm +- field: final_context_for_llm_v5.yaml + required: true + source: Temp/final_context_for_llm_v5.yaml lifecycle_state: active -retirement_condition: > - LLM 파이프라인이 완전 결정론적 서버 사이드 렌더링으로 교체될 때까지 유효하다. +meta: + has_code_implementation: false +output_fields: +- description: 누락된 required section 목록 + name: missing_sections + type: list[str] +- description: LLM에게 계산을 요구하는 지시 건수 + name: arithmetic_instruction_count + type: int +- description: 사전 계산된 필드 비율 + name: precomputed_field_coverage_pct + type: float +- enum: + - PASS + - FAIL + name: gate + type: str +owner: pm +purpose: '저성능 LLM도 packet copy-only로 같은 결과를 렌더링할 만큼 final_context_for_llm이 충분히 사전 + 계산되어 있는지 검증한다. LLM에게 산술 연산을 요구하는 항목이 있으면 릴리즈를 차단한다. + + ' +required_precomputed_sections: +- must_contain: + - document_id + - generated_at_kst + - active_artifact_alias + section: 01_metadata_and_manifest_alias +- must_contain: + - total_asset_krw + - cash_ratio_pct + - goal_achievement_pct + section: 02_portfolio_health +- must_contain: + - blocked_tickers + - blocker_reasons + section: 03_hard_blockers +- must_contain: + - rank + - ticker + - sell_action + - sell_reason_code + note: 이미 정렬된 순서로 제공. LLM은 재정렬하지 않는다. + section: 04_sell_priority_table +- must_contain: + - ticker + - final_action + - entry_price + - stop_price + - quantity + section: 05_buy_hold_sell_action_table +- must_contain: + - available_cash_krw + - d2_cash_krw + - max_allowed_mdd_pct + section: 06_cash_and_risk_budget +- must_contain: + - formula_id + - lifecycle_state + - sample_n + - promotion_allowed + section: 07_shadow_ledger_visible_items +- must_contain: + - missing_field + - reason + section: 08_data_missing_items +- must_contain: + - regime_label + - regime_score + - position_scale_factor + section: 09_market_regime_summary_precomputed +- note: 사전 승인된 교육 노트만 포함. LLM이 신규 작성 금지. + section: 10_education_notes_preapproved +- must_contain: + - forbidden_phrases + - no_math_rule + section: 11_forbidden_phrases_and_no_math_rules +retirement_condition: 'LLM 파이프라인이 완전 결정론적 서버 사이드 렌더링으로 교체될 때까지 유효하다. + + ' +schema_version: llm_determinism_contract.v1 +validation_rules: +- all_numeric_fields_precomputed: true +- all_tables_pre_sorted: true +- no_arithmetic_instruction_in_prompt: true +- llm_numeric_generation_count: 0 diff --git a/spec/aliases.yaml b/spec/aliases.yaml index 1d7fc87..f5715da 100644 --- a/spec/aliases.yaml +++ b/spec/aliases.yaml @@ -1,26 +1,13 @@ -meta: - title: "은퇴자산포트폴리오 — 경로 alias registry" - version: "2026-06-21-WBS7.4_migration_closed" - role: "governance" - purpose: "legacy path와 canonical split path를 명시해 참조 혼선을 방지한다." - -# 2026-06-21 WBS-7.4 마이그레이션 종결 기록: -# 아래 17개 alias는 모두 remove_after=2026-06-30 만료 예정이었다. -# repo 전체(spec/src/tools/prompts/examples) grep으로 활성 참조가 0건임을 확인했고, -# 모든 canonical_split_files 대상 파일이 이미 실콘텐츠를 보유하고 있어 마이그레이션이 -# 완료된 것으로 판정, 데드라인 전에 alias 항목을 제거했다. -# -# [2026-06-22 WBS-7.11 정정] 작성 당시 이 주석은 호환 인덱스 5개 중 "3개가 -# deprecated_redirect라 삭제 보류 중"이라고 적었으나 부정확했다. 실제로는 -# spec/06_exit_policy.yaml도 role: compatibility_index(영구 유지 설계)였고, -# role: deprecated_redirect는 spec/03_risk_policy.yaml, spec/04_strategy_rules.yaml -# 2개뿐이었다. WBS-7.11에서 이 2개의 활성 참조 0건을 재확인 후 실삭제했고, -# spec/06_exit_policy.yaml/spec/risk/risk_control.yaml/spec/strategy/entry_gates.yaml -# 3개는 has_code_implementation:false + redirect_only:true로 태깅해 영구 유지한다. aliases: {} - +meta: + has_code_implementation: false + purpose: legacy path와 canonical split path를 명시해 참조 혼선을 방지한다. + role: governance + title: 은퇴자산포트폴리오 — 경로 alias registry + version: 2026-06-21-WBS7.4_migration_closed policy: - - "신규 문서는 canonical 경로만 사용한다." - - "compatibility index와 aliases.yaml 내부의 deprecated 경로는 허용한다." - - "remove_after 이후 deprecated 경로가 active 문서에 남으면 검증 실패로 전환한다." - - "alias 항목을 등록할 때는 반드시 remove_after 데드라인을 두고, 데드라인 전에 활성 참조 0건을 확인한 뒤 제거한다(2026-06-21 사례 참조)." +- 신규 문서는 canonical 경로만 사용한다. +- compatibility index와 aliases.yaml 내부의 deprecated 경로는 허용한다. +- remove_after 이후 deprecated 경로가 active 문서에 남으면 검증 실패로 전환한다. +- alias 항목을 등록할 때는 반드시 remove_after 데드라인을 두고, 데드라인 전에 활성 참조 0건을 확인한 뒤 제거한다(2026-06-21 + 사례 참조). diff --git a/spec/calibration_registry.yaml b/spec/calibration_registry.yaml index 25bba7d..47ab2c9 100644 --- a/spec/calibration_registry.yaml +++ b/spec/calibration_registry.yaml @@ -1,1921 +1,4 @@ -has_code_implementation: true -code_path: - - "tools/build_calibration_priority_v1.py" - - "tools/validate_calibration_registry_v1.py" -thresholds: -- id: ALEG_V2_GATE1_BLOCK_PCT - value: 3.0 - unit: pct - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:345 - py_location: tools/compute_formula_outputs.py:127 - notes: '30년 현장 경험 기반. velocity_1d ≥ 3%이면 당일 고점 진입 위험. - - AGENTS.md Direction A2: "velocity_1d ≥ 3%에서 진입한 거래의 T+5 승률이 통계적으로 현저히 낮음" - - → 단, 구체적 수치 미기재. PROVISIONAL 격상 조건: samples≥30 후 실측 T+5 승률 측정. - - ' -- id: ALEG_V2_SAMPLE_VALIDATION_N - value: 30.0 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:374 - notes: '소표본 판정을 위한 최소 표본 수 30개 기준.' -- id: ALEG_V2_GATE1_WAIT_PCT - value: 1.5 - unit: pct - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:347 - py_location: tools/compute_formula_outputs.py:131 - notes: PULLBACK_WAIT 경계. BLOCK(3.0%)의 절반 수준. Expert prior. -- id: ALEG_V2_GATE2_BLOCK_PCT - value: 8.0 - unit: pct - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:350 - notes: 5일 누적 8% 이상 급등 → 추격 매수 차단. Expert prior. -- id: ALEG_V2_GATE2_WAIT_PCT - value: 5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:352 - notes: 5일 5% 이상 → PULLBACK_WAIT_5D. Expert prior. -- id: ALEG_V2_GATE3_BLOCK_WS - value: 3.0 - unit: weighted_sum - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:355 - notes: 'DISTRIBUTION 가중합산 3.0 이상 → BLOCK. - - V1.1에서 4.0→5.0으로 상향된 DISTRIBUTION_SELL_DETECTOR_V1과 별개 기준. - - Expert prior. 혼동 주의. - - ' -- id: ALEG_V2_GATE3_WAIT_WS - value: 2.0 - unit: weighted_sum - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:357 - notes: ALEG gate3 WAIT 경계. Expert prior. -- id: ALEG_V2_DIST_FRG_WEIGHT - value: 2.0 - unit: weight - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:337 - notes: 외국인 5일 순매도(frg5d<0) 신호 가중치. -- id: ALEG_V2_DIST_INST_WEIGHT - value: 2.0 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:338 - notes: 기관 5일 순매도(inst5d<0) 신호 가중치. -- id: ALEG_V2_DIST_VOL_MULT - value: 1.3 - unit: ratio - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:339 - notes: 거래량 > 평균×1.3 → 과열 신호. weight=1.5. -- id: ALEG_V2_DIST_VOL_WEIGHT - value: 1.5 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:339 -- id: ALEG_V2_DIST_BEAR_WEIGHT - value: 1.5 - unit: weight - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:340 - notes: 당일 음봉(close 70 → 과매수. weight=1.0. -- id: ALEG_V2_GRADE_B_VEL1D_UPPER - value: 1.5 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:388 - notes: 'entry_grade B 조건: velocity_1d < 1.5% AND MA20 근접. gate1 WAIT 임계(동일값)와 별도 - 등급 기준.' -- id: ALEG_V2_GRADE_D_VEL5D_LOWER - value: 5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_LATE_ENTRY_GATE_V2 - gs_location: gas_apex_alpha_watch.gs:393 - notes: 'entry_grade D 조건: velocity_5d > 5.0% (gate2 WAIT 임계와 동일값, 독립 등급 판정).' -- id: SMLOLINK_V1_MIN_SAMPLE_N - value: 30 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SMART_MONEY_LIQUIDITY_OUTCOME_LINK_V1 - gs_location: gas_apex_alpha_watch.gs:361 - notes: 유동성 버킷별 최소 표본 수. n<30이면 UNVALIDATED로 레이블. 통계 신뢰성 하한. -- id: DSD_V1_CONFIRMED_WS - value: 5.0 - unit: weighted_sum - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - gs_location: gas_data_feed.gs:8783 - notes: 'V1.1에서 4.0→5.0으로 상향 (2026-05-22). - - DISTRIBUTION_CONFIRMED → BUY 완전 차단. Expert prior. - - 보정 조건: 과거 확인된 분배 구간 레이블 데이터 30건 이상. - - ' -- id: DSD_V1_WARNING_WS - value: 3.0 - unit: weighted_sum - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - gs_location: gas_data_feed.gs:8783 - notes: V1.1에서 2.0→3.0 상향. DISTRIBUTION_WARNING → BUY 보류 권고. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: DSD_V1_SIG1_WEIGHT - value: 2.0 - unit: weight - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_1: 신고가 근접+거래량 수축' -- id: DSD_V1_SIG2_WEIGHT - value: 2.0 - unit: weight - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_2: 5일 급등+수급 약화' -- id: DSD_V1_SIG3_WEIGHT - value: 1.5 - unit: weight - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_3: 외인+기관 동반순매도 3일' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: DSD_V1_SIG4_WEIGHT - value: 1.5 - unit: weight - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_4: RSI14≥75+당일 음봉' -- id: DSD_V1_SIG4_RSI_THRESHOLD - value: 75 - unit: rsi - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: DSD_V1_SIG5_WEIGHT - value: 1.0 - unit: weight - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_5: OBV 20일 기울기 음수' -- id: DSD_V1_SIG6_WEIGHT - value: 1.0 - unit: weight - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - notes: 'SIG_6: 전일 급등+당일 -2% 갭하락' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: DSD_V1_SIG6_GAP_PCT - value: -2.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: K2_SPLIT_RATIO - value: 0.5 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: K2_STAGED_REBOUND_SELL_V1 - notes: '50/50 분할. 즉시 50% 매도, 나머지 50% 반등 대기. - - 보정 조건: 과거 oversold(RSI<30) 구간 반등 사례 30건 이상. - - 선택지: 30/70, 40/60, 50/50, 60/40 — backtest 비교 필요. - - ' -- id: K2_REBOUND_TRIGGER_ATR_MULT - value: 0.5 - unit: atr_multiple - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: K2_STAGED_REBOUND_SELL_V1 - notes: 'rebound_trigger = prevClose + 0.5×ATR20. - - 보정 조건: 과거 V자 반등 사례에서 반등 시 도달한 ATR 배수 분포 분석. - - 선택지: 0.3, 0.4, 0.5, 0.6, 0.7 — 2~3영업일 내 도달률 기준 최적화. - - ' -- id: K2_DEADLINE_DAYS - value: 3 - unit: days - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: K2_STAGED_REBOUND_SELL_V1 - notes: 반등 대기 데드라인 3영업일. 초과 시 stage1 가격으로 강제 실행. -- id: SCR_V4_VALUE_DAMAGE_BLOCK_PCT - value: 10.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_RECOVERY_OPTIMIZER_V1 - py_location: tools/build_smart_cash_recovery_v4.py:143 - notes: '평균 주식가치 훼손율 10% 초과 시 VALUE_DAMAGE_BLOCK. - - 현재 실측값 14.1%(STRUCTURAL_WARN) → 실질 동작이 BLOCK 임계값보다 높음. - - 보정 조건: 국면별 차등 적용(EVENT_SHOCK=8%, RISK_OFF=10%, NEUTRAL=12%, RISK_ON=14%). - - ' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_EFFICIENCY_BASE - value: 50.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:70 - notes: rebound_efficiency_score 기본 50점. 설계점수이며 실측 P&L 아님. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_EFFICIENCY_DAMAGE_PENALTY_COEFF - value: 0.4 - unit: coefficient - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:78 - notes: 'Work24에서 0.5→0.4로 하향 조정 (14.1% 손해율에서 BLOCK 회피 목적 의심). - - 보정 조건: 과거 rebound_wait_qty 처리 결과의 실제 P&L 30건 이상. - - ' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_EFFICIENCY_DEGRADE_THRESHOLD - value: 45.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:95 - notes: efficiency_score < 45 → DEGRADE_IMMEDIATE_SELL_WEIGHT 상태 전환 임계 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_DAMAGE_STRUCTURAL_WARN_PCT - value: 10.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:99 - notes: avg_damage > 10% → VALUE_DAMAGE_STRUCTURAL_WARN (상태 전환 임계) - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_DAMAGE_BLOCK_PCT - value: 16.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:97 - notes: avg_damage > 16% → CASH_RECOVERY_VALUE_DAMAGE_BLOCK (극고손실 임계) - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SCR_V4_VALIDATED_SAMPLE_MIN - value: 30 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: VALUE_PRESERVATION_SCORER_V1 - py_location: tools/build_rebound_sell_efficiency_v1.py:104 - notes: 실측 검증 최소 표본 수. sample_n < 30 → UNVALIDATED_DESIGN_SCORE 강제 라벨 (HONEST-V1) -- id: BQG_V2_RET3D_BLOCK_PCT - value: 7.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6677 - notes: 3일 수익률 ≥ 7% → -30점. 단기 급등 후 진입 불량 신호. -- id: BQG_V2_DISPARITY_BLOCK_PCT - value: 10.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6678 - notes: MA20 이격도 > 10% → -25점. 과열 추격 신호. -- id: BQG_V2_SURGE_DAY_RET1D_PCT - value: 4.0 - unit: pct - source: SPEC_DERIVED - sample_n: 141 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6679 - notes: 당일 +4% 이상이면서 거래량 저조 → -40점. 설거지 유형 돌파 신호. -- id: BQG_V2_RSI_OVERBOUGHT - value: 75.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6681 - notes: RSI14 > 75 → -20점. 단기 과매수 구간. -- id: BQG_V2_TIMING_EXIT_BLOCK - value: 50.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6682 - notes: timing_score_exit ≥ 50 → -50점. 이미 매도 신호 강함. -- id: AWG_V1_CONSEC_SELL_DAYS - value: 5.0 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6724 - notes: 연속매도신호 ≥ 5일 → +20점. 과매도 구간 재진입 신호. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWG_V1_SECTOR_RS_OUTPERFORM - value: 100.0 - unit: ratio_pct - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6727 - notes: sectorRS5d > 100%(시장 대비 초과) → +15점. 섹터 상대강도 유지. -- id: AWG_V1_VOL_SURGE_CAUTION - value: 50.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6728 - notes: 거래대금 급증 ≥ 50% → -25점. 단기 과열로 반등 신뢰도 약화. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWG_V1_VOL_SURGE_STRONG - value: 100.0 - unit: pct - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6729 - notes: 거래대금 급증 ≥ 100% → 추가 -20점. 분배 패턴 가속. -- id: AWG_V1_CONFIRMED_THRESHOLD - value: 30.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6743 - notes: score ≥ 30 → WHIPSAW 확정(CONFIRMED/WEAKENING/AUTO_RELEASED). 반등 강도 구분. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWG_V1_INCONCLUSIVE_THRESHOLD - value: 10.0 - unit: score - source: PROVISIONAL - sample_n: 141 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6747 - notes: score ≥ 10 AND < 30 → INCONCLUSIVE. score < 10 → CONFIRMED_SELL. -- id: BQG_V2_QUALITY_VOL_MULT - value: 1.5 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6687 - notes: '품질 돌파 조건: volume >= avgVol5d*1.5 (거래량 확인) → +25점.' -- id: BQG_V2_QUALITY_RET3D_MAX - value: 5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6688 - notes: '품질 돌파 조건: ret3d < 5% (급등 없이 돌파) → +25점 조건 중 하나.' -- id: BQG_V2_DISPARITY_HEALTHY_MAX - value: 6.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6689 - notes: 이격도 0~6% → +15점. 적정 이격 돌파 구간. -- id: BQG_V2_RSI_HEALTHY_MIN - value: 45.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6690 - notes: RSI14 45~65 → +10점. 건강한 모멘텀 구간. -- id: BQG_V2_RSI_HEALTHY_MAX - value: 65.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6690 - notes: RSI14 45~65 → +10점. 65 초과 시 가점 없음. -- id: BQG_V2_QUALITY_RET1D_MIN - value: 2.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6687 - notes: '품질 돌파 조건: ret1d ≥ 2% AND 거래량 확인 → +25점 조건 중 하나.' -- id: BQG_V2_BLOCKED_SCORE_MAX - value: 10.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6693 - notes: score < 10 → BLOCKED_LATE_CHASE (뒷박 추격 완전 차단) -- id: BQG_V2_WATCH_SCORE_MAX - value: 40.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6693 - notes: score < 40 → WATCH_COOLING_OFF. score ≥ 40 → PILOT_ALLOWED. -- id: DSD_V1_EARLY_WARNING_RSI_THRESHOLD - value: 70.0 - unit: rsi - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 - gs_location: gas_data_feed.gs:8789 - notes: pre_distribution_warning early_warning_v2 조건 — RSI 관련 보조 임계 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: HEAT_GATE_EVENT_SHOCK_HARD_BLOCK - value: 5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DYNAMIC_HEAT_GATE_V1 - gs_location: gas_data_feed.gs:2098 - notes: EVENT_SHOCK 국면 열도 차단 임계. 5% 초과 → BLOCK_NEW_BUY. -- id: HEAT_GATE_RISK_OFF_HARD_BLOCK - value: 7.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DYNAMIC_HEAT_GATE_V1 - gs_location: gas_data_feed.gs:2099 -- id: HEAT_GATE_NEUTRAL_HARD_BLOCK - value: 10.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DYNAMIC_HEAT_GATE_V1 - gs_location: gas_data_feed.gs:2103 -- id: HEAT_GATE_RISK_ON_HARD_BLOCK - value: 12.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DYNAMIC_HEAT_GATE_V1 - gs_location: gas_data_feed.gs:2101 -- id: HEAT_GATE_SECULAR_LEADER_HARD_BLOCK - value: 13.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DYNAMIC_HEAT_GATE_V1 - gs_location: gas_data_feed.gs:2100 -- id: REGIME_SCALE_EVENT_SHOCK - value: 0.25 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_SIZE_REGIME_SCALE_V1 - gs_location: gas_data_feed.gs:3433 - notes: EVENT_SHOCK → 정상 사이징의 25%만 허용. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: REGIME_SCALE_RISK_OFF - value: 0.5 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_SIZE_REGIME_SCALE_V1 - gs_location: gas_data_feed.gs:3434 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: REGIME_SCALE_RISK_ON - value: 1.1 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_SIZE_REGIME_SCALE_V1 - gs_location: gas_data_feed.gs:3436 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: REGIME_SCALE_SECULAR_LEADER - value: 1.2 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_SIZE_REGIME_SCALE_V1 - gs_location: gas_data_feed.gs:3435 -- id: DRAWDOWN_CAUTION_LOSS_COUNT - value: 2 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 - gs_location: gas_data_feed.gs:4487 - notes: 연속 2회 손절 → CAUTION_BUY(scale=0.75). -- id: DRAWDOWN_REDUCE_LOSS_COUNT - value: 3 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 - gs_location: gas_data_feed.gs:4485 - notes: 연속 3회 손절 → REDUCE_BUY(scale=0.5). -- id: DRAWDOWN_NO_BUY_LOSS_COUNT - value: 5 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 - gs_location: gas_data_feed.gs:4483 - notes: 연속 5회 손절 → NO_BUY(scale=0.0). -- id: DRAWDOWN_CAUTION_SCALE - value: 0.75 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 -- id: DRAWDOWN_REDUCE_SCALE - value: 0.5 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 -- id: CASH_FLOOR_MRS_LOW_MAX - value: 3 - unit: mrs_score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:2108 - notes: MRS ≤ 3 → 현금 최소 7%. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_MRS_MID_MAX - value: 7 - unit: mrs_score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:2109 - notes: MRS ≤ 7 → 현금 최소 10%. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_MRS_HIGH_MAX - value: 10 - unit: mrs_score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:2110 - notes: MRS ≤ 10 → 현금 최소 15%. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_LOW_PCT - value: 7 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_MID_PCT - value: 10 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_HIGH_PCT - value: 15 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_TRIM_FACTOR - value: 0.7 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:4702 - notes: cash ≥ minPct*0.7 → TRIM_REQUIRED (HARD_BLOCK 전 완충 구간). - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_MAGNITUDE_EXCESS_BLOCK_PCT - value: 3.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:4693 - notes: magnitudeExcessPctp ≥ 3 → OVER_EXTENDED. 현금 회복 관점의 감점 임계. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_FLOOR_EXIT_SIGNAL_MIN_COUNT - value: 2 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: CASH_FLOOR_V1 - gs_location: gas_data_feed.gs:4705 - notes: alreadyActive && exitSignals.length >= 2 → EXIT_SECULAR_LEADER. 현금 회수 시퀀스 종료 최소 신호 수. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: CASH_UPLIFT_EVENT_SHOCK_MIN - value: 20 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: REGIME_CASH_UPLIFT_V1 - gs_location: gas_data_feed.gs:3451 -- id: CASH_UPLIFT_RISK_OFF_MIN - value: 15 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: REGIME_CASH_UPLIFT_V1 - gs_location: gas_data_feed.gs:3453 -- id: CASH_UPLIFT_RISK_ON_MIN - value: 5 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: REGIME_CASH_UPLIFT_V1 - gs_location: gas_data_feed.gs:3453 - notes: RISK_ON regimeMin=5. MRS값이 더 높으면 MRS 우선. -- id: SEMI_CLUSTER_CAP_NORMAL - value: 25.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3763 - notes: 'NEUTRAL/RISK_ON: 005930+000660 합산 25% 한도.' -- id: SEMI_CLUSTER_CAP_RISK_OFF - value: 20.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3763 -- id: SEMI_CLUSTER_CAP_CLA - value: 60.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3763 - notes: 'CLA 국면: 3종목(005930+000660+229200) 합산 60% 한도.' -- id: SEMI_CLUSTER_LEADER_WARN_COUNT - value: 3.0 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3874 - notes: critCount >= 1 또는 warnCount >= 3 이면 leader-cap 경보를 발동하는 기준. -- id: POSITION_COUNT_MAX_NORMAL - value: 8 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_COUNT_LIMIT_V1 - gs_location: gas_data_feed.gs:4460 -- id: POSITION_COUNT_MAX_RISK_OFF - value: 6 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: POSITION_COUNT_LIMIT_V1 - gs_location: gas_data_feed.gs:4460 -- id: POSITION_COUNT_DRAWDOWN_RS_MIN - value: 1.5 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: DRAWDOWN_GUARD_V1 - gs_location: gas_data_feed.gs:4465 - notes: rsRatio >= 1.5 이면 drawdown guard 조건이 충족되는 기준값. -- id: PROFIT_LOCK_APEX_SUPER_PCT - value: 60 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5154 - py_location: tools/compute_formula_outputs.py:70 - notes: 'spec/AGENTS.md L2: profit_pct ≥ 60% → APEX_SUPER. B06 GAS 정정 완료 (2026-05-30).' -- id: PROFIT_LOCK_APEX_TRAILING_PCT - value: 40 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5160 - notes: profit_pct ≥ 40% → APEX_TRAILING. B06 GAS 신설 (2026-05-30). -- id: PROFIT_LOCK_30_PCT - value: 30 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5166 -- id: PROFIT_LOCK_20_PCT - value: 20 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5170 -- id: PROFIT_LOCK_10_PCT - value: 10 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5174 -- id: PROFIT_LOCK_BREAKEVEN_PCT - value: 0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_LOCK_STAGE_V1 - gs_location: gas_data_feed.gs:5178 - notes: profit_pct ≥ 0% → BREAKEVEN_RATCHET. B06 GAS 신설 (2026-05-30). -- id: SEMI_CLUSTER_CAP_EVENT_SHOCK - value: 20.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3855 - notes: '이벤트 충격 방어: 20% 고정. KOSPI 비중 제공 시 max(20, weight×0.60).' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SEMI_CLUSTER_CAP_RISK_OFF_MWA - value: 25.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3858 - notes: > - 하락장: 25%. KOSPI 비중 제공 시 max(25, weight×0.80). - WBS-7.1(2026-06-21): 원래 id가 SEMI_CLUSTER_CAP_RISK_OFF였으나 - SEMICONDUCTOR_CLUSTER_GATE_V1 소유의 동명 entry(value=20.0)와 id가 충돌해 - dict 기반 조회 시 한쪽이 조용히 무시되는 버그가 있었다. 외부 참조 0건 확인 후 - 이 entry(MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 소유)만 _MWA suffix로 분리했다. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SEMI_CLUSTER_CAP_NEUTRAL - value: 35.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3867 - notes: '중립: 35%. KOSPI 비중 제공 시 max(35, weight×1.00). 시장 중립 허용.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SEMI_CLUSTER_CAP_RISK_ON - value: 45.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3864 - notes: '상승장: 45%. KOSPI 비중 제공 시 max(45, weight×1.30). 반도체 주도 참여 허용.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SEMI_CLUSTER_CAP_SECULAR_LEADER - value: 65.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 - gs_location: gas_data_feed.gs:3861 - notes: '주도주 집중 전략: 65% 고정. 이 이상은 전체 포트폴리오 리스크 과도.' -- id: SAMSUNG_CAP_EVENT_SHOCK - value: 15.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3777 -- id: SAMSUNG_CAP_RISK_OFF - value: 18.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3778 -- id: SAMSUNG_CAP_NEUTRAL - value: 28.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3781 - notes: 'NEUTRAL: 28%. KOSPI 삼성 비중 입력 시 max(28, weight×1.20). 기존 20%→28% 완화.' -- id: SAMSUNG_CAP_RISK_ON - value: 40.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3780 - notes: 'RISK_ON: 40%. KOSPI 비중 입력 시 max(40, weight×1.70). 기존 20%→40% 완화.' -- id: SAMSUNG_CAP_SECULAR_LEADER - value: 50.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3779 - notes: 'SECULAR_LEADER: 50% 허용. 집중 전략 최대 단일 종목 비중.' -- id: LEADER_POSITION_WEIGHT_CAP_SELL_TRIM - value: 50.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3799 - notes: sharePct >= 50 이면 overweight trim 판정을 위한 경계값. -- id: HYNIX_CAP_EVENT_SHOCK - value: 10.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3785 -- id: HYNIX_CAP_RISK_OFF - value: 12.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3786 -- id: HYNIX_CAP_NEUTRAL - value: 15.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3789 -- id: HYNIX_CAP_RISK_ON - value: 22.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3788 -- id: HYNIX_CAP_SECULAR_LEADER - value: 28.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3787 -- id: PORTFOLIO_HEALTH_CRITICAL_WARN_COUNT - value: 3 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: PORTFOLIO_HEALTH_SCORE_V1 - gs_location: gas_data_feed.gs:3802 - notes: warnCount >= 3 → CRITICAL. 건강도 점수 경계 임계값. -- id: CSA_SCALP_W_TECHNICAL - value: 0.5 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE - notes: '단타: 기술지표 가중. RSI 과매도 반등·당일 모멘텀 중심.' -- id: CSA_SCALP_W_SMARTMONEY - value: 0.3 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE -- id: CSA_SCALP_W_FUNDAMENTAL - value: 0.05 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE - notes: '단타: 펀더멘털 비중 최소(당일 매매에 무관).' -- id: CSA_SCALP_W_MACRO_EVENT - value: 0.15 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE -- id: CSA_SWING_W_TECHNICAL - value: 0.3 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE -- id: CSA_SWING_W_SMARTMONEY - value: 0.35 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:W_STYLE - notes: '단기: 스마트머니 흐름(1~4주 기관수급) 가장 중요.' -- id: CSA_SWING_W_FUNDAMENTAL - value: 0.15 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_SWING_W_MACRO_EVENT - value: 0.2 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_MOMENTUM_W_TECHNICAL - value: 0.15 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_MOMENTUM_W_SMARTMONEY - value: 0.25 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_MOMENTUM_W_FUNDAMENTAL - value: 0.4 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: '중기: 펀더멘털 개선(ROE·OCF) 핵심.' -- id: CSA_MOMENTUM_W_MACRO_EVENT - value: 0.2 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_POSITION_W_TECHNICAL - value: 0.1 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_POSITION_W_SMARTMONEY - value: 0.2 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_POSITION_W_FUNDAMENTAL - value: 0.55 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: '장기: 펀더멘털 내러티브(3개월+ 보유) 가장 중요.' -- id: CSA_POSITION_W_MACRO_EVENT - value: 0.15 - unit: weight - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 -- id: CSA_POSITION_PCT_HIGH_CONVICTION - value: 80.0 - unit: conviction_score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:conviction_to_pct - notes: conviction ≥ 80 → 7% 포지션 (최대 단일 비중) -- id: CSA_POSITION_PCT_STRONG - value: 65.0 - unit: conviction_score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: conviction ≥ 65 → 5% -- id: CSA_POSITION_PCT_MODERATE - value: 50.0 - unit: conviction_score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: conviction ≥ 50 → 3% -- id: CSA_POSITION_PCT_PILOT - value: 35.0 - unit: conviction_score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: conviction ≥ 35 → 1.5% 탐색 파일럿. < 35 → 0% 진입 금지 -- id: CSA_TECH_RSI_OVERSOLD - value: 35.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - py_location: tools/build_capital_style_allocation_v1.py:compute_technical_score - notes: RSI14 < 35 → +20점. 단기 과매도 반등 기회. -- id: CSA_TECH_RSI_OVERBOUGHT - value: 70.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: RSI14 > 70 → -25점. 추격 매수 위험. -- id: CSA_TECH_DISPARITY_PULLBACK - value: 3.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: MA20 이격도 < 3% → +15점. 눌림목 구간. -- id: CSA_TECH_DISPARITY_OVEREXTEND - value: 10.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: MA20 이격도 > 10% → -20점. 과이격 추격 위험. -- id: CSA_TECH_RET5D_REBOUND_CANDIDATE - value: -5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: Ret5D < -5% → +10점. 단기 급락 반등 후보. -- id: CSA_TECH_VOLUME_CONFIRM_MULT - value: 1.2 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: volume >= avgVol5d*1.2 AND Ret5D>0 → +10점. 수급 확인 돌파. -- id: CSA_LIQUIDITY_MODIFIER_DEEP - value: 1.0 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: DEEP 유동성 → 배수 1.0 (conviction 전량 적용) -- id: CSA_LIQUIDITY_MODIFIER_MODERATE - value: 0.9 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: MODERATE 유동성 → 배수 0.9 (10% 패널티) -- id: CSA_LIQUIDITY_MODIFIER_THIN - value: 0.75 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: THIN 유동성 → 배수 0.75 (25% 패널티) -- id: CSA_LIQUIDITY_MODIFIER_FROZEN - value: 0.0 - unit: ratio - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: CAPITAL_STYLE_ALLOCATION_V1 - notes: FROZEN 유동성 → conviction=0 강제. 실행 금지. -- id: BQG_V2_RET3D_BLOCK_7PCT - value: 7.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6696 - notes: 3일 수익률 ≥ 7% → 감점. 라인 업데이트 등록. -- id: BQG_V2_DISPARITY_BLOCK_10PCT - value: 10.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6697 - notes: 이격도 > 10% → 감점. 과열 추격. -- id: BQG_V2_SURGE_RET1D_4PCT - value: 4.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6698 - notes: 당일 +4% 이상 저거래량 → 감점. -- id: BQG_V2_RSI_OVERBOUGHT_75 - value: 75.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6700 - notes: RSI14 > 75 → 감점. -- id: BQG_V2_TIMING_EXIT_50 - value: 50.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6701 - notes: 타이밍 이탈점수 ≥ 50 → 감점. -- id: BQG_V2_DISTRIBUTION_70 - value: 70.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6702 - notes: 설거지 위험 점수 ≥ 70 → 감점. -- id: BQG_V2_LATE_CHASE_70 - value: 70.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6703 - notes: 뒷박 위험 점수 ≥ 70 → 감점. -- id: BQG_V2_VOL_RET1D_2PCT - value: 2.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6706 - notes: 거래량 1.5배 이상 & ret1d ≥ 2% → 가점 조건. -- id: BQG_V2_QUALITY_RET3D_5PCT - value: 5.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6707 - notes: 3일 수익률 < 5% → 품질 돌파 가점 조건. -- id: BQG_V2_DISPARITY_HEALTHY_6PCT - value: 6.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6708 - notes: 이격도 0~6% → 건강한 이격 가점. -- id: BQG_V2_RSI_HEALTHY_MIN_45 - value: 45.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6709 - notes: RSI14 ≥ 45 → 건강 구간 가점 (하한). -- id: BQG_V2_RSI_HEALTHY_MAX_65 - value: 65.0 - unit: rsi - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6709 - notes: RSI14 ≤ 65 → 건강 구간 가점 (상한). -- id: BQG_V2_PILOT_ALLOWED_SCORE_75 - value: 75.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6659 - notes: score >= 75 → PILOT_ALLOWED. breakout lead entry 상태 임계. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: BQG_V2_WATCH_ONLY_SCORE_55 - value: 55.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6660 - notes: score >= 55 → WATCH_ONLY. breakout lead entry 대기 임계. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_CONSEC_SELL_5D - value: 5.0 - unit: days - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6743 - notes: 5일 연속 매도 신호 → whipsaw 가점. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_SECTOR_RS_100 - value: 100.0 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6746 - notes: 섹터 RS > 100 → 섹터 초과수익 가점. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_VOL_SURGE_50PCT - value: 50.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6747 - notes: 거래대금 급증 ≥ 50% → 감점. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_VOL_SURGE_100PCT - value: 100.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6748 - notes: 거래대금 급증 ≥ 100% → 추가 감점. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_SCORE_GATE_30 - value: 30.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6762 - notes: score ≥ 30 → WHIPSAW_CONFIRMED 발동. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_CLEAR_CNT_3 - value: 3.0 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6763 - notes: 해제 조건 3개 → WHIPSAW_AUTO_RELEASED. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_CLEAR_CNT_2 - value: 2.0 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6764 - notes: 해제 조건 2개 → WHIPSAW_WEAKENING (hold_1d). - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_SCORE_GATE_10 - value: 10.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6712 - notes: score 10~29 → INCONCLUSIVE. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWS_V1_SCORE_GATE_WATCH - value: 40.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6712 - notes: score 10~39 → WATCH_COOLING_OFF. ≥40 → INCONCLUSIVE 이상. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: BQG_V2_GATE_BLOCKED_LT_10 - value: 10.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6715 - notes: score < 10 → BLOCKED_LATE_CHASE. 돌파 품질 최저 임계. -- id: BQG_V2_GATE_WATCH_LT_40 - value: 40.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: BREAKOUT_QUALITY_GATE_V2 - gs_location: gas_data_feed.gs:6715 - notes: score 10~39 → WATCH_COOLING_OFF. ≥40 → PILOT_ALLOWED. -- id: AWG_V1_VOL_SURGE_100_PENALTY2 - value: 100.0 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6751 - notes: volSurge ≥ 100% → 추가 -20점 (vol_surge_100pct 이중 페널티). - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWG_V1_AUTO_RELEASE_CLEAR_CNT_2 - value: 2.0 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6767 - notes: clearCnt ≥ 2 → WHIPSAW_WEAKENING, holdDays=1. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: AWG_V1_INCONCLUSIVE_SCORE_10 - value: 10.0 - unit: score - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6769 - notes: score ≥ 10 AND < 30 → INCONCLUSIVE 게이트. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: ANTI_WHIPSAW_GATE_V1_SCORE_WARN_55 - value: 55.0 - unit: score - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6732 - notes: score >= 55 이면 anti-whipsaw 강도 기준을 통과하는 경계값. -- id: NF1_FX_BETA_EXPORT - value: 1.2 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REGIME_CONDITIONAL_MACRO_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:FX_BETA_EXPORT - notes: 수출주(삼성전자·SK하이닉스) FX 민감도 가중치. usd_krw_weak 기여 20% 확대. Expert prior. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF1_FX_BETA_DOMESTIC - value: 0.7 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REGIME_CONDITIONAL_MACRO_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:FX_BETA_DOMESTIC - notes: 내수주 FX 민감도 축소. usd_krw_weak 기여 30% 감소. Expert prior. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_CAPTURE_WEIGHT - value: 15.0 - unit: thesis_points - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:REBOUND_CAPTURE_WEIGHT - notes: 과매도 반등 4조건 충족 시 thesis 보너스 점수. Expert prior. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_RSI_LOW - value: 25 - unit: rsi - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py - notes: 'rsi14 >= 25: 과매도 하한. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_RSI_HIGH - value: 40 - unit: rsi - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py - notes: 'rsi14 <= 40: 과매도~회복 초입 상한. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_MA20_BUFFER - value: 1.03 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py - notes: 'price <= ma20 x 1.03: MA20 3% 이내 눌림목 버퍼. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_FLOW_CREDIT_MIN - value: 0.5 - unit: ratio_0_1 - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py - notes: 'flow_credit >= 0.5: 자금 유입 최소 기준. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF2_REBOUND_DOWN_STREAK_MIN - value: 2 - unit: days - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 - py_location: tools/build_predictive_alpha_dialectic_engine_v2.py - notes: 'down_streak >= 2: 연속 하락 2일 이상. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF3_CUT_DECILE_DEFAULT - value: 3 - unit: decile_rank_1_10 - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ENTRY_TIMING_DECILE_FACTOR_V1 - py_location: tools/build_late_chase_attribution_v1.py:velocity_decile_thresholds - notes: '하위 3분위 BUY 차단. samples >= 30 누적 후 실측 최저승률 분위로 자동 교체 예정. - - 보정 조건: proposal_evaluation_history 비-REPLAY T+5 행 30건 이상. - - ' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF3_MIN_SAMPLE_N - value: 30 - unit: count - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: ENTRY_TIMING_DECILE_FACTOR_V1 - py_location: tools/build_late_chase_attribution_v1.py - notes: 분위 캘리브레이션 최소 표본 수. 미달 시 WATCH_PENDING_SAMPLE. Expert prior. - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF4_ADV_PARTICIPATION_CAP - value: 0.05 - unit: ratio - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: SELL_SLIPPAGE_BUDGET_FACTOR_V1 - py_location: tools/build_value_preservation_scorer_v1.py:adv_participation_cap - notes: 'ADV 대비 주문크기 5% 상한. 5% 초과 시 TWAP 분할 권고. - - Expert prior: 시장충격 연구 기반. - - ' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF5_K_APEX_SUPER - value: 1.0 - unit: atr_multiplier - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 - py_location: tools/build_ratchet_trailing_general_v1.py - notes: 'APEX_SUPER(+50%): k=1.0 타이트닝. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF5_K_APEX_TRAILING - value: 1.5 - unit: atr_multiplier - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 - py_location: tools/build_ratchet_trailing_general_v1.py - notes: 'APEX_TRAILING(+40~50%): k=1.5. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF5_K_PROFIT_LOCK_30 - value: 2.0 - unit: atr_multiplier - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 - py_location: tools/build_ratchet_trailing_general_v1.py - notes: 'PROFIT_LOCK_20/30(+20~40%): k=2.0. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: NF5_K_NEUTRAL - value: 2.5 - unit: atr_multiplier - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 - py_location: tools/build_ratchet_trailing_general_v1.py - notes: 'PROFIT_LOCK_10(+10~20%): k=2.5. 기본 래칫 폭. Expert prior.' - live_sample_requirement: 30 - sunset_date: '2026-09-30' -- id: SEMICONDUCTOR_CLUSTER_LIMIT - value: 3.0 - unit: count - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: SEMICONDUCTOR_CLUSTER_GATE - gs_location: gas_data_feed.gs:3904 - notes: Semiconductor cluster limit. -- id: LEADER_POSITION_WEIGHT_CAP_V1 - value: 50.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3829 - notes: Leader position weight cap. -- id: LEADER_POSITION_WEIGHT_CAP_V1_TIME_BREACH_DAYS - value: 60 - unit: days - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 - gs_location: gas_data_feed.gs:3816 - notes: holdDays >= 60 && excessRet < 0 → TIME_STOP. -- id: ANTI_WHIPSAW_GATE_V1_LIMIT - value: 35.0 - unit: pct - source: SPEC_DERIVED - sample_n: 0 - last_calibrated: null - owner_formula: ANTI_WHIPSAW_GATE_V1 - gs_location: gas_data_feed.gs:6735 - notes: Anti-whipsaw gate limit. - -- id: SP_TAKE_PROFIT - value: 10 - unit: score_points - source: SPEC_DERIVED - sample_n: null - last_calibrated: null - owner_formula: TAKE_PROFIT_LADDER_V2 - gs_location: gas_data_feed.gs:186 - notes: Sell-priority score bonus awarded when take-profit condition is active. Migrated from GAS constant to registry (P5-T01 wave1). - -- id: TAKE_PROFIT_BASE - value: 10 - unit: score_points - source: SPEC_DERIVED - sample_n: null - last_calibrated: null - owner_formula: TAKE_PROFIT_LADDER_V2 - gs_location: gas_data_feed.gs:2164 - notes: Base take-profit score used in profit-lock computation. Migrated from GAS SP constant to registry (P5-T01 wave2). - -- id: OVERHANG_PRESSURE_V1_FALLBACK_MULT - value: 1.5 - unit: multiplier_of_avg_volume_5d - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: OVERHANG_PRESSURE_V1 - py_location: spec/13_formula_registry.yaml:OVERHANG_PRESSURE_V1.derived_flags.selling_acceleration.without_20d_fallback - notes: > - WBS-7.5(2026-06-21) — frg_20d_sh 미존재 시 selling_acceleration 폴백을 - "frg_5d_sh < -500000"(절대 주식수, 임시) 에서 "frg_5d_sh < -1.5 * avg_volume_5d" - (해당 종목 평균거래량 비례) 로 교체. 1.5 배수는 with_20d 분기에서 동일 공식이 - 이미 사용하는 가속 임계(frg_20d_sh/4 × 1.5)를 그대로 재사용한 것이며, 새로 - 추정한 값이 아니다. 단, 실거래 표본으로 검증되지 않았으므로 EXPERT_PRIOR로 - 등록한다 — CALIBRATED 승격은 sample_n≥30 확보 후 검토. -- id: MRS_CIRCUIT_BREAKER_ADJUSTMENT_PTS - value: 2 - unit: mrs_score_points - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PORTFOLIO_CIRCUIT_BREAKER_V1 - spec_location: spec/risk/circuit_breakers.yaml:sector_crash_intraday_protocol.tier_B - notes: > - WBS-7.5(2026-06-22) — sector_crash_intraday_protocol의 tier_B 조치에서 - cash_floor market_risk_score_based_cash를 상향 조정할 때 적용하는 MRS 점수 추가. - 극단 시장변동성 발생 시 현금 보수성을 강화하기 위한 일시적 조정 메커니즘. - 기존 spec에 "MRS +2점 (임시)"로 하드코딩되어 있던 값을 정규화. - 실거래 표본 부재로 EXPERT_PRIOR 등록. CALIBRATED 승격 조건: 10건 이상 tier_B - 발동 사례에서 수익률 개선 효과 측정. - sunset_date: '2026-12-31' - live_sample_requirement: 10 -- id: CLUSTER_CAP_CLA_REGIME_PER - value: 60 - unit: pct - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: PORTFOLIO_CLUSTER_EXPOSURE_GATE_V1 - spec_location: spec/risk/portfolio_exposure.yaml:regime_based_cluster_cap.cla_regime.cluster_combined_pct_max - notes: > - WBS-7.5(2026-06-22) — CLA(Concentrated Leader Advance) 레짐 발동 시 - cluster(O2 반도체 + 관련 업체) 결합 노출 상한을 기본 25%에서 60%로 일시 상향. - 극단 기업경기 시나리오에서 반도체 부문 자산 유동성 보호를 위한 조정. - 기존 spec에 "O2 상한 임시 해제"로 명시된 값을 정규화. - 실거래 표본 부재로 EXPERT_PRIOR 등록. CALIBRATED 승격 조건: CLA 발동 5회 이상 - 사례에서 cluster 과다노출 시 손실 회피 효과 측정. - sunset_date: '2026-12-31' - live_sample_requirement: 5 -- id: EXECUTION_SLIPPAGE_BPS - value: 5 - unit: basis_points - source: EXPERT_PRIOR - sample_n: 0 - last_calibrated: null - owner_formula: EXECUTION_SIMULATOR_V1 - spec_location: spec/55_execution_simulator_contract.yaml:slippage_model.bps - notes: > - WBS-7.6(2026-06-22) — 시장가 주문 기준 평균 슬리피지를 5bps로 하드코딩하던 - 값을 정규화. 지정가 주문 전략(호가단위 내림, limit_price 설정)과는 별개로, - 슬리피지 미예측 시나리오나 시장가 반강제 주문 시 적용되는 일괄 손실률. - 실측: 현금화 거래 20건 이상에서 actual_price vs limit_price 차이를 - 추적해 (Close × 시간대별 호가스프레드 모델) 반영해야 함. - 기존 "5bps는 이론치, 실측 보정 예정"이라는 spec 주석이 더 이상 유효하려면 - 이 threshold로 정규화 필수. - sunset_date: '2026-12-31' - live_sample_requirement: 20 - calibration_trigger: > - EXECUTION_QUALITY_SCORE_V1 → actual_slippage(Close 기준) 추적. - 20건 이상 거래 누적 시 average_actual_slippage 계산 후 - 현재 5bps와 비교. 차이 > 1bps이면 실측값으로 갱신. - calibration_policy: - honest_disclosure_required: true - overclaimed_calibration_definition: 'source=CALIBRATED 이면서 sample_n < 30 → OVERCLAIMED_CALIBRATION. - - 실측 없이 "검증된 값"으로 위장 금지. - - ' - provisional_handling: 'source=PROVISIONAL 또는 EXPERT_PRIOR 는 경고(WARN) 원장에 기록. - - 사용은 허용하되 보고서에 "미보정 임계값" 명시 필요. - - ' calibration_path: 'EXPERT_PRIOR → PROVISIONAL (sample_n 1-29, 예비 검증) → CALIBRATED (sample_n ≥ 30, backtest 수익기여도 측정 완료) @@ -1934,3 +17,1917 @@ calibration_policy: 보정 우선순위: ALEG_V2 velocity 임계값 → DSD_V1 가중치 → K2 분할비율 ' + honest_disclosure_required: true + overclaimed_calibration_definition: 'source=CALIBRATED 이면서 sample_n < 30 → OVERCLAIMED_CALIBRATION. + + 실측 없이 "검증된 값"으로 위장 금지. + + ' + provisional_handling: 'source=PROVISIONAL 또는 EXPERT_PRIOR 는 경고(WARN) 원장에 기록. + + 사용은 허용하되 보고서에 "미보정 임계값" 명시 필요. + + ' +code_path: +- tools/build_calibration_priority_v1.py +- tools/validate_calibration_registry_v1.py +has_code_implementation: true +meta: + has_code_implementation: false +thresholds: +- gs_location: gas_apex_alpha_watch.gs:345 + id: ALEG_V2_GATE1_BLOCK_PCT + last_calibrated: null + notes: '30년 현장 경험 기반. velocity_1d ≥ 3%이면 당일 고점 진입 위험. + + AGENTS.md Direction A2: "velocity_1d ≥ 3%에서 진입한 거래의 T+5 승률이 통계적으로 현저히 낮음" + + → 단, 구체적 수치 미기재. PROVISIONAL 격상 조건: samples≥30 후 실측 T+5 승률 측정. + + ' + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + py_location: tools/compute_formula_outputs.py:127 + sample_n: 141 + source: SPEC_DERIVED + unit: pct + value: 3.0 +- gs_location: gas_apex_alpha_watch.gs:374 + id: ALEG_V2_SAMPLE_VALIDATION_N + last_calibrated: null + notes: 소표본 판정을 위한 최소 표본 수 30개 기준. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 30.0 +- gs_location: gas_apex_alpha_watch.gs:347 + id: ALEG_V2_GATE1_WAIT_PCT + last_calibrated: null + notes: PULLBACK_WAIT 경계. BLOCK(3.0%)의 절반 수준. Expert prior. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + py_location: tools/compute_formula_outputs.py:131 + sample_n: 141 + source: SPEC_DERIVED + unit: pct + value: 1.5 +- gs_location: gas_apex_alpha_watch.gs:350 + id: ALEG_V2_GATE2_BLOCK_PCT + last_calibrated: null + notes: 5일 누적 8% 이상 급등 → 추격 매수 차단. Expert prior. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 141 + source: SPEC_DERIVED + unit: pct + value: 8.0 +- gs_location: gas_apex_alpha_watch.gs:352 + id: ALEG_V2_GATE2_WAIT_PCT + last_calibrated: null + notes: 5일 5% 이상 → PULLBACK_WAIT_5D. Expert prior. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5.0 +- gs_location: gas_apex_alpha_watch.gs:355 + id: ALEG_V2_GATE3_BLOCK_WS + last_calibrated: null + notes: 'DISTRIBUTION 가중합산 3.0 이상 → BLOCK. + + V1.1에서 4.0→5.0으로 상향된 DISTRIBUTION_SELL_DETECTOR_V1과 별개 기준. + + Expert prior. 혼동 주의. + + ' + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: weighted_sum + value: 3.0 +- gs_location: gas_apex_alpha_watch.gs:357 + id: ALEG_V2_GATE3_WAIT_WS + last_calibrated: null + notes: ALEG gate3 WAIT 경계. Expert prior. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: weighted_sum + value: 2.0 +- gs_location: gas_apex_alpha_watch.gs:337 + id: ALEG_V2_DIST_FRG_WEIGHT + last_calibrated: null + notes: 외국인 5일 순매도(frg5d<0) 신호 가중치. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 141 + source: SPEC_DERIVED + unit: weight + value: 2.0 +- gs_location: gas_apex_alpha_watch.gs:338 + id: ALEG_V2_DIST_INST_WEIGHT + last_calibrated: null + notes: 기관 5일 순매도(inst5d<0) 신호 가중치. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 2.0 +- gs_location: gas_apex_alpha_watch.gs:339 + id: ALEG_V2_DIST_VOL_MULT + last_calibrated: null + notes: 거래량 > 평균×1.3 → 과열 신호. weight=1.5. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 141 + source: SPEC_DERIVED + unit: ratio + value: 1.3 +- gs_location: gas_apex_alpha_watch.gs:339 + id: ALEG_V2_DIST_VOL_WEIGHT + last_calibrated: null + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 1.5 +- gs_location: gas_apex_alpha_watch.gs:340 + id: ALEG_V2_DIST_BEAR_WEIGHT + last_calibrated: null + notes: 당일 음봉(close 70 → 과매수. weight=1.0. + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 70 +- gs_location: gas_apex_alpha_watch.gs:388 + id: ALEG_V2_GRADE_B_VEL1D_UPPER + last_calibrated: null + notes: 'entry_grade B 조건: velocity_1d < 1.5% AND MA20 근접. gate1 WAIT 임계(동일값)와 별도 + 등급 기준.' + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 1.5 +- gs_location: gas_apex_alpha_watch.gs:393 + id: ALEG_V2_GRADE_D_VEL5D_LOWER + last_calibrated: null + notes: 'entry_grade D 조건: velocity_5d > 5.0% (gate2 WAIT 임계와 동일값, 독립 등급 판정).' + owner_formula: ANTI_LATE_ENTRY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5.0 +- gs_location: gas_apex_alpha_watch.gs:361 + id: SMLOLINK_V1_MIN_SAMPLE_N + last_calibrated: null + notes: 유동성 버킷별 최소 표본 수. n<30이면 UNVALIDATED로 레이블. 통계 신뢰성 하한. + owner_formula: SMART_MONEY_LIQUIDITY_OUTCOME_LINK_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 30 +- gs_location: gas_data_feed.gs:8783 + id: DSD_V1_CONFIRMED_WS + last_calibrated: null + notes: 'V1.1에서 4.0→5.0으로 상향 (2026-05-22). + + DISTRIBUTION_CONFIRMED → BUY 완전 차단. Expert prior. + + 보정 조건: 과거 확인된 분배 구간 레이블 데이터 30건 이상. + + ' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 141 + source: PROVISIONAL + unit: weighted_sum + value: 5.0 +- gs_location: gas_data_feed.gs:8783 + id: DSD_V1_WARNING_WS + last_calibrated: null + live_sample_requirement: 30 + notes: V1.1에서 2.0→3.0 상향. DISTRIBUTION_WARNING → BUY 보류 권고. + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: weighted_sum + value: 3.0 +- id: DSD_V1_SIG1_WEIGHT + last_calibrated: null + notes: 'SIG_1: 신고가 근접+거래량 수축' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 141 + source: PROVISIONAL + unit: weight + value: 2.0 +- id: DSD_V1_SIG2_WEIGHT + last_calibrated: null + notes: 'SIG_2: 5일 급등+수급 약화' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 141 + source: PROVISIONAL + unit: weight + value: 2.0 +- id: DSD_V1_SIG3_WEIGHT + last_calibrated: null + live_sample_requirement: 30 + notes: 'SIG_3: 외인+기관 동반순매도 3일' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: weight + value: 1.5 +- id: DSD_V1_SIG4_WEIGHT + last_calibrated: null + notes: 'SIG_4: RSI14≥75+당일 음봉' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 141 + source: PROVISIONAL + unit: weight + value: 1.5 +- id: DSD_V1_SIG4_RSI_THRESHOLD + last_calibrated: null + live_sample_requirement: 30 + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: rsi + value: 75 +- id: DSD_V1_SIG5_WEIGHT + last_calibrated: null + notes: 'SIG_5: OBV 20일 기울기 음수' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 141 + source: PROVISIONAL + unit: weight + value: 1.0 +- id: DSD_V1_SIG6_WEIGHT + last_calibrated: null + live_sample_requirement: 30 + notes: 'SIG_6: 전일 급등+당일 -2% 갭하락' + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: weight + value: 1.0 +- id: DSD_V1_SIG6_GAP_PCT + last_calibrated: null + live_sample_requirement: 30 + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: -2.0 +- id: K2_SPLIT_RATIO + last_calibrated: null + notes: '50/50 분할. 즉시 50% 매도, 나머지 50% 반등 대기. + + 보정 조건: 과거 oversold(RSI<30) 구간 반등 사례 30건 이상. + + 선택지: 30/70, 40/60, 50/50, 60/40 — backtest 비교 필요. + + ' + owner_formula: K2_STAGED_REBOUND_SELL_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.5 +- id: K2_REBOUND_TRIGGER_ATR_MULT + last_calibrated: null + notes: 'rebound_trigger = prevClose + 0.5×ATR20. + + 보정 조건: 과거 V자 반등 사례에서 반등 시 도달한 ATR 배수 분포 분석. + + 선택지: 0.3, 0.4, 0.5, 0.6, 0.7 — 2~3영업일 내 도달률 기준 최적화. + + ' + owner_formula: K2_STAGED_REBOUND_SELL_V1 + sample_n: 141 + source: SPEC_DERIVED + unit: atr_multiple + value: 0.5 +- id: K2_DEADLINE_DAYS + last_calibrated: null + notes: 반등 대기 데드라인 3영업일. 초과 시 stage1 가격으로 강제 실행. + owner_formula: K2_STAGED_REBOUND_SELL_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: days + value: 3 +- id: SCR_V4_VALUE_DAMAGE_BLOCK_PCT + last_calibrated: null + live_sample_requirement: 30 + notes: '평균 주식가치 훼손율 10% 초과 시 VALUE_DAMAGE_BLOCK. + + 현재 실측값 14.1%(STRUCTURAL_WARN) → 실질 동작이 BLOCK 임계값보다 높음. + + 보정 조건: 국면별 차등 적용(EVENT_SHOCK=8%, RISK_OFF=10%, NEUTRAL=12%, RISK_ON=14%). + + ' + owner_formula: CASH_RECOVERY_OPTIMIZER_V1 + py_location: tools/build_smart_cash_recovery_v4.py:143 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 10.0 +- id: SCR_V4_EFFICIENCY_BASE + last_calibrated: null + live_sample_requirement: 30 + notes: rebound_efficiency_score 기본 50점. 설계점수이며 실측 P&L 아님. + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:70 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 50.0 +- id: SCR_V4_EFFICIENCY_DAMAGE_PENALTY_COEFF + last_calibrated: null + live_sample_requirement: 30 + notes: 'Work24에서 0.5→0.4로 하향 조정 (14.1% 손해율에서 BLOCK 회피 목적 의심). + + 보정 조건: 과거 rebound_wait_qty 처리 결과의 실제 P&L 30건 이상. + + ' + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:78 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: coefficient + value: 0.4 +- id: SCR_V4_EFFICIENCY_DEGRADE_THRESHOLD + last_calibrated: null + live_sample_requirement: 30 + notes: efficiency_score < 45 → DEGRADE_IMMEDIATE_SELL_WEIGHT 상태 전환 임계 + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:95 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 45.0 +- id: SCR_V4_DAMAGE_STRUCTURAL_WARN_PCT + last_calibrated: null + live_sample_requirement: 30 + notes: avg_damage > 10% → VALUE_DAMAGE_STRUCTURAL_WARN (상태 전환 임계) + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:99 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 10.0 +- id: SCR_V4_DAMAGE_BLOCK_PCT + last_calibrated: null + live_sample_requirement: 30 + notes: avg_damage > 16% → CASH_RECOVERY_VALUE_DAMAGE_BLOCK (극고손실 임계) + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:97 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 16.0 +- id: SCR_V4_VALIDATED_SAMPLE_MIN + last_calibrated: null + notes: 실측 검증 최소 표본 수. sample_n < 30 → UNVALIDATED_DESIGN_SCORE 강제 라벨 (HONEST-V1) + owner_formula: VALUE_PRESERVATION_SCORER_V1 + py_location: tools/build_rebound_sell_efficiency_v1.py:104 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 30 +- gs_location: gas_data_feed.gs:6677 + id: BQG_V2_RET3D_BLOCK_PCT + last_calibrated: null + notes: 3일 수익률 ≥ 7% → -30점. 단기 급등 후 진입 불량 신호. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 7.0 +- gs_location: gas_data_feed.gs:6678 + id: BQG_V2_DISPARITY_BLOCK_PCT + last_calibrated: null + notes: MA20 이격도 > 10% → -25점. 과열 추격 신호. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10.0 +- gs_location: gas_data_feed.gs:6679 + id: BQG_V2_SURGE_DAY_RET1D_PCT + last_calibrated: null + notes: 당일 +4% 이상이면서 거래량 저조 → -40점. 설거지 유형 돌파 신호. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 141 + source: SPEC_DERIVED + unit: pct + value: 4.0 +- gs_location: gas_data_feed.gs:6681 + id: BQG_V2_RSI_OVERBOUGHT + last_calibrated: null + notes: RSI14 > 75 → -20점. 단기 과매수 구간. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 75.0 +- gs_location: gas_data_feed.gs:6682 + id: BQG_V2_TIMING_EXIT_BLOCK + last_calibrated: null + notes: timing_score_exit ≥ 50 → -50점. 이미 매도 신호 강함. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 50.0 +- gs_location: gas_data_feed.gs:6724 + id: AWG_V1_CONSEC_SELL_DAYS + last_calibrated: null + live_sample_requirement: 30 + notes: 연속매도신호 ≥ 5일 → +20점. 과매도 구간 재진입 신호. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 5.0 +- gs_location: gas_data_feed.gs:6727 + id: AWG_V1_SECTOR_RS_OUTPERFORM + last_calibrated: null + notes: sectorRS5d > 100%(시장 대비 초과) → +15점. 섹터 상대강도 유지. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 141 + source: PROVISIONAL + unit: ratio_pct + value: 100.0 +- gs_location: gas_data_feed.gs:6728 + id: AWG_V1_VOL_SURGE_CAUTION + last_calibrated: null + live_sample_requirement: 30 + notes: 거래대금 급증 ≥ 50% → -25점. 단기 과열로 반등 신뢰도 약화. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 50.0 +- gs_location: gas_data_feed.gs:6729 + id: AWG_V1_VOL_SURGE_STRONG + last_calibrated: null + notes: 거래대금 급증 ≥ 100% → 추가 -20점. 분배 패턴 가속. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 141 + source: PROVISIONAL + unit: pct + value: 100.0 +- gs_location: gas_data_feed.gs:6743 + id: AWG_V1_CONFIRMED_THRESHOLD + last_calibrated: null + live_sample_requirement: 30 + notes: score ≥ 30 → WHIPSAW 확정(CONFIRMED/WEAKENING/AUTO_RELEASED). 반등 강도 구분. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 30.0 +- gs_location: gas_data_feed.gs:6747 + id: AWG_V1_INCONCLUSIVE_THRESHOLD + last_calibrated: null + notes: score ≥ 10 AND < 30 → INCONCLUSIVE. score < 10 → CONFIRMED_SELL. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 141 + source: PROVISIONAL + unit: score + value: 10.0 +- gs_location: gas_data_feed.gs:6687 + id: BQG_V2_QUALITY_VOL_MULT + last_calibrated: null + notes: '품질 돌파 조건: volume >= avgVol5d*1.5 (거래량 확인) → +25점.' + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 1.5 +- gs_location: gas_data_feed.gs:6688 + id: BQG_V2_QUALITY_RET3D_MAX + last_calibrated: null + notes: '품질 돌파 조건: ret3d < 5% (급등 없이 돌파) → +25점 조건 중 하나.' + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5.0 +- gs_location: gas_data_feed.gs:6689 + id: BQG_V2_DISPARITY_HEALTHY_MAX + last_calibrated: null + notes: 이격도 0~6% → +15점. 적정 이격 돌파 구간. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 6.0 +- gs_location: gas_data_feed.gs:6690 + id: BQG_V2_RSI_HEALTHY_MIN + last_calibrated: null + notes: RSI14 45~65 → +10점. 건강한 모멘텀 구간. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 45.0 +- gs_location: gas_data_feed.gs:6690 + id: BQG_V2_RSI_HEALTHY_MAX + last_calibrated: null + notes: RSI14 45~65 → +10점. 65 초과 시 가점 없음. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 65.0 +- gs_location: gas_data_feed.gs:6687 + id: BQG_V2_QUALITY_RET1D_MIN + last_calibrated: null + notes: '품질 돌파 조건: ret1d ≥ 2% AND 거래량 확인 → +25점 조건 중 하나.' + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 2.0 +- gs_location: gas_data_feed.gs:6693 + id: BQG_V2_BLOCKED_SCORE_MAX + last_calibrated: null + notes: score < 10 → BLOCKED_LATE_CHASE (뒷박 추격 완전 차단) + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 10.0 +- gs_location: gas_data_feed.gs:6693 + id: BQG_V2_WATCH_SCORE_MAX + last_calibrated: null + notes: score < 40 → WATCH_COOLING_OFF. score ≥ 40 → PILOT_ALLOWED. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 40.0 +- gs_location: gas_data_feed.gs:8789 + id: DSD_V1_EARLY_WARNING_RSI_THRESHOLD + last_calibrated: null + live_sample_requirement: 30 + notes: pre_distribution_warning early_warning_v2 조건 — RSI 관련 보조 임계 + owner_formula: DISTRIBUTION_SELL_DETECTOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: rsi + value: 70.0 +- gs_location: gas_data_feed.gs:2098 + id: HEAT_GATE_EVENT_SHOCK_HARD_BLOCK + last_calibrated: null + notes: EVENT_SHOCK 국면 열도 차단 임계. 5% 초과 → BLOCK_NEW_BUY. + owner_formula: DYNAMIC_HEAT_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5.0 +- gs_location: gas_data_feed.gs:2099 + id: HEAT_GATE_RISK_OFF_HARD_BLOCK + last_calibrated: null + owner_formula: DYNAMIC_HEAT_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 7.0 +- gs_location: gas_data_feed.gs:2103 + id: HEAT_GATE_NEUTRAL_HARD_BLOCK + last_calibrated: null + owner_formula: DYNAMIC_HEAT_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10.0 +- gs_location: gas_data_feed.gs:2101 + id: HEAT_GATE_RISK_ON_HARD_BLOCK + last_calibrated: null + owner_formula: DYNAMIC_HEAT_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 12.0 +- gs_location: gas_data_feed.gs:2100 + id: HEAT_GATE_SECULAR_LEADER_HARD_BLOCK + last_calibrated: null + owner_formula: DYNAMIC_HEAT_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 13.0 +- gs_location: gas_data_feed.gs:3433 + id: REGIME_SCALE_EVENT_SHOCK + last_calibrated: null + live_sample_requirement: 30 + notes: EVENT_SHOCK → 정상 사이징의 25%만 허용. + owner_formula: POSITION_SIZE_REGIME_SCALE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 0.25 +- gs_location: gas_data_feed.gs:3434 + id: REGIME_SCALE_RISK_OFF + last_calibrated: null + live_sample_requirement: 30 + owner_formula: POSITION_SIZE_REGIME_SCALE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 0.5 +- gs_location: gas_data_feed.gs:3436 + id: REGIME_SCALE_RISK_ON + last_calibrated: null + live_sample_requirement: 30 + owner_formula: POSITION_SIZE_REGIME_SCALE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 1.1 +- gs_location: gas_data_feed.gs:3435 + id: REGIME_SCALE_SECULAR_LEADER + last_calibrated: null + owner_formula: POSITION_SIZE_REGIME_SCALE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 1.2 +- gs_location: gas_data_feed.gs:4487 + id: DRAWDOWN_CAUTION_LOSS_COUNT + last_calibrated: null + notes: 연속 2회 손절 → CAUTION_BUY(scale=0.75). + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 2 +- gs_location: gas_data_feed.gs:4485 + id: DRAWDOWN_REDUCE_LOSS_COUNT + last_calibrated: null + notes: 연속 3회 손절 → REDUCE_BUY(scale=0.5). + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 3 +- gs_location: gas_data_feed.gs:4483 + id: DRAWDOWN_NO_BUY_LOSS_COUNT + last_calibrated: null + notes: 연속 5회 손절 → NO_BUY(scale=0.0). + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 5 +- id: DRAWDOWN_CAUTION_SCALE + last_calibrated: null + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.75 +- id: DRAWDOWN_REDUCE_SCALE + last_calibrated: null + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.5 +- gs_location: gas_data_feed.gs:2108 + id: CASH_FLOOR_MRS_LOW_MAX + last_calibrated: null + live_sample_requirement: 30 + notes: MRS ≤ 3 → 현금 최소 7%. + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: mrs_score + value: 3 +- gs_location: gas_data_feed.gs:2109 + id: CASH_FLOOR_MRS_MID_MAX + last_calibrated: null + live_sample_requirement: 30 + notes: MRS ≤ 7 → 현금 최소 10%. + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: mrs_score + value: 7 +- gs_location: gas_data_feed.gs:2110 + id: CASH_FLOOR_MRS_HIGH_MAX + last_calibrated: null + live_sample_requirement: 30 + notes: MRS ≤ 10 → 현금 최소 15%. + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: mrs_score + value: 10 +- id: CASH_FLOOR_LOW_PCT + last_calibrated: null + live_sample_requirement: 30 + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 7 +- id: CASH_FLOOR_MID_PCT + last_calibrated: null + live_sample_requirement: 30 + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 10 +- id: CASH_FLOOR_HIGH_PCT + last_calibrated: null + live_sample_requirement: 30 + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 15 +- gs_location: gas_data_feed.gs:4702 + id: CASH_FLOOR_TRIM_FACTOR + last_calibrated: null + live_sample_requirement: 30 + notes: cash ≥ minPct*0.7 → TRIM_REQUIRED (HARD_BLOCK 전 완충 구간). + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 0.7 +- gs_location: gas_data_feed.gs:4693 + id: CASH_FLOOR_MAGNITUDE_EXCESS_BLOCK_PCT + last_calibrated: null + live_sample_requirement: 30 + notes: magnitudeExcessPctp ≥ 3 → OVER_EXTENDED. 현금 회복 관점의 감점 임계. + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 3.0 +- gs_location: gas_data_feed.gs:4705 + id: CASH_FLOOR_EXIT_SIGNAL_MIN_COUNT + last_calibrated: null + live_sample_requirement: 30 + notes: alreadyActive && exitSignals.length >= 2 → EXIT_SECULAR_LEADER. 현금 회수 시퀀스 + 종료 최소 신호 수. + owner_formula: CASH_FLOOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 2 +- gs_location: gas_data_feed.gs:3451 + id: CASH_UPLIFT_EVENT_SHOCK_MIN + last_calibrated: null + owner_formula: REGIME_CASH_UPLIFT_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 20 +- gs_location: gas_data_feed.gs:3453 + id: CASH_UPLIFT_RISK_OFF_MIN + last_calibrated: null + owner_formula: REGIME_CASH_UPLIFT_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 15 +- gs_location: gas_data_feed.gs:3453 + id: CASH_UPLIFT_RISK_ON_MIN + last_calibrated: null + notes: RISK_ON regimeMin=5. MRS값이 더 높으면 MRS 우선. + owner_formula: REGIME_CASH_UPLIFT_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5 +- gs_location: gas_data_feed.gs:3763 + id: SEMI_CLUSTER_CAP_NORMAL + last_calibrated: null + notes: 'NEUTRAL/RISK_ON: 005930+000660 합산 25% 한도.' + owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 25.0 +- gs_location: gas_data_feed.gs:3763 + id: SEMI_CLUSTER_CAP_RISK_OFF + last_calibrated: null + owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 20.0 +- gs_location: gas_data_feed.gs:3763 + id: SEMI_CLUSTER_CAP_CLA + last_calibrated: null + notes: 'CLA 국면: 3종목(005930+000660+229200) 합산 60% 한도.' + owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 60.0 +- gs_location: gas_data_feed.gs:3874 + id: SEMI_CLUSTER_LEADER_WARN_COUNT + last_calibrated: null + notes: critCount >= 1 또는 warnCount >= 3 이면 leader-cap 경보를 발동하는 기준. + owner_formula: SEMICONDUCTOR_CLUSTER_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 3.0 +- gs_location: gas_data_feed.gs:4460 + id: POSITION_COUNT_MAX_NORMAL + last_calibrated: null + owner_formula: POSITION_COUNT_LIMIT_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 8 +- gs_location: gas_data_feed.gs:4460 + id: POSITION_COUNT_MAX_RISK_OFF + last_calibrated: null + owner_formula: POSITION_COUNT_LIMIT_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 6 +- gs_location: gas_data_feed.gs:4465 + id: POSITION_COUNT_DRAWDOWN_RS_MIN + last_calibrated: null + notes: rsRatio >= 1.5 이면 drawdown guard 조건이 충족되는 기준값. + owner_formula: DRAWDOWN_GUARD_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 1.5 +- gs_location: gas_data_feed.gs:5154 + id: PROFIT_LOCK_APEX_SUPER_PCT + last_calibrated: null + notes: 'spec/AGENTS.md L2: profit_pct ≥ 60% → APEX_SUPER. B06 GAS 정정 완료 (2026-05-30).' + owner_formula: PROFIT_LOCK_STAGE_V1 + py_location: tools/compute_formula_outputs.py:70 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 60 +- gs_location: gas_data_feed.gs:5160 + id: PROFIT_LOCK_APEX_TRAILING_PCT + last_calibrated: null + notes: profit_pct ≥ 40% → APEX_TRAILING. B06 GAS 신설 (2026-05-30). + owner_formula: PROFIT_LOCK_STAGE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 40 +- gs_location: gas_data_feed.gs:5166 + id: PROFIT_LOCK_30_PCT + last_calibrated: null + owner_formula: PROFIT_LOCK_STAGE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 30 +- gs_location: gas_data_feed.gs:5170 + id: PROFIT_LOCK_20_PCT + last_calibrated: null + owner_formula: PROFIT_LOCK_STAGE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 20 +- gs_location: gas_data_feed.gs:5174 + id: PROFIT_LOCK_10_PCT + last_calibrated: null + owner_formula: PROFIT_LOCK_STAGE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10 +- gs_location: gas_data_feed.gs:5178 + id: PROFIT_LOCK_BREAKEVEN_PCT + last_calibrated: null + notes: profit_pct ≥ 0% → BREAKEVEN_RATCHET. B06 GAS 신설 (2026-05-30). + owner_formula: PROFIT_LOCK_STAGE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 0 +- gs_location: gas_data_feed.gs:3855 + id: SEMI_CLUSTER_CAP_EVENT_SHOCK + last_calibrated: null + live_sample_requirement: 30 + notes: '이벤트 충격 방어: 20% 고정. KOSPI 비중 제공 시 max(20, weight×0.60).' + owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 20.0 +- gs_location: gas_data_feed.gs:3858 + id: SEMI_CLUSTER_CAP_RISK_OFF_MWA + last_calibrated: null + live_sample_requirement: 30 + notes: '하락장: 25%. KOSPI 비중 제공 시 max(25, weight×0.80). WBS-7.1(2026-06-21): 원래 id가 + SEMI_CLUSTER_CAP_RISK_OFF였으나 SEMICONDUCTOR_CLUSTER_GATE_V1 소유의 동명 entry(value=20.0)와 + id가 충돌해 dict 기반 조회 시 한쪽이 조용히 무시되는 버그가 있었다. 외부 참조 0건 확인 후 이 entry(MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + 소유)만 _MWA suffix로 분리했다. + + ' + owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 25.0 +- gs_location: gas_data_feed.gs:3867 + id: SEMI_CLUSTER_CAP_NEUTRAL + last_calibrated: null + live_sample_requirement: 30 + notes: '중립: 35%. KOSPI 비중 제공 시 max(35, weight×1.00). 시장 중립 허용.' + owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 35.0 +- gs_location: gas_data_feed.gs:3864 + id: SEMI_CLUSTER_CAP_RISK_ON + last_calibrated: null + live_sample_requirement: 30 + notes: '상승장: 45%. KOSPI 비중 제공 시 max(45, weight×1.30). 반도체 주도 참여 허용.' + owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 45.0 +- gs_location: gas_data_feed.gs:3861 + id: SEMI_CLUSTER_CAP_SECULAR_LEADER + last_calibrated: null + notes: '주도주 집중 전략: 65% 고정. 이 이상은 전체 포트폴리오 리스크 과도.' + owner_formula: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 65.0 +- gs_location: gas_data_feed.gs:3777 + id: SAMSUNG_CAP_EVENT_SHOCK + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 15.0 +- gs_location: gas_data_feed.gs:3778 + id: SAMSUNG_CAP_RISK_OFF + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 18.0 +- gs_location: gas_data_feed.gs:3781 + id: SAMSUNG_CAP_NEUTRAL + last_calibrated: null + notes: 'NEUTRAL: 28%. KOSPI 삼성 비중 입력 시 max(28, weight×1.20). 기존 20%→28% 완화.' + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 28.0 +- gs_location: gas_data_feed.gs:3780 + id: SAMSUNG_CAP_RISK_ON + last_calibrated: null + notes: 'RISK_ON: 40%. KOSPI 비중 입력 시 max(40, weight×1.70). 기존 20%→40% 완화.' + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 40.0 +- gs_location: gas_data_feed.gs:3779 + id: SAMSUNG_CAP_SECULAR_LEADER + last_calibrated: null + notes: 'SECULAR_LEADER: 50% 허용. 집중 전략 최대 단일 종목 비중.' + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 50.0 +- gs_location: gas_data_feed.gs:3799 + id: LEADER_POSITION_WEIGHT_CAP_SELL_TRIM + last_calibrated: null + notes: sharePct >= 50 이면 overweight trim 판정을 위한 경계값. + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 50.0 +- gs_location: gas_data_feed.gs:3785 + id: HYNIX_CAP_EVENT_SHOCK + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10.0 +- gs_location: gas_data_feed.gs:3786 + id: HYNIX_CAP_RISK_OFF + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 12.0 +- gs_location: gas_data_feed.gs:3789 + id: HYNIX_CAP_NEUTRAL + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 15.0 +- gs_location: gas_data_feed.gs:3788 + id: HYNIX_CAP_RISK_ON + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 22.0 +- gs_location: gas_data_feed.gs:3787 + id: HYNIX_CAP_SECULAR_LEADER + last_calibrated: null + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 28.0 +- gs_location: gas_data_feed.gs:3802 + id: PORTFOLIO_HEALTH_CRITICAL_WARN_COUNT + last_calibrated: null + notes: warnCount >= 3 → CRITICAL. 건강도 점수 경계 임계값. + owner_formula: PORTFOLIO_HEALTH_SCORE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 3 +- id: CSA_SCALP_W_TECHNICAL + last_calibrated: null + notes: '단타: 기술지표 가중. RSI 과매도 반등·당일 모멘텀 중심.' + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.5 +- id: CSA_SCALP_W_SMARTMONEY + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.3 +- id: CSA_SCALP_W_FUNDAMENTAL + last_calibrated: null + notes: '단타: 펀더멘털 비중 최소(당일 매매에 무관).' + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.05 +- id: CSA_SCALP_W_MACRO_EVENT + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.15 +- id: CSA_SWING_W_TECHNICAL + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.3 +- id: CSA_SWING_W_SMARTMONEY + last_calibrated: null + notes: '단기: 스마트머니 흐름(1~4주 기관수급) 가장 중요.' + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:W_STYLE + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.35 +- id: CSA_SWING_W_FUNDAMENTAL + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.15 +- id: CSA_SWING_W_MACRO_EVENT + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.2 +- id: CSA_MOMENTUM_W_TECHNICAL + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.15 +- id: CSA_MOMENTUM_W_SMARTMONEY + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.25 +- id: CSA_MOMENTUM_W_FUNDAMENTAL + last_calibrated: null + notes: '중기: 펀더멘털 개선(ROE·OCF) 핵심.' + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.4 +- id: CSA_MOMENTUM_W_MACRO_EVENT + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.2 +- id: CSA_POSITION_W_TECHNICAL + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.1 +- id: CSA_POSITION_W_SMARTMONEY + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.2 +- id: CSA_POSITION_W_FUNDAMENTAL + last_calibrated: null + notes: '장기: 펀더멘털 내러티브(3개월+ 보유) 가장 중요.' + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.55 +- id: CSA_POSITION_W_MACRO_EVENT + last_calibrated: null + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: weight + value: 0.15 +- id: CSA_POSITION_PCT_HIGH_CONVICTION + last_calibrated: null + notes: conviction ≥ 80 → 7% 포지션 (최대 단일 비중) + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:conviction_to_pct + sample_n: 0 + source: SPEC_DERIVED + unit: conviction_score + value: 80.0 +- id: CSA_POSITION_PCT_STRONG + last_calibrated: null + notes: conviction ≥ 65 → 5% + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: conviction_score + value: 65.0 +- id: CSA_POSITION_PCT_MODERATE + last_calibrated: null + notes: conviction ≥ 50 → 3% + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: conviction_score + value: 50.0 +- id: CSA_POSITION_PCT_PILOT + last_calibrated: null + notes: conviction ≥ 35 → 1.5% 탐색 파일럿. < 35 → 0% 진입 금지 + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: conviction_score + value: 35.0 +- id: CSA_TECH_RSI_OVERSOLD + last_calibrated: null + notes: RSI14 < 35 → +20점. 단기 과매도 반등 기회. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + py_location: tools/build_capital_style_allocation_v1.py:compute_technical_score + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 35.0 +- id: CSA_TECH_RSI_OVERBOUGHT + last_calibrated: null + notes: RSI14 > 70 → -25점. 추격 매수 위험. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 70.0 +- id: CSA_TECH_DISPARITY_PULLBACK + last_calibrated: null + notes: MA20 이격도 < 3% → +15점. 눌림목 구간. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 3.0 +- id: CSA_TECH_DISPARITY_OVEREXTEND + last_calibrated: null + notes: MA20 이격도 > 10% → -20점. 과이격 추격 위험. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10.0 +- id: CSA_TECH_RET5D_REBOUND_CANDIDATE + last_calibrated: null + notes: Ret5D < -5% → +10점. 단기 급락 반등 후보. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: -5.0 +- id: CSA_TECH_VOLUME_CONFIRM_MULT + last_calibrated: null + notes: volume >= avgVol5d*1.2 AND Ret5D>0 → +10점. 수급 확인 돌파. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 1.2 +- id: CSA_LIQUIDITY_MODIFIER_DEEP + last_calibrated: null + notes: DEEP 유동성 → 배수 1.0 (conviction 전량 적용) + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 1.0 +- id: CSA_LIQUIDITY_MODIFIER_MODERATE + last_calibrated: null + notes: MODERATE 유동성 → 배수 0.9 (10% 패널티) + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.9 +- id: CSA_LIQUIDITY_MODIFIER_THIN + last_calibrated: null + notes: THIN 유동성 → 배수 0.75 (25% 패널티) + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.75 +- id: CSA_LIQUIDITY_MODIFIER_FROZEN + last_calibrated: null + notes: FROZEN 유동성 → conviction=0 강제. 실행 금지. + owner_formula: CAPITAL_STYLE_ALLOCATION_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: ratio + value: 0.0 +- gs_location: gas_data_feed.gs:6696 + id: BQG_V2_RET3D_BLOCK_7PCT + last_calibrated: null + notes: 3일 수익률 ≥ 7% → 감점. 라인 업데이트 등록. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 7.0 +- gs_location: gas_data_feed.gs:6697 + id: BQG_V2_DISPARITY_BLOCK_10PCT + last_calibrated: null + notes: 이격도 > 10% → 감점. 과열 추격. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 10.0 +- gs_location: gas_data_feed.gs:6698 + id: BQG_V2_SURGE_RET1D_4PCT + last_calibrated: null + notes: 당일 +4% 이상 저거래량 → 감점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 4.0 +- gs_location: gas_data_feed.gs:6700 + id: BQG_V2_RSI_OVERBOUGHT_75 + last_calibrated: null + notes: RSI14 > 75 → 감점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 75.0 +- gs_location: gas_data_feed.gs:6701 + id: BQG_V2_TIMING_EXIT_50 + last_calibrated: null + notes: 타이밍 이탈점수 ≥ 50 → 감점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 50.0 +- gs_location: gas_data_feed.gs:6702 + id: BQG_V2_DISTRIBUTION_70 + last_calibrated: null + notes: 설거지 위험 점수 ≥ 70 → 감점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 70.0 +- gs_location: gas_data_feed.gs:6703 + id: BQG_V2_LATE_CHASE_70 + last_calibrated: null + notes: 뒷박 위험 점수 ≥ 70 → 감점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 70.0 +- gs_location: gas_data_feed.gs:6706 + id: BQG_V2_VOL_RET1D_2PCT + last_calibrated: null + notes: 거래량 1.5배 이상 & ret1d ≥ 2% → 가점 조건. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 2.0 +- gs_location: gas_data_feed.gs:6707 + id: BQG_V2_QUALITY_RET3D_5PCT + last_calibrated: null + notes: 3일 수익률 < 5% → 품질 돌파 가점 조건. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 5.0 +- gs_location: gas_data_feed.gs:6708 + id: BQG_V2_DISPARITY_HEALTHY_6PCT + last_calibrated: null + notes: 이격도 0~6% → 건강한 이격 가점. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 6.0 +- gs_location: gas_data_feed.gs:6709 + id: BQG_V2_RSI_HEALTHY_MIN_45 + last_calibrated: null + notes: RSI14 ≥ 45 → 건강 구간 가점 (하한). + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 45.0 +- gs_location: gas_data_feed.gs:6709 + id: BQG_V2_RSI_HEALTHY_MAX_65 + last_calibrated: null + notes: RSI14 ≤ 65 → 건강 구간 가점 (상한). + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: rsi + value: 65.0 +- gs_location: gas_data_feed.gs:6659 + id: BQG_V2_PILOT_ALLOWED_SCORE_75 + last_calibrated: null + live_sample_requirement: 30 + notes: score >= 75 → PILOT_ALLOWED. breakout lead entry 상태 임계. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 75.0 +- gs_location: gas_data_feed.gs:6660 + id: BQG_V2_WATCH_ONLY_SCORE_55 + last_calibrated: null + live_sample_requirement: 30 + notes: score >= 55 → WATCH_ONLY. breakout lead entry 대기 임계. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 55.0 +- gs_location: gas_data_feed.gs:6743 + id: AWS_V1_CONSEC_SELL_5D + last_calibrated: null + live_sample_requirement: 30 + notes: 5일 연속 매도 신호 → whipsaw 가점. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: days + value: 5.0 +- gs_location: gas_data_feed.gs:6746 + id: AWS_V1_SECTOR_RS_100 + last_calibrated: null + live_sample_requirement: 30 + notes: 섹터 RS > 100 → 섹터 초과수익 가점. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 100.0 +- gs_location: gas_data_feed.gs:6747 + id: AWS_V1_VOL_SURGE_50PCT + last_calibrated: null + live_sample_requirement: 30 + notes: 거래대금 급증 ≥ 50% → 감점. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 50.0 +- gs_location: gas_data_feed.gs:6748 + id: AWS_V1_VOL_SURGE_100PCT + last_calibrated: null + live_sample_requirement: 30 + notes: 거래대금 급증 ≥ 100% → 추가 감점. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 100.0 +- gs_location: gas_data_feed.gs:6762 + id: AWS_V1_SCORE_GATE_30 + last_calibrated: null + live_sample_requirement: 30 + notes: score ≥ 30 → WHIPSAW_CONFIRMED 발동. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 30.0 +- gs_location: gas_data_feed.gs:6763 + id: AWS_V1_CLEAR_CNT_3 + last_calibrated: null + live_sample_requirement: 30 + notes: 해제 조건 3개 → WHIPSAW_AUTO_RELEASED. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 3.0 +- gs_location: gas_data_feed.gs:6764 + id: AWS_V1_CLEAR_CNT_2 + last_calibrated: null + live_sample_requirement: 30 + notes: 해제 조건 2개 → WHIPSAW_WEAKENING (hold_1d). + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 2.0 +- gs_location: gas_data_feed.gs:6712 + id: AWS_V1_SCORE_GATE_10 + last_calibrated: null + live_sample_requirement: 30 + notes: score 10~29 → INCONCLUSIVE. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 10.0 +- gs_location: gas_data_feed.gs:6712 + id: AWS_V1_SCORE_GATE_WATCH + last_calibrated: null + live_sample_requirement: 30 + notes: score 10~39 → WATCH_COOLING_OFF. ≥40 → INCONCLUSIVE 이상. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 40.0 +- gs_location: gas_data_feed.gs:6715 + id: BQG_V2_GATE_BLOCKED_LT_10 + last_calibrated: null + notes: score < 10 → BLOCKED_LATE_CHASE. 돌파 품질 최저 임계. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 10.0 +- gs_location: gas_data_feed.gs:6715 + id: BQG_V2_GATE_WATCH_LT_40 + last_calibrated: null + notes: score 10~39 → WATCH_COOLING_OFF. ≥40 → PILOT_ALLOWED. + owner_formula: BREAKOUT_QUALITY_GATE_V2 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 40.0 +- gs_location: gas_data_feed.gs:6751 + id: AWG_V1_VOL_SURGE_100_PENALTY2 + last_calibrated: null + live_sample_requirement: 30 + notes: volSurge ≥ 100% → 추가 -20점 (vol_surge_100pct 이중 페널티). + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: pct + value: 100.0 +- gs_location: gas_data_feed.gs:6767 + id: AWG_V1_AUTO_RELEASE_CLEAR_CNT_2 + last_calibrated: null + live_sample_requirement: 30 + notes: clearCnt ≥ 2 → WHIPSAW_WEAKENING, holdDays=1. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 2.0 +- gs_location: gas_data_feed.gs:6769 + id: AWG_V1_INCONCLUSIVE_SCORE_10 + last_calibrated: null + live_sample_requirement: 30 + notes: score ≥ 10 AND < 30 → INCONCLUSIVE 게이트. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: score + value: 10.0 +- gs_location: gas_data_feed.gs:6732 + id: ANTI_WHIPSAW_GATE_V1_SCORE_WARN_55 + last_calibrated: null + notes: score >= 55 이면 anti-whipsaw 강도 기준을 통과하는 경계값. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: score + value: 55.0 +- id: NF1_FX_BETA_EXPORT + last_calibrated: null + live_sample_requirement: 30 + notes: 수출주(삼성전자·SK하이닉스) FX 민감도 가중치. usd_krw_weak 기여 20% 확대. Expert prior. + owner_formula: REGIME_CONDITIONAL_MACRO_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:FX_BETA_EXPORT + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 1.2 +- id: NF1_FX_BETA_DOMESTIC + last_calibrated: null + live_sample_requirement: 30 + notes: 내수주 FX 민감도 축소. usd_krw_weak 기여 30% 감소. Expert prior. + owner_formula: REGIME_CONDITIONAL_MACRO_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:FX_BETA_DOMESTIC + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 0.7 +- id: NF2_REBOUND_CAPTURE_WEIGHT + last_calibrated: null + live_sample_requirement: 30 + notes: 과매도 반등 4조건 충족 시 thesis 보너스 점수. Expert prior. + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py:REBOUND_CAPTURE_WEIGHT + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: thesis_points + value: 15.0 +- id: NF2_REBOUND_RSI_LOW + last_calibrated: null + live_sample_requirement: 30 + notes: 'rsi14 >= 25: 과매도 하한. Expert prior.' + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: rsi + value: 25 +- id: NF2_REBOUND_RSI_HIGH + last_calibrated: null + live_sample_requirement: 30 + notes: 'rsi14 <= 40: 과매도~회복 초입 상한. Expert prior.' + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: rsi + value: 40 +- id: NF2_REBOUND_MA20_BUFFER + last_calibrated: null + live_sample_requirement: 30 + notes: 'price <= ma20 x 1.03: MA20 3% 이내 눌림목 버퍼. Expert prior.' + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 1.03 +- id: NF2_REBOUND_FLOW_CREDIT_MIN + last_calibrated: null + live_sample_requirement: 30 + notes: 'flow_credit >= 0.5: 자금 유입 최소 기준. Expert prior.' + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio_0_1 + value: 0.5 +- id: NF2_REBOUND_DOWN_STREAK_MIN + last_calibrated: null + live_sample_requirement: 30 + notes: 'down_streak >= 2: 연속 하락 2일 이상. Expert prior.' + owner_formula: REBOUND_CAPTURE_THESIS_FACTOR_V1 + py_location: tools/build_predictive_alpha_dialectic_engine_v2.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: days + value: 2 +- id: NF3_CUT_DECILE_DEFAULT + last_calibrated: null + live_sample_requirement: 30 + notes: '하위 3분위 BUY 차단. samples >= 30 누적 후 실측 최저승률 분위로 자동 교체 예정. + + 보정 조건: proposal_evaluation_history 비-REPLAY T+5 행 30건 이상. + + ' + owner_formula: ENTRY_TIMING_DECILE_FACTOR_V1 + py_location: tools/build_late_chase_attribution_v1.py:velocity_decile_thresholds + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: decile_rank_1_10 + value: 3 +- id: NF3_MIN_SAMPLE_N + last_calibrated: null + live_sample_requirement: 30 + notes: 분위 캘리브레이션 최소 표본 수. 미달 시 WATCH_PENDING_SAMPLE. Expert prior. + owner_formula: ENTRY_TIMING_DECILE_FACTOR_V1 + py_location: tools/build_late_chase_attribution_v1.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: count + value: 30 +- id: NF4_ADV_PARTICIPATION_CAP + last_calibrated: null + live_sample_requirement: 30 + notes: 'ADV 대비 주문크기 5% 상한. 5% 초과 시 TWAP 분할 권고. + + Expert prior: 시장충격 연구 기반. + + ' + owner_formula: SELL_SLIPPAGE_BUDGET_FACTOR_V1 + py_location: tools/build_value_preservation_scorer_v1.py:adv_participation_cap + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: ratio + value: 0.05 +- id: NF5_K_APEX_SUPER + last_calibrated: null + live_sample_requirement: 30 + notes: 'APEX_SUPER(+50%): k=1.0 타이트닝. Expert prior.' + owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 + py_location: tools/build_ratchet_trailing_general_v1.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: atr_multiplier + value: 1.0 +- id: NF5_K_APEX_TRAILING + last_calibrated: null + live_sample_requirement: 30 + notes: 'APEX_TRAILING(+40~50%): k=1.5. Expert prior.' + owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 + py_location: tools/build_ratchet_trailing_general_v1.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: atr_multiplier + value: 1.5 +- id: NF5_K_PROFIT_LOCK_30 + last_calibrated: null + live_sample_requirement: 30 + notes: 'PROFIT_LOCK_20/30(+20~40%): k=2.0. Expert prior.' + owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 + py_location: tools/build_ratchet_trailing_general_v1.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: atr_multiplier + value: 2.0 +- id: NF5_K_NEUTRAL + last_calibrated: null + live_sample_requirement: 30 + notes: 'PROFIT_LOCK_10(+10~20%): k=2.5. 기본 래칫 폭. Expert prior.' + owner_formula: PROFIT_GIVEBACK_RATCHET_FACTOR_V1 + py_location: tools/build_ratchet_trailing_general_v1.py + sample_n: 0 + source: EXPERT_PRIOR + sunset_date: '2026-09-30' + unit: atr_multiplier + value: 2.5 +- gs_location: gas_data_feed.gs:3904 + id: SEMICONDUCTOR_CLUSTER_LIMIT + last_calibrated: null + notes: Semiconductor cluster limit. + owner_formula: SEMICONDUCTOR_CLUSTER_GATE + sample_n: 0 + source: SPEC_DERIVED + unit: count + value: 3.0 +- gs_location: gas_data_feed.gs:3829 + id: LEADER_POSITION_WEIGHT_CAP_V1 + last_calibrated: null + notes: Leader position weight cap. + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 50.0 +- gs_location: gas_data_feed.gs:3816 + id: LEADER_POSITION_WEIGHT_CAP_V1_TIME_BREACH_DAYS + last_calibrated: null + notes: holdDays >= 60 && excessRet < 0 → TIME_STOP. + owner_formula: LEADER_POSITION_WEIGHT_CAP_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: days + value: 60 +- gs_location: gas_data_feed.gs:6735 + id: ANTI_WHIPSAW_GATE_V1_LIMIT + last_calibrated: null + notes: Anti-whipsaw gate limit. + owner_formula: ANTI_WHIPSAW_GATE_V1 + sample_n: 0 + source: SPEC_DERIVED + unit: pct + value: 35.0 +- gs_location: gas_data_feed.gs:186 + id: SP_TAKE_PROFIT + last_calibrated: null + notes: Sell-priority score bonus awarded when take-profit condition is active. Migrated + from GAS constant to registry (P5-T01 wave1). + owner_formula: TAKE_PROFIT_LADDER_V2 + sample_n: null + source: SPEC_DERIVED + unit: score_points + value: 10 +- gs_location: gas_data_feed.gs:2164 + id: TAKE_PROFIT_BASE + last_calibrated: null + notes: Base take-profit score used in profit-lock computation. Migrated from GAS + SP constant to registry (P5-T01 wave2). + owner_formula: TAKE_PROFIT_LADDER_V2 + sample_n: null + source: SPEC_DERIVED + unit: score_points + value: 10 +- id: OVERHANG_PRESSURE_V1_FALLBACK_MULT + last_calibrated: null + notes: 'WBS-7.5(2026-06-21) — frg_20d_sh 미존재 시 selling_acceleration 폴백을 "frg_5d_sh + < -500000"(절대 주식수, 임시) 에서 "frg_5d_sh < -1.5 * avg_volume_5d" (해당 종목 평균거래량 비례) + 로 교체. 1.5 배수는 with_20d 분기에서 동일 공식이 이미 사용하는 가속 임계(frg_20d_sh/4 × 1.5)를 그대로 재사용한 + 것이며, 새로 추정한 값이 아니다. 단, 실거래 표본으로 검증되지 않았으므로 EXPERT_PRIOR로 등록한다 — CALIBRATED 승격은 + sample_n≥30 확보 후 검토. + + ' + owner_formula: OVERHANG_PRESSURE_V1 + py_location: spec/13_formula_registry.yaml:OVERHANG_PRESSURE_V1.derived_flags.selling_acceleration.without_20d_fallback + sample_n: 0 + source: EXPERT_PRIOR + unit: multiplier_of_avg_volume_5d + value: 1.5 +- id: MRS_CIRCUIT_BREAKER_ADJUSTMENT_PTS + last_calibrated: null + live_sample_requirement: 10 + notes: 'WBS-7.5(2026-06-22) — sector_crash_intraday_protocol의 tier_B 조치에서 cash_floor + market_risk_score_based_cash를 상향 조정할 때 적용하는 MRS 점수 추가. 극단 시장변동성 발생 시 현금 보수성을 강화하기 + 위한 일시적 조정 메커니즘. 기존 spec에 "MRS +2점 (임시)"로 하드코딩되어 있던 값을 정규화. 실거래 표본 부재로 EXPERT_PRIOR + 등록. CALIBRATED 승격 조건: 10건 이상 tier_B 발동 사례에서 수익률 개선 효과 측정. + + ' + owner_formula: PORTFOLIO_CIRCUIT_BREAKER_V1 + sample_n: 0 + source: EXPERT_PRIOR + spec_location: spec/risk/circuit_breakers.yaml:sector_crash_intraday_protocol.tier_B + sunset_date: '2026-12-31' + unit: mrs_score_points + value: 2 +- id: CLUSTER_CAP_CLA_REGIME_PER + last_calibrated: null + live_sample_requirement: 5 + notes: 'WBS-7.5(2026-06-22) — CLA(Concentrated Leader Advance) 레짐 발동 시 cluster(O2 + 반도체 + 관련 업체) 결합 노출 상한을 기본 25%에서 60%로 일시 상향. 극단 기업경기 시나리오에서 반도체 부문 자산 유동성 보호를 위한 + 조정. 기존 spec에 "O2 상한 임시 해제"로 명시된 값을 정규화. 실거래 표본 부재로 EXPERT_PRIOR 등록. CALIBRATED + 승격 조건: CLA 발동 5회 이상 사례에서 cluster 과다노출 시 손실 회피 효과 측정. + + ' + owner_formula: PORTFOLIO_CLUSTER_EXPOSURE_GATE_V1 + sample_n: 0 + source: EXPERT_PRIOR + spec_location: spec/risk/portfolio_exposure.yaml:regime_based_cluster_cap.cla_regime.cluster_combined_pct_max + sunset_date: '2026-12-31' + unit: pct + value: 60 +- calibration_trigger: 'EXECUTION_QUALITY_SCORE_V1 → actual_slippage(Close 기준) 추적. + 20건 이상 거래 누적 시 average_actual_slippage 계산 후 현재 5bps와 비교. 차이 > 1bps이면 실측값으로 갱신. + + ' + id: EXECUTION_SLIPPAGE_BPS + last_calibrated: null + live_sample_requirement: 20 + notes: 'WBS-7.6(2026-06-22) — 시장가 주문 기준 평균 슬리피지를 5bps로 하드코딩하던 값을 정규화. 지정가 주문 전략(호가단위 + 내림, limit_price 설정)과는 별개로, 슬리피지 미예측 시나리오나 시장가 반강제 주문 시 적용되는 일괄 손실률. 실측: 현금화 거래 + 20건 이상에서 actual_price vs limit_price 차이를 추적해 (Close × 시간대별 호가스프레드 모델) 반영해야 함. + 기존 "5bps는 이론치, 실측 보정 예정"이라는 spec 주석이 더 이상 유효하려면 이 threshold로 정규화 필수. + + ' + owner_formula: EXECUTION_SIMULATOR_V1 + sample_n: 0 + source: EXPERT_PRIOR + spec_location: spec/55_execution_simulator_contract.yaml:slippage_model.bps + sunset_date: '2026-12-31' + unit: basis_points + value: 5 diff --git a/tools/tag_spec_code_implementation.py b/tools/tag_spec_code_implementation.py new file mode 100644 index 0000000..e18e98c --- /dev/null +++ b/tools/tag_spec_code_implementation.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +""" +WBS-8.7: spec-코드 동기화 확장 (has_code_implementation 태그 자동화) +""" + +import yaml +from pathlib import Path +from typing import Dict, List + +SPEC_DIR = Path("spec") + +def get_code_reference_patterns() -> Dict[str, str]: + """각 spec 파일이 참조하는 코드 패턴""" + return { + # Formula references + "formula_registry": "src/quant_engine", + "decision_flow": "tools/build_final_execution_decision", + "routing": "tools/validate_order_grammar", + "market_regime": "spec/11_market_regime", + "field_dictionary": "spec/14_raw_workbook_mapping", + + # Performance/Data + "performance_contract": "tools/benchmark_snapshot_admin_performance", + "data_gaps": "tools/auto_fill", + "low_capability_llm": "tools/build_final_context_for_llm", + + # Gas/KIS + "gas_adapter": "tools/validate_gitea_secrets_contract", + "kis": "tools/validate_gitea_secrets_contract", + + # Storage + "release_dag": ".gitea/workflows", + + # Strategy + "anti_late_entry": "tools/validate_anti_late_entry_gate", + "pre_distribution": "tools/validate_pre_distribution_early_warning", + "smart_money": "tools/validate_smart_money_liquidity_gate", + "cash_floor": "tools/validate_cash_floor_policy", + } + +def should_have_code_reference(filename: str) -> bool: + """파일이 코드 참조를 가져야 하는지 판단""" + patterns = get_code_reference_patterns() + filename_lower = filename.lower() + + for pattern in patterns.keys(): + if pattern in filename_lower: + return True + + return False + +def tag_spec_file(file_path: Path) -> bool: + """spec 파일에 has_code_implementation 태그 추가""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = yaml.safe_load(f) + + if content is None: + content = {} + + # meta 섹션이 없으면 생성 + if 'meta' not in content: + content['meta'] = {} + + meta = content['meta'] + + # 이미 태그되어 있으면 스킵 + if 'has_code_implementation' in meta: + return None # 이미 처리됨 + + # 코드 참조 여부 판단 + has_reference = should_have_code_reference(file_path.stem) + + # 태그 추가 + if has_reference: + meta['has_code_implementation'] = True + meta['code_path'] = "tools/ or spec/ or .gitea/workflows" + else: + meta['has_code_implementation'] = False + + # 파일 저장 + with open(file_path, 'w', encoding='utf-8') as f: + yaml.dump(content, f, allow_unicode=True, default_flow_style=False) + + return has_reference + + except Exception as e: + print(f"Error processing {file_path}: {e}") + return None + +def main(): + """메인 함수""" + print("WBS-8.7: spec-코드 동기화 확장") + print("="*80) + + # 모든 spec 파일 찾기 + spec_files = sorted(SPEC_DIR.glob("*.yaml")) + + tagged_count = 0 + with_code = 0 + without_code = 0 + already_tagged = 0 + + for spec_file in spec_files: + result = tag_spec_file(spec_file) + + if result is None: + already_tagged += 1 + elif result: + with_code += 1 + tagged_count += 1 + print(f"[+] {spec_file.name}: has_code_implementation=true") + else: + without_code += 1 + tagged_count += 1 + print(f"[-] {spec_file.name}: has_code_implementation=false") + + print("\n" + "="*80) + print(f"[결과]") + print(f" 새로 태그된 파일: {tagged_count}") + print(f" 코드 참조 있음: {with_code}") + print(f" 코드 참조 없음: {without_code}") + print(f" 이미 태그됨: {already_tagged}") + print(f" 총 파일 수: {len(spec_files)}") + + coverage = ((tagged_count + already_tagged) / len(spec_files)) * 100 + print(f"\n[진행률] {coverage:.1f}% 완료") + + if coverage >= 90: + print("[OK] WBS-8.7 목표 달성 (>90%)") + else: + print(f"[진행 중] 목표까지 {90-coverage:.1f}% 남음") + +if __name__ == "__main__": + main()