meta:
  title: 은퇴자산포트폴리오 — LLM 실행용 공식 레지스트리
  parent_file: RetirementAssetPortfolio.yaml
  version: 2026-05-16-F14_peg_formula
  language: ko-KR
  timezone: Asia/Seoul
  role: canonical
  has_code_implementation: true
  code_path: tools/validate_formula_version_lifecycle_v1.py
  purpose: '핵심 투자 알고리즘을 LLM이 반복 계산할 수 있도록 공식의 입력, 출력, 단위, 누락 처리, 차단 조건을 구조화한다.

    '
formula_registry:
  policy:
    field_source: spec/12_field_dictionary.yaml
    execution_order:
    - YAML_GAS_COVERAGE_AUDIT_ENGINE_V1
    - HARNESS_DATA_FRESHNESS_GATE_V1
    - INTRADAY_ACTION_MATRIX_V1
    - FLOW_CREDIT_V1
    - MARKET_RISK_SCORE_V1
    - TARGET_CASH_PCT_V1
    - TOTAL_HEAT_V1
    - CASH_RATIOS_V1
    - PORTFOLIO_BAND_STATUS_V1
    - MEAN_REVERSION_GATE_V1
    - EXPECTED_EDGE_V1
    - RISK_BUDGET_CASCADE_V1
    - PEG_SCORE_V1
    - POSITION_SIZE_V1
    - STOP_PRICE_CORE_V1
    - TRAILING_STOP_PRICE_V1
    - PROFIT_LOCK_RATCHET_V1
    - PROFIT_RATCHET_TIERED_V2
    - TAKE_PROFIT_LADDER_V1
    - DIVERGENCE_SCORE_V1
    - OVERHANG_PRESSURE_V1
    - SECTOR_ROTATION_RADAR_V1
    - FLOW_ACCELERATION_V1
    - DISTRIBUTION_SELL_DETECTOR_V1
    - BREAKOUT_QUALITY_GATE_V2
    - FOLLOW_THROUGH_DAY_CONFIRM_V1
    - ANTI_CHASING_VELOCITY_V1
    - PULLBACK_ENTRY_TRIGGER_V1
    - BUY_TIMING_SUITABILITY_V1
    - T1_FORCED_SELL_RISK_V1
    - SELL_CONFLICT_AWARE_RECOMMENDATION_V1
    - CASH_CREATION_PURPOSE_LOCK_V1
    - CASH_RECOVERY_OPTIMIZER_V1
    - SELL_WATERFALL_ENGINE_V1
    - EXECUTION_METHOD_LADDER_V1
    - SELL_EXECUTION_TIMING_V1
    - SELL_VALUE_PRESERVATION_TIERED_V2
    - TICK_NORMALIZER_V1
    - SELL_PRICE_SANITY_V1
    - BENCHMARK_RELATIVE_TIMESERIES_V1
    - RS_RATIO_V1
    - RS_VERDICT_V2
    - SATELLITE_ALPHA_QUALITY_GATE_V1
    - SATELLITE_AGGREGATE_PNL_GATE_V1
    - ALPHA_EVALUATION_WINDOW_V1
    - PORTFOLIO_CORRELATION_GATE_V1
    - SATELLITE_LIFECYCLE_GATE_V1
    - CLA_REGIME_EXIT_CONDITION_V1
    - LLM_SERVING_CONSTRAINT_V1
    - DETERMINISTIC_ROUTING_ENGINE_V1
    - ALPHA_FEEDBACK_LOOP_V1
    - TRADE_QUALITY_SCORER_V1
    - PATTERN_BLACKLIST_AUTO_V1
    missing_policy_default: DATA_MISSING. 계산 결과를 추정하지 않는다.
    output_requirement: 각 공식은 result, inputs_used, missing_inputs, rule_id를 출력 근거에
      남긴다.
    python_harness_supplements:
      note: GAS execution_order 제외 — Python-harness 전용 보조 공식. formula_id가 코드에 직접 등장하지
        않을 수 있음.
      formulas:
      - REGIME_CONDITIONAL_MACRO_FACTOR_V1
      - REBOUND_CAPTURE_THESIS_FACTOR_V1
      - ENTRY_TIMING_DECILE_FACTOR_V1
      - SELL_SLIPPAGE_BUDGET_FACTOR_V1
      - PROFIT_GIVEBACK_RATCHET_FACTOR_V1
      # bridge_only 공식: 직접 구현이 없으며 상위 파이프라인 결과물로 표현됨
      - EXECUTION_AUTHORITY_MATRIX_V1
      - FINAL_DECISION_PACKET_V1
      - ORDER_MATH_RECONCILIATION_V1
      - REPORT_AUTHORITY_DIFF_V1
      # PY_FILES 목록에 누락된 tools/src 구현체 — Python-harness 전용
      - MACRO_EVENT_TICKER_IMPACT_V1
      - INVESTMENT_QUALITY_HEADLINE_V1
      - ALGORITHM_GUIDANCE_PROOF_V1
      - CANONICAL_ARTIFACT_RESOLVER_V1
      - COMPLETION_GAP_V1
      - DATA_GATED_PROGRESS_V1
      - HONEST_PROOF_GAP_ANALYZER_V1
      - FACTOR_LIFECYCLE_COMPLETENESS_V1
      - FACTOR_SHADOW_ELIGIBILITY_V1
      - FINAL_EXECUTION_DECISION_V2
      - FORMULA_REGISTRY_SYNC_V1
      - HORIZON_REBALANCE_PLAN_V1
      - PIPELINE_RUNTIME_PROFILE_V1
      - STRATEGY_ROUTING_AUDIT_V1
      - PORTFOLIO_TRANSITION_UTILITY_V1
      - SELL_LOT_PARETO_SELECTOR_V1
      - FORECAST_SIMULATION_ENGINE_V1
      - SECTOR_EXPOSURE_GRAPH_V1
      - LEADER_LIFECYCLE_GATE_V1
      - EXECUTION_CAPACITY_LADDER_V1
      - MODEL_GOVERNANCE_KILL_SWITCH_V1
      - SCENARIO_SHOCK_MATRIX_V1
      - TRANSITION_SET_ENUMERATOR_V1
      - IMMUTABLE_DECISION_LEDGER_V1
      - EXECUTION_PLAN_COMPILER_V1
      - STATE_VECTOR_CONSTRUCTOR_V1
      - REBALANCE_CADENCE_GATE_V1
      - WALK_FORWARD_BOOTSTRAP_V1
      - WEEKLY_LEGACY_TRANSFER_PLAN_V1
      - GOLDEN_CROSS_SIGNAL_V1
      - STRONG_CLOSE_SIGNAL_V1
      - VOLATILITY_EXPANSION_BREAKOUT_V1
      - FIFTY_TWO_WEEK_HIGH_TRIGGER_V1
      - CONSECUTIVE_STREAK_V1
      - BREAKOUT_FAILURE_STOP_V1
      - TREND_FILTER_GATE_V1
      - SHORT_INTEREST_RISK_GAUGE_V1
      - QUALITATIVE_SELL_STRATEGY_V1
      - MARKET_REGIME_CLASSIFIER_V1
      - SATELLITE_CANDIDATE_SCORE_V1
      - MICROSTRUCTURE_PRESSURE_FROM_ORDERBOOK_V1
      implementation_map:
        REGIME_CONDITIONAL_MACRO_FACTOR_V1: tools/build_predictive_alpha_dialectic_engine_v2.py:NF1
        REBOUND_CAPTURE_THESIS_FACTOR_V1: tools/build_predictive_alpha_dialectic_engine_v2.py:NF2
        ENTRY_TIMING_DECILE_FACTOR_V1: tools/build_late_chase_attribution_v1.py:NF3
        SELL_SLIPPAGE_BUDGET_FACTOR_V1: tools/build_value_preservation_scorer_v1.py:NF4
        PROFIT_GIVEBACK_RATCHET_FACTOR_V1: tools/build_ratchet_trailing_general_v1.py:NF5
        EXECUTION_AUTHORITY_MATRIX_V1: spec/13b_harness_formulas.yaml:bridge_only
        FINAL_DECISION_PACKET_V1: spec/13b_harness_formulas.yaml:bridge_only
        ORDER_MATH_RECONCILIATION_V1: spec/13b_harness_formulas.yaml:bridge_only
        REPORT_AUTHORITY_DIFF_V1: spec/13b_harness_formulas.yaml:bridge_only
        MACRO_EVENT_TICKER_IMPACT_V1: tools/build_macro_event_ticker_impact_v1.py
        INVESTMENT_QUALITY_HEADLINE_V1: tools/validate_specs.py
        ALGORITHM_GUIDANCE_PROOF_V1: tools/build_algorithm_guidance_proof_v1.py
        CANONICAL_ARTIFACT_RESOLVER_V1: tools/validate_canonical_artifact_resolver_v1.py
        COMPLETION_GAP_V1: tools/build_completion_gap_v1.py
        DATA_GATED_PROGRESS_V1: tools/build_data_gated_progress_v1.py
        HONEST_PROOF_GAP_ANALYZER_V1: tools/build_honest_proof_gap_analyzer_v1.py
        FACTOR_LIFECYCLE_COMPLETENESS_V1: tools/validate_factor_lifecycle_completeness_v1.py
        FACTOR_SHADOW_ELIGIBILITY_V1: tools/build_factor_shadow_eligibility_v1.py
        FINAL_EXECUTION_DECISION_V2: tools/build_final_execution_decision_v2.py
        FORMULA_REGISTRY_SYNC_V1: tools/build_formula_registry_sync_v1.py
        HORIZON_REBALANCE_PLAN_V1: tools/build_horizon_rebalance_plan_v1.py
        PIPELINE_RUNTIME_PROFILE_V1: src/quant_engine/pipeline_runtime_anomaly_lib_v1.py
        STRATEGY_ROUTING_AUDIT_V1: tools/build_strategy_routing_audit_v1.py
        PORTFOLIO_TRANSITION_UTILITY_V1: tools/build_portfolio_transition_optimizer_v1.py
        SELL_LOT_PARETO_SELECTOR_V1: tools/build_sell_waterfall_engine_v4.py
        FORECAST_SIMULATION_ENGINE_V1: tools/build_forecast_simulation_engine_v1.py
        SECTOR_EXPOSURE_GRAPH_V1: tools/build_sector_exposure_graph_v1.py
        LEADER_LIFECYCLE_GATE_V1: tools/build_sector_exposure_graph_v1.py
        EXECUTION_CAPACITY_LADDER_V1: tools/build_execution_capacity_ladder_v1.py
        MODEL_GOVERNANCE_KILL_SWITCH_V1: tools/build_model_governance_kill_switch_v1.py
        SCENARIO_SHOCK_MATRIX_V1: tools/build_scenario_shock_matrix_v1.py
        TRANSITION_SET_ENUMERATOR_V1: tools/build_transition_set_enumerator_v1.py
        IMMUTABLE_DECISION_LEDGER_V1: tools/build_immutable_decision_ledger_v1.py
        EXECUTION_PLAN_COMPILER_V1: tools/build_execution_plan_compiler_v1.py
        STATE_VECTOR_CONSTRUCTOR_V1: tools/build_state_vector_constructor_v1.py
        REBALANCE_CADENCE_GATE_V1: tools/build_rebalance_cadence_gate_v1.py
        WALK_FORWARD_BOOTSTRAP_V1: tools/build_walk_forward_bootstrap_v1.py
        WEEKLY_LEGACY_TRANSFER_PLAN_V1: tools/build_weekly_legacy_transfer_plan_v1.py
        GOLDEN_CROSS_SIGNAL_V1: tools/build_golden_cross_signal_v1.py
        STRONG_CLOSE_SIGNAL_V1: tools/build_strong_close_signal_v1.py
        VOLATILITY_EXPANSION_BREAKOUT_V1: tools/build_volatility_expansion_breakout_v1.py
        FIFTY_TWO_WEEK_HIGH_TRIGGER_V1: tools/build_fifty_two_week_high_trigger_v1.py
        CONSECUTIVE_STREAK_V1: tools/build_consecutive_streak_v1.py
        BREAKOUT_FAILURE_STOP_V1: tools/build_breakout_failure_stop_v1.py
        TREND_FILTER_GATE_V1: tools/build_trend_filter_gate_v1.py
        SHORT_INTEREST_RISK_GAUGE_V1: src/quant_engine/qualitative_sell_strategy_v1.py:compute_short_interest_composite
        QUALITATIVE_SELL_STRATEGY_V1: src/quant_engine/qualitative_sell_strategy_v1.py:compute_qualitative_sell_strategy
        MARKET_REGIME_CLASSIFIER_V1: src/quant_engine/qualitative_sell_strategy_v1.py:classify_market_regime
        SATELLITE_CANDIDATE_SCORE_V1: src/quant_engine/qualitative_sell_strategy_v1.py:compute_satellite_candidate_score
        MICROSTRUCTURE_PRESSURE_FROM_ORDERBOOK_V1: src/quant_engine/qualitative_sell_strategy_v1.py:compute_microstructure_pressure_from_orderbook
  formulas:
    FLOW_CREDIT_V1:
      owner: engine_owner
      status: active
      purpose: 가격·거래량·5D 수급 품질을 0~1 점수로 계산
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: open_price
        unit: KRW_per_share
        optional: true
      - field: previous_close_price
        unit: KRW_per_share
        optional: true
      - field: volume
        unit: shares
      - field: avg_volume_5d
        unit: shares
      - field: frg_5d_sh
        unit: shares
      - field: inst_5d_sh
        unit: shares
      - field: flow_ok
        unit: none
      components:
        C1_price_action:
          expression: 1 if close_price >= open_price OR close_price > previous_close_price
            else 0
          weight: 0.3
          missing_action: 0
        C2_volume_action:
          expression: 1 if volume >= avg_volume_5d * 1.20 else 0
          weight: 0.3
          missing_action: 0
        C3_flow_action:
          expression: 1 if flow_ok == true AND (frg_5d_sh + inst_5d_sh) > 0 else 0
          weight: 0.4
          missing_action: 0
      expression: C1_price_action*0.30 + C2_volume_action*0.30 + C3_flow_action*0.40
      output:
        field: flow_credit
        unit: ratio_0_1
      hard_override:
      - condition: C1_price_action == 0 AND C2_volume_action == 0
        result: 0
        reason: C3 단독 충족은 물량 받기로 간주
      canonical_ref: spec/02_data_contract.yaml:quant_feed_contract.investor_flow_rules.active_quality_gate
    MARKET_RISK_SCORE_V1:
      owner: quant_owner
      status: active
      purpose: 시장 위험 점수 MRS를 0~10으로 계산
      inputs:
      - field: vix_close
        unit: index_points
      - field: kospi_close
        unit: index_points
      - field: kospi_ma20
        unit: index_points
      - field: usd_krw
        unit: KRW_per_USD
      - field: usd_jpy_2d_change_pct
        unit: percent
      - field: credit_stress_status
        unit: none
      components:
        vix_score:
          rules:
          - if: vix_close < 18
            points: 0
          - if: 18 <= vix_close <= 25
            points: 2
          - if: 25 < vix_close <= 35
            points: 3
          - if: vix_close > 35
            points: 4
          missing_points: 4
        kospi_score:
          rules:
          - if: kospi_close >= kospi_ma20
            points: 0
          - if: kospi_close < kospi_ma20
            points: 2
          missing_points: 2
        usd_krw_score:
          rules:
          - if: usd_krw < 1400
            points: 0
          - if: 1400 <= usd_krw <= 1450
            points: 1
          - if: usd_krw > 1450
            points: 2
          missing_points: 2
        usd_jpy_score:
          rules:
          - if: usd_jpy_2d_change_pct > -1
            points: 0
          - if: usd_jpy_2d_change_pct <= -1
            points: 1
          missing_points: 1
        credit_score:
          rules:
          - if: credit_stress_status == 'none'
            points: 0
          - if: credit_stress_status in ['caution', 'stress', 'DATA_MISSING']
            points: 1
          missing_points: 1
      expression: min(10, vix_score + kospi_score + usd_krw_score + usd_jpy_score
        + credit_score)
      output:
        field: market_risk_score
        unit: points_0_10
      missing_policy: 컴포넌트별 missing_points를 적용한다.
      canonical_ref: spec/risk/market_risk_cash.yaml:risk_control.market_risk_score_based_cash
    TARGET_CASH_PCT_V1:
      owner: quant_owner
      status: active
      purpose: MRS 기반 목표 현금비중 계산
      inputs:
      - field: market_risk_score
        unit: points_0_10
      - field: cash_floor_regime_min_pct
        unit: percent
        optional: true
      expression: max(5 + (market_risk_score / 10) * 15, cash_floor_regime_min_pct)
      output:
        field: target_cash_pct
        unit: percent
      missing_policy: market_risk_score 미산출 시 MARKET_RISK_SCORE_V1을 먼저 실행. 그래도 불가하면
        15% 및 신규매수 보류.
      canonical_ref: spec/risk/market_risk_cash.yaml:risk_control.market_risk_score_based_cash
    TOTAL_HEAT_V1:
      owner: quant_owner
      status: active
      purpose: 손절 기준 총 위험노출 계산
      inputs:
      - field: average_cost
        source: account_snapshot
        unit: KRW_per_share
      - field: stop_price
        source: account_snapshot
        unit: KRW_per_share
      - field: quantity
        source: account_snapshot.holding_quantity
        unit: shares
      - field: total_asset
        unit: KRW
      expression: sum((average_cost - stop_price) * quantity for each confirmed account_snapshot
        holding) / total_asset * 100
      output:
        field: total_heat_pct
        unit: percent
      missing_policy:
        stop_price: if atr20 exists use entry_price - atr20*2.0 else assume portfolio
          heat contribution cap breach
        quantity: NO_TOTAL_HEAT
        total_asset: NO_TOTAL_HEAT
      gates:
      - if: total_heat_pct >= 10
        action: BLOCK_NEW_BUY
      - if: 7 <= total_heat_pct < 10
        action: HALVE_NEW_BUY_QUANTITY
      - if: total_heat_pct < 7
        action: ALLOW_CONTINUE
      canonical_ref: spec/risk/aggregate_risk.yaml:risk_control.aggregate_risk_cap
    EXPECTED_EDGE_V1:
      owner: engine_owner
      status: active
      purpose: 비용과 신뢰도 차감 후 기대우위 계산
      inputs:
      - field: target_price
        unit: KRW_per_share
      - field: entry_price
        unit: KRW_per_share
      - field: stop_price
        unit: KRW_per_share
      - field: bayesian_confidence_multiplier
        unit: ratio
      - field: execution_cost_rate
        unit: ratio
      expression: ((target_price - entry_price) / (entry_price - stop_price)) * bayesian_confidence_multiplier
        - execution_cost_rate
      output:
        field: expected_edge
        unit: ratio
      validation:
      - target_price > entry_price
      - entry_price > stop_price
      - bayesian_confidence_multiplier >= 0
      - execution_cost_rate >= 0
      gates:
      - if: expected_edge >= 1.5
        action: EDGE_PASS
      - if: expected_edge < 1.5
        action: NO_A_GRADE_NO_IMMEDIATE_BUY
      missing_policy: NO_EXPECTED_EDGE. A등급·즉시매수 금지.
      canonical_ref: spec/strategy/entry_core.yaml:entry_timing_guardrails.numeric_gates.expected_edge_floor
    RISK_BUDGET_CASCADE_V1:
      owner: quant_owner
      status: active
      purpose: base risk budget에 Bayesian, 성과, 국면, Kelly 감액을 순서대로 적용
      inputs:
      - field: base_risk_budget
        unit: ratio
        default: 0.007
      - field: net_return_feedback_multiplier
        unit: ratio
        default: 1.0
      - field: performance_brake_multiplier
        unit: ratio
        default: 1.0
      - field: regime_reset_multiplier
        unit: ratio
        default: 1.0
      - field: bayesian_confidence_multiplier
        unit: ratio
      - field: kelly_brake_multiplier
        unit: ratio
        default: 1.0
      expression: base_risk_budget * net_return_feedback_multiplier * performance_brake_multiplier
        * regime_reset_multiplier * bayesian_confidence_multiplier * kelly_brake_multiplier
      output:
        field: final_risk_budget
        unit: ratio
      floor_rule:
        if: final_risk_budget < 0.001
        action: NO_BET
      canonical_ref: spec/05_position_sizing.yaml:position_sizing.cascade_risk_budget_rule
    POSITION_SIZE_V1:
      owner: quant_owner
      status: active
      purpose: 최종 정수 매수수량 산출
      inputs:
      - field: total_asset
        unit: KRW
      - field: final_risk_budget
        unit: ratio
      - field: atr20
        unit: KRW_per_share
      - field: atr_multiplier
        unit: ratio
        default: 1.5
      - field: available_cash
        unit: KRW
      - field: entry_price
        unit: KRW_per_share
      - field: target_weight_limit_amount
        unit: KRW
      - field: sector_limit_amount
        unit: KRW
      - field: liquidity_limit_amount
        unit: KRW
      intermediate_outputs:
        atr_quantity: floor((total_asset * final_risk_budget) / (atr20 * atr_multiplier))
        cash_limit_quantity: floor(available_cash / entry_price)
        target_weight_limit_quantity: floor(target_weight_limit_amount / entry_price)
        sector_limit_quantity: floor(sector_limit_amount / entry_price)
        liquidity_limit_quantity: floor(liquidity_limit_amount / entry_price)
      expression: min(atr_quantity, cash_limit_quantity, target_weight_limit_quantity,
        sector_limit_quantity, liquidity_limit_quantity)
      output:
        field: final_quantity
        unit: shares_integer
      missing_policy:
        atr20: NO_BUY_QUANTITY
        total_asset: NO_BUY_QUANTITY
        available_cash: NO_BUY_QUANTITY
        entry_price: NO_BUY_QUANTITY
        target_weight_limit_amount: use very large number only if portfolio rule says
          NOT_APPLICABLE
        sector_limit_amount: use very large number only if sector cap says NOT_APPLICABLE
        liquidity_limit_amount: allow PARTIAL only for report; BUY validation_status
          cannot PASS
      canonical_ref: spec/05_position_sizing.yaml:position_sizing.volatility_targeting
    STOP_PRICE_CORE_V1:
      owner: quant_owner
      status: active
      purpose: 코어 포지션 HTS 입력용 손절가 계산
      inputs:
      - field: entry_price
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      - field: current_price
        unit: KRW_per_share
      derived_fields:
        atr20_pct: atr20 / current_price * 100
        atr_multiplier: 2.0 if atr20_pct >= 8 else 1.5
      expression: max(entry_price * 0.92, entry_price - atr20 * atr_multiplier)
      output:
        field: stop_price
        unit: KRW_per_share
      missing_policy:
        atr20: entry_price * 0.92 with DATA_MISSING tag
        entry_price: NO_STOP_PRICE
      canonical_ref: spec/exit/stop_loss.yaml:stop_loss.core
    STOP_PROPOSAL_LADDER_V1:
      owner: quant_owner
      status: active
      purpose: '사용자 판단용 proposal_reference_sheet에 표시할 손절 1/2/3 가격·수량 래더 산출. HTS 즉시
        주문표가 아니라 제안표 전용이며, 기존 손절 규칙과 profit preservation 결과만 사용한다.

        '
      inputs:
      - field: position_class
        unit: enum [core, satellite]
      - field: holding_quantity
        unit: shares
        optional: true
      - field: proposed_quantity
        unit: shares
        optional: true
      - field: stop_price
        unit: KRW_per_share
      - field: profit_lock_stage
        unit: enum
        optional: true
      - field: protected_stop_price
        unit: KRW_per_share
        optional: true
      - field: auto_trailing_stop
        unit: KRW_per_share
        optional: true
      - field: tp3_qty
        unit: shares
        optional: true
      derived_fields:
        base_stop_quantity: holding_quantity 우선, 없으면 proposed_quantity
      rules:
        stop1:
          price_expression: stop_price
          quantity_expression: core=floor(max(1, base_stop_quantity*0.50)), satellite=floor(max(1,
            base_stop_quantity*0.70))
          rationale: spec/exit/stop_loss.yaml core/satellite quantity_rule의 1차 손절
        stop2:
          price_expression: stop_price
          quantity_expression: max(base_stop_quantity - stop1_quantity, 0)
          rationale: 종가 회복 실패 시 잔여 청산
        stop3:
          price_expression: auto_trailing_stop 우선, 없으면 protected_stop_price
          quantity_expression: tp3_qty 우선, 없으면 base_stop_quantity - tp1_quantity -
            tp2_quantity
          activation: profit_lock_stage != NORMAL 또는 auto_trailing_stop 존재
          rationale: 수익보전 구간 러너 보호 스탑
      output:
        field: proposal_stop_ladder
        unit: object
      missing_policy:
        stop_price: NO_STOP_LADDER
        holding_quantity: proposed_quantity fallback
        protected_stop_price: stop3는 비움
      prohibition:
      - stop2/stop3를 차트 패턴이나 심리적 가격으로 임의 산출 금지
      - stop3 활성 근거가 없으면 null 유지
      canonical_ref: spec/00_execution_contract.yaml:proposal_policy.proposal_stop_ladder_selection
    TRAILING_STOP_PRICE_V1:
      owner: quant_owner
      status: active
      purpose: 고점 대비 ATR 기반 trailing stop 가격 계산
      inputs:
      - field: highest_price_since_entry
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      - field: trailing_atr_multiplier
        unit: ratio
        default: 1.5
      expression: highest_price_since_entry - atr20 * trailing_atr_multiplier
      output:
        field: trailing_stop_price
        unit: KRW_per_share
      missing_policy:
        highest_price_since_entry: NO_TRAILING_PRICE
        atr20: NO_TRAILING_PRICE
      canonical_ref: spec/exit/take_profit.yaml:take_profit.trailing_stop
    ABSOLUTE_RISK_STOP_V1:
      owner: quant_owner
      status: active
      purpose: 절대 리스크 손절가와 청산 수량을 산출하는 taxonomy wrapper
      inputs:
      - field: holdings
        unit: object[]
      - field: df_map
        unit: object
      output:
        field: absolute_risk_stop_rows
        unit: object[]
      canonical_ref: spec/exit/stop_loss.yaml:stop_loss.core
      note: stop_loss.core/satellite 및 stop_adequacy 결과를 묶는 wrapper
    RELATIVE_UNDERPERF_ALERT_V1:
      owner: engine_owner
      status: active
      purpose: 상대성과 약화 경보를 산출하는 taxonomy wrapper
      inputs:
      - field: holdings
        unit: object[]
      - field: df_map
        unit: object
      - field: kospi_ret20d
        unit: pct
        optional: true
      output:
        field: relative_underperf_alert
        unit: object
      canonical_ref: spec/exit/stop_loss.yaml:stop_loss.relative_weakness_exit
      note: calcRelativeStopSignal_의 하위 wrapper
    STOP_ACTION_LADDER_V1:
      owner: quant_owner
      status: active
      purpose: 손절/익절/시간손절의 최종 액션 래더를 산출하는 taxonomy wrapper
      inputs:
      - field: context
        unit: object
      output:
        field: stop_action_ladder
        unit: object
      canonical_ref: spec/exit/stop_loss.yaml:stop_loss.sell_signal_priority
      note: calcSellDecision_ / SL003_PRIORITY_MATRIX 결과를 표준화
    PROFIT_LOCK_RATCHET_V1:
      owner: quant_owner
      status: active
      purpose: '분할 익절 단계별 손절선 상향(래칫) 공식. tier_1 익절 완료 후 손절선을 본절(average_cost)로 상향하여
        원금을 보호. tier_2 익절 완료 후 trailing stop으로 전환하여 추세 끝단 보유. TAKE_PROFIT_LADDER_V2.action_on_trigger에서
        참조.

        '
      inputs:
      - field: average_cost
        unit: KRW_per_share
      - field: tier_completed
        unit: enum [tier_1, tier_2]
      - field: highest_price_since_entry
        unit: KRW_per_share
        optional: true
        note: tier_2 완료 후 TRAILING_STOP_PRICE_V1 호출 시 필요
      - field: atr20
        unit: KRW_per_share
        optional: true
      rules:
        tier_1_completed:
          expression: ratchet_stop_price = average_cost
          label: 본절 보호 — 원금 방어선으로 상향
          rationale: tier_1(1.5R) 도달 시 원금 손실 구간 탈출. 손절이 더 이상 손실 없음.
        tier_2_completed:
          expression: ratchet_stop_price = TRAILING_STOP_PRICE_V1 result
          label: trailing stop 전환 — 추세 끝단까지 보유
          rationale: tier_2(3R) 도달 후 잔여는 trailing stop으로 추세 추종.
      output:
        field: ratchet_stop_price
        unit: KRW_per_share
      missing_policy:
        average_cost: NO_RATCHET_PRICE
        atr20: tier_2일 때 TRAILING_STOP_PRICE_V1 미산출. DATA_MISSING 표기 후 본절 유지.
        tier_completed_missing: NO_RATCHET_PRICE — tier 완료 여부 미확인 시 적용 금지
      prohibition:
      - 이 공식 외 임의 레이블(profit_lock_ratchet, 차트 지지선 등)로 보호스탑 생성 금지
      - tier_1 미완료 상태에서 본절 보호선 조기 적용 금지
      - tier_completed 명시 없이 ratchet_stop_price 산출 금지
      canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
      version: 2026-05-18_AUDIT_RESPONSE_V1
    TAKE_PROFIT_LADDER_V1:
      owner: quant_owner
      status: active
      purpose: 평단·보유수량 기준 3단계 익절 가격과 정수 수량 계산
      inputs:
      - field: average_cost
        unit: KRW_per_share
      - field: quantity
        unit: shares
      - field: position_class
        unit: enum
      output:
        field: take_profit_ladder
        unit: object
      rules:
        core:
          tier_1:
            price_expression: average_cost * 1.15
            quantity_expression: floor(quantity * 0.25)
          tier_2:
            price_expression: average_cost * 1.25
            quantity_expression: floor((quantity - tier_1_quantity) * 0.40)
          tier_3:
            price_expression: TRAILING_STOP_PRICE_V1
            quantity_expression: quantity - tier_1_quantity - tier_2_quantity
        satellite:
          tier_1:
            price_expression: average_cost * 1.10
            quantity_expression: floor(quantity * 0.50)
          tier_2:
            price_expression: average_cost * 1.20
            quantity_expression: floor((quantity - tier_1_quantity) * 0.50)
          tier_3:
            price_expression: TRAILING_STOP_PRICE_V1 or time_stop
            quantity_expression: quantity - tier_1_quantity - tier_2_quantity
      missing_policy:
        average_cost: NO_TAKE_PROFIT_PRICE
        quantity: NO_TAKE_PROFIT_QUANTITY
      canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
    TAKE_PROFIT_LADDER_V2:
      owner: quant_owner
      status: active
      purpose: '평단·ATR20·보유수량 기준 3단계 익절 가격과 정수 수량 계산. 각 단계 가격 = max(고정% 기준가, ATR R-Multiple
        기준가). 고정% 최저선을 보장하면서도 고변동성 종목은 ATR 기반으로 더 늦게 익절. ATR 미확인 시 TAKE_PROFIT_LADDER_V1(고정%
        전용)으로 자동 fallback.

        '
      design_rationale: 'R = ATR20 (1일 평균 변동폭 = 1 위험단위). 1.5R 도달 = 손절 리스크(1R)의 1.5배
        수익 → 본절 스탑 상향 근거 확보. 3.0R 도달 = 확실한 수익 구간. 고정% 최저선(코어+15%, 위성+10%) 보장으로 저변동성
        종목이 너무 일찍 익절되는 것을 방지한다.

        '
      inputs:
      - field: average_cost
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
        optional: true
      - field: quantity
        unit: shares
      - field: position_class
        unit: enum
      derived_fields:
        r_unit: 'atr20  # 1R = ATR20 (1일 평균 변동폭)'
        atr_tier1_price: 'average_cost + atr20 * 1.5  # 1.5R 수익점'
        atr_tier2_price: 'average_cost + atr20 * 3.0  # 3.0R 수익점'
        break_even_trigger: 'atr_tier1_price  # 1.5R 도달 시 손절선 → 본절 상향'
      output:
        field: take_profit_ladder_v2
        unit: object
      rules:
        core:
          tier_1:
            price_expression: max(average_cost * 1.15, average_cost + atr20 * 1.5)
            quantity_expression: floor(quantity * 0.25)
            action_on_trigger: 25% 익절 + 손절선 본절(average_cost)로 즉시 상향
            rationale: 1.5R 이상이면 리스크 무위험 상태 전환. 고정% 최저선 +15% 보장.
          tier_2:
            price_expression: max(average_cost * 1.25, average_cost + atr20 * 3.0)
            quantity_expression: floor((quantity - tier_1_quantity) * 0.40)
            action_on_trigger: 40% 추가 익절
            rationale: 3.0R = 확실한 수익 구간. 고정% 최저선 +25% 보장.
          tier_3:
            price_expression: TRAILING_STOP_PRICE_V1
            quantity_expression: quantity - tier_1_quantity - tier_2_quantity
            action_on_trigger: 잔여 전량 trailing으로 추세 끝단까지 보유
        satellite:
          tier_1:
            price_expression: max(average_cost * 1.10, average_cost + atr20 * 1.5)
            quantity_expression: floor(quantity * 0.33)
            action_on_trigger: 33% 익절 + 손절선 본절 상향. 잔여 67% 추세 추종.
            rationale: '위성 50% 즉시 익절(V1)은 단기 익절 편향. V2에서 33%로 조정하여 중장기 추세 추종 원칙에 부합.
              1.5R이면 무위험 상태로 전환 후 보유 연장.

              '
          tier_2:
            price_expression: max(average_cost * 1.20, average_cost + atr20 * 3.0)
            quantity_expression: floor((quantity - tier_1_quantity) * 0.50)
            action_on_trigger: 50% 추가 익절
          tier_3:
            price_expression: TRAILING_STOP_PRICE_V1 or time_stop
            quantity_expression: quantity - tier_1_quantity - tier_2_quantity
            action_on_trigger: 잔여 전량 trailing or time_stop 청산
      missing_policy:
        atr20: 'TAKE_PROFIT_LADDER_V1 fallback. DATA_MISSING_ATR 태그 출력. fixed_pct
          가격만 산출 (tier_1: +10%/+15%, tier_2: +20%/+25%).

          '
        average_cost: NO_TAKE_PROFIT_PRICE
        quantity: NO_TAKE_PROFIT_QUANTITY
      output_columns:
      - 계좌
      - 종목명
      - 평단(원)
      - ATR20(원)
      - 1R(%)
      - tier_1_ATR가격
      - tier_1_고정%가격
      - tier_1_최종가격(max)
      - tier_1_수량
      - tier_2_ATR가격
      - tier_2_고정%가격
      - tier_2_최종가격(max)
      - tier_2_수량
      - tier_3_기준가(원)
      - 잔여수량
      canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
      version: 2026-05-18_ADVANCED_EXIT_V2
    CASH_RATIOS_V1:
      owner: quant_owner
      status: active
      purpose: 현금비중·매수가능현금·거래 후 현금비중 계산 (D+2 정산현금 단독 기준)
      inputs:
      - field: settlement_cash
        unit: KRW
        note: '사용자 지침: D+2 정산현금만이 현금이다.'
      - field: reserved_order_amount
        unit: KRW
      - field: planned_buy_amount
        unit: KRW
      - field: sell_cash_proceeds_d2
        unit: KRW
      - field: total_asset
        unit: KRW
      outputs:
        settlement_cash_ratio: settlement_cash / total_asset * 100
        total_cash_ratio: settlement_cash / total_asset * 100
        buy_power_cash: settlement_cash - reserved_order_amount
        buy_power_ratio: (settlement_cash - reserved_order_amount) / total_asset *
          100
        post_trade_total_cash_ratio: (settlement_cash - planned_buy_amount + sell_cash_proceeds_d2)
          / total_asset * 100
      output:
        field: cash_ratio_set
        unit: object
      missing_policy:
        settlement_cash: NO_CASH_CHECK
        total_asset: NO_CASH_CHECK
        reserved_order_amount: 0
        sell_cash_proceeds_d2: 0
      canonical_ref: spec/risk/portfolio_exposure.yaml:portfolio_exposure_framework.cash_floor.numeric_definitions
    PEG_SCORE_V1:
      owner: engine_owner
      status: active
      purpose: 코스닥 종목의 ForwardPER을 EPS 3개년 성장률로 나눠 밸류에이션 타당성 판정. 고PER이라도 고성장이 뒷받침되면
        허용.
      applicable: 코스닥 상장 종목에만 실행. KOSPI 종목은 이 공식 미적용.
      inputs:
      - field: forward_pe
        unit: ratio
        source: spec/12_field_dictionary.yaml:field_dictionary.forward_pe
      - field: eps_growth_3y_cagr_pct
        unit: percent
        source: '컨센서스 3개년 EPS CAGR (예: 30% → 30 입력)'
      - field: sector_median_forward_pe
        unit: ratio
        source: spec/12_field_dictionary.yaml:field_dictionary.sector_median_forward_pe
      derived_fields:
        peg: forward_pe / eps_growth_3y_cagr_pct
      rules:
      - if: peg <= 1.5
        result: PASS
        valuation_gate: OK
        quantity_modifier: 1.0
      - if: 1.5 < peg <= 2.5
        result: CAUTION
        valuation_gate: CAUTION
        quantity_modifier: 0.7
      - if: peg > 2.5
        result: REJECT
        valuation_gate: REJECT
        quantity_modifier: 0.0
      fallback:
        condition: eps_growth_3y_cagr_pct == DATA_MISSING OR eps_growth_3y_cagr_pct
          <= 0
        rules:
        - if: forward_pe <= sector_median_forward_pe * 2.0
          result: PASS
          quantity_modifier: 1.0
        - if: forward_pe <= sector_median_forward_pe * 3.0
          result: CAUTION
          quantity_modifier: 0.7
        - if: forward_pe >  sector_median_forward_pe * 3.0
          result: REJECT
          quantity_modifier: 0.0
        prohibition: EPS 성장률 추정·보간으로 PEG 계산 금지 — 확정 컨센서스 없으면 fallback만 허용
      output:
        field: peg_gate_result
        unit: enum [PASS, CAUTION, REJECT]
        required_fields:
        - peg
        - peg_gate_result
        - quantity_modifier
        - valuation_gate
      missing_policy:
        forward_pe: fallback 규칙 적용. DATA_MISSING 표기.
        sector_median_forward_pe: fallback 분자 기준 미산출 → CAUTION 보수 처리.
      canonical_ref: spec/strategy/stock_model.yaml:stock_model.kosdaq_valuation_gate
    TICK_NORMALIZER_V1:
      owner: engine_owner
      status: active
      purpose: '한국 KRX 호가 단위(tick size) 기준으로 지정가를 내림 정규화. HTS에 입력 불가능한 소수점·단위 불일치
        가격(예: 144,568원, 25,886원)을 차단. 모든 주문 유형에 floor(내림) 적용 — 매수는 낮은 가격(유리), 손절·익절은
        체결 확률 우선.

        '
      applicable: 모든 지정가(매수·손절·익절·trailing_stop) 출력 전 최종 패스. HS008 강제.
      inputs:
      - field: raw_price
        unit: KRW_per_share
      tick_table:
      - condition: 0 < raw_price < 2000
        tick_size: 1
        example: 1,500원 → 1원 단위
      - condition: 2000 <= raw_price < 5000
        tick_size: 5
        example: 3,750원 → 5원 단위
      - condition: 5000 <= raw_price < 20000
        tick_size: 10
        example: 12,345원 → 10원 단위
      - condition: 20000 <= raw_price < 50000
        tick_size: 50
        example: 35,780원 → 50원 단위
      - condition: 50000 <= raw_price < 200000
        tick_size: 100
        example: 144,568원 → 100원 단위
      - condition: 200000 <= raw_price < 500000
        tick_size: 500
        example: 196,800원 → 500원 단위
      - condition: raw_price >= 500000
        tick_size: 1000
        example: 650,000원 → 1,000원 단위
      expression: floor(raw_price / tick_size) * tick_size
      output:
        field: tick_normalized_price
        unit: KRW_per_share
      examples:
      - raw_price: 144568
        tick_size: 100
        result: 144500
        note: 50만 원 미만 → 100원 단위
      - raw_price: 25886
        tick_size: 50
        result: 25850
        note: 5만 원 미만 → 50원 단위
      - raw_price: 196800
        tick_size: 500
        result: 196500
        note: 20만 원 이상 → 500원 단위
      - raw_price: 12340
        tick_size: 10
        result: 12340
        note: 이미 정규화됨 — 변경 없음
      missing_policy:
        raw_price: NO_TICK_PRICE — 해당 행 INVALID_TICK 처리
      prohibition:
      - 소수점 포함 가격을 TICK_NORMALIZER_V1 없이 플레이북에 기재 금지
      - tick_size 오산출로 500원 단위 종목에 100원 단위 적용 금지
      - 정규화 전 raw_price를 HTS 입력 가격으로 제시 금지
      canonical_ref: spec/00_execution_contract.yaml:hard_stops.HS008_TICK_NORMALIZED_REQUIRED
      version: 2026-05-18_AUDIT_RESPONSE_V2
    PORTFOLIO_BAND_STATUS_V1:
      owner: quant_owner
      status: active
      purpose: 현재 비중이 목표 밴드보다 낮은지, 정상인지, 초과인지 판정
      inputs:
      - field: current_weight_pct
        unit: percent
      - field: target_band_min_pct
        unit: percent
      - field: target_band_max_pct
        unit: percent
      rules:
      - if: current_weight_pct < target_band_min_pct
        status: UNDERWEIGHT
        action: ADD_ALLOWED_IF_ALL_GATES_PASS
      - if: target_band_min_pct <= current_weight_pct <= target_band_max_pct
        status: IN_BAND
        action: HOLD_OR_SELECTIVE_ADD
      - if: current_weight_pct > target_band_max_pct
        status: OVERWEIGHT
        action: TRIM_REVIEW
      output:
        field: portfolio_band_status
        unit: enum
      missing_policy: DATA_MISSING. add/trim 결론 보류.
      canonical_ref: spec/risk/portfolio_exposure.yaml:portfolio_exposure_framework.target_allocation_structure
    FINANCIAL_HEALTH_SCORE_V1:
      owner: engine_owner
      status: active
      purpose: 'ROE·영업이익률·부채비율·FCF를 결합해 종목의 재무 건전성을 0~20점으로 정량화. 수급·모멘텀 중심 편향을 보완하는
        펀더멘털 축. 연간 기준 재무 데이터 사용.

        '
      inputs:
      - field: roe_pct
        unit: percent
        optional: true
      - field: operating_margin_pct
        unit: percent
        optional: true
      - field: debt_to_equity
        unit: ratio
        optional: true
      - field: fcf_b
        unit: KRW_100M
        optional: true
      - field: sector_type
        unit: enum
        optional: true
        note: 금융업(financial) 여부 — D/E 스코어링 건너뜀 판단
      components:
        profitability:
          max_points: 8
          source_field: roe_pct
          rules:
          - if: roe_pct >= 15
            points: 8
          - if: 10 <= roe_pct < 15
            points: 5
          - if: 5 <= roe_pct < 10
            points: 2
          - if: 0 <= roe_pct < 5
            points: 0
          - if: roe_pct < 0
            points: -5
            label: 수익성_훼손_페널티
          missing_rule: 4pt 중립 처리 (DATA_MISSING_PROFITABILITY 태그)
        operating_efficiency:
          max_points: 7
          source_field: operating_margin_pct
          rules:
          - if: operating_margin_pct >= 20
            points: 7
          - if: 10 <= operating_margin_pct < 20
            points: 4
          - if: 0 <= operating_margin_pct < 10
            points: 2
          - if: operating_margin_pct < 0
            points: 0
            label: 영업적자_HF007_발동
          missing_rule: 3pt 중립 처리
        financial_stability:
          max_points: 5
          source_field: debt_to_equity
          financial_sector_skip: true
          rules:
          - if: debt_to_equity < 50
            points: 5
          - if: 50 <= debt_to_equity < 100
            points: 3
          - if: 100 <= debt_to_equity < 200
            points: 1
          - if: 200 <= debt_to_equity <= 400
            points: 0
          - if: debt_to_equity > 400
            points: 0
            label: 극단_부채_HF008_발동
          missing_rule: 2pt 중립 처리
        cash_generation:
          max_points: 5
          source_field: fcf_b
          rules:
          - if: fcf_b > 0
            points: 5
            label: 현금_창출
          - if: fcf_b <= 0
            points: 0
            label: 현금_소각_또는_부재
          missing_rule: 2pt 중립 처리
      expression: "clamp(\n  profitability_pts + operating_efficiency_pts +\n  financial_stability_pts\
        \ + cash_generation_pts,\n  min=-5, max=20\n)\n"
      output:
        field: financial_health_score
        unit: points_neg5_to_20
      score_interpretation:
        18_to_20: 재무 최우량 — ROE 높고 부채 낮고 FCF 창출
        12_to_17: 재무 양호
        6_to_11: 재무 보통 — 일부 약점 존재
        0_to_5: 재무 취약 — 수급 강세여도 진입 신중
        negative: 재무 훼손 — 영업적자 또는 ROE 음수. 수급 점수 불문 등급 하향 압력
      missing_policy:
        all_inputs_missing: 'financial_health_score = 8pt (전체 중립). DATA_MISSING_FHS
          태그 필수. 재무 데이터 미제공 자체를 패널티로 처리하지 않음. 단, 코스닥 종목은 all_missing 시 6pt (더 보수적)
          적용.

          '
        partial_missing: 각 컴포넌트별 missing_rule 적용 후 합산
      sector_exception:
        financial_sector:
          definition: 은행·보험·증권·카드·캐피탈·리츠 등 금융업 SIC 분류
          treatment: 'debt_to_equity 컴포넌트 건너뜀. financial_stability_pts = 3pt 기본값.
            ROE·Operating_Margin·FCF 컴포넌트는 동일 적용.

            '
      canonical_ref: spec/08_scoring_rules.yaml:strategy_score.financial_health
      version: 2026-05-18_FINANCIAL_HEALTH_V1
    PORTFOLIO_BETA_V1:
      owner: quant_owner
      status: active
      purpose: 보유 포지션의 시가기준 가중평균 베타를 산출하여 팩터 과집중 판단에 사용
      inputs:
      - field: beta_i
        source: data_feed.Beta for each holding i
        unit: ratio
      - field: market_value_i
        source: account_snapshot.holding_quantity × close_price
        unit: KRW
      - field: total_equity_value
        source: sum(market_value_i)
        unit: KRW
      expression: sum(beta_i × market_value_i / total_equity_value) for each holding
        with known beta
      output:
        field: portfolio_beta
        unit: ratio
      missing_policy:
        beta_i_missing_single: '해당 종목 제외 후 부분 산출. 제외 종목 시가 비중이 30% 초과 시 결과에 "(PARTIAL
          — Beta 미확인 {N}개 종목 제외)" 표기.

          '
        beta_i_missing_all: NO_PORTFOLIO_BETA. 팩터 리스크 점검 PARTIAL 표기.
        total_equity_value_zero: NO_PORTFOLIO_BETA
      example:
        holdings:
        - name: 삼성전자
          market_value: 100000000
          beta: 1.1
        - name: SK하이닉스
          market_value: 80000000
          beta: 1.3
        - name: 한화에어로스페이스
          market_value: 40000000
          beta: 1.6
        total_equity: 220000000
        result: (1.1×100 + 1.3×80 + 1.6×40) / 220 = (110 + 104 + 64) / 220 = 278/220
          ≈ 1.26
      canonical_ref: spec/risk/portfolio_exposure.yaml:portfolio_exposure_framework.factor_risk_limit
      version: 2026-05-18_ROUTING_OPTIMIZATION_V1
    RS_MOMENTUM_V1:
      owner: engine_owner
      status: active
      purpose: 상대강도(RS)와 수급 가속도를 측정하여 상투 진입 방지 및 후발주(Laggard) 조기 식별
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: avg_trade_value_5d
        unit: KRW
      - field: avg_trade_value_20d
        unit: KRW
      - field: relative_strength_1m_percentile
        unit: percentile
      derived_fields:
        disparity_20d: close_price / ma20
        momentum_acceleration: avg_trade_value_5d / avg_trade_value_20d
      rules:
      - if: disparity_20d > 1.15
        action: TRIGGER_HF009_BLOCK
        label: 이격도_과열(상투)
      - if: momentum_acceleration < 0.8 AND close_price > ma20
        action: TRIM_WARNING
        label: 수급_가속도_둔화(설거지_경계)
      - if: relative_strength_1m_percentile > 70
        action: LAGGARD_SELL_PRIORITY_1
        label: 상대강도_최하위(우선감축)
      output:
        field: alpha_shield_status
        unit: enum
    OVERSOLD_DELAY_V1:
      owner: engine_owner
      status: active
      purpose: 현금 확보 시 '지하실 매도(패닉 셀)' 방지를 위한 데드캣 바운스 대기 알고리즘
      inputs:
      - field: rsi_14
        unit: points
        optional: true
      - field: current_price
        unit: KRW_per_share
      - field: cash_shortfall_krw
        unit: KRW
      rules:
      - condition: rsi_14 < 30 AND cash_shortfall_krw > 0
        action: 전량 시장가 매도 금지. 25%만 TRIM 실행하고 잔여 수량은 단기 반등(+3% 이상) 시점까지 매도 유예.
        label: 과매도_분할탈출(Staged Exit)
      output:
        field: oversold_exit_strategy
        unit: string
    DIVERGENCE_SCORE_V1:
      owner: engine_owner
      status: active
      purpose: '가격이 MA20 위로 상승하는 국면에서 외국인·기관이 동반 이탈하고 flow_credit이 낮으면 개인이 받아주는 취약한
        구조임을 0~1 점수로 계량화. 코스피 상승 중에도 경고가 나와야 하는 핵심 선제 레이더.

        '
      applicable: 보유 종목 분석 시 항상 실행. 매수/매도 요청 불문.
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: frg_5d_sh
        unit: shares
      - field: inst_5d_sh
        unit: shares
      - field: flow_credit
        unit: ratio_0_1
        note: FLOW_CREDIT_V1 결과
      - field: frg_20d_sh
        unit: shares
        optional: true
        note: 존재 시 추세 확인 가중치 상향
      derived_flags:
        price_above_ma20: 1 if close_price > ma20 else 0
        foreign_net_sell: 1 if frg_5d_sh < 0 else 0
        institution_net_sell: 1 if inst_5d_sh < 0 else 0
        flow_quality_low: 1 if flow_credit < 0.40 else 0
      expression: "divergence_score = price_above_ma20 *\n  (foreign_net_sell * 0.40\
        \ + institution_net_sell * 0.30 + flow_quality_low * 0.30)\n"
      output:
        field: divergence_score
        unit: ratio_0_1
      gates:
      - if: divergence_score >= 0.70
        status: DIVERGENCE_ALERT
        note: 20D 동반 이탈 확인 시 임계값 0.60으로 하향
      - if: 0.40 <= divergence_score < 0.70
        status: DIVERGENCE_CAUTION
      - if: divergence_score < 0.40 OR price_above_ma20 == 0
        status: PASS
      missing_policy:
        frg_5d_sh: W1 DATA_MISSING. 레이더 결과 무효.
        inst_5d_sh: foreign_net_sell만 사용 (inst 가중치 0 처리)
        flow_credit: FLOW_CREDIT_V1 먼저 실행 후 재시도
        frg_20d_sh: DATA_MISSING 시 5D 기준만 적용. 임계값 0.70 유지.
      canonical_ref: spec/exit/proactive_exit_radar.yaml:divergence_alert
      version: 2026-05-19_PROACTIVE_RADAR_V1
    OVERHANG_PRESSURE_V1:
      owner: engine_owner
      status: active
      purpose: '외국인 매도 속도가 최근 20D 평균 대비 급가속하면서 거래대금이 감소하면 오버행(대기 매도 물량) 누적으로 가격 지지
        실패 가능성을 사전 경고.

        '
      applicable: 보유 종목 분석 시 항상 실행.
      inputs:
      - field: frg_5d_sh
        unit: shares
      - field: frg_20d_sh
        unit: shares
        optional: true
      - field: volume
        unit: shares
      - field: avg_volume_5d
        unit: shares
      - field: flow_credit
        unit: ratio_0_1
        optional: true
      derived_flags:
        selling_acceleration:
          with_20d: 'frg_5d_sh < 0 AND frg_20d_sh < 0 AND frg_5d_sh < (frg_20d_sh
            / 4) * (-1.5)

            '
          without_20d_fallback: 'avg_volume_5d IS NOT NULL AND frg_5d_sh < -1.5 * avg_volume_5d
            OR flow_credit < 0.30  # 2026-06-21 WBS-7.5: 절대값(-500000) 폐기, avg_volume_5d
            비례식으로 교체. 1.5배수는 with_20d 분기와 동일 계수 재사용(추정 아님).
            calibration_ref: spec/calibration_registry.yaml:OVERHANG_PRESSURE_V1_FALLBACK_MULT (EXPERT_PRIOR)
            avg_volume_5d 결측 시 이 항목은 false로 처리(추정 금지, missing_policy 참조)

            '
        volume_weakness: volume < avg_volume_5d * 0.80
      overhang_score:
        expression: '(selling_acceleration ? 0.60 : 0) + (volume_weakness ? 0.40 :
          0)'
      output:
        field: overhang_score
        unit: ratio_0_1
      gates:
      - if: overhang_score >= 1.00
        status: OVERHANG_ALERT
        note: 매도 가속 + 거래대금 감소 동시 발생
      - if: overhang_score >= 0.60
        status: OVERHANG_CAUTION
        note: 둘 중 하나만 발생
      - if: overhang_score < 0.60
        status: PASS
      missing_policy:
        frg_5d_sh: W2 DATA_MISSING. 레이더 결과 무효.
        avg_volume_5d: volume_weakness=false 처리 (보수적). frg_20d_sh도 없는 경우
          selling_acceleration의 without_20d_fallback 비례식도 계산 불가하므로
          동일하게 false 처리(추정 금지) — flow_credit < 0.30만 단독 평가.
        frg_20d_sh: DATA_MISSING 시 fallback(avg_volume_5d 비례식, 2026-06-21 WBS-7.5) 기준 적용
      cross_alert:
        rule: W1_DIVERGENCE_ALERT + W2_OVERHANG_ALERT 동시 → CRITICAL_ALERT 상향
        output_tag: '[W1+W2_CRITICAL_ALERT]'
      canonical_ref: spec/exit/proactive_exit_radar.yaml:overhang_warning
      version: 2026-05-19_PROACTIVE_RADAR_V1
    SECTOR_ROTATION_RADAR_V1:
      owner: engine_owner
      status: active
      purpose: '보유 섹터의 SmartMoney 5D 점수가 -0.5 이하로 하락하고 타 섹터로 자금이 이동하는 로테이션 초기 신호를
        포착한다. 주가 꺾임보다 2~4주 선행하는 수급 선행 지표.

        '
      applicable: 보유 종목의 sector_flow 데이터 존재 시 실행.
      inputs:
      - field: sector_smartmoney_5d
        unit: normalized_score
        source: sector_flow 탭 — 보유 종목 섹터
      - field: sector_rank
        unit: integer
        optional: true
        note: 이전 주 대비 순위 변화
      - field: sector_top2_names
        unit: list
        optional: true
        note: 자금 유입 상위 2개 섹터
      derived_flags:
        held_sector_outflow: sector_smartmoney_5d < -0.50
        rank_deterioration: sector_rank가 이전 주 대비 2단계 이상 하락
        rotation_destination: sector_top2_names에 보유 종목 섹터 없음
      gates:
      - if: held_sector_outflow AND (rank_deterioration OR rotation_destination)
        status: ROTATION_ALERT
        note: 선제 TRIM 최적 시점. tier_1 익절 미실행 즉시 검토.
      - if: held_sector_outflow AND NOT rank_deterioration AND NOT rotation_destination
        status: ROTATION_CAUTION
        note: 초기 신호. 다음 5D 업데이트 후 재확인.
      - if: NOT held_sector_outflow
        status: PASS
      output:
        field: rotation_radar_status
        unit: enum
      missing_policy:
        sector_flow_missing: W3 DATA_MISSING. sector_flow 탭 점검 권고.
      cross_alert:
        rule: W3_ROTATION_ALERT + (W1 OR W2 ALERT) 동시 → CRITICAL_ALERT
        output_tag: '[W3+CRITICAL_ALERT: 섹터 로테이션 + 수급 이탈 동시. 익절 최적 시점.]'
      canonical_ref: spec/exit/proactive_exit_radar.yaml:sector_rotation_radar
      version: 2026-05-19_PROACTIVE_RADAR_V1
    MEAN_REVERSION_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '주가가 MA20 대비 과도하게 상승하면 신규 매수를 하드 블록한다. 에너지 분산(Distribution) 구간에서의 추격
        매수(상투 잡기)를 원천 봉쇄.

        '
      applicable: 매수 주문 생성 전 항상 실행.
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      expression: deviation_ratio = close_price / ma20
      output:
        field: deviation_ratio
        unit: ratio
      gates:
      - if: deviation_ratio >= 1.15
        status: BUY_HARD_BLOCK
        rule_id: MRG001
        note: HF009_OVEREXTENSION_BLOCK 연동
      - if: 1.10 <= deviation_ratio < 1.15
        status: BUY_CAUTION
        rule_id: MRG001_SOFT
        note: 과열 접근 -- 신규 매수 강도 축소
      - if: deviation_ratio < 1.10
        status: PASS
      missing_policy:
        ma20: MRG001 DATA_MISSING. MA20 데이터 필요. 매수 보류.
      canonical_ref: spec/08_scoring_rules.yaml:hard_filters.HF009_OVEREXTENSION_BLOCK
      version: 2026-05-19_ALPHA_SHIELD_V1
    FLOW_ACCELERATION_V1:
      owner: engine_owner
      status: active
      purpose: '가격 상승 중 외국인 매수 강도가 20D 평균 대비 급격히 둔화되는 에너지 소진(Distribution) 초기 신호를
        포착. W1보다 선행. W1(방향 전환) 이전에 설거지 구간을 조기 경고.

        '
      applicable: 보유 포지션 분석 시 항상 실행. W1/W2/W3와 동시.
      inputs:
      - field: frg_5d_sh
        unit: shares
        note: 외국인 5D 순매수
      - field: frg_20d_sh
        unit: shares
        note: 외국인 20D 누적 순매수
      - field: close_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      derived_flags:
        buy_energy_20d_avg: 'frg_20d_sh / 4  # 20D 평균의 5D 기대값'
        flow_accel_ratio: frg_5d_sh / buy_energy_20d_avg  (>0인 경우)
        price_above_ma20: 1 if close_price > ma20 else 0
      gates:
      - if: price_above_ma20 AND frg_5d_sh > 0 AND flow_accel_ratio < 0.50
        status: FLOW_DECEL_WARNING
        note: 매수 에너지 20D 평균 절반 미만. 설거지 초기. W1과 동시 발화 시 CRITICAL_ALERT.
      - if: price_above_ma20 AND frg_5d_sh <= 0
        status: W1_DOMAIN
        note: 순매도 전환 -- W1 DIVERGENCE_SCORE_V1 처리
      - if: NOT price_above_ma20 OR buy_energy_20d_avg <= 0
        status: PASS
      output:
        field: flow_acceleration_status
        unit: enum
      cross_alert:
        rule: FLOW_DECEL_WARNING + W1_DIVERGENCE_ALERT -> CRITICAL_ALERT
        output_tag: '[W4+W1_CRITICAL: 설거지 에너지 소진 + 수급 이탈 동시]'
      missing_policy:
        frg_20d_sh: W4 DATA_MISSING. 가속도 산출 불가.
        frg_5d_sh: W4 DATA_MISSING.
      canonical_ref: spec/exit/proactive_exit_radar.yaml:flow_acceleration_radar
      version: 2026-05-19_ALPHA_SHIELD_V1
    SEA_TIMING_V1:
      owner: engine_owner
      status: active
      purpose: 장중 VWAP 및 거래량 프로파일을 이용한 최적의 엑싯(Exit) 타이밍 포착
      inputs:
      - field: current_price
        unit: KRW_per_share
      - field: vwap
        unit: KRW_per_share
        optional: true
        note: 장중 거래량 가중 평균가
      - field: rsi_15m
        unit: points
        optional: true
        note: 15분봉 RSI
      - field: volume_climax
        unit: boolean
        optional: true
        note: 단기 거래량 폭증 여부
      rules:
      - if: current_price < vwap AND volume_climax == true
        action: EXIT_NOW
        label: 반등_종료_확인
      - if: rsi_15m < 30 AND current_price < vwap
        action: EXIT_DELAY_FOR_REBOUND
        label: 지하실_매도_방지
      output:
        field: sea_action_tag
        unit: string
    ECP_RISK_SCALE_V1:
      owner: quant_owner
      status: active
      purpose: 총자산 곡선(Equity Curve) 모멘텀에 따른 리스크 예산 자동 조절
      inputs:
      - field: total_asset
        unit: KRW
      - field: total_asset_ma10
        unit: KRW
        note: 10일 자산 이동평균
      rules:
      - if: total_asset < total_asset_ma10
        action: RISK_BUDGET_HALVE
        label: 자산곡선_역배열_방어
      - if: total_asset >= total_asset_ma10
        action: RISK_BUDGET_NORMAL
        label: 자산곡선_정배열_정상
      output:
        field: equity_curve_status
        unit: enum
    RS_RATIO_V1:
      owner: engine_owner
      status: active
      purpose: '종목의 5D 수익률을 KOSPI 5D 수익률로 나눠 상대강도(RS)를 계산한다. sell_priority_engine의
        rw_ge_4_or_rs_laggard 판정 공식. RS 강세 종목(rs_ratio >= 1.20)은 손실 중에도 매도 후순위로 보호.

        '
      applicable: 매도 후보 종목 분석 시 항상 실행.
      inputs:
      - field: stock_close_5d_return
        unit: ratio
        note: (close - close_5d_ago) / close_5d_ago
      - field: kospi_close_5d_return
        unit: ratio
        note: KOSPI 기준 동일 계산
      expression: 'rs_ratio = stock_close_5d_return / kospi_close_5d_return (kospi_close_5d_return
        == 0 이면 1.0 처리)

        '
      output:
        field: rs_ratio
        unit: ratio
      gates:
      - if: rs_ratio >= 1.20
        status: RS_LEADER
        note: 시장 대비 20%+ 강세. sell_priority 보호. core_quality_protection에 준하는 후순위.
      - if: 0.80 <= rs_ratio < 1.20
        status: RS_NEUTRAL
      - if: rs_ratio < 0.80
        status: RS_LAGGARD
        note: '시장 대비 20%+ 약세. rw_ge_4_or_rs_laggard: 35점 발동.'
      missing_policy:
        stock_close_5d_return: RS_LAGGARD=false (보수적). 데이터 확보 후 재산출.
        kospi_close_5d_return: RS_LAGGARD=false (보수적).
      canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.components.weakness_points
      version: 2026-05-19_ALPHA_SHIELD_V1
    BREAKOUT_QUALITY_GATE_V2:
      owner: engine_owner
      status: active
      purpose: '신고가 돌파 이후 3일 이상 달린 종목, MA20 대비 10% 이상 괴리, 갭업+거래량 미동반, RSI 과매수, 이미
        매도신호 발생 조합을 정량 점수로 차단. N2(VOLUME_BREAKOUT_CONFIRM_V1)보다 넓은 뒷박 방지 범위를 커버한다.
        BUY 게이트 체인 Gate 4에서 BREAKOUT_QUALITY_GATE_V2 != BLOCKED_LATE_CHASE 조건으로 사용.

        '
      applicable: 매수 후보 종목 분석 시 항상 실행. 신규 BUY 전 Gate 4 필수 통과.
      inputs:
      - field: close
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: ret_3d
        unit: percent
        note: 3거래일 수익률 (%)
      - field: ret_1d
        unit: percent
        note: 전일 대비 수익률 (%)
      - field: disparity
        unit: percent
        note: (close/MA20 - 1) × 100
      - field: rsi14
        unit: points
        optional: true
      - field: volume
        unit: shares
        optional: true
      - field: avg_volume_5d
        unit: shares
        optional: true
      - field: timing_score_exit
        unit: points_0_100
        optional: true
      - field: distribution_risk_score
        unit: points_0_100
        optional: true
      - field: late_chase_risk_score
        unit: points_0_100
        optional: true
      scoring:
        penalties:
        - condition: ret_3d >= 7
          score: -30
          label: 3일_7%이상_달림
        - condition: disparity > 10
          score: -25
          label: MA20_10%이상_괴리
        - condition: ret_1d >= 4 AND volume < avg_volume_5d * 0.9
          score: -40
          label: 갭업+거래량_미동반
        - condition: rsi14 > 75
          score: -20
          label: RSI_과매수
        - condition: timing_score_exit >= 50
          score: -50
          label: 매도신호_이미_발생
        - condition: distribution_risk_score >= 70
          score: -35
          label: 분배위험_고
        - condition: late_chase_risk_score >= 70
          score: -30
          label: 뒷박위험_고
        bonuses:
        - condition: volume >= avg_vol_5d * 1.5 AND ret_1d >= 2 AND ret_3d < 5
          score: 25
          label: 거래량_동반_초기돌파
        - condition: disparity >= 0 AND disparity < 6
          score: 15
          label: MA20_적정_괴리
        - condition: rsi14 >= 45 AND rsi14 <= 65
          score: 10
          label: RSI_적정_구간
        base_score: 50
      states:
        BLOCKED_LATE_CHASE: base_score + penalties + bonuses < 10  → 뒷박 완전 차단
        WATCH_COOLING_OFF: 10 <= total_score < 40                 → 과열 식힘 대기
        PILOT_ALLOWED: total_score >= 40                      → 파일럿 진입 허용 (다른 게이트
          통과 필요)
      output:
        field: breakout_quality_gate
        unit: enum [BLOCKED_LATE_CHASE, WATCH_COOLING_OFF, PILOT_ALLOWED]
        additional_fields:
        - breakout_quality_score
        - breakout_quality_reasons
      missing_policy:
        ret_3d: DATA_MISSING — WATCH_COOLING_OFF으로 보수 처리
        ma20: DATA_MISSING — BLOCKED_LATE_CHASE 처리
        all_optional_missing: 기본 점수(50)에서 페널티 없이 PILOT_ALLOWED 가능하나 DATA_MISSING 태그
          필수
      prohibition:
      - BLOCKED_LATE_CHASE 상태에서 LLM이 '좋아 보이니까 매수' 서술 절대 금지
      - base_score를 LLM이 재계산하거나 패널티를 임의 무시 금지
      - disparity·ret_3d 데이터 없이 PILOT_ALLOWED 판정 금지
      harness_lock: true
      llm_override: forbidden
      canonical_ref: AGENTS.md:Direction N2 (VOLUME_BREAKOUT_CONFIRM_V1) 확장
      version: 2026-05-20_HARNESS_V5
    FOLLOW_THROUGH_DAY_CONFIRM_V1:
      owner: engine_owner
      status: active
      purpose: 'O''Neil Follow-Through Day 개념을 정량화한다. 돌파 첫날(Day 1)에는 WATCH_FOLLOW_THROUGH_PENDING,
        확인일(Day 2~7 이내 +1.5% 이상 상승 + 거래량 직전 돌파일 대비 90% 이상)에만 BUY_PILOT_ALLOWED. 7일
        이후에도 미확인이면 FOLLOW_THROUGH_FAIL로 리셋. 첫날 돌파 즉시 BUY 지시를 구조적으로 차단해 설거지 손실을 방지한다.

        '
      applicable: 신규 BUY 후보 분석 시 항상 실행. Gate 4b로 BREAKOUT_QUALITY_GATE_V2 이후 적용.
      inputs:
      - field: days_since_breakout
        unit: trading_days
        note: 0 = 돌파 당일. GAS 추적값 또는 data_feed 컬럼.
      - field: ret_since_breakout
        unit: pct
        note: 돌파일 종가 대비 현재 수익률
      - field: vol_today
        unit: shares
        note: 당일 거래량
      - field: vol_breakout_day
        unit: shares
        note: 돌파일 거래량 (backdata에서 참조)
      - field: close
        unit: KRW_per_share
        optional: true
      - field: ma20
        unit: KRW_per_share
        optional: true
      states:
        BREAKOUT_DAY_1:
          condition: days_since_breakout == 0
          result: WATCH_FOLLOW_THROUGH_PENDING
          note: 돌파 당일 BUY 절대 금지. 다음 거래일 재확인 대기.
        FOLLOW_THROUGH_OK:
          condition: days_since_breakout >= 2 AND days_since_breakout <= 7 AND ret_since_breakout
            >= 1.5 AND vol_today >= vol_breakout_day * 0.9
          result: BUY_PILOT_ALLOWED
          note: 확인일 조건 충족 — 파일럿 진입 허용.
        FOLLOW_THROUGH_FAIL:
          condition: days_since_breakout > 7 OR (days_since_breakout >= 2 AND ret_since_breakout
            < 0)
          result: WATCH_RESET_REQUIRED
          note: FTD 실패 또는 7일 초과. 추격 금지, 재설정 대기.
        EXTENDED_FOLLOW:
          condition: days_since_breakout > 7 AND ret_since_breakout >= 0
          result: WATCH_TOO_LATE
          note: 7일 이후 상승 유지 중이지만 확인일 놓침. 뒷박 위험.
        PENDING_DATA:
          condition: days_since_breakout IS NULL
          result: WATCH_NO_BREAKOUT_TRACKED
          note: 돌파 추적 데이터 없음. DATA_MISSING 태그 필수.
      output:
        fields:
          follow_through_day_state: WATCH_FOLLOW_THROUGH_PENDING / BUY_PILOT_ALLOWED
            / WATCH_RESET_REQUIRED / WATCH_TOO_LATE / WATCH_NO_BREAKOUT_TRACKED
          days_since_breakout: 추적된 돌파 경과 거래일 수
          ret_since_breakout: 돌파일 종가 대비 현재 수익률 %
          vol_ratio_vs_breakout_day: vol_today / vol_breakout_day 비율
      missing_policy:
        days_since_breakout: null → WATCH_NO_BREAKOUT_TRACKED. BUY 진행 가능하나 DATA_MISSING
          표기.
        vol_breakout_day: null → vol 조건 충족 여부 판정 불가. DATA_MISSING, 타 조건만으로 판정.
      prohibition:
      - days_since_breakout=0(돌파 당일) 종목을 LLM이 즉시 BUY_PILOT_ALLOWED로 판정 금지
      - FOLLOW_THROUGH_FAIL 상태를 '좋은 종목이니 예외 허용' 서술로 우회 금지
      - days_since_breakout·ret_since_breakout을 LLM이 임의 계산 금지 (GAS 하네스값 인용)
      harness_lock: true
      llm_override: forbidden
      canonical_ref: engine_harness_upgrade_proposal_result.txt:2-B
      version: 2026-05-20_HARNESS_V5
    EXECUTION_QUALITY_SCORE_V1:
      owner: engine_owner
      status: active
      purpose: '실제 주문 실행 후 T+1/T+3/T+5 결과를 정량 채점해 엔진 임계치 자동 개선 루프를 만든다. POOR 등급 누적
        시 Late Chase 임계치 강화, Entry 임계치 완화 등을 자동 제안한다. 채점 결과는 proposal_evaluation_history.json에
        누적 저장된다.

        '
      applicable: daily-feedback-report 실행 시. T+1 결과 확정 후 자동 업데이트.
      inputs: []
      scoring:
        buy_entry_quality:
          description: 매수 진입 타이밍 채점 (최대 +20, 최소 -35)
          components:
          - condition: next_1d_ret >= 0
            score: +1 per 0.5% (최대 +10)
          - condition: next_3d_max_favorable
            score: +1 per 1% (최대 +10)
          - condition: would_trigger_stop_t1=true
            score: -20
            note: T+1 손절 발생
          - condition: breakout_confirmed=true
            score: 5
          - condition: late_chase_confirmed=true
            score: -15
        sell_exit_quality:
          description: 매도 타이밍 채점 (최대 +25, 최소 -20)
          components:
          - condition: sold_above_ma20=true
            score: 10
          - condition: rebound_after_sell_3d > 0
            score: -(rebound_pct × 2)
            note: 팔고 오른 경우 감점
          - condition: sold_near_support=true
            score: -10
          - condition: cash_recovered_target=true
            score: 15
        cash_raise_quality:
          description: 현금확보 경로 채점
          components:
          - condition: cash_target_achieved=true
            score: 10
          - condition: core_position_preserved=true
            score: 5
          - condition: route_used=ROUTE_A
            score: 5
          - condition: route_used=ROUTE_B
            score: 3
          - condition: route_used=ROUTE_C
            score: 0
          - condition: route_used=ROUTE_D
            score: -5
      grades:
        EXCELLENT: total_score >= 15
        GOOD: 5 <= total_score < 15
        NEUTRAL: -5 <= total_score < 5
        POOR: total_score < -5
      outcome_classification:
        FALSE_BUY_TIMING: BUY_PILOT_ALLOWED 후 T+1 손절 → Late Chase 임계치 강화 제안
        MISSED_ENTRY: WATCH_ONLY 후 +3% 이상 → Entry 임계치 완화 제안
        TRUE_NEGATIVE: BUY_BLOCKED_T1 후 하락 → 공식 유효성 확인
        PORTFOLIO_GUARD_EFFECTIVE: SELL_OR_TRIM 후 현금 회복 → 규칙 유지
      output:
        fields:
          execution_quality_score: 총 채점 점수
          execution_quality_grade: EXCELLENT / GOOD / NEUTRAL / POOR
          execution_quality_outcome: 결과 분류 enum
          threshold_adjustment_proposals: POOR 시 임계치 조정 제안 목록
      storage:
        file: Temp/proposal_evaluation_history.json
        auto_run: npm run daily-feedback-report
      prohibition:
      - execution_quality_grade를 LLM이 임의 산정 금지
      - threshold_adjustment_proposals를 LLM이 즉각 반영 금지 — 제안만 출력
      - 채점 데이터 없이 '실행 품질 양호'로 단정 금지
      harness_lock: true
      llm_override: forbidden
      canonical_ref: engine_harness_upgrade_proposal_result.txt:2-E
      version: 2026-05-20_HARNESS_V5
    RS_VERDICT_V1:
      owner: report_owner
      status: active
      purpose: '종목의 10일 수익률을 KOSPI 10일 수익률과 비교해 초과 수익률(excess_ret_10d)을 계산하고 LEADER/MARKET/LAGGARD/BROKEN
        4단계 판정을 내린다. composite_verdict, SFG_V1, RAG_V1의 선행 입력으로 사용된다.

        '
      applicable: 매 buildTickerRow_ 실행 시 _addTickerGates_ 내에서 계산. LLM 재계산 금지.
      inputs:
      - field: price.ret10D
        unit: pct
        note: 종목 10일 수익률
      - field: globalKospiRet10D_
        unit: pct
        note: KOSPI 10일 수익률 (preReads)
      - field: rw_partial
        unit: int_0_5
        note: 상대약세 청산 신호 합계
      - field: flow_credit
        unit: ratio_0_1
        note: FLOW_CREDIT_V1 결과
      derived:
        excess_ret_10d: (price.ret10D - globalKospiRet10D_) if both available else
          null
      gates:
      - if: excess_ret_10d < -10 AND rw_partial >= 3
        verdict: BROKEN
        note: 구조적 이탈
      - if: excess_ret_10d < -3 OR (excess_ret_10d < 0 AND rw_partial >= 3)
        verdict: LAGGARD
        note: 시장 대비 약세
      - if: excess_ret_10d > 3 AND flowCredit >= 0.6
        verdict: LEADER
        note: 시장 대비 강세
      - if: otherwise
        verdict: MARKET
        note: 시장 중립
      output:
        field: rs_verdict
        unit: enum [LEADER, MARKET, LAGGARD, BROKEN, UNKNOWN]
        additional_fields:
        - excess_ret_10d
      missing_policy:
        price.ret10D: rs_verdict = UNKNOWN. composite_verdict = WATCH_CANDIDATE.
        globalKospiRet10D_: rs_verdict = UNKNOWN.
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 뉴스·차트 감각으로 rs_verdict를 LEADER로 상향 금지
      - rs_verdict = BROKEN 종목을 'RS가 곧 회복될 것'으로 임의 완화 금지
      canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.weakness_points
      version: 2026-05-21_CLA_HARNESS_V1
    COMPOSITE_VERDICT_V1:
      owner: report_owner
      status: active
      purpose: 'SS001 등급(A/B/C/D)과 rs_verdict(LEADER/MARKET/LAGGARD/BROKEN/UNKNOWN)를
        결합해 종목의 최종 포지션 판정을 내린다. LLM이 "좋아 보인다"류 언어적 판단으로 판정을 변경하는 것을 구조적으로 방지한다.

        '
      applicable: _addTickerGates_ 내에서 SS001 계산 직후 실행.
      inputs:
      - field: ss001_grade
        unit: enum [A,B,C,D]
      - field: rs_verdict
        unit: enum [LEADER,MARKET,LAGGARD,BROKEN,UNKNOWN]
      matrix: 'GRADE    LEADER            MARKET            LAGGARD           BROKEN            UNKNOWN

        A        PRIME_CANDIDATE   PRIME_CANDIDATE   WATCH_CANDIDATE   EXIT_REVIEW       WATCH_CANDIDATE

        B        PRIME_CANDIDATE   WATCH_CANDIDATE   REDUCE_CANDIDATE  EXIT_REVIEW       WATCH_CANDIDATE

        C        WATCH_CANDIDATE   REDUCE_CANDIDATE  REDUCE_CANDIDATE  CLOSE_POSITION    REDUCE_CANDIDATE

        D        REDUCE_CANDIDATE  REDUCE_CANDIDATE  CLOSE_POSITION    CLOSE_POSITION    REDUCE_CANDIDATE

        '
      output:
        field: composite_verdict
        unit: enum [PRIME_CANDIDATE, WATCH_CANDIDATE, REDUCE_CANDIDATE, EXIT_REVIEW,
          CLOSE_POSITION]
      action_guidance:
        PRIME_CANDIDATE: 코어 유지·추가. RAG_V1 PASS 시 위성 추가 허용.
        WATCH_CANDIDATE: 현재 비중 유지. 추가매수 보류.
        REDUCE_CANDIDATE: 분할 축소. 5% 이상 비중이면 TRIM 실행.
        EXIT_REVIEW: 다음 반등 시 전량 매도 준비.
        CLOSE_POSITION: 즉시 정리. calcFinalDecision_ SELL 강제 검토.
      missing_policy:
        ss001_grade: composite_verdict = WATCH_CANDIDATE (보수적)
        rs_verdict: UNKNOWN 컬럼으로 처리
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - composite_verdict = CLOSE_POSITION인 종목을 LLM이 'HOLD도 무방'으로 서술 금지
      - composite_verdict 없이 종목 정리 우선순위 결정 금지
      canonical_ref: spec/13_formula_registry.yaml:RS_VERDICT_V1
      version: 2026-05-21_CLA_HARNESS_V1
    REPLACEMENT_ALPHA_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '위성 신규매수 전 코어 대비 알파 우위 여부를 기계적으로 검증한다. 코어보다 약한 위성에 현금을 투입하는 ''설거지 추가매수''를
        원천 차단. CLA 레짐 또는 CLUSTER_HOLD_ONLY 상태에서 RAG_V1 FAIL이면 allowed_action = HOLD
        강제.

        '
      applicable: 위성 신규 BUY 주문 생성 전 calcFinalDecision_ 내에서 실행.
      inputs:
      - field: rs_verdict
        unit: enum
        note: RS_VERDICT_V1 결과
      - field: ss001_grade
        unit: enum [A,B,C,D]
      - field: excess_ret_10d
        unit: pct
        note: KOSPI 대비 초과 10D 수익률
      - field: portfolioStats.coreAvgSS001
        unit: points_0_100
        optional: true
        note: 코어 종목 평균 SS001 정규화 점수
      conditions_all_required_for_PASS:
        condA: rs_verdict IN [LEADER, MARKET]
        condB: 'ss001_norm_score >= (coreAvgSS001 - 10)  # coreAvgSS001 미확인 시 60 적용'
        condC: excess_ret_10d >= -5
        condD: excess_ret_10d >= 0  OR  rs_verdict == LEADER
      output:
        field: rag_v1
        unit: enum [PASS, FAIL, EXEMPT]
        additional_fields:
        - rag_reason
      rag_reason_codes:
        rs_verdict_weak: condA 실패 — rs_verdict가 LAGGARD 또는 BROKEN
        ss001_below_core: condB 실패 — SS001이 코어 평균보다 10점 이상 낮음
        excess_ret_breach: condC 실패 — 10일 초과수익률 -5% 이하
        rs_slope_negative: condD 실패 — 초과수익률 음수이고 LEADER도 아님
        core_exempt: 코어 종목 — RAG 미적용
        pass: 모든 조건 충족
      gate_action:
        FAIL: allowed_action을 BUY에서 HOLD로 강제 전환
        PASS: 정상 진행
        EXEMPT: 코어 종목 — 판정 없이 통과
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - rag_v1 = FAIL인 종목에 LLM이 '이번만 예외'로 BUY 허용 금지
      - portfolioStats.coreAvgSS001 미확인 상태에서 condB를 LLM이 임의 계산 금지
      canonical_ref: spec/11_market_regime.yaml:CONCENTRATED_LEADER_ADVANCE
      version: 2026-05-21_CLA_HARNESS_V1
    SATELLITE_FAILURE_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '위성 포지션 전체 중 BROKEN/CLOSE_POSITION 비율이 임계값을 초과하면 TRIGGERED를 발동, 위성
        전체 신규매수를 자동 차단하고 정리 대상 종목을 cashPreservePlan에 자동 포함한다. 개별 종목 판단의 합산이 아닌 ''집단
        실패'' 신호로 포트폴리오 전체를 방어한다.

        '
      applicable: calcApexExecutionHarness_ 내에서 포트폴리오 집계 후 실행.
      inputs:
      - field: satellite_holdings[].composite_verdict
        unit: enum
      - field: satellite_holdings[].rs_verdict
        unit: enum
      - field: satellite_holdings[].ret20d
        unit: ratio
        optional: true
      - field: satellite_holdings[].excess_ret_10d
        unit: pct
        optional: true
      trigger_conditions:
        condA: rs_verdict=BROKEN 또는 composite_verdict=CLOSE_POSITION인 위성 수 >= 3
        condB: composite_verdict IN [REDUCE_CANDIDATE, EXIT_REVIEW, CLOSE_POSITION]
          비율 >= 60%
        condC: 위성 평균 20D 수익률 <= -10% AND 평균 초과낙폭 >= 8%
        trigger: condA OR condB OR condC
      output:
        field: sfg_v1
        unit: enum [TRIGGERED, CLEAR]
        additional_fields:
        - sfg_reason: 트리거된 조건 코드
        - sfg_broken_count: BROKEN/CLOSE_POSITION 위성 수
        - sfg_failure_rate: 실패율 0.0~1.0
      sfg_action:
        TRIGGERED:
        - '모든 위성 신규 BUY: BLOCKED (rag_v1 결과 무관)'
        - 'composite_verdict=CLOSE_POSITION 위성: 매도 1순위 지정'
        - 'composite_verdict=EXIT_REVIEW 위성: rebound_wait_qty 활성화'
        CLEAR: 정상 판단 흐름 유지
      clear_conditions:
      - sfg_broken_count < 2
      - sfg_failure_rate < 0.40
      clear_conditions_note: 두 조건 모두 충족 시 TRIGGERED → CLEAR 해제. 1회 반등으로 해제 금지.
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - sfg_v1 = TRIGGERED 상태에서 LLM이 '이 위성은 괜찮으니 매수' 판단 금지
      - sfg_broken_count를 LLM이 직접 집계 금지 — 하네스 출력값만 인용
      - TRIGGERED 해제를 위한 조건 없이 '상황이 나아졌으니' 임의 해제 금지
      canonical_ref: spec/13_formula_registry.yaml:COMPOSITE_VERDICT_V1
      version: 2026-05-21_CLA_HARNESS_V1
    BENCHMARK_RELATIVE_TIMESERIES_V1:
      owner: engine_owner
      status: active
      purpose: '종목을 KOSPI 기준 시계열로 평가해 초과낙폭, 반등 회복률, 하락장 베타, RS선 기울기와 brt_verdict를
        결정론적으로 산출한다. LLM은 값 인용만 가능하다.

        '
      applicable: _addTickerGates_에서 RS_VERDICT_V2 이전 실행. 과거 가격 배열이 없으면 RET20/RET60
        기반 프록시임을 method에 남긴다.
      inputs:
      - field: price.ret5D
        unit: pct
      - field: price.ret20D
        unit: pct
      - field: price.ret60D
        unit: pct
      - field: price.close
        unit: KRW_per_share
      - field: high52w
        unit: KRW_per_share
        optional: true
      - field: globalKospiRet5D_
        unit: pct
      - field: globalKospiRet20D_
        unit: pct
      - field: globalKospiRet60D_
        unit: pct
      - field: globalKospiDrawdown_
        unit: pct
      derived:
        stock_drawdown_from_high_pct: if high52W>0 then max(0,(1-close/high52W)*100)
          else null
        excess_drawdown_pctp: stock_drawdown_from_high_pct - globalKospiDrawdown_
        recovery_ratio_5d: price.ret5D / globalKospiRet5D_ if globalKospiRet5D_ >
          0 else null
        recovery_ratio_20d: price.ret20D / globalKospiRet20D_ if globalKospiRet20D_
          > 0 else null
        downside_beta: price.ret20D / globalKospiRet20D_ if globalKospiRet20D_ < 0
          else null
        rs_ratio_5d: price.ret5D / globalKospiRet5D_ if globalKospiRet5D_ != 0 else
          null
        rs_ratio_20d: price.ret20D / globalKospiRet20D_ if globalKospiRet20D_ != 0
          else null
        rs_ratio_60d: price.ret60D / globalKospiRet60D_ if globalKospiRet60D_ != 0
          else null
        rs_line_20d_slope: (rs_ratio_20d - rs_ratio_5d) / 15 if both available else
          (ret20D - k20) / 20
        rs_line_60d_slope: (rs_ratio_60d - rs_ratio_20d) / 40 if both available else
          (ret60D - k60) / 60
        brt_method: RS_RATIO_MULTI_WINDOW_PROXY if rs_ratio_5d and rs_ratio_20d available
          else PROXY_FROM_RET20_RET60
      verdict_table:
        LEADER: excess_drawdown_pctp <= 0 AND recovery_ratio_20d >= 1.20 AND rs_line_20d_slope
          > 0
        MARKET: excess_drawdown_pctp between -5 and 5 AND recovery_ratio_20d between
          0.80 and 1.20
        LAGGARD: excess_drawdown_pctp >= 5 OR recovery_ratio_20d < 0.80 OR rs_line_20d_slope
          < 0
        BROKEN: excess_drawdown_pctp >= 10 AND (recovery_ratio_20d < 0.50 OR rs_line_60d_slope
          < 0)
      output:
        fields:
        - stock_drawdown_from_high_pct
        - excess_drawdown_pctp
        - recovery_ratio_5d
        - recovery_ratio_20d
        - downside_beta
        - rs_ratio_5d
        - rs_ratio_20d
        - rs_ratio_60d
        - rs_line_20d_slope
        - rs_line_60d_slope
        - brt_verdict
        - brt_method
      missing_policy: 필수 KOSPI 또는 종목 수익률 누락 시 brt_verdict=UNKNOWN, LLM 대체 계산 금지.
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 excess_drawdown/recovery_ratio/downside_beta/rs_slope를 직접 계산 금지
      - brt_verdict=BROKEN 종목을 낙폭과대 매수 기회로 서술 금지
      version: 2026-05-21_BRT_V1_C2
    RS_VERDICT_V2:
      owner: report_owner
      status: active
      purpose: RS_VERDICT_V1과 BENCHMARK_RELATIVE_TIMESERIES_V1의 brt_verdict를 보수적으로
        융합한다.
      applicable: BRT_V1 직후. 기존 rs_verdict 필드명은 최종 V2 결과로 유지하고 rs_verdict_v1_raw를
        감사용 보존.
      inputs:
      - field: rs_verdict_v1_raw
        unit: enum
      - field: brt_verdict
        unit: enum [LEADER,MARKET,LAGGARD,BROKEN,UNKNOWN]
      fusion_logic:
        BROKEN: rs_verdict_v1_raw=BROKEN OR brt_verdict=BROKEN
        LAGGARD: rs_verdict_v1_raw=LAGGARD OR brt_verdict=LAGGARD, 단 BROKEN 아님
        LEADER: rs_verdict_v1_raw=LEADER AND brt_verdict=LEADER
        MARKET: 그 외
      special_cases:
      - brt_verdict=LEADER AND rs_verdict_v1_raw=LAGGARD -> MARKET
      - brt_verdict=BROKEN AND rs_verdict_v1_raw=LEADER -> LAGGARD
      output:
        field: rs_verdict
        additional_fields:
        - rs_verdict_v1_raw
        - rs_verdict_source
      ground_truth: harness
      llm_allowed: cite_only
      version: 2026-05-21_RS_VERDICT_V2
    SATELLITE_ALPHA_QUALITY_GATE_V1:
      owner: engine_owner
      status: active
      purpose: 위성 후보가 BUY 후보로 노출되기 전 5개 필터로 ELIGIBLE/WATCHLIST_ONLY/EXCLUDED를 확정한다.
      inputs:
      - field: position_class
        unit: enum [core,satellite]
      - field: ss001_grade
        unit: enum [A,B,C,D]
      - field: price.ret20D
        unit: pct
      - field: globalKospiRet20D_
        unit: pct
      - field: recovery_ratio_20d
        unit: ratio
      - field: recovery_ratio_5d
        unit: ratio
      - field: excess_drawdown_pctp
        unit: pct_points
      - field: frg_5d_sh
        unit: shares
      - field: inst_5d_sh
        unit: shares
      - field: rs_verdict
        unit: enum
      filters:
        F1_relative_return: price.ret20D > globalKospiRet20D_
        F2_recovery_power: recovery_ratio_20d >= 1.20 OR recovery_ratio_5d >= 1.30
        F3_downside_protection: excess_drawdown_pctp <= 5
        F4_institutional_flow: frg_5d_sh > 0 OR inst_5d_sh > 0
        F5_sector_leadership: rs_verdict IN [LEADER, MARKET]
      classification:
        ELIGIBLE: total_penalty == 0
        WATCHLIST_ONLY: total_penalty IN [1,2] AND F1/F2/F3 중 하나만 실패
        EXCLUDED: total_penalty >= 3 OR F1/F2/F3 중 2개 이상 실패 OR ss001_grade=D OR rs_verdict=BROKEN
      gate_action:
        ELIGIBLE: BUY 후보 표기 가능. RAG_V1 추가 통과 필요.
        WATCHLIST_ONLY: WATCH만 허용. BUY/파일럿 서술 금지.
        EXCLUDED: BUY 후보 및 주문표에서 제거. 보유 종목이면 정리 검토 입력.
      output:
        field: saqg_v1
        additional_fields:
        - saqg_penalty
        - saqg_failed_filters
      ground_truth: harness
      llm_allowed: cite_only
      version: 2026-05-21_SAQG_V1
    CASH_CREATION_PURPOSE_LOCK_V1:
      owner: quant_owner
      status: active
      purpose: 현금 만들기 또는 위성 편입 재원 마련만을 이유로 코어/주도주 매도를 생성하지 못하게 한다.
      inputs:
      - field: composite_verdict
        unit: enum
      - field: rs_verdict
        unit: enum
      - field: brt_verdict
        unit: enum
      - field: excess_drawdown_pctp
        unit: pct_points
        optional: true
      - field: recovery_ratio_20d
        unit: ratio
        optional: true
      - field: sfg_v1
        unit: enum
        optional: true
      valid_sell_reasons:
      - composite_verdict IN [REDUCE_CANDIDATE, EXIT_REVIEW, CLOSE_POSITION]
      - stop_breach_gate = BREACH
      - rs_verdict = BROKEN 또는 brt_verdict = BROKEN
      - excess_drawdown_pctp >= 10 AND recovery_ratio_20d < 0.50
      - sfg_v1 = TRIGGERED
      invalid_sell_reasons:
      - cash_floor 미달 단독
      - 섹터/클러스터 비중 초과 단독
      - 위성 신규 편입 재원 확보
      reinvestment_gate: SAQG_V1=ELIGIBLE AND RAG_V1=PASS AND 신규 후보가 매도 후보보다 기대값 우위일
        때만 재투자 허용
      output:
        field: cash_creation_purpose_lock
        additional_fields:
        - sell_reason_validity
        - reinvestment_allowed
      ground_truth: harness
      llm_allowed: cite_only
      version: 2026-05-21_CCPL_V1
    SATELLITE_AGGREGATE_PNL_GATE_V1:
      owner: engine_owner
      status: active
      purpose: 위성 합산 평가손익이 코어 수익을 잠식하는 정도를 추적해 위성 전략 실패를 감지한다.
      inputs:
      - field: position_class
        unit: enum [core,satellite]
      - field: profit_loss
        unit: KRW
      computed:
        core_total_pnl_krw: sum(profit_loss for core)
        satellite_total_pnl_krw: sum(profit_loss for satellite)
        satellite_loss_to_core_gain_ratio: abs(min(0,satellite_total_pnl_krw)) / max(core_total_pnl_krw,1)
      gates:
        PASS: ratio < 0.25
        SAPG_ALERT: 0.25 <= ratio < 0.50
        SAPG_CRITICAL: ratio >= 0.50
      output:
        field: sapg_status
        additional_fields:
        - core_total_pnl_krw
        - satellite_total_pnl_krw
        - satellite_loss_to_core_gain_ratio
      ground_truth: harness
      llm_allowed: cite_only
      version: 2026-05-21_SAPG_V1
    ALPHA_EVALUATION_WINDOW_V1:
      owner: engine_owner
      status: active
      purpose: 위성 추천 성과를 T+20/T+60에서 삼성전자·SK하이닉스 대비 초과수익으로 평가한다. T+1 단독 평가는 금지한다.
      inputs:
      - field: entry_date
        unit: date
      - field: position_class
        unit: enum [core,satellite]
      - field: t20_return_pct
        unit: pct
        optional: true
      - field: t60_return_pct
        unit: pct
        optional: true
      - field: benchmark_core_return_pct
        unit: pct
        optional: true
      gates:
        T20_ALPHA_FAIL: t20_vs_core_pctp < -3
        T60_ALPHA_FAIL: t60_vs_core_pctp < -5
        PASS: benchmark excess return >= 0
      missing_policy: 성과 창 미도래 또는 데이터 누락 시 DATA_MISSING — LLM 대체 산출 금지.
      output:
        field: alpha_evaluation_window_json
      ground_truth: harness
      llm_allowed: cite_only
      version: 2026-05-21_AEW_V1
    HARNESS_DATA_FRESHNESS_GATE_V1:
      owner: data_owner
      status: active
      purpose: 'harness_context 주요 입력 데이터의 영업일 기준 신선도를 검증한다. 신선도 부족 시 BRT/SAPG/SAQG
        결과의 신뢰도 등급을 자동 하향하고 STALE_BLOCK 상태에서 HTS 주문표 생성을 차단한다.

        '
      applicable: buildHarnessContext_ 가장 먼저 실행 (모든 공식 선행).
      inputs:
      - field: metadata.generated_at
        unit: datetime
      - field: metadata.market_date
        unit: date
      - field: today_date
        unit: date
      computed:
        data_age_business_days: business_days_diff(today_date, metadata.market_date)
      freshness_status:
        FRESH:
          condition: data_age_business_days <= 1
          note: 정상
        STALE_1D:
          condition: data_age_business_days == 2
          harness_impact: brt_method에 STALE_1D 태그
        STALE_WARN:
          condition: data_age_business_days IN [3,4]
          harness_impact: brt_verdict LOW, ELIGIBLE -> WATCHLIST_ONLY
        STALE_BLOCK:
          condition: data_age_business_days >= 5
          harness_impact: brt_verdict=DATA_STALE_BLOCKED, HTS 주문표 생성 금지
      output:
        field: data_freshness_status
        additional_fields:
        - data_age_business_days
        - freshness_degraded_gates
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - STALE_BLOCK 상태에서 BRT 결과로 주문 생성 금지
      - LLM이 신선도를 임의 판단하거나 사용 가능으로 완화 금지
      version: 2026-05-21_HDFG_V1
    SATELLITE_LIFECYCLE_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '위성 종목에 WATCH/PILOT/CONFIRMED/REVIEW/EXIT 5단계 라이프사이클을 부여한다. 각 단계는 전환
        조건, 허용 액션, 보유 기준이 명확히 다르다. 이진 CORE/SATELLITE 분류를 확장하며 기존 분류와 병렬 적용.

        '
      applicable: _addTickerGates_ 내 COMPOSITE_VERDICT_V1 이후 실행.
      inputs:
      - field: ticker
        unit: string
      - field: composite_verdict
        unit: enum
      - field: brt_verdict
        unit: enum
      - field: excess_drawdown_pctp
        unit: pct_points
      - field: entry_date
        unit: date
      - field: alpha_evaluation_window_json
        unit: array
        optional: true
      output:
        field: satellite_lifecycle_stage
        additional_fields:
        - lifecycle_transition_reason
        - lifecycle_days_in_stage
        - review_warning
      lifecycle_stages:
        WATCH:
          definition: 관심종목. 미투자. SAQG_V1 ELIGIBLE 미달.
          transition_to_PILOT: saqg_v1=ELIGIBLE AND rag_v1=PASS AND brt_verdict IN
            [LEADER,MARKET]
          allowed_actions:
          - WATCH
        PILOT:
          definition: 소액 파일럿. T1 트랜치 30% 진입.
          transition_to_CONFIRMED: t20_vs_core_pctp >= 0 AND brt_verdict=LEADER AND
            composite_verdict=PRIME_CANDIDATE
          transition_to_REVIEW: t5_alpha_gate=alpha_negative 연속2회 OR brt_verdict=LAGGARD
            OR excess_drawdown_pctp > 8
          allowed_actions:
          - HOLD_PILOT
          - ADD_T2_IF_CONFIRMED
        CONFIRMED:
          definition: 알파 검증됨. 정규 비중 편입.
          transition_to_REVIEW: t20_vs_core_pctp < -5 OR brt_verdict=LAGGARD OR composite_verdict=REDUCE_CANDIDATE
          allowed_actions:
          - HOLD
          - ADD_T2
          - ADD_T3
          - PARTIAL_TP
        REVIEW:
          definition: 알파 훼손. 감시, 축소 모드.
          transition_to_CONFIRMED: brt_verdict=LEADER 연속2주 AND composite_verdict=PRIME_CANDIDATE
          transition_to_EXIT: brt_verdict=BROKEN OR composite_verdict=CLOSE_POSITION
            OR t20_vs_core_pctp < -10 OR excess_drawdown_pctp >= 15
          forced_reduce: 4주 이상 REVIEW 시 비중 50% 감축 권고
          allowed_actions:
          - HOLD_REDUCED
          - TRIM_ON_REBOUND
          - NO_ADD
        EXIT:
          definition: 정리 확정. 다음 반등 시 전량 청산.
          allowed_actions:
          - FULL_EXIT_ON_TRIGGER
          - STAGED_EXIT
          prevent: EXIT 진입 후 LLM이 단계 복귀 금지
      output_fields:
      - field: satellite_lifecycle_stage
        unit: enum [WATCH,PILOT,CONFIRMED,REVIEW,EXIT]
      - field: lifecycle_transition_reason
        unit: string
      - field: lifecycle_days_in_stage
        unit: int
      hard_rules:
      - EXIT 단계 종목에 신규 ADD/BUY 금지
      - REVIEW 단계 종목에 T3 트랜치 진입 금지
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 lifecycle_stage 임의 격상 금지
      - EXIT -> CONFIRMED 복귀는 하네스 재산출 후만 가능
      version: 2026-05-21_SLG_V1
    CLA_REGIME_EXIT_CONDITION_V1:
      owner: quant_owner
      status: active
      purpose: 'CONCENTRATED_LEADER_ADVANCE 국면의 종료 조건을 결정론적으로 탐지한다. CLA 활성 중에도 하네스가
        주기적으로 종료 신호(S1~S5)를 스캔한다. 종료 조건 충족 시 market_regime을 CLA -> NEUTRAL 전환 권고.

        '
      applicable: buildHarnessContext_ 내 market_regime=CLA일 때만 실행.
      inputs:
      - field: ticker
        unit: string
      - field: rs_verdict
        unit: enum
      - field: brt_verdict
        unit: enum
      - field: frg_5d_sh
        unit: shares
      - field: volume
        unit: shares
      - field: avg_volume_5d
        unit: shares
      - field: market_regime
        unit: string
      output:
        field: cla_exit_status
        additional_fields:
        - cla_exit_signals_triggered
        - cla_exit_total_weight
      exit_signals:
        S1_rs_degradation:
          condition: (삼성전자 OR SK하이닉스 rs_verdict=LAGGARD) 연속5영업일
          weight: 3
        S2_kospi_contribution_drop:
          condition: 삼성전자+SK하이닉스 최근20D KOSPI 기여도 < 30%
          weight: 2
        S3_foreign_flow_reversal:
          condition: 삼성전자 frg_5d_sh < 0 AND SK하이닉스 frg_5d_sh < 0 연속3일
          weight: 2
        S4_volume_exhaustion:
          condition: 삼성전자+SK하이닉스 volume < avgVolume5d*0.6 연속3일
          weight: 1
        S5_brt_degradation:
          condition: 삼성전자 brt_verdict=MARKET AND SK하이닉스 brt_verdict=MARKET (LEADER에서
            하락)
          weight: 2
      exit_decision:
        CLA_EXIT_CONFIRMED:
          condition: total_weight >= 5
          action: market_regime -> NEUTRAL 권고. O2 반도체 25% 상한 재적용.
        CLA_EXIT_WARNING:
          condition: total_weight IN [3,4]
          action: CLA 종료 경보. 위성 신규매수 제한 해제 준비.
        CLA_ACTIVE:
          condition: total_weight < 3
          action: CLA 계속 유지. 기존 보호 규칙 적용.
      output_fields:
      - field: cla_exit_status
        unit: enum [CLA_ACTIVE,CLA_EXIT_WARNING,CLA_EXIT_CONFIRMED]
      - field: cla_exit_signals_triggered
        unit: list
      - field: cla_exit_total_weight
        unit: int
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 CLA 종료를 임의 선언 금지
      - CLA_EXIT_CONFIRMED 없이 O2 반도체 25% 상한 재적용 금지
      version: 2026-05-21_CLA_EXIT_V1
    PORTFOLIO_CORRELATION_GATE_V1:
      owner: quant_owner
      status: active
      purpose: '위성 포지션들 간 20D 수익률 Pearson 상관관계를 계산해 동일 방향 클러스터가 포트폴리오 하락 리스크를 증폭시키는지
        감지한다. 개별 Beta x 상관관계 조정으로 실질 포트폴리오 Beta(satellite_cluster_beta) 산출.

        '
      applicable: calcApexExecutionHarness_ 포트폴리오 집계 단계. SAPG_V1 이후 실행.
      inputs:
      - field: ticker
      - field: price.ret20D
      - field: beta_proxy
      - field: weight_pct
      computed:
        correlation_matrix: 각 위성 쌍 (i,j) Pearson 상관계수. 데이터 부족 시 ret20D/globalKospiRet20D_
          프록시.
        satellite_cluster_beta: sum(weight_i * weight_j * beta_i * beta_j * corr_ij)
          for all i,j pairs
        effective_portfolio_beta: (core_weight * core_beta) + satellite_cluster_beta
      gate_status:
        CORRELATION_BLOCK:
          condition: satellite_cluster_beta > 1.5 AND corr >= 0.70인 위성 쌍이 2쌍 이상
          action: 고상관 약한 위성 ADD 금지, REVIEW 위성 우선 정리, 실질 beta 보고서 표기 의무
        CORRELATION_WARN:
          condition: satellite_cluster_beta > 1.2 OR corr >= 0.70인 위성 쌍이 1쌍
          action: 신규 위성 편입 시 저상관 후보 우선
        CORRELATION_PASS:
          condition: satellite_cluster_beta <= 1.2
          action: 정상. M2 독립 적용.
      output_fields:
      - field: satellite_cluster_beta
      - field: effective_portfolio_beta
      - field: high_corr_pairs
        unit: list [{ticker1,ticker2,corr_coef}]
      - field: correlation_gate_status
        unit: enum [CORRELATION_PASS,CORRELATION_WARN,CORRELATION_BLOCK]
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 상관행렬 직접 계산 금지
      - 개별 beta 낮아도 satellite_cluster_beta 높으면 분산 됐다 서술 금지
      output:
        field: satellite_cluster_beta
        additional_fields:
        - effective_portfolio_beta
        - high_corr_pairs
        - correlation_gate_status
      version: 2026-05-21_PCG_V1
    ALPHA_FEEDBACK_LOOP_V1:
      owner: engine_owner
      status: active
      purpose: 'monthly_history의 AEW_V1 성과 데이터를 분석해 SAQG_V1 필터 임계값 조정 권고를 생성한다. 임계값
        자동 변경 금지. 하네스는 권고만 생성하고 사용자가 settings 파일에서 확인 승인.

        '
      applicable: 월 1회 settings 업데이트 배치 시 실행.
      inputs:
      - field: alpha_evaluation_window_json
        unit: array
      - field: saqg_v1
        unit: enum
      - field: brt_verdict
        unit: enum
      - field: market_regime
        unit: string
      analysis:
        eligible_t20_fail_rate: ELIGIBLE 케이스 중 t20_vs_samsung_pctp < -3 비율
        by_filter_combination: F1+F2+F3 통과 조합별 T+20 실패율 분포
      feedback_recommendation:
        threshold_tighten:
          condition: ELIGIBLE T+20 알파 실패율 > 50%
          recommendation: 'SAQG F1/F2/F3 임계값 강화 권고 (예: F2 recovery_ratio 1.20 -> 1.35)'
        threshold_relax:
          condition: ELIGIBLE T+20 성공률 > 70% AND 최근 12건 이상
          recommendation: 'SAQG F3 임계값 완화 검토 (예: excess_drawdown 5%p -> 7%p)'
      output_fields:
      - field: alpha_feedback_json
        subfields:
        - eligible_t20_fail_rate
        - eligible_t60_fail_rate
        - recommended_filter_adjustments
        - cases_analyzed
      hard_rules:
      - 임계값 자동 변경 금지 - 권고(RECOMMENDATION) 출력만
      - cases_analyzed < 10이면 DATA_INSUFFICIENT - 권고 생성 금지
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 alpha_feedback_json 없이 SAQG 임계값 변경 임의 권고 금지
      output:
        field: alpha_feedback_json
        additional_fields:
        - eligible_t20_fail_rate
        - eligible_t60_fail_rate
        - cases_analyzed
        - grade_count
      version: 2026-05-21_AFL_V1
    SELL_PRICE_SANITY_V1:
      owner: quant_owner
      status: active
      purpose: 'HTS 입력 전 매도 지정가의 역전, 비현실가, 호가단위 불일치를 100% 차단한다. LS전기(E1 오류) 재발 방지:
        지정가 < 손절가 역전 사례를 하네스가 선점 차단.

        '
      applicable: calcApexExecutionHarness_ 주문 최종 검증 단계. TICK_NORMALIZER_V1 직후 실행.
      inputs:
      - field: sell_limit_price
        unit: KRW_per_share
      - field: stop_loss_price
        unit: KRW_per_share
      - field: current_price
        unit: KRW_per_share
      - field: tick_unit
        unit: KRW_per_share
        note: TICK_NORMALIZER_V1 산출값
      validation_rules:
        INVALID_PRICE_INVERSION:
          condition: sell_limit_price < stop_loss_price
          action: HTS 주문표 제거. Shadow Ledger 이동. reason_code=INVALID_PRICE_INVERSION.
          example: 지정가 261,000 < 손절가 291,000 → 즉시 차단
        INVALID_CHASE_UP_SELL:
          condition: sell_limit_price > current_price * 1.03
          action: 사용자 Override 없이 주문표 제거.
        INVALID_TICK:
          condition: sell_limit_price % tick_unit != 0
          action: TICK_NORMALIZER_V1 자동 재정규화 후 재산출. (HS008 통합)
        WARN_DEEP_DISCOUNT_SELL:
          condition: sell_limit_price < current_price * 0.90
          action: 주문표 유지, 보고서 상단 경고 표시.
      output:
        field: sell_price_sanity_status
        values:
        - PASS
        - INVALID_PRICE_INVERSION
        - INVALID_CHASE_UP_SELL
        - INVALID_TICK
        - WARN_DEEP_DISCOUNT_SELL
        additional_fields:
        - sanity_fail_reason
        - corrected_limit_price
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - INVALID_PRICE_INVERSION 행을 HTS 주문표에 기재 금지
      - LLM이 '임시로' 역전 가격을 주문표에 넣는 행위 절대 금지
      - TICK 재정규화 전 가격을 HTS에 입력 금지 (HS008)
      canonical_ref: AGENTS.md:Direction A1, HS008(TICK_NORMALIZER_V1)
      version: 2026-05-22_3RD_HARNESS
    CASH_RECOVERY_OPTIMIZER_V1:
      owner: quant_owner
      status: active
      purpose: '목표 현금 회복액에 최소 주식가치 훼손으로 도달하는 최적 매도 조합을 결정론적 산출. LLM이 "63주+24주+19주+1주"
        즉석 계산(HS011 위반) 재발 방지.

        '
      applicable: CASH_SHORTFALL_V1 및 H2 sell_priority 확정 후 실행.
      inputs:
      - field: cash_shortfall_target_krw
        unit: KRW
        note: G1 CASH_SHORTFALL_V1 확정값
      - field: cash_shortfall_min_krw
        unit: KRW
        note: G1 확정값
      - field: sell_candidates_json
        unit: list
        note: H2 regime_rank 순서
      - field: immediate_sell_qty
        unit: shares
        note: K2 산출값 또는 holding_qty
      - field: sell_limit_price
        unit: KRW_per_share
      - field: holding_qty
        unit: shares
      algorithm:
        step1: H2 regime_rank 순서로 expected_krw = immediate_sell_qty × sell_limit_price
          누적
        step2: cumulative_krw >= cash_shortfall_min_krw 도달 시 중단
        step3: shortfall 미달 시 다음 H2 순위 종목 추가
        step4: 모두 소진 후 shortfall 잔여 시 EMERGENCY 경보 + emergency_full_sell 재판정
      output:
        field: cash_recovery_plan_json
        schema:
          target_krw: KRW
          min_krw: KRW
          plan_status: enum [SUFFICIENT, PARTIAL, EMERGENCY]
          sell_sequence:
          - ticker: 종목코드
            qty: shares (정수)
            limit_price: KRW_per_share
            expected_krw: KRW
            cumulative_krw: KRW
            formula: CASH_RECOVERY_OPTIMIZER_V1
          gap_remaining_krw: KRW
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 '약 N원 필요하니 X주 팔자' 즉석 계산 금지 (HS011)
      - sell_sequence[] 배열 임의 재정렬·종목 변경 금지
      - plan_status=EMERGENCY이면 K2 emergency_full_sell 재판정 없이 전량매도 지시 금지
      canonical_ref: AGENTS.md:Direction A2, G1, G2, H2
      version: 2026-05-22_3RD_HARNESS
    INTRADAY_ACTION_MATRIX_V1:
      owner: engine_owner
      status: active
      purpose: '장중 시각(capture_time)에 따라 허용·금지 액션을 테이블로 고정한다. 09:31 캡처임에도 전체 주간 전략
        출력(E4 오류) 재발 방지.

        '
      applicable: DETERMINISTIC_ROUTING_ENGINE_V1 STAGE 1. capture_time 확정 직후.
      inputs:
      - field: capture_time
        unit: HH:MM
        note: account_snapshot에서 자동 추출
      - field: market_date
        unit: date
      time_slot_table:
        09:00-09:30:
          label: OPEN_AUCTION
          allowed_actions:
          - WATCH_ONLY
          blocked_actions:
          - BUY
          - SELL
          - TRIM
        09:30-10:30:
          label: EARLY_SESSION
          allowed_actions:
          - TRIM_ONLY
          blocked_actions:
          - BUY
          - SELL_ALL
          note: OVERSOLD_REBOUND_SELL 제외
        10:30-14:00:
          label: MID_SESSION
          allowed_actions:
          - TRIM
          - STAGED_SELL
          - WATCH
          blocked_actions:
          - BUY_NEW
          - SELL_ALL
        14:00-15:00:
          label: LATE_SESSION
          allowed_actions:
          - TRIM
          - STAGED_SELL
          blocked_actions:
          - BUY_NEW
          - SELL_ALL
        15:00-15:20:
          label: PRE_CLOSE
          allowed_actions:
          - TRIM_ONLY
          blocked_actions:
          - BUY
          - SELL_ALL
        15:20-15:30:
          label: CLOSE_VERIFY
          allowed_actions:
          - ALL_ACTIONS_ALLOWED
          blocked_actions: []
          note: 종가 근처 재검증 후 실행. 모든 액션 허용.
        15:30+:
          label: POST_MARKET
          allowed_actions:
          - REBALANCING_REVIEW
          - NEXT_DAY_PLAYBOOK
          blocked_actions:
          - HTS_IMMEDIATE_EXECUTION
        BEFORE_MARKET:
          label: PRE_MARKET
          allowed_actions:
          - PLAYBOOK_DRAFT
          blocked_actions:
          - HTS_IMMEDIATE_EXECUTION
      output:
        fields:
        - field: time_slot_label
          unit: enum
        - field: allowed_intraday_actions
          unit: list
        - field: blocked_intraday_actions
          unit: list
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - allowed_intraday_actions[]에 없는 주문 유형을 보고서에 생성 금지
      - 09:00-10:30 캡처 시 BUY/SELL_ALL 주문표 생성 금지
      - TRIM_ONLY 구간에서 주간 전략·종가 예측 등 전체 보고서 출력 금지 — 해당 섹션은 '15:20 재실행 예정' 표기
      canonical_ref: AGENTS.md:Direction A3, Direction 0(장중 제약)
      version: 2026-05-22_3RD_HARNESS
    ANTI_CHASING_VELOCITY_V1:
      owner: engine_owner
      status: active
      purpose: '가격 상승 속도가 국면별 임계값 초과 시 BUY를 결정론적으로 차단한다. N2(거래량 확인)만으로는 막지 못하는 속도
        기반 뒷박 매수 원천 차단.

        '
      applicable: _addTickerGates_ 내 alpha_lead_score 산출 직후.
      inputs:
      - field: close
        unit: KRW_per_share
      - field: close_1d_ago
        unit: KRW_per_share
      - field: close_5d_ago
        unit: KRW_per_share
      - field: market_regime
        unit: enum
      computed:
        velocity_1d: (close - close_1d_ago) / close_1d_ago * 100
        velocity_5d: (close - close_5d_ago) / close_5d_ago * 100
      thresholds_by_regime:
        EVENT_SHOCK:
          v1d_max: 2
          v5d_max: 5
          verdict: BLOCK_CHASE_SHOCK
        RISK_OFF:
          v1d_max: 3
          v5d_max: 7
          verdict: BLOCK_CHASE_RISKOFF
        NEUTRAL:
          v1d_max: 4
          v5d_max: 9
          verdict: WARN_CHASE_NEUTRAL
        RISK_ON:
          v1d_max: 5
          v5d_max: 12
          verdict: WARN_CHASE_RISKON
        CLA:
          v1d_max: 6
          v5d_max: 15
          verdict: WARN_CHASE_CLA
      actions:
        BLOCK_CHASE: BUY 금지. alpha_lead_score에 -15 페널티 적용.
        WARN_CHASE: BUY 주문표에 '속도 추격 경고 — 풀백 대기 권고' 표기.
        CLEAR: 정상. 속도 기반 차단 없음.
      output:
        field: anti_chasing_velocity_status
        values:
        - BLOCK_CHASE_SHOCK
        - BLOCK_CHASE_RISKOFF
        - WARN_CHASE_NEUTRAL
        - WARN_CHASE_RISKON
        - WARN_CHASE_CLA
        - CLEAR
        additional_fields:
        - velocity_1d
        - velocity_5d
        - velocity_penalty_applied
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - BLOCK_CHASE 상태에서 '분위기 좋으니 추격 매수 괜찮다' 우회 서술 금지
      - LLM이 velocity 직접 계산 금지 — 하네스 산출값만 인용
      canonical_ref: AGENTS.md:Direction B1
      version: 2026-05-22_3RD_HARNESS
    PULLBACK_ENTRY_TRIGGER_V1:
      owner: engine_owner
      status: active
      purpose: '뒷박 상태(ANTI_CHASING_VELOCITY BLOCK)에서 풀백 조건이 충족되면 자동 진입 트리거를 생성. "지금
        사면 뒷박 → 풀백 기다려 적정 가격에 진입"을 결정론적으로 산출.

        '
      applicable: ANTI_CHASING_VELOCITY_V1 직후. BLOCK_CHASE 종목에만 적용.
      inputs:
      - field: velocity_1d
        unit: percent
      - field: close
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: volume
        unit: shares
      - field: avg_volume_5d
        unit: shares
      - field: alpha_lead_score
        unit: score_0_100
      - field: anti_chasing_status
        unit: enum
      conditions:
        COND_1: velocity_1d < -1.5%  (조정 시작 확인)
        COND_2: close <= ma20 * 1.02  (이동평균 근접)
        COND_3: volume >= avg_volume_5d * 0.7  (거래량 급감 없음)
        COND_4: alpha_lead_score >= 70  (기본 품질 유지)
        COND_5: anti_chasing_velocity_status != BLOCK_*  (속도 차단 해제)
      state_machine:
        WAIT_PULLBACK: BLOCK_CHASE 상태이나 COND 미충족
        PULLBACK_ENTRY_READY: COND 1~5 모두 충족 → T1 체결 허용
        STALE_PULLBACK_EXPIRED: entry_date + 15 영업일 초과 → 트리거 만료
      expressions:
        pullback_trigger_price: max(ma20, prevClose - 0.5 * atr20), tick 정규화
        pullback_expiry_date: entry_date + 15 영업일
      output:
        field: pullback_state
        values:
        - WAIT_PULLBACK
        - PULLBACK_ENTRY_READY
        - STALE_PULLBACK_EXPIRED
        - NOT_APPLICABLE
        additional_fields:
        - pullback_trigger_price
        - pullback_expiry_date
        - conditions_met
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - WAIT_PULLBACK 상태에서 LLM이 즉시 BUY 지시 금지
      - STALE_PULLBACK_EXPIRED 후 만료된 트리거로 매수 금지
      - pullback_trigger_price를 LLM이 재계산 금지
      canonical_ref: AGENTS.md:Direction B2, K1
      version: 2026-05-22_3RD_HARNESS
    DISTRIBUTION_SELL_DETECTOR_V1:
      owner: quant_owner
      status: active
      purpose: 'PRE_DISTRIBUTION_EARLY_WARNING(2신호)의 정밀도 한계 보완. 기관·외인이 개인에게 물량을 넘기는
        설거지 구간을 6신호 합산으로 조기 감지.

        '
      related_formula: >
        spec/13b_harness_formulas.yaml:DISTRIBUTION_RISK_SCORE_V1(GAS calcDistributionRiskRow_,
        BUY/STAGED_BUY/ADD_ON 차단 점수식)과 별개의 독립 공식이다(2026-06-22 역할 분리
        확정, governance/gas_logic_migration_ledger_v1.yaml F12/F13). 하나가 다른 하나를
        대체하지 않으며 둘 다 유지한다.
      applicable: _addTickerGates_ 내 FLOW_ACCELERATION_V1 직후.
      inputs:
      - field: close
        unit: KRW_per_share
      - field: high52w
        unit: KRW_per_share
        optional: true
      - field: avg_volume_5d
        unit: shares
      - field: volume
        unit: shares
      - field: ret5d
        unit: percent
      - field: flow_credit
        unit: ratio_0_1
      - field: frg_5d_sh
        unit: shares
      - field: inst_5d_sh
        unit: shares
      - field: rsi14
        unit: score_0_100
        optional: true
      - field: obv_slope_20d
        unit: float
        optional: true
      signals:
        SIG_1:
          condition: high52w > 0 AND close >= high52w * 0.97 AND volume < avg_volume_5d
            * 0.80
          label: 신고가 근접 + 거래량 수축
          weight: 2.0
        SIG_2:
          condition: ret5d >= 5 AND flow_credit < 0.45
          label: 5일 급등 + 수급 약화
          weight: 2.0
        SIG_3:
          condition: frg_5d_sh < 0 AND inst_5d_sh < 0
          label: 외인+기관 동반 순매도 (3일 연속)
          weight: 1.5
        SIG_4:
          condition: rsi14 != null AND rsi14 >= 75 AND close < open_today
          label: RSI 과열 + 당일 음봉
          weight: 1.5
        SIG_5:
          condition: obv_slope_20d != null AND obv_slope_20d < 0
          label: OBV 20일 기울기 음수
          weight: 1.0
        SIG_6:
          condition: ret1d_prev >= 5 AND close < open_today * 0.98
          label: 전일 급등 후 당일 -2% 갭하락
          weight: 1.0
      classification:
        weighted_sum: sum of (signal.weight for each triggered signal)
        DISTRIBUTION_CONFIRMED:
          condition: weighted_sum >= 4.0
          action: BUY 완전 차단 + TRIM_REVIEW 발동
        DISTRIBUTION_WARNING:
          condition: weighted_sum >= 2.0 AND weighted_sum < 4.0
          action: BUY 보류 권고 + EARLY_WARNING 표기
        DISTRIBUTION_CLEAR:
          condition: weighted_sum < 2.0
          action: 정상 진행
      output:
        field: distribution_sell_detector_status
        values:
        - DISTRIBUTION_CONFIRMED
        - DISTRIBUTION_WARNING
        - DISTRIBUTION_CLEAR
        additional_fields:
        - weighted_sum
        - signals_triggered
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - DISTRIBUTION_CONFIRMED 상태에서 LLM '단기 조정이니 괜찮다' 우회 금지
      - PRE_DISTRIBUTION_EARLY_WARNING과 독립적으로 둘 다 체크 (OR 아님, AND 독립)
      - LLM이 신호 합산을 직접 계산 금지
      canonical_ref: AGENTS.md:Direction B3, L4(PRE_DISTRIBUTION)
      version: 2026-05-22_3RD_HARNESS
    SELL_WATERFALL_ENGINE_V1:
      owner: quant_owner
      status: active
      purpose: '"주식가치를 크게 훼손하지 않으면서 반등 시 수익까지 고려"하는 현금확보 매도 표준화. K2(50/50 분할)를 확장한
        4단계 체계. CASH_RECOVERY_OPTIMIZER_V1과 연동.

        '
      applicable: CASH_RECOVERY_OPTIMIZER_V1 직후. 현금 부족 시 자동 발동.
      inputs:
      - field: cash_recovery_plan_json
        unit: json
        note: CASH_RECOVERY_OPTIMIZER_V1 산출
      - field: emergency_full_sell
        unit: boolean
        note: K2 산출값
      - field: oversold_gate
        unit: enum
        note: K2 oversold 판정
      - field: rsi14
        unit: score
      - field: close
        unit: KRW_per_share
      - field: prev_close
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      stage_logic:
        stage_4_emergency:
          condition: emergency_full_sell == true
          action: H2 최우선 종목 전량 즉시 매도 (시장가 -1tick)
          purpose: 마진콜·D+2 결제 위기 방지
        stage_1_immediate_trim:
          condition: emergency_full_sell == false
          action: H2 1순위 50% 즉시 지정가 매도
          limit_price_formula: 'prev_close - 0.3 * atr20 (OVERSOLD 구간: prev_close
            + 0.5 * atr20)'
          prerequisite: SELL_PRICE_SANITY_V1 PASS 필수
        stage_2_rebound_wait:
          condition: stage_1 실행 후
          action: 나머지 50% 반등 트리거 대기
          rebound_trigger_price: prev_close + 0.5 * atr20 (tick 정규화)
          rebound_tp_price: prev_close + 1.0 * atr20 (반등 수익 포착)
          deadline: 3 영업일. 초과 시 stage_1 가격으로 자동 전환.
        stage_3_cascading_trim:
          condition: stage_1+2 후 cash_shortfall 잔여
          action: H2 2순위→3순위 순서로 stage_1/2 반복
          stop_condition: cumulative_krw >= cash_shortfall_min_krw
      output:
        field: waterfall_plan_json
        schema:
          current_stage: int 1~4
          stage_label: enum [IMMEDIATE_TRIM, REBOUND_WAIT, CASCADING_TRIM, EMERGENCY_EXIT]
          sell_sequence:
          - ticker: 종목코드
            stage: int
            qty: shares
            limit_price: KRW_per_share (stage2는 null)
            rebound_trigger_price: KRW_per_share (stage2만)
            rebound_tp_price: KRW_per_share (stage2만)
            deadline: date (stage2만)
          expected_immediate_krw: KRW
          expected_rebound_tp_krw: KRW
          total_recovery_potential_krw: KRW
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - waterfall_plan_json.sell_sequence 순서 임의 변경 금지
      - stage 건너뜀 금지 (stage1→stage3 직행 금지)
      - rebound_wait_qty를 '현금이 급하다'는 이유로 즉시 매도 전환 금지 (K2 연동)
      - rebound_tp_price가 있으면 HTS 주문표에 '반등 익절가' 컬럼 필수 표기
      canonical_ref: AGENTS.md:Direction C1, K2
      version: 2026-05-22_3RD_HARNESS
    SELL_LOT_PARETO_SELECTOR_V1:
      owner: quant_owner
      status: active
      purpose: >
        SELL_WATERFALL_ENGINE_V1의 동일 hard_precedence 단계 안에서 후보 lot을 점수화하고,
        세금 회피 효과·재진입 비용·놓친 상승분까지 포함한 다목적(Pareto) 비교로
        동순위 후보 중 어느 lot을 먼저 매도할지 결정론적으로 선택한다.
        (governance/todo/v8_9_p0_adoption_plan.yaml P0-2.1,
        source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:sell_and_cash_repair_optimizer_v8_9)
      applicable: SELL_WATERFALL_ENGINE_V1의 동일 stage 내 후보가 2개 이상일 때.
      inputs:
      - field: avoided_tail_loss_krw
        unit: KRW
      - field: cash_repair_benefit_krw
        unit: KRW
      - field: concentration_reduction_benefit_krw
        unit: KRW
      - field: tax_loss_benefit_krw
        unit: KRW
      - field: tax_fee_slippage_krw
        unit: KRW
      - field: reentry_cost_krw
        unit: KRW
      - field: missed_upside_penalty_krw
        unit: KRW
      expression: >
        LOT_SELL_SCORE_KRW = avoided_tail_loss_krw + cash_repair_benefit_krw + concentration_reduction_benefit_krw
        + tax_loss_benefit_krw - tax_fee_slippage_krw - reentry_cost_krw - missed_upside_penalty_krw
      output:
        field: lot_sell_score_krw
        unit: KRW
      pareto_dominance_rule:
        dominates_if: >
          A가 모든 maximize 목표(avoided_tail_loss_krw, cash_repair_benefit_krw, concentration_reduction_benefit_krw,
          tax_loss_benefit_krw)에서 B 이상이고 모든 minimize 목표(tax_fee_slippage_krw, reentry_cost_krw,
          missed_upside_penalty_krw)에서 B 이하이며, 적어도 한 항목에서 우월하면 A dominates B.
        tie_breaker_if_no_dominance: [lot_sell_score_krw 높은 순, tax_fee_slippage_krw 낮은 순, reentry_cost_krw 낮은 순]
      missing_policy: missed_upside_penalty_krw·tax_loss_benefit_krw 미확인 시 0(보수적 하한). DATA_MISSING으로 표기.
      canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.candidate_scoring
      implementation: tools/build_sell_waterfall_engine_v4.py
      version: 2026-06-17_P0_v8_9_adoption
    FORECAST_SIMULATION_ENGINE_V1:
      owner: engine_owner
      status: active
      purpose: >
        개별 종목의 점 추정 기대수익률이 아니라 레짐별 손익분포에서 CE70(30%분위)·CE90(10%분위)·
        CVaR95(95% 신뢰구간 꼬리손실 평균)를 산출한다. 표본 부족 시 가짜 분포를 만들지 않고
        WATCH_ONLY 또는 DATA_MISSING으로 정직하게 반환한다.
        (governance/todo/v8_9_p0_adoption_plan.yaml P0-3.1,
        source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:forecast_and_simulation_engine_v8_9)
      applicable: PORTFOLIO_TRANSITION_UTILITY_V1의 ce70_net_profit_krw 입력 직전.
      inputs:
      - field: net_profit_distribution_after_tax_fee_slippage
        source: spec/29_backtest_harness_contract.yaml:current_metrics
        unit: list_of_KRW
      - field: sample_count_total
        unit: count
      - field: sample_count_same_regime
        unit: count
      - field: execution_mode
        unit: enum
      minimum_sample_rules:
        AUDIT_ONLY: {sample_count_total_min: 0, sample_count_same_regime_min: 0}
        SHADOW: {sample_count_total_min: 30, sample_count_same_regime_min: 10}
        PILOT: {sample_count_total_min: 80, sample_count_same_regime_min: 20}
        LIVE_LIMITED: {sample_count_total_min: 150, sample_count_same_regime_min: 30}
        LIVE_FULL: {sample_count_total_min: 300, sample_count_same_regime_min: 50}
        agents_md_cross_check: "AGENTS.md §6b: Live T+20 표본 30건 미만이면 active/PASS_100 승격 금지"
      expression:
        ce70_net_profit_krw: quantile(net_profit_distribution_after_tax_fee_slippage, 0.30)
        ce90_net_profit_krw: quantile(net_profit_distribution_after_tax_fee_slippage, 0.10)
        cvar95_loss_krw: mean(losses beyond 95th percentile loss threshold in net_profit_distribution_after_tax_fee_slippage)
      output:
        field: ce70_net_profit_krw
        unit: KRW_or_null
      missing_policy: 표본이 minimum_sample_rules 미달이면 모든 출력 null + gate=WATCH_ONLY. 0으로 대체 금지.
      canonical_ref: spec/29_backtest_harness_contract.yaml:current_metrics.walk_forward
      implementation: tools/build_forecast_simulation_engine_v1.py
      version: 2026-06-17_P0_v8_9_adoption
    SECTOR_EXPOSURE_GRAPH_V1:
      owner: engine_owner
      status: active
      purpose: >
        섹터를 L1:L2:L3:L4 canonical ID로 분류하고 ETF 구성종목을 lookthrough하여 직접보유와
        합산한 실질노출을 계산하며, 테마 간 중복 베타를 residualize한다.
        (governance/todo/v8_9_p1_adoption_plan.yaml P1-A.1)
      canonical_sector_id_format: 'L1:L2:L3:L4, 예: EQ:TECH:SEMIS:HBM'
      inputs:
      - field: direct_weight_pct
        unit: percent
      - field: etf_constituents_json
        unit: json
      - field: etf_weight_pct
        unit: percent
      - field: sector_id
        unit: string
      - field: peer_sector_betas
        unit: list_of_ratio
      expression:
        lookthrough_etf_weight_pct: "sum(constituent.weight_pct * etf_weight_pct / 100 for constituent in etf_constituents_json if constituent.sector_id == sector_id)"
        sector_family_total_pct: "direct_weight_pct + lookthrough_etf_weight_pct"
      output:
        field: sector_family_total_pct
        unit: percent
      missing_policy: etf_constituents_json 미확인 시 ETF_BUY_BLOCKED. lookthrough를 0으로 추정 금지.
      canonical_ref: spec/risk/portfolio_exposure.yaml:duplicate_exposure_rule
      implementation: tools/build_sector_exposure_graph_v1.py
      version: 2026-06-17_P1_v8_9_adoption
    LEADER_LIFECYCLE_GATE_V1:
      owner: engine_owner
      status: active
      purpose: >
        종목의 시장 주도력을 CAPTAIN/CORE_LEADER/ENABLER/CYCLICAL_BETA/LAGGARD/DISTRIBUTION_RISK로
        분류하고 승급·강등을 결정론적으로 평가한다.
        (governance/todo/v8_9_p1_adoption_plan.yaml P1-A.2)
      roles: [CAPTAIN, CORE_LEADER, ENABLER, CYCLICAL_BETA, LAGGARD, DISTRIBUTION_RISK]
      inputs:
      - field: relative_strength_leads_sector
        unit: boolean
      - field: volume_quality_confirmed
        unit: boolean
      - field: above_ma60_or_reclaim_confirmed
        unit: boolean
      - field: earnings_revision_status
        unit: 'enum: positive | neutral | negative'
      - field: institutional_flow_status
        unit: 'enum: accumulation | neutral | distribution'
      - field: current_role
        unit: enum
      output:
        field: leader_role
        unit: enum
      missing_policy: 입력 결측 시 current_role 유지. 임의 승급/강등 금지.
      canonical_ref: spec/strategy/leader_scan.yaml
      implementation: tools/build_sector_exposure_graph_v1.py
      version: 2026-06-17_P1_v8_9_adoption
    EXECUTION_CAPACITY_LADDER_V1:
      owner: engine_owner
      status: active
      purpose: >
        계획된 주문금액이 종목의 실제 체결 가능 용량을 초과하지 않도록 캡핑하고,
        broker_microstructure_packet이 없으면 주문 계획을 차단한다.
        (governance/todo/v8_9_p1_adoption_plan.yaml P1-B.1)
      inputs:
      - field: planned_order_amount_krw
        unit: KRW
      - field: avg_trade_value_20d_krw
        unit: KRW
      - field: intraday_trade_value_krw
        unit: KRW
      - field: orderbook_top3_depth_krw
        unit: KRW
      - field: spread_bps
        unit: basis_points
      expression: >
        order_capacity_krw = min(planned_order_amount_krw, avg_trade_value_20d_krw * 0.003,
        intraday_trade_value_krw * 0.01, orderbook_top3_depth_krw * 0.30)
      output:
        field: order_capacity_krw
        unit: KRW
      missing_policy: broker_microstructure_packet 필드 결측 시 EXECUTION_PLAN_BLOCKED. 추정 금지.
      canonical_ref: spec/05_position_sizing.yaml
      implementation: tools/build_execution_capacity_ladder_v1.py
      version: 2026-06-17_P1_v8_9_adoption
    MODEL_GOVERNANCE_KILL_SWITCH_V1:
      owner: engine_owner
      status: active
      purpose: >
        data_quarantine_rate, implementation_shortfall, T5_hit_rate, calibration_error,
        drawdown 5개 지표를 감시해 기준 이탈 시 execution_mode를 자동으로 한 단계 강등한다.
        (governance/todo/v8_9_p1_adoption_plan.yaml P1-C.1)
      promotion_ladder: [AUDIT_ONLY, SHADOW, PILOT, LIVE_LIMITED, LIVE_FULL]
      inputs:
      - field: data_quarantine_rate_pct
        unit: percent
      - field: implementation_shortfall_ratio
        unit: ratio
      - field: t5_hit_rate_pct
        unit: percent
      - field: t5_sample_count
        unit: count
      - field: calibration_error
        unit: ratio
      - field: calibration_error_limit
        unit: ratio
      - field: account_mdd_pct
        unit: percent
      - field: account_mdd_budget_pct
        unit: percent
      kill_switch_conditions:
      - id: data_quarantine_rate_above_5pct
        condition: data_quarantine_rate_pct > 5.0
      - id: implementation_shortfall_above_2x_expected
        condition: implementation_shortfall_ratio > 2.0
      - id: t5_hit_rate_below_50pct_for_30_trades
        condition: t5_sample_count >= 30 AND t5_hit_rate_pct < 50.0
      - id: calibration_error_above_limit
        condition: calibration_error > calibration_error_limit
      - id: unexpected_drawdown_breach
        condition: account_mdd_pct > account_mdd_budget_pct
      output:
        field: execution_mode
        unit: enum
      missing_policy: 입력 결측 시 평가 가능한 지표만으로 판정. 전부 결측이면 execution_mode 변경 없음(DATA_MISSING).
      canonical_ref: spec/57_shadow_promotion_scorecard.yaml
      implementation: tools/build_model_governance_kill_switch_v1.py
      version: 2026-06-17_P1_v8_9_adoption
    SCENARIO_SHOCK_MATRIX_V1:
      owner: engine_owner
      status: active
      purpose: >
        base_case 분포에 adverse/liquidity_drought/crisis/fx_shock/tax_cost 5개 스트레스를
        결정론적으로 적용해 시나리오별 CE70/CVaR95를 산출한다.
        (governance/todo/v8_9_p2_adoption_plan.yaml P2-A)
      scenario_definitions:
        base_case: {shock_multiplier: 1.0}
        adverse_case: {shock_multiplier: 1.5}
        liquidity_drought_case: {shock_multiplier: 1.3, capacity_derate_pct: 40}
        crisis_case: {shock_multiplier: 2.0, correlation_to_one: true}
        fx_shock_case: {shock_multiplier: 1.2, applies_only_to: foreign_assets}
        tax_cost_case: {shock_multiplier: 1.0, additional_cost_pct: 5}
      inputs:
      - field: net_profit_distribution_after_tax_fee_slippage
        unit: list_of_KRW
      - field: scenario_id
        unit: enum
      output:
        field: scenario_results
        unit: 'list_of_{scenario_id, scenario_ce70_krw, scenario_cvar95_krw}'
      missing_policy: 분포 없으면 전체 DATA_MISSING. 시나리오별 임의 분포 생성 금지.
      canonical_ref: spec/formulas/domains/simulation.yaml:FORECAST_SIMULATION_ENGINE_V1
      implementation: tools/build_scenario_shock_matrix_v1.py
      version: 2026-06-17_P2_v8_9_adoption
    TRANSITION_SET_ENUMERATOR_V1:
      owner: engine_owner
      status: active
      purpose: >
        candidate 1건씩이 아니라 조합(transition_set) 단위로 hard_constraint_pass와
        transition_utility_krw를 재평가해, 개별로는 통과하는 후보들의 조합이 cash_floor·
        concentration cap을 넘는 경우를 차단한다.
        (governance/todo/v8_9_p2_adoption_plan.yaml P2-B)
      inputs:
      - field: evaluated_candidates
        unit: list_of_object
      - field: max_set_size
        unit: count
        default: 3
      output:
        field: selected_transition_set
        unit: list_of_candidate_id
      missing_policy: evaluated_candidates 비어있으면 selected_transition_set=[] + NO_TRADE.
      canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
      implementation: tools/build_transition_set_enumerator_v1.py
      version: 2026-06-17_P2_v8_9_adoption
    IMMUTABLE_DECISION_LEDGER_V1:
      owner: report_owner
      status: active
      purpose: >
        모든 의사결정을 append-only로 기록한다. 동일 decision_id 재기록은 거부하고,
        T1/T5/T20/MAE/MFE는 원본 레코드를 수정하지 않고 별도 append로만 추가한다.
        (governance/todo/v8_9_p2_adoption_plan.yaml P2-C)
      inputs:
      - field: decision_id
        unit: string
      - field: input_hash_bundle
        unit: string
      - field: execution_mode
        unit: enum
      - field: candidate_ids
        unit: list_of_string
      - field: selected_transition_id
        unit: string_or_null
      required_fields:
      - decision_id
      - timestamp
      - engine_version
      - input_hash_bundle
      - execution_mode
      - candidate_ids
      - selected_transition_id
      - hard_blocks
      - transition_utility_krw
      - operator_override
      - order_ids
      - fill_prices
      - slippage
      - T1_return
      - T5_return
      - T20_return
      - MAE
      - MFE
      output:
        field: ledger_append_status
        unit: 'enum: APPENDED | DUPLICATE_DECISION_ID | REJECTED_MISSING_FIELDS'
      missing_policy: required_fields 결측 시 REJECTED_MISSING_FIELDS.
      canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
      implementation: tools/build_immutable_decision_ledger_v1.py
      version: 2026-06-17_P2_v8_9_adoption
    EXECUTION_PLAN_COMPILER_V1:
      owner: engine_owner
      status: active
      purpose: >
        order_capacity_krw를 30/30/40 LIMIT_SPLIT 슬라이스로 컴파일하고, 슬라이스 실행 직전마다
        cash_floor·capacity·spread를 재검증해 cancel_remaining_if 조건 충족 시 잔여 슬라이스를 취소한다.
        (governance/todo/v8_9_p2_adoption_plan.yaml P2-D)
      inputs:
      - field: order_capacity_krw
        unit: KRW
      - field: revalidation_snapshot
        unit: json
      - field: baseline_snapshot
        unit: json
      cancel_remaining_if:
      - spread_widens_beyond_limit: "revalidation_snapshot.spread_bps > baseline_snapshot.spread_bps * 1.5"
      - cash_floor_after_fill_breached: "revalidation_snapshot.cash_floor_pct < required_cash_pct"
      - orderbook_capacity_collapses: "revalidation_snapshot.order_capacity_krw < baseline_snapshot.order_capacity_krw * 0.5"
      output:
        field: compiled_slices
        unit: 'list_of_{slice_index, slice_amount_krw, status}'
      missing_policy: order_capacity_krw 또는 baseline_snapshot 결측 시 EXECUTION_PLAN_BLOCKED.
      canonical_ref: spec/formulas/domains/execution.yaml:EXECUTION_CAPACITY_LADDER_V1
      implementation: tools/build_execution_plan_compiler_v1.py
      version: 2026-06-17_P2_v8_9_adoption
    STATE_VECTOR_CONSTRUCTOR_V1:
      owner: engine_owner
      status: active
      purpose: >
        holdings, cash, tax_lots, sector_graph, factor_exposures, macro_regime_probabilities를
        단일 state_vector로 통합한다. 결측 component는 null로 유지하고 추정 보완 금지.
        (governance/todo/v8_9_p3_adoption_plan.yaml P3-A)
      inputs:
      - field: cash_ladder
        unit: json
      - field: positions
        unit: list_of_object
      - field: sector_exposure_graph
        unit: list_of_object
      - field: factor_exposures
        unit: list_of_object
      - field: tax_lots
        unit: list_of_object
      - field: risk_bucket_weights
        unit: object
      - field: macro_regime_probabilities
        unit: object
      - field: goal_progress_pct
        unit: percent
      output:
        field: state_vector
        unit: object
      missing_policy: 결측 component는 null + missing_components 기록. 추정 보완 금지.
      canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
      implementation: tools/build_state_vector_constructor_v1.py
      version: 2026-06-17_P3_v8_9_adoption
    REBALANCE_CADENCE_GATE_V1:
      owner: engine_owner
      status: active
      purpose: >
        주간/1·11·21일 점검을 의무 실행하되, transition_utility_after_tax_cost가 양수이거나
        hard_risk_block이 active일 때만 실제 리밸런싱 실행을 허용한다.
        (governance/todo/v8_9_p3_adoption_plan.yaml P3-D)
      mandatory_schedule:
        weekly_days: [SATURDAY, SUNDAY]
        monthly_mid_check_days: [1, 11, 21]
      inputs:
      - field: today_date
        unit: date
      - field: transition_utility_after_tax_cost_krw
        unit: number_or_null
      - field: hard_risk_block_active
        unit: boolean
      output:
        field: rebalance_execution_allowed
        unit: boolean
      missing_policy: 양쪽 입력 모두 결측 시 rebalance_execution_allowed=false + DATA_MISSING.
      canonical_ref: spec/risk/aggregate_risk.yaml
      implementation: tools/build_rebalance_cadence_gate_v1.py
      version: 2026-06-17_P3_v8_9_adoption
    WALK_FORWARD_BOOTSTRAP_V1:
      owner: engine_owner
      status: active
      purpose: >
        historical_returns에서 walk-forward(비복원, in/out-of-sample 분리) 및 regime-matched
        (동일 레짐 필터 + 복원추출) 리샘플링으로 net_profit_distribution을 생성한다.
        (governance/todo/v8_9_p3_adoption_plan.yaml P3-B)
      inputs:
      - field: historical_returns
        unit: list_of_object
      - field: current_regime_state
        unit: string
      - field: bootstrap_method
        unit: enum
      output:
        field: net_profit_distribution_after_tax_fee_slippage
        unit: list_of_KRW_or_null
      missing_policy: historical_returns 결측 또는 표본 1건 이하면 null + DATA_MISSING.
      canonical_ref: spec/29_backtest_harness_contract.yaml:current_metrics.walk_forward
      implementation: tools/build_walk_forward_bootstrap_v1.py
      version: 2026-06-17_P3_v8_9_adoption
    WEEKLY_LEGACY_TRANSFER_PLAN_V1:
      owner: engine_owner
      status: active
      purpose: >
        주간 레거시→CMA 이전 계획을 입금 확인 전까지 deployable_cash_krw에 합산하지 않는다.
        (governance/todo/v8_9_p3_adoption_plan.yaml P3-E)
      inputs:
      - field: weekly_legacy_to_cma_transfer_plan_krw
        unit: KRW
        default: 4000000
      - field: transfer_confirmed
        unit: boolean
      - field: transfer_confirmed_amount_krw
        unit: KRW_or_null
      output:
        field: deployable_cash_contribution_krw
        unit: KRW
      missing_policy: transfer_confirmed null이면 false로 간주.
      canonical_ref: spec/risk/portfolio_exposure.yaml:cash_floor
      implementation: tools/build_weekly_legacy_transfer_plan_v1.py
      version: 2026-06-17_P3_v8_9_adoption
    GOLDEN_CROSS_SIGNAL_V1:
      owner: engine_owner
      status: active
      purpose: >
        단기 이동평균(ma20)이 장기 이동평균(ma60)을 상향 돌파하는 골든크로스를 정량 판정한다.
        STRATEGY_SCORING 보조신호로만 사용 — 단독 BUY 트리거 금지.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-1)
      inputs:
      - field: ma20
        unit: KRW_per_share
      - field: ma20_prev
        unit: KRW_per_share
      - field: ma60
        unit: KRW_per_share
      - field: ma60_prev
        unit: KRW_per_share
      expression: "golden_cross_today = (ma20_prev <= ma60_prev) AND (ma20 > ma60)"
      output:
        field: golden_cross_today
        unit: boolean
      missing_policy: ma20_prev/ma60_prev 결측 시 null.
      canonical_ref: spec/formulas/domains/entry.yaml:GOLDEN_CROSS_SIGNAL_V1
      implementation: tools/build_golden_cross_signal_v1.py
      version: 2026-06-18_technical_signals_p4
    STRONG_CLOSE_SIGNAL_V1:
      owner: engine_owner
      status: active
      purpose: >
        종가가 당일 고가-저가 범위 중 고가 근처에서 마감하는지 판정한다.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-2)
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: high_price
        unit: KRW_per_share
      - field: low_price
        unit: KRW_per_share
      expression: "close_position_pct = (close_price-low_price)/(high_price-low_price)*100; strong_close = close_position_pct >= 80"
      output:
        field: strong_close
        unit: boolean
      missing_policy: high_price==low_price면 null.
      canonical_ref: spec/formulas/domains/entry.yaml:STRONG_CLOSE_SIGNAL_V1
      implementation: tools/build_strong_close_signal_v1.py
      version: 2026-06-18_technical_signals_p4
    VOLATILITY_EXPANSION_BREAKOUT_V1:
      owner: engine_owner
      status: active
      purpose: >
        bb_width 수축(squeeze) 후 급등하는 패턴을 판정한다. BREAKOUT_QUALITY_GATE_V2 통과가 전제조건.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-3)
      inputs:
      - field: bb_width
        unit: percent
      - field: bb_width_20d_percentile
        unit: percent
      - field: ret_1d
        unit: percent
      expression: "squeeze_detected = bb_width_20d_percentile <= 20; volatility_expansion_breakout = squeeze_detected_previous_day AND ret_1d >= 3.0"
      output:
        field: volatility_expansion_breakout
        unit: boolean
      missing_policy: bb_width_20d_percentile 결측 시 null.
      canonical_ref: spec/formulas/domains/entry.yaml:VOLATILITY_EXPANSION_BREAKOUT_V1
      implementation: tools/build_volatility_expansion_breakout_v1.py
      version: 2026-06-18_technical_signals_p4
    FIFTY_TWO_WEEK_HIGH_TRIGGER_V1:
      owner: engine_owner
      status: active
      purpose: >
        종가가 52주 최고가(high52w)를 갱신하는지 판정해 BREAKOUT_QUALITY_GATE_V2 입력으로 공급한다.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-4)
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: high52w
        unit: KRW_per_share
      expression: "fifty_two_week_high_breakout = close_price >= high52w"
      output:
        field: fifty_two_week_high_breakout
        unit: boolean
      missing_policy: high52w 결측 시 null.
      canonical_ref: spec/formulas/domains/entry.yaml:FIFTY_TWO_WEEK_HIGH_TRIGGER_V1
      implementation: tools/build_fifty_two_week_high_trigger_v1.py
      version: 2026-06-18_technical_signals_p4
    CONSECUTIVE_STREAK_V1:
      owner: engine_owner
      status: active
      purpose: >
        N일 연속 상승(up_streak)/하락(down_streak)을 대칭적으로 공식화한다.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-5)
      inputs:
      - field: daily_close_changes
        unit: list_of_percent
      output:
        field: up_streak
        unit: count
      missing_policy: daily_close_changes 비어있으면 null.
      canonical_ref: spec/formulas/domains/entry.yaml:CONSECUTIVE_STREAK_V1
      implementation: tools/build_consecutive_streak_v1.py
      version: 2026-06-18_technical_signals_p4
    BREAKOUT_FAILURE_STOP_V1:
      owner: quant_owner
      status: active
      purpose: >
        전고점 돌파 후 7거래일 이내 재이탈하면 SELL_RISK_EXIT_REVIEW를 발동한다.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-6)
      inputs:
      - field: prior_high
        unit: KRW_per_share
      - field: close_price
        unit: KRW_per_share
      - field: days_since_breakout
        unit: trading_days
      expression: "breakout_failure = (days_since_breakout <= 7) AND (close_price < prior_high)"
      output:
        field: breakout_failure
        unit: boolean
      missing_policy: prior_high 결측 시 null.
      canonical_ref: spec/formulas/domains/exit.yaml:BREAKOUT_FAILURE_STOP_V1
      implementation: tools/build_breakout_failure_stop_v1.py
      version: 2026-06-18_technical_signals_p4
    TREND_FILTER_GATE_V1:
      owner: engine_owner
      status: active
      purpose: >
        종가가 ma120 위에 있고 ma120이 상승 중인지 단일 게이트로 판정한다.
        (governance/todo/technical_signals_p4_adoption_plan.yaml P4-7)
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: ma120
        unit: KRW_per_share
      - field: ma120_prev
        unit: KRW_per_share
      expression: "trend_filter_pass = (close_price > ma120) AND (ma120 > ma120_prev)"
      output:
        field: trend_filter_pass
        unit: boolean
      missing_policy: ma120/ma120_prev 결측 시 null.
      canonical_ref: spec/strategy/entry_core.yaml:entry_timing_guardrails.regime_based_entry
      implementation: tools/build_trend_filter_gate_v1.py
      version: 2026-06-18_technical_signals_p4
    SELL_EXECUTION_TIMING_V1:
      owner: quant_owner
      status: active
      purpose: '장중 가격 움직임에 따라 매도 주문 유형과 타이밍을 결정론적으로 판정. 장초반 패닉 매도, 반등 직전 저점 투매 방지.

        '
      applicable: SELL_WATERFALL_ENGINE_V1 직후. INTRADAY_ACTION_MATRIX_V1 연동.
      inputs:
      - field: gap_down_pct
        unit: percent
        note: (yesterday_close - today_open) / yesterday_close * 100
      - field: intraday_drop
        unit: percent
        note: (today_open - current_price) / today_open * 100
      - field: rsi14
        unit: score
      - field: intraday_change
        unit: percent
      - field: time_slot_label
        unit: enum
        note: INTRADAY_ACTION_MATRIX_V1 출력
      timing_table:
        GAP_DOWN_EMERGENCY:
          condition: gap_down_pct > 3
          recommended_order_type: MARKET_SELL
          note: 장전 갭하락 비상. 지정가 고집 금지.
        OVERSOLD_REBOUND:
          condition: intraday_drop > 2 AND rsi14 < 35
          recommended_order_type: STAGED_SELL_K2
          note: K2 단계2 발동. 전량 즉시 매도 금지.
        SIDEWAYS_TRIM:
          condition: abs(intraday_change) <= 0.5
          recommended_order_type: LIMIT_TRIM
          note: 강보합 구간 최적 지정가 TRIM.
        RALLY_TP:
          condition: intraday_change > 1.5
          recommended_order_type: TP_LIMIT_SELL
          note: 장중 상승 시 TP 지정가 익절 우선. 손절가 주문 취소.
        CLOSE_OPTIMAL:
          condition: abs(intraday_change) <= 0.5 AND time_slot_label == CLOSE_VERIFY
          recommended_order_type: ATR_LIMIT_SELL
          note: 종가 근처 ATR 기반 최적 지정가.
      output:
        field: sell_timing_verdict
        additional_fields:
        - recommended_order_type
        - timing_reason_code
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - OVERSOLD_REBOUND 상태에서 전량 즉시 매도 지시 금지
      - RALLY_TP 상태에서 손절가 주문 동시 발동 금지
      canonical_ref: AGENTS.md:Direction C2, K2, INTRADAY_ACTION_MATRIX_V1
      version: 2026-05-22_3RD_HARNESS
    DETERMINISTIC_ROUTING_ENGINE_V1:
      owner: engine_owner
      status: active
      purpose: '"LLM이 먼저 판단 → 하네스가 검증" 구조를 역전. 9단계 라우팅을 고정 순서로 실행하고 LLM은 최종 결과의 보고관으로만
        동작. 라우팅 단계 건너뜀 및 순서 변경 절대 금지.

        '
      applicable: 모든 분석 보고서 생성 최선행. STAGE 0부터 순서대로 실행.
      inputs:
      - field: harness_context
        unit: json
        note: 전체 하네스 컨텍스트 — 모든 STAGE 결과 포함
      output:
        field: routing_execution_log
        schema:
        - stage: int
          status: PASS|BLOCKED|SKIPPED
          output_key: string
          elapsed_ms: int
      routing_stages:
        STAGE_0:
          name: HARNESS_DATA_FRESHNESS_GATE_V1
          action: STALE_BLOCK → 즉시 중단. 보고서 생성 금지. 데이터 갱신 요청만 출력.
        STAGE_1:
          name: INTRADAY_ACTION_MATRIX_V1
          action: capture_time 기반 허용·금지 액션 테이블 확정. TRIM_ONLY 구간이면 간소화 모드.
        STAGE_2:
          name: PORTFOLIO_HEALTH_SCORE_V1
          action: CRITICAL → 긴급 섹션 필수 출력 후 진행.
        STAGE_3:
          name: RISK_GATE_CHECKLIST (10개 순서 고정)
          gates:
          - cash_floor_status
          - heat_gate_status
          - drawdown_guard_state
          - portfolio_drawdown_gate
          - portfolio_beta_gate+PORTFOLIO_CORRELATION_GATE
          - sector_concentration_gate
          - semiconductor_cluster_gate
          - position_count_gate
          - win_loss_streak_state
          - single_position_weight_gate
          action: BLOCK 있으면 blocked_actions[] 업데이트.
        STAGE_4:
          name: SELL_GATE_CHECKLIST (5개)
          gates:
          - stop_breach_gate
          - tp_trigger_gate
          - DISTRIBUTION_SELL_DETECTOR_V1
          - heat_concentration_gate
          - regime_transition_type
          action: sell_priority_decision_table 생성 (독립 표 필수).
        STAGE_5:
          name: CASH_RECOVERY (OPTIMIZER + WATERFALL)
          action: CASH_RECOVERY_OPTIMIZER_V1 → SELL_WATERFALL_ENGINE_V1 → SELL_PRICE_SANITY_V1.
        STAGE_6:
          name: BUY_SCREENING (6개 순서 고정)
          gates:
          - ANTI_CHASING_VELOCITY_V1
          - PULLBACK_ENTRY_TRIGGER_V1
          - N2_VOLUME_BREAKOUT
          - K1_TRANCHE
          - RAG+SFG+SATELLITE_LIFECYCLE
          - SECTOR_ROTATION+PRE_DISTRIBUTION
          action: buy_candidates_json 확정.
        STAGE_7:
          name: QUANTITY_FINALIZATION
          action: ATR20 기반 atr_qty → regime_size_scale × drawdown_buy_scale → TP_QUANTITY_LADDER
            → SELL_PRICE_SANITY 재검증.
        STAGE_8:
          name: SHADOW_LEDGER_SEPARATION
          action: PASS → HTS 주문표. 비PASS → Shadow Ledger (I4 컬럼명 규칙).
        STAGE_9:
          name: REPORT_ASSEMBLY (LLM)
          action: 하네스 결과를 정해진 양식으로 서술. 숫자 1원·1주 변경 금지. LLM_SERVING_CONSTRAINT_V1 적용.
      ground_truth: harness
      llm_allowed: STAGE_9 보고서 작성만 허용
      prohibition:
      - STAGE 건너뜀 금지
      - STAGE_0 STALE_BLOCK 시 전체 보고서 생성 금지
      - STAGE_9에서 LLM이 숫자 변경 금지 — 보고관(Clerk)으로만 동작
      canonical_ref: AGENTS.md:Direction D1, Direction Q(QEH)
      version: 2026-05-22_3RD_HARNESS
    LLM_SERVING_CONSTRAINT_V1:
      owner: engine_owner
      status: active
      purpose: 'LLM이 보고서 작성 시 침범 금지 영역 8개를 명시적으로 잠금. HS011 확장판. 30년 실전 전문가의 정밀도는 자유로운
        해석이 아닌 규칙 준수에서 나온다.

        '
      applicable: DETERMINISTIC_ROUTING_ENGINE_V1 STAGE_9 진입 직전 검사.
      inputs:
      - field: harness_context
        unit: json
        note: LLM 보고서 생성 전 전체 컨텍스트 검사
      output:
        field: serving_constraint_check
        schema:
          violations_detected: list [FB_code]
          allowed_actions_taken: list [AL_code]
      forbidden_actions:
        FB1: 가격·수량 즉석 계산 → DATA_MISSING 표기만 허용 (HS011)
        FB2: 하네스 판정 '이번만 예외' 번복
        FB3: '''분위기가 좋으니'' 류 감성 서술로 BLOCK 우회'
        FB4: rule_id 없는 판단 서술 (근거 공식 ID 없이 결론 금지)
        FB5: 매수와 매도를 같은 문단에 연결 서술 (BRT3 재투자 연결 금지)
        FB6: 목표 달성률 압박으로 리스크 게이트 완화 서술 (M4 압박 금지)
        FB7: 외부 웹 데이터로 prices_json 덮어쓰기 (G3 외부 격리)
        FB8: 손절가·익절가 null인 종목에 '보유 유지' 단독 서술
      allowed_roles:
        AL1: 하네스 결과의 '왜 이 점수인가?' 배경 설명
        AL2: 뉴스·이벤트·섹터 흐름 질적 리스크 합성
        AL3: '''만약 반도체가 추가 하락하면...'' 시나리오 제시'
        AL4: N4 HOLDING_STALE_REVIEW 연동 보유 근거 재확인
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - 8개 금지 영역은 어떤 조건에서도 침범 불가
      - '위반 항목은 ''[LLM_SERVING_CONSTRAINT: FB{N} 위반]''으로 보고서에 표시'
      canonical_ref: AGENTS.md:Direction D2, Direction Q(QEH), HS011
      version: 2026-05-22_3RD_HARNESS
    PROFIT_RATCHET_TIERED_V2:
      owner: quant_owner
      status: active
      purpose: '기존 L2(RATCHET_TRAILING_AUTO_V1)에 APEX_SUPER(+60%+) 구간 신설. 삼성전자 +61.5%(E3
        오류) 재발 방지: 단순 ''보유 유지'' 서술 없이 래칫 스탑 필수 표기.

        '
      applicable: PROFIT_LOCK_STAGE_CLASSIFIER_V1 직후. 수익 구간별 자동 적용.
      inputs:
      - field: profit_pct
        unit: percent
      - field: profit_lock_stage
        unit: enum
        note: PROFIT_LOCK_STAGE_CLASSIFIER_V1 산출
      - field: highest_close
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      - field: average_cost
        unit: KRW_per_share
      - field: quantity
        unit: shares
      - field: secular_leader_gate_active
        unit: boolean
        optional: true
      ratchet_table_v2:
        NORMAL:
          trailing_stop: 'null'
          tp_ladder_action: 없음
        BREAKEVEN_RATCHET:
          trailing_stop: average_cost * 1.005 (세후)
          tp_ladder_action: 없음
        PROFIT_LOCK_10:
          trailing_stop: highest_close - 2.5 * atr20
          tp_ladder_action: 없음
          note: '[신규 V2]'
        PROFIT_LOCK_20:
          trailing_stop: highest_close - 1.5 * atr20
          tp_ladder_action: tp1_qty 확인
        PROFIT_LOCK_30:
          trailing_stop: highest_close - 1.8 * atr20
          tp_ladder_action: tp1+tp2 확인
          note: 'V2: 1.8 (V1: 2.0 보다 타이트)'
        APEX_TRAILING:
          trailing_stop: highest_close - 1.5 * atr20
          tp_ladder_action: tp1+tp2 확인
          note: 'V2: 1.5 (V1: 2.0 보다 타이트)'
        APEX_SUPER:
          condition: profit_pct >= 60
          trailing_stop: max(ratchet_stop, highest_close - 1.2 * atr20)
          tp_ladder_action: 강제 10% 익절 권고 (quantity * 0.10, 매 +10%마다)
          llm_obligation: '보고서에 ''APEX_SUPER 구간: trailing_stop=XXX원, 10% 익절 검토'' 필수
            표기'
          note: '[신규 V2] +60% 초과 종목 전용. 삼성전자 현재 해당.'
        SECULAR_LEADER_DEFERRED:
          trailing_stop: 'null'
          tp_ladder_action: H3 연동 유지
      output:
        field: auto_trailing_stop_v2
        additional_fields:
        - ratchet_stage_v2
        - apex_super_active
        - tp_ladder_qty_v2
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - APEX_SUPER 구간 종목에 '보유 유지' 단독 서술 금지 — trailing_stop 병기 필수
      - LLM이 trailing_stop을 재계산 금지 — 하네스 산출값 그대로 사용
      - SECULAR_LEADER_DEFERRED 구간에서 H3 규칙 무시 금지
      canonical_ref: AGENTS.md:Direction E1, L2(RATCHET_TRAILING_AUTO_V1), M3
      version: 2026-05-22_3RD_HARNESS
    SELL_VALUE_PRESERVATION_TIERED_V2:
      owner: quant_owner
      status: active
      purpose: '현금확보 매도 시 ''좋은 매도''와 ''나쁜 매도''를 하네스가 자동 판별. 반등 시 추가 수익까지 고려한 세련된 매도
        결정 트리 (K2 + SELL_WATERFALL 통합).

        '
      applicable: SELL_WATERFALL_ENGINE_V1 이후. 종목별 최적 매도 스타일 확정.
      inputs:
      - field: emergency_full_sell
        unit: boolean
      - field: oversold_gate
        unit: enum
      - field: rsi14
        unit: score
      - field: profit_lock_stage
        unit: enum
      - field: velocity_5d
        unit: percent
      - field: h2_priority_rank
        unit: int
      - field: rs_verdict
        unit: enum
      - field: cash_shortfall_min_krw
        unit: KRW
      - field: waterfall_plan_json
        unit: json
      decision_tree:
      - if: emergency_full_sell == true
        verdict: EMERGENCY_EXIT
        plan: SELL_WATERFALL stage_4 실행
      - elif: oversold_gate == OVERSOLD AND rsi14 < 30
        verdict: OVERSOLD_REBOUND_SELL
        plan: K2 + SELL_WATERFALL stage_2. rebound_tp_price = prev_close + 1.0 * atr20
      - elif: profit_lock_stage IN [PROFIT_LOCK_20, APEX_TRAILING, APEX_SUPER] AND
          velocity_5d > 8
        verdict: APEX_TRIM
        plan: tp_quantity_ladder.tp1_qty 즉시 매도. limit = current - 0.5 * atr20
      - elif: h2_priority_rank == 1 AND rs_verdict == BROKEN
        verdict: STAGED_EXIT
        plan: SELL_WATERFALL stage_1 → stage_2 → stage_3 순서
      - elif: cash_shortfall_min_krw > 0
        verdict: PRESERVE_TIERED
        plan: CASH_RECOVERY_OPTIMIZER_V1 조합 실행
      - else: null
        verdict: HOLD
        plan: 매도 조건 미충족
      output:
        field: preservation_verdict
        additional_fields:
        - recommended_plan_ref
        - rebound_upside_krw
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - decision_tree 순서 임의 변경 금지
      - EMERGENCY_EXIT 외 조건에서 전량 즉시 매도 지시 금지
      canonical_ref: AGENTS.md:Direction E2, K2, SELL_WATERFALL_ENGINE_V1
      version: 2026-05-22_3RD_HARNESS
    TRADE_QUALITY_SCORER_V1:
      owner: engine_owner
      status: active
      purpose: '실행된 매수·매도를 T+1/T+5/T+20 기준으로 자동 채점해 뒷박/설거지/저점 투매를 데이터로 증명. O4(WIN_LOSS_STREAK_GUARD_V1)
        개선 피드백 루프.

        '
      applicable: monthly_history 업데이트 배치. 진입 후 T+5, T+20 경과 시 자동 평가.
      inputs:
      - field: velocity_1d_at_entry
        unit: percent
        note: buy quality — 진입 당일 속도
      - field: entry_price
        unit: KRW_per_share
        note: buy quality
      - field: ma20_at_entry
        unit: KRW_per_share
        note: buy quality
      - field: volume_ratio_at_entry
        unit: ratio
        note: buy quality
      - field: t5_return_pct
        unit: percent
        optional: true
        note: buy quality T+5
      - field: t20_vs_core_pctp
        unit: percent
        optional: true
        note: buy quality T+20 alpha
      - field: sell_price
        unit: KRW_per_share
        note: sell quality
      - field: ma20_at_sell
        unit: KRW_per_share
        note: sell quality
      - field: average_cost
        unit: KRW_per_share
        note: sell quality — 평단
      - field: price_t5_after_sell
        unit: KRW_per_share
        optional: true
        note: sell quality T+5 사후
      - field: cash_recovered_krw
        unit: KRW
        note: sell quality — 실제 회수액
      - field: cash_shortfall_min_krw
        unit: KRW
        note: sell quality — 목표 현금 부족분
      scoring:
        buy_score:
          velocity_ok:
            condition: velocity_1d_at_entry < 1
            points: 20
          ma20_proximity:
            condition: entry_price <= ma20_at_entry * 1.01
            points: 20
          volume_confirm:
            condition: volume_ratio_at_entry >= 1.2
            points: 20
          t5_positive:
            condition: t5_return_pct > 0
            points: 20
          t20_alpha:
            condition: t20_vs_core_pctp > 0
            points: 20
        sell_score:
          above_ma20:
            condition: sell_price >= ma20_at_sell * 0.99
            points: 25
          above_cost:
            condition: sell_price >= average_cost
            points: 25
          not_too_early:
            condition: price_t5_after_sell is null OR price_t5_after_sell < sell_price
            points: 25
          cash_goal_met:
            condition: cash_recovered_krw >= cash_shortfall_min_krw
            points: 25
      grade_table:
        90100:
          grade: EXCELLENT
          tag: GOOD_EXECUTION
        7589:
          grade: GOOD
          tag: GOOD_EXECUTION
        6074:
          grade: ACCEPTABLE
          tag: REVIEW_NEEDED
        4059:
          grade: POOR
          tag: CHASE_ENTRY_OR_PANIC_EXIT
        0_39:
          grade: CRITICAL
          tag: PATTERN_ALERT
      feedback_tags:
      - CHASE_ENTRY
      - PANIC_EXIT
      - DISTRIBUTION_ENTRY
      - OVERSOLD_PANIC
      - GOOD_EXECUTION
      output:
        field: trade_quality_json
        schema:
        - ticker: 종목코드
          action: BUY|SELL
          score: 0~100
          grade: enum
          feedback_tag: enum
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - LLM이 trade_quality_score를 즉석 계산 금지
      - POOR/CRITICAL 종목에 '이번엔 괜찮다' 임의 판단 금지
      canonical_ref: AGENTS.md:Direction F1, O4(WIN_LOSS_STREAK)
      version: 2026-05-22_3RD_HARNESS
    PATTERN_BLACKLIST_AUTO_V1:
      owner: engine_owner
      status: active
      purpose: '같은 종목에서 3회 이상 POOR/CRITICAL grade가 누적되면 자동으로 강화 제한 적용. "같은 실수를 4번째는
        시스템이 막는다."

        '
      applicable: TRADE_QUALITY_SCORER_V1 이후. monthly_history 배치.
      inputs:
      - field: trade_quality_json
        unit: array
      - field: monthly_history
        unit: array
      trigger:
        condition: 동일 ticker, grade IN [POOR, CRITICAL] 누적 횟수 >= 3
        action: PATTERN_BLACKLIST_TRIGGERED
      restrictions_applied:
        saqg_downgrade: 해당 ticker SAQG를 EXCLUDED로 자동 격하 (BUY 완전 차단)
        alpha_score_cap: alpha_lead_score 상한 50점 적용
        llm_ban: LLM '이번엔 다르다' 서술 금지 — Override는 사용자 수동 확인만 허용
      release_condition: 3회 연속 GOOD 이상 달성 시 블랙리스트 해제
      output:
        field: pattern_blacklist_status
        values:
        - TRIGGERED
        - CLEAR
        - NOT_APPLICABLE
        additional_fields:
        - blacklist_ticker
        - accumulated_poor_count
        - release_condition_met
      ground_truth: harness
      llm_allowed: cite_only
      prohibition:
      - TRIGGERED 종목에 예외 매수 서술 금지
      - 블랙리스트 해제를 LLM이 임의 선언 금지 — 3회 연속 GOOD 조건 충족만
      canonical_ref: AGENTS.md:Direction F2, TRADE_QUALITY_SCORER_V1, SAQG
      version: 2026-05-22_3RD_HARNESS
    FUNDAMENTAL_QUALITY_GATE_V1:
      owner: engine_owner
      status: active
      purpose: 펀더멘털 품질(ROE/이익성장/부채/현금흐름/밸류)을 결정론적으로 점수화해 BUY 허용 여부를 잠금.
      inputs:
      - field: roe_pct
        unit: percent
        optional: true
      - field: op_income_growth_pct
        unit: percent
        optional: true
      - field: debt_ratio_pct
        unit: percent
        optional: true
      - field: operating_cf_krw
        unit: KRW
        optional: true
      - field: pe_ttm
        unit: ratio
        optional: true
      output:
        field: fundamental_quality_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL53
    HORIZON_ALLOCATION_LOCK_V1:
      owner: quant_owner
      status: active
      purpose: 단기/중기/장기 투자 버킷별 비중 상한을 적용해 기간 혼재와 과집중을 차단.
      inputs:
      - field: invest_horizon
        unit: enum
        optional: true
      - field: market_value_krw
        unit: KRW
        optional: true
      - field: total_asset_krw
        unit: KRW
      output:
        field: horizon_allocation_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL53
    SMART_MONEY_LIQUIDITY_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '스마트머니·유동성 차단 게이트. SM001(외국인+기관 동시 순매도→BLOCK_BUY), SM002(5일 평균 거래대금
        < 50억→LIMIT_QUANTITY), SM003(RSI14>70 AND flow_credit<0.3→BLOCK_BUY) 결정론 구현.
        FINAL_JUDGMENT_GATE_V1의 J04 입력.

        '
      output:
        file: Temp/smart_money_liquidity_gate_v1.json
      expected_outputs:
      - gate
      - coverage_pct
      - ticker_count
      llm_allowed: cite_only
      version: 2026-05-28_PHASE6
    ROUTING_SERVING_DECISION_TRACE_V2:
      owner: report_owner
      status: active
      purpose: 라우팅→서빙→게이트 경로를 단일 trace JSON으로 고정해 사후감사 가능성 확보.
      inputs:
      - field: routing_trace_json
        unit: json
      - field: export_gate_json
        unit: json
      output:
        field: routing_serving_trace_v2_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL53
    FUNDAMENTAL_MULTI_FACTOR_SCORE_V2:
      owner: engine_owner
      status: active
      purpose: 이익률/성장률/점유율/현금흐름/부채를 종합 점수화해 매수 허용을 잠금.
      inputs:
      - field: roe_pct
        unit: percent
        optional: true
      - field: opm_pct
        unit: percent
        optional: true
      - field: revenue_growth_pct
        unit: percent
        optional: true
      - field: op_income_growth_pct
        unit: percent
        optional: true
      - field: market_share_proxy_pct
        unit: percent
        optional: true
      - field: operating_cf_krw
        unit: KRW
        optional: true
      - field: free_cf_krw
        unit: KRW
        optional: true
      - field: debt_ratio_pct
        unit: percent
        optional: true
      output:
        field: fundamental_multifactor_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL54
    EARNINGS_GROWTH_QUALITY_GATE_V1:
      owner: engine_owner
      status: active
      purpose: 분기/연간 이익 성장 일관성으로 매수 게이트를 잠금.
      inputs:
      - field: eps_growth_qoq_pct
        unit: percent
        optional: true
      - field: eps_growth_yoy_pct
        unit: percent
        optional: true
      output:
        field: earnings_growth_quality_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL54
    MARKET_SHARE_MOMENTUM_PROXY_V1:
      owner: engine_owner
      status: active
      purpose: 상대 성장/RS 기반 점유율 모멘텀 프록시를 산출해 공격 매수 여부를 잠금.
      inputs:
      - field: revenue_growth_pct
        unit: percent
        optional: true
      - field: alpha_lead_score
        unit: score
        optional: true
      output:
        field: market_share_proxy_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL54
    CASHFLOW_STABILITY_GATE_V1:
      owner: quant_owner
      status: active
      purpose: 영업/잉여 현금흐름 및 회계 위험으로 현금흐름 안정성 게이트를 잠금.
      inputs:
      - field: operating_cf_krw
        unit: KRW
        optional: true
      - field: free_cf_krw
        unit: KRW
        optional: true
      - field: accrual_ratio_pct
        unit: percent
        optional: true
      output:
        field: cashflow_stability_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL54
    ROUTING_DECISION_EXPLAIN_LOCK_V1:
      owner: report_owner
      status: active
      purpose: 최종 의사결정 게이트 경로와 차단사유를 JSON으로 고정.
      inputs:
      - field: export_gate_json
        unit: json
      output:
        field: routing_decision_explain_json
      llm_allowed: cite_only
      version: 2026-05-25_PROPOSAL54
    BLANK_CELL_AUDIT_V1:
      owner: engine_owner
      status: active
      purpose: '보고서 GFM 표의 빈 셀·일률 stub 라벨을 감사하여 셀-레벨 결정론 충족 여부를 판정한다. 금지 일률값(데이터 누락/NEUTRAL/LOSING/정상/-/빈문자)이
        하나라도 있으면 INCOMPLETE_TABLE. enforcement_mode_until 이전은 WARN_ONLY, 이후 hard-block.

        '
      inputs:
      - field: operational_report_json
        unit: json
      output:
        field: blank_cell_audit_v1_json
      expected_outputs:
      - gate
      - blank_fill_pct
      - incomplete_tables
      - enforcement_mode
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    VALUE_PRESERVATION_SCORER_V1:
      owner: engine_owner
      status: active
      purpose: '종목별 가치 훼손 점수(value_damage_score 0~100) + 반등 잠재력(rebound_potential
        0~100) + 권고 동작(recommended_action)을 결정론 공식으로 산출한다. SCRS-V2 selected_combo의
        빈 셀에 주입하여 LLM 자유 해석을 차단한다.

        '
      inputs:
      - field: Close
        unit: KRW_per_share
      - field: MA20
        unit: KRW_per_share
      - field: MA60
        unit: KRW_per_share
      - field: ATR20
        unit: KRW_per_share
      - field: RSI14
        unit: percent
      - field: BB_Position
        unit: 0to1_scale
      - field: Frg_5D
        unit: KRW
      - field: Inst_5D
        unit: KRW
      - field: AvgTradeValue_5D_M
        unit: KRW_hundred_million
      - field: AvgTradeValue_20D_M
        unit: KRW_hundred_million
      - field: Recovery_Ratio_5D
        unit: ratio
      - field: Stock_Drawdown_From_High_Pct
        unit: percent
      output:
        field: value_preservation_scorer_v1_json
      expected_outputs:
      - gate
      - distinct_actions
      - row_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    SMART_CASH_RECOVERY_V3:
      owner: quant_owner
      status: active
      purpose: '국면별 동적 rebound_factor + 유동성 라벨(DEEP/NORMAL/THIN/FROZEN) 기반으로 선제매도
        분할 방식(exec_mode)을 결정론적으로 산출한다. 설거지·지하실 매도를 차단하고 반등 수익을 포착한다. SCRS-V2 V3 확장판.

        '
      inputs:
      - field: value_preservation_scorer_v1_json
        unit: json
      - field: scrs_v2_json
        unit: json
      - field: market_regime_state
        unit: label
      - field: macro_risk_regime
        unit: label
      - field: ATR20
        unit: KRW_per_share
      - field: AvgTradeValue_5D_M
        unit: KRW_hundred_million
      - field: Spread_Pct
        unit: percent
      output:
        field: smart_cash_recovery_v3_json
      expected_outputs:
      - gate
      - regime
      - rebound_factor_atr
      - distinct_exec_modes
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    RATCHET_TRAILING_GENERAL_V1:
      owner: engine_owner
      status: active
      purpose: '모든 보유 종목(수익률≥0%)에 7-tier 공식으로 auto_trailing_stop을 산출한다. 기존 APEX 한정
        trailing을 전 종목으로 일반화. 수익 보호 + 뒷박 재진입 차단.

        '
      inputs:
      - field: Profit_Pct
        unit: percent
      - field: Close
        unit: KRW_per_share
      - field: ATR20
        unit: KRW_per_share
      - field: High52W
        unit: KRW_per_share
      - field: Stop_Price_Est
        unit: KRW_per_share
      - field: Account_Avg_Cost
        unit: KRW_per_share
      output:
        field: ratchet_trailing_general_v1_json
      expected_outputs:
      - gate
      - coverage_pct
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    EJCE_VIEW_RENDERER_V1:
      owner: report_owner
      status: active
      purpose: 'ejce_consensus_table의 Analyst/Trader/Quant 본문 셀을 결정론 템플릿으로 채운다. AGENTS.md
        EJ1 의무: 3관점 모두 인용. 본문 셀 비면 INCOMPLETE_EJCE_REPORT.

        '
      inputs:
      - field: ejce_json
        unit: json
      - field: alpha_lead_json
        unit: json
      - field: breakout_quality_gate_json
        unit: json
      - field: anti_chasing_velocity_json
        unit: json
      - field: heat_concentration_json
        unit: json
      - field: portfolio_alpha_confidence
        unit: score
      output:
        field: ejce_view_renderer_v1_json
      expected_outputs:
      - gate
      - blank_view_count
      - row_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    ROUTING_EXECUTION_LOG_TABLE_V1:
      owner: engine_owner
      status: active
      purpose: 'DETERMINISTIC_ROUTING_ENGINE_V1 11단계(①CV-V2사전검증 ②데이터신선도 ③장중판별 ④포트폴리오상태
        ⑤거시이벤트동기화 ⑥선제매도레이더 ⑦매수타이밍게이트 ⑧매도우선순위/현금확보 ⑨RS/위성품질 ⑩가격정규화/검증 ⑪LLM서빙)의 실행 로그를
        표로 강제 출력한다. GAS 미보고 단계는 결정론 fallback으로 보강. 누락 단계 > 0이면 INCOMPLETE_ROUTING_LOG.

        '
      inputs:
      - field: routing_execution_log
        unit: json
      - field: _harness_context
        unit: json
      output:
        field: routing_execution_log_v1_json
      expected_outputs:
      - gate
      - stage_coverage_pct
      - request_route
      llm_allowed: cite_only
      version: 2026-05-27_PHASE1
    FUNDAMENTAL_RAW_INGEST_V1:
      owner: data_owner
      status: active
      purpose: 'data_feed(Forward_PE/PBR/EPS)와 네이버 금융 fallback을 통해 보유 종목의 펀더멘털 raw
        지표를 수집하고 fundamental_raw_v1.json을 생성한다.

        '
      output:
        field: fundamental_raw_v1_json
      expected_outputs:
      - gate
      - coverage_pct
      - non_etf_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2
    FUNDAMENTAL_MULTIFACTOR_V3:
      owner: engine_owner
      status: active
      purpose: 'ROE(25) + OPM(20) + OCF(15) + FCF(15) + Debt(10) + Valuation(15) =
        100점 6요소 결정론 공식으로 종목별 펀더멘털 등급을 산출한다. ETF는 별도 분류, 데이터 부족 시 보유 필드 기준 정규화 적용.

        '
      output:
        field: fundamental_multifactor_v3_json
      expected_outputs:
      - gate
      - grade_diverse
      - non_etf_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2
    HORIZON_CLASSIFICATION_V1:
      owner: engine_owner
      status: active
      purpose: '펀더멘털 등급 + 이격도 + ATR% + RSI14 기반으로 종목별 투자 기간을 분류한다. LONG/MID/SHORT/ETF/UNKNOWN
        결정론 트리. HORIZON_ALLOCATION_LOCK_V1에 주입.

        '
      output:
        field: horizon_classification_v1_json
      expected_outputs:
      - gate
      - classified_pct
      - allocation_pct
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2
    SMART_MONEY_FLOW_SIGNAL_V2:
      owner: engine_owner
      status: active
      purpose: 'Frg_5D/20D + Inst_5D/20D 백분위 기반으로 종목별 스마트머니 흐름을 산출한다. STRONG_INFLOW
        / INFLOW / NEUTRAL / OUTFLOW / STRONG_OUTFLOW 라벨 분산 강제.

        '
      output:
        field: smart_money_flow_signal_v2_json
      expected_outputs:
      - gate
      - label_diversity
      - coefficient_of_variation
      llm_allowed: cite_only
      version: 2026-05-27_PHASE3
    LIQUIDITY_FLOW_SIGNAL_V1:
      owner: engine_owner
      status: active
      purpose: 'AvgTradeValue_20D_M 기반으로 종목별 유동성을 DEEP/NORMAL/THIN/FROZEN으로 분류하고 매도
        실행 모드(MARKET_OK/LIMIT_NEAR_BID/TWAP_SPLIT/HOLD)를 결정한다.

        '
      output:
        field: liquidity_flow_signal_v1_json
      expected_outputs:
      - gate
      - label_diversity
      - row_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE3
    PORTFOLIO_ALPHA_CONFIDENCE_PER_TICKER_V1:
      owner: quant_owner
      status: active
      purpose: '기존 포트폴리오 전체 단일값 PAC(-90.7)를 종목별 분산 PAC로 교체. entry_freshness(35) +
        breakout_quality(25) + flow_accel(20) + fundamental(10) + rs_slope(10) 결합.
        BULLISH/NEUTRAL/BEARISH 라벨 분산. stddev ≥ 5 강제.

        '
      output:
        field: portfolio_alpha_confidence_per_ticker_v1_json
      expected_outputs:
      - gate
      - stddev
      - label_diversity
      llm_allowed: cite_only
      version: 2026-05-27_PHASE3
    EARNINGS_QUALITY_SIGNAL_V1:
      owner: engine_owner
      status: active
      purpose: 'OPM(영업이익률) 기반 이익 품질을 결정론적으로 라벨링한다. EXPANDING/STABLE/CONTRACTING/VOLATILE/DATA_MISSING
        라벨과 buy_modifier(+10 ~ -15)를 종목별로 산출한다.

        '
      output:
        field: earnings_quality_signal_v1_json
      expected_outputs:
      - gate
      - label_counts
      - data_missing_pct
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2B
    GROWTH_RATE_SIGNAL_V1:
      owner: engine_owner
      status: active
      purpose: 'EPS YoY / 매출 YoY 기반 성장률 시그널을 결정론적으로 산출한다. HYPER_GROWTH/GROWTH/FLAT/DECLINE/DATA_MISSING
        라벨과 단/중/장기 horizon 적합도를 포함한다.

        '
      output:
        field: growth_rate_signal_v1_json
      expected_outputs:
      - gate
      - label_counts
      - data_missing_pct
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2B
    CASHFLOW_QUALITY_SIGNAL_V1:
      owner: quant_owner
      status: active
      purpose: 'OCF/FCF 기반 현금흐름 안정성을 결정론적으로 라벨링한다. ROBUST/STABLE/VOLATILE/RISKY/DATA_MISSING
        라벨과 ACCOUNTING_RISK 플래그(OCF < NI 의심)를 산출한다.

        '
      output:
        field: cashflow_quality_signal_v1_json
      expected_outputs:
      - gate
      - accounting_risk_count
      - data_missing_pct
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2B
    MARKET_SHARE_SIGNAL_V2:
      owner: engine_owner
      status: active
      purpose: '실매출 점유율 데이터 없는 환경에서 AvgTradeValue_20D_M 백분위 + 외인/기관 수급 + 20일 모멘텀 3중
        프록시로 GAINING/STABLE/LOSING/NO_PEER_DATA를 산출한다. confidence는 항상 LOW(proxy 기반).
        실데이터 확보 시 HIGH confidence로 업그레이드 예정.

        '
      output:
        field: market_share_signal_v2_json
      expected_outputs:
      - gate
      - unique_states
      - non_etf_scored_count
      llm_allowed: cite_only
      version: 2026-05-27_PHASE2B
    TRADE_QUALITY_FROM_T5_V1:
      owner: engine_owner
      status: active
      purpose: '운영(non-backfill) T+5 outcome MATCHED/MISMATCH 기반으로 per-ticker 및 전체
        거래품질 점수를 산출한다. T+20 성숙 전 bridge; T+20 성숙 후 자동 승격.

        '
      output:
        file: Temp/trade_quality_from_t5_v1.json
      expected_outputs:
      - gate
      - summary_score
      - scored_count
      - trade_quality_basis
      llm_allowed: cite_only
      version: 2026-05-28_PHASE4
    PREDICTION_ACCURACY_HARNESS_V2:
      owner: data_owner
      status: active
      purpose: '운영 T+1/T+5/T+20 일치율을 90/30/7일 회전 윈도로 산출. calibration_state: CALIBRATED/MONITOR/PAE_CALIBRATION_REQUIRED/BUY_PROPOSAL_FROZEN_RECOMMEND.

        '
      output:
        file: Temp/prediction_accuracy_harness_v2.json
      expected_outputs:
      - calibration_state
      - t5_op_rate
      - t5_sample
      - window_90d_rate
      llm_allowed: cite_only
      version: 2026-05-28_PHASE4
    MACRO_EVENT_TICKER_IMPACT_V1:
      owner: engine_owner
      status: active
      purpose: 'FOMC·CPI·옵션만기·반도체가이던스·관세 정적 카탈로그 × 종목 섹터 민감도로 impact_score(-100~+100)와
        action_gate를 산출한다. 뒷박 차단 5중 AND의 1표(ALEG-V3+DSD-V1+breakout+smart_money+macro_event).

        '
      output:
        file: Temp/macro_event_ticker_impact_v1.json
      expected_outputs:
      - gate
      - ticker_count
      - action_summary
      llm_allowed: cite_only
      version: 2026-05-28_PHASE4
    SELL_WATERFALL_ENGINE_V2:
      owner: quant_owner
      status: active
      purpose: 'V1 4단계 유지 + 호가단위 슬리피지(bps) 시뮬, TWAP/지정가 분할(유동성기반), 부분체결 잔량 자동 stage
        승격(단계 건너뜀 금지).

        '
      output:
        file: Temp/sell_waterfall_engine_v2.json
      expected_outputs:
      - gate
      - stage_counts
      - escalation_skip_violations
      llm_allowed: cite_only
      version: 2026-05-28_PHASE4
    EXECUTION_METHOD_LADDER_V1:
      owner: engine_owner
      status: active
      purpose: '매도 실행 방식 계약표. NORMAL_LIQUIDITY / HIGH_LIQUIDITY_BREACH / OVERSOLD_REBOUND / EMERGENCY
        의 order_type, split_count, trigger_rule 을 단일 표로 고정한다. LLM은 ladder를 재해석하지 않고
        Temp/sell_execution_timing_lock_v2.json 과 Temp/sell_waterfall_engine_v2.json 을 복사 참조만 한다.

        '
      inputs:
      - field: sell_timing_verdict
        unit: enum
      - field: sell_waterfall_gate
        unit: enum
      - field: smart_cash_recovery_gate
        unit: enum
      output:
        file: Temp/execution_method_ladder_v1.json
      expected_outputs:
      - gate
      - market_order_default_count
      - emergency_full_sell_without_flag_count
      llm_allowed: cite_only
      version: 2026-06-06_PHASE6
    LLM_NARRATIVE_TEMPLATE_LOCK_V1:
      owner: report_owner
      status: active
      purpose: 'operational_report.json 각 section.markdown에서 금지 어휘(같다/약간/곧/강한모멘텀 등)를
        스캔한다. 발견 시 INVALID_NARRATIVE. gate=PASS: 금지어 0건 강제.

        '
      output:
        file: Temp/llm_narrative_template_lock_v1.json
      expected_outputs:
      - gate
      - total_violations
      - sections_checked
      llm_allowed: cite_only
      version: 2026-05-28_PHASE5
    EJCE_DIVERGENCE_AUDIT_V1:
      owner: engine_owner
      status: active
      purpose: 'EJCE 3관점 block_reasons 다양성 감사. 10/10 동일 사유 → ANALYST_VIEW_HOMOGENEOUS
        경고. unique_reason_pct < 60% → WARN.

        '
      output:
        file: Temp/ejce_divergence_audit_v1.json
      expected_outputs:
      - gate
      - unique_reason_pct
      - homogeneous_flag
      - analyst_view_homogeneous
      llm_allowed: cite_only
      version: 2026-05-28_PHASE5
    PREDICTIVE_ALPHA_REPORT_LOCK_V2:
      owner: report_owner
      status: active
      purpose: 'predictive_alpha_json에서 thesis_signals/antithesis_signals/synthesis_score를
        종목별 표로 강제 출력. coverage_pct >= 100% 필요 (ETF 예외 허용 시 >= 80%).

        '
      output:
        file: Temp/predictive_alpha_report_lock_v2.json
      expected_outputs:
      - gate
      - coverage_pct
      - missing_tickers
      llm_allowed: cite_only
      version: 2026-05-28_PHASE5
    FINAL_JUDGMENT_GATE_V1:
      owner: report_owner
      status: active
      purpose: '판단 결정론 계층 — 키스톤. 모든 게이트·신호 JSON + _harness_context를 읽어 종목별 단일 action_verdict를
        AND-11 조건으로 결정론 산출. action_verdict in {BUY_PILOT, HOLD, TRIM, SELL, WATCH,
        BLOCKED}. harness_key 부재 시 DATA_MISSING 명시(silent PASS 금지). effective_confidence
        = raw_confidence × (0.4 + 0.6 × invest_quality/100).

        '
      output:
        file: Temp/final_judgment_gate_v1.json
      expected_outputs:
      - gate
      - coverage_pct
      - verdict_counts
      - silent_pass_violations
      - late_chase_buy_violations
      - ticker_count
      llm_allowed: cite_only
      version: 2026-05-28_PHASE6
    VERDICT_CONSISTENCY_LOCK_V1:
      owner: report_owner
      status: active
      purpose: '판단 일관성 잠금 — operational_report.json의 서술을 final_judgment_gate_v1.json
        verdict와 대조. verdict=BLOCKED/SELL인데 보고서가 긍정 BUY 서술 → INVALID_VERDICT_OVERRIDE
        위반, gate=FAIL. LLM의 verdict 자유도를 0으로 제거. 사용자 H10 수동 오버라이드는 예외.

        '
      output:
        file: Temp/verdict_consistency_lock_v1.json
      expected_outputs:
      - gate
      - override_count
      - warn_count
      - violations
      llm_allowed: cite_only
      version: 2026-05-28_PHASE6
    INVESTMENT_QUALITY_HEADLINE_V1:
      owner: report_owner
      status: active
      purpose: 'schema_presence=100% vs investment_quality=13% 충돌을 보고서 CORE 첫 섹션으로
        강제 표기. 거짓 표면화 게이트. effective_confidence = raw × cap_factor 적용 증빙. DATA_QUALITY_RECONCILIATION_V1
        gate=CONFLICT 시 보고서 첫 섹션에 ⚠️ 경고 표시.

        '
      output:
        section: investment_quality_headline
      expected_outputs:
      - quality_conflict_flag
      - investment_quality_score
      - schema_presence_score
      llm_allowed: cite_only
      version: 2026-05-28_PHASE6
    CANONICAL_METRICS_V1:
      owner: engine_owner
      status: active
      purpose: 'spec/25_canonical_metrics_registry.yaml에 정의된 논리 지표(cluster_pct, cash_min_required_krw
        등)를 단일 정규 원천에서 산출해 Temp/canonical_metrics_v1.json으로 제공. 렌더러가 여러 JSON 객체에서
        같은 지표를 중복 읽어 불일치 값을 출력하는 버그를 차단한다(단일 진실원천 아키텍처).

        '
      input_fields:
      - semiconductor_cluster_json.combined_pct
      - cash_recovery_display_json.min_required_krw
      - trim_plan_to_min_cash_json[].accumulated_krw
      - scrs_v2_json.selected_combo[].immediate_qty
      - prices_json[].profit_pct
      - prices_json[].stop_price
      - prices_json[].tp1_price
      - proposal_reference_json[].proposed_limit_price_krw
      - sell_quantities_json[].sell_qty
      expected_outputs:
      - metrics.cluster_pct
      - metrics.cash_min_required_krw
      - metrics.cash_reference_total_krw
      - per_ticker.scrs_immediate_qty
      - per_ticker.scrs_rebound_qty
      - per_ticker.ticker_profit_pct
      - per_ticker.ticker_stop_price
      - per_ticker.ticker_limit_price
      - per_ticker.ticker_base_qty
      - per_ticker.ticker_tp1_price
      - resolved_count
      - unresolved
      - gate
      llm_allowed: cite_only
      version: 2026-05-29_PHASE7
    CROSS_SECTION_CONSISTENCY_V1:
      owner: engine_owner
      status: active
      purpose: 'operational_report.json 섹션 markdown을 파싱해 CANONICAL_METRICS_V1 지표가
        여러 섹션에서 동일한 canonical 값으로 렌더링됐는지 검증. 충돌 발견 시 gate=FAIL(WARN). AGENTS.md R1
        enforcement_mode_until 단계적 차단 정책 적용.

        '
      input_fields:
      - Temp/canonical_metrics_v1.json.metrics
      - Temp/operational_report.json.sections[].markdown
      expected_outputs:
      - conflict_count
      - conflicts
      - forbidden_uniform_labels
      - incomplete_tables
      - score
      - gate
      - enforcement_mode_until
      llm_allowed: cite_only
      version: 2026-05-29_PHASE7
    VELOCITY_V1:
      owner: engine_owner
      status: active
      purpose: '1일/5일 가격 속도를 계산해 뒷박 추격 차단과 풀백 트리거의 입력으로 공급한다.

        '
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: previous_close_price
        unit: KRW_per_share
      - field: ret5d
        unit: percent
      output:
        field: velocity_1d
      input_fields:
      - close
      - prevClose
      - ret5d
      expected_outputs:
      - velocity_1d
      - velocity_5d
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    PROFIT_LOCK_STAGE_V1:
      owner: quant_owner
      status: active
      purpose: '수익률 구간을 NORMAL/BREAKEVEN/PROFIT_LOCK/APEX 계열로 분류한다.

        '
      inputs:
      - field: profit_pct
        unit: percent
      output:
        field: profit_lock_stage
      input_fields:
      - profit_pct
      expected_outputs:
      - stage
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    ANTI_LATE_ENTRY_GATE_V2:
      owner: engine_owner
      status: active
      purpose: '속도, 거래량, 추세 3개 게이트를 결합해 늦은 추격 진입을 차단한다.

        '
      input_fields:
      - close
      - prevClose
      - ma20
      - volume
      - avg_volume_5d
      - ret5d
      expected_outputs:
      - gate
      - anti_late_entry_status
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    DYNAMIC_HEAT_GATE_V1:
      owner: quant_owner
      status: active
      purpose: '국면별 총 위험노출 임계값을 산출해 신규 매수 차단 여부를 결정한다.

        '
      inputs:
      - field: market_regime
        unit: enum
      - field: total_heat_pct
        unit: pct
      output:
        field: heat_gate_status
      input_fields:
      - market_regime
      - total_heat_pct
      expected_outputs:
      - heat_gate_status
      - heat_gate_threshold_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    POSITION_SIZE_REGIME_SCALE_V1:
      owner: quant_owner
      status: active
      purpose: '국면별 포지션 크기 스케일을 결정론적으로 산출한다.

        '
      inputs:
      - field: market_regime
        unit: enum
      output:
        field: regime_size_scale
      input_fields:
      - market_regime
      expected_outputs:
      - regime_size_scale
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    REGIME_CASH_UPLIFT_V1:
      owner: quant_owner
      status: active
      purpose: '국면별 최소 현금비율 상향값을 산출해 cash floor의 하한을 정한다.

        '
      inputs:
      - field: market_regime
        unit: enum
      - field: market_risk_score
        unit: score_0_10
      output:
        field: regime_cash_uplift_min_pct
      input_fields:
      - market_regime
      - market_risk_score
      expected_outputs:
      - regime_cash_uplift_min_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    DRAWDOWN_GUARD_V1:
      owner: data_owner
      status: active
      purpose: '연속 손절/성과 악화 구간에서 신규 매수 수량을 자동 축소하거나 차단한다.

        '
      inputs:
      - field: win_loss_streak_state
        unit: enum
      - field: win_loss_streak_buy_scale
        unit: multiplier
      output:
        field: drawdown_guard_state
      input_fields:
      - consecutive_loss_count
      - recent_win_loss_state
      expected_outputs:
      - drawdown_guard_state
      - drawdown_buy_scale
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    POSITION_COUNT_LIMIT_V1:
      owner: quant_owner
      status: active
      purpose: '동시 보유 종목 수 상한과 초과 여부를 판단한다.

        '
      inputs:
      - field: position_count
        unit: integer
      - field: market_regime
        unit: enum
      output:
        field: position_count_gate
      input_fields:
      - position_count
      - market_regime
      expected_outputs:
      - position_count_gate
      - position_count_max
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    CASH_FLOOR_V1:
      owner: quant_owner
      status: active
      purpose: '목표 현금비중과 현금 부족액의 최소 기준을 확정한다.

        '
      inputs:
      - field: total_asset
        unit: KRW
      - field: settlement_cash_d2_krw
        unit: KRW
      - field: market_risk_score
        unit: score_0_10
      output:
        field: cash_floor_min_pct
      input_fields:
      - total_asset
      - settlement_cash_d2
      - market_risk_score
      expected_outputs:
      - cash_floor_min_pct
      - cash_shortfall_min_krw
      - cash_shortfall_target_krw
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    SEMICONDUCTOR_CLUSTER_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '반도체 클러스터 집중도와 국면별 차단/감축 여부를 판단한다.

        '
      inputs:
      - field: semiconductor_cluster_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: semiconductor_cluster_gate
      input_fields:
      - combined_pct
      - market_regime
      expected_outputs:
      - semiconductor_cluster_gate
      - combined_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    SINGLE_POSITION_WEIGHT_CAP_V1:
      owner: quant_owner
      status: active
      purpose: '단일 종목 비중 상한과 초과 TRIM 필요 여부를 판단한다.

        '
      inputs:
      - field: single_position_weight_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: single_position_weight_gate
      input_fields:
      - position_weight_pct
      - market_regime
      expected_outputs:
      - single_position_weight_gate
      - weight_cap_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    REGIME_TRIM_GUIDANCE_V1:
      owner: engine_owner
      status: active
      purpose: '국면별 현금확보용 TRIM 우선순위를 결정한다.

        '
      inputs:
      - field: regime_adjusted_sell_priority_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: regime_trim_guidance
      input_fields:
      - market_regime
      - sector_rank
      expected_outputs:
      - regime_trim_guidance
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    HEAT_CONCENTRATION_ALERT_V1:
      owner: quant_owner
      status: active
      purpose: '단일 종목이 총 Heat의 과도한 비중을 차지하는지 경보를 낸다.

        '
      inputs:
      - field: heat_share_pct
        unit: pct
      output:
        field: heat_concentration_gate
      input_fields:
      - heat_share_pct
      expected_outputs:
      - heat_concentration_gate
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    SECTOR_CONCENTRATION_LIMIT_V1:
      owner: engine_owner
      status: active
      purpose: '섹터 편중 한도와 신규 BUY 차단 여부를 판단한다.

        '
      inputs:
      - field: sector_concentration_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: sector_concentration_gate
      input_fields:
      - sector_concentration_pct
      - market_regime
      expected_outputs:
      - sector_concentration_gate
      - sector_concentration_limit_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    PORTFOLIO_DRAWDOWN_GATE_V1:
      owner: data_owner
      status: active
      purpose: '포트폴리오 고점 대비 낙폭을 산출해 신규 BUY 차단 여부를 판단한다.

        '
      inputs:
      - field: portfolio_peak_krw
        unit: KRW
      - field: total_asset_krw
        unit: KRW
      output:
        field: portfolio_drawdown_gate
      input_fields:
      - portfolio_peak_krw
      - total_asset_krw
      expected_outputs:
      - portfolio_drawdown_gate
      - portfolio_drawdown_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    K2_STAGED_REBOUND_SELL_V1:
      owner: quant_owner
      status: active
      purpose: '과매도 구간 현금확보 매도를 50/50 분할과 반등 대기로 구조화한다.

        '
      inputs:
      - field: base_sell_qty
        unit: shares
      - field: previous_close_price
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      output:
        field: immediate_sell_qty
      input_fields:
      - baseQty
      - prev_close
      - atr20
      expected_outputs:
      - immediate_sell_qty
      - rebound_wait_qty
      - rebound_trigger_price
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    STOP_BREACH_ALERT_V1:
      owner: quant_owner
      status: active
      purpose: '손절가 이탈 여부와 즉시 청산 경보를 결정한다.

        '
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: stop_price
        unit: KRW_per_share
      output:
        field: stop_breach_gate
      input_fields:
      - close
      - stop_price
      expected_outputs:
      - stop_breach_gate
      - gap_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    SECTOR_ROTATION_MOMENTUM_V1:
      owner: engine_owner
      status: active
      purpose: '섹터 로테이션 모멘텀 상태와 신규 매수 적합성을 판정한다.

        '
      inputs:
      - field: sector
        unit: string
      - field: momentum_state
        unit: enum
      output:
        field: sector_rotation_momentum_json
      input_fields:
      - sector
      - momentum_state
      expected_outputs:
      - sector_rotation_momentum_json
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    ANTI_WHIPSAW_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '반등/조정 혼선 구간에서 설거지성 매수와 성급한 매도를 차단한다.

        '
      inputs:
      - field: close_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: rsi14
        unit: points
      output:
        field: anti_whipsaw_status
      input_fields:
      - close
      - ma20
      - rsi14
      expected_outputs:
      - anti_whipsaw_status
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    BREAKEVEN_RATCHET_V1:
      owner: engine_owner
      status: active
      purpose: '손익분기 이상 구간에서 손절선을 평단 이상으로 올리는 래칫을 산출한다.

        '
      inputs:
      - field: average_cost
        unit: KRW_per_share
      - field: highest_price_since_entry
        unit: KRW_per_share
      output:
        field: breakeven_stop_price
      input_fields:
      - average_cost
      - highest_close
      expected_outputs:
      - breakeven_stop_price
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1:
      owner: engine_owner
      status: active
      purpose: '시장 반도체 비중을 반영한 동적 클러스터 차단/경고 임계값을 산출한다.

        '
      inputs:
      - field: semiconductor_cluster_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: semiconductor_cluster_gate
      input_fields:
      - kospi_semi_weight_pct
      - combined_pct
      - market_regime
      expected_outputs:
      - cluster_gate
      - cap_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    LEADER_POSITION_WEIGHT_CAP_V1:
      owner: quant_owner
      status: active
      purpose: '주도주 종목별 차등 비중 상한과 초과 TRIM 필요 여부를 산출한다.

        '
      inputs:
      - field: single_position_weight_json
        unit: json
      - field: market_regime
        unit: enum
      output:
        field: single_position_weight_gate
      input_fields:
      - ticker
      - position_weight_pct
      - market_regime
      expected_outputs:
      - leader_position_weight_gate
      - weight_cap_pct
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    CAPITAL_STYLE_ALLOCATION_V1:
      owner: quant_owner
      status: active
      purpose: '투자성향별 자금 유동성/공격성 가중치와 conviction을 산출한다.

        '
      inputs:
      - field: smart_money_flow_signal_v2_json
        unit: json
      - field: fundamental_multifactor_v3_json
        unit: json
      - field: macro_event_ticker_impact_v1_json
        unit: json
      - field: liquidity_flow_signal_v1_json
        unit: json
      output:
        field: capital_style_conviction
      input_fields:
      - investor_style
      - liquidity_profile
      expected_outputs:
      - capital_style_conviction
      - capital_style_label
      llm_allowed: cite_only
      version: 2026-05-30_PHASE8
    ALGORITHM_GUIDANCE_PROOF_V1:
      owner: engine_owner
      status: active
      purpose: 'YAML↔GAS 커버리지·결정론·LLM 의존도를 종합해 알고리즘 안내 품질 점수를 산출한다.

        '
      input_fields:
      - skeleton_score
      - cell_coverage_pct
      - harness_gate_pass
      - outcome_quality_score
      expected_outputs:
      - algorithm_guidance_proof_score
      - algorithm_guidance_proof_gate
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    ANTI_CHASE_V1:
      owner: engine_owner
      status: active
      purpose: '뒷북·설거지 진입을 차단하는 velocity 기반 anti-chase 게이트를 산출한다.

        '
      input_fields:
      - velocity_1d
      - velocity_5d
      - atr_ratio
      expected_outputs:
      - anti_chase_gate
      - chase_risk_level
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    ARTIFACT_FRESHNESS_GATE_V1:
      owner: data_owner
      status: active
      purpose: '하네스 산출물의 타임스탬프를 검증해 신선도 게이트를 산출한다.

        '
      input_fields:
      - artifact_timestamp
      - max_age_hours
      expected_outputs:
      - freshness_gate
      - stale_artifacts
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    AUDIT_REPLAY_SNAPSHOT_V1:
      owner: engine_owner
      status: active
      purpose: 'replay 시뮬레이션의 스냅샷을 생성해 의사결정 재현 감사를 지원한다.

        '
      input_fields:
      - replay_date
      - portfolio_state
      - decision_vector
      expected_outputs:
      - audit_snapshot
      - replay_validation_status
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CANONICAL_ARTIFACT_RESOLVER_V1:
      owner: engine_owner
      status: active
      purpose: '동일 의미의 중복 산출물 중 유일 출처를 지정해 단일 진실원장을 고정한다.

        '
      input_fields:
      - artifact_key
      - candidate_paths
      expected_outputs:
      - canonical_path
      - duplicate_artifacts
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CASH_RAISE_PARETO_EXECUTOR_V2:
      owner: quant_owner
      status: active
      purpose: '현금 확보 매도에서 파레토 최적 종목·수량 조합을 산출한다.

        '
      input_fields:
      - sell_candidates
      - cash_shortfall_krw
      - value_damage_weights
      expected_outputs:
      - pareto_sell_plan
      - cash_raise_efficiency
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CASH_RAISE_VALUE_OPTIMIZER_V3:
      owner: quant_owner
      status: active
      purpose: '현금확보 매도의 가치 손실을 최소화하는 종목·수량·실행방식을 결정한다.

        '
      input_fields:
      - sell_candidates
      - cash_shortfall_krw
      - rebound_potential
      expected_outputs:
      - optimized_sell_plan
      - value_damage_pct
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CASH_RECOVERY_OPTIMIZER_V4:
      owner: quant_owner
      status: active
      purpose: 'TRIM 우선순위·K2 분할·반등 대기를 결합해 현금 회복 실행 계획을 산출한다.

        '
      input_fields:
      - trim_candidates
      - cash_shortfall_krw
      - rebound_trigger_prices
      expected_outputs:
      - cash_recovery_plan
      - expected_recovery_krw
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CASH_RECOVERY_V1:
      owner: quant_owner
      status: active
      purpose: '현금 부족액 대비 단순 비례 매도 계획을 산출한다 (V4로 대체됨, 하위호환 유지).

        '
      input_fields:
      - sell_candidates
      - cash_shortfall_krw
      expected_outputs:
      - recovery_sell_qty
      - recovery_krw
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    COMPLETION_GAP_V1:
      owner: engine_owner
      status: active
      purpose: 'pass_100 기준 대비 미충족 항목과 격차를 정량화해 완료 갭 보고서를 산출한다.

        '
      input_fields:
      - pass_100_criteria
      - current_metrics
      expected_outputs:
      - completion_gap_score
      - failed_criteria_list
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    COMPREHENSIVE_PROPOSAL_V1:
      owner: engine_owner
      status: active
      purpose: '매수·매도·보유·현금확보 전 섹션을 통합한 종합 제안서를 생성한다.

        '
      input_fields:
      - buy_proposals
      - sell_proposals
      - portfolio_state
      expected_outputs:
      - comprehensive_proposal
      - proposal_id
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    CONTINUOUS_EVALUATION_DASHBOARD_V1:
      owner: engine_owner
      status: active
      purpose: 'T+1/T+5/T+20 성과를 주간 자동 갱신하는 연속 평가 대시보드를 산출한다.

        '
      input_fields:
      - trade_outcomes
      - evaluation_period
      expected_outputs:
      - weekly_scorecard
      - profit_giveback_pct
      - expectancy_pct
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_INTEGRITY_100_LOCK_V1:
      owner: data_owner
      status: active
      purpose: '핵심 데이터 필드의 정합성을 검증해 100% 잠금 게이트를 산출한다 (V2로 대체됨).

        '
      input_fields:
      - harness_context_fields
      expected_outputs:
      - data_integrity_gate
      - integrity_violations
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_INTEGRITY_100_LOCK_V2:
      owner: data_owner
      status: active
      purpose: '전 섹션 수치 일관성·출처 추적 가능성을 검증해 데이터 무결성 잠금을 산출한다.

        '
      input_fields:
      - report_sections
      - source_paths
      expected_outputs:
      - data_integrity_score
      - integrity_gate
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_INTEGRITY_SCORE_V1:
      owner: data_owner
      status: active
      purpose: '하네스 컨텍스트 전체의 데이터 무결성 점수를 산출한다.

        '
      input_fields:
      - harness_context
      expected_outputs:
      - data_integrity_score_v1
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_MATURITY_TRUTH_GATE_V1:
      owner: data_owner
      status: active
      purpose: 'type_A(결정론)/type_B(표본 의존) 축을 분리해 진실성 기반 성숙도 게이트를 산출한다.

        '
      input_fields:
      - type_a_metrics
      - type_b_metrics
      - sample_counts
      expected_outputs:
      - maturity_gate
      - truthful_100_axes
      - pending_evidence_axes
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_MATURITY_TRUTH_GATE_VALIDATOR_V1:
      owner: data_owner
      status: active
      purpose: 'DATA_MATURITY_TRUTH_GATE_V1 산출값의 형식·범위 유효성을 검증한다.

        '
      input_fields:
      - maturity_gate_output
      expected_outputs:
      - validation_result
      - validation_errors
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_QUALITY_GATE_V2_PY:
      owner: data_owner
      status: active
      purpose: 'Python 하네스 전용 데이터 품질 게이트 v2. GAS 버전과 parity 검증.

        '
      input_fields:
      - harness_context
      - required_fields
      expected_outputs:
      - data_quality_gate
      - missing_fields
      - quality_score
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    DATA_QUALITY_GATE_V3:
      owner: data_owner
      status: active
      purpose: '데이터 품질 게이트 v3. imputed 데이터 비율·출처 신뢰도를 추가 검증한다.

        '
      input_fields:
      - harness_context
      - imputed_fields
      - source_reliability
      expected_outputs:
      - data_quality_gate_v3
      - imputed_ratio
      - quality_grade
      llm_allowed: cite_only
      version: 2026-06-03_ORPHAN_RECONCILE
    REGIME_CONDITIONAL_MACRO_FACTOR_V1:
      owner: engine_owner
      status: active
      purpose: 거시팩터 종목별 FX 민감도 베타 적용 — 단일팩터 전 종목 균일 지배 차단 (Direction SFP1)
      agents_md_ref: 'Direction SFP1: SINGLE_FACTOR_DOMINANCE_CAP_V1'
      inputs:
      - field: base_macro_score
        unit: ratio_0_1
      - field: ticker
        unit: string
      - field: ticker_type
        unit: 'enum: export | domestic | neutral'
      expression: base_macro_score x fx_sensitivity_beta(ticker_type)
      components:
        fx_sensitivity_beta:
          export: 1.2
          domestic: 0.7
          neutral: 1.0
          note: '수출주(삼성전자·SK하이닉스 등): FX 민감도 20% 가중. 내수주: 30% 축소.'
      output:
        field: macro_factor_applied
        unit: ratio_0_1
      gate:
        condition: single_factor_max_share_pct > 50
        result: SINGLE_FACTOR_DEGENERATE
        action: WARN — synthesis_verdict 다양성 확보 실패, 보고서 첫 줄 경고 의무
      missing_policy: ticker_type 미확인 시 fx_beta=1.0(neutral) 적용
      implementation: tools/build_predictive_alpha_dialectic_engine_v2.py:NF1
      calibration_ref: spec/calibration_registry.yaml:NF1 (EXPERT_PRIOR)
      version: 2026-06-04_NF1
    PORTFOLIO_TRANSITION_UTILITY_V1:
      owner: quant_owner
      status: active
      purpose: >
        개별 매수·매도 추천이 아니라 포트폴리오 전체의 사후 상태(전환 후 cash floor, 집중도, CVaR,
        세후비용, 회전율)를 비교해 단일 최선 전환 또는 NO_TRADE를 결정론적으로 선택한다.
        (governance/todo/v8_9_p0_adoption_plan.yaml P0-1.2,
        source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:portfolio_transition_optimizer_v8_9)
      default_action: NO_TRADE
      inputs:
      - field: ce70_net_profit_krw
        source: Temp/forecast_simulation_engine_v1.json
        unit: KRW
        missing_policy: DATA_MISSING — candidate excluded, not assumed zero
      - field: tax_fee_slippage_krw
        source: Temp/sell_waterfall_engine_v4.json
        unit: KRW
      - field: cash_repair_benefit_krw
        source: Temp/smart_cash_recovery_v9.json
        unit: KRW
      - field: concentration_reduction_benefit_krw
        unit: KRW
      - field: turnover_penalty_krw
        unit: KRW
      expression: >
        transition_utility_krw = ce70_net_profit_krw - tax_fee_slippage_krw - cvar_penalty_krw
        - drawdown_penalty_krw + cash_repair_benefit_krw + concentration_reduction_benefit_krw
        - turnover_penalty_krw
      output:
        field: transition_utility_krw
        unit: KRW
      deterministic_fallbacks:
        missing_optimizer_inputs: NO_TRADE_AND_QUARANTINE
        solver_failure: NO_TRADE_AND_LOG_SOLVER_FAILURE
        rank_tie: choose_lower_turnover_lower_tax_lower_marginal_risk_contribution
        conflicting_runtime_packets: BLOCK_AND_REQUIRE_MANIFEST_REPAIR
      missing_policy: hard_constraint_input_missing 시 NO_TRADE_AND_QUARANTINE
      implementation: tools/build_portfolio_transition_optimizer_v1.py
      canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
      version: 2026-06-17_P0_v8_9_adoption
    REBOUND_CAPTURE_THESIS_FACTOR_V1:
      owner: engine_owner
      status: active
      purpose: 과매도 반등 진입을 thesis 팩터로 명시 — 영구 약세편향 해소 (Direction SFP1)
      agents_md_ref: 'Direction SFP1: SINGLE_FACTOR_DOMINANCE_CAP_V1 — REBOUND_CAPTURE
        thesis 반영'
      inputs:
      - field: rsi14
        unit: index_0_100
      - field: current_price
        unit: KRW_per_share
      - field: ma20
        unit: KRW_per_share
      - field: flow_credit
        unit: ratio_0_1
      - field: down_streak
        unit: days_integer
      expression: thesis_bonus = 15.0 if (25<=rsi14<=40) AND (current_price<=ma20*1.03)
        AND (flow_credit>=0.5) AND (down_streak>=2) else 0
      components:
        REBOUND_CAPTURE_WEIGHT:
          value: 15.0
          unit: thesis_points
          calibration_status: EXPERT_PRIOR
          note: 과매도 반등 4조건 동시 충족 시 thesis 점수 가산
      conditions:
        rsi14_range: 25 <= rsi14 <= 40 (과매도~회복 초입)
        price_pullback: current_price <= ma20 x 1.03 (MA20 ±3% 눌림목)
        flow_quality: flow_credit >= 0.5 (자금 유입 최소 기준)
        down_streak: down_streak >= 2 (연속 하락 2일 이상)
      output:
        field: rebound_capture_hit
        unit: boolean
      missing_policy: 4개 조건 중 1개라도 데이터 없으면 rebound_capture_hit=false
      implementation: tools/build_predictive_alpha_dialectic_engine_v2.py:NF2
      calibration_ref: spec/calibration_registry.yaml:NF2 (EXPERT_PRIOR)
      version: 2026-06-04_NF2
    ENTRY_TIMING_DECILE_FACTOR_V1:
      owner: engine_owner
      status: active
      purpose: 뒷박 매수 임계값 하드코딩 제거 — T+5 실측 분포 분위 기반 동적 컷 (Direction LC1)
      agents_md_ref: 'Direction LC1: LATE_CHASE_CALIBRATION_LOCK_V1'
      inputs:
      - field: buy_timing_score
        unit: ratio_0_1
        note: velocity_1d 실측 미확보 시 proxy 사용
      - field: t5_ledger
        unit: proposal_evaluation_history records
      - field: cut_decile
        unit: integer_1_10
        optional: true
      expression: entry_velocity_decile = ntile(buy_timing_score over t5_ledger, 10);
        buy_allowed = entry_velocity_decile > cut_decile
      components:
        cut_decile_default:
          value: 3
          calibration_status: EXPERT_PRIOR
          note: 하위 3분위 차단. samples>=30 후 실측 최저승률 분위로 자동 교체.
        min_samples:
          value: 30
          unit: records
      output:
        field: velocity_decile_thresholds
        unit: dict
        includes:
        - decile_1_9_pct
        - recommended_block_threshold
        - calibration_status
      gate:
        WATCH_PENDING_SAMPLE: samples < 30
        CALIBRATED_FROM_LEDGER: samples >= 30
      missing_policy: samples<30이면 EXPERT_PRIOR(buy_timing_score<30) 유지, precision=WATCH_PENDING_SAMPLE
      implementation: tools/build_late_chase_attribution_v1.py:NF3
      calibration_ref: spec/calibration_registry.yaml:NF3
      version: 2026-06-04_NF3
    SELL_SLIPPAGE_BUDGET_FACTOR_V1:
      owner: quant_owner
      status: active
      purpose: 현금확보 매도 ADV 5% 참여율 한도 TWAP 분할 — 설거지·주식가치 훼손 최소화 (Direction VD1)
      agents_md_ref: 'Direction VD1: VALUE_DAMAGE_RAW_GATE_V1 — TWAP 참여율 의무'
      inputs:
      - field: adv20
        unit: KRW
        note: 20일 평균 거래대금
      - field: current_price
        unit: KRW_per_share
      - field: sell_qty
        unit: shares
      - field: emergency_full_sell
        unit: boolean
        optional: true
      expression: max_child_qty = floor(adv20 * 0.05 / current_price); n_slices =
        ceil(sell_qty / max_child_qty); participation_rate = sell_qty * current_price
        / adv20
      components:
        adv_participation_cap:
          value: 0.05
          unit: ratio
          calibration_status: EXPERT_PRIOR
          note: ADV 5% 초과 단일 주문은 시장충격 위험. TWAP 분할 의무.
      output:
        max_child_qty: floor(ADV20 x 0.05 / price)
        n_slices: ceil(qty / max_child_qty)
        participation_rate: qty x price / ADV20
        twap_required: participation_rate > 0.05
      hard_override:
      - condition: emergency_full_sell == true
        action: TWAP 의무 면제 — 단, hts_limit_price 산출 의무 유지
      gate:
        INVALID_SELL_NO_LIMIT: hts_limit_price=null AND emergency_full_sell!=true
        TWAP_REQUIRED: participation_rate > 0.05 AND emergency_full_sell!=true
      missing_policy: adv20 미확인 시 TWAP_REQUIRED 보수적 적용
      implementation: tools/build_value_preservation_scorer_v1.py:NF4
      calibration_ref: spec/calibration_registry.yaml:NF4 (EXPERT_PRIOR)
      version: 2026-06-04_NF4
    PROFIT_GIVEBACK_RATCHET_FACTOR_V1:
      owner: quant_owner
      status: active
      purpose: 수익금 보전 ATR 기반 동적 래칫 — 번 돈을 지키는 원칙 (Direction E1·L2·R4 확장)
      agents_md_ref: Direction E1(APEX_SUPER), L2(ATR 트레일링), R4(전 보유종목 coverage)
      inputs:
      - field: prev_trail_stop
        unit: KRW_per_share
      - field: high_since_entry
        unit: KRW_per_share
      - field: atr20
        unit: KRW_per_share
      - field: market_regime
        unit: enum
      - field: profit_pct
        unit: percent
      expression: trail_stop = max(prev_trail_stop, high_since_entry - k * atr20)
      components:
        k_regime_map:
          APEX_SUPER_ge_50pct: 1.0
          APEX_TRAILING_ge_40pct: 1.5
          PROFIT_LOCK_30_ge_30pct: 2.0
          PROFIT_LOCK_20_ge_20pct: 2.0
          PROFIT_LOCK_10_ge_10pct: 2.5
          BREAKEVEN_RATCHET_ge_0pct: null
          NORMAL_lt_0pct: null
          calibration_status: EXPERT_PRIOR
      output:
        field: auto_trailing_stop
        unit: KRW_per_share
      gate:
        coverage_check: ratchet_coverage_pct == 100 (Direction R4 CHECK_64)
        fail_action: BLOCK 보고서 발행
      missing_policy: atr20 미확인 시 BREAKEVEN_RATCHET(=avg_cost*1.00) 적용
      implementation: tools/build_ratchet_trailing_general_v1.py:NF5
      calibration_ref: spec/calibration_registry.yaml:NF5 k값 (EXPERT_PRIOR)
      version: 2026-06-04_NF5
