meta:
  title: "은퇴자산포트폴리오 — 상세 보고서 양식"
  parent_file: "RetirementAssetPortfolio.yaml"
  version: "2026-05-15-G1"
  purpose: >
    보고서 출력 시에만 로드하는 상세 양식 파일.
    투자 판단(분석·수량산출)만 필요한 세션에서는 이 파일 없이 메인 파일만으로 충분.
  load_instruction: "메인 manifest의 load_sequence.STEP_3_for_output 및 spec_files.report_templates 참조."

output_format_templates:

  rendering_contract:
    purpose: "사람용 보고서를 표 중심으로 렌더링하기 위한 상위 양식 계약."
    language_rendering:
      default_locale: "ko-KR"
      section_title_korean_first: true
      status_label_map_source: "spec/07_output_schema.yaml:korean_display_labels"
      prefer_korean_reason_text: true
      preserve_english_only_for:
        - "공식_ID"
        - "종목코드"
        - "파일경로"
        - "명령어"
        - "JSON key"
      prohibit_direct_english_status:
        - "PASS"
        - "FAIL"
        - "BLOCKED"
        - "ACTIVE"
        - "INACTIVE"
        - "BUY"
        - "SELL"
        - "TRIM"
    required_sequence:
      - "routing_serving_trace"
      - "QEH_AUDIT_BLOCK"
      - "capture_read_ledger"
      - "data_completeness_matrix"
      - "backdata_feature_bank_table"
      - "benchmark_relative_harness_table"
      - "alpha_lead_table"
      - "anti_distribution_table"
      - "profit_preservation_table"
      - "smart_cash_raise_table"
      - "execution_quality_table"
      - "proposal_reference_sheet"
      # ── [2026-05-20_HARNESS_V5] 신규 필수 섹션 ──────────────────────────────
      - "breakout_quality_gate_table"
      - "anti_whipsaw_gate_table"
      - "smart_cash_raise_v2_table"
      # ─────────────────────────────────────────────────────────────────────────
      - "order_quantity_4stage_gate"
      - "decision_trace_table"
      - "sell_priority_decision_table 또는 발동조건 미충족 사유"
      - "current_holdings_analysis_report_template 또는 발동조건 미충족 사유"
      - "proposal_reference_sheet 또는 제안 산출 불가 사유"
      - "concise_hts_input_sheet 또는 산출금지 사유"
      - "reference_price_ledger 또는 WATCH 없음"
      - "immediate_execution_playbook 또는 산출금지 사유"
      - "market_context_learning_note 또는 생략 사유"
      - "core_satellite_timing_gate_table"
      - "engine_feedback_loop_report"
      - "prediction_evaluation_improvement_report"
    blocked_report_rule:
      id: "BLOCKED_REPORT_V5"
      trigger: "required_sequence의 필수 섹션이 하나라도 누락된 경우"
      action: "해당 섹션 이후의 모든 주문표·HTS 입력 시트를 BLOCKED_REPORT로 처리"
      hard_lock_sections:
        - section: "breakout_quality_gate_table"
          missing_action: "신규 BUY 주문표 전체 BLOCKED_BREAKOUT_GATE_MISSING"
        - section: "anti_whipsaw_gate_table"
          missing_action: "SELL/TRIM 주문표 전체 BLOCKED_WHIPSAW_GATE_MISSING"
        - section: "smart_cash_raise_v2_table"
          missing_action: "현금확보 매도 주문표 BLOCKED_CASH_ROUTE_MISSING"
    prose_rule:
      allowed: "각 표의 근거·매도사유·다음확인사항 칸 안의 짧은 문장"
      prohibited: "서론/본론/결론형 산문, 임의 제목, 표 밖 수량·현금·평단 근거 서술"
    enum_rule:
      order_type: ["BUY", "SELL", "STOP_LOSS", "TAKE_PROFIT", "TRAILING_STOP", "HOLD", "WATCH"]
      mode: ["lead", "lag", "hybrid", "none"]
      validation_status: ["PASS", "BLOCKED", "INSUFFICIENT_DATA", "MANUAL_CHECK_REQUIRED"]
      human_label_rule: "사용자 보고서에는 spec/07_output_schema.yaml:korean_display_labels를 적용하되, 원 enum에서 벗어난 새 용어를 만들지 않는다."
    terminology_rule:
      prohibited_order_terms: ["부분감액", "1차 감액", "부분정리", "전량", "전량매도"]
      replacement_rule: "주문구분은 SELL/TRIM 등 canonical action으로, 수량은 확인된 정수 수량으로 분리한다."
      note: "'전량'은 모드가 아니다. 보유수량 검산 후 SELL 수량이 현재보유수량과 같을 때만 근거 칸에서 설명 가능하다."
    learning_note_rule:
      location: "주문 검산·HTS 주문표·보유주 진단 이후에만 배치한다."
      role: "사용자 이해를 돕는 해설이며 주문 검증, 수량 산출, validation_status를 대체하지 않는다."
      prohibition:
        - "학습 해설에서 신규 주문수량·지정가·손절가·익절가·현금 숫자 생성 금지"
        - "표에서 검증되지 않은 계좌·보유·현금 숫자 인용 금지"
        - "거시 설명만으로 BUY/SELL/TRIM/ROTATE 결론 변경 금지"

  routing_serving_trace_report:
    purpose: "요청 라우팅·번들·프롬프트·JSON 검증 상태를 QEH_AUDIT_BLOCK 이전에 고정하는 서빙 원장."
    columns: ["항목", "확정값", "근거", "검산상태", "차단사유"]
    required_rows:
      - "request_route"
      - "bundle_selected"
      - "prompt_entrypoint"
      - "json_validation_status"
      - "capture_required"
      - "cash_ledger_basis"
    fill_rule:
      - "RetirementAssetPortfolio.yaml manifest와 DATA_SOURCE_ROUTING 결과를 사용한다."
      - "JSON 검증 실패 또는 bundle/entrypoint 미확정이면 QEH_AUDIT_BLOCK 이후 주문표는 BLOCKED_REPORT로 제한한다."
      - "cash_ledger_basis는 settlement_cash_d2_krw 원칙을 명시한다."

  QEH_AUDIT_BLOCK_report:
    purpose: "하네스 공식 검산 표. 주문표·판단표보다 먼저 출력한다."
    columns: ["공식_ID", "사용입력", "하네스값", "LLM_변경여부", "판정", "차단/허용 액션"]
    required_formulas: ["TOTAL_HEAT_V1", "CASH_RATIOS_V1", "SELL_PRIORITY_V1"]
    optional_formulas: ["GOAL_RETIREMENT_V1", "CASH_SHORTFALL_V1"]
    fill_rule:
      - "data._harness_context 값은 재계산하지 않고 그대로 복사한다."
      - "LLM_변경여부는 항상 NO여야 하며, 다른 값이면 보고서 INVALID."
      - "blocked_actions는 산문으로 완화하지 않는다."

  backdata_feature_bank_table:
    purpose: "GAS 자동 수집 진입-청산 백데이터 원장. 수동 등록보다 GAS 원장을 우선한다."
    canonical_ref: "spec/16_data_gaps_roadmap.yaml:phase_4_backdata_collection.B1_gas_backdata_feature_bank"
    columns: ["Record_Date", "Trade_ID", "Signal_Date", "Ticker", "Name", "Account", "Entry_Stage", "Source_Origin", "Entry_Price", "Close_At_Entry", "MA20_At_Entry", "MA60_At_Entry", "ATR20_At_Entry", "Volume_Ratio_5D", "Flow_Credit", "Late_Chase_Risk_Score", "Follow_Through_Score", "Breakout_Score", "Rebound_Preservation_Score", "Setup_Decision", "Exit_Reason", "PnL_Pct", "Holding_Days", "MAE_Pct", "MFE_Pct"]
    fill_rule:
      - "backdata_feature_bank_json 값을 그대로 사용한다."
      - "Source_Origin=GAS_AUTO 행을 우선 표기하고, performance fallback이나 manual correction은 뒤로 둔다."
      - "값이 없으면 추정하지 말고 '_' 또는 '-'로 비운다."

  benchmark_relative_harness_table:
    purpose: "KOSPI 대비 시계열 상대평가와 위성 품질·손익·현금창출 목적 잠금을 표시한다."
    canonical_ref: "spec/13_formula_registry.yaml:BENCHMARK_RELATIVE_TIMESERIES_V1, SATELLITE_ALPHA_QUALITY_GATE_V1, SATELLITE_AGGREGATE_PNL_GATE_V1, CASH_CREATION_PURPOSE_LOCK_V1"
    columns: ["종목", "brt_verdict", "excess_drawdown_pctp", "recovery_ratio_20d", "downside_beta", "rs_line_20d_slope", "saqg_v1", "sell_reason_validity", "sapg_status", "공식_ID"]
    fill_rule:
      - "benchmark_relative_timeseries_json, saqg_json, sapg_json, cash_creation_purpose_lock_json 값을 그대로 사용한다."
      - "saqg_v1=EXCLUDED 또는 WATCHLIST_ONLY이면 BUY 후보·파일럿·HTS 주문표에 포함하지 않는다."
      - "sapg_status=SAPG_CRITICAL이면 위성 신규 BUY는 전면 차단한다."
      - "LLM이 초과낙폭·회복률·하락장 베타·RS선 기울기를 재계산하지 않는다."

  alpha_lead_table:
    purpose: "뒷북 매수를 줄이기 위한 선행 알파 후보와 추격 금지 상태를 표시한다."
    canonical_ref: "spec/13b_harness_formulas.yaml:ALPHA_LEAD_SCORE_V1, FOLLOW_THROUGH_CONFIRM_V1"
    columns: ["종목", "alpha_lead_score", "follow_through_status", "rs_rank", "volume_surge", "upside_pct", "buy_permission", "공식_ID", "검산상태"]
    fill_rule:
      - "alpha_lead_json 및 follow_through_json 값을 그대로 사용한다."
      - "buy_permission_json이 BLOCKED이면 HTS BUY 주문표를 생성하지 않는다."
      - "선행 점수의 산문 재해석으로 final_action을 변경하지 않는다."

  anti_distribution_table:
    purpose: "설거지·분산매도 구간의 추격 매수와 늦은 물타기를 차단한다."
    canonical_ref: "spec/13b_harness_formulas.yaml:DISTRIBUTION_RISK_SCORE_V1"
    columns: ["종목", "distribution_risk_score", "risk_label", "price_position", "val_surge_pct", "inst20d", "frg20d", "blocked_action", "공식_ID"]
    fill_rule:
      - "distribution_risk_json 값을 그대로 사용한다."
      - "risk_label=HIGH 또는 blocked_action 존재 시 BUY/ADD_ON은 BLOCKED로만 출력한다."

  profit_preservation_table:
    purpose: "수익 포지션의 이익 보호 상태와 손절 상향·익절·트레일링 상태를 고정한다."
    canonical_ref: "spec/13b_harness_formulas.yaml:PROFIT_PRESERVATION_STATE_V1"
    columns: ["종목", "profit_state", "unrealized_pnl_pct", "ratchet_state", "tp_state", "trailing_state", "allowed_action", "공식_ID"]
    fill_rule:
      - "profit_preservation_json 값을 그대로 사용한다."
      - "수익 포지션을 현금확보 대상으로 쓸 때도 smart_cash_raise_table의 제안그룹과 충돌 여부를 표시한다."

  smart_cash_raise_table:
    purpose: "현금확보 매도를 일괄 투매가 아니라 즉시매도·반등대기·보류로 나누는 제안 계획표."
    canonical_ref: "spec/13b_harness_formulas.yaml:SMART_CASH_RAISE_PLAN_V1, SELL_QUANTITY_ALLOCATOR_V1, REBOUND_SELL_TRIGGER_V1"
    columns: ["우선순위", "종목", "cash_raise_group", "target_cash_krw", "immediate_sell_qty", "rebound_wait_qty", "protected_qty", "rebound_trigger", "예상순현금", "공식_ID"]
    fill_rule:
      - "cash_raise_plan_json과 smart_sell_quantities_json 값을 그대로 사용한다."
      - "보유수량 미확인 또는 CAPTURE_REQUIRED이면 수량 칸에 숫자를 쓰지 않는다."
      - "rebound_wait_qty는 즉시 HTS 매도수량이 아니므로 concise_hts_input_sheet에 합산하지 않는다."

  execution_quality_table:
    purpose: "주문 단가·호가·체결 품질·유동성 조건을 최종 주문표 전에 검산한다."
    canonical_ref: "spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1, LIMIT_PRICE_POLICY_V1"
    columns: ["종목", "order_type", "limit_price", "tick_status", "liquidity_status", "gap_status", "execution_permission", "차단사유", "공식_ID"]
    fill_rule:
      - "execution_quality_json과 limit_price_policy_json 값을 그대로 사용한다."
      - "tick_status != VALID 또는 execution_permission != PASS이면 HTS 주문표 검산상태 PASS 금지."

  proposal_reference_sheet:
    purpose: "사용자 판단용 제안 원장. 가격·수량·기준시점·차단사유만 남기고 주문 실행 의미는 섞지 않는다."
    columns: ["계좌", "종목", "종목명", "제안구분", "예상지정가(원)", "기준시점(종가/장중)", "제안가 기준", "예상수량(주)", "수량 기준", "손절1(원)", "손절수량1(주)", "손절2(원)", "손절수량2(주)", "손절3(원)", "손절수량3(주)", "익절가1(원)", "익절수량1(주)", "익절가2(원)", "익절수량2(주)", "익절가3(원)", "익절수량3(주)", "실행가능여부", "차단사유"]
    fill_rule:
      - "prices_json, sell_quantities_json, buy_qty_inputs_json, decisions_json 값을 우선 사용한다."
      - "validation_status=PASS 여부와 무관하게 산출 가능한 가격·수량은 표시한다."
      - "실행가능여부는 proposal_only / execution_wait / execution_ready 중 하나를 사용한다."
      - "이 표는 HTS 즉시 입력표가 아니므로 concise_hts_input_sheet와 반드시 분리한다."
      - "SELL/TRIM/방어 제안은 예상지정가에 stop_price를 우선 사용한다."
      - "익절 제안은 예상지정가에 tp1_price를 우선 사용하고 없으면 tp2_price를 사용한다."
      - "BUY 제안은 order_blueprint limit_price 우선, 없으면 buy_qty_inputs_json 보조 입력을 사용한다."
      - "WATCH/HOLD는 주문가가 아니라 참고 방어가임을 차단사유 또는 설명에 명시한다."
      - "SELL/TRIM 제안 수량은 sell_quantities_json.sell_qty 우선 사용한다."
      - "BUY 제안 수량은 buy_qty_inputs_json.final_qty 우선 사용한다."
      - "WATCH/HOLD는 주문 실행 수량이 아니라 판단 참고 수량임을 수량 기준 컬럼에 명시한다."
      - "익절 1/2/3 가격·수량은 tp_quantity_ladder_json과 prices_json을 결합해 표시한다."
      - "손절1/2는 stop_loss.core/satellite quantity_rule 기준으로 core=50/50, satellite=70/30 분할을 표시한다."
      - "손절3은 profit_preservation_json.protected_stop_price 또는 auto_trailing_stop가 있을 때만 표시한다."

  reference_price_ledger:
    purpose: "WATCH/PENDING/BLOCKED 행의 참고 가격 원장. 주문표가 아니며 평가용 참고 상태를 공개한다."
    title_required: "WATCH 감시 원장 — 주문 아님, HTS 입력 금지"
    columns: ["ticker", "name", "reference_stop_price", "reference_price_basis", "reference_tp_state", "hts_allowed", "reason_code"]
    forbidden_columns: ["지정가", "손절가", "익절가", "매도가", "주문가", "주문수량", "손절수량", "익절수량", "매도수량", "주문금액"]
    fill_rule:
      - "hts_allowed는 항상 false로 기재한다."
      - "WATCH 행에 주문 가능 단가·수량처럼 보이는 한글 컬럼명을 쓰면 INVALID_COLUMN 처리한다."
      - "reference_tp_state는 tp1/tp2 상태를 함께 공개한다. 예: tp1=PENDING; tp2=PENDING."

  capture_read_ledger_report:
    purpose: "계좌·보유·현금 판독 증빙 원장. 이 표 없이 HTS 주문표를 출력하지 않는다."
    columns: ["파일/화면", "계좌", "화면종류", "읽은값", "확신도", "주문표반영", "판독_상태", "다음확인사항"]
    fill_rule:
      - "spec/00_execution_contract.yaml:capture_read_ledger.columns를 우선 적용한다."
      - "보유수량·평단·현금·미체결 주문의 출처를 읽은값에 구분해 적는다."
      - "NOT_PROVIDED 또는 CAPTURE_READ_FAILED이면 해당 계좌 주문수량은 산출하지 않는다."
    prohibition:
      - "자동투자/약정 화면 수치를 보유수량·평단·현금으로 사용 금지"
      - "원장 행 없이 본문에서 총자산·현금·보유수량 근거 생성 금지"

  order_quantity_4stage_gate_report:
    purpose: "주문표 출력 직전 4단계 검산 결과 표."
    columns: ["계좌", "종목명", "1단계_원장", "2단계_현금", "3단계_보유수량", "4단계_미체결", "최종검산상태", "차단사유", "다음확인사항"]
    pass_rule: "네 단계가 모두 통과일 때만 immediate_execution_playbook 검산상태=PASS를 허용한다."
    fail_rule: "하나라도 실패·미확인이면 주문표 대신 산출금지 사유를 출력한다."

  decision_trace_table:
    purpose: "상태 머신의 각 판단 단계에서 어떤 규칙이 적용되어 어떤 결론이 선택/차단됐는지 남기는 재현성 검산 표."
    canonical_ref: "spec/09_decision_flow.yaml:decision_flow.deterministic_execution_control"
    activation:
      trigger: "모든 분석·주문·리뷰 출력에서 필수"
      priority: "order_quantity_4stage_gate 이후, 보유주 진단 및 HTS 주문표 이전"
    columns: ["단계", "check_id", "rule_ref", "사용입력", "결과", "선택행동", "차단행동", "누락입력", "동률처리", "다음상태"]
    fill_rule:
      - "각 행은 decision_flow.states의 상태 또는 output validation 단계 하나를 나타낸다."
      - "rule_ref는 파일 경로와 YAML path를 함께 적는다."
      - "사용입력은 실제 사용한 필드명만 적고, 값이 민감하거나 길면 evidence 참조로 대체한다."
      - "누락입력이 있으면 선택행동은 BLOCKED/INSUFFICIENT_DATA/WATCH 중 하나로 제한한다."
      - "동률처리는 deterministic_execution_control.tie_breaker_order 번호를 적는다."
    prohibition:
      - "판단 추적표 없이 final_action 또는 HTS 주문표 출력 금지"
      - "decision_trace에 없는 rule_id를 근거로 최종 결론 변경 금지"
      - "동률처리 없이 동일 점수 후보 중 임의 선택 금지"

  sell_priority_decision_table:
    purpose: "여러 매도·축소·교체 후보가 동시에 존재할 때 HTS 주문 실행 순서를 정하는 포트폴리오 단위 표. 활성 시 current_holdings_analysis_report_template보다 먼저 렌더링한다."
    canonical_ref: "spec/risk/portfolio_exposure.yaml:portfolio_exposure_framework.sell_priority_engine"
    activation:
      trigger:
        - "SELL/TRIM/ROTATE 후보가 2개 이상"
        - "cash_floor 미달 또는 이벤트 주 현금 상향 필요"
        - "중복노출 축소와 보유주 진단 축소 후보가 동시에 존재"
      priority: "order_quantity_4stage_gate 이후, current_holdings_analysis_report_template보다 먼저"
    columns: ["우선순위", "계좌", "종목명", "실행그룹", "현재보유수량", "매도가능검산", "매도유형", "우선순위단계", "Sell_Priority_Score", "예상순현금", "세금/비용", "매도사유", "보류사유", "다음확인사항"]
    fill_rule:
      - "우선순위단계는 sell_priority_engine.hard_precedence 중 하나를 사용한다."
      - "Sell_Priority_Score는 동일 단계 후보 정렬용이며 hard_precedence를 뒤집지 않는다."
      - "현재보유수량 또는 평균단가가 미확인이면 매도가능검산=미통과, 수량은 미산출로 둔다."
      - "예상순현금은 세금·수수료 미확인 시 숫자 대신 '세금/비용 확인 필요'로 둔다."
    prohibition:
      - "이 표 없이 여러 매도 후보의 실행 순서를 산문으로만 제시 금지"
      - "보유수량 미확인 후보에 정수 매도수량 기재 금지"
      - "세금 최적화만으로 hard stop 후보를 후순위로 미루지 않는다."

  market_context_learning_note:
    purpose: "거시·미시 경제 상황, 시장 움직임, 투자자 고민 포인트, 핵심 용어, 판단근거를 학습용으로 정리하는 조건부 해설 블록."
    activation:
      trigger:
        - "사용자가 학습형 설명을 요청한 경우"
        - "주간·월간 점검 보고서"
        - "시장국면 변경, 리밸런싱, 대규모 매도/축소, 신규 주도주 편입 검토가 발생한 경우"
      priority: "주문 검산·HTS 주문표·보유주 진단 이후, 부록 또는 후반부"
      note: "실행 판단을 먼저 확정한 뒤 독자의 이해를 돕기 위한 해설로만 사용한다."
    columns: ["구분", "현재 관찰값/상태", "투자자가 고민할 점", "판단에 미친 영향", "핵심 용어", "다음 확인 데이터"]
    row_types:
      macro: "금리, 환율, 유가, VIX, KOSPI/KOSDAQ 추세, credit spread 등 포트폴리오 위험예산과 현금비중에 영향을 주는 배경."
      micro_market: "섹터 순환, 주도주 집중, 거래대금, 외국인/기관 수급, ETF·직접주 중복노출 등 시장 내부 움직임."
      investor_dilemma: "지금 사야 하는가, 기다려야 하는가, 현금을 얼마나 남겨야 하는가, 손실 종목을 버틸 근거가 있는가 같은 실제 의사결정 질문."
      decision_basis: "BUY/HOLD/SELL/TRIM/ROTATE/WATCH 결론에 영향을 준 rule_id, 수치, hard stop, missing_data."
      glossary: "Total_Heat, cash_floor, ATR20, Expected_Edge, Flow_Rows, flow_credit, lead/lag/hybrid mode 등 보고서 내 핵심 용어."
    fill_rule:
      - "현재 관찰값/상태는 data_basis, data_completeness_matrix, risk_gate, market_regime_state, sector_flow, macro에서 검증된 값만 사용한다."
      - "판단에 미친 영향은 어떤 주문 결론을 새로 만들지 말고 이미 확정된 portfolio_decision 또는 prohibited_calculations에 연결한다."
      - "다음 확인 데이터는 구체 출처를 적는다. 예: macro 시트, sector_flow 시트, HTS 보유종목 화면, 미체결 주문 화면."
      - "수치가 없으면 추정하지 말고 '미확인' 또는 '다음 확인 필요'로 적는다."
    example_rows:
      macro: ["거시", "VIX·환율·KOSPI MA20 상태 확인 필요", "현금비중을 낮춰도 되는가", "MRS와 cash_floor 판단에만 반영", "MRS, cash_floor", "macro 시트, KOSPI MA20, USD/KRW"]
      micro_market: ["미시/시장", "특정 섹터 수급 집중 여부 확인", "ETF와 직접주 중 어느 노출이 효율적인가", "중복노출·리밸런싱 후보 판단에 반영", "sector_flow, duplicate_exposure", "sector_flow, core_satellite"]
      investor_dilemma: ["고민 포인트", "매수 신호는 있어도 ATR20 또는 현금이 미확인일 수 있음", "기회비용과 검산 실패 중 무엇을 우선할 것인가", "validation_status 미통과 시 주문 금지", "ATR20, validation_status", "data_feed, account_snapshot"]
      decision_basis: ["판단근거", "Total_Heat·cash_floor·Flow_Rows가 핵심 gate", "왜 A등급이어도 즉시매수가 아닐 수 있는가", "hard stop이 전략 점수보다 우선", "Total_Heat, Flow_Rows", "risk_gate, triggered_rules"]
      glossary: ["용어", "Expected_Edge는 기대수익 대비 손실위험 비율", "손절폭이 넓으면 수량이 줄어드는 이유", "position_sizing 산식 이해 보조", "Expected_Edge, ATR20", "spec/13_formula_registry.yaml"]
    output_rule:
      - "각 행은 교육 목적의 해설이며 주문 산출 근거 표를 대체하지 않는다."
      - "항목별 설명은 2~3문장 이내로 제한한다."
      - "용어 설명은 보고서에서 실제 사용한 용어를 우선한다."
      - "판단근거는 rule_id 또는 파일 경로를 함께 적는다."
    prohibition:
      - "학습 해설에서 신규 매수·매도 결론 생성 금지"
      - "학습 해설만으로 validation_status를 PASS로 변경 금지"
      - "웹이나 일반 지식만으로 workbook/account_snapshot 결론 대체 금지"
      - "출처 없는 최신 시장 상황 단정 금지"

  data_flow_analysis_report:
    purpose: >
      블록 2(데이터 완성도 매트릭스) 직후, 블록 3(캡처 판독 원장) 전에 1페이지로 삽입.
      데이터→신호→판단→행동 4단계 흐름을 표로 가시화해 병목 단계를 즉시 파악.
    flow_table:
      columns:
        - "종목명"
        - "[D]데이터상태 (OK/PARTIAL/MISSING)"
        - "[S]신호 (추세/수급/유동성 각각 Pass/Fail)"
        - "[J]판단 (A/B/C/D등급·이유)"
        - "[A]행동 (즉시/조건부/보류/금지)"
        - "병목단계 (D/S/J 중 어느 단계가 블록인지)"
        - "다음확인우선순위"
      fill_rule:
        - "[D]: 블록 2 데이터 완성도 매트릭스에서 직접 참조."
        - "[S]: minimalist_buy_gate 3핵심 지표 결과."
        - "[J]: sector_model.grade + Expected_Edge + flow_credit 종합. (결합 공식 → fill_rule_J_detail)"
        - "[A]: 최종 즉시실행/조건부/보류/금지 결론."
        - "병목단계: [D]에서 막히면 'D', [S]에서 막히면 'S', [J]에서 막히면 'J'."
      absence_rule: "통과 이유 없는 A등급 금지. 모든 칸은 값 또는 '없음'으로 채운다."
      fill_rule_J_detail:  # [P139] [J] 단계별 상한 설정 — 3개 시스템 결합 공식
        step_1: "sector_model.score_axes_formula 산출 → A_core/B_wait/C_watch/D_exclude 상한 설정"
        step_2: "Expected_Edge < 1.5이면 최대 B등급 (A 승격 불가)"
        step_3: "flow_credit < 0.40이면 최대 C등급 (A·B 승격 불가)"
        step_4: "step_1~3 모두 통과 시에만 sector_model.grade 결론 채택"
        precedence: "Expected_Edge 기준 > sector_model.grade (충분조건 vs 필요조건)"
        output_format: "A/B/C/D 중 하나 + 근거 (예: B — Expected_Edge 1.8 충족, flow_credit 0.55 partial)"
    minimalist_output:
      - "3지표([S]) 모두 Pass인 종목은 강조 표시."
      - "병목이 [D]인 종목은 '다음확인우선순위'에 구체 출처 명시."
      - "병목이 [S]인 종목은 실패한 지표와 임계치 명시."

  current_holdings_analysis_report_template:
    purpose: "현재 보유주를 대상으로 유지/축소/교체/관찰을 판단하는 전용 보고서 양식."
    activation:
      trigger: "보유수량이 확인된 종목이 1개 이상이거나 position_review_cycle.documentation 점검 주기에 도달했을 때"
      priority: "제안 검토 표 다음, 매수/매도 예시 이전"
      note: "신규 종목 추천이 아니라 기존 보유 포지션 점검 전용이다."
    decision_score_formula: >
      current_holdings_score = 0.30*trend_score + 0.30*flow_score + 0.20*edge_score + 0.10*concentration_score + 0.10*execution_score.
      trend_score, flow_score, edge_score, concentration_score, execution_score는 모두 0~100 정규화 값으로 입력한다.
    score_components:  # [R4] 컴포넌트별 산출 규칙
      trend_score:
        "100": "현재가 > 20일선 AND 20일선 > 60일선 AND 5일선 위 주행"
        "70": "현재가 > 20일선 AND 20일선 > 60일선 (5일선 이탈)"
        "40": "현재가 > 20일선 (60일선 하향배열)"
        "10": "현재가 < 20일선"
        missing: "20일선·60일선 미확인 → 50점(중립)"
      flow_score:
        "100": "Frg_5D + Inst_5D 동반 순매수 AND flow_credit >= 0.60"
        "70": "Frg_5D 또는 Inst_5D 중 1개 순매수 AND flow_credit >= 0.40"
        "40": "flow_credit 0.20~0.39"
        "10": "Frg_5D + Inst_5D 동반 순매도"
        missing: "Flow_OK=N 또는 Flow_Rows<5 → 25점"
      edge_score:
        formula: "Expected_Edge = (익절가 - 진입가) / (진입가 - 손절가)"
        "100": "Expected_Edge >= 2.5"
        "70": "1.8 <= Expected_Edge < 2.5"
        "40": "1.2 <= Expected_Edge < 1.8"
        "10": "Expected_Edge < 1.2"
        missing: "손절가·익절가 미설정(legacy_position) → 0점"
      concentration_score:
        "100": "current_weight <= target_weight"
        "70": "target_weight < current_weight <= target_weight + 3%p"
        "40": "target_weight + 3%p < current_weight <= target_weight + 5%p"
        "10": "current_weight > target_weight + 5%p"
        missing: "target_weight 미설정 → 50점(중립)"
      execution_score:
        "100": "진입 후 D+5 이내 수익 구간 진입 OR 시범진입 후 본진입 계획 유효"
        "70": "진입 후 D+20 이내 플러스 구간 유지"
        "40": "진입 후 D+20 경과, 0% 근방"
        "10": "진입 후 D+20 경과, 손실 구간 AND time_stop 임박"
        missing: "진입일 미확인 → 50점(중립)"
    thresholds:
      keep: "score >= 70 AND current_weight within target_band ±5%p AND grade in (A,B)"
      trim: "score 50~69 OR current_weight exceeds target_band by >5%p OR duplicate_factor_overweight"
      rotate: "score < 50 OR grade in (C,D) AND flow_negative_20d"
      watch: "보유수량 0 또는 판독 미완료"
    keep_criteria:
      - "현재비중이 목표비중 대비 ±5%p 이내"
      - "등급 A 또는 B"
      - "기대수익비(Expected_Edge) >= 1.8"
      - "20일 수급과 추세가 동시에 유지"
    trim_criteria:
      - "현재비중이 목표비중 대비 +5%p 초과"
      - "기대수익비(Expected_Edge) 1.2~1.8"
      - "동일 섹터 또는 동일 팩터 중복 노출이 상한 초과"
      - "수익률이 플러스여도 포트폴리오 집중도만 과다하면 축소"
    rotate_criteria:
      - "등급 C 또는 D"
      - "20일 수급 음수"
      - "반등 실패 또는 대체주 우위"
      - "손익률 -5% 이하이면서 회복 논리 부재"
    watch_criteria:
      - "보유수량 0"
      - "평단 또는 현재가 판독 미완료"
      - "핵심 데이터 누락으로 score 산출 불가"
    columns: ["계좌", "종목명", "현재보유수량", "평단", "현재가", "현재비중(%)", "손익률(%)", "섹터/팩터", "등급", "판단점수", "유지/축소/교체", "근거", "다음점검일"]
    input_example:
      fields: ["trend_score", "flow_score", "edge_score", "concentration_score", "execution_score", "current_weight", "target_band", "grade", "Expected_Edge"]
      sample_values: ["85", "78", "82", "60", "75", "12.4", "10.0", "A", "2.1"]
      sample_calc: "0.30*85 + 0.30*78 + 0.20*82 + 0.10*60 + 0.10*75 = 78.2"
      sample_judgement: "점수 78.2, 현재비중 12.4%, 목표밴드 10.0% 대비 +2.4%p, grade A이므로 유지"
      sample_fill_rule: "trend/flow/edge는 데이터에서, concentration/execution은 계좌비중과 주문검산에서 채운다."
    output_phrases:
      keep: "유지 — 점수 {score}, 비중 {current_weight}%가 목표밴드 {target_band}% 이내, 등급 {grade}, 기대수익비 {expected_edge}."
      trim: "축소 — 점수 {score}, 현재비중이 목표밴드 대비 과다, 중복 노출 또는 기대수익비 저하 확인."
      rotate: "교체 — 점수 {score}, 20일 수급 음수 또는 반등 실패로 기존 포지션 교체 필요."
      watch: "관찰 — 보유수량 0 또는 핵심 데이터 미완료로 판단 보류."
    output_rule:
      - "판단점수와 등급을 함께 표기한다."
      - "유지/축소/교체/관찰 중 하나만 최종 출력한다."
      - "문장형 근거와 수치형 점수를 동시에 보여준다."
    keep_row: ["일반계좌", "예시종목", "120", "24800", "27500", "12.4", "+10.8", "반도체", "A", "82", "유지", "주도 섹터 + 수급 유지 + 기대수익비 충족", "D+5"]
    trim_row: ["ISA", "예시종목", "80", "38000", "36000", "8.1", "-5.3", "전력기기", "B", "61", "축소", "섹터 중복 + 기대수익비 저하 + 리밸런싱 대상", "D+3"]
    rotate_row: ["연금저축", "예시종목", "50", "59000", "54500", "4.2", "-7.6", "개별 성장주", "C", "42", "교체", "수급 이탈 + 반등 실패 + 대체주 우위", "D+2"]
    watch_row: ["일반계좌", "예시종목", "0", "0", "0", "0.0", "0.0", "없음", "D", "0", "관찰", "보유 없음 또는 판독 미완료", "D+7"]
    required_inputs:
      - "현재보유수량"
      - "평단"
      - "현재가"
      - "현재비중"
      - "섹터/팩터"
      - "등급"
      - "기대수익비"
    prohibition:
      - "현재보유수량·평단·현재가 없이 보유주 분석 금지"
      - "신규매수 제안과 동일 표에 혼용 금지"
      - "보유주 분석에서 손절가·익절가를 강제로 생성하지 않는다"

  market_leader_screening_report_template:
    purpose: "떠오르는 주도주를 관찰 후보·편입 후보·금지 후보로 나누는 전용 스크리닝 보고서."
    activation:
      trigger: "sector_flow 또는 quant_feed 갱신 시, 또는 매주 정기 점검 시"
      priority: "current_holdings_analysis_report_template 및 immediate_execution_playbook 다음"
      note: "이 블록은 core_satellite 자산배분 표와 분리된 주도주 발굴용이다."
    source_binding:
      required_sheets: ["core_satellite", "sector_flow", "macro", "event_risk"]
      freshness_rule: "주도주 후보 표의 모든 행은 Price_Date, sector_flow.AsOfDate, macro.AsOfDate를 함께 적고, 하나라도 다르면 '데이터 불일치'로 표시한다."
      unit_normalization_rule: "AvgTradeValue_5D_M와 AvgTradeValue_20D_M는 보고서 출력 시 억원 단위로 환산해 표기한다. 원 단위와 혼용 금지."
      quantity_integrity_rule: "보유수량, 주문수량, 계좌원장, 판독상태 중 하나라도 미확정이면 후보 분류보다 '판독 미완료'를 우선한다."
    columns: ["종목명", "섹터", "Rotation_Score", "5D수급", "20D수급", "상대강도", "유동성", "실적추정", "등급", "분류", "액션", "편입근거", "금지근거"]
    observe_row: ["한미반도체", "반도체 장비", "88", "양호", "양호", "우수", "충분", "상향", "A", "관찰 후보", "현금·중복노출 확인 후 재평가", "반도체 과다보유 시 즉시 편입 금지"]
    include_row: ["기아", "자동차", "82", "양호", "양호", "우수", "충분", "유지", "A", "편입 후보", "섹터 순환매와 수급 동시 확인", "현금 미확보 시 추격매수 금지"]
    ban_row: ["LS ELECTRIC", "AI전력", "58", "혼조", "혼조", "보통", "충분", "혼조", "C", "금지 후보", "테마는 강하나 단기 수급 이탈", "상대강도 회복 전까지 신규매수 금지"]
    incomplete_row: ["TIGER 코리아AI전력기기", "AI전력 ETF", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "수량·비중·판독상태 미확정", "수량 미확정은 후보 판단보다 먼저 보류"]
    candidate_gate:
      observe_candidate: "Allowed_Action=CONDITIONAL_HOLD 이고 Rotation_Score >= 50 이면 관찰 후보"
      include_candidate: "Allowed_Action=CONDITIONAL_HOLD 이고 sector_flow.Alert_Level in (INFLOW_MODERATE, NEUTRAL) 이며 중복노출이 과도하지 않을 때 편입 후보"
      ban_candidate: "Allowed_Action=SELL_ALLOWED 또는 sector_flow.Alert_Level in (OUTFLOW_ALERT, OUTFLOW_CAUTION) 이면 금지 후보"
      incomplete_candidate: "판독 미완료 또는 수량 미확정이면 어떤 등급도 부여하지 않고 데이터 재확인으로 되돌린다."
    rules:
      - "주도주 후보는 core_satellite 자산배분 후보와 다른 개념으로 표기한다."
      - "관찰 후보는 강하지만 계좌 중복노출이 높아 즉시 매수하면 안 되는 종목이다."
      - "편입 후보는 현금·수량·손절가·익절가를 갖춘 경우에만 매수 제안으로 전환한다."
      - "금지 후보는 테마성 강세라도 수급·유동성·실적 중 하나라도 훼손되면 신규매수 금지로 둔다."
      - "핵심 데이터의 단위가 맞지 않으면 후보 분류보다 데이터 불일치 표기를 우선한다."
      - "수량 판독이 불완전한 종목은 절대 관찰/편입 후보로 승격하지 않는다."
    required_inputs:
      - "sector_flow Rotation_Score"
      - "5D/20D 수급"
      - "상대강도"
      - "유동성"
      - "실적추정"
      - "기존 보유와의 중복노출"
    prohibition:
      - "주도주 후보를 core_satellite 후보로 오독하지 않는다"
      - "관찰 후보를 즉시매수 후보로 승격하지 않는다"
      - "금지 후보를 테마가 강하다는 이유로 편입하지 않는다"

  market_micro_macro_flow_scenario_report_template:
    purpose: "미시(종목)·거시(국면)·전체 자금흐름·향후 시나리오를 한 페이지로 묶는 통합 진단 보고서."
    activation:
      trigger: "macro_snapshot, sector_flow, quant_feed 중 2개 이상 갱신되었거나 주간 점검일에 도달했을 때"
      priority: "current_holdings_analysis_report_template 다음, buy/sell 예시 이전"
      note: "미시·거시·흐름 중 하나라도 빠지면 시나리오 결론을 내리지 않고 '보류'로 적는다."
    micro_panel:
      columns: ["종목명", "가격상태", "수급상태", "유동성상태", "실적상태", "등급", "판단"]
      required_inputs: ["Price_Status", "Flow_OK", "Flow_Rows", "AvgTradeValue_5D_M", "컨센서스 방향", "등급"]
      rule: "개별 종목은 추세·수급·유동성·실적 4축이 동시에 맞아야 A/B 판정을 허용한다."
    macro_panel:
      columns: ["지표", "최근값", "추세", "국면판정", "포트폴리오함의"]
      required_inputs: ["KOSPI", "KOSDAQ", "USD/KRW", "VIX", "미국 10년물", "미국 HY OAS", "WTI", "국내 CP/CD 스프레드"]
      rule: "거시는 위험선호/중립/위험회피의 국면판정에만 사용하고, 개별 종목의 가격대는 대체하지 않는다."
    capital_flow_panel:
      columns: ["흐름항목", "방향", "강도", "해석", "행동"]
      required_inputs: ["외국인 5D/20D", "기관 5D/20D", "sector_flow Rotation_Score", "ETF 상대강도", "현금비중", "미체결 주문"]
      rule: "전체 자금흐름은 매수 트리거가 아니라 비중조절·후행진입·리밸런싱 우선순위를 정하는 입력값이다."
    scenario_matrix:
      columns: ["시나리오", "발동조건", "확률가중", "예상국면", "우선행동", "금지행동"]
      base_probability_rule: "점수 대신 국면·흐름·가격 일치 정도로 가중만 부여하고, 정밀 확률처럼 과장하지 않는다."
      bull_extension:
        trigger: "Risk-On + VIX<18 + KOSPI 20일선 위 + 외국인/기관 20D 순매수 + sector_flow 집중"
        probability_weight: "높음"
        implication: "주도주 유지, 선행형은 소액 시범진입, 약한 보유주는 축소"
        action: "코어 유지, 위성은 주도 섹터로만 제한적으로 이동"
      rotation:
        trigger: "KOSPI 횡보 + 섹터별 상대강도 급변 + 자금이 기존 주도주에서 신규 리더로 이동"
        probability_weight: "중간"
        implication: "보유주 교체보다 자금 재배치 우선"
        action: "보유주 진단에서 교체 후보와 유지 후보 분리"
      risk_off_squeeze:
        trigger: "VIX>25 또는 KOSPI 20일·60일선 동시 하회 + 외국인/기관 20D 동반 매도"
        probability_weight: "중간~높음"
        implication: "현금 비중 확대, 신규매수 축소, 반등매도 우선"
        action: "후행형만 허용, 전술 위성 축소, 리밸런싱 우선"
      event_shock:
        trigger: "DART 리스크/금리/환율/유가 급변으로 1~3일 내 가격·수급 동시 충격"
        probability_weight: "낮음~중간"
        implication: "일시적 노이즈와 구조적 훼손을 분리"
        action: "즉시 추격매수 금지, 데이터 재확인 후 대응"
      sideways_drift:
        trigger: "가격·수급·거시가 모두 중립이고 거래대금이 축소"
        probability_weight: "중간"
        implication: "회전율 낮추고 현금·대기 비중을 높임"
        action: "보유주 유지/관찰 중심, 신규진입 보류"
    output_rule:
      - "미시·거시·자금흐름·시나리오를 한 표 안에 함께 보여준다."
      - "시나리오 결론은 우선행동과 금지행동을 동시에 써야 한다."
      - "확률은 정밀 예측이 아니라 상대적 가중으로만 표기한다."
    prohibition:
      - "거시만 보고 종목 매수/매도 결론을 내리지 않는다"
      - "자금흐름만 보고 추격매수 결론을 내리지 않는다"
      - "시나리오를 한 가지만 고정해 다른 국면 전환 가능성을 지우지 않는다"

  engine_feedback_loop_report:
    purpose: "매일 제안값과 다음 거래일 결과를 비교해 오차 원인과 개선 제안을 누적하는 평가 섹션."
    canonical_ref: "Temp/proposal_evaluation_history.json"
    location: "QEH_AUDIT_BLOCK 직후"
    columns: ["제안일", "평가일", "종목", "제안", "검산", "제안가", "결과가", "T+1수익률%", "평가", "원인", "개선제안"]
    fill_rule:
      - "tools/update_proposal_evaluation_history.py가 생성한 proposal_evaluation_history records를 사용한다."
      - "T+1 평가 전 행은 PENDING_T1로 두고 성패를 단정하지 않는다."
      - "MISMATCHED 행은 원인을 rule/feature 수준으로 분류하고 개선 제안을 남긴다."
      - "표본이 적을 때는 임계치 변경을 제안하되 즉시 강제하지 않는다."

  prediction_evaluation_improvement_report:
    purpose: "예측 결과 평가 수치와 YAML/GS/JSON/PY 갭을 함께 보여주어 엔진 개선 우선순위를 정하는 섹션."
    canonical_ref: "Temp/proposal_evaluation_history.json, tools/measure_harness_coverage.py, tools/update_proposal_evaluation_history.py"
    location: "engine_feedback_loop_report 직후, alpha_feedback_loop_report 이전"
    columns: ["항목", "값", "의미", "갭"]
    fill_rule:
      - "proposal_evaluation_history summary와 하네스 커버리지 측정 결과를 그대로 사용한다."
      - "YAML/GS/JSON/PY 각 층의 커버리지와 갭을 숫자로 병기한다."
      - "개선 제안은 평가 기록의 improvement_proposal과 error_cause를 우선 사용한다."
      - "이 섹션은 다음날 엔진 개선과 반복오류 방지의 근거 원장이다."
      - "gap 경고가 '경고'이면 운영 검증 실패로 처리하고 주문 실행표를 차단한다."
      - "커버리지 목표는 YAML/GS/JSON/PY 각 100%이며 미달 시 원인코드를 함께 출력한다."

  core_satellite_timing_gate_table:
    purpose: "core_satellite 후보의 T+1 강제매도 위험과 매도충돌을 분리 평가하는 표."
    canonical_ref: "spec/13_formula_registry.yaml:T1_FORCED_SELL_RISK_V1"
    location: "reference_price_ledger 직후, alpha_feedback_loop_report 이전"
    columns: ["종목", "종목명", "후보등급", "실행추천상태", "타이밍", "진입점수", "청산점수", "T+1위험", "T+1상태", "매도충돌", "충돌상태", "공식근거"]
    fill_rule:
      - "core_satellite.Execution_Recommendation_State를 그대로 출력한다."
      - "BUY_PILOT_ALLOWED 이외 상태는 HTS 주문표로 승격하지 않는다."
      - "SELL_OR_TRIM_FIRST, BUY_BLOCKED_SELL_CONFLICT, BUY_BLOCKED_T1_EXIT_RISK 순으로 중요도 정렬한다."

  # ── [2026-05-20_HARNESS_V5] H6: 뒷박 차단 게이트 표 ────────────────────────
  breakout_quality_gate_table:
    purpose: "신규 BUY 후보의 뒷박(Late Chase) 차단 점수와 게이트 상태를 하네스 값으로 표시."
    canonical_ref: "spec/13_formula_registry.yaml:BREAKOUT_QUALITY_GATE_V2"
    harness_key: "breakout_quality_gate_json"
    location: "execution_quality_table 직후, order_quantity_4stage_gate 이전"
    columns:
      - "종목"
      - "종목명"
      - "뒷박점수(0~100)"
      - "게이트상태"
      - "주요차단사유"
      - "BUY허용여부"
    gate_states:
      PILOT_ALLOWED:      "BUY 허용 — 정상 진입 가능"
      WATCH_COOLING_OFF:  "대기 — 추격 리스크 있음. 신규 BUY 보류."
      BLOCKED_LATE_CHASE: "차단 — 뒷박 판정. BUY 절대 금지."
    fill_rule:
      - "breakout_quality_gate_json 하네스 값을 그대로 복사한다. LLM 재계산 금지."
      - "BLOCKED_LATE_CHASE 종목은 BUY허용여부='NO (H6 차단)' 기재 후 주문표 승격 금지."
      - "breakout_quality_gate_json 없으면 표 전체를 'DATA_MISSING — GAS 재실행 필요'로 표시."
    prohibition:
      - "breakout_quality_score를 LLM이 재계산하거나 조정 금지"
      - "BLOCKED_LATE_CHASE 상태를 서사로 완화해 BUY 허용으로 승격 금지"
      - "이 표 없이 신규 BUY 주문표 출력 금지 (BLOCKED_BREAKOUT_GATE_MISSING)"
    version: "2026-05-20_HARNESS_V5"

  # ── [2026-05-20_HARNESS_V5] H7: 가짜 매도 차단 게이트 표 ──────────────────
  anti_whipsaw_gate_table:
    purpose: "매도 후보의 가짜 매도(Whipsaw) 가능성을 하네스 값으로 표시하고 1거래일 홀드 여부 결정."
    canonical_ref: "spec/13b_harness_formulas.yaml:ANTI_WHIPSAW_HOLD_GATE_V1"
    harness_key: "anti_whipsaw_gate_json"
    location: "breakout_quality_gate_table 직후"
    columns:
      - "종목"
      - "종목명"
      - "Whipsaw점수"
      - "게이트상태"
      - "홀드일수"
      - "당일매도허용여부"
      - "주요사유"
    gate_states:
      CONFIRMED_SELL:    "매도 허용"
      INCONCLUSIVE:      "50% 매도 허용, 50% 1거래일 후 재평가"
      WHIPSAW_SUSPECTED: "당일 매도 전량 차단 — 1거래일 홀드"
    fill_rule:
      - "anti_whipsaw_gate_json 하네스 값을 그대로 복사한다. LLM 재계산 금지."
      - "WHIPSAW_SUSPECTED 종목은 당일 매도허용여부='NO (H7 WHIPSAW_SUSPECTED)' 기재."
      - "anti_whipsaw_gate_json 없으면 'DATA_MISSING — GAS 재실행 필요' 표시."
    prohibition:
      - "anti_whipsaw_score를 LLM이 재계산하거나 조정 금지"
      - "WHIPSAW_SUSPECTED 종목을 서사로 완화해 당일 전량 매도 허용 금지"
      - "이 표 없이 SELL/TRIM 주문표 출력 금지 (BLOCKED_WHIPSAW_GATE_MISSING)"
    version: "2026-05-20_HARNESS_V5"

  # ── [2026-05-20_HARNESS_V5] H8: 4경로 현금확보 결정 표 ─────────────────────
  smart_cash_raise_v2_table:
    purpose: "현금 부족 시 4경로(ROUTE_A~D) 결정론적 현금확보 라우팅 결과를 하네스 값으로 표시."
    canonical_ref: "spec/13b_harness_formulas.yaml:SMART_CASH_RAISE_V2"
    harness_key: "smart_cash_raise_json"
    location: "anti_whipsaw_gate_table 직후"
    columns:
      - "종목"
      - "종목명"
      - "확정경로"
      - "경로설명"
      - "매도수량"
      - "반등대기비율(%)"
      - "결정근거"
    route_labels:
      ROUTE_A: "위성 비중 트림 (33~50% 즉시)"
      ROUTE_B: "과매도 분할 매도 (K2 50/50)"
      ROUTE_C: "코어 익절 잠금 (익절수량만)"
      ROUTE_D: "긴급 전량매도 (인간 승인 필수)"
      NO_ACTION: "현금확보 비대상"
    fill_rule:
      - "smart_cash_raise_json 하네스 값을 그대로 복사한다. LLM 라우트 선택 금지."
      - "ROUTE_D는 emergency_full_sell=true 또는 BREACH_IMMEDIATE_EXIT 사유를 반드시 기재."
      - "smart_cash_raise_json 없으면 현금확보 매도 주문표를 BLOCKED_CASH_ROUTE_MISSING으로 처리."
    prohibition:
      - "smart_cash_raise_route를 LLM이 임의 변경 금지"
      - "ROUTE_D를 인간 승인 없이 서사로 발동 금지"
      - "이 표 없이 현금확보 매도 주문표 출력 금지"
    version: "2026-05-20_HARNESS_V5"

  rebalancing_report_template:
    purpose: "리밸런싱이 필요할 때만 출력하는 전용 보고서 양식. 목표비중·이탈폭·세후 순현금·제안순서를 한 번에 보여준다."
    activation:
      trigger: "rebalancing_trigger.threshold 또는 cash_floor.rebalancing_hard_stop 충족 시"
      priority: "제안 검토 표 다음, 통합 주문표 이전"
      note: "리밸런싱이 아니면 기본 출력 금지"
    columns: ["계좌", "종목명", "현재비중(%)", "목표비중(%)", "이탈폭(p)", "조치유형", "지정가(원)", "수량(주)", "예상순현금(원)", "세금수수료(원)", "실행순서", "검산상태"]
    trim_row: ["일반계좌", "예시종목", "15.0", "10.0", "+5.0", "축소", "24800", "60", "1488000", "12000", "중복 ETF → 약한 위성 순", "PASS"]
    buy_row:  ["ISA", "예시종목", "8.0", "10.0", "-2.0", "매수", "12500", "80", "-1000000", "8000", "현금 확보 후 분할 재배치", "PASS"]
    required_inputs:
      - "현재비중"
      - "목표비중"
      - "이탈폭"
      - "예상 세금·수수료"
      - "예상 순현금"
    prohibition:
      - "현재비중·목표비중·이탈폭 없이 리밸런싱 표 금지"
      - "세후 순현금 계산 없이 축소/매수 결정 금지"
      - "리밸런싱은 일반 매수제안 표와 혼용하지 않는다"
