meta:
  title: "은퇴자산포트폴리오 — 결정론적 실행 하네스 계약 (QEH)"
  parent_file: "RetirementAssetPortfolio.yaml"
  version: "2026-05-23-QEH-V5.0-PROPOSAL46"
  has_code_implementation: true
  code_path: "tools/validate_harness_context.py"
  purpose: >
    LLM의 자의적 해석 및 주관적 계산을 원천 배제하고, 전문사(Analyst, Trader, Quant) 수준의 
    정밀한 판단을 강제하기 위한 결정론적 하네스(Deterministic Harness)의 
    입력·출력·검증 규약을 정의한다. 특히 현금 정의(D+2 Only)에 대한 엄격한 잠금을 포함한다.

harness_contract:
  principles:
    1: "수량·가격·점수·상태머신은 오직 하네스가 산출하며 LLM은 이를 복사·보고·해설만 한다."
    2: "하네스 산출값과 LLM 출력값이 1 tick 또는 1주라도 다르면 'CRITICAL_EXECUTION_FAILURE'로 간주한다."
    3: "LLM의 '전문성'은 하네스가 포착하지 못하는 질적 맥락(뉴스, 시장 심리, 시나리오 가중)에 집중하되 하네스의 숫자 결론을 번복할 수 없다."
    4: "라우팅, 서빙, 판단, 가격, 수량, 매도우선순위, HTS 주문렌더링은 서로 분리된 단계 하네스로 잠근다."
    5: "하네스는 설명 가능한 결정론적 상태머신이어야 하며 동일 입력·동일 기준시각이면 동일 output과 동일 trace를 생성해야 한다."

  target_failure_modes:
    - "LLM이 final_action을 서사로 변경"
    - "BUY 차단 상태에서 신규 매수 주문 생성"
    - "SELL/TRIM 우선순위를 산문으로 재정렬"
    - "공식 산출가 대신 차트 가격·심리 가격으로 단가 수정"
    - "수량 재계산·역산으로 1주 이상 변경"
    - "HTS 입력 불가 다중 조건 문장 생성"
    - "blocked_actions 주문을 표에 몰래 포함"
    - "하네스 trace 없이 결론만 요약"
    # ── [2026-05-20_HARNESS_V4] 추가 실패 모드 ─────────────────────────────
    - "[HS009] tp1_price <= current_price인 TP 가격을 HTS 주문표에 그대로 기재 (INVALID_TP_STALE)"
    - "[HS010] validation_status != PASS인 WATCH/BLOCKED 행에 stop_price·tp_price·수량 기재"
    - "[HS011] spec/13_formula_registry.yaml 미등록 공식을 즉석 정의하고 원화 가격·정수 수량 산출"
    - "[M1] regime_trim_guidance_json 외 감축 비율을 LLM이 임의 제시"
    - "[C3] profit_lock_stage를 LLM이 임의 판정 (PROFIT_LOCK_STAGE_CLASSIFIER_V1 무시)"
    - "[H3] secular_leader_gate_active=true 구간에서 tp1_state=DEFERRED_SECULAR_LEADER를 무시하고 TP 매도 신호 생성"
    - "[H3] secular_leader_gate_json 없이 005930·000660에 임의 승자포지션 보호 규칙 적용"
    - "[M4] goal_achievement_pct·goal_eta_label을 LLM이 GOAL_RETIREMENT_V1 외 계산으로 재산출"
    - "[M4] goal_status=IN_PROGRESS를 근거로 heat_gate·cash_floor·stop_loss 규칙 완화"
    # ── [2026-05-20_HARNESS_V5] 추가 실패 모드 ─────────────────────────────
    - "[H6] BREAKOUT_QUALITY_GATE_V2 미실행 상태에서 신규 BUY 주문 생성 (뒷박 차단 우회)"
    - "[H6] breakout_quality_score < 10인 종목을 LLM이 BUY로 승격 (BLOCKED_LATE_CHASE 우회)"
    - "[H7] ANTI_WHIPSAW_HOLD_GATE_V1 미실행 상태에서 WHIPSAW_SUSPECTED 종목 전량 매도"
    - "[H7] anti_whipsaw_gate=WHIPSAW_SUSPECTED를 LLM이 무시하고 CONFIRMED_SELL로 재판단"
    - "[H8] smart_cash_raise_route를 LLM이 직접 선택 (ROUTE_D를 인간 승인 없이 발동)"
    - "[H8] smart_cash_raise_qty를 LLM이 재계산해 SMART_CASH_RAISE_V2 결과와 다른 수량 생성"
    # ── [2026-05-22_HARNESS_V6_3RD] 추가 실패 모드 ──────────────────────────
    - "[A1] SELL_PRICE_SANITY_V1: sell_limit_price < stop_loss_price(역전) 또는 비현실가 INVALID 행을 HTS 주문표에 기재"
    - "[A1] SELL_PRICE_SANITY_V1 INVALID 판정 가격을 LLM이 '지지선상 유효'로 복원"
    - "[A2] ANTI_CHASING_VELOCITY_V1: velocity_1d >= 3.0%인 종목에 당일 BUY 주문 생성 (BLOCK_CHASE 우회)"
    - "[A2] ANTI_CHASING_VELOCITY_V1: PULLBACK_WAIT 상태에서 pullback_entry_trigger_price 미도달 종목에 즉시 BUY 지시"
    - "[A3] CASH_RECOVERY_OPTIMIZER_V1 미산출 상태에서 LLM이 현금부족 해소 조합(종목·수량)을 즉석 계산 (HS011 위반)"
    - "[B1] PULLBACK_ENTRY_TRIGGER_V1: ABOVE_PULLBACK_ZONE 상태에서 BUY 주문 생성"
    - "[B2] INTRADAY_ACTION_MATRIX_V1: 장중(09:00~15:30) 데이터로 공격적 신규 BUY 또는 전량 매도 지시 (TRIM_ONLY 위반)"
    - "[B2] 장중 캡처 기반으로 장후 종가 기준 주간 전략 생성 (종가 미확정 HS011 위반)"
    - "[B3] DISTRIBUTION_SELL_DETECTOR_V1: weighted_sum >= 4.0(DISTRIBUTION_CONFIRMED) 상태에서 LLM이 BUY 우회 서술"
    - "[C1] SELL_WATERFALL_ENGINE_V1: Stage 건너뜀(stage1→stage3 직행) 또는 Stage 2 rebound_wait_qty 즉시 매도 전환"
    - "[C2] SELL_EXECUTION_TIMING_V1 미산출 상태에서 LLM이 매도 타이밍('오후 2시 매도') 임의 지시"
    - "[D1] DETERMINISTIC_ROUTING_ENGINE_V1: 11단계 파이프라인 순서 임의 변경 또는 단계 생략"
    - "[D1] routing_execution_log 표 생략 (INCOMPLETE_ROUTING_LOG)"
    - "[D2] LLM_SERVING_CONSTRAINT_V1: 12가지 금지행동 중 하나라도 위반 (INVALID_LLM_OVERRIDE)"
    - "[E1] PROFIT_RATCHET_TIERED_V2: profit_pct >= 50%(APEX_SUPER) 종목에 trailing_stop 미병기 및 '보유 유지' 단독 서술"
    - "[E2] SELL_VALUE_PRESERVATION_TIERED_V2: emergency_full_sell != true 상태에서 전량 즉시 청산 지시"
    - "[F1] TRADE_QUALITY_SCORER_V1: POOR/CRITICAL grade 종목에 '이번엔 괜찮다' 임의 판단"
    - "[F2] PATTERN_BLACKLIST_AUTO_V1: TRIGGERED 종목에 예외 매수 서술 또는 LLM이 블랙리스트 임의 해제 선언"
    # ── [2026-05-23_PROPOSAL46] 추가 실패 모드 ───────────────────────────────
    - "[PA1] PREDICTIVE_ALPHA_ENGINE_V1: synthesis_verdict=BEARISH인 종목에 BUY 권고 서술 (정반합 판정 우회)"
    - "[PA2] ANTI_LATE_ENTRY_GATE_V2: entry_grade=F(PATTERN_BLACKLIST+1) 종목에 신규 매수 서술"
    - "[PA3] CASH_PRESERVATION_SELL_ENGINE_V2: value_preservation_score 미산출 상태에서 즉시 전량 매도 지시"
    - "[PA4] MACRO_EVENT_SYNCHRONIZER_V1: mega_sell_alert=TRUE 상태에서 BUY/ADD_ON 신규 진입 서술"
    - "[PA5] CONSISTENCY_VALIDATOR_V2: consistency_score < 90 상태에서 분석 보고서 생성 (ABORT 우회)"

  authoritative_data_sources:
    harness_context: "JSON data._harness_context 섹션 (최우선 확정값)"
    formula_registry: "spec/13_formula_registry.yaml (산식 기준)"
    decision_flow: "spec/09_decision_flow.yaml (상태머신 기준)"
    account_snapshot: "spec/15_account_snapshot_contract.yaml (보유수량·평단·현금 기준)"

  architecture:
    stage_0_cv_preflight:
      purpose: "분석 시작 전 데이터 정합성을 CONSISTENCY_VALIDATOR_V2(12항목)로 사전 검증. consistency_score < 90 이면 ABORT."
      formula_id: "CONSISTENCY_VALIDATOR_V2"
      required_outputs:
        - "consistency_score"
        - "consistency_report_json"
        - "cv_verdict"    # PASS | ABORT
      enforcement:
        - "cv_verdict=ABORT이면 이후 모든 스테이지 실행 중단 및 사용자에게 ABORT 사유 리포트 출력"
        - "cv_verdict=PASS인 경우에만 stage_1_router 진입 허용"
      prohibition:
        - "[PA5] consistency_score < 90 상태에서 분석 계속 진행 금지"
        - "LLM이 CV 항목을 임의 면제하거나 '중요도 낮음'으로 우회 금지"
    stage_1_router:
      purpose: "요청 종류를 ANALYSIS / REVIEW / CAPTURE_PARSE / REPORT_ONLY 로 결정론적 분기"
      required_outputs:
        - "request_route"
        - "route_reason_code"
        - "bundle_selected"
        - "prompt_entrypoint"
      prohibition:
        - "LLM이 사용자의 문장을 재해석해 route를 임의 변경 금지"
    stage_2_serving:
      purpose: "필수 소스만 적재하고 JSON 우선 / XLSX 감사용 분기를 고정"
      required_outputs:
        - "source_manifest"
        - "json_validation_status"
        - "xlsx_audit_needed"
        - "capture_required"
      prohibition:
        - "JSON PASS 상태에서 XLSX 직접 파싱을 주 소스로 승격 금지"
    stage_3_portfolio_guard:
      purpose: "intraday_lock, cash_floor, total_heat, allowed/blocked_actions를 먼저 확정"
      required_outputs:
        - "intraday_lock"
        - "settlement_cash_d2_krw"
        - "buy_power_krw"
        - "cash_floor_status"
        - "total_heat_pct"
        - "heat_gate_status"
        - "allowed_actions"
        - "blocked_actions"
      rules:
        - "사용자 지침(2026-05-18): 오직 D+2 정산현금만이 현금이다. D+0(즉시현금)을 합산하는 행위를 금지한다."
        - "settlement_cash_d2_krw 는 account_snapshot.account_type='일반계좌' 행의 D+2 정산현금 필드만 원장으로 사용한다."
        - "ISA/연금저축 행의 현금성 숫자는 투자완료 계좌잔액 reference이며 포트폴리오 현금원장으로 승격 금지."
    stage_3b_macro_event_sync:
      purpose: "글로벌 거시 이벤트 위험을 MACRO_EVENT_SYNCHRONIZER_V1으로 산출. macro_risk_score >= 70이면 heat_gate_threshold 조정."
      formula_id: "MACRO_EVENT_SYNCHRONIZER_V1"
      required_outputs:
        - "macro_risk_score"
        - "macro_risk_regime"    # CALM | ELEVATED | CRITICAL
        - "heat_gate_adj"        # 조정값 (pct)
        - "mega_sell_alert"      # TRUE | FALSE
        - "macro_event_json"
      enforcement:
        - "macro_risk_regime=CRITICAL이면 heat_gate_threshold를 -10%p 하향 조정"
        - "mega_sell_alert=TRUE이면 신규 BUY/ADD_ON 즉시 차단"
        - "heat_gate_adj 값은 stage_3_portfolio_guard의 heat_gate_status 재계산에 반영"
      prohibition:
        - "[PA4] mega_sell_alert=TRUE 상태에서 BUY/ADD_ON 진입 서술 금지"
        - "LLM이 macro_risk_score를 즉석 계산·재판단 금지"
    stage_4_sell_priority:
      purpose: "복수 매도 후보의 tier/score/rank를 하네스가 확정"
      required_outputs:
        - "sell_priority_lock"
        - "sell_candidates_json"
      prohibition:
        - "LLM이 후보 순서·점수·tier를 재정렬 금지"
    stage_5_execution_math:
      purpose: "수량·단가·손절·익절·트레일링을 공식으로 산출"
      required_outputs:
        - "quantities_lock"
        - "sell_quantities_json"
        - "buy_qty_inputs_json"
        - "prices_lock"
        - "prices_json"
      prohibition:
        - "tick 재정규화 또는 임의 단가 보정 금지"
    stage_6_decision_machine:
      purpose: "state machine trace와 final_action을 확정"
      required_outputs:
        - "decision_lock"
        - "decisions_json"
        - "decision_trace_json"
      prohibition:
        - "LLM이 gate_trace 설명으로 final_action 변경 금지"
    stage_7_order_render:
      purpose: "HTS 입력용 최종 order_blueprint를 하네스가 렌더링"
      required_outputs:
        - "order_blueprint_json"
        - "render_validation_status"
        - "secular_leader_gate_json"   # [H3] 005930·000660 승자 포지션 게이트 확정값
      tp_validity_obligation:
        rule: "[HS009] prices_json의 tp1_price/tp2_price는 TP_VALIDITY_CHECK_V1 통과 후 null 또는 정규화 정수"
        required_fields_per_row:
          - "tp1_state  # PENDING | TP1_ALREADY_TRIGGERED | DEFERRED_SECULAR_LEADER | ..."
          - "tp2_state"
          - "tp1_price  # null이면 HTS 주문표 기재 금지"
          - "tp2_price"
        enforcement: "prices_lock=true이면 LLM이 tp 가격·수량 변경 불가. null 유지."
      secular_leader_gate_obligation:
        rule: "[H3] 005930·000660 행에 secular_leader_gate_active/status 필드 필수"
        enforcement: >
          secular_leader_gate_active=true 구간에서 tp1_state=DEFERRED_SECULAR_LEADER인 경우
          HTS 주문표에 TP1 매도 주문 생성 금지. 하네스가 null로 전달한 tp1_price 복원 금지.
      prohibition:
        - "LLM이 blueprint 밖의 행 추가·삭제·병합 금지"
        - "[HS009] TP_VALIDITY_CHECK_V1 미통과 가격을 HTS 주문표에 기재 금지"
        - "[H3] secular_leader_gate_json 외 주관적 승자포지션 보호 규칙 적용 금지"
    stage_8_goal_tracking:
      purpose: "5억원 목표 자산 달성률·잔여액·ETA를 GOAL_RETIREMENT_V1 공식으로 결정론적 산출"
      formula_id: "GOAL_RETIREMENT_V1"
      required_outputs:
        - "goal_asset_krw"
        - "goal_current_asset_krw"
        - "goal_achievement_pct"
        - "goal_remaining_krw"
        - "goal_eta_months"
        - "goal_eta_label"
        - "goal_status"
      llm_obligation:
        - "분석 보고서 첫 섹션에 목표 달성 현황 표 출력 (goal_achievement_pct·goal_remaining_krw·goal_eta_label)"
        - "goal_status=IN_PROGRESS이더라도 heat_gate·cash_floor·stop_loss 규칙 완화 금지"
      prohibition:
        - "[M4] LLM이 goal_achievement_pct·goal_eta_label을 재계산 금지 (HS011 적용)"
        - "[M4] '이 속도라면 N개월 후 달성' 임의 추정 금지 — GOAL_RETIREMENT_V1 ETA만 인용"
        - "[M4] 목표 달성 압박을 사유로 어떤 리스크 게이트도 완화·우회 금지"
    stage_9_alpha_lead:
      purpose: "뒷북 매수 방지를 위해 ALPHA_LEAD_SCORE_V1과 FOLLOW_THROUGH_CONFIRM_V1 결과를 확정"
      formula_ids: ["ALPHA_LEAD_SCORE_V1", "FOLLOW_THROUGH_CONFIRM_V1"]
      required_outputs_when_active:
        - "alpha_lead_lock"
        - "alpha_lead_json"
        - "follow_through_lock"
        - "follow_through_json"
      prohibition:
        - "lead_entry_state=BLOCKED_LATE_CHASE 종목을 LLM이 BUY로 승격 금지"
        - "follow_through_state=WAIT_PULLBACK 또는 FAILED_BREAKOUT을 본진입 허용으로 해석 금지"
    stage_9b_entry_freshness:
      purpose: "신호 신선도와 추격 위험을 분리해 진입 시점을 결정론적으로 분기"
      formula_ids: ["BREAKOUT_QUALITY_GATE_V2", "FOLLOW_THROUGH_CONFIRM_V1", "PRE_DISTRIBUTION_EARLY_WARNING_V1", "ALPHA_EVALUATION_WINDOW_V1"]
      required_outputs_when_active:
        - "entry_freshness_json"
      enforcement:
        - "BLOCK_LATE_CHASE이면 BUY/STAGED_BUY/ADD_ON 차단"
        - "PULLBACK_WAIT이면 본진입 금지, 재확인만 허용"
      prohibition:
        - "entry_freshness_json 없이 뒷북/추격 BUY를 승인 금지"
    stage_10_anti_distribution:
      purpose: "설거지·분산 구간에서 신규 매수와 증액을 차단"
      formula_id: "DISTRIBUTION_RISK_SCORE_V1"
      required_outputs_when_active:
        - "distribution_lock"
        - "distribution_risk_json"
      enforcement:
        - "anti_distribution_state=BLOCK_BUY 이면 BUY/STAGED_BUY/ADD_ON 차단"
        - "TRIM_REVIEW 이상은 sell_priority_engine 보조 점수에 반영"
      prohibition:
        - "가격 상승·뉴스 호재를 이유로 distribution BLOCK_BUY를 완화 금지"
    stage_11_profit_preservation:
      purpose: "수익금을 시장에 반납하지 않도록 래칫·이익잠금·트레일링 상태를 확정"
      formula_id: "PROFIT_PRESERVATION_STATE_V1"
      required_outputs_when_active:
        - "profit_preservation_lock"
        - "profit_preservation_json"
      enforcement:
        - "PROFIT_LOCK_* 상태는 PROFIT_LOCK_RATCHET_V1/TRAILING_STOP_PRICE_V1/TICK_NORMALIZER_V1 호출을 요구"
      prohibition:
        - "장기 보유 논리로 profit preservation state 해제 금지"
    stage_11b_sell_value_preservation:
      purpose: "회복 보존 매도를 분리해 현금확보와 수익보호를 동시에 관리"
      formula_ids: ["SMART_CASH_RAISE_V2", "K2_STAGED_REBOUND_SELL_V1", "RATCHET_TRAILING_AUTO_V1", "ANTI_WHIPSAW_HOLD_GATE_V1"]
      required_outputs_when_active:
        - "sell_value_preservation_json"
      enforcement:
        - "REBOUND_CONFIRM_HOLD이면 반등대기 수량을 즉시 매도 수량으로 승격 금지"
        - "EMERGENCY_EXIT는 ROUTE_D/stop_breach_gate=BREACH에서만 허용"
      prohibition:
        - "sell_value_preservation_json 없이 현금확보 매도와 수익보호 매도를 혼용 금지"
    stage_12_smart_cash_raise:
      purpose: "현금 확보 매도를 가격 훼손 최소화·반등 대기·분할 체결 방식으로 확정"
      formula_ids: ["SMART_CASH_RAISE_PLAN_V1", "REBOUND_SELL_TRIGGER_V1", "SELL_QUANTITY_ALLOCATOR_V1"]
      required_outputs_when_active:
        - "smart_cash_raise_lock"
        - "cash_raise_plan_json"
        - "rebound_sell_trigger_json"
        - "smart_sell_quantities_json"
      enforcement:
        - "OVERSOLD_REBOUND_SELL은 immediate_qty cap과 rebound_wait_qty 분리를 강제"
        - "DISTRIBUTION_EXIT은 반등 대기보다 감축 우선이나 시장가 전량 금지"
      prohibition:
        - "현금 부족을 이유로 sell_priority 순서·수량·execution_style을 LLM이 임의 변경 금지"
    stage_14_breakout_anti_whipsaw:
      purpose: "뒷박(Late Chase) 차단 및 가짜 매도(Whipsaw) 차단 게이트를 확정"
      formula_ids:
        - "BREAKOUT_QUALITY_GATE_V2"
        - "ANTI_WHIPSAW_HOLD_GATE_V1"
        - "T1_FORCED_SELL_RISK_V1"
      required_outputs_when_active:
        - "breakout_quality_gate_lock"
        - "breakout_quality_gate_json"
        - "anti_whipsaw_gate_lock"
        - "anti_whipsaw_gate_json"
        - "t1_forced_sell_risk_json"
      enforcement:
        - "breakout_quality_gate=BLOCKED_LATE_CHASE 이면 BUY/STAGED_BUY/ADD_ON 즉시 차단"
        - "anti_whipsaw_gate=WHIPSAW_SUSPECTED 이면 당일 전량 매도 차단. INCONCLUSIVE이면 50%만 허용"
        - "t1_forced_sell_risk_score >= 70 이면 BUY_BLOCKED_T1_EXIT_RISK"
      prohibition:
        - "[H6] breakout_quality_gate_json 없이 신규 BUY 주문 생성 금지"
        - "[H7] anti_whipsaw_gate_json 없이 SELL 결론 생성 금지"
        - "[H6/H7] LLM이 스코어·게이트 상태를 재계산·재판단 금지"
    stage_15_smart_cash_raise_v2:
      purpose: "5경로 결정론적 현금확보 라우팅 (SMART_CASH_RAISE_V2) 확정. ROUTE_E: 비상 아닌 일반 현금부족 폴백 경로 추가."
      formula_ids:
        - "SMART_CASH_RAISE_V2"
        - "K2_STAGED_REBOUND_SELL_V1"
        - "SELL_WATERFALL_ENGINE_V1"
      required_outputs_when_active:
        - "smart_cash_raise_route"    # ROUTE_A|B|C|D|E|NO_ACTION
        - "smart_cash_raise_qty"
        - "smart_cash_raise_json"
      enforcement:
        - "현금 부족 발생 시 SMART_CASH_RAISE_V2 경로 선택이 cash_raise_plan_json보다 우선 적용"
        - "ROUTE_D는 emergency_full_sell=true 또는 stop_breach_gate=BREACH 조건만 허용"
        - "ROUTE_B는 K2_STAGED_REBOUND_SELL_V1 수량 공식 재사용 의무"
        - "ROUTE_E는 ROUTE_A~D 조건 미해당 일반 현금부족 전용 폴백. rsi14 >= 35 AND stop_breach != BREACH 조건."
      prohibition:
        - "[H8] smart_cash_raise_route를 LLM이 임의 선택 금지"
        - "[H8] ROUTE_D를 인간 승인 없이 서사로 발동 금지"
        - "[H8] 코어 시큘러 리더에 ROUTE_C 외 경로로 전량매도 권고 금지"
        - "[H8] 일반 현금부족 상황에서 ROUTE_D를 ROUTE_E 대신 사용 금지"
    stage_13_execution_quality:
      purpose: "주문금액·거래대금·스프레드·호가단위 기준으로 체결 품질을 검증"
      formula_ids: ["EXECUTION_QUALITY_GUARD_V1", "LIMIT_PRICE_POLICY_V1"]
      required_outputs_when_active:
        - "execution_quality_lock"
        - "execution_quality_json"
        - "limit_price_policy_json"
      enforcement:
        - "execution_quality_status != PASS 이면 HTS 주문표 validation_status=PASS 금지"
        - "TICK_OK 없는 limit_price는 HTS 출력 금지"
      prohibition:
        - "불리한 방향 2회 이상 추격 정정 금지"
        - "심리적 가격·차트 지지선으로 지정가 변경 금지"

  required_harness_outputs:
    calculation_trace:
      id: "QEH_TRACE"
      required_fields:
        - "formula_id"
        - "inputs_used"
        - "result_raw"
        - "result_normalized" # Tick/Integer 정규화 후
        - "rule_id_triggered"
    gate_status:
      id: "QEH_GATE"
      required_fields:
        - "gate_id"
        - "status" # [PASS, BLOCKED, CAUTION, INSUFFICIENT]
        - "reason_code"
    execution_orders:
      id: "QEH_ORDER"
      required_fields:
        - "ticker"
        - "action"
        - "quantity"
        - "price"
        - "stop_price"
        - "tp_ladder"
        - "lock_status" # true이면 LLM 변경 절대 금지
    order_blueprint:
      id: "QEH_BLUEPRINT"
      required_fields:
        - "account"
        - "ticker"
        - "name"
        - "order_type"
        - "mode"
        - "limit_price_krw"
        - "quantity"
        - "stop_price_krw"
        - "stop_quantity"
        - "take_profit_price_krw"
        - "take_profit_quantity"
        - "validation_status"
        - "rationale_code"
    proposal_reference:
      id: "QEH_PROPOSAL"
      required_fields:
        - "account"
        - "ticker"
        - "name"
        - "proposal_type"
        - "proposed_limit_price_krw"
        - "proposed_price_basis"
        - "proposed_quantity"
        - "proposed_quantity_basis"
        - "stop1_price_krw"
        - "stop1_quantity"
        - "stop2_price_krw"
        - "stop2_quantity"
        - "stop3_price_krw"
        - "stop3_quantity"
        - "tp1_price_krw"
        - "tp1_quantity"
        - "tp2_price_krw"
        - "tp2_quantity"
        - "tp3_price_krw"
        - "tp3_quantity"
        - "execution_status"
        - "block_reason"
    routing_trace:
      id: "QEH_ROUTE"
      required_fields:
        - "request_route"
        - "bundle_selected"
        - "prompt_entrypoint"
        - "source_manifest"

  required_harness_context_keys:
    scalar_keys:
      - "harness_version"
      - "captured_at"
      - "request_route"
      - "route_reason_code"
      - "bundle_selected"
      - "prompt_entrypoint"
      - "json_validation_status"
      - "capture_required"
      - "cash_ledger_basis"
      - "intraday_lock"
      - "immediate_cash_krw"
      - "settlement_cash_d2_krw"
      - "open_order_amount_krw"
      - "buy_power_krw"
      - "cash_floor_status"
      - "total_heat_pct"
      - "heat_gate_status"
      - "sell_priority_lock"
      - "quantities_lock"
      - "prices_lock"
      - "decision_lock"
      - "blueprint_row_count"
      - "blueprint_checksum"
      - "blueprint_hash_algo"
      # ── [2026-05-20_HARNESS_V4] M4: 5억원 목표 자산 추적 (GOAL_RETIREMENT_V1) ──
      - "goal_asset_krw"           # 고정값 500,000,000
      - "goal_current_asset_krw"   # 하네스 캡처 시점 총 자산
      - "goal_achievement_pct"     # 달성률 (%)
      - "goal_remaining_krw"       # 잔여 금액 (KRW)
      - "goal_eta_months"          # 복리 ETA (개월) — null 가능
      - "goal_eta_label"           # YYYY-MM | ACHIEVED | DATA_MISSING
      - "goal_status"              # IN_PROGRESS | ACHIEVED
    collection_keys:
      - "source_manifest_json"
      - "allowed_actions"
      - "blocked_actions"
      - "sell_candidates_json"
      - "sell_quantities_json"
      - "buy_qty_inputs_json"
      - "prices_json"
      - "decisions_json"
      - "decision_trace_json"
      - "order_blueprint_json"
      - "p4_intraday_allowed_actions"
      - "regime_trim_guidance_json"       # [2026-05-20_HARNESS_V4] M1: 국면별 감축 가이던스
      - "secular_leader_gate_json"        # [2026-05-20_HARNESS_V4] H3: 주도주 승자 포지션 게이트
      - "benchmark_relative_timeseries_json" # [2026-05-21_BRT_HARNESS_V1] 시계열 상대평가
      - "index_relative_health_json"         # [2026-05-21_BRT_HARNESS_V1] 지수 상대 건강도
      - "saqg_json"                          # [2026-05-21_BRT_HARNESS_V1] 위성 알파 품질 게이트
      - "cash_creation_purpose_lock_json"    # [2026-05-21_BRT_HARNESS_V1] 현금창출 목적 잠금
      - "sapg_json"                          # [2026-05-21_BRT_HARNESS_V1] 위성 합산 손익 게이트
      - "alpha_feedback_json"                # [2026-05-21_AFL_V1] SAQG 임계값 피드백 권고
    cash_shortfall_upgrade_keys:
      status: "OPTIONAL_UNTIL_GAS_HARNESS_V5"
      activation_rule: "cash_shortfall_lock=true 또는 cash_current_pct_d2 존재 시 CASH_SHORTFALL_V1/trim plan 동기화 검증 필수."
      scalar_keys:
        - "cash_shortfall_lock"
        - "cash_current_pct_d2"
        - "cash_target_pct"
        - "cash_shortfall_min_krw"
        - "cash_shortfall_target_krw"
        - "source_manifest_checksum"
        - "decision_trace_checksum"
        - "checksum_hash_algo"
      collection_keys:
        - "trim_plan_to_min_cash_json"
    apex_upgrade_keys:
      status: "REQUIRED_FROM_GAS_HARNESS_V5"
      activation_rule: "아래 *_lock 중 하나라도 true이면 해당 json 필드와 동기화 검증이 필수다."
      scalar_keys:
        - "alpha_lead_lock"
        - "follow_through_lock"
        - "distribution_lock"
        - "profit_preservation_lock"
        - "smart_cash_raise_lock"
        - "execution_quality_lock"
        - "backdata_learning_lock"
        - "input_snapshot_checksum"
        - "rendered_output_checksum"
        # ── [2026-05-20_HARNESS_V5] 신규 게이트 잠금 키 ──────────────────
        - "breakout_quality_gate_lock"   # [H6] BREAKOUT_QUALITY_GATE_V2 확정값 잠금
        - "anti_whipsaw_gate_lock"       # [H7] ANTI_WHIPSAW_HOLD_GATE_V1 확정값 잠금
        - "smart_cash_raise_route"       # [H8] ROUTE_A/B/C/D/NO_ACTION 확정 라우트
      collection_keys:
        - "alpha_lead_json"
        - "follow_through_json"
        - "distribution_risk_json"
        - "profit_preservation_json"
        - "cash_raise_plan_json"
        - "rebound_sell_trigger_json"
        - "smart_sell_quantities_json"
        - "execution_quality_json"
        - "buy_permission_json"
        - "limit_price_policy_json"
        - "backdata_feature_bank_json"
        # ── [2026-05-20_HARNESS_V5] 신규 JSON 출력 키 ────────────────────
        - "breakout_quality_gate_json"   # [H6] 뒷박 차단 게이트 상세 (스코어·상태·차단사유)
        - "anti_whipsaw_gate_json"       # [H7] 가짜 매도 차단 게이트 상세 (스코어·홀드일수)
        - "smart_cash_raise_json"        # [H8] 4경로 현금확보 결정 상세 (경로·수량·사유)
        - "t1_forced_sell_risk_json"     # T+1 강제매도 위험 점수 상세
        - "index_relative_health_json"   # [BRT5] 지수 대비 괴리 건강도
      rules:
        - "alpha_lead_lock=true 이면 ALPHA_LEAD_SCORE_V1 결과 외 BUY 선행 판단 금지."
        - "distribution_lock=true 이고 anti_distribution_state=BLOCK_BUY이면 BUY/STAGED_BUY/ADD_ON 금지."
        - "smart_cash_raise_lock=true 이면 현금확보 매도 수량은 cash_raise_plan_json 및 smart_sell_quantities_json만 사용."
        - "execution_quality_lock=true 이면 execution_quality_json.status=PASS 행만 HTS 주문표 PASS 가능."
        - "backdata_learning_lock=true 이면 backdata_feature_bank_json 은 GAS 자동 수집 우선 원장으로만 해석하고, manual correction은 primary source로 승격 금지."
        # ── [2026-05-20_HARNESS_V5] 신규 게이트 규칙 ────────────────────
        - "[H6] breakout_quality_gate_lock=true 이면 breakout_quality_gate_json.gate=BLOCKED_LATE_CHASE 종목에 BUY/ADD_ON 절대 금지."
        - "[H7] anti_whipsaw_gate_lock=true 이면 anti_whipsaw_gate_json.gate=WHIPSAW_SUSPECTED 종목 당일 전량 매도 금지."
        - "[H8] smart_cash_raise_route가 확정된 경우 LLM이 다른 경로를 서술하거나 수량을 변경 금지."
    proposal_reference_upgrade_keys:
      status: "OPTIONAL_UNTIL_GAS_HARNESS_V6"
      activation_rule: "proposal_reference_lock=true 또는 proposal_reference_json 존재 시 사용자 판단용 제안표 동기화 검증 필수."
      scalar_keys:
        - "proposal_reference_lock"
      collection_keys:
        - "proposal_reference_json"
      rules:
        - "proposal_reference_json은 proposal_reference_sheet의 단일 source of truth다."
        - "보고서가 WATCH/BLOCKED 행 가격·수량을 복원 추론하지 않고 proposal_reference_json을 그대로 사용해야 한다."
    proposal_46_upgrade_keys:
      status: "REQUIRED_FROM_GAS_HARNESS_V5_PROPOSAL46"
      activation_rule: "아래 스칼라 키 중 하나라도 하네스 컨텍스트에 존재하면 해당 JSON 필드와 동기화 검증이 필수다."
      scalar_keys:
        # ── CV-V2 사전 검증 ───────────────────────────────────────────────
        - "consistency_score"         # 0~100. <90이면 ABORT
        - "cv_verdict"               # PASS | ABORT
        # ── MES-V1 거시 이벤트 ──────────────────────────────────────────
        - "macro_risk_score"         # 0~100
        - "macro_risk_regime"        # CALM | ELEVATED | CRITICAL
        - "mega_sell_alert"          # TRUE | FALSE
        # ── PAE-V1 정반합 예측 ─────────────────────────────────────────
        - "direction_confidence"     # -100 ~ +100 (synthesis 점수)
        - "synthesis_verdict"        # BULLISH | NEUTRAL | BEARISH
        # ── ALEG-V2 뒷박 방지 ─────────────────────────────────────────
        - "anti_late_entry_status"   # PASS | GATE1_BLOCK | GATE2_BLOCK | GATE3_BLOCK
        # ── CPSE-V2 가치보존 매도 ──────────────────────────────────────
        - "value_preservation_score" # 0~100 (100=훼손 없음)
      collection_keys:
        - "consistency_report_json"   # CV-V2 12항목 체크 결과
        - "macro_event_json"          # MES-V1 이벤트 매트릭스 + heat_gate_adj
        - "predictive_alpha_json"     # PAE-V1 thesis/antithesis/synthesis 상세
        - "anti_late_entry_json"      # ALEG-V2 3게이트 판정 상세
        - "cash_preservation_sell_json" # CPSE-V2 가치보존 매도 계획
      rules:
        - "[PA5] cv_verdict=ABORT이면 consistency_report_json 출력 의무. 이후 분석 진행 금지."
        - "[PA4] mega_sell_alert=TRUE이면 macro_event_json 출력 의무. BUY/ADD_ON 즉시 차단."
        - "[PA1] synthesis_verdict=BEARISH이면 predictive_alpha_json 출력 의무. BUY 차단."
        - "[PA2] anti_late_entry_status != PASS이면 anti_late_entry_json 출력 의무. BUY 즉시 차단."
        - "[PA3] value_preservation_score < 60이면 cash_preservation_sell_json 출력 의무. 분할 매도 우선 적용."
    rules:
      - "request_route / source_manifest_json / bundle_selected / prompt_entrypoint 은 라우팅 하네스 메타데이터로 누락되면 안 된다."
      - "[G4] LLM은 모든 분석 보고서에서 QEH_AUDIT_BLOCK 이전에 routing_serving_trace 표(request_route, bundle_selected, prompt_entrypoint, json_validation_status, capture_required, cash_ledger_basis)를 출력해야 한다. 누락 시 INCOMPLETE_REPORT 처리."
      - "[G4] json_validation_status=PENDING_EXPORT 는 GAS 내부 내보내기 전 상태 코드다. LLM이 이를 '검증 통과' 또는 '데이터 유효'로 서술하는 것을 금지한다."
      - "[G3] 외부 웹·뉴스 가격은 Section B 해설 전용. prices_json 하네스 가격과 다를 때 하네스 가격이 항상 우선하며, 외부 가격을 주문 판단·주문표·QEH_AUDIT_BLOCK에 혼입하는 것을 금지한다."
      - "[G1] cash_shortfall_min_krw / cash_shortfall_target_krw 는 CASH_SHORTFALL_V1 확정값. LLM 즉석 계산 금지."
      - "[G2] trim_plan_to_min_cash_json 은 H2 매도우선순위 기반 GAS 확정 TRIM 계획. LLM이 종목·순서·수량을 임의 변경하는 것을 금지한다."
      - "cash_ledger_basis == D2_ONLY 이어야 한다."
      - "settlement_cash_d2_krw / buy_power_krw 는 restricted_account_types=[ISA, 연금저축] 를 제외한 일반계좌 기준 D+2 정산현금 단독 집계값이어야 한다. (D+0 합산 절대 금지)"
      - "buy_power_krw == settlement_cash_d2_krw - open_order_amount_krw 이어야 한다. immediate_cash_krw 를 cash ledger 합산에 사용하면 안 된다."
      - "allowed_actions 와 blocked_actions 는 중복 원소가 없어야 한다."
      - "sell_priority_lock=true 이면 regime_adjusted_sell_priority_json.final_regime_rank 우선, 없으면 sell_candidates_json.rank 오름차순 확정 배열이어야 한다."
      - "quantities_lock=true 이면 sell_quantities_json / buy_qty_inputs_json 에서 null 외 숫자는 모두 정수여야 한다."
      - "[HS009] prices_lock=true 이면 prices_json 의 stop_price 는 TICK_NORMALIZER_V1 통과 정수여야 한다. tp1_price / tp2_price 는 TP_VALIDITY_CHECK_V1 통과 후 null 또는 정수. tp1_state / tp2_state 필드 필수. 보고서에는 종가/장중 기준을 명시해야 한다."
      - "[C3] prices_json 각 행에 profit_lock_stage / ratchet_partial_qty 필드가 있어야 한다."
      - "decision_lock=true 이면 decisions_json.final_action 과 decision_trace_json.selected_action 이 일치해야 한다."
      - "[HS010] order_blueprint_json 에서 validation_status != 'PASS'인 행의 stop_price_krw / take_profit_price_krw / take_profit_quantity 는 null 이어야 한다."
      - "[HS010-I4] WATCH/BLOCKED 행은 HTS 주문표와 물리적으로 분리된 'WATCH 감시 원장'으로만 출력. 허용 컬럼: reference_stop_price / reference_tp_state / hts_allowed(=false) / reason_code. 금지 컬럼: 지정가/손절가/익절가/주문수량/주문금액 등 HTS 주문 형식 컬럼명."
      - "[HS010-I4] reference_stop_price 는 prices_json 의 stop_price 복사값이며 HTS 주문 입력값이 아님을 표 제목과 컬럼명에 명시해야 한다."
      - "proposal_reference_lock=true 이면 proposal_reference_json은 사용자 판단용 참고 제안표의 단일 source of truth다. 보고서가 가격·수량·실행상태를 재복원하지 않고 이 JSON을 그대로 사용해야 한다."
      - "proposal_reference_json / concise_hts_input_sheet / order_quantity_4stage_gate는 우선순위 컬럼과 가격기준(종가/장중)을 함께 노출해야 한다."
      - "proposal_reference_json.execution_status 는 proposal_only | execution_wait | execution_ready 중 하나여야 한다."
      - "order_blueprint_json 은 schemas/output_schema.json.orders 와 동일한 컬럼 의미를 가진다."
      - "blueprint_row_count == len(order_blueprint_json) 이어야 한다."
      - "[M1] regime_trim_lock=true 이면 regime_trim_guidance_json 의 phase / satellite_trim_pct_min/max / leader_trim_pct_min/max 가 모두 있어야 한다."
      - "blueprint_hash_algo == CRC32_V1 이어야 한다."
      - "blueprint_checksum 은 order_blueprint_json 재계산값과 일치해야 한다."
      - "intraday_lock=true 이면 decisions_json.final_action 은 p4_intraday_allowed_actions 목록 내 값만 허용한다."
      - "[I3] source_manifest_checksum / decision_trace_checksum 은 해당 JSON 재계산값과 일치해야 한다."
      - "[I3] checksum_hash_algo == CRC32_V1 이어야 한다."
      # ── [2026-05-20_HARNESS_V5] 신규 규칙 ────────────────────────────────
      - "[H6] breakout_quality_gate_lock=true 이면 breakout_quality_gate_json 의 gate/score/version 필드가 모두 있어야 한다."
      - "[H6] BUY 주문을 생성할 때는 반드시 breakout_quality_gate_json.gate 가 PILOT_ALLOWED 이어야 한다."
      - "[H7] SELL/TRIM 주문을 생성할 때는 반드시 anti_whipsaw_gate_json.gate 가 CONFIRMED_SELL 또는 INCONCLUSIVE 이어야 한다. WHIPSAW_SUSPECTED이면 해당 매도 주문 BLOCKED."
      - "[H8] smart_cash_raise_route 가 확정되면 smart_cash_raise_json.route 와 반드시 일치해야 한다."
      - "[H8] smart_cash_raise_route=ROUTE_D 이면 emergency_full_sell=true 또는 stop_breach_gate=BREACH 조건이 smart_cash_raise_json에 명시되어야 한다."
      - "[BRT5] index_relative_health_json.relative_health_state=DECOUPLED 또는 OVER_EXTENDED 이면 BUY/STAGED_BUY/ADD_ON 금지."
      - "[BRT5] index_relative_health_json.relative_health_state=UNDERPERFORMING 이면 신규 BUY는 WATCH 우선, 매수 승격 금지."
      - "[BRT1] benchmark_relative_timeseries_json.brt_verdict=BROKEN 종목을 LLM이 HOLD/BUY로 완화 금지."
      - "[BRT2] saqg_json.saqg_v1=EXCLUDED 종목은 BUY 후보와 HTS 주문표에 포함 금지. WATCHLIST_ONLY는 WATCH만 허용."
      - "[BRT3] cash_creation_purpose_lock_json.sell_reason_validity=INVALID_SELL_REASON인 행은 현금창출 또는 위성 편입 목적 매도로 사용할 수 없다."
      - "[BRT4] sapg_json.sapg_status=SAPG_CRITICAL이면 위성 신규 BUY는 전면 차단하고 SFG 강화 상태로 보고한다."

  # ── [2026-05-20_I5] 외부 시장 데이터 격리 원칙 (G3 EXTERNAL_CONTEXT_ISOLATION) ─
  external_context_isolation:
    version: "2026-05-20_I5"
    principle: >
      외부 웹·뉴스에서 수집한 가격(KOSPI, 개별종목 현재가, 거시지표 등)은
      주문 판단의 Source of Truth가 아니다. prices_json / _harness_context 가 항상 우선한다.
    schema:
      type: "array"
      required_fields:
        source_name:  "데이터 공급자 이름 (예: Naver Finance, Bloomberg)"
        fetched_at:   "수집 시각 (ISO 8601)"
        symbol:       "식별자 (예: 005930, KOSPI)"
        value:        "수치값"
        used_for:     "CONTEXT_ONLY | VALIDATION_ONLY (주문 판단에 CONTEXT_ONLY 사용 금지)"
      optional_fields:
        as_of:        "데이터 기준 시각"
        provider:     "세부 공급자"
    rules:
      - "used_for=CONTEXT_ONLY 데이터는 Section B 해설에만 인용 가능. Section A 주문 판단 금지."
      - "외부 가격이 prices_json 하네스 가격과 다를 때 하네스 가격이 절대 우선."
      - "외부 가격을 order_blueprint_json / QEH_AUDIT_BLOCK / HTS 주문표에 혼입 금지."
      - "외부 가격 사용 시 source_name + fetched_at 을 Section B에 명시해야 한다."
    violation_action: "EXTERNAL_DATA_CONTAMINATION — Section A 주문 판단 전체 무효"

  enforcement_modes:
    STRICT_HARNESS:
      condition: "data._harness_context 존재 시"
      instruction: "하네스 숫자를 'Ground Truth'로 채택. 역산·재계산 금지. 분석 표에 [HARNESS_LOCKED] 태그 부착."
      llm_role: "Reporter/Clerk only"
      mandatory_runtime_checks:
        - "validate_harness_context.py PASS"
        - "validate_harness_sync.py PASS"
    VALIDATION_ONLY:
      condition: "하네스 부재 시"
      instruction: "LLM이 직접 계산하되, 최종 단계에서 하네스 로직(Python)을 호출해 교차 검증 필수."
      risk_label: "[HARNESS_MISSING]"

  # ── [2026-05-19_LLM_SERVICE_LAYER_V1] LLM 전문 서비스 레이어 ────────────────
  llm_expert_service_layer:
    version: "2026-05-19_LLM_SERVICE_LAYER_V1"
    principle: >
      숫자와 집행은 하네스가, 해석과 교육은 LLM이 담당한다.
      두 영역은 물리적으로 구분된 보고서 섹션(A/B/C)으로 분리하며
      LLM은 Section A의 수치 결론을 어떤 이유로도 번복하거나 완화할 수 없다.
    output_sections:
      section_A_ledger:
        label: "[Section A] 하드-하네스 원장 (The Ledger)"
        owner: "harness + LLM as Reporter/Clerk"
        contents:
          - "QEH_AUDIT_BLOCK (공식 검산 표)"
          - "capture_read_ledger (계좌 판독 원장)"
          - "data_completeness_matrix"
          - "sell_priority_decision_table (해당 시)"
          - "HTS 주문표 (지정가·수량·tick_status)"
          - "decision_trace_table"
        llm_constraint:
          - "수치·등급·행동 결론 변경 금지"
          - "형용사·서사·완화 표현 삽입 금지"
          - "[HARNESS_LOCKED] 태그 부착 의무"
      section_B_briefing:
        label: "[Section B] 전문 애널리스트 브리핑 (The Briefing)"
        owner: "LLM as Expert Analyst"
        trigger: "Section A 완성 후에만 작성 가능"
        permitted_roles:
          expert_commentary:
            purpose: "하네스 결정의 거시경제·시장 맥락 해설"
            example: >
              현금 8.95% — 하네스 판단: CASH_RAISE_REQUIRED.
              [LLM 해설] 현재 달러 강세(USD/KRW 1,380원)와 VIX 반등(20.3)은
              방어현금 10%의 근거가 되며, 글로벌 위험자산 회피 구간으로 진입 가능성이 있습니다.
          glossary_annotation:
            purpose: "영문 퀀트 용어를 한국어 금융 용어로 친절히 풀이"
            example: >
              ATR20(Average True Range 20일): 최근 20거래일 평균 일일변동폭(원).
              높을수록 변동성이 크며, 손절가 계산 시 더 넓은 폭을 허용함을 의미합니다.
          reasoning_review:
            purpose: "하네스가 내린 결정(매도 순위, 등급, TRIM)의 논리적 근거 풀이"
            example: >
              기아(삼성E&A) SELL_PRIORITY 1순위 선정 이유:
              5D 수급 연속 이탈(flow_credit 0.30), 상대약세 지속(RW 4), 섹터 모멘텀 둔화
          economic_insights:
            purpose: "VIX·장단기 금리차·환율이 MRS(시장위험점수)에 영향을 준 경로 교육적 설명"
            example: >
              MRS 6점 → 목표현금 14%: VIX 20.3(+2pt) + 원화약세 1,380원(+1pt) + KOSPI MA20 하회(+2pt)
              이 세 요인이 겹쳐 중립 구간 진입. 신규 매수는 cash_floor 회복 이후 재검토 권장.
        constraint:
          - "Section A의 수치·등급·최종행동 결론을 번복·완화하는 내용 절대 금지"
          - "'그래도 매수 고려 가능', '상황에 따라 유연하게' 등 하네스 차단을 우회하는 서술 금지"
          - "Section B 내에서 새 가격·수량·등급 숫자를 독자적으로 생성 금지"
      section_C_glossary:
        label: "[Section C] 용어 사전 및 학습 가이드 (The Glossary)"
        owner: "LLM as Educator"
        trigger: "보고서 내 주요 지표가 3개 이상 등장할 때 자동 생성"
        required_entries_when_present:
          - "MRS (Market Risk Score) — 정의 + 현재 점수 의미"
          - "flow_credit — 정의 + 임계값(0.40) 의미"
          - "ATR20 — 정의 + 손절폭 계산 연결"
          - "Total Heat — 정의 + 10%/7% 임계값 의미"
          - "CSR001 / TRIM / CASH_RAISE_AUTO — 현금 부족 해소 메커니즘 설명"
        constraint:
          - "정의는 spec/12_field_dictionary.yaml 기준으로 작성"
          - "임의 수치·예시 생성 금지 — 실제 보고서 값만 참조"

  invalidation_conditions:
    - id: "QEH001_MISSING_LOCK"
      condition: "STRICT_HARNESS 인데 *_lock key 누락"
      action: "INVALID"
    - id: "QEH002_ORDER_DRIFT"
      condition: "output.orders 와 order_blueprint_json 이 불일치"
      action: "INVALID"
    - id: "QEH003_DECISION_DRIFT"
      condition: "output final_action != decisions_json.final_action"
      action: "INVALID"
    - id: "QEH004_BLOCKED_ACTION_EMITTED"
      condition: "blocked_actions 에 있는 주문유형이 output.orders 에 존재"
      action: "INVALID"
    - id: "QEH005_UNSYNCED_TRACE"
      condition: "decision_trace 필수 state/check_id/result 누락"
      action: "INVALID"
    - id: "QEH006_FREEFORM_PRICE"
      condition: "prices_lock=true 인데 output 가격이 prices_json 과 1 tick이라도 다름"
      action: "INVALID"
    - id: "QEH007_FREEFORM_QUANTITY"
      condition: "quantities_lock=true 인데 output 수량이 sell_quantities_json 또는 buy_qty_inputs_json 과 1주라도 다름"
      action: "INVALID"
    - id: "QEH008_CASH_DEFINITION_VIOLATION"
      condition: "보고서가 D+2 외에 D+0 을 합산하여 현금 보유액을 기술 (예: 75백만 원 할루시네이션)"
      action: "INVALID"
    # ── [2026-05-20_HARNESS_V5] 신규 무효화 조건 ──────────────────────────
    - id: "QEH009_BREAKOUT_GATE_BYPASS"
      condition: "breakout_quality_gate_json 없이 신규 BUY 주문이 order_blueprint_json에 존재"
      action: "INVALID — 해당 BUY 행 전체 BLOCKED"
    - id: "QEH010_WHIPSAW_GATE_BYPASS"
      condition: "anti_whipsaw_gate_json.gate=WHIPSAW_SUSPECTED인데 해당 종목 전량 SELL 주문 존재"
      action: "INVALID — WHIPSAW_SUSPECTED 종목 SELL 전량 차단"
    - id: "QEH011_CASH_ROUTE_DRIFT"
      condition: "smart_cash_raise_route 확정값과 실제 매도 주문의 경로·수량이 불일치"
      action: "INVALID — 현금확보 매도 주문표 BLOCKED"

  implementation_priority:
    phase_1:
      scope: "가드/판단/가격/수량 락 + 하네스 동기화 검증"
      status: "즉시 필수"
    phase_2:
      scope: "order_blueprint_json 생성 + route/source manifest"
      status: "권장"
    phase_3:
      scope: "sync_hash / checksum / signed snapshot 등 감사 강화"
      status: "고도화"

  compliance_audit:
    tools:
    - "tools/validate_harness_context.py"
    - "tools/validate_harness_sync.py"
    - "tools/validate_engine_harness_gate.py"
    - "tools/run_engine_harness_gate.ps1"
    checks:
      - "blocked_actions 와 output.orders.order_type 충돌 여부"
      - "portfolio_decision.final_action == decisions_json.final_action"
      - "order_blueprint_json / orders 의 행 수, 계좌, ticker, order_type, 가격, 수량 일치 여부"
      - "risk_gate.total_heat_pct == harness total_heat_pct"
      - "risk_gate.cash_floor_status == harness cash_floor_status"
      - "decision_trace.selected_action == decisions_json.final_action"
