meta:
  title: "은퇴자산포트폴리오 - 하네스 V8 공식 레지스트리 (13b)"
  parent_file: "spec/13_formula_registry.yaml"
  version: "2026-05-25_HARNESS_V8_PROPOSAL51_P1"
  purpose: >
    GAS buildHarnessContext_ 단계에서 결정론적으로 산출되는 하네스 전용 공식.
    LLM이 직접 계산하거나 재판단해서는 안 되는 고착화 결과들이다.
    13_formula_registry.yaml 파일 크기 초과로 분리 관리.

formula_registry:
  formulas:

    # == [2026-05-20_HARNESS_V4] HS009 - TP 가격 유효성 검증 ==================
    TP_VALIDITY_CHECK_V1:
      purpose: >
        TAKE_PROFIT_LADDER_V2가 산출한 TP 가격이 현재가보다 낮은지 검증.
        현재가 >= TP 이면 해당 티어는 이미 통과된 것으로 판정하고 null을 반환.
        prices_lock=true가 무효 가격을 고착화하는 역설을 GAS 단계에서 차단.
      inputs:
        - {field: "tp_price", unit: "KRW_per_share"}
        - {field: "current_price", unit: "KRW_per_share"}
      expression: "tp_price > current_price ? tp_price : null"
      output:
        field: "tp_validated_price"
        unit: "KRW_per_share_or_null"
      state_output:
        field: "tp_state"
        values:
          PENDING:               "tp_price > current_price - 아직 도달하지 않음"
          TP1_ALREADY_TRIGGERED: "tp1_price <= current_price - 이미 통과"
          TP2_ALREADY_TRIGGERED: "tp2_price <= current_price - 이미 통과"
          UNKNOWN_NO_CLOSE:      "current_price 미확인 - 검증 불가"
      prohibition:
        - "LLM이 tp_price=null인 경우 대체 TP 가격을 임의 산출하는 것 절대 금지"
        - "INVALID_TP_STALE 상태에서 HTS 주문표에 가격 기재 금지"
      canonical_ref: "AGENTS.md:Direction H9 (HS009)"
      version: "2026-05-20_HARNESS_V4"

    # == [2026-05-20_HARNESS_V4] C3 - 수익구간 단계 분류 ======================
    PROFIT_LOCK_STAGE_CLASSIFIER_V1:
      purpose: >
        보유 포지션의 현재 수익률 구간을 분류하여 profit_lock_stage를 결정론적으로 산출.
        LLM이 "이미 +51%니까 profit_lock 단계"를 임의 판단하는 것을 하네스에서 선점.
        spec/exit/take_profit.yaml:profit_lock_ratchet.ratchet_table 완전 구현.
      inputs:
        - {field: "average_cost",   unit: "KRW_per_share"}
        - {field: "current_price",  unit: "KRW_per_share"}
        - {field: "atr20",          unit: "KRW_per_share", optional: true}
        - {field: "quantity",       unit: "shares"}
        - {field: "highest_close",  unit: "KRW_per_share", optional: true,
           note: "APEX_SUPER trailing_stop 산출용. 미제공 시 current_price 대체."}
      derived_fields:
        profit_pct: "(current_price - average_cost) / average_cost * 100"
      rules:
        - if: "profit_pct >= 50"
          profit_lock_stage:    "APEX_SUPER"
          ratchet_stop:         "max(average_cost * 1.35, highest_close_or_current - atr20 * 1.5)"
          trailing_stop:        "max(average_cost * 1.35, highest_close_or_current - atr20 * 1.5)"
          ratchet_partial_qty:  "floor(quantity * 0.10)"
          tp_ladder_action:     "강제 10% 익절 권고"
          apex_super_alert:     "REQUIRED"
          llm_obligation:       "APEX_SUPER_ALERT 필수 출력. trailing_stop 병기 의무. '보유 유지' 단독 서술 절대 금지."
        - if: "profit_pct >= 30"
          profit_lock_stage:    "PROFIT_LOCK_STAGE_30"
          ratchet_stop:         "average_cost * 1.20"
          ratchet_partial_qty:  "floor(quantity * 0.35)"
        - if: "profit_pct >= 20"
          profit_lock_stage:    "PROFIT_LOCK_STAGE_20"
          ratchet_stop:         "average_cost * 1.10"
          ratchet_partial_qty:  "floor(quantity * 0.25)"
        - if: "profit_pct >= 10"
          profit_lock_stage:    "PROFIT_LOCK_STAGE_10"
          ratchet_stop:         "average_cost * 1.00"
          ratchet_partial_qty:  0
        - if: "profit_pct < 10"
          profit_lock_stage:    "NORMAL"
          ratchet_stop:         "STOP_PRICE_CORE_V1 result"
          ratchet_partial_qty:  0
      output:
        fields: ["profit_lock_stage", "ratchet_stop_price", "ratchet_partial_qty"]
      prohibition:
        - "LLM이 profit_lock_stage를 임의 판정 금지 - 하네스 산출값 그대로 사용"
        - "profit_lock_stage=APEX_SUPER인 종목에 TP 가격 출력 금지"
        - "APEX_SUPER 구간에서 trailing_stop 미병기 후 '보유 유지'만 서술 금지 (E1 재발 방지)"
      canonical_ref: "spec/exit/take_profit.yaml:take_profit.profit_lock_ratchet.ratchet_table"
      version: "2026-05-20_HARNESS_V4"

    # == [2026-05-20_HARNESS_V4] M1 - 국면별 감축 비율 산출 ===================
    REGIME_TRIM_WEIGHT_V1:
      purpose: >
        시장 국면(market_regime_state) 기반으로 위성·주도주의 감축 비율 범위를 결정론적 산출.
        LLM이 "조정기엔 5~10%" 같은 주관적 감축 비율을 제시하는 것을 하네스에서 선점.
        국면이 같으면 동일 입력에서 항상 동일 trim_pct_range가 나와야 함.
      inputs:
        - {field: "market_regime_state", unit: "enum"}
      rules:
        ADVANCE:
          applicable_regimes: ["RISK_ON", "SECULAR_LEADER_RISK_ON"]
          satellite_trim_pct_range: [0, 5]
          leader_trim_pct_range:    [0, 0]
          priority_order: "HOLD_ALL > 약한위성_5%이하 > 중복ETF"
          new_buy_gate: "ALLOWED_IF_HEAT_PASS"
        PULLBACK_IN_UPTREND:
          applicable_regimes: ["LEADER_CONCENTRATION", "NEUTRAL"]
          satellite_trim_pct_range: [5, 10]
          leader_trim_pct_range:    [0, 5]
          priority_order: "약한위성 > 중복ETF > 주도주소량헤지"
          new_buy_gate: "BLOCKED"
        DISTRIBUTION:
          applicable_regimes: ["RISK_OFF_CANDIDATE"]
          satellite_trim_pct_range: [10, 25]
          leader_trim_pct_range:    [5, 10]
          priority_order: "중복ETF > 약한위성 > 주도주이익잠금"
          new_buy_gate: "BLOCKED"
        BREAKDOWN:
          applicable_regimes: ["RISK_OFF", "EVENT_SHOCK"]
          satellite_trim_pct_range: [25, 50]
          leader_trim_pct_range:    [10, 25]
          priority_order: "코어보호해제 > 전종목감축검토"
          new_buy_gate: "HARD_BLOCKED"
      output:
        fields: ["phase", "satellite_trim_pct_min", "satellite_trim_pct_max",
                 "leader_trim_pct_min", "leader_trim_pct_max", "priority_order", "new_buy_gate"]
      missing_policy:
        market_regime_state: "UNKNOWN phase. satellite/leader trim = 0. new_buy_gate = BLOCKED."
      prohibition:
        - "LLM이 regime_trim_guidance_json 외의 감축 비율을 임의 제시 금지"
        - "regime_trim_lock=true이면 LLM의 국면 재판정 금지"
      canonical_ref: "AGENTS.md:Direction M1 (REGIME_TRIM_LOCK)"
      version: "2026-05-20_HARNESS_V4"

    # == [2026-05-20_HARNESS_V4] H3 - 주도주 승자 포지션 보호 게이트 =========
    SECULAR_LEADER_REGIME_GATE_V1:
      purpose: >
        삼성전자(005930)·SK하이닉스(000660)의 secular_leader_profit_lock 발동 조건을
        결정론적으로 판정. LLM이 "수급이 좋으니까 secular_leader 규칙 적용"이라고
        임의 판단하는 것을 하네스에서 선점.
        spec/exit/take_profit.yaml:secular_leader_profit_lock.activation_required_all 완전 구현.
      applicable_to: ["005930", "000660"]
      inputs:
        - {field: "ticker",               unit: "string"}
        - {field: "market_regime_state",  unit: "enum"}
        - {field: "quantity",             unit: "shares",  note: "holding_quantity from account_snapshot"}
        - {field: "close_price",          unit: "KRW_per_share"}
        - {field: "ma20",                 unit: "KRW_per_share"}
        - {field: "flow_ok",              unit: "enum",    note: "Y/N"}
        - {field: "frg_5d_krw",           unit: "KRW",    optional: true, note: "외국인 5D 순매수금액"}
        - {field: "inst_5d_krw",          unit: "KRW",    optional: true, note: "기관 5D 순매수금액"}
        - {field: "atr20",                unit: "KRW_per_share", optional: true}
      activation_required_all:
        - "ticker IN [005930, 000660]"
        - "market_regime_state == SECULAR_LEADER_RISK_ON"
        - "holding_quantity > 0 (account_snapshot CAPTURE_READ_OK)"
        - "close_price > ma20"
        - "flow_ok == Y AND (frg_5d > 0 OR inst_5d > 0)"
      deactivation_any:
        - "anti_climax_gate_total >= 3"
        - "frg_5d < 0 AND inst_5d < 0 (5D 동반 순매도)"
        - "close_price <= ma20"
        - "market_regime_state != SECULAR_LEADER_RISK_ON"
      output:
        fields: ["secular_leader_gate_active", "secular_leader_gate_status", "secular_leader_gate_reasons"]
        status_values:
          ACTIVE:           "모든 활성화 조건 충족. secular_leader_profit_lock 규칙 적용."
          DEACTIVATED:      "비활성화 조건 1개 이상 발동. take_profit.core.leadership 규칙으로 복귀."
          ACTIVATION_FAIL:  "활성화 조건 미충족 (데이터 부재 포함)."
          NOT_APPLICABLE:   "대상 종목 아님 (005930·000660 외)."
      tp1_adjustment_by_stage:
        PROFIT_LOCK_STAGE_10:
          action: "tp1_state=DEFERRED_SECULAR_LEADER, tp1_price=null"
          rationale: "수급 훼손 없는 한 +10% 매도 금지. 본절 상향만."
        PROFIT_LOCK_STAGE_20:
          action: "과열신호 < 2이면 tp1_state=DEFERRED_SECULAR_LEADER_OVERHEAT_PENDING"
          rationale: "과열 2개 미만 시 부분익절 보류."
        PROFIT_LOCK_STAGE_30:
          action: "tp1_state=TRAILING_STOP_PRIORITY_SECULAR_LEADER (tp1 참고용 유지)"
          rationale: "trailing_stop 기반 관리 전환. 30~40% 단계 익절."
        APEX_SUPER:
          action: "tp1_state=TRAILING_STOP_PRIORITY_SECULAR_LEADER"
          rationale: "래칫 stop 관리 우선. 전량익절 금지. trailing_stop 필수 병기."
      prohibition:
        - "secular_leader_gate_active=true 구간에서 LLM이 임의로 tp1 매도 신호 생성 금지"
        - "하네스가 null로 전달한 tp1_price를 LLM이 복원하는 행위 절대 금지"
        - "NOT_APPLICABLE 종목에 이 규칙 적용 금지"
      canonical_ref: "spec/exit/take_profit.yaml:secular_leader_profit_lock"
      version: "2026-05-20_HARNESS_V4"

    # == [2026-05-20_HARNESS_V4] M4 - 5억원 은퇴자산 목표 추적 ================
    GOAL_RETIREMENT_V1:
      purpose: >
        은퇴자산 5억원 목표 대비 현재 자산의 달성률·잔여액·복리 ETA를 결정론적으로 산출.
        LLM이 "이 추세면 언제 달성 가능하다"고 임의 추정하는 것을 하네스에서 선점.
        net_expectancy_30(30일 순기대 수익률%)을 복리 기준으로 사용.
      inputs:
        - {field: "total_asset_krw", unit: "KRW", note: "buildHarnessContext_ 집계값"}
        - {field: "net_expectancy_30", unit: "percent", optional: true,
           note: "Bayesian 성과 계산기 출력. 없으면 ETA=DATA_MISSING."}
      constants:
        GOAL_KRW: 500000000
      derived_fields:
        goal_achievement_pct: "total_asset_krw / GOAL_KRW * 100"
        goal_remaining_krw:   "max(0, GOAL_KRW - total_asset_krw)"
        goal_eta_months:      "ceil(ln(GOAL_KRW / total_asset_krw) / ln(1 + net_expectancy_30 / 100))"
      expression:
        achievement_pct: "round(total_asset_krw / GOAL_KRW * 1000) / 10"
        eta_months: "net_expectancy_30 > 0 ? ceil(ln(GOAL_KRW/asset) / ln(1 + r)) : null"
        eta_label: "ACHIEVED | YYYY-MM | DATA_MISSING"
        status: "total_asset_krw >= GOAL_KRW ? ACHIEVED : IN_PROGRESS"
      output:
        fields:
          - {field: "goal_asset_krw",          unit: "KRW",     value: 500000000}
          - {field: "goal_current_asset_krw",  unit: "KRW"}
          - {field: "goal_achievement_pct",    unit: "percent"}
          - {field: "goal_remaining_krw",      unit: "KRW"}
          - {field: "goal_eta_months",         unit: "months_or_null"}
          - {field: "goal_eta_label",          unit: "string"}
          - {field: "goal_monthly_growth_pct", unit: "percent_or_null"}
          - {field: "goal_status",             unit: "enum"}
      missing_policy:
        net_expectancy_30: "goal_eta_months=null, goal_eta_label=DATA_MISSING"
        total_asset_krw_zero: "goal_achievement_pct=0, goal_remaining_krw=GOAL_KRW"
      prohibition:
        - "LLM이 goal_achievement_pct·goal_remaining_krw·goal_eta_label을 재계산 금지 (HS011)"
        - "LLM이 '이 속도라면 N개월 후 달성'을 GOAL_RETIREMENT_V1 외 임의 계산으로 제시 금지"
        - "목표 달성 압박을 이유로 heat_gate·cash_floor·stop_loss 규칙 우회 금지"
      canonical_ref: "AGENTS.md:Direction M4"
      version: "2026-05-20_HARNESS_V4"

    # == [2026-05-20_G1] G1 - 현금 부족액 결정론적 산출 =======================
    CASH_SHORTFALL_V1:
      purpose: >
        D+2 현금 현황 대비 최소 방어선·목표 현금비율까지 부족액을 GAS가 결정론적으로 산출.
        LLM이 "약 N원 필요" 즉석 계산을 하면 D+2/D+0 혼용·미체결 누락·세금 미반영 등으로
        호출마다 결과가 달라지는 금전적 오판 위험 발생.
      inputs:
        - {field: "settlement_cash_d2_krw", unit: "KRW"}
        - {field: "total_asset_krw",        unit: "KRW"}
        - {field: "cash_floor_min_pct",     unit: "percent"}
        - {field: "mrs_score",              unit: "score_0_100"}
      constants:
        TARGET_CASH_BASE_PCT: 5
        TARGET_CASH_MRS_WEIGHT: 15
        MRS_DIVISOR: 10
      expressions:
        cash_current_pct_d2: "round(settlement_cash_d2_krw / total_asset_krw * 100, 2)"
        cash_target_pct: "max(TARGET_CASH_BASE_PCT + (mrs_score / MRS_DIVISOR) * TARGET_CASH_MRS_WEIGHT, cash_floor_min_pct)"
        cash_shortfall_min_krw: "max(0, round(total_asset_krw * cash_floor_min_pct / 100 - settlement_cash_d2_krw))"
        cash_shortfall_target_krw: "max(0, round(total_asset_krw * cash_target_pct / 100 - settlement_cash_d2_krw))"
      output:
        fields:
          - {field: "cash_current_pct_d2",      unit: "percent"}
          - {field: "cash_target_pct",          unit: "percent"}
          - {field: "cash_shortfall_min_krw",   unit: "KRW"}
          - {field: "cash_shortfall_target_krw", unit: "KRW"}
      missing_policy:
        total_asset_krw_zero: "cash_current_pct_d2=0, 모든 shortfall=0"
        settlement_cash_d2_missing: "shortfall 산출 불가 → DATA_MISSING"
      prohibition:
        - "LLM이 '약 N원 필요' 형태로 부족액을 즉석 계산 금지 (HS011)"
        - "D+0 즉시현금(immediate_cash_krw) 합산 금지 - D2_ONLY 기준"
        - "미체결 주문·세금·정산일 조정을 LLM이 임의 적용 금지"
      canonical_ref: "AGENTS.md:Direction G1"
      version: "2026-05-20_G1"

    # == [2026-05-20_G2] G2 - 현금 회복 TRIM 계획 결정론적 산출 =================
    TRIM_PLAN_MIN_CASH_V1:
      purpose: >
        현금 부족액(CASH_SHORTFALL_V1) 해소를 위한 종목별 TRIM 계획을 H2 매도우선순위 기반으로
        GAS가 사전 결정. LLM이 임의로 종목·수량·순서를 선택하면 매도우선순위 규칙이 무력화됨.
      inputs:
        - {field: "sell_candidates_json",    unit: "list", note: "H2 매도후보 순위 배열"}
        - {field: "sell_quantities_json",    unit: "list", note: "H3 사전 산출 매도수량"}
        - {field: "close_price",             unit: "KRW_per_share", note: "holdings.close"}
        - {field: "cash_shortfall_min_krw",  unit: "KRW", note: "G1 CASH_SHORTFALL_V1 산출값"}
      expressions:
        estimated_sell_krw: "sell_qty × close_price (정수)"
        accumulated_krw: "누적 합산 estimated_sell_krw"
        covers_shortfall: "accumulated_krw >= cash_shortfall_min_krw"
      output:
        fields:
          - {field: "trim_plan_to_min_cash_json", unit: "json_array"}
      output_schema:
        rank: "H2 순위"
        ticker: "종목 코드"
        name: "종목명"
        tier: "H2 tier"
        sell_qty: "H3 매도수량 (정수 | CAPTURE_REQUIRED | NO_HOLDING | null)"
        estimated_sell_krw: "예상 매도금액 (KRW)"
        accumulated_krw: "누적 예상 매도금액 (KRW)"
        covers_shortfall: "부족액 해소 여부 (boolean)"
      missing_policy:
        no_sell_signal: "sell_qty=null, estimated_sell_krw=0"
        capture_required: "sell_qty='CAPTURE_REQUIRED', estimated_sell_krw=0"
        close_price_zero: "estimated_sell_krw=0"
      prohibition:
        - "LLM이 H2 순위 외 종목을 임의로 현금 회복 후보로 선정 금지 (HS011)"
        - "LLM이 수량·순서를 재계산하거나 재정렬 금지"
        - "CAPTURE_REQUIRED 행을 실행 가능 주문으로 간주 금지"
      canonical_ref: "AGENTS.md:Direction G2"
      version: "2026-05-20_G2"

    # == [2026-05-20_APEX_V1] A1 - 뒷북 매수 방지 선행 알파 점수 =============
    ALPHA_LEAD_SCORE_V1:
      purpose: >
        주도 섹터·상대강도·수급가속·거래대금·과열도를 결합해 선행 파일럿 진입 가능성을
        0~100 점수와 상태로 확정한다. 이미 과열된 추격매수는 점수가 높아도 차단한다.
      inputs: []
      input_groups:
        required:
          - "sector_rotation_rank"
          - "sector_rotation_rank_delta_5d"
          - "stock_rs_ratio_5d"
          - "stock_rs_ratio_20d"
          - "frg_inst_flow_accel_5d_vs_20d"
          - "avg_trade_value_5d"
          - "close_vs_ma20_pct"
          - "val_surge_pct"
          - "dart_risk_status"
      gates:
        pilot_allowed: "score >= 75 AND 0 <= close_vs_ma20_pct <= 6 AND val_surge_pct < 40"
        watch_only: "55 <= score < 75"
        blocked_late_chase: "close_vs_ma20_pct > 10 OR val_surge_pct >= 60 OR dart_risk_status != OK"
      output:
        field: "alpha_lead_json"
        unit: "json_array"
      output_schema:
        ticker: "종목 코드"
        alpha_lead_score: "0~100"
        lead_entry_state: "PILOT_ALLOWED | WATCH_ONLY | BLOCKED_LATE_CHASE | DATA_MISSING"
        allowed_tranche_pct: "0 | 20 | 30"
        blocked_reason_codes: "array"
      prohibition:
        - "blocked_late_chase 상태에서 LLM이 뉴스·테마를 이유로 BUY 승격 금지"
        - "pilot_allowed여도 계획수량 30% 초과 금지"
      canonical_ref: "proposals/2026-05-20_APEX_ALPHA_PRESERVATION_EXECUTION_HARNESS_V1.md"
      version: "2026-05-20_APEX_V1"

    FOLLOW_THROUGH_CONFIRM_V1:
      purpose: >
        돌파 이후 1~3거래일 내 가격 유지·거래대금 과열 완화·수급 유지 여부를 확인해
        본진입, 대기, 실패를 결정론적으로 분류한다.
      inputs: []
      input_groups:
        required:
          - "breakout_day_close"
          - "current_close"
          - "ma5"
          - "ma20"
          - "volume_vs_5d"
          - "frg_inst_flow_3d"
          - "intraday_low_recovery_pct"
      states:
        CONFIRMED_ADD_ON: "돌파 가격 유지 + 거래대금 과열 완화 + 수급 유지"
        FAILED_BREAKOUT: "돌파 이탈 또는 외국인/기관 동반 매도"
        WAIT_PULLBACK: "가격은 유지되나 거래대금 과열 또는 눌림 미확인"
      output:
        field: "follow_through_json"
        unit: "json_array"
      prohibition:
        - "WAIT_PULLBACK을 LLM이 본진입 허용으로 승격 금지"
        - "FAILED_BREAKOUT 후 물타기 금지"
      canonical_ref: "proposals/2026-05-20_APEX_ALPHA_PRESERVATION_EXECUTION_HARNESS_V1.md"
      version: "2026-05-20_APEX_V1"

    DISTRIBUTION_RISK_SCORE_V1:
      purpose: >
        가격 유지 또는 상승 중 스마트머니 이탈, 거래대금 둔화, 윗꼬리, 낮은 flow_credit,
        섹터 대비 상대약세를 결합해 설거지·분산 위험을 0~100으로 산출한다.
      inputs: []
      input_groups:
        required:
          - "price_above_ma20"
          - "frg_5d_sh"
          - "inst_5d_sh"
          - "frg_20d_sh"
          - "inst_20d_sh"
          - "volume_5d_vs_20d"
          - "close_location_value"
          - "upper_wick_ratio"
          - "flow_credit"
          - "ret5d_vs_sector"
      components:
        smart_money_outflow: 30
        volume_fade_after_surge: 20
        upper_wick_distribution: 15
        flow_credit_low: 20
        sector_relative_lag: 15
      gates:
        BLOCK_BUY: "score >= 70"
        TRIM_REVIEW: "55 <= score < 70"
        PASS: "score < 55"
      output:
        field: "distribution_risk_json"
        unit: "json_array"
      prohibition:
        - "BLOCK_BUY 상태에서 BUY/STAGED_BUY/ADD_ON 출력 금지"
        - "분산 위험이 높아도 과매도 매도는 SMART_CASH_RAISE_PLAN_V1을 거쳐 실행"
      canonical_ref: "spec/exit/proactive_exit_radar.yaml"
      version: "2026-05-20_APEX_V1"

    PROFIT_PRESERVATION_STATE_V1:
      purpose: >
        수익률, ATR, 고점 대비 하락, 수급 훼손, 분산 위험을 이용해 수익 보호 단계를 분류하고
        래칫·트레일링·부분 이익잠금 적용 여부를 잠근다.
      inputs: []
      input_groups:
        required:
          - "profit_pct"
          - "atr20_pct"
          - "highest_price_since_entry"
          - "current_close"
          - "ma20"
          - "frg_inst_flow_5d"
          - "distribution_risk_score"
      states:
        NORMAL: "profit_pct < 8"
        BREAKEVEN_RATCHET: "profit_pct >= 8 OR current_close >= average_cost + atr20"
        PROFIT_LOCK_10: "profit_pct >= 10"
        PROFIT_LOCK_20: "profit_pct >= 20"
        PROFIT_LOCK_30: "profit_pct >= 30"
        APEX_TRAILING: "profit_pct >= 30 AND trend_intact"
      output:
        field: "profit_preservation_json"
        unit: "json_array"
      prohibition:
        - "수익 보호 상태를 LLM이 장기 전망으로 해제 금지"
        - "래칫 가격은 PROFIT_LOCK_RATCHET_V1/TRAILING_STOP_PRICE_V1/TICK_NORMALIZER_V1 결과만 허용"
      canonical_ref: "spec/13_formula_registry.yaml:PROFIT_LOCK_RATCHET_V1"
      version: "2026-05-20_APEX_V1"

    SMART_CASH_RAISE_PLAN_V1:
      purpose: >
        cash_shortfall을 해소하되 가격 훼손을 줄이기 위해 즉시 매도수량, 반등 대기수량,
        최대 일일 매도수량, 실행 스타일을 결정론적으로 배정한다.
      inputs: []
      input_groups:
        required:
          - "cash_shortfall_min_krw"
          - "cash_shortfall_target_krw"
          - "sell_candidates_json"
          - "current_price"
          - "atr20"
          - "rsi14"
          - "bb_position"
          - "ma20_distance_pct"
          - "avg_trade_value_5d"
          - "distribution_risk_score"
          - "profit_preservation_state"
      execution_styles:
        URGENT_LIQUIDITY_TRIM: "cash_floor_status=HARD_BLOCK AND not oversold"
        OVERSOLD_REBOUND_SELL: "rsi14 < 35 OR bb_position < 20 OR close < ma20 - 8%"
        DISTRIBUTION_EXIT: "distribution_risk_score >= 70"
        PROFIT_PROTECT_TRIM: "profit_preservation_state IN [PROFIT_LOCK_20, PROFIT_LOCK_30]"
      output:
        field: "cash_raise_plan_json"
        unit: "json_array"
      prohibition:
        - "OVERSOLD_REBOUND_SELL에서 즉시 매도수량 cap 초과 금지"
        - "코어 주도주는 tier 1~8 후보 소진 전 현금확보 1순위 금지"
      canonical_ref: "spec/risk/portfolio_exposure.yaml:sell_priority_engine"
      version: "2026-05-20_APEX_V1"

    REBOUND_SELL_TRIGGER_V1:
      purpose: "과매도 현금확보 후보의 잔여 매도를 반등 조건 충족 시점으로 지연한다."
      inputs: []
      input_groups:
        required:
          - "current_price"
          - "prior_close"
          - "intraday_vwap"
          - "ma5"
          - "rsi14"
          - "volume_vs_5d"
          - "atr20"
      trigger_any:
        - "current_price >= prior_close + 0.5 * atr20"
        - "current_price > intraday_vwap AND rsi14 recovers above 40"
        - "current_price >= ma5 AND volume_vs_5d >= 0.8"
      output:
        field: "rebound_sell_trigger_json"
        unit: "json_array"
      prohibition:
        - "trigger_state 미충족 잔여수량을 LLM이 즉시 매도로 승격 금지"
      canonical_ref: "proposals/2026-05-20_APEX_ALPHA_PRESERVATION_EXECUTION_HARNESS_V1.md"
      version: "2026-05-20_APEX_V1"

    EXECUTION_QUALITY_GUARD_V1:
      purpose: "주문금액/거래대금/스프레드/변동성을 이용해 체결 품질과 분할 필요 여부를 검증한다."
      inputs: []
      input_groups:
        required:
          - "avg_trade_value_5d"
          - "order_amount_krw"
          - "spread_pct"
          - "tick_size"
          - "intraday_volatility_pct"
      rules:
        max_order_vs_adv: "order_amount_krw <= avg_trade_value_5d * 0.03"
        split_required: "order_amount_krw > avg_trade_value_5d * 0.01"
        market_order_ban: "항상 시장가 금지. 비상 hard stop 예외도 하네스 명시 필요"
        reprice_limit: "불리한 방향 2회 이상 추격 정정 금지"
      output:
        field: "execution_quality_json"
        unit: "json_array"
      prohibition:
        - "execution_quality_status != PASS이면 HTS 주문표 PASS 금지"
      canonical_ref: "spec/05_position_sizing.yaml:liquidity_constraint"
      version: "2026-05-20_APEX_V1"

    BUY_PERMISSION_MATRIX_V1:
      purpose: "POSITION_SIZE_V1 이전에 매수 허가 상태와 최대 tranche를 확정한다."
      inputs: []
      required_pass_all:
        - "cash_floor_status=PASS"
        - "heat_gate_status != BLOCK_NEW_BUY"
        - "distribution_risk_score < 55"
        - "alpha_lead_score >= 75 OR follow_through_state=CONFIRMED_ADD_ON"
        - "expected_edge >= floor"
      output:
        field: "buy_permission_json"
        unit: "json_array"
      states: ["ALLOW_PILOT", "ALLOW_ADD_ON", "WATCH", "BLOCKED"]
      prohibition:
        - "BUY_PERMISSION_MATRIX_V1 != ALLOW_*이면 buy_qty_inputs_json.final_qty는 null"
      canonical_ref: "spec/05_position_sizing.yaml:pre_permission_gate"
      version: "2026-05-20_APEX_V1"

    SELL_QUANTITY_ALLOCATOR_V1:
      purpose: "현금 부족액, 매도우선순위, 실행스타일, cap을 반영해 정수 매도수량을 확정한다."
      inputs: []
      input_groups:
        required:
          - "cash_shortfall_krw"
          - "sell_priority_rank"
          - "holding_quantity"
          - "current_price"
          - "execution_style"
          - "max_daily_qty_pct"
          - "immediate_qty_cap_pct"
      output:
        field: "smart_sell_quantities_json"
        unit: "json_array"
      output_schema:
        immediate_sell_qty: "integer_or_null"
        staged_sell_qty: "integer_or_null"
        rebound_wait_qty: "integer_or_null"
        expected_cash_recovered_krw: "KRW"
      prohibition:
        - "LLM이 Sell_Ratio_Pct × holding_quantity를 직접 계산해 대체 금지"
      canonical_ref: "spec/00_execution_contract.yaml:signal_quantity_separation"
      version: "2026-05-20_APEX_V1"

    LIMIT_PRICE_POLICY_V1:
      purpose: "매수/매도 지정가를 실행 스타일별로 산출하고 TICK_NORMALIZER_V1을 강제 적용한다."
      inputs: []
      sell_styles:
        normal_trim: "min(current_price, prior_close * 0.998)"
        rebound_sell: "rebound_trigger_price 근처 지정가"
        distribution_exit: "current_price - 0.25 * ATR20 범위 내 방어 지정가"
        profit_protect: "current_price 또는 trailing_stop 상단 기준"
      buy_styles:
        pilot: "close * 1.002 상한, chase cap 적용"
        pullback: "ma20 * 1.003 또는 close * 1.002 중 낮은 값"
        add_on: "follow_through_confirm 후 previous entry 대비 0.5~1.0% 상한"
      output:
        field: "limit_price_policy_json"
        unit: "json_array"
      post_process: "TICK_NORMALIZER_V1"
      prohibition:
        - "심리적 가격·차트 지지선으로 limit_price 대체 금지"
        - "TICK_OK 태그 없는 가격은 HTS 출력 금지"
      canonical_ref: "spec/13_formula_registry.yaml:TICK_NORMALIZER_V1"
      version: "2026-05-20_APEX_V1"

    # == [2026-05-20_K1] K1 - 분할 매수 트랜치 엔진 ==========================
    STAGED_ENTRY_TRANCHE_V1:
      purpose: >
        파일럿(T1) → 돌파확인(T2) → 눌림재진입(T3) 순서로 매수 비중을 3단계로 분할.
        LLM이 한 번에 전량 매수를 지시하거나 PILOT_ALLOWED → ADD_ON 단계를 건너뛰는 것을 차단.
        buy_permission_json의 tranche_phase를 GAS가 확정하고 LLM은 복사만 한다.
      inputs:
        - {field: "alpha_lead_score",           unit: "score_0_100"}
        - {field: "lead_entry_state",           unit: "enum"}
        - {field: "follow_through_state",       unit: "enum"}
        - {field: "holding_quantity",           unit: "shares"}
        - {field: "profit_pct",                 unit: "percent"}
        - {field: "close_vs_ma20_pct",          unit: "percent"}
      tranche_phases:
        WAIT_PILOT_SETUP:    "진입 조건 미충족 - 매수 금지"
        TRANCHE_1_PILOT:     "신규 파일럿 30% - PILOT_ALLOWED이며 포지션 없음"
        TRANCHE_2_ADD_ON:    "본진입 추가 30% - CONFIRMED_ADD_ON + 기보유"
        TRANCHE_3_PULLBACK_ADD: "눌림 추가 40% - MA20 ±2% + 수익>3% + ADD_ON"
        HOLD_CURRENT:        "현 포지션 유지 - 추가 매수 조건 미충족"
      output:
        fields:
          - {field: "tranche_phase",                unit: "enum"}
          - {field: "current_tranche_allowed_pct",  unit: "percent"}
          - {field: "next_tranche_condition",        unit: "string"}
      prohibition:
        - "LLM이 tranche_phase를 임의로 TRANCHE_2·TRANCHE_3으로 승격 금지"
        - "WAIT_PILOT_SETUP·HOLD_CURRENT 상태에서 current_tranche_allowed_pct > 0 출력 금지"
        - "T1→T2→T3 순서 건너뜀 금지 - CONFIRMED_ADD_ON 없이 TRANCHE_3 진입 금지"
      canonical_ref: "AGENTS.md:Direction K1"
      version: "2026-05-20_K1"

    # == [2026-05-20_K2] K2 - 반등 대기 분할 매도 체계 =======================
    K2_STAGED_REBOUND_SELL_V1:
      purpose: >
        현금확보 매도(OVERSOLD_REBOUND_SELL 스타일)를 즉시매도(50%) + 반등대기(50%)로 분할해
        주식가치 훼손을 최소화하면서 현금 수요를 충족한다.
        즉시매도 예상금액 × 2가 shortfall을 충당하지 못할 때만 비상 전량 매도(emergency_full_sell=true)를 허용.
      inputs:
        - {field: "base_sell_qty",                  unit: "shares",  note: "H3 SELL_QUANTITY_ALLOCATOR_V1 산출"}
        - {field: "close",                          unit: "KRW_per_share"}
        - {field: "cash_shortfall_min_krw",         unit: "KRW",     note: "G1 CASH_SHORTFALL_V1 산출"}
        - {field: "profit_preservation_state",      unit: "enum"}
        - {field: "execution_style",                unit: "enum",    note: "OVERSOLD_REBOUND_SELL 이외 스타일은 미적용"}
      expressions:
        half_qty: "floor(base_sell_qty / 2)"
        half_expected_krw: "half_qty × close"
        emergency_full_sell: "cash_shortfall_min_krw > 0 AND half_expected_krw × 2 < cash_shortfall_min_krw"
        immediate_sell_qty: "emergency_full_sell ? base_sell_qty : half_qty"
        rebound_wait_qty:   "emergency_full_sell ? 0 : max(0, base_sell_qty - half_qty)"
        oversold_cap_qty:   "floor(holding_qty × cap_pct/100)"
      cap_pct_by_profit_state:
        PROFIT_LOCK_30: 40
        APEX_TRAILING:  40
        PROFIT_LOCK_20: 35
        PROFIT_LOCK_10: 30
        default:        50
      output:
        fields:
          - {field: "immediate_sell_qty",   unit: "shares"}
          - {field: "rebound_wait_qty",     unit: "shares"}
          - {field: "emergency_full_sell",  unit: "boolean"}
          - {field: "rebound_trigger_price", unit: "KRW_per_share", note: "prevClose + 0.5×ATR20 tick-normalized"}
      prohibition:
        - "rebound_wait_qty > 0인 물량을 반등 트리거 미충족 상태에서 즉시 매도 금지"
        - "emergency_full_sell=false에서 rebound_wait_qty를 LLM이 즉시매도로 전환 금지"
        - "OVERSOLD_REBOUND_SELL 외 스타일에 이 규칙 적용 금지"
      canonical_ref: "AGENTS.md:Direction K2"
      version: "2026-05-20_K2"

    # == [2026-05-20_K3] K3 - 국면·섹터 연계 H2 동적 우선순위 ================
    K3_REGIME_SELL_PRIORITY_V1:
      purpose: >
        H2 정적 순위에 시장 국면(regime) 신호를 오버레이하여 동적 우선순위를 부여한다.
        EVENT_SHOCK에서는 KOSPI 고베타 종목이, RISK_ON에서는 섹터 상대약세 종목이 우선 정리된다.
        H2 원래 rank는 변경하지 않고 regime_priority_adjustment(-3~0)와 final_regime_rank을 추가한다.
      inputs:
        - {field: "h2_candidates",             unit: "list",  note: "H2 매도후보 배열 (rank/tier/score)"}
        - {field: "market_regime_state",        unit: "enum"}
        - {field: "ret5d",                      unit: "percent"}
        - {field: "kospi_ret5d",                unit: "percent"}
        - {field: "frg_5d",                     unit: "KRW"}
        - {field: "inst_5d",                    unit: "KRW"}
        - {field: "flow_credit",                unit: "score_0_1"}
        - {field: "ac_gate",                    unit: "string"}
      adjustment_rules:
        RISK_OFF_EVENT_SHOCK:
          high_beta_proxy_gt_1_3: -3
          dual_outflow:           -2
          above_beta_proxy_gt_1:  -1
        RISK_OFF_CANDIDATE:
          flow_credit_lt_0_30:    -2
          flow_credit_lt_0_45:    -1
        RISK_ON_SECULAR_LEADER:
          sector_lag_gt_3pct:     -2
          duplicate_etf:          -2
        LEADER_CONCENTRATION_NEUTRAL:
          anti_climax_gate:       -1
      output:
        field: "regime_adjusted_sell_priority_json"
        unit: "json_array"
      output_schema:
        rank: "H2 원래 순위"
        final_regime_rank: "국면 조정 후 최종 순위"
        regime_priority_adjustment: "조정값 (음수=우선 상향)"
        adjustment_reason: "조정 근거 코드"
        regime_applied: "적용된 국면 상태"
      prohibition:
        - "LLM이 regime_adjusted_sell_priority_json을 임의로 재정렬 금지"
        - "sell_priority_lock=true이면 LLM이 final_regime_rank도 번복 금지"
        - "H2 tier 경계를 넘는 순위 이동 금지 (tier 1 → tier 2 크로스 불가)"
      canonical_ref: "AGENTS.md:Direction K3"
      version: "2026-05-20_K3"

    # == [2026-05-20_L1] L1 - 섹터 로테이션 모멘텀 추적 ====================
    SECTOR_ROTATION_MOMENTUM_V1:
      purpose: >
        sectorFlowRadar의 rank/prevRank/prevRankW2를 기반으로 각 섹터의 rank_delta를 계산하고
        RISING/STABLE/FADING/TOPPING_OUT 모멘텀 상태를 분류한다.
        FADING(-15)/TOPPING_OUT(-10) 섹터 종목에 ALPHA_LEAD_SCORE_V1 페널티를 적용한다.
        결과는 sector_rotation_momentum_json으로 고착화 - LLM 재산출 금지.
      inputs:
        - {field: "sector", unit: "string"}
        - {field: "rank", unit: "integer", note: "현재 주 섹터 로테이션 순위"}
        - {field: "prev_rank_w1", unit: "integer", note: "1주 전 순위"}
        - {field: "prev_rank_w2", unit: "integer", note: "2주 전 순위"}
      derived_fields:
        rank_delta_w1: "rank - prev_rank_w1 (양수=순위 하락=약화)"
        rank_delta_w2: "rank - prev_rank_w2"
      momentum_states:
        RISING:     "rank_delta_w1 <= -2 (순위 상승 → 로테이션 유입)"
        STABLE:     "변화 없음 또는 소폭 등락"
        TOPPING_OUT: "rank <= 3 AND rank_delta_w1 >= 1 (상위권이지만 하락 전환)"
        FADING:     "rank_delta_w1 >= 2 AND rank_delta_w2 >= 2 (연속 순위 하락)"
      alpha_lead_penalty:
        FADING:      -15
        TOPPING_OUT: -10
      output:
        field: "sector_rotation_momentum_json"
        unit: "json_array"
      output_schema:
        sector: "섹터명"
        rank: "현재 순위"
        rank_delta_w1: "1주 delta (양수=하락)"
        rank_delta_w2: "2주 delta"
        momentum_state: "RISING/STABLE/TOPPING_OUT/FADING"
      prohibition:
        - "LLM이 sector_rotation_momentum_json을 재정렬·재산출 금지"
        - "sector_rotation_momentum_lock=true이면 LLM이 momentum_state를 번복 금지"
      canonical_ref: "AGENTS.md:Direction L1"
      version: "2026-05-20_L1"

    # == [2026-05-20_L4] L4 - 분배 선행경보 (신고점수축 / 급등약류) ==========
    PRE_DISTRIBUTION_EARLY_WARNING_V1:
      purpose: >
        DISTRIBUTION_RISK_SCORE_V1에 두 가지 선행경보 신호를 추가한다.
        (1) 신고점 근접 + 거래량 수축: 분배 직전 전형 패턴 (score +12)
        (2) 5일 급등(+5% 이상) + 수급 약화(flowCredit<0.45): 급등 후 설거지 위험 (score +10)
        기존 BLOCK_BUY/TRIM_REVIEW 임계값(70/55)을 낮추지 않고 신호 누적으로 조기 반영.
      inputs:
        - {field: "close", unit: "KRW_per_share"}
        - {field: "high52w", unit: "KRW_per_share", note: "미제공 시 MA20×1.15 대체"}
        - {field: "volume", unit: "shares"}
        - {field: "avg_volume_5d", unit: "shares"}
        - {field: "ret5d", unit: "pct"}
        - {field: "flow_credit", unit: "0~1"}
      signals:
        new_high_volume_contraction:
          condition: "(close >= high52w×0.97 OR close > MA20×1.15) AND volume < avgVol5d×0.80"
          score: 12
        surge_weak_flow:
          condition: "ret5d >= 5 AND flow_credit < 0.45"
          score: 10
      output:
        field: "pre_distribution_warning"
        values:
          EARLY_WARNING: "신고점수축 또는 급등약류 신호 발생 - 분배 선행경보"
          NONE: "선행경보 신호 없음"
      prohibition:
        - "LLM이 pre_distribution_warning=EARLY_WARNING 종목에 신규 BUY를 즉시 실행 금지"
        - "선행경보 무시하고 '아직 BLOCK_BUY 아니니 OK' 판단 금지"
      canonical_ref: "AGENTS.md:Direction L4"
      version: "2026-05-20_L4"

    # == [2026-05-20_L2] L2 - ATR 기반 자동 트레일링 손절 ===================
    RATCHET_TRAILING_AUTO_V1:
      purpose: >
        수익 구간(PROFIT_LOCK_20/30, APEX_TRAILING)에서 ATR20 기반 자동 트레일링 손절가를 산출한다.
        기존 ratchet_stop(하드 래칫)과 비교해 더 유리한(높은) 값을 auto_trailing_stop으로 고착화.
        LLM이 "익절 후 홀드" 판단에서 임의로 손절가를 낮추는 것을 구조적으로 차단.
      inputs:
        - {field: "highest_price_since_entry", unit: "KRW_per_share"}
        - {field: "stop_price", unit: "KRW_per_share", note: "기존 ratchet_stop"}
        - {field: "atr20", unit: "KRW_per_share"}
        - {field: "profit_preservation_state", unit: "enum"}
      expression: >
        PROFIT_LOCK_20: auto_trailing_stop = max(ratchet_stop, highest_close - 1.5×ATR20);
        PROFIT_LOCK_30 / APEX_TRAILING: auto_trailing_stop = max(ratchet_stop, highest_close - 2.0×ATR20);
        이외: auto_trailing_stop = null
        최종값은 KRX 호가단위로 floor 정규화 (tickNormalize_)
      output:
        field: "auto_trailing_stop"
        unit: "KRW_per_share_or_null"
        description: "ATR 트레일링 손절가. null이면 해당 수익 구간 아님. LLM이 이 값보다 낮은 손절가 제시 금지."
      prohibition:
        - "LLM이 auto_trailing_stop보다 낮은 손절가를 손절 원장에 기재 금지"
        - "profit_lock 구간에서 ATR 조건 없이 임의로 홀드 연장하는 서술 금지"
      canonical_ref: "AGENTS.md:Direction L2"
      version: "2026-05-20_L2"

    # == [2026-05-20_L3] L3 - 국면별 동적 Heat Gate ==========================
    DYNAMIC_HEAT_GATE_V1:
      purpose: >
        marketRegime에 따라 Heat Gate 임계값을 동적으로 조정한다.
        EVENT_SHOCK 국면에서는 임계값을 크게 낮춰 신규 매수를 강하게 억제하고,
        RISK_ON/SECULAR_LEADER 국면에서는 임계값을 높여 매수 여지를 확장한다.
        고착화된 HEAT_HARD_BLOCK_PCT=10% 단일값을 국면 감응형으로 대체.
      inputs:
        - {field: "total_heat_pct", unit: "pct"}
        - {field: "market_regime", unit: "string"}
      thresholds_by_regime:
        EVENT_SHOCK:                {hard_block: 5.0,  halve: 3.5}
        RISK_OFF:                   {hard_block: 7.0,  halve: 5.0}
        NEUTRAL:                    {hard_block: 10.0, halve: 7.0}
        RISK_ON:                    {hard_block: 12.0, halve: 8.5}
        SECULAR_LEADER_RISK_ON:     {hard_block: 13.0, halve: 9.0}
      expression: >
        heatThresholds = calcDynamicHeatThresholds_(marketRegime);
        heatGate = total_heat_pct >= heatThresholds.hardBlock ? BLOCK_NEW_BUY
                 : total_heat_pct >= heatThresholds.halve    ? HALVE_NEW_BUY_QUANTITY
                 : ALLOW_CONTINUE
      output:
        field: "heat_gate_threshold_pct"
        unit: "pct"
        description: "현재 국면에서 적용된 hard_block 임계값 (GAS 산출, LLM 변경 금지)"
      prohibition:
        - "LLM이 heat_gate_threshold_pct를 임의로 재계산하거나 무시 금지"
        - "heat_gate_status=BLOCK_NEW_BUY이면 LLM이 BUY 액션을 복원 금지"
      canonical_ref: "AGENTS.md:Direction L3"
      version: "2026-05-20_L3"

    # == [2026-05-20_M1] M1 - 연속 손절 자동 매수 축소 ======================
    DRAWDOWN_GUARD_V1:
      purpose: >
        연속 손절 횟수(consecutive_losses)에 따라 신규 매수 비중을 자동 축소한다.
        bayesian_multiplier=0(>=5회) 위에 추가 방어층. 2~4회 구간에서도 조기 축소.
      inputs:
        - {field: "consecutive_losses", unit: "integer"}
      thresholds:
        ">=5": {state: "NO_BUY",       buy_scale: 0.0}
        ">=3": {state: "REDUCE_BUY",   buy_scale: 0.5}
        ">=2": {state: "CAUTION_BUY",  buy_scale: 0.75}
        "0-1": {state: "NORMAL",       buy_scale: 1.0}
      output:
        fields:
          drawdown_guard_state:      "NO_BUY/REDUCE_BUY/CAUTION_BUY/NORMAL"
          drawdown_buy_scale:        "atrQty 곱셈 배수 (0~1.0). GAS 적용 후 고착화"
          drawdown_consecutive_losses: "현재 연속 손절 횟수"
      prohibition:
        - "LLM이 drawdown_buy_scale을 무시하고 정상 수량 제시 금지"
        - "drawdown_guard_state=NO_BUY이면 BUY 주문 수량 0 또는 주문 생성 금지"
      canonical_ref: "AGENTS.md:Direction M1"
      version: "2026-05-20_M1"

    # == [2026-05-20_M2] M2 - 포트폴리오 가중평균 베타 관리 =================
    PORTFOLIO_BETA_GATE_V1:
      purpose: >
        보유 종목 가중평균 베타(beta_proxy = ret5d/kospiRet5d)를 산출하고
        국면별 상한과 비교해 OVER_BETA/WARN_BETA/PASS를 결정한다.
        OVER_BETA 시 고베타 종목 TRIM 우선 조정.
      inputs:
        - {field: "weight_pct", unit: "pct"}
        - {field: "ret5d", unit: "pct"}
        - {field: "kospi_ret5d", unit: "pct"}
        - {field: "market_regime", unit: "enum"}
      beta_limits_by_regime:
        EVENT_SHOCK:              {over: 0.7, warn: 0.5}
        RISK_OFF:                 {over: 0.8, warn: 0.6}
        NEUTRAL:                  {over: 1.0, warn: 0.8}
        RISK_ON:                  {over: 1.3, warn: 1.0}
        SECULAR_LEADER_RISK_ON:   {over: 1.5, warn: 1.2}
      output:
        fields:
          portfolio_beta:     "가중평균 베타 (GAS 산출)"
          portfolio_beta_gate: "OVER_BETA/WARN_BETA/PASS/INSUFFICIENT_DATA"
          portfolio_beta_gate_json: "per-holding 베타 상세"
      prohibition:
        - "portfolio_beta_gate=OVER_BETA이면 고베타 종목 신규 BUY 금지"
        - "LLM이 beta 값을 임의 재계산 금지"
      canonical_ref: "AGENTS.md:Direction M2"
      version: "2026-05-20_M2"

    # == [2026-05-20_M3] M3 - 분할 익절 수량 자동화 =========================
    TP_QUANTITY_LADDER_V1:
      purpose: >
        TP1/TP2/TP3 도달 시 매도할 수량을 GAS에서 자동 산출해 고착화한다.
        수동 입력(tp1_qty>0) 우선 사용, 없으면 보유수량의 33%/33%/34% 자동 분배.
        LLM이 익절 수량을 임의로 결정하는 것을 구조적으로 차단.
      inputs:
        - {field: "holding_qty", unit: "shares"}
        - {field: "tp1_price", unit: "KRW_per_share"}
        - {field: "tp1_qty", unit: "shares", note: "수동 입력 우선"}
        - {field: "tp2_price", unit: "KRW_per_share"}
        - {field: "tp2_qty", unit: "shares"}
        - {field: "tp3_qty", unit: "shares"}
      output:
        field: "tp_quantity_ladder_json"
        schema:
          tp1_qty: "TP1 도달 시 매도 수량 (수동/AUTO_33PCT)"
          tp2_qty: "TP2 도달 시 매도 수량"
          tp3_qty: "TP3/잔량 수량"
          qty_source: "MANUAL/AUTO_33PCT/NO_HOLDING"
      prohibition:
        - "tp_quantity_ladder_lock=true이면 LLM이 익절 수량을 임의 변경 금지"
        - "TP 가격 도달 시 tp_quantity_ladder_json의 수량을 반드시 사용"
      canonical_ref: "AGENTS.md:Direction M3"
      version: "2026-05-20_M3"

    # == [2026-05-20_M4] M4 - 이벤트 리스크 신규 매수 홀드 ==================
    EVENT_RISK_HOLD_GATE_V1:
      purpose: >
        이벤트 홀드 기간(Event_Hold_Days <= 5) 또는 DART 리스크 플래그가 있는 종목에
        신규 매수 홀드 게이트를 적용한다.
        Event_Hold_Days 컬럼이 없으면 DART_Risk='Y' 또는 DART_Status를 대체 기준으로 사용.
      inputs:
        - {field: "event_hold_days", unit: "integer_or_null", note: "Event_Hold_Days 컬럼"}
        - {field: "dart_risk", unit: "string", note: "Y/N 또는 상태 문자열"}
      output:
        field: "event_risk_json"
        schema:
          event_hold_gate: "EVENT_HOLD/PASS"
          event_hold_days: "남은 홀드 일수 (null=컬럼 없음)"
          dart_risk:       "true/false"
          reason:          "event_hold_days_le5:N / dart_risk / no_event_risk"
      prohibition:
        - "event_hold_gate=EVENT_HOLD인 종목에 신규 BUY 주문 생성 금지"
        - "이벤트 홀드를 LLM이 임의 해제 금지"
      canonical_ref: "AGENTS.md:Direction M4"
      version: "2026-05-20_M4"

    # == [2026-05-20_M5] M5 - 섹터 편중도 한도 ==============================
    SECTOR_CONCENTRATION_LIMIT_V1:
      purpose: >
        단일 섹터 ≥40%(RISK_OFF:35%) 시 해당 섹터 추가 매수 차단.
        상위 2개 섹터 합산 ≥65%(RISK_OFF:55%) 시 WARN_TOP2.
        포트폴리오 섹터 분산을 GAS가 결정론적으로 산출 - LLM 임의 완화 금지.
      inputs:
        - {field: "weight_pct", unit: "pct"}
        - {field: "sector", unit: "string"}
        - {field: "market_regime", unit: "enum"}
      thresholds_by_regime:
        EVENT_SHOCK_RISK_OFF: {single_block: 35, top2_warn: 55}
        OTHER:                {single_block: 40, top2_warn: 65}
      output:
        fields:
          sector_concentration_gate: "BLOCK_SECTOR/WARN_TOP2/PASS"
          sector_concentration_json: "섹터별 weight_pct 및 gate 상태"
      prohibition:
        - "sector_concentration_gate=BLOCK_SECTOR인 섹터 종목에 추가 BUY 금지"
        - "LLM이 섹터 편중도를 임의로 재계산하거나 한도를 완화 금지"
      canonical_ref: "AGENTS.md:Direction M5"
      version: "2026-05-20_M5"

    # == [2026-05-20_N1] N1 - 국면별 포지션 사이즈 스케일 =====================
    POSITION_SIZE_REGIME_SCALE_V1:
      purpose: >
        국면에 따라 ATR 기반 신규 매수 수량(atrQty)에 스케일 배수를 적용한다.
        M1(DrawdownGuard) 이후 독립적으로 곱해지는 방어/공격 층.
        EVENT_SHOCK:0.25, RISK_OFF:0.5, NEUTRAL:1.0, RISK_ON:1.1, SECULAR_LEADER_RISK_ON:1.2
      inputs:
        - {field: "market_regime", unit: "enum"}
      output:
        field: "regime_size_scale"
        schema:
          regime_size_scale: "0.25~1.2 배수 - atrQty에 곱해지는 국면 스케일"
      prohibition:
        - "regime_size_scale 값을 LLM이 임의 변경 금지"
        - "매수 수량 산출 시 반드시 GAS 확정 regime_size_scale 사용"
      canonical_ref: "AGENTS.md:Direction N1"
      version: "2026-05-20_N1"

    # == [2026-05-20_N2] N2 - 거래량 돌파 확인 게이트 =========================
    VOLUME_BREAKOUT_CONFIRM_V1:
      purpose: >
        52주 신고가 97% 이상 부근에서 진입 시 당일 거래량이 5일 평균 거래량×1.2 미만이면
        UNCONFIRMED_BREAKOUT으로 alpha_lead_score에서 10점 차감.
        거래량 미확인 신고가 뒷박을 방지한다.
      inputs:
        - {field: "high52w", unit: "KRW_per_share"}
        - {field: "close", unit: "KRW_per_share"}
        - {field: "volume", unit: "shares_integer"}
        - {field: "avg_volume_5d", unit: "shares_float"}
      threshold:
        near_new_high_pct: 97
        vol_confirm_multiplier: 1.2
        score_penalty: -10
        late_chase_risk_add: 15
      output:
        field: "alpha_lead_json"
        note: "reason_codes에 unconfirmed_breakout_volume 추가"
      prohibition:
        - "거래량 미확인 신고가 부근 종목에 PILOT_ALLOWED 부여 금지"
      canonical_ref: "AGENTS.md:Direction N2"
      version: "2026-05-20_N2"

    # == [2026-05-20_N3] N3 - 손절가 적정성 검증 =============================
    STOP_PRICE_ADEQUACY_V1:
      purpose: >
        보유 종목의 수동 손절가가 ATR 기반 권고 손절가 대비 너무 넓게 설정되었는지 검증한다.
        manual_stop < recommended_stop×0.60 → STOP_CRITICAL
        manual_stop < recommended_stop×0.85 → STOP_WIDE
        recommended_stop = max(avgCost×0.92, avgCost - ATR20×multiplier), tickNormalize 적용
      inputs:
        - {field: "stop_price", unit: "KRW_per_share"}
        - {field: "average_cost", unit: "KRW_per_share"}
        - {field: "atr20", unit: "KRW_per_share"}
      thresholds:
        critical_ratio: 0.60
        wide_ratio:     0.85
        atr_multiplier_high_vol: 2.0
        atr_multiplier_normal:   1.5
        high_vol_threshold_pct:  8.0
      output:
        field: "stop_adequacy_json"
        schema:
          ticker:           "종목코드"
          manual_stop:      "수동 손절가"
          recommended_stop: "ATR 기반 권고 손절가 (tick 정규화)"
          stop_gap_pct:     "gap = (recommended - manual) / recommended × 100"
          adequacy_status:  "PASS/STOP_WIDE/STOP_CRITICAL/INSUFFICIENT_DATA"
      prohibition:
        - "stop_adequacy_json을 LLM이 임의 수정 금지"
        - "STOP_CRITICAL 종목에 추가 매수 신호 생성 금지"
      canonical_ref: "AGENTS.md:Direction N3"
      version: "2026-05-20_N3"

    # == [2026-05-20_N4] N4 - 장기 보유 재검토 플래그 =========================
    HOLDING_STALE_REVIEW_V1:
      purpose: >
        account_snapshot의 entry_date 기준으로 보유 기간을 산출한다.
        >60일: STALE_POSITION (근거 재검토 의무), >30일: REVIEW_SOON, <=30일: FRESH
        entry_date 컬럼이 없으면 ENTRY_DATE_MISSING.
      inputs:
        - {field: "entry_date", unit: "ISO_date_string"}
      thresholds:
        stale_days:  60
        review_days: 30
      output:
        field: "holding_stale_json"
        schema:
          ticker:       "종목코드"
          entry_date:   "진입일 (ISO)"
          holding_days: "보유 일수"
          stale_status: "STALE_POSITION/REVIEW_SOON/FRESH/ENTRY_DATE_MISSING"
      prohibition:
        - "holding_stale_json을 LLM이 임의 산출 금지"
        - "STALE_POSITION 종목 보유 유지 시 근거 재확인 의무 (LLM 자동 승인 금지)"
      canonical_ref: "AGENTS.md:Direction N4"
      version: "2026-05-20_N4"

    # == [2026-05-20_N5] N5 - 국면별 현금 최소 비율 상향 =====================
    REGIME_CASH_UPLIFT_V1:
      purpose: >
        MRS 기반 cash_floor보다 더 높은 현금 최소 비율이 국면(regime)상 요구될 때
        cashFloorInfo.minPct를 상향 오버라이드하고 cashShortfallInfo를 재산출한다.
        EVENT_SHOCK→20%, RISK_OFF→15%, RISK_ON→5% (MRS값보다 낮으면 MRS값 유지).
      inputs:
        - {field: "market_regime", unit: "enum"}
        - {field: "cash_floor_min_pct", unit: "pct"}
      thresholds_by_regime:
        EVENT_SHOCK: 20
        RISK_OFF:    15
        RISK_ON:      5
        NEUTRAL:      0
      output:
        field: "regime_cash_uplift_min_pct"
        note: "max(mrs_cash_min_pct, regime_min_pct) - 실제 적용된 현금 최소 비율"
      prohibition:
        - "regime_cash_uplift_min_pct를 LLM이 임의 낮추기 금지"
        - "BELOW_FLOOR 상태에서 매수 신호 생성 금지"
      canonical_ref: "AGENTS.md:Direction N5"
      version: "2026-05-20_N5"

    # == [2026-05-20_O1] O1 - 개별 종목 비중 상한 =============================
    SINGLE_POSITION_WEIGHT_CAP_V1:
      purpose: >
        개별 종목의 포트폴리오 비중(weight_pct)이 국면별 상한을 초과하면 OVERWEIGHT_TRIM.
        M5(섹터 편중)와 독립적인 종목 단위 비중 하드 캡.
        NEUTRAL/RISK_ON:20%, EVENT_SHOCK/RISK_OFF:15%
      inputs:
        - {field: "weight_pct", unit: "pct"}
        - {field: "market_regime", unit: "enum"}
      thresholds_by_regime:
        EVENT_SHOCK_RISK_OFF: {cap_pct: 15}
        OTHER:                {cap_pct: 20}
      output:
        fields:
          single_position_weight_gate: "OVERWEIGHT_TRIM/PASS"
          single_position_weight_json: "종목별 weight_pct vs cap_pct 상태"
      prohibition:
        - "OVERWEIGHT_TRIM 종목에 추가 매수 신호 생성 금지"
        - "LLM이 비중 상한을 임의 완화 금지"
      canonical_ref: "AGENTS.md:Direction O1"
      version: "2026-05-20_O1"

    # == [2026-05-20_O2] O2 - 반도체 클러스터 합산 비중 게이트 =================
    SEMICONDUCTOR_CLUSTER_GATE_V1:
      purpose: >
        005930(삼성전자) + 000660(SK하이닉스) 합산 비중이 시장 국면별 상한을 초과하면 CLUSTER_BLOCK.
        두 종목이 같은 메모리 사이클에서 동반 하락하는 상관 리스크 통제.
        EVENT_SHOCK/RISK_OFF: ≥20%, NEUTRAL/RISK_ON: ≥25%, SECULAR_LEADER_RISK_ON: ≥35%,
        CONCENTRATED_LEADER_ADVANCE(CLA): ≥60% → CLUSTER_BLOCK
      inputs:
        - {field: "weight_pct", unit: "pct"}
        - {field: "market_regime", unit: "enum"}
      thresholds_by_regime:
        EVENT_SHOCK_RISK_OFF: {cap_pct: 20}
        NEUTRAL_RISK_ON:      {cap_pct: 25}
        SECULAR_LEADER_RISK_ON: {cap_pct: 35}
        CONCENTRATED_LEADER_ADVANCE: {cap_pct: 60}
      output:
        fields:
          semiconductor_cluster_gate: "CLUSTER_BLOCK/PASS"
          semiconductor_cluster_json: "클러스터 합산 비중 및 종목별 비중"
      prohibition:
        - "CLUSTER_BLOCK 상태에서 005930 또는 000660 추가 매수 금지"
        - "LLM이 하네스/국면별 클러스터 한도를 임의 상향 또는 하향 금지"
      canonical_ref: "AGENTS.md:Direction O2"
      version: "2026-05-20_O2"

    # == [2026-05-20_O3] O3 - 포트폴리오 고점 대비 낙폭 게이트 ==================
    PORTFOLIO_DRAWDOWN_GATE_V1:
      purpose: >
        총자산(total_asset_krw)의 역대 고점(settings.portfolio_peak_krw) 대비 낙폭을 산출한다.
        -15% → DRAWDOWN_CAUTION(신규 매수 보류 권고)
        -20% → DRAWDOWN_FORCE_RISK_OFF(신규 매수 전면 차단 권고)
        현재 자산이 고점 초과 시 GAS가 settings에 새 고점을 자동 기록.
      inputs:
        - {field: "total_asset_krw", unit: "KRW"}
        - {field: "portfolio_peak_krw", unit: "KRW", note: "settings 시트 자동 갱신"}
      thresholds:
        caution_pct:   15
        force_off_pct: 20
      output:
        fields:
          portfolio_drawdown_gate: "DRAWDOWN_FORCE_RISK_OFF/DRAWDOWN_CAUTION/PASS/INSUFFICIENT_DATA"
          portfolio_drawdown_pct:  "현재 낙폭 % (양수=낙폭)"
          portfolio_peak_krw:      "적용된 고점 자산 (원)"
      prohibition:
        - "DRAWDOWN_FORCE_RISK_OFF 상태에서 신규 매수 BUY 주문 생성 금지"
        - "portfolio_peak_krw를 LLM이 임의 설정 금지"
      canonical_ref: "AGENTS.md:Direction O3"
      version: "2026-05-20_O3"

    # == [2026-05-20_O4] O4 - 최근 승률 하락 매수 축소 게이트 ====================
    WIN_LOSS_STREAK_GUARD_V1:
      purpose: >
        최근 30거래 승률(win_rate_30)이 임계값 이하로 하락하면 신규 매수 비중을 자동 축소한다.
        M1(연속 손절 횟수)과 독립적인 전체 승률 축 방어층.
        EDGE_CRITICAL(<30%):scale=0.25, EDGE_DEGRADED(<40%):scale=0.50,
        EDGE_WEAK(<45%):scale=0.75, EDGE_OK(>=45%):scale=1.0
        trades_used<10 → INSUFFICIENT_HISTORY(scale=1.0)
      inputs:
        - {field: "win_rate_30", unit: "ratio_0_to_1"}
        - {field: "trades_used", unit: "integer"}
      thresholds:
        edge_critical:  0.30
        edge_degraded:  0.40
        edge_weak:      0.45
        min_trades:     10
      output:
        fields:
          win_loss_streak_state:        "EDGE_OK/EDGE_WEAK/EDGE_DEGRADED/EDGE_CRITICAL/INSUFFICIENT_HISTORY"
          win_loss_streak_buy_scale:    "0.25/0.50/0.75/1.0 - atrQty에 곱해지는 배수"
          win_loss_streak_win_rate_pct: "최근 30거래 승률 %"
      prohibition:
        - "win_loss_streak_buy_scale를 LLM이 임의 복원 금지"
        - "EDGE_CRITICAL 상태에서 atr_qty 수동 상향 금지"
      canonical_ref: "AGENTS.md:Direction O4"
      version: "2026-05-20_O4"

    # == [2026-05-20_O5] O5 - 동시 보유 종목 수 상한 ============================
    POSITION_COUNT_LIMIT_V1:
      purpose: >
        동시 보유 종목 수가 국면별 상한을 초과하면 POSITION_COUNT_BLOCK.
        과다 분산으로 인한 집중 모니터링 불가 및 Total Heat 과소 추정 방지.
        NEUTRAL/RISK_ON:10종목, EVENT_SHOCK/RISK_OFF:6종목
      inputs:
        - {field: "market_regime", unit: "enum"}
        - {field: "holding_qty", unit: "integer", note: "보유 종목 수 (holdings.length)"}
      thresholds_by_regime:
        EVENT_SHOCK_RISK_OFF: {max_count: 6}
        OTHER:                {max_count: 10}
      output:
        fields:
          position_count_gate: "POSITION_COUNT_BLOCK/PASS"
          position_count:      "현재 보유 종목 수"
          position_count_max:  "국면별 최대 허용 종목 수"
      prohibition:
        - "POSITION_COUNT_BLOCK 상태에서 신규 BUY 주문 생성 금지"
        - "LLM이 position_count_max를 임의 상향 금지"
      canonical_ref: "AGENTS.md:Direction O5"
      version: "2026-05-20_O5"

    # == [2026-05-20_P1] P1 - 손절가 이탈 즉시 경보 =========================
    STOP_BREACH_ALERT_V1:
      purpose: >
        보유 종목 중 close <= stop_price인 종목을 즉시 경보한다.
        close <= stop_price         → BREACH_IMMEDIATE_EXIT (정규 게이트값=BREACH)
        close <= stop_price × 1.03  → STOP_APPROACHING      (게이트=APPROACHING)
        현재 stopBreach 필드를 하네스 레벨 gate로 올린 것.
      inputs:
        - {field: "close", unit: "KRW_per_share"}
        - {field: "stop_price", unit: "KRW_per_share"}
      thresholds:
        approaching_ratio: 1.03
      output:
        fields:
          stop_breach_gate:      "BREACH/APPROACHING/PASS"
          stop_breach_alert_json: "종목별 경보 상태·gap_pct 배열"
      prohibition:
        - "stop_breach_gate=BREACH 종목에 추가 매수 또는 HOLD 서술 금지"
        - "stop_breach_alert_json을 LLM이 임의 수정 금지"
      canonical_ref: "AGENTS.md:Direction P1"
      version: "2026-05-20_P1"

    # == [2026-05-20_P2] P2 - 익절가 도달 즉각 수량 연계 ====================
    TP_TRIGGER_ALERT_V1:
      purpose: >
        보유 종목 중 close >= tp1_price 또는 close >= tp2_price인 종목을 감지한다.
        tp_quantity_ladder_json과 연계해 즉각 매도 수량을 확정론적으로 제공한다.
        tp_trigger_gate=TRIGGERED이면 해당 종목의 tp_qty를 LLM이 임의 변경 금지.
      inputs:
        - {field: "close", unit: "KRW_per_share"}
        - {field: "tp1_price", unit: "KRW_per_share"}
        - {field: "tp2_price", unit: "KRW_per_share"}
        - {field: "tp_quantity_ladder_json", unit: "json"}
      output:
        fields:
          tp_trigger_gate:      "TRIGGERED/PASS"
          tp_trigger_alert_json: "트리거된 종목·tp_qty 배열"
      prohibition:
        - "TRIGGERED 종목의 매도 수량을 LLM이 tp1_qty/tp2_qty 외 값으로 변경 금지"
        - "TP 가격 도달 여부를 LLM이 재계산 금지"
      canonical_ref: "AGENTS.md:Direction P2"
      version: "2026-05-20_P2"

    # == [2026-05-20_P3] P3 - Heat 편중도 경보 ===============================
    HEAT_CONCENTRATION_ALERT_V1:
      purpose: >
        단일 종목의 Heat(=(avgCost-stopPrice)×qty)가 전체 totalHeatKrw의 50% 이상이면
        HEAT_CONCENTRATED 경보. 해당 종목 급락 시 total_heat_pct가 급변해
        다른 게이트가 무력화되는 구조적 리스크를 사전 차단.
      inputs:
        - {field: "average_cost", unit: "KRW_per_share"}
        - {field: "stop_price", unit: "KRW_per_share"}
        - {field: "total_heat_pct", unit: "pct", note: "total_heat_krw 기준"}
      threshold:
        concentration_pct: 50
      output:
        fields:
          heat_concentration_gate: "HEAT_CONCENTRATED/PASS/INSUFFICIENT_DATA"
          heat_concentration_json: "종목별 heat_krw·heat_share_pct"
      prohibition:
        - "HEAT_CONCENTRATED 종목에 추가 매수 신호 생성 금지"
        - "heat_share_pct를 LLM이 임의 계산 금지"
      canonical_ref: "AGENTS.md:Direction P3"
      version: "2026-05-20_P3"

    # == [2026-05-20_P4] P4 - 국면 전환 경보 =================================
    REGIME_TRANSITION_ALERT_V1:
      purpose: >
        직전 실행 국면(settings.prev_market_regime) vs 현재 marketRegime를 비교한다.
        UPGRADE(완화): RISK_OFF→NEUTRAL 등, DOWNGRADE(긴축): NEUTRAL→RISK_OFF 등
        LATERAL_SHIFT: 동급 국면 변경, NO_CHANGE: 변동 없음.
        국면 전환 시 영향 받는 게이트 목록을 affected_gates에 자동 생성.
      inputs:
        - {field: "market_regime", unit: "enum"}
        - {field: "portfolio_peak_krw", unit: "KRW", note: "settings 시트"}
      output:
        fields:
          regime_transition_type: "UPGRADE/DOWNGRADE/LATERAL_SHIFT/NO_CHANGE"
          regime_transition_json: "전환 상세 (prev/current/affected_gates)"
      prohibition:
        - "DOWNGRADE 국면에서 기존 포지션 규모 자동 유지 서술 금지"
        - "LLM이 regime_transition_type을 임의 판단 금지"
      canonical_ref: "AGENTS.md:Direction P4"
      version: "2026-05-20_P4"

    # == [2026-05-20_P5] P5 - 포트폴리오 건전성 종합 점수 ====================
    PORTFOLIO_HEALTH_SCORE_V1:
      purpose: >
        O1~P4까지 모든 게이트 상태를 집계해 단일 건전성 레이블을 산출한다.
        CRITICAL 게이트 ≥1개, 또는 CAUTION ≥3개 → CRITICAL
        CAUTION 1~2개 → CAUTION, 0개 → HEALTHY
        score = max(0, 100 - critical×30 - caution×10)
        보고서 첫 줄에 반드시 표시. LLM이 개별 게이트 확인 없이 이 레이블로 우선 판단.
      inputs:
        - {field: "heat_gate_status", unit: "enum"}
        - {field: "cash_floor_status", unit: "enum"}
        - {field: "portfolio_drawdown_gate", unit: "enum"}
        - {field: "stop_breach_gate", unit: "enum"}
        - {field: "tp_trigger_gate", unit: "enum"}
      output:
        fields:
          portfolio_health_label:         "HEALTHY/CAUTION/CRITICAL"
          portfolio_health_score:         "0~100 점수"
          portfolio_health_critical_count: "CRITICAL 상태 게이트 수"
          portfolio_health_caution_count:  "CAUTION 상태 게이트 수"
          portfolio_health_blocked_json:   "게이트별 severity 상세"
      prohibition:
        - "보고서 시작 전에 portfolio_health_label을 반드시 표시"
        - "CRITICAL 레이블이면 보고서 본문 이전에 '긴급 주의' 섹션 필수"
        - "LLM이 health_score를 재계산하거나 임의로 CRITICAL→CAUTION 완화 금지"
      canonical_ref: "AGENTS.md:Direction P5"
      version: "2026-05-20_P5"

    BUY_TIMING_SUITABILITY_V1:
      purpose: "core_satellite 후보 품질과 실제 매수 타이밍을 분리한다."
      inputs:
        - {field: "candidate_quality_grade", unit: "enum"}
        - {field: "entry_mode_gate", unit: "enum"}
        - {field: "timing_score_entry", unit: "score_0_100"}
        - {field: "timing_score_exit", unit: "score_0_100"}
        - {field: "expected_edge", unit: "ratio", optional: true}
        - {field: "liquidity_status", unit: "enum"}
        - {field: "spread_status", unit: "enum"}
      output: {field: "execution_recommendation_state", unit: "enum"}
      gates:
        - "timing_score_exit >= 50 -> BUY_BLOCKED_T1_EXIT_RISK"
        - "entry_mode_gate != PASS -> WATCH_TIMING_SETUP"
        - "candidate_quality_grade=A AND entry_mode_gate=PASS AND timing_score_entry>=75 -> BUY_PILOT_ALLOWED"
      missing_policy: "핵심 입력 누락 시 CANDIDATE_ONLY. LLM이 BUY로 승격 금지."
      version: "2026-05-20_CORE_SAT_TIMING_V1"

    T1_FORCED_SELL_RISK_V1:
      purpose: "오늘 매수하면 다음 거래일 손절·매도검토가 발생할 위험을 0~100점으로 산출한다."
      inputs:
        - {field: "sell_action", unit: "enum"}
        - {field: "sell_validation", unit: "enum"}
        - {field: "timing_score_exit", unit: "score_0_100"}
        - {field: "rw_partial", unit: "count"}
        - {field: "distribution_risk_score", unit: "score_0_100", optional: true}
        - {field: "late_chase_risk_score", unit: "score_0_100", optional: true}
        - {field: "rsi14", unit: "points", optional: true}
        - {field: "disparity", unit: "pct", optional: true}
        - {field: "val_surge_pct", unit: "pct", optional: true}
        - {field: "ret5d", unit: "pct", optional: true}
        - {field: "dart_risk", unit: "string", optional: true}
      output: {field: "t1_forced_sell_risk_score", unit: "score_0_100"}
      expression: "min(100, sell_action_active*40 + timing_exit_ge_50*25 + rw_ge_2*25 + distribution_ge_70*30 + late_chase_ge_70*25 + overheated*20 + surge_after_runup*15 + dart_risk*30)"
      gates:
        - "score>=70 -> BUY_BLOCKED_T1_EXIT_RISK"
        - "50<=score<70 -> WATCH_ONLY_T1_RISK"
        - "score<50 -> PASS"
      version: "2026-05-20_CORE_SAT_TIMING_V1"

    SELL_CONFLICT_AWARE_RECOMMENDATION_V1:
      purpose: "매도·현금확보·NO_ADD 게이트와 충돌하는 신규 core_satellite 매수 추천을 차단한다."
      inputs:
        - {field: "final_action", unit: "enum"}
        - {field: "sell_action", unit: "enum"}
        - {field: "cash_preserve_style", unit: "enum"}
        - {field: "allowed_action", unit: "enum"}
      output: {field: "sell_conflict_score", unit: "score_0_100"}
      expression: "min(100, sell_signal_active*55 + cash_preserve_active*20 + no_add_gate*20)"
      gates:
        - "score>=70 -> BUY_BLOCKED_SELL_CONFLICT"
        - "40<=score<70 -> SELL_OR_TRIM_FIRST"
        - "score<40 -> PASS"
      version: "2026-05-20_CORE_SAT_TIMING_V1"

    # == [2026-05-20_H6] H6 - 가짜 매도 신호 차단 홀드 게이트 =================
    ANTI_WHIPSAW_HOLD_GATE_V1:
      purpose: >
        연속 매도 신호 5일 이상 + 기관·외국인 순매수 조합을 감지해 가짜 매도(whipsaw)를
        차단한다. WHIPSAW_SUSPECTED이면 당일 매도를 1거래일 홀드시키고, 다음날 재평가.
        설거지(distribution sell) 패턴과 구별해 실제 분산매도인지 재확인.
      inputs:
        - {field: "consecutive_sell_signals_5d", unit: "count", note: "최근 5일간 연속 매도 신호 수"}
        - {field: "vol_surge_pct", unit: "pct", note: "당일 거래량/avg_vol_5d - 1 (0 이상)"}
        - {field: "institutional_flow_5d", unit: "KRW", note: "기관 5일 누적 순매수 (양수=순매수)"}
        - {field: "foreign_flow_5d", unit: "KRW", note: "외국인 5일 누적 순매수 (양수=순매수)"}
        - {field: "sector_relative_strength_5d", unit: "ratio", note: "섹터 5일 상대강도, 100=시장동률"}
      scoring:
        whipsaw_score_components:
          - {condition: "consecutive_sell_signals_5d >= 5",    score: +20, note: "연속 매도신호 누적"}
          - {condition: "institutional_flow_5d > 0",           score: +30, note: "기관 순매수 중 매도신호 = 의심"}
          - {condition: "foreign_flow_5d > 0",                 score: +20, note: "외인 순매수 중 매도신호 = 의심"}
          - {condition: "sector_relative_strength_5d > 100",   score: +15, note: "섹터 강세 중 매도신호 = 의심"}
          - {condition: "vol_surge_pct >= 50",                 score: -25, note: "대규모 거래량 = 실제 매도 가능성"}
          - {condition: "vol_surge_pct >= 100",                score: -20, note: "거래량 폭증 추가 패널티"}
        base_score: 0
      states:
        WHIPSAW_SUSPECTED: "whipsaw_score >= 30"
        CONFIRMED_SELL:    "whipsaw_score < 10"
        INCONCLUSIVE:      "10 <= whipsaw_score < 30"
      hold_policy:
        WHIPSAW_SUSPECTED: "1거래일 매도 연기. 다음 거래일 재평가 필수."
        CONFIRMED_SELL:    "매도 진행 허용"
        INCONCLUSIVE:      "50% 수량만 매도 허용. 나머지 1거래일 후 재평가."
      output:
        fields:
          anti_whipsaw_gate:      "WHIPSAW_SUSPECTED/CONFIRMED_SELL/INCONCLUSIVE"
          anti_whipsaw_score:     "0~100 점수"
          anti_whipsaw_hold_days: "0 또는 1 (홀드 일수)"
          anti_whipsaw_json:      "상태·점수·홀드 사유 JSON"
      prohibition:
        - "WHIPSAW_SUSPECTED 상태에서 당일 전량 매도 신호 생성 금지"
        - "anti_whipsaw_score를 LLM이 임의 계산 금지"
        - "anti_whipsaw_gate를 LLM이 재판단하거나 우회 금지"
      harness_lock: true
      llm_override: forbidden
      canonical_ref: "engine_harness_upgrade_proposal_result.txt:ANTI_WHIPSAW_HOLD_GATE_V1"
      version: "2026-05-20_HARNESS_H6"

    # == [2026-05-20_H7] H7 - 4경로 결정론적 현금확보 라우터 ===================
    SMART_CASH_RAISE_V2:
      purpose: >
        현금 부족 상황에서 포트폴리오·종목 상태에 따라 4가지 경로(ROUTE_A~D) 중 하나를
        결정론적으로 선택한다. 임의 전량매도·즉흥 트림을 차단하고 주식가치 훼손을
        최소화하면서 반등 수익을 보존하는 구조화된 현금확보를 보장한다.
      inputs:
        - {field: "position_class",      unit: "enum",  note: "CORE/SATELLITE"}
        - {field: "rsi14",               unit: "points"}
        - {field: "profit_lock_stage",   unit: "enum",  note: "PROFIT_LOCK_STAGE_CLASSIFIER_V1 결과"}
        - {field: "secular_leader_gate", unit: "enum",  note: "SECULAR_LEADER_REGIME_GATE_V1 결과"}
        - {field: "emergency_full_sell", unit: "bool",  note: "긴급 전량매도 플래그 (인간 승인 필수)"}
        - {field: "cash_shortfall_krw",  unit: "KRW",   note: "필요 현금 부족분"}
        - {field: "stop_breach_gate",    unit: "enum",  note: "STOP_BREACH_ALERT_V1 결과"}
      route_selection:
        priority_order: [ROUTE_D, ROUTE_A, ROUTE_B, ROUTE_C, ROUTE_E]
        routes:
          ROUTE_D:
            label: "긴급 전량매도"
            trigger: "emergency_full_sell=true OR stop_breach_gate=BREACH"
            action: "전량 매도. 즉시 실행."
            qty_formula: "full_qty"
            rebound_wait_pct: 0
            note: "반드시 인간 승인 또는 stop 트리거 자동 발동만 허용"
          ROUTE_A:
            label: "위성 비중 트림"
            trigger: "position_class=SATELLITE AND rsi14 >= 35"
            action: "보유수량의 33~50% 즉시 트림. 나머지 유지."
            qty_formula: "ROUND(qty * 0.33 ~ 0.50)"
            rebound_wait_pct: 0
            note: "과매도 아닌 위성 종목 비중 축소. 반등 대기 없음."
          ROUTE_B:
            label: "과매도 종목 분할 매도"
            trigger: "rsi14 < 35"
            action: "50% 즉시 매도 + 50% rebound_trigger_price 도달 시 매도"
            qty_formula: "K2_STAGED_REBOUND_SELL_V1 공식 적용"
            rebound_trigger_formula: "prevClose + 0.5 × ATR20"
            rebound_wait_pct: 50
            note: "과매도 반등 수익 보존. K2와 동일 로직 재사용."
          ROUTE_C:
            label: "코어 익절 잠금"
            trigger: "position_class=CORE AND profit_lock_stage IN [PROFIT_LOCK_STAGE_20,PROFIT_LOCK_STAGE_30] AND secular_leader_gate=PASS"
            action: "PROFIT_LOCK_STAGE_CLASSIFIER_V1 지정 수량만 매도. 잔여 HOLD."
            qty_formula: "profit_lock_qty (PROFIT_LOCK_STAGE_CLASSIFIER_V1 계산값)"
            rebound_wait_pct: 0
            note: "코어 시큘러 리더는 최소 매도. 익절 수량 외 강제 매도 금지."
          ROUTE_E:
            label: "일반 현금부족 단계적 매도"
            trigger: "cash_shortfall_krw > 0 AND stop_breach_gate != BREACH AND rsi14 >= 35 AND ROUTE_A~D 조건 미해당"
            action: "H2 sell_priority 순서로 SELL_WATERFALL_ENGINE_V1 Stage 1→2→3 실행."
            qty_formula: "SELL_WATERFALL_ENGINE_V1 stage1_qty (prevClose 지정가 기준)"
            rebound_wait_pct: 50
            note: "비상 아닌 일반 현금부족 전용 폴백 경로. ROUTE_A~D 조건 미충족 시 실행."
      output:
        fields:
          smart_cash_raise_route: "ROUTE_A/ROUTE_B/ROUTE_C/ROUTE_D/NO_ACTION"
          smart_cash_raise_qty:   "결정론적 매도 수량 (주)"
          smart_cash_raise_json:  "경로·수량·사유·rebound_wait_pct 상세 JSON"
      prohibition:
        - "smart_cash_raise_route를 LLM이 임의 선택 금지"
        - "smart_cash_raise_qty를 LLM이 재계산 금지"
        - "ROUTE_D는 emergency_full_sell=true 또는 stop_breach_gate=BREACH 외 발동 금지"
        - "ROUTE_C에서 profit_lock_qty 이상 매도 서술 금지"
        - "현금 부족 시 코어 시큘러 리더 전량 매도 권고 금지"
      harness_lock: true
      llm_override: forbidden
      canonical_ref: "engine_harness_upgrade_proposal_result.txt:SMART_CASH_RAISE_V2"
      version: "2026-05-23_HARNESS_V5_PROPOSAL46"

    # == [2026-05-23_PROPOSAL46] PA1 - 정반합 사전 예측 알파 엔진 =============
    PREDICTIVE_ALPHA_ENGINE_V1:
      purpose: >
        正(매수 모멘텀) + 反(분배/과열 신호)를 합산한 방향성 신뢰도(合)를 결정론적으로 산출.
        LLM이 "분위기가 좋으니까" BUY 권고하는 구조를 3계층 점수로 대체.
        T+5 피드백 루프로 예측 정확도를 자동 추적하여 45.59% → 70%+ 목표.
      inputs:
        - {field: "close",                        unit: "KRW_per_share"}
        - {field: "ma20",                         unit: "KRW_per_share"}
        - {field: "flow_credit",                  unit: "ratio_0_1"}
        - {field: "rs_verdict",                   unit: "enum"}
        - {field: "brt_verdict",                  unit: "enum"}
        - {field: "volume_ratio_5d",              unit: "ratio"}
        - {field: "rsi14",                        unit: "score_0_100"}
        - {field: "velocity_1d",                  unit: "percent"}
        - {field: "distribution_signals_count",   unit: "integer"}
        - {field: "foreign_sell_consecutive_days", unit: "integer"}
        - {field: "usd_krw",                      unit: "KRW",     optional: true}
        - {field: "days_since_entry",             unit: "integer", optional: true}
        - {field: "profit_pct",                   unit: "percent", optional: true}
      thesis_score:
        max: 100
        components:
          pullback_entry:    {condition: "close > ma20 AND close < ma20 * 1.03", score: 20}
          flow_strong:       {condition: "flow_credit >= 0.55",                   score: 20}
          rs_leader:         {condition: "rs_verdict = LEADER",                   score: 15}
          volume_confirm:    {condition: "volume_ratio_5d >= 1.2",                score: 15}
          rsi_healthy:       {condition: "rsi14 BETWEEN 45 AND 65",               score: 15}
          brt_leader:        {condition: "brt_verdict = LEADER",                  score: 15}
      antithesis_score:
        max: 100
        components:
          chase_risk:        {condition: "velocity_1d >= 3.0",                    score: 25}
          distribution:      {condition: "distribution_signals_count >= 2",        score: 20}
          rsi_overbought:    {condition: "rsi14 >= 75",                           score: 20}
          foreign_sell:      {condition: "foreign_sell_consecutive_days >= 5",     score: 15}
          usd_krw_weak:      {condition: "usd_krw >= 1480",                       score: 10}
          stale_position:    {condition: "days_since_entry >= 60 AND profit_pct < 5", score: 10}
      synthesis:
        direction_confidence: "thesis_score - antithesis_score"
        verdicts:
          STRONG_BUY_SIGNAL:    {condition: "direction_confidence >= 40"}
          MODERATE_BUY_SIGNAL:  {condition: "direction_confidence >= 20"}
          HOLD_NEUTRAL:         {condition: "direction_confidence >= -10"}
          TRIM_SIGNAL:          {condition: "direction_confidence >= -30"}
          EXIT_SIGNAL:          {condition: "direction_confidence < -30"}
      feedback_loop:
        metric: "prediction_accuracy_rate"
        storage: "monthly_history sheet"
        auto_adjust:
          antithesis_weight_up:   "accuracy < 60% → ANTITHESIS 가중치 +10%"
          thesis_weight_up:       "accuracy > 75% → THESIS 가중치 +5%"
      output:
        field: "predictive_alpha_json"
        schema:
          direction_confidence:     "integer (-100 ~ +100)"
          thesis_score:             "integer (0 ~ 100)"
          antithesis_score:         "integer (0 ~ 100)"
          synthesis_verdict:        "enum"
          prediction_confidence_pct: "percent"
          thesis_breakdown:         "array"
          antithesis_breakdown:     "array"
      prohibition:
        - "synthesis_verdict 없이 신규 BUY 서술 금지 (Direction PA1)"
        - "LLM이 thesis/antithesis 점수를 직접 계산 금지"
        - "direction_confidence 재계산 또는 번복 금지"
      canonical_ref: "AGENTS.md:Direction PA1, temp/request_result.txt:proposal_46"
      version: "2026-05-23_PROPOSAL46"

    # == [2026-05-23_PROPOSAL46] PA2 - 뒷박 방지 3중 게이트 V2 ==================
    ANTI_LATE_ENTRY_GATE_V2:
      purpose: >
        기존 ANTI_CHASING_VELOCITY_V1(당일 속도만 체크)의 허점 보완.
        2~3일 연속 급등 후 당일 잠시 쉬는 경우도 5일 누적 속도 GATE_2로 차단.
        분배 신호 GATE_3을 추가해 3중 AND 게이트 구성.
      inputs:
        - {field: "velocity_1d",                unit: "percent",   note: "(close-prevClose)/prevClose*100"}
        - {field: "velocity_5d",                unit: "percent",   note: "(close-close_5d)/close_5d*100"}
        - {field: "distribution_signals_count", unit: "integer",   note: "DISTRIBUTION_SELL_DETECTOR_V1 결과"}
        - {field: "pre_distribution_warning",   unit: "enum",      optional: true}
        - {field: "flow_credit",                unit: "ratio_0_1", optional: true}
        - {field: "ma20",                       unit: "KRW_per_share", optional: true}
      gate_1_velocity_1d:
        BLOCK_CHASE:    "velocity_1d >= 3.0%"
        PULLBACK_WAIT:  "velocity_1d >= 1.5%"
        PASS:           "velocity_1d < 1.5%"
      gate_2_velocity_5d:
        BLOCK_CHASE_5D:    "velocity_5d >= 8.0%"
        PULLBACK_WAIT_5D:  "velocity_5d >= 5.0%"
        PASS:              "velocity_5d < 5.0%"
      gate_3_distribution:
        BLOCK_DISTRIBUTION:   "distribution_signals_count >= 2 (weighted_sum >= 3.0)"
        PULLBACK_WAIT_DIST:   "pre_distribution_warning = EARLY_WARNING"
        PASS:                 "otherwise"
      final_gate_logic:
        logic:        "AND"
        BLOCK:        "gate_1=BLOCK OR gate_2=BLOCK OR gate_3=BLOCK"
        PULLBACK_WAIT: "any PULLBACK_WAIT (BLOCK 없을 때)"
        PASS:         "gate_1=PASS AND gate_2=PASS AND gate_3=PASS"
      entry_grade:
        A: "velocity_1d < 0.5% AND pullback_zone AND flow_credit > 0.55"
        B: "velocity_1d < 1.5% AND close near MA20"
        C: "PULLBACK_WAIT 통과 진입"
        D: "velocity_5d > 5% 이지만 gate_1 PASS"
        F: "BLOCK 우회 진입 → PATTERN_BLACKLIST_AUTO_V1 카운트 자동 +1"
      output:
        field: "anti_late_entry_json"
        schema:
          gate1_status:       "BLOCK_CHASE | PULLBACK_WAIT | PASS"
          gate2_status:       "BLOCK_CHASE_5D | PULLBACK_WAIT_5D | PASS"
          gate3_status:       "BLOCK_DISTRIBUTION | PULLBACK_WAIT_DIST | PASS"
          final_gate_status:  "BLOCK | PULLBACK_WAIT | PASS"
          entry_grade:        "A | B | C | D | F"
          block_reason:       "string"
          velocity_1d:        "percent"
          velocity_5d:        "percent"
      prohibition:
        - "BLOCK 상태에서 BUY/STAGED_BUY/ADD_ON 출력 금지"
        - "entry_grade=F 자동 입력 시 PATTERN_BLACKLIST 카운트 +1 강제"
        - "ANTI_CHASING_VELOCITY_V1(V1) 단독 인용 금지 - 이 V2가 V1을 완전 대체"
      canonical_ref: "AGENTS.md:Direction A2 (V2로 업그레이드)"
      version: "2026-05-23_PROPOSAL46"

    # == [2026-05-23_PROPOSAL46] PA3 - 현금확보 매도 세련화 엔진 V2 =============
    CASH_PRESERVATION_SELL_ENGINE_V2:
      purpose: >
        K2(50/50 분할) + C1(4단계 폭포수) + C2(타이밍 결정)를 단일 엔진으로 통합.
        현금이 급해도 과매도 구간 전량 즉시 청산 방지 + 반등 시 추가 수익 포착.
        value_preservation_score < 50이면 SELL_VALUE_DAMAGE_WARNING 경보 발령.
      inputs:
        - {field: "rsi14",                  unit: "score_0_100"}
        - {field: "atr20",                  unit: "KRW_per_share"}
        - {field: "prev_close",             unit: "KRW_per_share"}
        - {field: "ma20",                   unit: "KRW_per_share", optional: true}
        - {field: "base_qty",               unit: "shares",  note: "H3 SELL_QUANTITY_ALLOCATOR 산출"}
        - {field: "stop_loss_price",        unit: "KRW_per_share"}
        - {field: "cash_shortfall_min_krw", unit: "KRW",     note: "CASH_SHORTFALL_V1 산출"}
        - {field: "distribution_signals_count", unit: "integer", optional: true}
        - {field: "emergency_full_sell",    unit: "boolean", optional: true, note: "K2 산출값"}
        - {field: "oversold_gate",          unit: "enum",    optional: true}
      execution_style_decision:
        OVERSOLD_REBOUND_SELL:  "oversold_gate=OVERSOLD AND rsi14 < 30"
        EMERGENCY_FULL_EXIT:    "emergency_full_sell=true"
        STAGED_WATERFALL:       "otherwise"
      quantity_formulas:
        OVERSOLD_REBOUND_SELL:
          immediate_qty:    "floor(base_qty * 0.50)"
          rebound_wait_qty: "base_qty - immediate_qty"
          rebound_trigger:  "TICK_NORMALIZER_V1(prev_close + 0.5 * atr20)"
          deadline_days:    3
          deadline_action:  "미체결 3영업일 후 prev_close 지정가로 자동 전환"
        STAGED_WATERFALL:
          stage1_qty:       "floor(base_qty * 0.50)"
          stage2_qty:       "base_qty - stage1_qty"
          stage2_deadline:  "5 영업일 초과 시 EMERGENCY 전환"
        EMERGENCY_FULL_EXIT:
          sell_qty:         "base_qty"
          order_type:       "MARKET"
      rebound_scenario:
        immediate_sell_krw:     "immediate_qty * prev_close"
        rebound_upside_krw:     "rebound_wait_qty * rebound_trigger"
        downside_risk_krw:      "rebound_wait_qty * stop_loss_price"
        risk_reward_ratio:      "(rebound_upside_krw - immediate_sell_krw) / max(1, immediate_sell_krw - downside_risk_krw)"
        low_rr_alert:           "risk_reward_ratio < 1.0 → emergency_full_sell 검토 권고"
      value_preservation_score:
        base: 100
        deductions:
          full_sell_oversold:   {condition: "immediate_qty=base_qty AND rsi14 < 30", deduct: 30}
          price_below_prev:     {condition: "limit_price < prev_close * 0.97",       deduct: 20}
          distribution_high:    {condition: "distribution_signals_count >= 3",        deduct: 15}
        bonuses:
          rebound_wait_exists:  {condition: "rebound_wait_qty > 0",  bonus: 15}
          tight_trigger:        {condition: "rebound_trigger <= prev_close * 1.03", bonus: 10}
        alert: "score < 50 → SELL_VALUE_DAMAGE_WARNING"
      output:
        field: "cash_preservation_sell_json"
        schema:
          execution_style:          "OVERSOLD_REBOUND_SELL | STAGED_WATERFALL | EMERGENCY_FULL_EXIT"
          immediate_qty:            "shares"
          rebound_wait_qty:         "shares"
          rebound_trigger_price:    "KRW (tick-normalized)"
          rebound_deadline_days:    "integer"
          risk_reward_ratio:        "float"
          value_preservation_score: "integer (0~100)"
          immediate_sell_krw:       "KRW"
          rebound_upside_krw:       "KRW"
          emergency_full_sell_flag: "boolean"
          sell_value_damage_warning: "boolean"
      prohibition:
        - "OVERSOLD_REBOUND_SELL에서 rebound_wait_qty를 반등 트리거 미충족 상태에서 즉시 매도 금지"
        - "value_preservation_score 없이 매도 수량 제안 금지 (Direction D2[11])"
        - "emergency_full_sell=false에서 전량 즉시 청산 지시 금지"
      canonical_ref: "AGENTS.md:Direction K2/C1/C2, temp/request_result.txt:proposal_46#1-3"
      version: "2026-05-23_PROPOSAL46"

    # == [2026-05-23_PROPOSAL46] PA4 - 미시/거시/국제정세 동기화 하네스 ==========
    MACRO_EVENT_SYNCHRONIZER_V1:
      purpose: >
        외국인 순매도 일수·USD/KRW·FOMC 일정·국내 CPI·VIX 등 거시 변수를
        heat_gate + buy_gate에 자동 반영. 현재 LLM 서술용으로만 쓰던 데이터를
        결정론적 gate 조정에 연결. 매일 아침 GAS Trigger로 자동 갱신.
      inputs:
        - {field: "usd_krw",                     unit: "KRW",     note: "settings manual_input 또는 API"}
        - {field: "foreign_sell_consecutive_days", unit: "integer", note: "macro 시트 누적"}
        - {field: "foreign_sell_krw_today",       unit: "KRW",     optional: true}
        - {field: "fomc_days_remaining",          unit: "integer", optional: true, note: "event_calendar"}
        - {field: "domestic_cpi",                 unit: "percent", optional: true}
        - {field: "vix",                          unit: "float",   optional: true}
        - {field: "us500_1w_change",              unit: "percent", optional: true}
      macro_risk_score:
        max: 100
        components:
          usd_krw_critical: {condition: "usd_krw > 1500",                        score: 20}
          usd_krw_weak:     {condition: "usd_krw > 1480 AND <= 1500",            score: 15}
          foreign_mega:     {condition: "foreign_consecutive_sell_days >= 10",    score: 20}
          foreign_high:     {condition: "foreign_consecutive_sell_days >= 5",     score: 15}
          fomc_near:        {condition: "fomc_days_remaining <= 5",               score: 15}
          cpi_high:         {condition: "domestic_cpi > 2.5",                    score: 10}
          vix_elevated:     {condition: "vix > 20",                              score: 10}
          us500_drop:       {condition: "us500_1w_change < -3.0",                score: 10}
      macro_risk_regime:
        MACRO_CRITICAL:  {condition: "macro_risk_score >= 60", heat_gate_adj: -3}
        MACRO_ELEVATED:  {condition: "macro_risk_score >= 40", heat_gate_adj: -1}
        MACRO_NEUTRAL:   {condition: "macro_risk_score >= 20", heat_gate_adj:  0}
        MACRO_FAVORABLE: {condition: "macro_risk_score <  20", heat_gate_adj: +1}
      event_matrix:
        FOMC_WEEK:      {buy_gate_downgrade: true,  sell_block: false}
        EARNINGS_WEEK:  {event_hold_gate: true,     note: "해당 종목 M4 EVENT_HOLD 발동"}
        DART_RISK:      {event_hold_gate: true,     note: "기존 M4 연동"}
        GEOPOLITICAL:   {regime_size_scale_adj: -0.25, note: "N1 연동"}
      mega_sell_alert:
        condition:   "foreign_sell_krw_today >= 1_000_000_000_000"
        effect:      "buy_gate_block_until = today + 3 영업일"
      data_sources:
        usd_krw:              "settings 시트 manual_input"
        fomc_dates:           "settings 시트 event_calendar"
        foreign_flow:         "macro 시트 _foreignFlow"
        vix_us500:            "macro 시트 _vix, _us500Close"
      output:
        field: "macro_event_json"
        schema:
          macro_risk_score:          "integer (0~100)"
          macro_risk_regime:         "MACRO_CRITICAL | MACRO_ELEVATED | MACRO_NEUTRAL | MACRO_FAVORABLE"
          macro_risk_breakdown:      "array"
          foreign_consecutive_sell_days: "integer"
          mega_sell_alert:           "boolean"
          buy_gate_block_until:      "date or null"
          effective_heat_gate_adjustment: "integer"
          event_matrix:              "array"
          fomc_days_remaining:       "integer or null"
      prohibition:
        - "MACRO_CRITICAL 상태에서 포지션 증가 서술 금지 (Direction D2[10])"
        - "LLM이 macro_risk_score를 임의 계산 금지 - 하네스 출력만 인용"
        - "external_context_json 데이터를 주문 판단에 혼입 금지 (G3)"
      canonical_ref: "AGENTS.md:Direction G3/ME1, temp/request_result.txt:proposal_46#1-4"
      version: "2026-05-23_PROPOSAL46"

    # == [2026-05-23_PROPOSAL46] PA5 - 데이터정합성/방향성/일관성 검증기 V2 =======
    CONSISTENCY_VALIDATOR_V2:
      purpose: >
        기존 validate_harness_context.py(키 존재 여부만)를 12개 논리 검증 항목으로 확장.
        일관성 점수 < 90%이면 보고서 생성 자체 BLOCK - 오염 데이터 분석 원천 차단.
        DETERMINISTIC_ROUTING_ENGINE_V1의 Step 2(pre-flight)에서 가장 먼저 실행.
      inputs:
        - {field: "settlement_cash_d2_krw",   unit: "KRW",     note: "CV_08 현금 경로 검증"}
        - {field: "harness_context",          unit: "json",    note: "전체 harness_context 객체 - CV_01~CV_12 검증 원천"}
      checks:
        CV_01:
          name: "sell_priority 방향 일관성"
          rule: "sell_candidates_json[n].tier >= sell_candidates_json[n-1].tier (tier 역전 금지)"
        CV_02:
          name: "가격 순서 검증"
          rule: "stop_price < current_price < tp1_price < tp2_price (모든 종목)"
        CV_03:
          name: "heat vs 보유 비중 일치"
          rule: "sum(position_weight_pct) ≈ total_heat_pct (±0.5% 허용)"
        CV_04:
          name: "enum 값 유효성"
          rule: "profit_lock_stage in VALID_STAGES, rs_verdict in {LEADER,NEUTRAL,LAGGARD,BROKEN}, tp_state in VALID_TP_STATES"
        CV_05:
          name: "상호 충돌 게이트 탐지"
          rules:
            - "heat_gate=BLOCK_NEW_BUY AND final_action=BUY → CONTRADICTION"
            - "sfg_v1=TRIGGERED AND final_action=BUY → CONTRADICTION"
            - "intraday_lock=true AND BUY not in blocked_actions → INCOMPLETE"
        CV_06:
          name: "수량 정수 검증"
          rule: "모든 qty 필드 = floor(qty) (소수점 금지)"
        CV_07:
          name: "날짜 신선도"
          rules:
            - "data_date vs today > 1 영업일 → STALE_WARN"
            - "data_date vs today > 3 영업일 → STALE_BLOCK"
        CV_08:
          name: "현금 계산 경로"
          rule: "settlement_cash_d2_krw 사용 확인. immediate_cash 합산 금지."
        CV_09:
          name: "라우팅 completeness"
          rule: "routing_execution_log에 10단계 모두 존재 여부"
        CV_10:
          name: "LLM 출력 checksum"
          rule: "rendered_output_checksum 일치 여부 (blueprint vs LLM 출력 수치)"
        CV_11:
          name: "GAS 하네스 키 동기화"
          rule: "buildHarnessContext_() 출력 키 ⊇ validate_harness_context.py REQUIRED_KEYS"
          gap_output: "HARNESS_KEY_MISSING 목록"
        CV_12:
          name: "YAML-to-GAS 커버리지"
          rule: "spec/ formula_id 목록 vs gas_data_feed.gs calc*_() 교차검증"
          gap_output: "GAS_COVERAGE_GAP 목록"
      scoring:
        formula: "(통과 항목 수 / 12) * 100"
        BLOCK:   "score < 90 → 보고서 생성 중단"
        WARNING: "score >= 90 AND < 100 → Gap 목록 출력 후 계속"
        PASS:    "score = 100"
      output:
        field: "consistency_report_json"
        schema:
          score:         "integer (0~100)"
          passed:        "array of check_ids"
          failed:        "array of {check_id, reason}"
          gap_list:      "array of {type: HARNESS_KEY_MISSING|GAS_COVERAGE_GAP, item}"
          block_status:  "BLOCK | WARNING | PASS"
      prohibition:
        - "consistency_score < 90인 상태에서 보고서 생성 금지"
        - "LLM이 CV 검증 항목을 직접 계산하거나 우회 선언 금지"
        - "ROUTING step 2에서 CV_02 통과 전 이후 단계 진행 금지"
      canonical_ref: "AGENTS.md:Direction D1(Step 2), temp/request_result.txt:proposal_46#1-5"
      version: "2026-05-23_PROPOSAL46"

    # == [2026-05-24_PROPOSAL50] EJCE-V1 - 전문가 3관점 합의 게이트 =============
    EXPERT_JUDGMENT_CONSENSUS_ENGINE_V1:
      purpose: >
        Analyst(기술적 관점)·Trader(실행 타이밍)·Quant(리스크 수치) 3관점 중
        2관점 이상 BLOCK이면 consensus_result=NO_BUY를 반환.
        buy_permission_json.buy_permission_state=ALLOW여도 NO_BUY 종목 BUY 절대 차단.
      inputs:
        - {field: "ticker", unit: "string"}
        - {field: "df",     unit: "object - market data feed"}
        - {field: "paeRow", unit: "object - PAE output row"}
        - {field: "hApex",  unit: "object - harness apex context"}
      output:
        field: "ejce_json"
        schema:
          ticker:           "string"
          analyst_view:     "ALLOW | BLOCK"
          trader_view:      "ALLOW | BLOCK"
          quant_view:       "ALLOW | BLOCK"
          consensus_result: "BUY_ALLOWED | NO_BUY"
          block_reasons:    "array of string"
          formula_id:       "EXPERT_JUDGMENT_CONSENSUS_ENGINE_V1"
      prohibition:
        - "consensus_result=NO_BUY 종목에 BUY/ADD_ON 권고 금지"
        - "block_reasons 3관점 미인용 시 INCOMPLETE_EJCE_REPORT"
        - "buy_permission=ALLOW만 확인하고 ejce_json 확인 생략 금지"
      canonical_ref: "AGENTS.md:Direction EJ1"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] SCRS-V2 - 현금확보 최적 매도조합 =============
    SMART_CASH_RECOVERY_SELL_ENGINE_V2:
      purpose: >
        현금부족(cashShortfallInfo) 상황에서 value_damage_score 최소화 조합을
        결정론적으로 산출. K2 50/50 분할(immediate_sell_qty + rebound_wait_qty) 포함.
        LLM이 "이 종목 N주 팔면 될 것 같다"는 즉석 계산 HS011 위반으로 금지.
      inputs:
        - {field: "holdings",          unit: "array"}
        - {field: "dfMap",             unit: "object"}
        - {field: "cashShortfallInfo", unit: "object"}
        - {field: "h2",                unit: "object - regime layer"}
      output:
        field: "scrs_v2_json"
        schema:
          emergency_level:  "TRIM_ONLY | FULL_RECOVERY | NO_ACTION"
          selected_combo:   "array of {ticker, immediate_sell_qty, rebound_wait_qty, value_damage_score, rebound_potential, recommended_action}"
          total_recovery_krw: "integer"
          formula_id:       "SMART_CASH_RECOVERY_SELL_ENGINE_V2"
      prohibition:
        - "selected_combo 외 추가 매도 LLM 임의 추가 금지"
        - "emergency_level=TRIM_ONLY 시 selected_combo 외 추가 매도 절대 금지"
        - "immediate_sell_qty + rebound_wait_qty 합산해 '전체 X주 매도' 단순화 금지"
      canonical_ref: "AGENTS.md:Direction C3"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] MRAG-V2 - 거시 국면 적응 게이트 =============
    MACRO_REGIME_ADAPTIVE_GATE_V2:
      purpose: >
        L1(미시)·L2(거시)·L3(글로벌)·L4(이벤트) 4레이어 각 0~25점 합산
        total_mrag_score(0~100) 기반으로 heat_gate_threshold와
        position_size_scale을 결정론적으로 동적 조정.
        ME1과 MRAG-V2 중 더 엄격한 값을 effective_heat_gate_threshold로 확정.
      inputs:
        - {field: "macroJson", unit: "object - macro event data"}
        - {field: "mesResult", unit: "object - MACRO_EVENT_SYNCHRONIZER_V1 output"}
        - {field: "hApex",     unit: "object - harness apex context"}
      output:
        field: "mrag_v2_json"
        schema:
          micro_risk_score:              "integer 0~25"
          macro_risk_score_normalized:   "integer 0~25"
          global_risk_score:             "integer 0~25"
          event_risk_score:              "integer 0~25"
          total_mrag_score:              "integer 0~100"
          effective_heat_gate_threshold: "number (5|7|10|12) %"
          effective_position_size_scale: "number (0.25|0.50|1.00|1.10)"
          regime_label:                  "EXTREME_RISK|HIGH_RISK|MODERATE_RISK|LOW_RISK"
          stale_events:                  "array of {event_name, registered_date, days_stale}"
          stale_events_count:            "integer"
          formula_id:                    "MACRO_REGIME_ADAPTIVE_GATE_V2"
      prohibition:
        - "LLM이 total_mrag_score를 즉석 계산 금지 (HS011 위반)"
        - "effective_heat_gate_threshold를 LLM이 임의 완화 금지"
        - "stale_events_count>0 시 Section_B 이벤트 날짜 불일치 경보 누락 금지"
      canonical_ref: "AGENTS.md:Direction ME2"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] M5 V1.1 - 반도체 집중 비중 강제 감축 =========
    MANDATORY_REDUCTION_PLAN_V1:
      purpose: >
        반도체 클러스터 비중이 cluster_limit * 2.0 초과 시 4주 분할 감축 계획을
        결정론적으로 생성. RS_BROKEN→ETF→APEX_SUPER 우선순위로 주당 매도수량 배정.
        LLM이 "시장 보면서 결정" 임의 유보 금지.
      inputs:
        - {field: "semiconductorClusterGate", unit: "object - cluster gate result"}
        - {field: "holdings",                 unit: "array"}
        - {field: "dfMap",                    unit: "object"}
        - {field: "h3",                       unit: "object - cash floor layer"}
        - {field: "totalAsset",               unit: "KRW integer"}
      output:
        field: "mandatory_reduction_json"
        schema:
          is_mandatory:               "boolean"
          current_cluster_pct:        "number %"
          cluster_limit_pct:          "number %"
          current_excess_pct:         "number %p"
          weekly_reduction_target_krw: "integer KRW"
          reduction_priority:         "array of {ticker, reason, weekly_sell_qty}"
          formula_id:                 "MANDATORY_REDUCTION_PLAN_V1"
      prohibition:
        - "is_mandatory=true 시 4주 감축 계획 미이행 금지"
        - "LLM이 reduction_priority 순서 임의 변경 금지"
        - "weekly_reduction_target_krw LLM 재계산 금지 (HS011 위반)"
      canonical_ref: "AGENTS.md:Direction A2 (M5 V1.1)"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] DSLE-V1 - 결정론적 서빙 잠금 =================
    DETERMINISTIC_SERVING_LOCK_ENGINE_V1:
      purpose: >
        11개 스테이지 토큰 및 numeric_generation_allowed=0을 통해
        LLM이 가격·수량·수익률 등 모든 숫자를 자체 생성하는 것을 완전 차단.
        LLM 역할을 NARRATE_HARNESS_OUTPUT·SYNTHESIZE_RISK_CONTEXT·PRESENT_SCENARIO로 한정.
      inputs:
        - {field: "hApex",         unit: "object - harness apex context"}
        - {field: "capturedAtIso", unit: "ISO8601 string"}
        - {field: "now",           unit: "Date object"}
      output:
        field: "serving_lock_json"
        schema:
          lock_status:      "LOCKED | UNLOCKED"
          llm_role:         "CLERK_REPORTER"
          llm_serving_budget:
            numeric_generation_allowed: "integer (always 0)"
            allowed_operations: "array ['NARRATE_HARNESS_OUTPUT','SYNTHESIZE_RISK_CONTEXT','PRESENT_SCENARIO']"
          stage_tokens:     "array of 11 token objects"
          formula_id:       "DETERMINISTIC_SERVING_LOCK_ENGINE_V1"
      prohibition:
        - "numeric_generation_allowed=0 무시하고 LLM 숫자 생성 절대 금지"
        - "stage_tokens에 없는 행동 LLM이 권고 금지"
        - "serving_lock_json.lock_status=LOCKED 시 LLM 계산 우회 선언 금지"
      canonical_ref: "AGENTS.md:Direction D3"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] HS007 - 조건부 접속사 Hard-Lock =============
    VALIDATE_ORDER_CONDITION_V1:
      purpose: >
        주문 조건 텍스트에 다중 조건 접속사('또는', '동시 충족', '실패 시' 등)가
        포함되면 INVALID_MULTI_CONDITION 반환. HTS 자동주문은 단일 지정가만 허용.
      inputs:
        - {field: "order_condition_text", unit: "string - 주문 조건 텍스트"}
      output:
        field: "order_condition_validation"
        schema:
          valid:                "boolean"
          status:               "OK | INVALID_MULTI_CONDITION"
          matched_conjunctions: "array of strings"
          resolution:           "string - 단일 조건 기재 안내"
          formula_id:           "VALIDATE_ORDER_CONDITION_V1"
      prohibition:
        - "INVALID_MULTI_CONDITION 판정된 행을 HTS 주문표에 포함 금지"
        - "LLM이 복합 조건을 단일 조건으로 재해석하여 통과 처리 금지"
      canonical_ref: "AGENTS.md:Direction 0 (HS007)"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] H10 - 그림자 원장(Shadow Ledger) =============
    SHADOW_LEDGER_V1:
      purpose: >
        BLOCKED/INVALID 블루프린트를 HTS 주문표에서 제외하되, 차단 사유 및
        산출 지표를 투명하게 보존. 사용자의 사후 평가·오버라이드를 지원.
      inputs:
        - {field: "blueprints",    unit: "array - order_blueprint_json"}
        - {field: "dfMap",         unit: "object - 종목별 data feed map"}
      output:
        field: "shadow_ledger_json"
        schema:
          shadow_ledger:   "array of blocked entries"
          blocked_count:   "integer"
          formula_id:      "SHADOW_LEDGER_V1"
        shadow_ledger_row:
          ticker:              "종목 코드"
          name:                "종목명"
          block_reason:        "차단 사유 코드"
          order_type:          "BUY | SELL | TRIM 등"
          limit_price_calc:    "산출 지정가 (KRW)"
          stop_loss_calc:      "산출 손절가 (KRW)"
          take_profit_calc:    "산출 익절가 (KRW)"
          base_qty_calc:       "이론 수량 (주)"
          override_possible:   "true - 사용자 오버라이드 가능"
      prohibition:
        - "BLOCKED 종목의 산출 지표를 null 처리하거나 은폐 금지 (HS010 위반)"
        - "Shadow Ledger 종목을 HTS 주문표에 포함 금지"
      canonical_ref: "AGENTS.md:Direction H10 (HS010_REVISED)"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] D2 - LLM 12가지 금지행동 잠금 =================
    LLM_SERVING_CONSTRAINT_V1:
      purpose: >
        LLM의 역할을 하네스 출력 복사·해설·위험 합성으로 엄격히 제한.
        12가지 금지행동 체크리스트를 보고서 조립 직전 GAS가 평가하여
        위반 가능성이 있으면 INVALID_LLM_OVERRIDE 태그를 반환.
      inputs:
        - {field: "hApex", unit: "object - harness apex context (전체 하네스 결과)"}
      output:
        field: "llm_serving_constraint_json"
        schema:
          constraint_status:  "PASS | WARN | INVALID_LLM_OVERRIDE"
          violations:         "array of {check, rule, status}"
          violation_count:    "integer"
          warn_count:         "integer"
          total_checks:       "12"
          formula_id:         "LLM_SERVING_CONSTRAINT_V1"
      prohibition:
        - "constraint_status=INVALID_LLM_OVERRIDE 시 보고서 계속 생성 금지"
        - "violations 목록을 LLM이 임의로 해제·무시 금지"
      canonical_ref: "AGENTS.md:Direction D2"
      version: "2026-05-24_PROPOSAL50"

    # == [2026-05-24_PROPOSAL50] H6 - 거래대금 급증 과열신호 =================
    AVG_TRADE_VALUE_SIGNAL_V1:
      purpose: >
        secular_leader(005930·000660) PROFIT_LOCK_STAGE_20 구간에서
        5일 평균 거래대금 > 20일 평균 × 3.0이면 과열신호 +1 판정.
        4개 과열신호 합산 판정에 반영하여 APEX_SUPER 구간 부분익절 허용 여부를 결정.
      inputs:
        - {field: "ticker",           unit: "string"}
        - {field: "avg_trade_val_5d",  unit: "KRW - 5일 평균 거래대금"}
        - {field: "avg_trade_val_20d", unit: "KRW - 20일 평균 거래대금"}
        - {field: "profit_lock_stage", unit: "string - PROFIT_LOCK_STAGE_20 여부 확인"}
      expressions:
        ratio_5d_vs_20d: "avg_trade_val_5d / avg_trade_val_20d"
        overheat_triggered: "ratio_5d_vs_20d >= 3.0"
        overheat_score_add: "1 if overheat_triggered else 0"
      output:
        field: "avg_trade_val_signal_json"
        schema:
          ticker:              "종목 코드"
          applicable:          "boolean - secular_leader AND STAGE_20 여부"
          signal:              "OVERHEAT_TRADE_VALUE | NORMAL | NOT_APPLICABLE"
          ratio_5d_vs_20d:     "number"
          overheat_triggered:  "boolean"
          overheat_score_add:  "0 or 1"
          formula_id:          "AVG_TRADE_VALUE_SIGNAL_V1"
      prohibition:
        - "LLM이 overheat_signals를 재집계·번복 금지 (하네스 산출값 우선)"
        - "secular_leader 이외 종목에 적용 금지"
      canonical_ref: "AGENTS.md:Direction H6"
      version: "2026-05-24_PROPOSAL50"

    # == [PROPOSAL51] P0-B - 매도 주문 3중 가격 검증 =============================
    SELL_PRICE_SANITY_V2:
      purpose: >
        buildOrderBlueprint_ 산출 매도/STOP_LOSS 주문에 대해 3조건 가격 역전을 검증.
        validation_status를 인라인 재기록하여 EXPORT_GATE가 자동 차단.
        LLM이 가격 역전 주문을 HTS에 입력하는 사고를 원천 차단.
      inputs:
        - {field: "limit_price",         unit: "KRW - 지정가"}
        - {field: "stop_price",          unit: "KRW - 손절가"}
        - {field: "auto_trailing_stop",  unit: "KRW - profit_preservation 자동 추적 손절가"}
      checks:
        CHECK_1: "limit_price < final_stop → INVALID_PRICE_INVERSION"
        CHECK_2: "stop_price < auto_trailing_stop → INVALID_TRAILING_STOP_BREACH"
        CHECK_3: "limit_price == 0 → INVALID_ZERO_PRICE"
      output:
        field: "spsv2_verdict"
        values:
          SPSV2_PASS: "3조건 모두 통과"
          INVALID_PRICE_INVERSION: "지정가 < 최종 손절가 - 역전"
          INVALID_TRAILING_STOP_BREACH: "손절가 < auto_trailing_stop - 추적 손절 위반"
          INVALID_ZERO_PRICE: "지정가=0 - 미확정 가격"
          NOT_SELL_SKIP: "SELL/STOP_LOSS 외 주문 - 검증 스킵"
      prohibition:
        - "SPSV2 검증 전 Export Gate 실행 금지"
        - "INVALID 상태 주문의 HTS 입력 절대 금지"
      gs_function: "calcSellPriceSanityV2_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P1-A - Export Gate V2 ======================================
    EXPORT_GATE_V2:
      purpose: >
        EXPORT_READY / REVIEW_ONLY / PENDING_EXPORT 3단계 분류.
        V1 5개 체크 → V2 8개 체크 (SCRS 렌더링, 헬스 스코어 타입, 클러스터 동기화 추가).
        REVIEW_ONLY: WARN 체크 있음 (HTS 입력 전 검토 필요). hts_entry_allowed=false.
      checks:
        CHECK_1: "account_snapshot 캡처 완료"
        CHECK_2: "데이터 완성도 (buy_permission_json ≥ holdings)"
        CHECK_3: "consistency_score >= 70"
        CHECK_4: "INVALID 매도 주문 없음 (SPSV2 후)"
        CHECK_5: "cash_floor_status != UNKNOWN"
        CHECK_6: "SCRS-V2 immediate_sell_qty 유효값 확인"
        CHECK_7: "portfolio_health_score 숫자형 확인"
        CHECK_8: "SEMICONDUCTOR_CLUSTER_SYNC 정합성 확인"
      tiers:
        EXPORT_READY: "모든 체크 PASS - HTS 입력 허용"
        REVIEW_ONLY: "WARN 체크 존재, FAIL 없음 - 검토 후 진행"
        PENDING_EXPORT: "FAIL 체크 존재 - HTS 입력 금지"
      gs_function: "calcExportGate_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P0-C - 반도체 클러스터 단일 소스 동기화 =====================
    SEMICONDUCTOR_CLUSTER_SYNC_V1:
      purpose: >
        SEMICONDUCTOR_CLUSTER_GATE_V1 결과 ↔ MANDATORY_REDUCTION_PLAN_V1 is_mandatory 정합성 보장.
        combined_pct > cap_pct * 2 → is_mandatory=true 강제.
        단일 소스(클러스터 게이트)가 의무 감축 여부를 결정.
      inputs:
        - {field: "cluster_pct",       unit: "% - mandatory_reduction_json.cluster_pct"}
        - {field: "cluster_limit_pct", unit: "% - mandatory_reduction_json.cluster_limit_pct"}
        - {field: "is_mandatory",      unit: "boolean - 교정 전 값"}
      expression: "cluster_pct > cluster_limit_pct * 2 ? is_mandatory=true : is_mandatory=false"
      output:
        field: "cluster_sync_result_json"
        schema:
          status: "SYNCED | CORRECTED"
          corrected: "boolean"
          cluster_pct: "number"
          threshold_pct: "cluster_limit_pct * 2"
      gs_function: "syncSemiconductorCluster_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P2-B - 사전 분배 레이더 V2 =================================
    PROACTIVE_SELL_RADAR_V2:
      purpose: >
        8가지 신호로 분배(설거지) 3일 전 조기 감지 → CRITICAL/WARNING/WATCH/CLEAR 분류.
        DISTRIBUTION_SELL_DETECTOR V1.1 (사후 확인) 보완 - 사전 예측 기능.
      signals:
        SIG_1: "고가 2% 이내 + 거래량 30% 수축 (weight=2.0)"
        SIG_2: "기관 5일 순매도 전환 (weight=2.0)"
        SIG_3: "개인 집중유입 70% 초과 (weight=1.5)"
        SIG_4: "풋/콜 비율 1.3 초과 (weight=1.5)"
        SIG_5: "뉴스 감성 -20 미만 (weight=1.0)"
        SIG_6: "거래량 1.5x 급증 + 음봉 (weight=1.5)"
        SIG_7: "RSI 70이상 + 5일 수익률 음수 (weight=1.5)"
        SIG_8: "auto_trailing_stop 2% 이내 근접 (weight=2.0)"
      levels:
        CRITICAL: "weighted_sum >= 5.0 - 즉시 매도 검토"
        WARNING: "weighted_sum >= 3.0 - 감축 계획 수립"
        WATCH: "weighted_sum >= 1.5 - 주의 모니터링"
        CLEAR: "weighted_sum < 1.5 - 정상"
      gs_function: "calcProactiveSellRadarV2_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P2-A - 뒷박 차단 게이트 V3 ================================
    ANTI_LATE_ENTRY_GATE_V3:
      purpose: >
        V2의 3게이트(velocity_1d/velocity_5d/distribution_ws) + GATE_4(PAE) + GATE_5(블랙리스트) →
        V3: GATE_6(매크로 레짐) 추가. EVENT_SHOCK/RISK_OFF → 신규 매수 BLOCK.
        6게이트 AND 조건: 모두 통과해야 PASS. 하나라도 BLOCK → 전체 BLOCK.
      gates:
        GATE_1: "velocity_1d >= 3.0% → BLOCK_CHASE"
        GATE_2: "velocity_5d >= 8.0% → BLOCK_CHASE_5D"
        GATE_3: "dist_weighted_sum >= 3.0 → BLOCK_DISTRIBUTION"
        GATE_4: "PAE synthesis_verdict == EXIT/TRIM → BLOCK"
        GATE_5: "패턴 블랙리스트 TRIGGERED → BLOCK"
        GATE_6: "매크로 EVENT_SHOCK/RISK_OFF → BLOCK"
      quantity_scaling:
        GATE_4_WARN: "direction_confidence < -10 → qty_scale=0.5"
        GATE_6_WARN: "MACRO_CAUTION → qty_scale=0.7"
      gs_function: "applyAlegGate4And5Impl_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P0-D - 5계층 가격 단일화 잠금 ===========================
    PRICE_HIERARCHY_LOCK_V1:
      purpose: >
        동일 종목의 가격을 5계층으로 분리 잠금.
        LAYER_1(주문가)만 HTS 지정가로 사용. LAYER_5(참고방어가)가 LAYER_1 위치에 나타나면
        INVALID_LAYER_VIOLATION - 표간 가격 혼재 완전 차단.
      layers:
        LAYER_1: "order_blueprint_json.limit_price - HTS 주문표 지정가 전용"
        LAYER_2: "prices_json.stop_price / tp1_price / tp2_price - 손절/익절 원장"
        LAYER_3: "profit_preservation_json.auto_trailing_stop - LAYER_2 손절가 하한 보정용"
        LAYER_4: "scrs_v2_json.rebound_trigger_price - SCRS-V2 반등대기 트리거 전용"
        LAYER_5: "proposal_reference.reference_defense_price - WATCH 감시 원장 참고방어가 전용"
      violation_types:
        INVALID_LAYER_VIOLATION: "LAYER_5==LAYER_1 또는 LAYER_4==LAYER_2"
        LAYER_PROXIMITY_WARNING: "LAYER_5와 LAYER_1이 5% 이내 근접"
      output_contract:
        price_hierarchy_json: "배열: 종목별 5계층 가격 + layer_violations"
      gs_function: "applyPriceHierarchyLockAll_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P1-B - 데이터 완성도 필드충족률 게이트 ==================
    DATA_QUALITY_GATE_V2:
      purpose: >
        핵심 8개 카테고리(prediction/trade_quality/pattern/stop_loss/cash/sell_engine/cluster/alpha_eval)의
        필드 충족률로 데이터 완성도 등급 산출. 행수 기준 "정상" 표현 완전 폐기.
        T+20=0건, trade_quality=0건 시 특수 경고 발동.
      categories:
        prediction:    "[direction_confidence, synthesis_verdict, thesis_score, antithesis_score]"
        trade_quality: "[grade, feedback_tag, t5_return_pct, t20_vs_core_pct]"
        pattern:       "[pattern_blacklist_status, accumulated_poor_count]"
        stop_loss:     "[auto_trailing_stop, final_stop_price, stop_price]"
        cash:          "[settlement_cash_d2_krw, cash_floor_status, cash_shortfall_min_krw]"
        sell_engine:   "[scrs_v2_verdict, immediate_qty, rebound_wait_qty]"
        cluster:       "[cluster_state, combined_pct]"
        alpha_eval:    "[alpha_gate_verdict, prediction_accuracy_rate]"
      grades:
        COMPLETE:      "overall_completeness_pct >= 90"
        PARTIAL:       "overall_completeness_pct >= 60"
        INSUFFICIENT:  "overall_completeness_pct < 60"
      output_contract:
        data_quality_gate_v2_json:
          fields: "[overall_completeness_pct, completeness_grade, category_scores, special_warnings, confidence_ceiling]"
      gs_function: "calcDataQualityGateV2_"
      version: "2026-05-25_PROPOSAL51"

    # == [PROPOSAL51] P1-C - 현금회복 금액 3분리 표시 잠금 ===================
    CASH_RECOVERY_DISPLAY_LOCK_V1:
      purpose: >
        현금회복 금액을 min_required / optimal_combo / reference_total 3분리 표시.
        trim_plan 누적 전체 금액(예: 207억)을 주문 섹션에 표시하는 것을 완전 차단.
        reference_total_krw는 "주문 아님" 레이블 강제.
      display_rules:
        SECTION_CASH_RECOVERY: "min_required_krw + optimal_combo_krw만 표시 (SCRS-V2 즉시매도 합계)"
        SECTION_REFERENCE_TRIM: "reference_total_krw - '참고용 전체 후보 누적 - 주문 아님'"
      consistency_checks:
        UNCOVERED:   "optimal_combo < min_required → CASH_SHORTFALL_UNCOVERED"
        OVER_SELL:   "optimal_combo > min_required*2 → OVER_SELL_WARNING"
      output_contract:
        cash_recovery_display_json:
          fields: "[min_required_krw, optimal_combo_krw, reference_total_krw, coverage_status, display_mode]"
      gs_function: "calcCashRecoveryDisplayLock_"
      version: "2026-05-25_PROPOSAL51"

    FUNDAMENTAL_QUALITY_GATE_V1:
      purpose: "펀더멘털 품질 점수화로 BUY 허용을 결정론적으로 잠금."
      inputs:
        - {field: "holdings", unit: "array"}
        - {field: "dfMap", unit: "object"}
      output:
        field: "fundamental_quality_json"
      output_contract:
        fundamental_quality_json:
          fields: "[rows[].ticker, rows[].grade, rows[].buy_allowed, rows[].fail_reasons]"
      gs_function: "calcFundamentalQualityGateV1_"
      version: "2026-05-25_PROPOSAL53"

    HORIZON_ALLOCATION_LOCK_V1:
      purpose: "단기/중기/장기 버킷 비중 상한 위반을 잠금."
      inputs:
        - {field: "holdings", unit: "array"}
        - {field: "total_asset_krw", unit: "KRW"}
      output:
        field: "horizon_allocation_json"
      output_contract:
        horizon_allocation_json:
          fields: "[bucket_summary[].bucket, bucket_summary[].cap_pct, bucket_summary[].current_pct, bucket_summary[].violation]"
      gs_function: "calcHorizonAllocationLockV1_"
      version: "2026-05-25_PROPOSAL53"

    SMART_MONEY_LIQUIDITY_GATE_V1:
      purpose: "스마트머니 흐름과 유동성 결합으로 실행 모드(NORMAL/SELL_SPLIT_ONLY) 고정."
      inputs:
        - {field: "holdings", unit: "array"}
        - {field: "proactive_sell_radar_json", unit: "json"}
      output:
        field: "smart_money_liquidity_json"
      output_contract:
        smart_money_liquidity_json:
          fields: "[rows[].flow_state, rows[].liquidity_state, rows[].execution_mode, rows[].buy_allowed]"
      gs_function: "calcSmartMoneyLiquidityGateV1_"
      version: "2026-05-25_PROPOSAL53"

    ROUTING_SERVING_DECISION_TRACE_V2:
      purpose: "라우팅-서빙-게이트 경로를 단일 trace json으로 고정."
      inputs:
        - {field: "routing_trace_json", unit: "json"}
        - {field: "export_gate_json", unit: "json"}
      output:
        field: "routing_serving_trace_v2_json"
      output_contract:
        routing_serving_trace_v2_json:
          fields: "[request_route, bundle_selected, prompt_entrypoint, gate_path, final_block_reason, json_validation_status]"
      gs_function: "buildRoutingServingDecisionTraceV2_"
      version: "2026-05-25_PROPOSAL53"

    FUNDAMENTAL_MULTI_FACTOR_SCORE_V2:
      purpose: "이익률·성장률·점유율·현금흐름·부채 종합 점수로 BUY 잠금."
      output_contract:
        fundamental_multifactor_json:
          fields: "[rows[].ticker, rows[].score_0_100, rows[].grade, rows[].buy_allowed, rows[].fail_reasons]"
      gs_function: "calcFundamentalMultiFactorScoreV2_"
      version: "2026-05-25_PROPOSAL54"

    EARNINGS_GROWTH_QUALITY_GATE_V1:
      purpose: "이익 성장 추세 일관성 게이트."
      output_contract:
        earnings_growth_quality_json:
          fields: "[rows[].ticker, rows[].trend, rows[].consistency, rows[].gate]"
      gs_function: "calcEarningsGrowthQualityGateV1_"
      version: "2026-05-25_PROPOSAL54"

    MARKET_SHARE_MOMENTUM_PROXY_V1:
      purpose: "점유율 모멘텀 프록시로 공격 매수 차단."
      output_contract:
        market_share_proxy_json:
          fields: "[rows[].ticker, rows[].proxy_state, rows[].confidence_band]"
      gs_function: "calcMarketShareMomentumProxyV1_"
      version: "2026-05-25_PROPOSAL54"

    CASHFLOW_STABILITY_GATE_V1:
      purpose: "현금흐름 안정성 + 회계위험 결합 게이트."
      output_contract:
        cashflow_stability_json:
          fields: "[rows[].ticker, rows[].stability_state, rows[].accrual_risk_flag, rows[].gate]"
      gs_function: "calcCashflowStabilityGateV1_"
      version: "2026-05-25_PROPOSAL54"

    ROUTING_DECISION_EXPLAIN_LOCK_V1:
      purpose: "최종 의사결정 게이트 경로/차단사유 잠금."
      output_contract:
        routing_decision_explain_json:
          fields: "[gate_path, blocked_by, override_allowed]"
      gs_function: "calcRoutingDecisionExplainLockV1_"
      version: "2026-05-25_PROPOSAL54"

    # === Phase-4~5 신규 하네스 게이트 매핑 (2026-05-28) =======================

    TRADE_QUALITY_FROM_T5_V1:
      purpose: >
        운영 T+5 실측 기반 거래품질 점수. T+20 성숙 전 bridge.
        gate=PASS: scored_count >= 30.
      output_contract:
        Temp/trade_quality_from_t5_v1.json:
          fields: "[gate, summary_score, scored_count, trade_quality_basis, per_ticker[]]"
      python_tool: "tools/build_trade_quality_from_t5_v1.py"
      harness_check: "CHECK_74_TRADE_QUALITY_FROM_T5_V1"
      version: "2026-05-28_PHASE4"

    PREDICTION_ACCURACY_HARNESS_V2:
      purpose: >
        운영 T+1/T+5/T+20 일치율 회전 윈도 + calibration_state.
        calibration_state가 BUY_PROPOSAL_FROZEN_RECOMMEND이면 매수 동결 권고.
      output_contract:
        Temp/prediction_accuracy_harness_v2.json:
          fields: "[calibration_state, t1_op_rate, t5_op_rate, t20_op_rate, windows.*]"
      python_tool: "tools/build_prediction_accuracy_harness_v2.py"
      harness_check: "CHECK_75_PREDICTION_ACCURACY_HARNESS_V2"
      version: "2026-05-28_PHASE4"

    MACRO_EVENT_TICKER_IMPACT_V1:
      purpose: >
        거시이벤트 종목별 영향. action_gate=AVOID_NEW_BUY: 사전 5영업일 매수 차단 권고.
        뒷박 5중 AND 게이트의 macro_event 1표.
      output_contract:
        Temp/macro_event_ticker_impact_v1.json:
          fields: "[gate, ticker_count, action_summary, tickers[].primary_gate, tickers[].impact_score]"
      python_tool: "tools/build_macro_event_ticker_impact_v1.py"
      harness_check: "CHECK_76_MACRO_EVENT_TICKER_IMPACT_V1"
      version: "2026-05-28_PHASE4"

    SELL_WATERFALL_ENGINE_V2:
      purpose: >
        V1 4단계 + 슬리피지/exec_mode/에스컬레이션.
        escalation_skip_violations=0 필수.
      output_contract:
        Temp/sell_waterfall_engine_v2.json:
          fields: "[gate, rows[].stage, rows[].exec_mode, rows[].split_count, rows[].est_slippage_bps, rows[].escalation_rule]"
      python_tool: "tools/build_sell_waterfall_engine_v2.py"
      harness_check: "CHECK_77_SELL_WATERFALL_ENGINE_V2"
      version: "2026-05-28_PHASE4"

    LLM_NARRATIVE_TEMPLATE_LOCK_V1:
      purpose: >
        서술 금지어휘(같다/약간/곧 등) 스캔. total_violations=0 필수.
        gate=PASS: narrative 결정론 잠금.
      output_contract:
        Temp/llm_narrative_template_lock_v1.json:
          fields: "[gate, total_violations, sections_checked, section_results[]]"
      python_tool: "tools/build_llm_narrative_template_lock_v1.py"
      harness_check: "CHECK_78_LLM_NARRATIVE_TEMPLATE_LOCK_V1"
      version: "2026-05-28_PHASE5"

    EJCE_DIVERGENCE_AUDIT_V1:
      purpose: >
        EJCE 3관점 합의 진정성. homogeneous_flag=true 또는 unique_reason_pct<60%이면 경고.
        gate=WARN은 soft(hard-fail 아님).
      output_contract:
        Temp/ejce_divergence_audit_v1.json:
          fields: "[gate, unique_reason_pct, homogeneous_flag, analyst_view_homogeneous, ticker_results[]]"
      python_tool: "tools/build_ejce_divergence_audit_v1.py"
      harness_check: "CHECK_79_EJCE_DIVERGENCE_AUDIT_V1"
      version: "2026-05-28_PHASE5"

    PREDICTIVE_ALPHA_REPORT_LOCK_V2:
      purpose: >
        PA1 정반합 표 강제. coverage_pct >= 80% 필요(ETF 제외 시 90.9% 달성).
        weight_source=DYNAMIC 컬럼 의무.
      output_contract:
        Temp/predictive_alpha_report_lock_v2.json:
          fields: "[gate, coverage_pct, pa1_report_table[].thesis_signals, pa1_report_table[].antithesis_signals, pa1_report_table[].synthesis_score]"
      python_tool: "tools/build_predictive_alpha_report_lock_v2.py"
      harness_check: "CHECK_80_PREDICTIVE_ALPHA_REPORT_LOCK_V2"
      version: "2026-05-28_PHASE5"

    CANONICAL_METRICS_V1:
      purpose: >
        단일 진실원천 아키텍처. 논리 지표를 정규 원천에서 산출해 렌더러 중복 읽기 버그 차단.
        gate=PASS(unresolved=0) / gate=WARN(unresolved>0).
      output_contract:
        Temp/canonical_metrics_v1.json:
          fields: "[gate, metrics.cluster_pct, metrics.cash_min_required_krw, metrics.cash_reference_total_krw, per_ticker.*, resolved_count, unresolved]"
      python_tool: "tools/build_canonical_metrics_v1.py"
      harness_check: "CHECK_89_CANONICAL_METRICS_RESOLVED"
      version: "2026-05-29_PHASE7"

    CROSS_SECTION_CONSISTENCY_V1:
      purpose: >
        교차섹션 정합성 게이트. canonical 지표가 여러 섹션에서 동일하게 렌더됐는지 검증.
        enforcement_mode_until 이전 WARN, 이후 FAIL. score=100 목표.
      output_contract:
        Temp/cross_section_consistency_v1.json:
          fields: "[gate, score, conflict_count, conflicts[], forbidden_uniform_labels, incomplete_tables, enforcement_mode_until]"
      python_tool: "tools/build_cross_section_consistency_v1.py"
      harness_check: "CHECK_90_CROSS_SECTION_CONSISTENCY"
      version: "2026-05-29_PHASE7"

    ALPHA_FEEDBACK_LOOP_V2:
      purpose: >
        T5 운영 데이터 기반 PA1 팩터 가중치 조정 권고 생성.
        기존 V1(T20 전용)을 확장해 T5≥10건으로 즉시 동작.
        AFL 원칙: 권고만 출력, 자동 적용 금지.
      output_contract:
        Temp/alpha_feedback_loop_v2.json:
          fields: "[status, cases_analyzed, active_signal_rate_pct, passive_signal_rate_pct, pa1_current_ratio, recommended_adjustments[]]"
      python_tool: "tools/build_alpha_feedback_loop_v2.py"
      version: "2026-05-30_Work7"

    DYNAMIC_VALUE_PRESERVATION_SELL_V6:
      purpose: >
        단순 맹목적 매도(V5) 폐기. 최신 알고리즘 매도 기법(VWAP/TWAP 기반 지지선 연동) 도입.
        현금 확보 시 종목의 Rebound_Elasticity_Score (반등 탄력 점수)를 계산하여 RSI < 30 및 이격도 과대 종목은
        절대 즉시 매도 금지(EXECUTE_REBOUND_ONLY 강제). 호가창(Tick) 유동성을 고려한
        Dynamic Limit Price = Close + (ATR20 * 0.2) 산출하여 값 고정. LLM의 주관 개입 0% 통제.
      inputs: []
      output:
        field: "dynamic_value_preservation_sell_v6_json"
      output_contract:
        Temp/dynamic_value_preservation_sell_v6.json:
          fields: "[formula_id, status, execution_allowed, selected_sell_combo, cash_recovered_krw, value_damage_pct_avg]"
      python_tool: "tools/build_dynamic_value_preservation_sell_v6.py"
      version: "2026-05-31_Advanced1"

    PREDICTIVE_ALPHA_DIALECTIC_ENGINE_V2:
      purpose: >
        단순 정반합 강세/약세 합산 탈피. 거시 경제(Macro) 국면에 따라 팩터 가중치 동적 변환(Regime-Switching).
        국면이 RISK_OFF일 때 펀더멘털 점수 무시, 유동성(Liquidity) 및 스마트머니 점수 가중치 2.5배 상향.
        반환된 synthesis_verdict가 BEARISH이면 어떠한 예외 없이 ALLOW_EXECUTION = FALSE 하드락 적용.
      inputs: []
      output:
        field: "predictive_alpha_engine_v2_json"
      output_contract:
        Temp/predictive_alpha_engine_v2.json:
          fields: "[formula_id, rows, gate, numeric_generation_allowed]"
      python_tool: "tools/build_predictive_alpha_dialectic_engine_v2.py"
      version: "2026-05-31_Advanced2"

    CAPITAL_STYLE_TIME_STOP_V1:
      purpose: >
        투자 방법(단타/스윙/중장기) 결정론적 분리 및 진입 시점부터 타이머 작동.
        SCALP(단타)로 진입한 종목이 T+3일 내 목표가(TP) 미도달 시 수익률 무관 무조건 TIME_STOP_EXIT 발송.
        LLM 변명 불가, "타임스탑 청산" 단답형 출력 강제.
      inputs: []
      output:
        field: "capital_style_time_stop_v1_json"
      output_contract:
        Temp/capital_style_time_stop_v1.json:
          fields: "[formula_id, rows, gate]"
      python_tool: "tools/build_capital_style_time_stop_v1.py"
      version: "2026-05-31_Advanced3"

    EXECUTION_INTEGRITY_GATE_V1:
      purpose: >
        결정론적 직렬화 라우팅 통합 게이트. 파편화된 게이트들을 단일 파이프라인으로 통합하여
        단 하나의 조건이라도 실패 시 전체 JSON 출력을 null 처리 및 PENDING_EXPORT 상태로 Lock.
        LLM 예측 원천 차단.
      inputs: []
      output:
        field: "execution_integrity_gate_v1_json"
      output_contract:
        Temp/execution_integrity_gate_v1.json:
          fields: "[formula_id, status, failed_checks]"
      python_tool: "tools/build_execution_integrity_gate_v1.py"
      version: "2026-05-31_Advanced4"

    IMPUTED_DATA_EXPOSURE_GATE_V1:
      purpose: >
        실질 입력(펀더멘털 핵심 팩터 ROE/OPM/OCF/FCF, T+20 실현성과, 거래품질·패턴·알파평가)의
        대체(imputed)·합성·PENDING 정도를 결정론적으로 측정하여, confidence_cap_basis가
        대체데이터를 가리고 있는지(정직성 결함) 폭로하는 감사 게이트.
        시스템 자체 신뢰도 캡 공식(raw × (0.4 + 0.6 × coverage))을 재사용하되, 분모를
        schema_presence 기반 investment_quality(98.65 등)가 아니라 "실질 데이터 커버리지"로
        교체하여 effective_confidence_honest를 산출한다.
        대체데이터 감지 시 long_horizon_allowed / fundamental_claim_allowed 를 false로 강제하여
        AGENTS.md "펀더멘털 결측 시 장기투자 추천 금지" 규칙을 결정론으로 집행한다.
        ENGINE_AUDIT_V1 감사 산출물 전용이며 GAS 런타임·HTS 주문 판단에는 개입하지 않는다.
      inputs: []
      formula:
        weighted_coverage: "Σ(domain_weight_d × coverage_d)  # 도메인: fundamental_core(0.30), realized_outcome(0.30), trade_quality(0.15), pattern(0.10), alpha_eval(0.15)"
        imputed_field_ratio: "1 − weighted_coverage"
        effective_confidence_honest: "raw_confidence_cap_basis × (0.4 + 0.6 × weighted_coverage)"
        gate_status: "imputed_field_ratio ≥ 0.50 → IMPUTED_DATA_BLOCK / ≥ 0.25 → IMPUTED_DATA_WARN / else PASS"
        long_horizon_allowed: "t20_sample > 0 AND fundamental_core_factor_coverage ≥ 0.50"
        fundamental_claim_allowed: "fundamental_core_factor_coverage ≥ 0.50"
      output:
        field: "imputed_data_exposure"
      output_contract:
        Temp/engine_audit_v1.json:
          fields: "[imputed_data_exposure{gate_status, imputed_field_ratio, weighted_coverage, domain_coverage, fundamental_core_factor_coverage, surrogate_outcome_ratio, effective_confidence_honest, confidence_cap_inflation_gap, long_horizon_allowed, fundamental_claim_allowed, report_render_skew, exposure_reasons}]"
      prohibition:
        - "LLM이 gate_status / effective_confidence_honest 를 재계산하거나 완화하는 것 금지"
        - "fundamental_claim_allowed=false 인데 장기·펀더멘털 우위를 단정하는 서술 금지"
      python_tool: "tools/build_engine_audit_v1.py"
      validator_tool: "tools/validate_engine_audit_v1.py"
      canonical_ref: "ENGINE_AUDIT_V1 / spec/28_imputed_data_exposure_contract.yaml"
      version: "2026-05-31_ENGINE_AUDIT_V1"

    # == 파이프라인 orphan 공식 일괄 등록 (orphan reconciliation 2026-06-03) ======

    ANTI_LATE_ENTRY_PULLBACK_GATE_V4:
      purpose: >
        뒷박/설거지 진입 차단 게이트 V4. velocity·분배신호 복합 조건으로 진입 차단.
      input_fields: [velocity_1d, velocity_5d, distribution_score]
      expected_outputs: [anti_late_entry_gate, chase_risk_score]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    ARCHITECTURE_BOUNDARIES_V2:
      purpose: >
        하네스 컴포넌트 간 의존성·권한 경계를 정의하고 위반을 감지한다.
      input_fields: [component_list, dependency_map]
      expected_outputs: [boundary_violations, architecture_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    CONFIDENCE_CALIBRATION_V2:
      purpose: >
        T+5/T+20 실적 기반 신뢰도 캘리브레이션 v2. 과신·과소신뢰 구간을 보정한다.
      input_fields: [predicted_confidence, actual_outcome, sample_count]
      expected_outputs: [calibrated_confidence, calibration_state]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DATA_QUALITY_RECONCILIATION_V1:
      purpose: >
        섹션 간 동일 의미 수치의 불일치를 탐지해 데이터 품질 조정 보고서를 산출한다.
      input_fields: [section_values, field_map]
      expected_outputs: [reconciliation_status, mismatch_fields]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DECISION_EVIDENCE_SCORE_V1:
      purpose: >
        의사결정 근거의 출처 추적 가능성과 검증 가능성을 점수화한다.
      input_fields: [decision_fields, source_paths, formula_ids]
      expected_outputs: [decision_evidence_score_v1]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DECISION_EVIDENCE_SCORE_V2:
      purpose: >
        DECISION_EVIDENCE_SCORE_V1 개선판. 비결정론 경로 탐지 추가.
      input_fields: [decision_fields, source_paths, formula_ids]
      expected_outputs: [decision_evidence_score_v2, non_deterministic_paths]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DECISION_REPLAY_SNAPSHOT_PACK_V1:
      purpose: >
        의사결정 시점 스냅샷 패키지를 생성해 재현·감사를 지원한다.
      input_fields: [decision_date, harness_context_snapshot]
      expected_outputs: [replay_snapshot_pack, snapshot_hash]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DERIVATION_VALIDITY_SCORE_V1:
      purpose: >
        order_blueprint 파생경로 커버리지와 결정론성을 종합해 파생유효성 점수를 산출한다.
      input_fields: [harness_coverage_audit, order_blueprint_json]
      expected_outputs: [derivation_validity_score, derivation_validity_grade, derivation_validity_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DFG_V1:
      purpose: >
        데이터 흐름 그래프 V1. 하네스 파이프라인 의존성 방향그래프를 산출한다.
      input_fields: [tool_list, dependency_map]
      expected_outputs: [dfg_nodes, dfg_edges, cycle_detected]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DISTRIBUTION_EXIT_PRESIGNAL_V2:
      purpose: >
        분배 국면 선행 신호를 감지해 사전 매도 권고 신호를 산출한다.
      input_fields: [flow_credit, volume_trend, price_structure]
      expected_outputs: [distribution_presignal, exit_urgency_level]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    DYNAMIC_VALUE_PRESERVATION_SELL_V3_BRIDGE:
      purpose: >
        V3 가치보존 매도와 최신 엔진 간 호환성 브리지. 하위호환 경로 유지.
      input_fields: [sell_plan_v3, current_engine_context]
      expected_outputs: [bridged_sell_plan]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    EVALUATION_HISTORY_COVERAGE_V1:
      purpose: >
        종목별·기간별 평가 이력 커버리지를 집계한다.
      input_fields: [evaluation_log, date_range]
      expected_outputs: [history_coverage_pct, coverage_by_ticker]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    EXECUTION_AUTHORITY_MATRIX_V1:
      purpose: >
        게이트별 실행 권한 매트릭스를 산출해 HTS 주문 권한을 결정론적으로 고착화한다.
      input_fields: [gate_states, execution_mode]
      expected_outputs: [execution_authority_matrix, authorized_actions]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    EXECUTION_QUALITY_HARNESS_V1:
      purpose: >
        매수·매도 실행품질(슬리피지·체결률·타이밍)을 측정해 품질 점수를 산출한다.
      input_fields: [executed_orders, benchmark_prices]
      expected_outputs: [execution_quality_score, slippage_pct]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    EXECUTION_READINESS_MATRIX_V1:
      purpose: >
        HTS 주문 실행 준비 상태를 100% 기준으로 점검하는 매트릭스를 산출한다.
      input_fields: [gate_states, sample_counts, data_completeness]
      expected_outputs: [execution_readiness_matrix, readiness_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FINAL_CONTEXT_FOR_LLM_V2:
      purpose: >
        LLM에 전달할 최종 컨텍스트 패키지 V2. numeric_generation_allowed=0 강제.
      input_fields: [harness_context, operational_report]
      expected_outputs: [final_context_for_llm, llm_serving_budget]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FINAL_DECISION_PACKET_V1:
      purpose: >
        하네스 최종 산출 패키지. 모든 게이트·주문·성과 요약을 단일 JSON으로 통합한다.
      input_fields: [all_gate_outputs, order_blueprint, operational_report]
      expected_outputs: [final_decision_packet, input_hash, execution_mode]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FINAL_EXECUTION_DECISION_V1:
      purpose: >
        최종 실행 의사결정 V1. HTS 주문표 생성 여부와 실행 모드를 결정한다.
      input_fields: [gate_states, global_execution_gate]
      expected_outputs: [final_execution_decision, execution_mode]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FINAL_EXECUTION_DECISION_V2:
      purpose: >
        최종 실행 의사결정 V2. V1 + shadow_ledger 강제 생성 추가.
      input_fields: [gate_states, global_execution_gate, shadow_ledger_data]
      expected_outputs: [final_execution_decision_v2, shadow_ledger]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FORMULA_IMPLEMENTATION_REGISTRY_V1:
      purpose: >
        공식별 GAS/Python 구현 상태를 추적하는 구현 레지스트리를 산출한다.
      input_fields: [formula_ids, implementation_map]
      expected_outputs: [implementation_registry, unimplemented_list]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    FORMULA_REGISTRY_SYNC_V1:
      purpose: >
        GAS·Python·YAML 간 공식 레지스트리 동기화 상태를 검증한다.
      input_fields: [gas_formulas, py_formulas, yaml_formulas]
      expected_outputs: [sync_status, out_of_sync_formulas]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    HARNESS_CONTEXT_VALIDATOR_V2:
      purpose: >
        하네스 컨텍스트 전체의 형식·타입·필수 필드 유효성을 검증한다 (V2).
      input_fields: [harness_context]
      expected_outputs: [validation_result, missing_fields, type_errors]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    HORIZON_ALLOCATION_GUARD_V2:
      purpose: >
        투자성향별 목표 보유기간 초과 여부를 감지해 TIME_STOP 플래그를 산출한다 (V2).
      input_fields: [entry_date, current_date, target_horizon_days]
      expected_outputs: [time_stop_flag, days_over_horizon]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    HORIZON_REBALANCE_PLAN_V1:
      purpose: >
        성향별 목표 비중 달성을 위한 리밸런싱 실행 계획을 산출한다.
      input_fields: [current_allocation, target_allocation, rebalance_threshold]
      expected_outputs: [rebalance_plan, rebalance_trades]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    HORIZON_ROUTING_LOCK_V6:
      purpose: >
        진입 국면·성향·트랜치를 결합해 매수 라우팅을 결정론적으로 고착화한다 (V6).
      input_fields: [market_regime, capital_style, tranche_phase, gate_states]
      expected_outputs: [buy_route, routing_reason_codes]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    IMPUTED_DATA_EXPOSURE_GATE_V2:
      purpose: >
        대체(imputed) 데이터 비율을 측정해 신뢰도 과장 위험을 차단하는 게이트 V2.
      input_fields: [domain_coverage, imputed_fields]
      expected_outputs: [imputed_gate_v2, effective_confidence_honest]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    INDEX_RELATIVE_HEALTH_GATE_V1:
      purpose: >
        종목의 KOSPI 대비 상대강도와 건전성을 측정해 인덱스 대비 게이트를 산출한다.
      input_fields: [ticker_return, kospi_return, relative_strength]
      expected_outputs: [index_relative_health_gate, underperformance_pct]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    INTRADAY_V1:
      purpose: >
        장중 데이터 제약(Intraday Restriction)을 적용해 장중 액션 매트릭스를 산출한다.
      input_fields: [capture_time, market_close_time, data_type]
      expected_outputs: [intraday_restriction_gate, allowed_actions]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    LATE_CHASE_ATTRIBUTION_V1:
      purpose: >
        뒷박 진입군 vs 정상 진입군의 T+5/T+20 승률 차이를 정량 측정한다.
      input_fields: [trade_ledger, entry_velocity_threshold]
      expected_outputs: [late_vs_normal_winrate_gap_pp, attribution_sample_count]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    LATE_REBOUND_BUCKET_SCORE_V1:
      purpose: >
        반등 대기 분할매도의 실제 반등 수익 회수율을 측정해 지연 반등 버킷 점수를 산출한다.
      input_fields: [rebound_wait_trades, trigger_prices, actual_sell_prices]
      expected_outputs: [late_rebound_bucket_score, rebound_capture_rate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    LLM_SERVING:
      purpose: >
        LLM 서빙 예산과 허용 범위를 정의한다. numeric_generation_allowed 포함.
      input_fields: [serving_mode, allowed_operations]
      expected_outputs: [llm_serving_budget, numeric_generation_allowed]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    MACRO_REGIME_ALIGNMENT_GATE_V2:
      purpose: >
        거시 국면과 포트폴리오 전략 정렬 여부를 측정해 국면 정합 게이트 V2를 산출한다.
      input_fields: [market_regime, strategy_regime_assumption]
      expected_outputs: [macro_regime_alignment_gate, alignment_score]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_ALPHA_CALIBRATION_V2:
      purpose: >
        실운용 alpha_lead 예측의 T+5/T+20 적중률을 측정해 알파 캘리브레이션 상태를 산출한다.
      input_fields: [alpha_predictions, actual_outcomes, sample_count]
      expected_outputs: [alpha_calibration_state, t20_pass_rate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_EVAL_QUEUE_V1:
      purpose: >
        T+20 평가 대기열을 관리해 평가 완료·미완료 건수를 추적한다.
      input_fields: [trade_log, evaluation_date]
      expected_outputs: [eval_queue, pending_count, completed_count]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_EVIDENCE_AUDIT_V1:
      purpose: >
        실운용 의사결정의 증거 추적 가능성을 감사한다.
      input_fields: [decision_log, evidence_map]
      expected_outputs: [evidence_audit_result, orphan_decisions]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_OUTCOME_LOCK_V1:
      purpose: >
        실운용 T+5/T+20 결과를 잠금 처리해 소급 수정을 방지한다.
      input_fields: [outcome_ledger, lock_date]
      expected_outputs: [locked_outcomes, lock_status]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_T20_OUTCOME_LEDGER_V1:
      purpose: >
        실운용 T+20 거래결과 원장. 실측 30건 이상 시 operational_t20로 인정한다.
      input_fields: [trade_log, t20_prices, evaluation_date]
      expected_outputs: [operational_t20_ledger, evaluated_count, pass_rate_pct]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OPERATIONAL_TRUTH_SCORE_V1:
      purpose: >
        실운용 결과 기반 진실성 점수. type_A/type_B 100%를 분리 측정한다.
      input_fields: [operational_metrics, sample_counts]
      expected_outputs: [operational_truth_score, true_100_axes, pending_axes]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    ORDER_MATH_RECONCILIATION_V1:
      purpose: >
        주문 수량·금액 계산의 정합성(round-trip 검증)을 감사한다.
      input_fields: [order_blueprint, portfolio_state]
      expected_outputs: [math_reconciliation_result, calculation_errors]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    OUTCOME_QUALITY_SCORE_V1:
      purpose: >
        T+5/T+20 실측 성과를 종합해 성과품질 점수를 산출한다.
      input_fields: [t5_outcomes, t20_outcomes, sample_counts]
      expected_outputs: [outcome_quality_score_v1, outcome_quality_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PASS_100_CRITERIA_V1:
      purpose: >
        pass_100 기준 V1. 전체 게이트·점수 100% 충족 기준을 정의한다.
      input_fields: [gate_states, metric_scores]
      expected_outputs: [pass_100_score, failed_criteria]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PERFORMANCE_MONITORING_DASHBOARD_V1:
      purpose: >
        T+5/T+20 성과 모니터링 대시보드. 주간 자동 갱신.
      input_fields: [trade_outcomes, monitoring_period]
      expected_outputs: [performance_dashboard, weekly_scorecard]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PERFORMANCE_READINESS_REPLAY_BRIDGE_V1:
      purpose: >
        replay 백필 데이터를 operational_t20 판단에 연결하는 성과준비도 브리지.
      input_fields: [replay_ledger, operational_threshold]
      expected_outputs: [performance_readiness_score, readiness_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PERF_RECOVERY_HARNESS_V1:
      purpose: >
        성과 하락 감지 시 자동 포지션 스케일 인하와 회복 계획을 산출한다.
      input_fields: [recent_performance, degradation_threshold]
      expected_outputs: [recovery_plan, scale_down_factor]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PERF_RECOVERY_OVERRIDES_V1:
      purpose: >
        성과 회복 기간 중 허용 오버라이드 목록과 조건을 정의한다.
      input_fields: [recovery_state, override_requests]
      expected_outputs: [allowed_overrides, blocked_overrides]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PHASE_CHECKS_50_60_V1:
      purpose: >
        단계별 50%·60% 체크포인트에서 중간 평가를 수행한다.
      input_fields: [completion_pct, phase_thresholds]
      expected_outputs: [phase_check_result, checkpoint_flags]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PIPELINE_RUNTIME_ANOMALY_CHECK_V1:
      purpose: >
        파이프라인 실행 중 이상 징후(지연·오류·이상값)를 탐지한다.
      input_fields: [runtime_profile, anomaly_thresholds]
      expected_outputs: [anomaly_flags, anomaly_severity]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PIPELINE_RUNTIME_CONTRACT_VALIDATOR_V1:
      purpose: >
        파이프라인 실행 결과가 계약 명세를 준수하는지 검증한다.
      input_fields: [pipeline_outputs, contract_spec]
      expected_outputs: [contract_validation_result, violations]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PIPELINE_RUNTIME_PROFILE_SUMMARY_V1:
      purpose: >
        파이프라인 실행 시간·메모리·산출물 수를 요약한다.
      input_fields: [runtime_profile]
      expected_outputs: [runtime_summary, bottleneck_steps]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PIPELINE_RUNTIME_PROFILE_V1:
      purpose: >
        파이프라인 전체 실행 프로파일을 생성한다.
      input_fields: [execution_log]
      expected_outputs: [runtime_profile, step_durations]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PORTFOLIO_HEALTH_V1:
      purpose: >
        포트폴리오 건전성 점수와 레이블(HEALTHY/CAUTION/CRITICAL)을 산출한다.
      input_fields: [gate_states, heat_pct, drawdown_pct]
      expected_outputs: [portfolio_health_score, portfolio_health_label]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    PREDICTIVE_ALPHA_DIALECTIC_ENGINE_V1_BRIDGE:
      purpose: >
        정반합 예측 엔진 V1과 V2 간 호환성 브리지.
      input_fields: [v1_output, v2_context]
      expected_outputs: [bridged_prediction, bridge_status]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    REALIZED_PERFORMANCE_V1:
      purpose: >
        실현 손익·승률·기대수익을 집계한다.
      input_fields: [closed_trades, evaluation_period]
      expected_outputs: [realized_pnl, win_rate, expectancy]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    REBOUND_SELL_EFFICIENCY_V1:
      purpose: >
        반등 대기 분할매도의 효율성(반등 포착율)을 측정한다.
      input_fields: [rebound_wait_qty, rebound_captured_qty, expected_gain]
      expected_outputs: [rebound_sell_efficiency_score, efficiency_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    REPORT_AUTHORITY_DIFF_V1:
      purpose: >
        보고서 버전 간 권한 차이를 탐지해 미인가 변경을 감지한다.
      input_fields: [report_v_prev, report_v_curr, authority_map]
      expected_outputs: [authority_diff, unauthorized_changes]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    REQUEST_RESULT_ADOPTION_V1:
      purpose: >
        사용자 요청 결과의 채택 여부와 적용 경로를 추적한다.
      input_fields: [request_log, adoption_status]
      expected_outputs: [adoption_rate, pending_requests]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    ROOT_CAUSE_ATTRIBUTION_V1:
      purpose: >
        성과 저하·게이트 실패의 근본 원인을 추적하고 귀인 분석을 수행한다.
      input_fields: [failure_events, causal_graph]
      expected_outputs: [root_causes, attribution_confidence]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    ROOT_CAUSE_RECOVERY_PLAN_V1:
      purpose: >
        근본 원인 분석 결과를 기반으로 회복 계획을 산출한다.
      input_fields: [root_causes, available_actions]
      expected_outputs: [recovery_plan, estimated_recovery_time]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    RS_V2_FUSION:
      purpose: >
        상대강도 V2 신호를 다른 기술적 신호와 융합한 복합 신호를 산출한다.
      input_fields: [rs_v2_score, tech_signals]
      expected_outputs: [rs_fusion_score, fusion_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SATELLITE_CANDIDATE_SCREEN_V1:
      purpose: >
        위성 종목 후보군을 기술·펀더멘털·수급 기준으로 스크리닝한다.
      input_fields: [universe, screening_criteria]
      expected_outputs: [satellite_candidates, screen_scores]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SCORES_HARNESS_V1:
      purpose: >
        모든 하네스 점수(quality/proof/evidence)를 단일 구조로 통합·검증한다.
      input_fields: [all_score_outputs]
      expected_outputs: [scores_harness, score_consistency_check]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SELL_ENGINE_AUDIT_V1:
      purpose: >
        매도 엔진 산출값의 결정론성·수량·가격 유효성을 감사한다.
      input_fields: [sell_engine_output, order_blueprint]
      expected_outputs: [sell_engine_audit_result, audit_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SELL_EXECUTION_QUALITY_GATE_V1:
      purpose: >
        매도 실행 품질이 슬리피지·체결률 기준을 충족하는지 검증한다.
      input_fields: [executed_sells, quality_thresholds]
      expected_outputs: [sell_execution_quality_gate, quality_score]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SELL_EXECUTION_TIMING_LOCK_V2:
      purpose: >
        매도 실행 타이밍을 과매도 구간·반등대기·긴급전량 조건에 따라 고착화한다 (V2).
      input_fields: [sell_timing_signals, emergency_condition]
      expected_outputs: [sell_timing_lock, execution_window]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SEMANTIC_FORMULA_COVERAGE_HARNESS_V1:
      purpose: >
        공식의 의미적 커버리지(입력·출력·성과 바인딩)를 측정한다.
      input_fields: [formula_ids, semantic_bindings]
      expected_outputs: [semantic_coverage_score, uncovered_formulas]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SHORT_HORIZON_OUTCOME_MONITOR_V1:
      purpose: >
        단타·단기 포지션의 T+1/T+3/T+5 성과를 실시간 모니터링한다.
      input_fields: [short_horizon_trades, monitoring_prices]
      expected_outputs: [short_horizon_outcomes, early_exit_signals]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SMART_CASH_RECOVERY_V4:
      purpose: >
        스마트 현금회복 V4. K2 분할·TRIM 우선순위·반등대기 통합.
      input_fields: [portfolio_state, cash_shortfall_krw, sell_priority]
      expected_outputs: [smart_cash_recovery_plan_v4, expected_recovery_krw]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    SMART_CASH_RECOVERY_V7:
      purpose: >
        스마트 현금회복 V7. V6 + 반도체 클러스터 게이트·베타 조정 통합.
      input_fields: [portfolio_state, cash_shortfall_krw, regime_context]
      expected_outputs: [smart_cash_recovery_plan_v7, expected_recovery_krw]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STOP_BREACH_V1:
      purpose: >
        손절가 이탈 여부를 판정해 BREACH_IMMEDIATE_EXIT 플래그를 산출한다.
      input_fields: [current_price, stop_loss_price, gap_threshold]
      expected_outputs: [stop_breach_gate, gap_pct]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_DECISION_RESULT_V3:
      purpose: >
        전략 의사결정 결과 V3를 구조화해 final_decision_packet에 통합한다.
      input_fields: [buy_decisions, sell_decisions, hold_decisions]
      expected_outputs: [strategy_decision_result_v3, decision_summary]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_EXECUTION_LOCKS_REGRESSION_V1:
      purpose: >
        전략 실행 잠금 규칙의 회귀 테스트를 수행한다.
      input_fields: [lock_rules, test_cases]
      expected_outputs: [regression_result, failed_locks]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_EXECUTION_LOCKS_V1:
      purpose: >
        전략 실행 잠금 규칙 V1. 게이트별 액션 허용/차단 매트릭스.
      input_fields: [gate_states, action_requests]
      expected_outputs: [execution_locks, blocked_actions]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_HARDENING_HARNESS_V1:
      purpose: >
        전략 경화 검증 하네스 V1. 규칙 준수·일관성·완전성을 측정한다.
      input_fields: [strategy_outputs, hardening_spec]
      expected_outputs: [hardening_score, hardening_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_HARDENING_HARNESS_V2:
      purpose: >
        전략 경화 검증 하네스 V2. V1 + LLM 의존도 추가 측정.
      input_fields: [strategy_outputs, hardening_spec, llm_fields]
      expected_outputs: [hardening_score_v2, llm_dependency_ratio]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    STRATEGY_ROUTING_AUDIT_V1:
      purpose: >
        전략 라우팅 경로의 결정론성과 권한을 감사한다.
      input_fields: [routing_decisions, authority_matrix]
      expected_outputs: [routing_audit_result, unauthorized_routes]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    TICK_NORM_V1:
      purpose: >
        TICK_NORMALIZER_V1의 별칭 식별자. 동일 로직의 코드 내 단축 참조.
      input_fields: [price, tick_table]
      expected_outputs: [normalized_price]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    TRUTHFULNESS_GUARD_V1:
      purpose: >
        거짓 100% 차단 수문장. type_B 표본 부족 축의 100% 표기를 차단한다.
      input_fields: [outcome_metrics, sample_counts, t20_source]
      expected_outputs: [truthfulness_gate, contradiction_count, violations]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    TRUTHFUL_DECISION_LEDGER_V2:
      purpose: >
        진실성 기반 의사결정 원장 V2. 거짓 100% 없이 모든 결정 근거를 기록한다.
      input_fields: [decision_log, truthfulness_check]
      expected_outputs: [truthful_ledger_v2, ledger_integrity_score]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    VALUE_PRESERVATION_SCORER_V2:
      purpose: >
        현금확보 매도의 가치훼손·반등포착을 종합해 가치보존 점수 V2를 산출한다.
      input_fields: [sell_plan, rebound_data, value_damage_pct]
      expected_outputs: [value_preservation_score_v2, preservation_gate]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    WALK_FORWARD_CALIBRATION_V1:
      purpose: >
        워크포워드 방식으로 전략 파라미터를 순차 캘리브레이션한다.
      input_fields: [historical_data, strategy_params, validation_window]
      expected_outputs: [calibrated_params, walk_forward_score]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"

    YAML_TO_CODE_COVERAGE_V1:
      purpose: >
        YAML 명세 → 코드 커버리지를 측정하고 orphan·미구현 공식을 탐지한다.
      input_fields: [yaml_formula_ids, code_text, golden_test_text]
      expected_outputs: [coverage_ratio, orphan_code_formula_count, unimplemented_rules]
      llm_allowed: cite_only
      version: "2026-06-03_ORPHAN_RECONCILE"
