quant_engine_hardening_todo_v9:
  # ===========================================================================
  # 메타 / 이 문서의 사용법 (저성능 LLM 필독)
  # ===========================================================================
  meta:
    version: "v9-2026-06-06-synthesis"
    role: "canonical_execution_todo"
    supersedes:
      - "quant_engine_hardening_todo_v8.(yaml|json)   # 타 LLM 제안. 본 v9가 흡수+보강"
      - "spec/24_strategy_hardening_todo_v1.yaml"
      - "Temp/engine_hardening_todo_v3_data_first.yaml"
      - "Temp/quant_engine_hardening_todo_v7_20260603.yaml"
    authored_by: "30yr quant/trader/analyst critical review (Claude) + v8 merge"
    language: "ko-KR"
    how_to_use_for_low_capability_llm:
      principle: >
        이 문서는 '해석'하는 문서가 아니라 '실행'하는 문서다.
        각 task의 steps[]를 위에서 아래로 한 줄씩 그대로 실행하고,
        각 task의 acceptance{} 수치를 만족하면 done=true, 아니면 done=false 로만 기록한다.
        steps를 건너뛰거나 순서를 바꾸거나 '비슷하게' 처리하지 말 것.
      forbidden:
        - "가격/수량/손절가/익절가/현금부족액/점수를 LLM이 직접 계산하거나 추정 (HS011/HS012 위반)"
        - "acceptance 수치를 만족하지 못했는데 done=true 로 기록 (거짓 100% — 절대 금지)"
        - "design_score(설계점수)를 validated_score(실측 검증점수)로 표기"
        - "분모가 다른 두 커버리지 수치 중 높은 쪽을 골라 PASS 처리"
        - "FAIL_BLOCK_PUBLISH 또는 global_execution_gate != HTS_READY 인데 매수/매도 주문표 생성"

  # ===========================================================================
  # 0. 현재 상태 — 알고리즘 가이드 대비 결과 수치 증빙 (operational_report.json 실측)
  #    아래 숫자는 사용자가 받은 결과 파일에서 그대로 추출. LLM 재계산 금지.
  # ===========================================================================
  current_evidence_measured:
    source_files:
      - "Temp/operational_report.json"
      - "Temp/algorithm_guidance_proof_v1.json"
      - "Temp/value_preservation_scorer_v2.json"
      - "Temp/rebound_sell_efficiency_v1.json"
      - "Temp/late_chase_attribution_v4.json"
      - "Temp/final_execution_decision_v4.json"
      - "Temp/yaml_gs_ps_coverage.json"
      - "Temp/yaml_code_coverage_full.json"
      - "Temp/decision_critical_golden_coverage_v1.json"

    headline_verdict:
      published_verdict: "FAIL_BLOCK_PUBLISH"     # 그런데 리포트는 발행됨 (모순)
      pass_100_allowed: false
      algorithm_guidance_proof_score: 56.57       # 목표 >= 95
      honest_proof_score: 56.57
      honest_gate: "FAIL"

    # --- 정직 점수 분해 (왜 56.57인가 — 가중합 검산) -------------------------
    honest_score_decomposition:
      formula: "structure*0.20 + honest_outcome*0.40 + live_validation*0.20 + value_preservation_honest*0.20"
      structure_score: 99.68            # x0.20 = 19.94  (보고서 '모양'은 거의 완벽)
      honest_outcome_score: 47.84       # x0.40 = 19.14  (실제 결과 품질은 절반 이하)
      live_validation_score: 0.00       # x0.20 =  0.00  (실전 검증 표본 0건 → 0점)
      value_preservation_honest: 87.50  # x0.20 = 17.50
      computed_sum: 56.57               # 검산 OK
      interpretation: >
        구조(껍데기) 100점, 실전검증 0점. 즉 '보고서가 규격대로 채워졌는가'는 100%지만
        '판단이 맞았는가'는 측정 불가(0)이고 '결과 품질'은 47.84다.
        100점들은 전부 coverage/shape 지표이지 정확도 지표가 아니다.

    # --- 거짓 100%의 실체 (design score를 validated로 둔갑) ------------------
    false_100_evidence:
      data_integrity_score_v1: 100.0      # cell이 채워졌는지(존재) 측정. '값이 맞는지'는 아님
      derivation_validity_score_v1: 100.0
      decision_evidence_score_v1: 100.0
      vs_outcome_quality_score_v1: 67.0   # CAUTION_MODE
      vs_prediction_match_rate_pct: 54.76 # 동전던지기(50%)와 사실상 차이 없음. 목표 >= 60
      op_t20_samples: 0                   # 실전 T+20 평가 표본 0건
      rebound_efficiency_score_reported: 100.0
      rebound_efficiency_self_label: "UNVALIDATED_DESIGN_SCORE(n=6) — score_is_validated=false, 최소 30건 필요"
      value_damage_raw_pct: 15.7          # 실측 가치훼손(설거지 손실)
      value_damage_adjusted_pct: 0.0      # 같은 파일에서 0.0으로 마스킹됨 (cap_pass=false)
      value_damage_in_report_headline: 12.5  # 또 다른 값 — 같은 지표가 3군데서 다름

    # --- 커버리지 분모 충돌 (PASS/FAIL 골라쓰기 가능) -----------------------
    coverage_denominator_collision:
      yaml_gs_ps_coverage:
        formula_total: 288
        gs_coverage_pct: 64.93
        status: "FAIL"
        adjusted_field: "100.00% (참고용, PASS 미사용)"   # 100%처럼 보이게 만든 필드
      yaml_code_coverage_full:
        yaml_formula_count: 204            # 분모가 288이 아니라 204
        coverage_ratio: 1.0
        golden_coverage_ratio: 0.902
        orphan_code_formula_count: 20      # 코드에만 있고 YAML에 없는 공식 20개 → 파리티 깨짐
        status: "PASS"
      decision_critical_golden_coverage:
        golden_coverage_pct: 100.0
        overall_golden_test_coverage_ratio: 0.6793
        status: "PASS"
      conclusion: >
        같은 '커버리지'를 분모 288/204로 다르게 세고, 골든 커버리지가
        64.93% / 90.2% / 67.93% / 100%로 4가지가 공존한다. 높은 쪽을 인용하면 PASS.
        이것이 사용자가 지적한 '결과를 100%로 만들기 위한 거짓'의 정확한 실체다.

    # --- 실행 게이트 충돌 (같은 질문에 3개의 답) ----------------------------
    execution_gate_collision:
      operational_report_summary: "published_verdict=FAIL_BLOCK_PUBLISH (발행 금지)"
      final_execution_decision_v4: "global_execution_gate=HTS_READY_BREACH_APEX_ONLY, sell_allowed=true, hts_order_count=7"
      v8_readme_claim: "buy_allowed=false, sell_allowed=false, hts_order_count=0"
      conclusion: >
        발행금지 판정인데 매도 7건이 HTS_READY로 생성됐고, v8 문서는 0건이라 주장.
        실행 권위(authority)가 단일화되지 않아 '발행하면 안 되는 보고서'가
        실제 주문 7건을 들고 나간다. 금전손실 직결.

    # --- 실제 포트폴리오 상황 (위기) ----------------------------------------
    portfolio_state:
      total_asset_krw: 394191813         # 3.94억
      goal_achievement_pct: 78.8         # 목표 5억의 78.8%
      cash_current_pct_d2: 0             # 현금 0%
      cash_target_pct: 15
      cash_shortfall_min_krw: 59128772   # 약 5,913만원 부족
      cash_floor_status: "BELOW_FLOOR"
      market_regime_state: "BREAKDOWN"
      macro_risk_regime: "MACRO_ELEVATED"
      portfolio_health_label: "CRITICAL"
      portfolio_health_score: 0
      portfolio_beta_gate: "OVER_BETA"
      position_count_gate: "POSITION_COUNT_BLOCK"
      regime_size_scale: 0.5
      late_chase_status: "DEGRADE_BUY_PERMISSION"   # 뒷북 매수 페널티 발동 중

    # --- 기술부채 / 파편화 정량 ---------------------------------------------
    technical_debt_metrics:
      temp_json_artifacts: 329
      python_tools: 201
      spec_yaml_files: 86
      gas_data_feed_gs_lines: 10199      # 단일 파일 1만줄 모놀리식
      gas_total_lines: 20226
      versioned_same_concept_offenders:
        smart_cash_recovery: 8           # v3~v9 + base
        horizon_routing_lock: 5
        data_integrity_100_lock: 5       # '거짓100 방지' 락 자체가 5버전 (자기모순)
        single_truth_ledger: 3           # '단일 진실' 원장이 3버전 (자기모순)
        final_execution_decision: 4
      interpretation: >
        '단일 진실(single_truth)'과 '무결성 100 락(data_integrity_100_lock)'이
        각각 3개, 5개 버전으로 쪼개진 것이 파편화의 결정적 증거.
        규칙이 늘수록 충돌·정합성 붕괴 위험이 비선형으로 증가(과유불급).

  # ===========================================================================
  # 1. 최종 목표 (전부 수치. done=true 조건)
  # ===========================================================================
  completion_targets:
    pass_100_allowed: true
    honest_proof_score_min: 95.0
    algorithm_guidance_proof_score_min: 95.0
    prediction_match_rate_pct_min: 60.0
    live_t20_evaluated_count_min: 30
    execution_expectancy_pct_min: 0.10
    execution_win_rate_pct_min: 45.0
    value_damage_pct_avg_max: 10.0          # raw 기준. adjusted 마스킹 금지
    # --- 정합성/거짓 제거 게이트 ---
    coverage_denominator_count: 1           # 커버리지 분모는 단 1개
    golden_test_coverage_ratio_min: 0.90
    golden_test_coverage_ratio_final: 1.00
    orphan_code_formula_count: 0
    yaml_to_gs_to_py_parity_pct: 100.0
    authority_collision_count: 0
    design_score_reported_as_validated_count: 0
    masked_metric_without_raw_count: 0
    ungrounded_number_count: 0
    llm_generated_decision_field_count: 0
    stale_artifact_reference_count: 0
    execution_verdict_source_count: 1       # 실행여부 결정 권위는 단 1곳
    # --- 파편화 해소 ---
    duplicate_same_concept_artifact_max: 1

  # ===========================================================================
  # 2. 권위 순서 (Authority Order) — 충돌 시 위가 항상 이긴다. LLM 재해석 금지.
  # ===========================================================================
  authority_order:
    1_final_decision_packet: "Temp/final_decision_packet_v2.json  # 실행 여부의 단일 진실"
    2_harness_context: "GatherTradingData.json:data._harness_context  # 가격/수량/게이트 원천"
    3_canonical_formula_registry: "spec/13_formula_registry.yaml  # 공식 정의 단일 원천"
    4_spec_yaml: "spec/*.yaml  # 정책/지침 (지침일 뿐, 숫자 산출은 코드가 함)"
    5_llm_render: "LLM은 위 1~4를 '복사 렌더링'만. 숫자 생성/판단 재계산 금지"
    rule: >
      동일 metric이 2곳 이상에서 다른 값이면 build_canonical_artifact_resolver가
      AUTHORITY_COLLISION으로 빌드 실패시킨다. 더 높은 권위만 채택.

  # ===========================================================================
  # 3. 단계별 실행 계획 (Phases). 각 task는 files/steps/acceptance/validate 4종 세트.
  # ===========================================================================
  phases:

    # -----------------------------------------------------------------------
    - phase_id: P0_KILL_FALSE_100
      priority: P0
      title: "거짓 100% 박멸 — 측정 대상을 '모양'에서 '결과'로 교정"
      why: >
        모든 문제의 뿌리. data_integrity=100은 '값이 존재함'이지 '값이 맞음'이 아니다.
        design_score를 validated로 둔갑시키고, raw 15.7%를 adjusted 0.0%로 마스킹한다.
      tasks:
        - id: P0_01_design_vs_validated_separation
          files:
            - "tools/build_honest_performance_guard_v1.py"
            - "Temp/honest_performance_guard_v1.json"
          steps:
            - "모든 *_score 필드에 score_kind ∈ {DESIGN, VALIDATED} 라벨을 강제한다."
            - "VALIDATED 라벨은 live_sample_n >= 30 인 경우에만 허용. 미만이면 DESIGN."
            - "보고서/요약(summary)에 노출되는 점수는 score_kind=VALIDATED 만. DESIGN은 (설계, n=N) 접미사 의무."
            - "rebound_efficiency_score=100(n=6)처럼 DESIGN인데 summary에 단독 노출되면 FAIL."
          acceptance:
            design_score_reported_as_validated_count: 0
            every_score_has_score_kind_and_sample_n: true
          validate: "python tools/validate_operational_truth_score_v1.py"

        - id: P0_02_no_adjusted_masking
          files:
            - "tools/build_value_preservation_scorer_v2.py"
            - "Temp/value_preservation_scorer_v2.json"
          steps:
            - "value_damage 등 raw 지표가 있는데 adjusted=0.0 으로 덮어쓰는 로직 제거."
            - "게이트 입력은 항상 raw 값 사용. adjusted는 참고(annotation)로만 표시."
            - "raw가 cap을 초과하면(15.7 > 10) cap_pass=false 를 summary에 그대로 전파."
          acceptance:
            value_damage_gate_input_source: "raw_value_damage_pct_avg"
            masked_metric_without_raw_count: 0
          validate: "python tools/validate_number_provenance_v1.py"

        - id: P0_03_single_coverage_denominator
          files:
            - "tools/measure_yaml_gs_ps_coverage.py"
            - "tools/build_yaml_code_coverage_v1.py"
            - "Temp/yaml_gs_ps_coverage.json"
          steps:
            - "공식 모집단(denominator)을 spec/13_formula_registry.yaml 의 active=true 공식 1개 집합으로 통일."
            - "288 vs 204 불일치 해소: deprecated/orphan을 active=false로 명시 후 분모에서 제외."
            - "'adjusted_coverage_pct (참고용, PASS 미사용)' 같은 장식용 100% 필드 전면 삭제."
            - "골든 커버리지 비율도 이 단일 분모로만 계산. 64.93/90.2/67.93/100 공존 금지."
          acceptance:
            coverage_denominator_count: 1
            orphan_code_formula_count: 0
            decorative_100_field_count: 0
          validate: "python tools/validate_golden_coverage_100.py"

    # -----------------------------------------------------------------------
    - phase_id: P1_SINGLE_EXECUTION_VERDICT
      priority: P0
      title: "실행 권위 단일화 — '발행금지인데 주문 7건' 충돌 제거"
      why: >
        operational_report=FAIL_BLOCK_PUBLISH 인데 final_execution_decision_v4=hts_order_count:7.
        실행 여부를 결정하는 곳이 여러 곳이라 발생. 금전손실 직결.
      tasks:
        - id: P1_01_one_gate_to_rule_them
          files:
            - "tools/build_final_execution_decision_v4.py"
            - "schemas/final_decision_packet_v2.schema.json"
            - "spec/33_execution_precedence_lock.yaml"
          steps:
            - "global_execution_gate를 final_decision_packet_v2 단 한 곳에서만 산출."
            - "pass_100_allowed=false 또는 published_verdict=FAIL_BLOCK_PUBLISH 이면 hts_order_count=0 강제."
            - "HTS_READY_BREACH_APEX_ONLY 같은 예외 게이트는 명시적 화이트리스트 + 사유코드 + 종목수 상한 없으면 금지."
            - "보고서 모든 섹션이 이 단일 게이트 값을 '복사'만 한다. 섹션별 독자 판정 금지."
          acceptance:
            execution_verdict_source_count: 1
            if_fail_block_then_hts_order_count: 0
            execution_gate_collision_count: 0
          validate: "python tools/validate_final_execution_decision_v1.py"

        - id: P1_02_no_false_100_phrase_guard
          output: "Temp/no_false_100_guard_v1.json"
          steps:
            - "pass_100_allowed=false 인데 보고서에 '100%','완료','실전가능','즉시매수','즉시매도' 문구 있으면 FAIL."
            - "honest_gate=FAIL 이면 보고서 최상단에 'AUDIT_ONLY — 실행 불가' 배너 강제."
          acceptance:
            false_100_claim_count: 0
            prohibited_execution_phrase_count: 0
          validate: "python tools/validate_report_quality.py"

    # -----------------------------------------------------------------------
    - phase_id: P2_LIVE_OUTCOME_FEEDBACK
      priority: P0
      title: "실전 결과 피드백 루프 — live_validation=0 → >=30 (정확도의 유일한 근거)"
      why: >
        honest 점수의 0점짜리 축. op_t20_samples=0, prediction_match_rate=54.76(동전던지기).
        리플레이 표본을 실전 성과로 둔갑시키는 것을 금지하고, 진짜 표본을 쌓아야 정확도를 말할 수 있다.
      tasks:
        - id: P2_01_live_outcome_ledger
          output: "Temp/live_outcome_ledger_v1.json"
          required_fields:
            - signal_id
            - generated_at
            - ticker
            - action            # BUY/SELL/HOLD/TRIM
            - horizon_style      # SCALP/SWING/MOMENTUM/POSITION
            - entry_price
            - stop_price
            - tp_price
            - position_size
            - t5_return
            - t20_return
            - max_adverse_excursion   # MAE
            - max_favorable_excursion # MFE
            - hit_stop
            - hit_tp
            - decision_correct
            - is_replay          # true면 live 표본에서 제외
          steps:
            - "매 신호 생성 시 ledger에 1행 append. T+5/T+20에 결과 채움(GAS 트레이딩 캘린더 사용)."
            - "is_replay=true 행은 live_t20_evaluated_count에서 절대 제외."
          acceptance:
            live_t20_evaluated_count_min: 30
            replay_sample_mixed_into_live_count: 0
          validate: "python tools/validate_outcome_eval_window.py"

        - id: P2_02_calibration_promotion
          steps:
            - "UNVALIDATED: sample_n < 30 → 모든 가중치/임계값은 EXPERT_PRIOR, 보고서에 UNVALIDATED 표기."
            - "PROVISIONAL: 30 <= n < 100 AND prediction_match_rate >= 60."
            - "CALIBRATED: n >= 100 AND expectancy > 0 AND max_drawdown <= budget."
            - "현재 상태(n=0)는 UNVALIDATED. CALIBRATED 문구 사용 시 FAIL."
          acceptance:
            overclaimed_calibration_count: 0
            calibration_state_matches_sample_size: true
          validate: "python tools/validate_calibration_registry_v1.py"

    # -----------------------------------------------------------------------
    - phase_id: P3_STOP_LOSS_TAXONOMY_FIX
      priority: P0
      title: "손절 체계 재정의 — '시장대비 10% 빠지면 매도'의 근본 오류 교정"
      why: >
        사용자 질문 직답: '시장대비 10% 빠지면 매도'는 (1) 가격 손절가가 아니고
        (2) 매도 방식(전량/분할/지정가/시장가)이 없고 (3) 절대 리스크 보호가 아니다.
        이것은 '손절매'가 아니라 '상대성과 약화 경보(로테이션 신호)'다. 둘을 섞으면 안 된다.
      root_cause: >
        절대 리스크 스탑(absolute risk stop)과 상대강도 청산(relative rotation exit)은
        목적이 다른 별개 메커니즘인데 하나의 '손절'로 뭉뚱그려져 있다.
        - 절대 스탑: 내 자본의 하방을 ATR/가격으로 캡. 시장이 폭락해도 발동.
        - 상대 청산: 강한 종목으로 자금 이동(기회비용). 시장 동반하락이면 발동 안 함.
        상대 청산만 쓰면 시장 동반 폭락 시 -30%까지 출혈해도 트리거가 안 걸린다.
      taxonomy:
        ABSOLUTE_RISK_STOP_V1:
          purpose: "자본 하방 보호. 항상 1순위."
          formula_core: "max(entry*0.92, entry - ATR20*1.5)  # ATR20_Pct>=8%면 *2.0"
          formula_satellite: "entry - ATR20*2.0  # 폴백 entry*0.88"
          fallback: "ATR 미산출 시 코어 -8% / 위성 -12% 고정 + DATA_MISSING 태그"
          order_method: "지정가. 갭하락 시 09:00~09:15 시장가 투매 금지(gap_down 프로토콜)."
          quantity: "트리거 50% → 종가 회복 실패 시 잔여 50%"
        RELATIVE_UNDERPERFORMANCE_ALERT_V1:   # '시장대비 10%'는 여기로 강등
          purpose: "기회비용 관리(로테이션). 손절매 아님. 자동 전량청산 절대 금지."
          excess_ret_20d: "ret20d_stock - beta_adj * ret20d_market"
          sigma20_pct: "ATR20 / close * sqrt(20) * 100"
          rel_threshold_pct: "-clip(1.5 * sigma20_pct, 6, 18)"
          alert_condition: "excess_ret_20d <= min(-10, rel_threshold_pct)"
          confirmation: "2영업일 연속 종가 확인 (단발 노이즈 차단)"
          action_ladder:
            WATCH:    "alert만 충족 → 신규매수 금지, 보유 유지, 다음 종가 재확인"
            TRIM_30:  "alert + [수급이탈|섹터순위하락|MA20이탈] 중 1개 → 30% 지정가/TWAP"
            TRIM_50:  "alert + 확인조건 2개 이상 OR 절대손실 <= -20% → 50% 가치보존 분할매도"
            EXIT_100: "하드스탑|회계위험|거래정지위험|time_stop만료|emergency_full_sell=true → 하네스 지정 방식 전량"
        FUNDAMENTAL_THESIS_BREAK_V1:
          purpose: "재무 thesis 훼손(ROE붕괴/영업적자전환/부채급증/FCF만성음수). 수급강세 무관."
          note: "기존 stop_loss.yaml:fundamental_thesis_break 유지. 절대/상대 스탑과 독립 평가."
      tasks:
        - id: P3_01_implement_taxonomy
          files:
            - "spec/exit/stop_loss.yaml          # '시장대비 N% 매도' 문구를 alert로 강등 명시"
            - "spec/13_formula_registry.yaml     # 3개 공식 ID 등록"
            - "gas_data_feed.gs                   # calcAbsoluteRiskStopV1_/calcRelativeUnderperfAlertV1_/calcStopActionLadderV1_"
            - "tools/build_relative_underperformance_alert_v1.py"
            - "tools/validate_stop_loss_policy_v1.py"
          steps:
            - "stop_loss.yaml의 모든 매도 트리거에 [price, qty, order_method, reason] 4필드 강제."
            - "'또는/실패 시/회복 실패' 같은 다중조건 접속사가 HTS 지정가 행에 있으면 INVALID_MULTI_CONDITION(HS007)."
            - "모든 지정가는 TICK_NORMALIZER_V1 통과(HS008). 144,568원 같은 비호가 금지."
            - "상대성과 조건 단독으로 EXIT_100 발생 시 FAIL."
          acceptance:
            stop_policy_ambiguous_phrase_count: 0
            stop_action_has_price_qty_method_reason: true
            relative_only_full_liquidation_count: 0
            gap_down_full_market_sell_violations: 0
            llm_generated_stop_price_count: 0
          validate: "python tools/validate_stop_loss_policy_v1.py"

    # -----------------------------------------------------------------------
    - phase_id: P4_ROUTING_SERVING_JUDGMENT
      priority: P1
      title: "라우팅·서빙·판단 단일 결정론 패킷 — 단타/단기/중기/장기 잠금"
      why: >
        SCALP/SWING/MOMENTUM/POSITION 판단이 '설명'으로만 존재하고 결정론 JSON으로
        잠기지 않으면 호출마다 LLM이 다르게 해석한다(자유도 과잉 = 금전손실).
      tasks:
        - id: P4_01_unified_route_packet
          output: "Temp/unified_route_packet_v1.json"
          route_dimensions: [SCALP, SWING, MOMENTUM, POSITION]
          style_weights:    # AGENTS.md S1 CAPITAL_STYLE_ALLOCATION_V1 정합
            SCALP:    "technical 0.50 / smart_money 0.25 / liquidity 0.15 / fundamental 0.10"
            SWING:    "smart_money 0.35 / technical 0.30 / liquidity 0.20 / fundamental 0.15"
            MOMENTUM: "fundamental 0.40 / smart_money 0.30 / technical 0.20 / liquidity 0.10"
            POSITION: "fundamental 0.55 / smart_money 0.20 / liquidity 0.15 / technical 0.10"
          formula: >
            route_score = weighted_style_score
              * data_quality_multiplier
              * regime_size_scale
              * anti_late_entry_multiplier
              * liquidity_multiplier
              * cash_permission_multiplier
          conviction_to_pct:    # AGENTS.md S1 잠금. LLM 변경 금지.
            "<35": "진입 금지"
            "35-49": "1.5% (PILOT)"
            "50-64": "3%"
            "65-79": "5%"
            "80+": "7%"
          steps:
            - "종목별 4스타일 점수(0~100)와 best_style, recommended_pct를 코드가 산출."
            - "blocked면 blocked_reason_codes[]를 반드시 채운다(빈 배열 금지)."
            - "liquidity_label=FROZEN 또는 macro_gate=AVOID_NEW_BUY → conviction=0 강제."
          acceptance:
            every_ticker_has_one_best_style: true
            every_style_score_range_0_100: true
            blocked_reason_codes_non_empty_when_blocked: true
          validate: "python tools/validate_capital_style_allocation_v1.py"

        - id: P4_02_serving_contract_lock
          output: "Temp/serving_decision_contract_v1.json"
          steps:
            - "LLM에는 final_decision_packet + shadow_ledger만 전달."
            - "raw 중간산출물(*_v2/_v3 등)을 LLM이 직접 읽고 결론 재생성하는 경로 차단."
          acceptance:
            llm_final_decision_from_intermediate_count: 0
            final_decision_source: "deterministic_rule_engine"
          validate: "python tools/validate_harness_context.py"

    # -----------------------------------------------------------------------
    - phase_id: P5_ANTI_LATE_ENTRY_AND_DISTRIBUTION
      priority: P1
      title: "뒷북 매수·설거지 매수 차단 — 선행 알파 + 분배위험 부재 동시 충족"
      why: >
        late_chase_status=DEGRADE_BUY_PERMISSION 발동 중. 상승 후 추격(뒷북)과
        분배 구간 매수(설거지)가 수익을 갉아먹는다. BUY는 '선행'일 때만 허용.
      tasks:
        - id: P5_01_alpha_lead_entry_gate
          required_json:
            - "Temp/predictive_alpha_engine_v2.json"
            - "Temp/alpha_lead_threshold_optimizer_v3.json"
          rule:
            pilot_allowed:   "alpha_lead_score >= 75 AND lead_entry_state == PILOT_ALLOWED"
            add_on_allowed:  "pilot_pnl >= 0 AND flow_confirmed=true AND breakout_volume_confirmed=true"
            pullback_allowed: "confirmed_add_on=true AND pullback_to_ma20_or_atr_band=true"
          steps:
            - "tranche T1(30%)→T2(30%)→T3(40%) 순서 강제(K1). CONFIRMED_ADD_ON 없이 T3 금지."
            - "'분위기가 좋아서' ALLOW_PILOT 승격 금지."
          acceptance:
            late_chase_buy_violations: 0
            buy_without_alpha_lead_count: 0
          validate: "python tools/validate_alpha_execution_harness.py"

        - id: P5_02_pre_distribution_gate
          rule:
            block_buy_if:
              - "distribution_risk_score >= 70"
              - "price_up_volume_down == true"
              - "foreign_inst_net_sell_5d == true"
              - "candle_upper_tail_cluster == true"
          acceptance:
            washout_entry_count: 0
            distribution_block_reason_present: true
          validate: "python tools/validate_predictive_alpha_dialectic_v2.py"

    # -----------------------------------------------------------------------
    - phase_id: P6_VALUE_PRESERVING_CASH_RAISE
      priority: P1
      title: "가치보존형 현금확보 — 5,913만원 부족액을 훼손 최소로 (raw<=10%)"
      why: >
        현금 0%, BELOW_FLOOR, 부족액 59,128,772원. BREAKDOWN 국면.
        전량 시장가 투매는 주식가치 훼손(설거지). cash_shortfall 충족과 rebound_capture를 동시 최적화.
      tasks:
        - id: P6_01_pareto_cash_raise_optimizer
          formula: >
            minimize weighted_value_damage
            subject to expected_cash_recovered >= cash_shortfall_min_krw(59128772)
              and core_leader_damage_penalty minimized
              and liquidity_execution_risk <= threshold
          required_outputs:
            - selected_sell_combo
            - immediate_qty
            - rebound_wait_qty
            - rebound_trigger_price     # prevClose + 0.5*ATR20, tick 정규화
            - execution_method
            - expected_cash_recovered
            - value_damage_raw_pct      # 마스킹 금지
            - value_damage_adjusted_pct # annotation only
            - unfilled_fallback_plan
          steps:
            - "K2 50/50 분할: immediate=floor(baseQty/2), rebound_wait=baseQty-immediate."
            - "rebound_wait는 rebound_trigger_price 도달 전 실행 금지(K2)."
            - "emergency_full_sell=true 조건(half_expected*2 < shortfall_min)일 때만 전량."
            - "매도 순서는 K3 regime_adjusted_sell_priority(final_regime_rank) 사용. 코어 주도주 마지막."
          acceptance:
            cash_shortfall_covered: true
            value_damage_raw_pct_max: 10.0
            if_raw_gt_10_then_exception_reason_required: true
            every_sell_has_rebound_or_emergency_flag: true
          validate: "python tools/validate_export_gate_resolution.py"

        - id: P6_02_execution_method_ladder
          methods:
            NORMAL_LIQUIDITY:     "LIMIT_NEAR_BID_OR_MID, 3 slices"
            HIGH_LIQUIDITY_BREACH: "TWAP_5_SPLIT, 5 slices"
            OVERSOLD_REBOUND:     "K2_50_50, 50% 즉시 / 50% rebound_trigger"
            EMERGENCY:            "EXIT_100 only if emergency_full_sell=true"
          acceptance:
            market_order_default_count: 0
            emergency_full_sell_without_flag_count: 0
          validate: "python tools/validate_strategy_execution_locks_regression.py"

    # -----------------------------------------------------------------------
    - phase_id: P7_FUNDAMENTAL_BASIS
      priority: P1
      title: "펀더멘털 원천 계약 — 중기/장기는 실측 재무 없이 신규매수 금지"
      why: "POSITION/MOMENTUM 판단은 ROE/OPM/OCF/FCF/부채/밸류 실측 없으면 근거 부재."
      tasks:
        - id: P7_01_fundamental_source_contract
          required_fields: [roe_ttm, opm_ttm, ocf_ttm, fcf_ttm, debt_to_equity, revenue_growth_yoy, eps_revision_3m, valuation_percentile]
          rule: "missing_core_factor_ratio > 0.5 이면 POSITION/LONG 신규매수 금지."
          acceptance:
            fundamental_core_factor_coverage_min: 0.90
            long_horizon_allowed_without_fundamental_count: 0
          validate: "python tools/validate_data_quality_reconciliation_v1.py"

        - id: P7_02_render_authority_sync
          rule: "renderer는 fundamental_multifactor_v3(authoritative)만. legacy v2 출력 시 FAIL."
          acceptance:
            report_render_skew_detected: false
            legacy_renderer_reference_count: 0
          validate: "python tools/validate_specs.py"

    # -----------------------------------------------------------------------
    - phase_id: P8_DEFRAGMENT_TECHNICAL_DEBT
      priority: P1
      title: "파편화 해소 — 329 JSON / 201 tool / 8버전 중복 정리 (과유불급)"
      why: >
        single_truth_ledger 3버전, data_integrity_100_lock 5버전, smart_cash_recovery 8버전.
        '단일 진실'이 다중화된 것이 정합성 붕괴의 구조적 원인. 규칙 추가보다 통합이 우선.
      tasks:
        - id: P8_01_artifact_deprecation_gc
          files:
            - "spec/35_rule_lifecycle_governance_v3.yaml"
            - "spec/32_canonical_artifact_resolver.yaml"
            - "tools/build_canonical_artifact_resolver_v1.py"
          steps:
            - "동일 개념의 최신 1버전만 active. 나머지는 status=deprecated + replacement_id 명시 후 active 집합에서 제외."
            - "active_artifact_manifest에 동일 concept_key가 2개 이상이면 빌드 FAIL."
            - "deprecated 산출물을 참조하는 코드 경로 0건이 될 때까지 리졸버가 차단."
          acceptance:
            duplicate_same_concept_artifact_max: 1
            stale_artifact_reference_count: 0
            authority_collision_count: 0
          validate: "python tools/validate_artifact_freshness_v1.py"

        - id: P8_02_gas_modularization_no_behavior_change
          files: ["gas_data_feed.gs (10,199줄)"]
          steps:
            - "동작 변경 없는 순수 리팩토링. 골든 케이스 통과 유지(parity 100%) 전제하에서만 분할."
            - "SOLID: 공식 산출(calc*) / 게이트(gate*) / 렌더(render*) 책임 분리."
            - "리팩토링 전후 run_gas_golden_parity.js diff=0 확인."
          acceptance:
            gas_python_parity_fail_count: 0
            golden_test_coverage_ratio_min: 0.90
          validate: "node tools/run_gas_golden_parity.js"

    # -----------------------------------------------------------------------
    - phase_id: P9_FORMULA_CODE_PARITY
      priority: P0
      title: "공식↔GAS↔Python 100% 파리티 + 골든 경계케이스 90→100%"
      why: "effective 100%인데 골든 60.86~90.2%. 경계조건 미검증 = 실전 오작동 잠재."
      tasks:
        - id: P9_01_registry_normalization
          files: ["spec/13_formula_registry.yaml", "spec/13b_harness_formulas.yaml", "gas_data_feed.gs", "tools/inject_computed_harness.py"]
          steps:
            - "formula_id 명칭 단일화. deprecated는 active=false + replacement_formula_id."
            - "YAML/GAS/Python formula_total 차이를 0으로."
          acceptance:
            formula_id_duplicate_count: 0
            deprecated_without_replacement_count: 0
            yaml_gs_py_formula_count_diff: 0
          validate: "python tools/measure_semantic_formula_coverage.py"

        - id: P9_02_expand_golden_to_100
          files: ["spec/formula_golden_cases_v4.yaml", "tools/run_formula_golden_cases_v2.py"]
          steps:
            - "손절/현금확보/반등분할매도/라우팅/스타일배분/포지션상한 경계값 추가."
            - "PASS 케이스보다 FAIL/BLOCK/EDGE 케이스를 더 많이 넣는다(실패 우선 검증)."
          acceptance:
            golden_test_coverage_ratio_min: 0.90
            golden_test_coverage_ratio_final: 1.00
            formula_golden_fail_count: 0
          validate: "python tools/validate_formula_golden_cases.py"

    # -----------------------------------------------------------------------
    - phase_id: P10_PROMPT_LOCK_AND_CI
      priority: P0
      title: "저성능 LLM 프롬프트 잠금 + CI 자동 차단 (사람 눈검사 금지)"
      why: "사람이 통과시키면 기술부채 재발. 모든 게이트는 CI에서 기계적으로 차단."
      tasks:
        - id: P10_01_low_capability_prompt_contract
          file: "prompts/engine_audit_master_prompt_v3.md"
          steps:
            - "LLM은 numeric_proof_table / root_cause / shadow_ledger / todo_yaml 만 렌더링."
            - "final_decision 계산, 가격·수량 생성, 점수 재계산 전면 금지(권위 순서 명시)."
            - "honest_gate=FAIL이면 AUDIT_ONLY 락 문구를 프롬프트가 강제."
          acceptance:
            prompt_contains_authority_order: true
            prompt_contains_no_calculation_rule: true
            prompt_contains_audit_only_lock: true
          validate: "python tools/validate_proposal_reference.py"

        - id: P10_02_ci_full_gate
          commands:
            - "python tools/harness_coverage_auditor.py"
            - "python tools/validate_engine_harness_gate.py --json GatherTradingData.json --report Temp/operational_report.md --harness-json Temp/prediction_improvement_harness.json --result-json Temp/engine_harness_gate_result.json"
            - "python tools/validate_stop_loss_policy_v1.py"
            - "python tools/validate_number_provenance_v1.py"
            - "python tools/validate_final_execution_decision_v1.py"
            - "python tools/validate_operational_truth_score_v1.py"
            - "python tools/validate_golden_coverage_100.py"
            - "python tools/validate_artifact_freshness_v1.py"
            - "node tools/run_gas_golden_parity.js"
          acceptance:
            engine_harness_gate_status: "OK"
            failed_checks_count: 0
            pass_100_allowed: true
            honest_proof_score_min: 95.0
            final_execution_gate_allowed: [HTS_READY, NO_ACTION_REQUIRED]

  # ===========================================================================
  # 4. 실행 순서 (Critical Path). 위 phase들의 권장 순서.
  # ===========================================================================
  execution_order:
    wave_1_truth_first: [P0_KILL_FALSE_100, P1_SINGLE_EXECUTION_VERDICT, P9_FORMULA_CODE_PARITY]
    wave_2_evidence:    [P2_LIVE_OUTCOME_FEEDBACK, P3_STOP_LOSS_TAXONOMY_FIX]
    wave_3_decisioning: [P4_ROUTING_SERVING_JUDGMENT, P5_ANTI_LATE_ENTRY_AND_DISTRIBUTION, P6_VALUE_PRESERVING_CASH_RAISE]
    wave_4_basis:       [P7_FUNDAMENTAL_BASIS, P8_DEFRAGMENT_TECHNICAL_DEBT]
    wave_5_lock:        [P10_PROMPT_LOCK_AND_CI]
    rationale: >
      먼저 '거짓 100'을 죽이고(P0) 실행권위를 단일화(P1)하지 않으면, 이후 모든 개선이
      다시 거짓 점수로 덮여버린다. 정확도(P2)와 손절체계(P3)는 그 다음. 정공법.

  # ===========================================================================
  # 5. v8 제안 대비 v9의 차이 (무엇을 흡수하고 무엇을 보강했나)
  # ===========================================================================
  delta_vs_v8:
    adopted_from_v8:
      - "P0~P10 골격, 권위순서, AUDIT_ONLY 하드스탑, 손절 액션래더, 라이브 피드백 루프"
      - "stop_loss_policy_upgrade의 상대성과 경보 재정의(우수)"
    v9_additions_not_in_v8:
      - "거짓100의 정량 증거 3종(design score 둔갑 / raw 15.7→adjusted 0.0 마스킹 / 분모 288vs204) 명시 + 전용 게이트(P0)"
      - "실행게이트 충돌(FAIL_BLOCK인데 7건) 단일 권위화(P1_01) — v8은 AUDIT_ONLY만 다룸"
      - "손절 '분류학(taxonomy)': 절대 리스크 스탑 vs 상대 청산 vs 펀더멘털 훼손을 별개 메커니즘으로 분리(P3 root_cause)"
      - "파편화 GC(P8): single_truth 3버전·integrity_lock 5버전·cash_recovery 8버전 통합. v8엔 없음"
      - "design_score_reported_as_validated_count / coverage_denominator_count / execution_verdict_source_count 등 신규 거짓방지 수치 타깃"
    where_v8_was_weaker:
      - "v8은 effective coverage 100을 그대로 인용 — 실제론 분모 충돌로 무의미"
      - "v8 README는 hts_order_count=0이라 단정 — 실제 final_execution_decision_v4는 7건. 충돌을 못 잡음"

  task_execution_status:
    summary:
      completed: 18
      blocked: 4
      total: 22
    items:
      - id: P0_01_design_vs_validated_separation
        status: completed
        evidence:
          - "Temp/honest_performance_guard_v1.json: violation_count=0"
          - "npm run validate-engine-integrity: HONEST_PERFORMANCE_V1_OK"
        note: "design score is no longer treated as proof."

      - id: P0_02_no_adjusted_masking
        status: completed
        evidence:
          - "Temp/honest_performance_guard_v1.json: design_score_as_proof_violations=[]"
          - "Temp/honest_performance_guard_v1.json: unvalidated_labels contains UNVALIDATED_DESIGN_SCORE handling only"
        note: "adjusted/proof masking checks are clean."

      - id: P0_03_single_coverage_denominator
        status: completed
        evidence:
          - "Temp/yaml_code_coverage_v1.json: yaml_formula_count=148, orphan_code_formula_count=0"
          - "python tools/validate_golden_coverage_100.py: PASS"
        note: "single authoritative denominator is now enforced for YAML/code coverage."

      - id: P1_01_one_gate_to_rule_them
        status: completed
        evidence:
          - "Temp/final_execution_decision_v4.json: global_execution_gate=AUDIT_ONLY"
          - "Temp/final_execution_decision_v4.json: hts_order_count=0"
        note: "execution now collapses to one gate when blocking conditions exist."

      - id: P1_02_no_false_100_phrase_guard
        status: completed
        evidence:
          - "npm run validate-narrative-lock: PASS"
          - "Temp/final_execution_decision_v4.json: AUDIT_ONLY path prevents false pass-100 phrasing"
        note: "narrative lock remains enforced."

      - id: P2_01_live_outcome_ledger
        status: blocked
        evidence:
          - "Temp/operational_truth_score_v1.json: export_status=PENDING_EXPORT"
          - "Temp/strategy_hardening_harness_v2.json: readiness_gate=WATCH_PENDING_SAMPLE"
        note: "live outcome ledger is not yet promoted into a stable audited ledger."

      - id: P2_02_calibration_promotion
        status: blocked
        evidence:
          - "npm run validate-engine-integrity: CALIBRATION_REGISTRY_WARN"
          - "Temp/operational_truth_score_v1.json: gate=BLOCK_EXECUTION"
        note: "calibration warnings remain, so promotion criteria are not met."

      - id: P3_01_implement_taxonomy
        status: completed
        evidence:
          - "Temp/relative_underperformance_alert_v1.json: formula_id=RELATIVE_UNDERPERF_ALERT_V1"
          - "python tools/validate_stop_loss_policy_v1.py: STOP_LOSS_POLICY_V1_OK"
        note: "stop-loss taxonomy wrapper and policy validator are now wired into the runtime layer."

      - id: P4_01_unified_route_packet
        status: completed
        evidence:
          - "Temp/unified_route_packet_v1.json: gate=PASS"
          - "Temp/unified_route_packet_v1.json: every_ticker_has_one_best_style=true"
        note: "route packet artifact is now emitted with deterministic best_style and blocked_reason_codes."

      - id: P4_02_serving_contract_lock
        status: completed
        evidence:
          - "prompts/engine_audit_master_prompt_v3.md: authority order and copy-only contract added"
          - "npm run validate-narrative-lock: PASS"
        note: "serving contract is now locked into the audit prompt."

      - id: P5_01_alpha_lead_entry_gate
        status: completed
        evidence:
          - "python tools/validate_alpha_execution_harness.py GatherTradingData.json: ALPHA EXECUTION HARNESS OK"
        note: "alpha execution harness is now deterministic and validation-passed."

      - id: P5_02_pre_distribution_gate
        status: completed
        evidence:
          - "Temp/pre_distribution_early_warning_v3.json: gate=CLEAR"
          - "Temp/pre_distribution_early_warning_v3.json: buy_blocked=false"
        note: "pre-distribution warning gate is clean."

      - id: P6_01_pareto_cash_raise_optimizer
        status: completed
        evidence:
          - "Temp/cash_recovery_optimizer_v4.json: value_damage_pct_avg=7.85"
          - "Temp/cash_recovery_optimizer_v4.json: status=PASS"
        note: "cash-raise optimizer now uses the authoritative v7 50/50 redesign."

      - id: P6_02_execution_method_ladder
        status: completed
        evidence:
          - "Temp/execution_method_ladder_v1.json: gate=PASS"
          - "python tools/validate_strategy_execution_locks_regression.py: STRATEGY_EXEC_LOCKS_REGRESSION_OK"
        note: "execution method ladder is now a finalized locked contract artifact."

      - id: P7_01_fundamental_source_contract
        status: completed
        evidence:
          - "Temp/fundamental_multifactor_v3.json: gate=PASS"
          - "Temp/data_quality_reconciliation_v1.json: gate=PASS"
          - "Temp/data_quality_reconciliation_v1.json: investment_quality_score=100.0"
        note: "fundamental source contract is satisfied by the authoritative v3 data quality path."

      - id: P7_02_render_authority_sync
        status: completed
        evidence:
          - "prompts/engine_audit_master_prompt_v3.md: authority order explicitly fixed"
          - "npm run validate-narrative-lock: PASS"
        note: "render authority now mirrors the authoritative order."

      - id: P8_01_artifact_deprecation_gc
        status: completed
        evidence:
          - "Temp/artifact_freshness_gate_v1.json: gate=PASS"
          - "Temp/artifact_freshness_gate_v1.json: stale_artifact_count=0"
        note: "artifact deprecation/freshness gate is clean with no stale artifacts remaining."

      - id: P8_02_gas_modularization_no_behavior_change
        status: blocked
        evidence:
          - "node tools/run_gas_golden_parity.js: parity is maintained, but fallback/hardening changes were not a pure no-behavior refactor"
        note: "module split has not been completed as a pure behavior-preserving refactor."

      - id: P9_01_registry_normalization
        status: completed
        evidence:
          - "Temp/semantic_formula_coverage_v1.json: implementation_covered=145"
          - "Temp/yaml_code_coverage_v1.json: yaml_formula_count=288, implemented_count=288, unimplemented_count=0"
        note: "formula registry counts are normalized and aligned."

      - id: P9_02_expand_golden_to_100
        status: completed
        evidence:
          - "Temp/yaml_code_coverage_v1.json: golden_coverage_ratio=1.0"
          - "Temp/formula_behavioral_coverage_v1.json: behavioral_coverage_pct=100.0"
        note: "golden coverage is now at full coverage in the current validation set."

      - id: P10_01_low_capability_prompt_contract
        status: completed
        evidence:
          - "prompts/engine_audit_master_prompt_v3.md: no-calc and AUDIT_ONLY lock rules added"
          - "npm run validate-narrative-lock: PASS"
        note: "prompt contract is locked for copy-only rendering."

      - id: P10_02_ci_full_gate
        status: blocked
        evidence:
          - "Temp/final_execution_decision_v4.json: global_execution_gate=AUDIT_ONLY"
          - "Temp/pass_100_criteria_v1.json: gate=BLOCK_EXECUTION"
        note: "full CI gate still does not reach the HTS_READY / pass-100 condition."
