meta:
  title: "은퇴자산포트폴리오 — 정수 수량·변동성 타기팅·베이지안 명세"
  parent_file: "RetirementAssetPortfolio.yaml"
  version: "2026-05-16-F3_kosdaq_strict"
  language: "ko-KR"
  timezone: "Asia/Seoul"
  has_code_implementation: true
  code_path: "src/quant_engine/compute_formula_outputs.py"
  purpose: "메인 manifest에서 로드되는 구조화 규칙 명세 파일."

position_sizing:
  sequence: ["BUY_PERMISSION_MATRIX_V1", "계좌별 투자 가능 현금", "목표비중", "변동성 조정", "손절가 기준 손실허용액", "유동성 상한", "정수 수량", "매수금액=지정가×수량", "잔여 현금 이월"]

  pre_permission_gate:  # [2026-05-20_APEX_V1] POSITION_SIZE_V1 선행 허가 매트릭스
    purpose: >
      정수 매수수량을 계산하기 전에 현금·Total Heat·선행 알파·돌파 확인·설거지 위험·기대우위를
      하나의 하네스 상태로 잠근다. 이 게이트가 BLOCKED/WATCH이면 POSITION_SIZE_V1을 호출해도
      final_qty는 null 또는 0주 관찰만 허용한다.
    formula_ref: "spec/13b_harness_formulas.yaml:BUY_PERMISSION_MATRIX_V1"
    required_inputs:
      - "cash_floor_status"
      - "heat_gate_status"
      - "alpha_lead_score"
      - "follow_through_state"
      - "distribution_risk_score"
      - "expected_edge"
    states:
      ALLOW_PILOT: "선행 파일럿만 허용. max_tranche_pct 20~30."
      ALLOW_ADD_ON: "FOLLOW_THROUGH_CONFIRM_V1 확인 후 본진입/증액 허용."
      WATCH: "조건 대기. 수량 산출 금지."
      BLOCKED: "매수 차단. 수량 산출 금지."
    hard_rules:
      - "cash_floor_status != PASS → BLOCKED"
      - "heat_gate_status=BLOCK_NEW_BUY → BLOCKED"
      - "distribution_risk_score >= 55 → WATCH 또는 BLOCKED"
      - "alpha_lead_score < 75 AND follow_through_state != CONFIRMED_ADD_ON → WATCH"
      - "expected_edge floor 미달 → BLOCKED"
    output_contract:
      buy_permission_json: "종목별 buy_permission_state, max_tranche_pct, blocked_reason_codes"
      buy_qty_inputs_json: "buy_permission_state가 ALLOW_*가 아니면 final_qty=null"
    prohibition:
      - "BUY_PERMISSION_MATRIX_V1 미출력 상태에서 POSITION_SIZE_V1만으로 신규 BUY 수량 확정 금지"
      - "설거지 차단(BLOCK_BUY)을 시장 해설·뉴스로 완화 금지"
      - "ALLOW_PILOT 상태에서 계획수량 30% 초과 금지"

  volatility_targeting:
    formula: "수량 = floor((총투자자산 × risk_budget) / (20일 ATR × atr_multiplier))"
    default: {risk_budget: 0.007, atr_multiplier: 1.5}
    risk_budget_note: "0.007은 base값. 수량 산출 전 반드시 cascade_risk_budget_rule 적용 후 최종값 사용. bayesian_confidence.application_order 선행 필수."
    requirements:
      - "20일 ATR·지정가·총투자자산이 모두 확인된 경우에만 정수 수량 산출."
      - "20일 ATR이 [데이터누락]이면 매수수량 0주 처리."
      - "산출 수량은 계좌별 현금·목표비중·섹터한도 중 최솟값으로 재삭감."
      - "ATR 화면값이 장중 지연값인지 종가 기준인지 불명확하면 정수 수량 산출 불가."

  liquidity_constraint:
    cap:
      core_large_cap: "1회 주문금액은 최근 5거래일 평균 거래대금의 1.0% 이하"
      normal_core: "0.5% 이하"
      satellite: "0.25~0.5% 이하"
      etf: "1.0% 이하. 괴리율·스프레드 미확인 시 0.5% 이하."
    final_quantity_rule: "최종수량 = min(ATR수량, 현금한도수량, 목표비중한도수량, 섹터한도수량, 유동성상한수량)"
    split_order: "산출 주문금액이 유동성 상한의 50% 초과 시 최소 2회 분할."
    execution_quality_guard:  # [2026-05-20_APEX_V1]
      formula_ref: "spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1"
      rule: >
        매수·매도 모두 주문금액이 avg_trade_value_5d의 1%를 초과하면 분할 필요,
        3%를 초과하면 HTS 단일 주문 PASS 금지. 스프레드·호가단위·장중변동성 검증 실패 시
        validation_status=EXECUTION_QUALITY_BLOCKED.
      output_required:
        - "execution_quality_status"
        - "split_count"
        - "child_order_amount_krw"
        - "hts_allowed"
      prohibition:
        - "execution_quality_status!=PASS인데 HTS 주문표 PASS 금지"
        - "시장가 주문 금지. 비상 예외는 하네스 reason_code 필요"

  bayesian_confidence:
    base_prior: "데이터가 완전하지 않으면 기본 확률 중립 이하. prior 상향은 데이터 완성도 기준으로만. → master_prohibitions.P3"
    multiplier:
      high_confidence: "핵심 필드 모두 OK + 최근 30건 신호 net_expectancy > 0 → risk_budget 1.0배"
      medium_confidence: "핵심 필드 1개 PARTIAL 또는 성과검증 30건 미만 → 0.5배"
      low_confidence: "핵심 필드 2개 이상 PARTIAL/DATA_MISSING → 0.25배"
      no_bet: "ATR20 미확인, Flow_Rows<5, DART_Risk 존재, 상장 리스크, 기대값<=0 → 0주"
    application_order: "volatility_targeting 수량 산출 전 risk_budget에 multiplier 먼저 곱한다."
    performance_brake:  # regime_reset은 아래 완전 버전 하나만 유지 (중복 제거)
      rule: "계좌 총자산이 3거래일 연속 하락하거나 최근 5건 매매 승률이 40% 미만 시, 목표 risk_budget을 절반(예: 0.007 → 0.0035)으로 삭감하여 파산확률을 원천 차단한다."
      scope: "price-flow 불일치(kelly.brake_conditions)와는 독립적인 성과 기반 감액 트리거."
      reset_condition: "계좌 총자산 3거래일 연속 회복 AND 연속 5건 매매 승률 50% 이상 복귀 시 risk_budget 단계적 원복. 전액 즉시 복구 금지 — +25%p씩 최대 2회에 걸쳐 순차 복귀."
    equity_curve_protection:  # [2026-05-19_ALPHA_SHIELD_APEX_V2] ECP001
      rule: "총자산 곡선이 10일 이동평균선(total_asset_ma10)을 하회할 경우, 시스템 전체 base_risk_budget을 50% 즉시 삭감(0.007 → 0.0035)한다."
      priority: "최상위 리스크 브레이크. 다른 모든 multiplier 적용 전 base 삭감."
      rationale: "개별 종목 승률과 무관하게 계좌 전체 추세가 꺾이면 리스크 노출을 물리적으로 축소."
    regime_reset:
      rule: "시장 국면 전환(KOSPI 20일선 이탈 또는 VIX 25 돌파) 시, 기존 모든 confidence multiplier를 0.5x~0.7x로 강제 리셋하고 신규 데이터 5건 확인 전까지 유예한다."
      recovery_condition: "KOSPI 20일선 안정 회복 AND VIX 18 이하 하락 AND 신규 성과 데이터 5건 이상 확인 후 multiplier 원복 검토 (performance_brake 동일 단계 원복 규칙 준용)."
    prohibition: ["필요수익률 높다는 이유로 multiplier 상향 금지", "뉴스·테마·목표가만으로 high_confidence 부여 금지", "성과검증 표 없으면 high_confidence 금지"]
    # [P_B / 2026-05-15] Net-R 피드백 루프 — performance_evidence 결과가 risk_budget으로 직접 환류하는
    # 명시적 경로 부재로 A등급 금지 시에도 risk_budget 0.007 full 산출 가능한 공백 해소.
    net_return_feedback:
      source: "performance_evidence.pass_fail — net_expectancy 및 downgrade_rule 결과"
      rule_1:
        condition: "최근 20건 net_expectancy <= 0 (비용차감 후 기대값 0 이하)"
        action: "bayesian_multiplier를 medium_confidence(0.5x) 강제 적용. high_confidence 부여 금지."
        note: "performance_evidence.pass_fail.downgrade_rule(A등급 금지)과 중첩 적용."
      rule_2:
        condition: "최근 30건 net_expectancy <= -2%p"
        action: >
          base_risk_budget 0.007 → 0.003 강제 삭감.
          performance_evidence.pass_fail.retire_rule 발동과 동시에 적용.
          해당 신호 타입(섹터·진입 패턴)을 표에 명시하고 LLM 보고서에 RETIRE 표시.
      reset_condition: >
        최근 5건 net_expectancy > 0 회복 후 performance_brake.reset_condition과 동일한
        단계적 원복 규칙 준용 (+25%p씩 최대 2회). 즉각 0.007 복귀 금지.
      output_required:
        - "net_return_feedback 상태: NORMAL / CAUTION(rule_1) / REDUCED(rule_2) / RETIRE"
        - "현재 유효 base_risk_budget 값"
        - "rule_2 발동 시 해당 신호 타입 명시"
      prohibition:
        - "net_expectancy 미산출(거래 20건 미만) 상태에서 이 규칙 적용 금지 — NORMAL로 간주"
        - "→ master_prohibitions.P3 전역 적용 (REDUCED 상태 원복 포함)"

  kelly:
    status: "brake_only"
    purpose: >
      과유불급. 부정확한 승률 W 기반 증액은 파산 가속기다.
      켈리는 오직 가격-수급 불일치 돌발 상황에서 ATR 수량을 절반으로 깎는 브레이크로만 사용한다.
    increase_allowed: false
    brake_conditions:
      - "가격-수급 불일치: Close 5거래일 연속 하락이나 Frg_5D 또는 Inst_5D만 기계적 순매수 증가"
      - "flow_credit < 0.40 AND 주가 추세 하락 이탈 동시 성립 (flow_credit 정의: quant_feed_contract.investor_flow_rules.active_quality_gate.formula 참조)"
    action: "brake_conditions 해당 시 volatility_targeting ATR수량의 50% 강제 감액 (Half-Brake). 조건 해소 확인 전 원복 금지."
    prohibition:
      - "Kelly 공식으로 risk_budget 증액 금지"
      - "승률 W 단독 추정으로 배팅 계산 금지"
      - "→ master_prohibitions.P3 전역 적용 (kelly brake 해제 포함)"

  # [Q1 / 2026-05-15] risk_budget 범위 표현이 cascade 기본값(0.007=0.7%)과 겉으로 충돌해
  # LLM이 상한(1.2%=0.012)을 기본값으로 오산출하는 할루시네이션 방지.
  risk_budget:
    base: 0.007  # 총자산의 0.7% — cascade_risk_budget_rule의 base_risk_budget과 동일
    ceiling: 0.012  # 총자산의 1.2% — CSCS >= 90 AND bayesian high_confidence 경우에만 허용
    floor: 0.001  # cascade_risk_budget_rule.floor 참조. 미만이면 no_bet(0주)
    canonical_formula: "cascade_risk_budget_rule을 거친 final값이 실제 적용값. 이 범위는 참고 상한/하한만."
    prohibition: "base(0.007) 무시하고 ceiling(0.012) 직접 사용 금지. 반드시 cascade_risk_budget_rule 통과 후 결정."

  cascade_risk_budget_rule:
    purpose: >
      kelly Half-Brake × Bayesian 감액이 동시 발동할 때 실제 risk_budget을 명시한다.
      미문서화 상태에서 0주 또는 근사 0주 산출이 반복되는 것을 방지한다.
    step_1_base: "base_risk_budget = volatility_targeting.default.risk_budget (0.007)"
    step_2_bayesian: "bayesian_adjusted = base × bayesian_confidence_multiplier  # high:×1.0 / medium:×0.5 / low:×0.25 / no_bet:0주"
    step_3_kelly: "final = bayesian_adjusted × 0.50  # kelly Half-Brake 발동 시에만 적용"
    worst_case_examples:
      high_confidence_kelly_brake: "0.007 × 1.0 × 0.50 = 0.0035"
      low_confidence_kelly_brake: "0.007 × 0.25 × 0.50 = 0.000875 → floor 적용으로 no_bet 처리"
    floor:
      min_risk_budget: 0.001
      action: "산출된 final < 0.001 이면 수량=0주(no_bet). 0.001로 올려 강제 진입 금지."
    no_bet_override: "bayesian_confidence_multiplier=0(no_bet 등급)이면 연쇄 감액 계산 무관하게 수량=0주 강제."
    # [Q6 / 2026-05-15] performance_brake·regime_reset·net_return_feedback 3개 규칙이
    # 동시 발동 시 처리 순서 없어 연쇄 삭감(0.007×0.5×0.5×0.5=0.000875 → 0주)으로
    # 좀비 상태 지속되는 공백 해소.
    simultaneous_trigger_rule:
      purpose: "cascade 외부 성과 기반 규칙(performance_brake·regime_reset·net_return_feedback·equity_curve_protection)이 동시 발동 시 처리 기준."
      rule: >
        세 규칙은 각각 독립적으로 base_risk_budget을 조정한다.
        단, 최종 조정 결과는 cascade_risk_budget_rule의 step_1→step_2→step_3 순서를 따르며,
        외부 규칙들은 step_1의 base_risk_budget 입력값만 변경한다.
      priority_order:
        1: "equity_curve_protection: 자산 MA10 하회 시 base 0.007 → 0.0035 선제 삭감 (ECP001)"
        2: "net_return_feedback (rule_2 발동 시): base를 0.0035 또는 0.007 → 0.003 강제 삭감"
        3: "performance_brake (발동 시): 현재 결과의 50% 추가 삭감"
        4: "regime_reset (발동 시): 결과에 multiplier 0.5x~0.7x 적용"
      deduplication: "동일 규칙이 여러 차례 발동해도 해당 step은 1회만 적용. 중복 삭감 금지."
      floor_check: "모든 단계 적용 후 final < 0.001이면 no_bet(0주). 강제 진입 금지."
      recovery:
        rule: "세 규칙 각각의 reset_condition이 충족되는 순서대로 단계별 원복."
        example: "net_return_feedback 먼저 reset → base 0.003 → 0.007. performance_brake reset → 50% 삭감 해제."

  execution_cost_gate:
    required: ["왕복수수료", "거래세 또는 세금효과", "예상 호가스프레드", "예상 슬리피지"]
    default_slippage: {core_large_cap: "0.10%", normal_core: "0.20%", satellite: "0.30~0.50%", thin_liquidity: "0.70% 이상 또는 신규매수 금지"}
    net_rr_rule: "비용 차감 후 기대수익비 2:1 미만이면 A등급 금지."
    designated_price_calc:
      buy:
        math: "지정가 = 진입희망가 + (ATR20 × 0.05)"
        purpose: "호가 우선 체결을 위한 소폭 상향 보정. ATR20 미확인 시 사용 금지."
      sell:
        math: "지정가 = 목표가 - (세금+수수료율 합산) - (ATR20 × 0.05)"
        purpose: "비용 선반영 실질 익절가 산출. HTS 입력 기준값."
      on_atr_missing:
        buy: "희망가 그대로 사용. [ATR보정불가] 표기."
        sell: "목표가 그대로 사용. [ATR보정불가] 표기."
      prohibition: "ATR20=DATA_MISSING 상태에서 이 공식 산출값을 [계산값]으로 표기 금지."

  correlation_check:
    default_sector_cap: 25
    benchmark_core_sector_cap: {normal: "벤치마크 중립비중 + 10%p", risk_on_earnings: "벤치마크 + 15%p, 총자산 65% 초과 금지", risk_off: "벤치마크 중립비중 또는 총자산 50% 중 낮은 값"}
    exception: "삼성전자·SK하이닉스는 special_exception.kospi_semiconductor_leadership, 반도체 ETF는 duplicate_exposure_rule 우선."

  zero_share: "0주 산출 시 관찰"

  # [proposal_92 / 2026-05-16] 코스닥 종목 비중 상한 별도 설정
  kosdaq_weight_cap:
    purpose: "코스닥 종목은 유동성·변동성·구조적 리스크가 코스피보다 높으므로 단일 비중 상한을 별도 적용."
    single_stock_max:
      kosdaq_satellite: "총자산 5% — 코스피 위성 7% 대비 -2%p"
      kosdaq_core:      "총자산 10% — 코스닥 종목은 코어 편입 후에도 코스피 general core(18%) 상한 미적용"
    aggregate_cap:
      rule: "코스닥 종목 합산(코어+위성) 총자산 20% 이하 유지"
      exception: "삼성전자·SK하이닉스는 코스피 종목이므로 이 캡 미적용"
      action: "초과 시 신규 코스닥 매수 전면 중단. 기존 포지션 손절·익절 실행은 허용."
    staged_entry_size_adjustment:
      purpose: "staged_entry_v2의 코스닥 종목 단계별 투입 비중을 코스피보다 보수적으로 설정"
      stage_1_explore: "코스닥 종목: 총자산 0.3~0.5% (코스피 0.5~1.0% 대비 절반 수준)"
      stage_2_confirm: "코스닥 종목: 총자산 0.8~1.5% (코스피 1.5~3.0% 대비 절반 수준)"
      stage_3_core_load: "코스닥 종목: 총자산 2.0~4.0% (코스피 4.0~7.0% 대비 절반 수준. kosdaq_core 상한 10% 이내)"
    prohibition:
      - "코스닥 종목에 코스피 코어 비중 규칙(18% 상한) 적용 금지"
      - "코스닥 aggregate 20% 초과 시 신규 코스닥 매수 금지"
      - "코스닥 단일 종목 5% 초과를 CSCS 점수만으로 정당화 금지"
      - "staged_entry_v2 실행 시 코스닥 종목에 코스피 투입 비중 그대로 사용 금지"

  special_exception:
    kospi_semiconductor_leadership:
      principle: "삼성전자·SK하이닉스가 KOSPI를 주도하는 장세에서는 절대비중만으로 매도·매수제한을 결정하지 않는다."
      benchmark_gate:
        rule: "KOSPI 내 삼성전자+SK하이닉스 합산 비중 확인 후 포트폴리오 직접보유 비중과 비교."
        if_missing: "벤치마크 대비 초과비중 판단 금지. 단, 손실예산·현금부족·추세이탈 기준은 적용."
      samsung_electronics:
        target_band: "총자산 32~42%; 주도장에서 45%까지 허용"
        max_weight_soft: "45%"
        hard_stop_weight: "48%"
        add_buy_condition: ["비중 38% 이하", "Price_Status=PRICE_OK, Flow_OK=Y", "20일선 위 또는 눌림 후 지지 확인, 외국인 또는 기관 20D 순매수, 거래대금 급감 아님", "돌파 직후 전량매수 금지", "반도체 실질노출이 semiconductor_total_cap 이내"]
        trim_condition: ["45% 초과 + 현금 7% 미만", "45% 초과 + 20일선 종가 이탈", "45% 초과 + 5D 동반 순매도", "48% 초과 시 초과분 3회 이내 분할 축소"]
        no_trim_condition: ["KOSPI 주도력 유지, 20일선 위, 20D 수급 훼손 없음", "단순히 18% 초과한다는 이유"]
      sk_hynix:
        target_band: "총자산 8~18%; 강한 실적장세·수급 우위에서 22%까지 허용"
        max_weight_soft: "22%"
        hard_stop_weight: "25%"
        add_buy_condition: ["Price_Status=PRICE_OK, Flow_OK=Y", "20일선 위 또는 신고가 후 눌림", "기관 또는 외국인 20D 순매수", "돌파 첫날은 시범진입만", "신규매수 후 단일종목 손실예산 1.0% 이내"]
        trim_condition: ["22% 초과 + 20일선 종가 이탈", "22% 초과 + 5D 동반 순매도", "25% 초과 시 2~3회 분할 축소"]
      semiconductor_total_cap:
        calculation: "삼성전자 + SK하이닉스 + 반도체 ETF 실질노출"
        base_cap: "총자산 60%"
        risk_on_earnings_cap: "총자산 65%; 현금 7% 이상 유지"
        risk_off_cap: "총자산 50%"
        action_above_cap: "중복 ETF → 수급 이탈 종목 → 후순위 반도체 순서 축소. 삼성전자·SK하이닉스 직접보유는 마지막."

  # [proposal_84 / 2026-05-16] 주도주 리스크 예산 계단 — offensive_risk_budget_ladder
  offensive_risk_budget_ladder:
    purpose: >
      SECULAR_LEADER_RISK_ON 국면에서 삼성전자·SK하이닉스에 한해
      staged_entry 단계별로 risk_budget을 계단형으로 상향한다.
      base 0.007 → stage_2에서 0.009 → stage_3에서 0.0105.
      ceiling 0.012는 어떤 경우에도 초과하지 않는다.
    activation_required_all:
      - "market_regime_state == SECULAR_LEADER_RISK_ON"
      - "종목이 삼성전자 OR SK하이닉스"
      - "CSCS >= 85"
      - "bayesian_confidence == high_confidence"
      - "Total_Heat < 7%"
      - "post_trade_immediate_cash_ratio >= cash_floor.normal.min_cash_ratio (7%)"
      - "Expected_Edge >= 1.8"
    levels:
      level_1_stage1:
        applied_stage: "staged_entry_v2 stage_1 신규 또는 초기 진입"
        risk_budget: 0.007
        note: "base값 그대로. SECULAR_LEADER_RISK_ON 발동만으로 상향 없음."
      level_2_stage2:
        applied_stage: "staged_entry_v2 stage_2_confirm 조건 충족 시"
        activation_extra:
          - "stage_2 진입 조건 충족 (price +1.5% 이상 상승, C2·C4 재확인)"
          - "미실현수익 양수 (현재가 > stage_1 평단가)"
        risk_budget: 0.009
      level_3_stage3:
        applied_stage: "staged_entry_v2 stage_3_core_load 조건 충족 시"
        activation_extra:
          - "20일 신고가 돌파 (종가 기준)"
          - "20D 수급 유지 (C4 지속)"
          - "반도체 sector_flow Rotation_Score 1위"
        risk_budget: 0.0105
    hard_limits:
      - "0.012 ceiling 초과 절대 금지 — 상한은 risk_budget.ceiling과 동일"
      - "Total_Heat >= 7%이면 ladder 비활성. cascade_risk_budget_rule caution 50% 감액 우선 적용"
      - "performance_brake 발동 시 ladder 비활성 (base 0.007에 50% 삭감 적용)"
      - "net_return_feedback REDUCED 발동 시 ladder 비활성 (base 0.003 고정)"
      - "ladder 비활성 조건 해소 전까지 level_2·level_3 미적용. level_1(0.007) 유지."
    deactivation:
      condition: "SECULAR_LEADER_RISK_ON 비활성화 즉시 ladder 전체 비활성. base 0.007로 복귀."
    output_required:
      - "보고서에 [ladder_state: ACTIVE/INACTIVE, 적용 level, risk_budget값] 표기 필수"

  # [proposal_50 / 2026-05-15] 피라미딩(증액) 규칙 — pyramiding_rule
  pyramiding_rule:
    purpose: "이기는 종목에 증액, 지는 종목은 절대 증액 금지(물타기 금지). 수익 중 종목만 켈리 원칙에 따라 단계적 증액."
    prerequisite: "staged_entry_v2 stage_2 이상 완료, 현재 미실현 수익 양수, anti_climax_buy_gate <= 1"
    scale_in_rules:
      first_add:
        trigger: "진입가 대비 +3~+5% 도달 AND stage_2 수급 조건(C4) 유지"
        size: "기존 보유수량의 20~30% 추가. 총자산 대비 합산 비중 7% 이내 유지."
        method: "지정가. 현재가 기준 -0.3~-0.5% 매수. 추격매수 금지."
      second_add:
        trigger: "진입가 대비 +8~+10% 도달 AND C4 수급 지속 AND sector_priority_ranking Tier_1 유지"
        size: "기존 보유수량의 15~20% 추가. 총자산 대비 합산 비중 10% 이내."
        method: "지정가. 현재가 기준 -0.3~-0.5%."
      max_add_count: "2회. 이후 추가 증액 금지."
    trailing_stop_reset:
      rule: "증액 후 trailing_stop 기준가를 새 평단가 기준으로 재설정. 기존 trailing_stop이 더 빡빡한 경우 기존 기준 유지."
    scale_down_rules:
      MA20_breach: "종가 MA20 하회 시 증액분 우선 청산. 원래 stage_1 수량만 유지."
      sector_weakness: "sector_priority_ranking Tier_2 이하로 강등 시 증액분 전량 청산."
    prohibition:
      - "손실 중 추가매수(물타기) 절대 금지 — 진입가 대비 음수 수익률 종목 증액 금지"
      - "aggregate_risk_cap 초과 증액 금지"
      - "증액 후 합산 비중 total 10% 초과 금지 (special_exception 제외)"
      - "소수점 수량 산출 금지. 정수 단위만."

  # [proposal_54 / 2026-05-15] 탐색 실패 허용 예산(Failure Cut) — explore_loss_budget
  explore_loss_budget:
    purpose: >
      staged_entry_v2 stage_1 탐색매수의 손절 손익은 이 FC 예산 계정에 귀속.
      performance_brake·net_return_feedback 등 성과 기반 규칙에서 제외하여
      탐색 실패 공포로 인한 공격 슬롯 마비를 방지한다.
    budget:
      formula: "monthly_FC_budget = 총자산 × 0.025 (월 2.5%)"
      note: "매월 1일 초기화. 미사용 잔액은 이월 불가."
    accounting_rules:
      in_scope:  "staged_entry_v2 stage_1 탐색 손절, staged_exit_on_stall 타임아웃 청산"
      out_scope: "stage_2 이상 손절, core 손절, stop_loss 정상 발동 손절"
      net_return_exclusion: "FC 귀속 손익은 net_return_feedback.rule_2 판정 계산에서 제외"
      performance_brake_exclusion: "FC 귀속 손익은 performance_brake 발동 판정에서 제외"
    budget_exhaustion:
      condition: "당월 FC 잔액 = 0"
      action: "stage_1 탐색매수 중단. stage_2·stage_3은 정상 가동."
      reset: "다음 달 1일 budget 초기화 → 탐색 재개"
    output_table:
      columns: ["월", "월초예산(원)", "사용금액(원)", "잔액(원)", "당월탐색건수", "당월손절건수"]
    orbit_gap_interaction:  # [proposal_81 / 2026-05-15] FC 손절의 orbit_gap 포함/제외 및 FC 소진 시 슬롯 조정
      purpose: "FC 탐색 손절비용의 orbit_gap 계산 포함 여부 및 FC 소진 시 다음 달 슬롯 조정 규칙"
      orbit_gap_treatment:
        rule: "orbit_gap 계산의 실제누적수익률에 FC 손절 비용 포함 (총자산 기준 전체 반영)"
        exception: "performance_feedback_loop의 재교정 계산에서만 FC 분리 적용 (탐색 실패율 별도 추적)"
        rationale: "orbit_gap은 순자산 변화를 측정하므로 FC 손절도 총자산 감소로 반영해야 현실적 궤도 추적 가능"
      fc_exhaustion_rule:
        trigger: "당월 FC 소진율 >= 100% (= monthly_FC_budget 전액 소진)"
        action_next_month:
          stage_1_reduction: "다음 달 탐색매수(stage_1) 허용 건수 -1건 자동 감액"
          output_required: "블록11A section_C FC잔액 항목에 [FC 소진 — 다음 달 stage_1 -1건 적용 예정] 표기"
        reset_condition: "FC 소진율 < 50%인 달이 1개월 경과 시 다음 달부터 감액 해제"
      prohibition:
        - "FC 손절을 orbit_gap에서 제외해 궤도 달성률을 과장 표기 금지"
        - "FC 소진 후 다음 달 슬롯 감액 없이 동일 건수 유지 금지"
    prohibition:
      - "FC 예산 핑계로 stage_1 탐색 손절을 performance_brake에 포함시켜 과도한 규제 금지"
      - "FC 예산 소진 후 stage_1 탐색 강행 금지"
      - "FC 예산을 stage_2 이상 손절에 사용 금지 (별도 계정)"

  # [proposal_60 / 2026-05-15] 성과 피드백 루프 통합 — performance_feedback_loop
  performance_feedback_loop:
    purpose: >
      daily_leader_scan → staged_entry_v2 → pyramiding_rule → take_profit/stop_loss →
      net_expectancy 측정 → C1~C5 임계치 재교정의 전체 피드백 루프.
      30건 매매 데이터 후 파라미터를 데이터 기반으로 업데이트한다.
    trigger:
      primary:   "30건 매매 완료 (탐색 진입 기준 카운트)"
      secondary: "net_expectancy < 0 상태 10건 연속 지속 시 즉시 중간 점검"
      emergency: "손절률 > 55% 또는 평균수익 < 2% 시 즉시 전체 임계치 상향 검토"
    net_expectancy:
      formula: "net_expectancy = (win_rate × avg_win_pct) - (loss_rate × avg_loss_pct)"
      target: "net_expectancy > 0.5% per trade"
      targets:
        win_rate_target: ">= 55%"
        avg_win_target:  ">= 4%"
        avg_loss_target: "<= 3.5%"
      note: "explore_loss_budget(FC) 귀속 손절은 별도 집계. net_expectancy 계산 제외."
    recalibration_rules:
      if_win_rate_below_45pct:    "탐색 후보 등재 최소 점수 4점 → 4.5점 상향"
      if_avg_loss_above_5pct:     "anti_climax_buy_gate 임계치 3개 → 2개 하향 (더 보수적)"
      if_net_expectancy_above_1pct: "탐색 후보 최소 점수 4점 → 3.5점 하향 (MRS <= 3 구간에서만)"
      pyramiding_success_below_50pct: "1차 증액 트리거 +3% → +4%로 상향"
    data_required_per_trade:
      - "입장일·청산일·입장 시 daily_leader_scan 점수(C1~C5 각각)"
      - "입장 단계(stage_1/2/3)·청산 유형·수익률(%)·보유기간"
      - "입장 시 MRS 점수·anti_climax_buy_gate 신호 수"
    prohibition:
      - "30건 미만 데이터로 임계치 변경 금지"
      - "단일 대형 손실 건을 근거로 긴급 임계치 상향 금지"
      - "재교정 결과가 risk_block(master_prohibitions P1~P5)과 충돌하면 재교정 결과 파기"
