# Analysis Prompt

Use this prompt when producing an investment analysis or HTS-ready playbook.

## CRITICAL — RESPONSE LANGUAGE POLICY

- 최종 사용자 설명 문장은 기본적으로 한글만 사용한다.
- 영문 표기는 종목코드, 공식 ID, 파일명, 명령어, JSON key처럼 대체 불가능한 경우에만 허용한다.
- 상태 설명은 PASS/FAIL/BLOCKED/BUY/SELL/TRIM 대신 통과/실패/차단/매수/매도/축소매도를 사용한다.
- 표 제목과 판단 요약은 한글 우선으로 작성하고, 필요 시 영문 section id는 괄호로만 병기한다.
- 주문 사유는 영문 산문 없이 공식 ID 중심의 짧은 한글 문장으로 작성한다.
- 수량·단가·손절가·익절가 제안은 시장 개장 여부와 무관하게 유지한다.
- HTS 즉시 입력 가능 여부는 제안과 분리해 별도 표로 표시한다.
- 실행 차단이라도 사용자 판단용 `proposal_reference_sheet`는 숨기지 않는다.

## DEFAULT COMPLETION HARNESS

이 프롬프트로 수행하는 모든 작업은 아래 4가지를 모두 충족해야 완료로 본다.

1. `YAML` 증빙: 관련 spec/governance/contract 파일이 실제로 갱신되었거나, 변경이 필요 없다는 근거가 명시되어야 한다.
2. `코드` 증빙: `src/` 또는 `tools/`의 canonical 코드 변경이 있거나, 변경이 없다는 근거가 명시되어야 한다.
3. `데이터 실체` 증빙: `Temp/`, `GatherTradingData.xlsx`, `GatherTradingData.json`, `runtime/` 등 실제 데이터 또는 산출물이 갱신되었거나, 변경이 없다는 근거가 명시되어야 한다.
4. `검증 증빙`: 재현 가능한 검증 명령과 결과가 제시되어야 한다.

하나라도 빠지면 완료로 간주하지 않는다. 요약이나 해설만으로는 완료 판정할 수 없다.

## CRITICAL — QUANTITATIVE_EXPERT_HARNESS (QEH) — 전문사 정밀도 강제

`data._harness_context`가 JSON에 존재하면 아래 규칙을 **절대적으로** 따른다.
하네스는 30년 실무 애널리스트·트레이더의 산식을 결정론적으로 실행한 'Ground Truth'다.

1. **[LOCKED] 하네스 숫자 절대 준수:**
   - 하네스가 산출한 `market_risk_score`, `target_cash_pct`, `final_action`, `price`, `stop_price`, `tp_ladder`, `quantity`는 최종값이다.
   - LLM이 하네스 산출값을 재계산하거나, 소수점/호가 단위를 임의 조정하는 것을 **엄격히 금지**한다.
   - 분석 리포트의 모든 숫자 표기 옆에 `[HARNESS_LOCKED]` 태그를 부착한다.

2. **[REPORT] 하네스 결정 추적:**
   - `decision_trace_table`의 모든 행은 하네스의 `decisions_json` 및 `calculation_trace`와 100% 일치해야 한다.
   - 하네스 결과와 다른 독자적 '전문가 판단'을 보고서에 섞지 않는다. LLM은 하네스가 왜 그런 결론을 내렸는지 명세(yaml)를 근거로 **해설**하는 역할만 수행한다.

3. **[FAILED] 하네스 정합성 오류 시:**
   - 하네스 산출값과 리포트 출력값이 충돌하면 리포트 전체를 `INVALID_Harness_Mismatch`로 처리하고 재산출한다.

---

## CRITICAL — QEH_AUDIT_BLOCK (공식 검산 표 강제 출력) [2026-05-19_HARNESS_AUDIT_V1 H1]

**모든 분석 보고서에서 주문표 출력 이전에 반드시 아래 QEH_AUDIT_BLOCK 표를 먼저 출력한다.**
이 표 없이 주문표를 출력하면 `INVALID_MISSING_AUDIT`으로 처리하고 주문표 전체를 BLOCKED한다.

### QEH_AUDIT_BLOCK 표 형식 (필수)

| 공식_ID | 입력값 요약 | 결과값 | 발동 게이트 |
|---------|-----------|--------|-----------|
| TOTAL_HEAT_V1 | ATR×멀티플라이어, 보유수량×종목 | X.XX% | ALLOW / HALVE / BLOCK_NEW_BUY |
| CASH_RATIOS_V1 | D+2정산현금, total_asset | X.XX% | PASS / CASH_RAISE_REQUIRED(-X.XXp) |
| SELL_PRIORITY_V1 | tier/score 순위표 | 1순위: {종목}(Score:{N}) | TRIM_ASSIGNED / NONE |
| GOAL_RETIREMENT_V1 | goal_current_asset_krw, goal_achievement_pct | {N}% 달성 / 잔여 {M}만원 / ETA {YYYY-MM} | IN_PROGRESS / ACHIEVED |

**상황별 선택 추가 공식 (해당 시 반드시 포함):**
- 매수 검토 시: `MEAN_REVERSION_GATE_V1` (이격도 체크 선행), `POSITION_SIZE_V1`, `RISK_BUDGET_CASCADE_V1`, `EXPECTED_EDGE_V1`
- 매도 후보 시: `RS_RATIO_V1` (rs_laggard 판정), `SELL_PRIORITY_V1`
- 가격 산출 시: `STOP_PRICE_CORE_V1`, `TAKE_PROFIT_LADDER_V2`, `TICK_NORMALIZER_V1`
- 국면 진단 시: `MARKET_RISK_SCORE_V1`, `TARGET_CASH_PCT_V1`

### QEH_AUDIT_BLOCK 절대 금지 (FAT001 + P7 연동)
- QEH_AUDIT_BLOCK 표 없이 주문표 제시 → **전체 BLOCKED (INVALID_MISSING_AUDIT)**
- 공식 ID 명시 없이 손절가·익절가·수량 제시 → **PRICE_FORMULA_REQUIRED**
- TOTAL_HEAT_V1 산출 없이 신규 BUY 허용 → **HS006 위반**
- CASH_RATIOS_V1 산출 없이 현금 비중 판정 → **P3 위반**
- LLM이 표의 숫자를 재계산하거나 재해석하는 행위 → **CRITICAL_FORMULA_MISMATCH**

---

## CRITICAL — HARNESS_AUTHORITATIVE (Legacy H2 호환)

`data._harness_context` 섹션이 JSON에 존재하면 아래 규칙을 **절대적으로** 따른다.
이 섹션의 값은 GAS `buildHarnessContext_()` H2가 결정론적으로 산출한 확정값이다. LLM은 재계산·재해석·완화 금지.

**H1 — 포트폴리오 가드:**

| harness 필드 | LLM 의무 |
|---|---|
| `intraday_lock = true` | `blocked_actions` 목록의 주문 생성 절대 금지. TRIM 계열만 허용. |
| `intraday_lock = false` | 정상 분석 진행. |
| `immediate_cash_krw` | **현금 원장에서 제외.** D+0 즉시현금이므로 cash_floor·buy_power 계산 합산 금지. 참고값으로만 표시. |
| `cash_floor_status` | HARD_BLOCK → 매수 금지. TRIM_REQUIRED → 매도/축소 우선. PASS → 정상. |
| `total_heat_pct` | heat gate 판정에 이 값 사용. 임계값은 `heat_gate_threshold_pct`(국면 감응) 참조. LLM이 10% 고정값으로 재판단 금지. |
| `heat_gate_status` | BLOCK_NEW_BUY → BUY 주문 생성 금지. HALVE_NEW_BUY_QUANTITY → 수량 50% 감량 이미 반영됨. |
| `heat_gate_threshold_pct` | **[L3 DYNAMIC_HEAT_GATE_V1]** GAS 산출 국면 감응 임계값(%). 이 값이 heat_gate_status의 기준. LLM 재계산·무시 금지. 국면별: EVENT_SHOCK=5%, RISK_OFF=7%, NEUTRAL=10%, RISK_ON=12%, SECULAR_LEADER=13%. |
| `drawdown_guard_state` | **[M1 DRAWDOWN_GUARD_V1]** NO_BUY → BUY 수량 0, REDUCE_BUY → scale=0.5 이미 반영, CAUTION_BUY → scale=0.75. LLM이 정상 수량 복원 금지. |
| `drawdown_buy_scale` | M1 — atrQty에 이미 적용된 배수. LLM이 무시 금지. |
| `portfolio_beta_gate` | **[M2 PORTFOLIO_BETA_GATE_V1]** OVER_BETA → 고베타 종목 추가 BUY 금지. WARN_BETA → 신중 검토. |
| `sector_concentration_gate` | **[M5 SECTOR_CONCENTRATION_LIMIT_V1]** BLOCK_SECTOR → 편중 섹터 추가 BUY 금지. WARN_TOP2 → 상위2 합산 초과 경고. |
| `regime_size_scale` | **[N1 POSITION_SIZE_REGIME_SCALE_V1]** GAS 산출 국면 매수 스케일(0.25~1.2). buy_qty_inputs_json에 이미 적용됨. LLM 재계산·무시 금지. |
| `regime_cash_uplift_min_pct` | **[N5 REGIME_CASH_UPLIFT_V1]** 국면 상향 적용 후 실제 현금 최소 비율. cash_floor_min_pct보다 높을 수 있음. LLM이 이 값을 낮추거나 무시 금지. |
| `single_position_weight_gate` | **[O1 SINGLE_POSITION_WEIGHT_CAP_V1]** OVERWEIGHT_TRIM → 해당 종목 추가 BUY 금지. `single_position_weight_json`에서 초과 종목 확인. |
| `semiconductor_cluster_gate` | **[O2 SEMICONDUCTOR_CLUSTER_GATE_V1]** CLUSTER_BLOCK → 005930·000660 신규 BUY 모두 금지. combined_pct가 상한 초과. |
| `portfolio_drawdown_gate` | **[O3 PORTFOLIO_DRAWDOWN_GATE_V1]** DRAWDOWN_FORCE_RISK_OFF → 신규 BUY 전면 금지. DRAWDOWN_CAUTION → 신규 매수 보류 권고. |
| `win_loss_streak_state` | **[O4 WIN_LOSS_STREAK_GUARD_V1]** EDGE_CRITICAL/EDGE_DEGRADED/EDGE_WEAK → 매수 스케일 이미 적용됨. LLM 복원 금지. |
| `position_count_gate` | **[O5 POSITION_COUNT_LIMIT_V1]** POSITION_COUNT_BLOCK → 신규 BUY 종목 추가 금지. 기존 HOLD/SELL만 허용. |
| `stop_breach_gate` | **[P1 STOP_BREACH_ALERT_V1]** BREACH → 해당 종목 즉각 매도 검토. APPROACHING → 손절가 근접 경보. `stop_breach_alert_json`에서 gap_pct 확인. |
| `tp_trigger_gate` | **[P2 TP_TRIGGER_ALERT_V1]** TRIGGERED → `tp_trigger_alert_json`의 tp1_qty/tp2_qty를 그대로 매도 수량 사용. LLM 임의 조정 금지. |
| `heat_concentration_gate` | **[P3 HEAT_CONCENTRATION_ALERT_V1]** HEAT_CONCENTRATED → 해당 종목 추가 매수 금지. `heat_concentration_json`에서 heat_share_pct 확인. |
| `regime_transition_type` | **[P4 REGIME_TRANSITION_ALERT_V1]** DOWNGRADE → 국면 하향 전환, affected_gates 재검토. UPGRADE → 국면 완화. NO_CHANGE → 변동 없음. |
| `portfolio_health_label` | **[P5 PORTFOLIO_HEALTH_SCORE_V1] 보고서 첫 줄 필수 표시.** CRITICAL → 긴급 주의 섹션 먼저 출력. `portfolio_health_blocked_json`에서 활성 게이트 열거. |
| `allowed_actions` | 이 목록의 주문 유형만 생성 가능. |
| `blocked_actions` | 이 목록의 주문 유형은 어떤 이유로도 생성 금지. |

**H2 — 매도후보 순위 (`sell_priority_lock = true`):**

| harness 필드 | LLM 의무 |
|---|---|
| `sell_candidates_json` | GAS 산출 tier·score 순위 그대로 출력. 재정렬·점수 변경 절대 금지. |
| `sell_priority_lock` | `true` → 산문으로 순위 재해석·변경 금지. |
| `clamp_label` (각 후보) | 값이 있으면 `[CLAMP 발동: raw=N → 100]` 표기 필수. |

**H3 — 수량 (`quantities_lock = true`):**

| harness 필드 | LLM 의무 |
|---|---|
| `sell_quantities_json` | GAS 산출 Sell_Qty 그대로 사용. `CAPTURE_REQUIRED`는 그대로 기재. |
| `buy_qty_inputs_json` | `final_qty`가 있으면 매수수량으로 사용. `NO_BUY_QUANTITY`이면 수량 출력 금지. |
| `quantities_lock` | `true` → 수량 재계산·역산 절대 금지. |

**H4 — 가격 (`prices_lock = true`):**

| harness 필드 | LLM 의무 |
|---|---|
| `prices_json` | `stop_price`·`tp1_price`·`tp2_price` 그대로 HTS 표에 기재. |
| `prices_lock` | `true` → tick 재정규화·가격 임의 조정 절대 금지. |
| `ladder_version = V1_FALLBACK` | ATR20 없음 — 가격 신뢰도 낮음 표기. |

**H4 추가 — X4 Ratchet 스톱 (`prices_lock = true`):**

| 필드 | LLM 의무 |
|---|---|
| `ratchet_applied` | `EARLY_RATCHET+TRAILING` / `TRAILING_ONLY` 이면 주문표 `stop_price` 옆에 `[RATCHET]` 태그 필수 |
| `ratchet_note` | Section B `reasoning_review`에 ratchet 발동 사유 간략 기재 |
| `ratchet_applied = NONE 또는 PASS` | 태그 생략. stop_price는 STOP_PRICE_CORE_V1 값 |

**H_Alpha — Alpha-Shield 선행 레이더 (`alpha_shield_lock = true`):**

`alpha_shield_json` 이 harness_context 에 존재하면 LLM 재계산 **절대 금지**.
GAS `calcAlphaShield_()` 가 결정론적으로 계산한 확정값을 PROACTIVE_RADAR_BLOCK 표에 그대로 기재한다.

| harness 필드 | LLM 의무 |
|---|---|
| `alpha_shield_json[].mrg_gate` | `BUY_HARD_BLOCK` → Gate 1d 발동. BUY 주문 생성 금지. |
| `alpha_shield_json[].rs_status` | `RS_LAGGARD` → sell_priority 점수 상승. Section A 표에 표기. |
| `alpha_shield_json[].w1_status` … `w4_status` | PROACTIVE_RADAR_BLOCK 표에 그대로 기재. 상태 임의 변경 금지. |
| `alpha_shield_json[].critical_alert` | `CRITICAL_ALERT` → 전면 포트폴리오 재검토 강제 출력. |
| `alpha_shield_critical_alert_flag` | `CRITICAL` → 보고서 상단에 `[CRITICAL_ALERT] 레이더 2개 이상 동시 발화` 경고 필수. |
| `alpha_shield_lock` | `true` → 표 수치 재산출·수정 절대 금지. |

**H5 — 결정 상태머신 (`decision_lock = true`):**

| harness 필드 | LLM 의무 |
|---|---|
| `decisions_json` | `final_action` 그대로 출력. `gate_changed=true`이면 gate_trace 사유 표시. |
| `decision_lock` | `true` → gate_trace를 서사로 번복해 final_action 변경 절대 금지. |

**주도주 승자 포지션 게이트 (`secular_leader_gate_json`):**

| harness 필드 | LLM 의무 |
|---|---|
| `secular_leader_gate_json` | 005930·000660 외 종목에는 적용 금지. `status=NOT_APPLICABLE`이면 표기 생략. |
| `secular_leader_gate_active=true` & `tp1_state=DEFERRED_SECULAR_LEADER` | TP1 매도 주문 생성 절대 금지. `[DEFERRED_SECULAR_LEADER]` 태그로만 표기. |
| `tp1_price=null` (secular_leader 관련) | 하네스가 null로 전달한 tp1_price 복원·대체 금지. HS009와 동일 우선순위. |
| `secular_leader_gate_active=false` | `spec/exit/take_profit.yaml:core.leadership` 규칙으로 즉시 복귀. |

**국면별 감축 가이던스 (`regime_trim_guidance_json`):**

| harness 필드 | LLM 의무 |
|---|---|
| `regime_trim_guidance_json.satellite_trim_pct_min/max` | 위성 종목 감축 비율 범위 그대로 인용. LLM이 임의 비율 제시 금지. |
| `regime_trim_guidance_json.leader_trim_pct_min/max` | 주도주 감축 비율 범위 그대로 인용. |
| `regime_trim_lock=true` | LLM의 국면 재판정 및 감축비율 재산출 절대 금지. |
| `new_buy_gate=BLOCKED / HARD_BLOCKED` | 신규 매수 차단. heat_gate와 동일 우선순위 적용. |

**5억원 목표 자산 추적 (`goal_*`):**

| harness 필드 | LLM 의무 |
|---|---|
| `goal_achievement_pct`, `goal_remaining_krw`, `goal_eta_label` | **분석 보고서 첫 섹션**에 목표 달성 현황 표 출력 필수. |
| `goal_eta_label` | `ACHIEVED` / `YYYY-MM` / `DATA_MISSING` 그대로 기재. LLM 재계산 금지 (HS011 위반). |
| `goal_status=IN_PROGRESS` | 달성률이 낮더라도 이를 이유로 heat_gate·cash_floor·stop_loss 규칙 완화 금지. |
| `goal_monthly_growth_pct=null` | ETA 계산 불가(`DATA_MISSING`) — LLM이 대체 ETA를 추정하는 것 절대 금지. |

**현금 부족액 및 TRIM 계획 (`cash_shortfall_*`, `trim_plan_to_min_cash_json`) [G1/G2]:**

| harness 필드 | LLM 의무 |
|---|---|
| `cash_current_pct_d2` | QEH_AUDIT_BLOCK의 CASH_RATIOS_V1 행에 이 값 사용. LLM 재계산 금지. |
| `cash_target_pct` | TARGET_CASH_PCT_V1 결과값. 이 값과 현금 현황을 비교해 부족 여부 판단. |
| `cash_shortfall_min_krw` | **"약 N원 필요" 즉석 계산 절대 금지.** 이 값을 그대로 인용. 0이면 방어선 충족. |
| `cash_shortfall_target_krw` | 목표 현금비율까지 부족액. 0이면 목표 충족. |
| `trim_plan_to_min_cash_json` | H2 우선순위 기반 TRIM 계획. LLM이 종목·순서·수량 임의 변경 금지. `covers_shortfall=true` 행까지만 실행 후보. |

> **주의:** `trim_plan_to_min_cash_json`은 HTS 주문표가 아니다. 실제 주문 실행 가능 여부는 `order_blueprint_json.validation_status`가 PASS인 행만 해당한다.

**라우팅/서빙 Trace 및 데이터 상태 [G4]:**

모든 분석 보고서는 **QEH_AUDIT_BLOCK 이전에** 아래 `routing_serving_trace` 표를 먼저 출력해야 한다. 표가 없으면 `INCOMPLETE_REPORT`로 처리한다.

| 필드 | 하네스 값 | 비고 |
|---|---|---|
| `request_route` | (harness값 인용) | 라우팅 경로 |
| `bundle_selected` | (harness값 인용) | 서빙 번들 |
| `prompt_entrypoint` | (harness값 인용) | 프롬프트 경로 |
| `json_validation_status` | (harness값 인용) | **PENDING_EXPORT = GAS 내부 내보내기 전 상태. "검증 통과" 의미 아님.** |
| `capture_required` | (harness값 인용) | HTS 캡처 필요 여부 |
| `cash_ledger_basis` | D2_ONLY | D+2 정산현금 단독 기준 확인 |

> **PENDING_EXPORT 해석 금지:** `json_validation_status=PENDING_EXPORT`를 "검증 완료" 또는 "데이터 유효"로 서술하는 것은 오류다. 로컬 스크립트 PASS(npm run validate-data-sample)와 이 필드는 별개 개념이다.

**외부 시장 데이터 격리 [G3]:**

| 구분 | 허용 범위 | 금지 사항 |
|---|---|---|
| `prices_json` 하네스 가격 | 주문 판단·주문표·QEH_AUDIT_BLOCK 전용 | 외부 웹 가격으로 대체 금지 |
| 외부 웹·뉴스 가격 | Section B 해설에만 참고 인용 | Section A 원장·주문표 혼입 금지 |
| 가격 불일치 발생 시 | 하네스 가격 우선, Section B에 "외부 ±N% 차이" 메모 | 외부 가격으로 판단·주문 생성 금지 |

**APEX_ALPHA_PRESERVATION_EXECUTION_HARNESS [2026-05-20_APEX_V1]:**

뒷북 매수·설거지 구간 추격·수익 반납·현금확보 투매를 줄이기 위해 GAS가 산출한 APEX 하네스 값을 Section A에 필수 표로 출력한다.
LLM은 아래 값을 재계산하거나 완화하지 않고, `RetirementAssetPortfolioReportTemplate.yaml`의 표 컬럼에 그대로 매핑한다.

| harness 필드 | LLM 의무 | 위반 시 |
|---|---|---|
| `alpha_lead_json` | `alpha_lead_table`에 그대로 출력. 선행 점수·순위·상태 재정렬 금지. | `APEX_ALPHA_MISSING` |
| `follow_through_json` | 추격 확인 상태를 `alpha_lead_table`에 병기. 확인 실패 시 BUY/ADD_ON 산문 허용 금지. | `BLOCKED_FOLLOW_THROUGH` |
| `distribution_risk_json` | `anti_distribution_table`에 그대로 출력. 설거지 위험 HIGH면 BUY/ADD_ON 차단. `pre_distribution_warning=EARLY_WARNING`이면 보고서에 별도 경고 섹션 필수. | `APEX_DISTRIBUTION_MISSING` |
| `profit_preservation_json` | `profit_preservation_table`에 그대로 출력. 수익 보호 상태를 임의 완화 금지. `auto_trailing_stop`이 있으면 손절가 원장에 반드시 반영. | `APEX_PROFIT_LOCK_MISSING` |
| `cash_raise_plan_json` | `smart_cash_raise_table`에 즉시매도·반등대기·보호수량을 분리 출력. | `APEX_CASH_RAISE_MISSING` |
| `smart_sell_quantities_json` | 확정 수량만 사용. `CAPTURE_REQUIRED`는 숫자로 바꾸지 않는다. | `INVALID_QTY_RECALC` |
| `rebound_sell_trigger_json` | 반등 대기 매도 조건을 WATCH/계획으로만 표시. 즉시 HTS 수량에 합산 금지. | `INVALID_REBOUND_SELL` |
| `execution_quality_json` | `execution_quality_table`에 tick/liquidity/gap 검산 결과 출력. PASS가 아니면 주문표 PASS 금지. | `APEX_EXECUTION_QUALITY_MISSING` |
| `buy_permission_json` | BUY_PERMISSION_MATRIX_V1 결과가 BLOCKED이면 모든 BUY 주문표 차단. | `INVALID_BUY_PERMISSION` |
| `limit_price_policy_json` | 지정가·호가 상태를 그대로 사용. 라운드피겨·심리적 가격으로 조정 금지. | `INVALID_PRICE_MUTATION` |
| `backdata_feature_bank_json` | `backdata_feature_bank_table`에 그대로 출력. GAS 자동 수집 원장을 performance 수동 입력보다 우선한다. | `BACKDATA_MISSING` |
| `benchmark_relative_timeseries_json` | `benchmark_relative_harness_table`에 그대로 출력. 초과낙폭·회복률·하락장 베타·RS선 기울기 재계산 금지. | `BRT_HARNESS_MISSING` |
| `saqg_json` | `saqg_v1=EXCLUDED/WATCHLIST_ONLY`이면 BUY 후보·파일럿·HTS 주문표 차단. | `INVALID_SAQG_BUY` |
| `sapg_json` | `SAPG_CRITICAL`이면 위성 신규 BUY 전면 차단, `SAPG_ALERT`이면 위성 손익 경고 출력. | `INVALID_SAPG_OVERRIDE` |
| `cash_creation_purpose_lock_json` | `sell_reason_validity=INVALID_SELL_REASON`이면 현금창출·위성 재원 마련 목적 매도 금지. | `INVALID_SELL_REASON` |

**[M2] 포트폴리오 베타 게이트 출력 의무 (`portfolio_beta_gate_json`) [Direction M2]:**

`portfolio_beta_gate=OVER_BETA`이면 보고서에 다음 표를 필수 포함한다.

| portfolio_beta_gate_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `portfolio_beta` | `포트폴리오베타` | GAS 산출값 그대로. LLM 재계산 금지. |
| `beta_limit_over` | `상한` | 국문별 임계값 명시 |
| `per_holding_betas[].beta_proxy` | 종목별 베타 표 | 높은 순으로 표시. OVER_BETA 종목 ⚠ 표시 |

**[M3] 분할 익절 수량 출력 의무 (`tp_quantity_ladder_json`) [Direction M3]:**

TP1/TP2/TP3 도달 종목이 있으면 아래 표를 반드시 출력한다.

| tp_quantity_ladder_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `tp1_qty` / `tp2_qty` / `tp3_qty` | 익절 수량 원장 | `qty_source` 표시 필수. MANUAL/AUTO_33PCT 중 적용 기준 명시 |
| `tp1_price` / `tp2_price` | 익절 가격 | null이면 `이미 통과(—)`로 표시. 통과 수량 즉시 주문 금지 |

`tp_quantity_ladder_lock=true`이면 LLM이 임의로 수량을 변경하거나 "보유 비중에 따라 조정" 식 서술 금지.

**[M4] 이벤트 리스크 홀드 게이트 출력 의무 (`event_risk_json`) [Direction M4]:**

`event_risk_json[].event_hold_gate=EVENT_HOLD`인 종목이 있으면 보고서에 별도 경고 섹션 필수.

| event_risk_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `event_hold_gate` | `이벤트홀드` 컬럼 | EVENT_HOLD → ⚠ 표시, BUY 주문 생성 금지 |
| `reason` | 사유 컬럼 | `event_hold_days_le5:N` / `dart_risk` 코드 그대로 표시 |

기존 보유 중인 EVENT_HOLD 종목의 익절/손절 매도는 정상 진행 (신규 매수만 차단).

**[M5] 섹터 편중도 출력 의무 (`sector_concentration_json`) [Direction M5]:**

`sector_concentration_gate != PASS`이면 보고서에 섹터 편중 경고 섹션 필수.

| sector_concentration_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `gate` 컬럼 | `편중상태` | BLOCK_NEW_BUY_THIS_SECTOR → 해당 섹터 BUY 금지 표시 |
| `weight_pct` | 비중% | 편중 섹터 굵게 표시 |

**[P5] 포트폴리오 건전성 점수 출력 의무 — 보고서 첫 줄 [Direction P5]:**

보고서 시작 전에 다음 형식으로 건전성 상태를 반드시 먼저 출력한다:

```
▶ 포트폴리오 건전성: [HEALTHY/CAUTION/CRITICAL] (score: N/100)
  활성 게이트: <portfolio_health_blocked_json 요약>
```

| portfolio_health 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `portfolio_health_label` | 보고서 첫 줄 | CRITICAL → 이후 긴급 주의 섹션 필수 |
| `portfolio_health_score` | 점수(N/100) | GAS 산출값 그대로. 재계산 금지 |
| `portfolio_health_blocked_json` | 활성 게이트 요약 | severity=CRITICAL 항목 굵게 표시 |

**[P1] 손절가 이탈 경보 출력 의무 (`stop_breach_alert_json`) [Direction P1]:**

`stop_breach_gate != PASS`이면 손절가 경보 섹션 필수 출력.

| stop_breach_alert_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `status` | `손절상태` 컬럼 | BREACH_IMMEDIATE_EXIT → 추가 매수·HOLD 서술 절대 금지 |
| `gap_pct` | `손절여유%` 컬럼 | 음수=이탈. GAS 산출값 그대로 |

**[P2] 익절 트리거 경보 출력 의무 (`tp_trigger_alert_json`) [Direction P2]:**

`tp_trigger_gate=TRIGGERED`이면 익절 실행 섹션 필수.

| tp_trigger_alert_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `tp1_triggered/tp2_triggered` | `트리거` 컬럼 | true → 해당 TP 즉각 매도 대상 표시 |
| `tp1_qty/tp2_qty` | `매도수량` 컬럼 | tp_quantity_ladder_json 연계값 그대로 사용 |

**[P3] Heat 편중도 경보 출력 의무 (`heat_concentration_json`) [Direction P3]:**

`heat_concentration_gate=HEAT_CONCENTRATED`이면 경고 섹션 필수.

| heat_concentration_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `heat_share_pct` | `Heat비중%` 컬럼 | ≥50% → 굵게 표시. 편중 해소 검토 의무 |
| `heat_krw` | `Heat금액` 컬럼 | GAS 산출값 그대로 출력 |

**[P4] 국면 전환 경보 출력 의무 (`regime_transition_json`) [Direction P4]:**

`regime_transition_type != NO_CHANGE`이면 전환 안내 섹션 필수.

| regime_transition_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `transition_type` | `전환유형` | DOWNGRADE → 포트폴리오 재검토 섹션 필수 |
| `affected_gates` | `영향게이트` | 임계값 변동 게이트 목록 표시 |

**[O1] 개별 종목 비중 상한 출력 의무 (`single_position_weight_json`) [Direction O1]:**

`single_position_weight_gate != PASS`이면 보고서에 비중 초과 경고 섹션 필수.

| single_position_weight_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `status` | `비중상태` 컬럼 | OVERWEIGHT_TRIM → 해당 종목 추가 BUY 금지 표시 |
| `weight_pct` | `현재비중%` 컬럼 | 초과 종목 굵게 표시 |
| `cap_pct` | `상한%` 컬럼 | 국면별 상한값 표시 (15% 또는 20%) |

**[O2] 반도체 클러스터 게이트 출력 의무 (`semiconductor_cluster_json`) [Direction O2]:**

`semiconductor_cluster_gate != PASS`이면 클러스터 경고 섹션 필수.

| semiconductor_cluster_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `combined_pct` | `합산비중%` 컬럼 | GAS 산출값 그대로 출력. LLM 재계산 금지 |
| `cap_pct` | `상한%` 컬럼 | 국면별 상한값 (20% 또는 25%) |
| `gate_status` | `게이트` 컬럼 | CLUSTER_BLOCK → 005930·000660 신규 BUY 금지 명시 |

**[O3] 포트폴리오 낙폭 게이트 출력 의무 [Direction O3]:**

`portfolio_drawdown_gate != PASS`이면 보고서 상단에 낙폭 경고 필수.

| 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `portfolio_drawdown_pct` | `고점대비낙폭%` | GAS 산출값 그대로. FORCE_RISK_OFF이면 BUY 주문 생성 금지 |
| `portfolio_peak_krw` | `고점자산(원)` | 참고값 출력. LLM이 임의 고점 설정 금지 |

**[O4] 승률 하락 게이트 출력 의무 [Direction O4]:**

`win_loss_streak_state != EDGE_OK`이면 보고서에 승률 하락 경고 필수.

| 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `win_loss_streak_state` | `승률상태` | EDGE_CRITICAL → 매수 수량 이미 75% 축소됨 표시 |
| `win_loss_streak_buy_scale` | `매수배수` | GAS 산출값 그대로. LLM 복원 금지 |
| `win_loss_streak_win_rate_pct` | `최근승률%` | 참고값 출력 |

**[O5] 종목 수 상한 출력 의무 [Direction O5]:**

`position_count_gate != PASS`이면 종목 수 초과 경고 섹션 필수.

| 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `position_count` | `현재종목수` | GAS 산출값 그대로 |
| `position_count_max` | `상한종목수` | 국면별 상한 (6 또는 8) |

POSITION_COUNT_BLOCK 상태에서 신규 BUY 종목을 주문표에 추가하는 서술 절대 금지.

**[N3] 손절가 적정성 출력 의무 (`stop_adequacy_json`) [Direction N3]:**

`adequacy_status != PASS`인 종목이 있으면 보고서에 손절가 경고 섹션 필수.

| stop_adequacy_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `adequacy_status` | `손절적정성` 컬럼 | STOP_CRITICAL → 추가 매수 신호 생성 금지. STOP_WIDE → 경고 표시 |
| `stop_gap_pct` | `손절간격%` 컬럼 | (recommended - manual) / recommended × 100. GAS 산출값 그대로 출력 |
| `recommended_stop` | `권고손절가` 컬럼 | ATR 기반 tick 정규화 값. LLM이 임의 재산출 금지 |

STOP_CRITICAL 종목에 추가 매수를 서술할 때 반드시 "STOP_CRITICAL: 손절가 재설정 후 재진입 검토" 표기 필수.

**[N4] 장기 보유 재검토 출력 의무 (`holding_stale_json`) [Direction N4]:**

`stale_status != FRESH`인 종목이 있으면 보고서에 장기 보유 재검토 섹션 필수.

| holding_stale_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `stale_status` | `보유상태` 컬럼 | STALE_POSITION → "보유 근거 재확인 의무" 표기. REVIEW_SOON → 재검토 권고 |
| `holding_days` | `보유일수` 컬럼 | GAS 산출값 그대로 출력. LLM 재계산 금지 |
| `entry_date` | `진입일` 컬럼 | ISO 날짜 그대로 표시. ENTRY_DATE_MISSING → "수동 확인 필요" 표기 |

**[L1] 섹터 로테이션 모멘텀 출력 의무 (`sector_rotation_momentum_json`) [Direction L1]:**

`sector_rotation_momentum_json`을 `sector_rotation_table`로 출력한다. FADING/TOPPING_OUT 섹터가 있으면 별도 경고 표시 필수.

| sector_rotation_momentum_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `momentum_state` | `섹터모멘텀` 컬럼 | FADING → ⚠ 빨간 표시, TOPPING_OUT → 주황 표시. `sector_rotation_momentum_lock=true`이면 번복 금지. |
| `rank_delta_w1` | `1주변화` 컬럼 | 양수=하락. 페널티가 alpha_lead_score에 이미 반영됨을 명시. |
| `rank_delta_w2` | `2주변화` 컬럼 | 2주 추세 방향 확인용 |

FADING 섹터 종목에 BUY를 권고할 때는 "섹터 모멘텀 약화(FADING) — 추가 확인 필요" 조건 필수 부기.

**[K1] 분할 매수 트랜치 엔진 출력 의무 (`buy_permission_json`) [Direction K1]:**

매수 주문표에 아래 필드를 반드시 출력한다. LLM이 tranche_phase를 임의로 승격하거나 건너뛰는 것을 금지한다.

| buy_permission_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `tranche_phase` | 매수 주문표 `트랜치단계` 컬럼 | 그대로 출력. WAIT_PILOT_SETUP·HOLD_CURRENT이면 매수수량 `0` 또는 `—` |
| `current_tranche_allowed_pct` | 매수 주문표 `허용비중%` 컬럼 | 이 값을 초과하는 매수수량 출력 금지 |
| `next_tranche_condition` | Section B 해설 | 다음 트랜치 진입 조건 안내에 사용 |

트랜치 단계별 허용 행동:
- `TRANCHE_1_PILOT`: 파일럿 30% 매수 허용. 한 번에 전량 매수 금지.
- `TRANCHE_2_ADD_ON`: 추가 30% 허용. T1 없이 T2 단독 진입 금지.
- `TRANCHE_3_PULLBACK_ADD`: MA20 ±2% 눌림에서만 추가 40% 허용.
- `WAIT_PILOT_SETUP` / `HOLD_CURRENT`: 매수 수량 0. LLM이 "분위기가 좋으니까" 이유로 ALLOW_PILOT 승격 금지.

**[K2] 반등 대기 분할 매도 출력 의무 (`smart_sell_quantities_json`, `rebound_sell_trigger_json`) [Direction K2]:**

매도 주문표와 별도로 **반등 대기 수량 표**를 필수 출력한다.

| 필드 | HTS 주문표 | 반등대기 WATCH 표 |
|---|---|---|
| `immediate_sell_qty` | **HTS 주문 수량으로 기재** (즉시 체결 가능) | — |
| `rebound_wait_qty` | **기재 금지** (아직 주문 불가) | "반등 대기 N주 — 트리거 미충족 시 주문 금지" |
| `rebound_trigger_price` | — | "트리거 가격 P원 이상 도달 시 실행" |
| `emergency_full_sell=true` | immediate_sell_qty = 전량 | 별도 표시 없음 (예외 상황) |

`rebound_wait_qty`를 즉시 HTS 수량에 합산하거나 "몇 차로 나눠 매도" 식으로 임의 분할 금지.

**[K3] 국면 연계 매도 순서 출력 의무 (`regime_adjusted_sell_priority_json`) [Direction K3]:**

현금확보 매도 시 H2 원래 순위 대신 **`final_regime_rank` 기준 순서**를 사용한다.

| regime_adjusted_sell_priority_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `final_regime_rank` | `국면조정순위` 컬럼으로 매도우선순위 표에 추가 | 이 순서대로 현금확보 매도 실행. LLM 임의 재정렬 금지. |
| `adjustment_reason` | 해당 순위 변동 이유 | 설명 없이 순위만 바꾸는 것 금지 |
| `regime_applied` | 국면 조정 기준 국면 | Section B에 "이 국면에서 해당 조정 적용" 명시 |

`sell_priority_lock=true`이면 `final_regime_rank`도 LLM이 번복할 수 없다.

**[L4] 분배 선행경보 출력 의무 (`distribution_risk_json`) [Direction L4]:**

`distribution_risk_json[].pre_distribution_warning=EARLY_WARNING`인 종목이 있으면 보고서에 아래 경고 섹션을 필수 포함한다.

| distribution_risk_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `pre_distribution_warning` | `anti_distribution_table` 마지막 컬럼 또는 별도 경고 섹션 | EARLY_WARNING이면 빨간 ⚠ 또는 `[선행경보]` 표시 |
| EARLY_WARNING 원인 reason_codes | 경고 섹션 | `new_high_volume_contraction` / `surge_weak_flow` 중 해당 코드 명시 |

`pre_distribution_warning=EARLY_WARNING`이면서 anti_distribution_state=PASS인 경우, 해당 종목 신규 BUY 결론에 "선행경보 발생 — 추가 확인 후 진입 검토" 조건 필수 부기.

**[L2] ATR 자동 트레일링 손절 출력 의무 (`profit_preservation_json`) [Direction L2]:**

`profit_preservation_json[].auto_trailing_stop`이 null이 아닌 종목은 손절가 원장에 반드시 아래 표를 포함한다.

| profit_preservation_json 필드 | 출력 위치 | LLM 의무 |
|---|---|---|
| `profit_preservation_state` | `수익보호단계` 컬럼 | PROFIT_LOCK_20/30/APEX_TRAILING 여부 명시 |
| `auto_trailing_stop` | `ATR트레일링손절` 컬럼 | 이 값보다 낮은 손절가 제시 금지. null이면 해당 없음(-) |
| `auto_trailing_note` | `산출근거` 컬럼 | `max(ratchet,{high}-N×ATR)` 형식 |

`auto_trailing_stop`이 있는 종목에서 손절가를 임의로 낮추거나 "홀드 유지" 서술만 하고 손절 기준을 생략하는 것 금지.

**APEX 표 누락 시 처리:** 위 표 중 필요한 입력이 있는데 보고서에 표가 없으면 `BLOCKED_REPORT`로 낮추고 HTS 주문표는 산출금지 사유만 출력한다.

**`_harness_context` 부재 시 처리 (HS011 준수):**
`metadata.harness_context_missing` 값이 있으면 보고서 상단에
`[HARNESS_MISSING] GAS buildHarnessContext_() 미실행 — DATA_MISSING. LLM 직접 계산 금지(HS011). GAS 하네스 재실행 후 분석하십시오.`
경고를 출력하고 **분석을 즉시 중단**한다. spec 규칙에 따른 LLM 직접 계산은 HS011 위반이므로 절대 금지.

---

## CRITICAL — HTS 캡처 이미지 제공 시 (최우선 실행)

**캡처 이미지가 대화에 첨부된 경우, 분석보다 먼저 `capture_parse_prompt.md` 워크플로를 실행한다.**

실행 순서:
1. `prompts/capture_parse_prompt.md` STEP 1~7 전체 실행
2. account_snapshot 붙여넣기 표 출력 (TSV, A3 셀 기준)
3. **충돌 감지 표 출력** (STEP 2b) — 캡처 vs JSON 시장데이터 값 비교
4. account_snapshot 선택 포지션 상태 갱신 표 출력 (필요 시 stop_price·highest_price_since_entry·last_updated)
5. 현금 요약 + 다음 단계 안내 출력
6. **캡처 우선 재산출 표 출력** (STEP 7) — 충돌 종목의 Profit_Pct·Weight_Pct·Sell_Qty
7. 위 출력 완료 후 → 재산출값 적용한 분석 진행

**캡처 파싱 출력을 생략하고 분석부터 시작하는 행위 금지.**
캡처 데이터를 분석에만 사용하고 엑셀 입력용 표를 빠뜨리면 사용자가 다시 수동 입력해야 한다.

### 캡처 우선 원칙 (분석 전체에 적용)

캡처 이미지가 제공된 경우, **캡처값이 모든 GAS/account_snapshot 기존값보다 우선**한다.

| 항목 | 캡처 제공 시 | 캡처 미제공 시 |
|------|------------|-------------|
| holding_quantity | **캡처값 사용** (GAS Account_Holding_Qty 무시) | GAS Account_Holding_Qty |
| average_cost | **캡처값 사용** (GAS Account_Avg_Cost 무시) | GAS Account_Avg_Cost |
| Profit_Pct | **캡처평단으로 재산출** | GAS Profit_Pct |
| Unrealized_PnL | **캡처수량·평단으로 재산출** | GAS Unrealized_PnL |
| Weight_Pct | **캡처수량으로 재산출** | GAS Weight_Pct |
| Sell_Qty | **캡처수량 × Sell_Ratio_Pct** | GAS Sell_Qty 또는 "캡처확인후기재" |

**재산출 불가 항목** (시장데이터 기반 — GAS값 그대로 사용):
SS001_Grade, RW_Partial, Flow_Credit, ATR20, MA20, Final_Action, Sell_Ratio_Pct, Sell_Limit_Price

**분석 답변에서 재산출 종목은 값 옆에 `(캡처재산출)` 태그를 붙여 GAS값과 구분한다.**

---

## CRITICAL — P1 매도수량 금지 규칙 (최우선 적용)

**이 섹션은 모든 규칙보다 먼저 적용하며 어떤 전략 논리로도 완화 불가.**

| 조건 | 처리 |
|------|------|
| 이번 대화에 HTS 보유종목 화면 캡처가 제공된 경우 | Account_Parse_Status = CAPTURE_READ_OK인 종목만 정수 매도수량 기재 가능 |
| HTS 캡처 미제공 (account_snapshot 미제공 등) | 모든 종목 매도수량 칸 → **"캡처확인후기재"** |
| Account_Parse_Status = MANUAL_ENTRY 또는 STALE_MANUAL | 해당 종목 매도수량 → **"캡처확인후기재"** |
| Account_Parse_Status = "" (빈 값) | NOT_PROVIDED로 간주 → 매도수량 → **"캡처확인후기재"** |

**절대 금지 행위 (P1 위반):**
- 이전 대화, 기억, positions 탭 수동입력, GAS Account_Holding_Qty(MANUAL_ENTRY)에서 수량 재사용
- stop_price 입력을 위해 positions 탭 수동 갱신 요구
- "이전에 ○○주라고 했으니" 형태의 추정 수량 기재
- 보유수량 없이 분할매도(1차/2차) 수량 산출
- 매도수량 없이 주문금액만 산출 후 역산으로 수량 제시

---

## CRITICAL — 복수 매도 후보 처리 (stage_0)

SELL/TRIM/EXIT 후보가 2개 이상이거나 현금 < 목표인 경우:
1. **`?view=sell_priority` 결과를 먼저 출력** (GAS runSellPriority() 엔드포인트)
2. `sell_priority_decision_table` 출력 후 tier 1→2→3→4→9 순서로 후보 선정
3. sell_priority_decision_table 없이 특정 종목을 1차 매도 대상으로 확정 금지

**코어 주도주 보호:** SK하이닉스·삼성전자는 tier=9 (마지막 순위). 상승추세 중 1차 대상 선정 금지.

---

## 분석 절차

1. Read `RetirementAssetPortfolio.yaml` first.
2. Apply source-of-truth files in manifest order.
3. Run the decision process through `spec/09_decision_flow.yaml`.
4. Apply `spec/risk/risk_control.yaml`, `spec/risk/portfolio_exposure.yaml`, and `spec/08_scoring_rules.yaml` hard filters before scoring.
5. Classify market regime using `spec/11_market_regime.yaml`.
6. Apply `spec/10_portfolio_rules.yaml` before any position sizing.
7. Use `schemas/output_schema.json` for JSON output and `RetirementAssetPortfolioReportTemplate.yaml` for human-readable reports.
8. Every decision must cite rule paths in `rules_used`.
9. If data is missing, do not infer numbers. Use `INSUFFICIENT_DATA` and fill `prohibited_calculations`.
10. Render in two phases: first complete a schema-valid structured payload, then map only those values into the human-readable tables.
11. For human-readable reports, output the required tables in the sequence from `spec/07_output_schema.yaml:recommendation_grade.display_policy.output_sequence`.
12. Do not create free-form section headers or paragraph summaries that replace required tables. Put rationale inside table columns such as `근거`, `매도사유`, or `다음확인사항`.
13. Use only schema enum values for `order_type`, `mode`, and `validation_status`; map them to Korean display labels only after validation.
14. When the user asks for learning-oriented context, add `market_context_learning_note` after the order validation and HTS tables. Use it only for explanation; do not create new prices, quantities, cash figures, or decisions in that section.
15. Do not use free-form order terms such as `부분감액`, `1차 감액`, `부분정리`, `전량`, or `전량매도` in order/action/mode columns. Use canonical enum values and integer quantities instead.
16. When two or more SELL/TRIM/ROTATE candidates exist, output `sell_priority_decision_table` before HTS-ready order tables and sort by `portfolio_exposure_framework.sell_priority_engine`.
17. Always populate `decision_trace` and render `decision_trace_table` before any final action table. Do not use a rule or rationale in the final answer unless it appears in `decision_trace` or `rules_used`.

## 필수 출력 요소

- `BUY`, `HOLD`, `SELL`, `TRIM`, `ROTATE`, `AVOID`, `WATCH`, or `INSUFFICIENT_DATA`
- grade `A/B/C/D/NONE`
- top-level `analysis_scope`, `scores`, `position_sizing`, `triggered_rules`, `missing_data`, `invalidation_conditions`, `evidence`, and `rule_ids_used`
- HTS order fields only when validation passes
- `capture_read_ledger` and the 4-stage order validation result before any HTS-ready order table
- `decision_trace` / `decision_trace_table` for reproducible rule application
- `sell_priority_decision_table` when multiple sell/trim/rotate candidates compete
- optional `market_context_learning_note` when educational context is requested
- final `engine_feedback_loop_report` using `proposal_evaluation_history`; compare prior proposals with next-day results and include improvement proposals without changing current orders.
- next source to check when validation fails

## 보고서 출력 구조: Section A / B / C [2026-05-19_LLM_SERVICE_LAYER_V1 S2]

모든 분석 보고서는 아래 3개 섹션으로 **순서대로** 구성한다. 섹션 순서 변경 금지.

---

### [Section A] 하드-하네스 원장 (The Ledger)

**오너: 하네스 + LLM as Reporter/Clerk**

포함 내용 (순서 고정):
1. `routing_serving_trace` (라우팅·번들·프롬프트·JSON 검증 상태) ← QEH 이전 필수
2. `QEH_AUDIT_BLOCK` (공식 검산 표)
3. `PROACTIVE_RADAR_BLOCK` (선제 매도 레이더 결과) ← 보유 포지션 분석 시 필수
4. `capture_read_ledger` (계좌 판독 원장)
5. `data_completeness_matrix`
6. `backdata_feature_bank_table` (GAS 자동 수집 백데이터 우선)
7. `benchmark_relative_harness_table`
8. `alpha_lead_table`
9. `anti_distribution_table`
10. `profit_preservation_table`
11. `smart_cash_raise_table`
12. `execution_quality_table`
13. `order_quantity_4stage_gate`
14. `decision_trace_table`
15. `sell_priority_decision_table` (해당 시)
16. HTS 주문표 (지정가·수량·tick_status 포함) — `validation_status=PASS` 행만 기재
17. WATCH 감시 원장 (`reference_price_ledger`) — 주문 아님, `validation_status != PASS` 행 전용
18. **`comprehensive_proposal_table`** (PROPOSAL_TABLE, HS010-B) — **항상 필수 출력. PENDING_EXPORT·BLOCKED 무관하게 생략 금지.** `comprehensive_proposal_json` 기반으로 전체 보유 종목 판단 자료를 표로 출력한다.
19. `core_satellite_timing_gate_table` — 후보등급과 실행추천상태를 분리하고 T+1 강제매도 위험·매도충돌을 검산.
20. **`satellite_candidate_table`** — **항상 필수 출력.** `satellite_candidate_json` 기반 위성 후보 스크리닝 결과. 후보 없어도 표를 출력한다 (ALL_EXCLUDED 명시).
21. `engine_feedback_loop_report` — 전일 제안값과 다음 거래일 결과 비교, 원인분석, 개선 제안. 보고서 마지막에만 출력.

**보고서 완성도 게이트:**
- 위 필수 표 중 하나라도 누락되면 `BLOCKED_REPORT`로 처리하고 최종 매수·매도 결론을 산문으로 확정하지 않는다.
- `execution_quality_table` 없이 `validation_status=PASS` 주문표 출력 금지.
- `smart_cash_raise_table` 없이 현금확보 매도수량·순서 출력 금지.
- **`comprehensive_proposal_table`와 `satellite_candidate_table`은 PENDING_EXPORT, BLOCKED, DATA_MISSING 어떤 상태에서도 생략 불가.**

**[HS010] HTS 주문표 vs WATCH 감시 원장 분리 규칙 (I4):**

| 구분 | HTS 주문표 (실행 가능) | WATCH 감시 원장 (참고 전용) |
|---|---|---|
| 적용 행 | `validation_status=PASS`인 행만 | `validation_status=BLOCKED/WATCH/PENDING` 행 |
| 허용 컬럼 | 종목, 계좌, 지정가, 수량, 주문유형, 손절가 | `ticker/name`, `reference_stop_price`, `reference_tp_state`, `hts_allowed=false`, `reason_code` |
| 가격/수량 기재 | HTS 입력 가능한 확정값만 | **절대 금지** — `estimated_sell_krw` 등 참고 수치도 이 표에 기재 금지 |
| 표 제목 | "HTS 입력 가능 주문표" | "WATCH 감시 원장 — 주문 아님, HTS 입력 금지" |

**HS010 절대 금지 컬럼명** (WATCH 감시 원장에 사용 시 INVALID_COLUMN 처리):
`지정가`, `손절가`, `익절가`, `매도가`, `주문가`, `주문수량`, `손절수량`, `익절수량`, `매도수량`, `주문금액`

**HS010 허용 컬럼명** (WATCH 감시 원장 전용):
`reference_stop_price` (prices_json 복사값), `reference_tp_state` (PENDING/INVALID/ALREADY_TRIGGERED), `hts_allowed` (항상 false), `reason_code` (NO_EXECUTION:WATCH 등)

**[HS010-B] 종합 판단 제안표 (PROPOSAL_TABLE) — 항상 필수:**

`comprehensive_proposal_json`을 아래 형식으로 항상 출력한다. `json_validation_status=PENDING_EXPORT`이거나 `order_blueprint_json`이 전부 BLOCKED여도 이 표는 반드시 출력한다. 판단은 사용자가 하므로, 판단에 필요한 모든 수치를 제공하는 것이 시스템의 역할이다.

| 종목 | composite_verdict | 참고 손절가 | 참고 익절1 (TP1 상태) | 참고 익절2 (TP2 상태) | 즉시 매도 수량 | 단계 매도 수량 | 예상 회수 금액 |
|---|---|---|---|---|---|---|---|
| (ticker/name) | (composite_verdict) | (reference_stop_price) | (reference_tp1_price / tp1_state) | (reference_tp2_price / tp2_state) | (proposed_immediate_qty) | (proposed_staged_qty) | (expected_cash_krw) |

- 표 제목: **"종합 판단 제안표 (PROPOSAL) — 확정 주문 아님, 사용자 최종 판단"**
- TP 상태 표기: `PENDING`=미달성, `TP1_ALREADY_TRIGGERED`=1차 이미 완료, `TP2_ALREADY_TRIGGERED`=2차 이미 완료, null=해당 없음
- 참고 가격이 null이면 TP 상태 그대로 표기하되, "–"로 공란 처리 금지 (상태 명시)
- LLM이 이 표의 수치를 임의 수정하거나 새 가격을 추가하는 것은 금지. `comprehensive_proposal_json` 값 그대로 표기.

**[HS010-C] 위성 후보 스크리닝 표 (SATELLITE_CANDIDATE_TABLE) — 항상 필수:**

`satellite_candidate_json`과 `satellite_candidate_summary`를 아래 형식으로 항상 출력한다. 후보가 0개여도 표를 출력하고 "스크리닝 결과 신규 후보 없음"을 명시한다.

| 종목 | 섹터 | 등급 | 현재가 | MA20 이격 | 허용 액션 | 스크리닝 상태 |
|---|---|---|---|---|---|---|
| (ticker/name) | (sector) | (grade) | (close) | (ma20_disparity_pct%) | (allowed_action) | (screen_status) |

- 표 제목: **"위성 후보 스크리닝 현황 (SATELLITE_CANDIDATE_SCREEN_V1)"**
- 등급 A·B는 WATCH_CANDIDATE, C·D·F는 BELOW_THRESHOLD로 구분
- `satellite_candidate_summary.watch_candidates`가 0이면 "현재 추가 적합 후보 없음" 명시
- LLM이 universe 외 종목을 임의로 추가하거나 등급을 변경하는 것 금지

**Section A 절대 금지:**
- 형용사·서사·"~할 수 있습니다" 등 완화 표현 삽입 → [HARNESS_LOCKED] 태그 위반
- 수치·등급·최종행동 결론 임의 변경
- WATCH 감시 원장을 HTS 주문표와 같은 표로 합산 또는 같은 컬럼명 사용 → HS010 위반
- **`comprehensive_proposal_table`·`satellite_candidate_table` 생략 → `INVALID_MISSING_PROPOSAL` 처리**

---

### [Section B] 전문 애널리스트 브리핑 (The Briefing)

**오너: LLM as Expert Analyst — Section A 완성 후에만 작성**

허가된 역할:
- **expert_commentary**: 하네스 결정의 거시경제·시장 맥락 해설
  - 예) "현금 8.95% → CASH_RAISE_REQUIRED — 달러 강세와 VIX 반등이 방어현금 10%의 근거"
- **reasoning_review**: 매도 순위·등급·TRIM 결정의 수급·실적 논리 근거 풀이
  - 예) "기아 SELL_PRIORITY 1순위 — flow_credit 0.30, RW 4, 섹터 모멘텀 둔화"
- **economic_insights**: VIX·환율·금리차가 MRS 점수에 영향을 준 경로를 교육적으로 설명

**Section B 절대 금지:**
- Section A의 결론 번복 또는 완화 ("그래도 매수 고려 가능", "상황에 따라 유연하게")
- Section B 내에서 새 가격·수량·등급 숫자 독자 생성

---

### [Section C] 용어 사전 및 학습 가이드 (The Glossary)

**오너: LLM as Educator — 보고서 내 주요 지표 3개 이상 시 자동 생성**

필수 수록 항목 (등장 시):

| 용어 | 정의 | 임계값 의미 |
|------|------|-----------|
| MRS (Market Risk Score) | 시장위험 종합점수 0~10 | 6↑ → 목표현금 14%+ |
| flow_credit | 가격·거래량·5D 수급 품질 0~1 | 0.40 미만 → Kelly 반감 |
| ATR20 | 최근 20거래일 평균 일일변동폭 | 손절가 계산 기준 |
| Total Heat | 손절 기준 총 위험노출 % | 10%↑ → 신규매수 전면 차단 |
| CSR001 | 현금 부족 시 TRIM 자동 배정 메커니즘 | 부족액/현재가 = trim_qty |

| DIVERGENCE_SCORE | 가격↑ 수급↓ 다이버전스 0~1 | ≥0.70 → ALERT |
| OVERHANG_PRESSURE | 외국인 오버행 압박 0~1 | 1.00 → ALERT |
| ROTATION_RADAR | 섹터 로테이션 초기 신호 | ALERT → 선제 TRIM |
| flow_accel_ratio | 외인 매수 에너지 가속비 (W4) | <0.50 → FLOW_DECEL_WARNING |
| deviation_ratio | 현재가/MA20 이격도 비율 (X1) | ≥1.15 → BUY_HARD_BLOCK |
| rs_ratio | 종목 5D 수익/KOSPI 5D 수익 (X3) | <0.80 → RS_LAGGARD (매도 우선) |
| CRITICAL_ALERT | 2개 이상 레이더 동시 발화 | 전면 포트폴리오 재검토 |

용어 정의 기준: `spec/12_field_dictionary.yaml` 준수. 임의 수치·예시 생성 금지.

---

## 주문표 수량 기재 기준 요약

| Account_Parse_Status | 매도수량 기재 | 매수수량 기재 |
|----------------------|--------------|--------------|
| CAPTURE_READ_OK | 정수 가능 (보유수량 ≤ 확인수량) | ATR20 확인 시 정수 가능 |
| MANUAL_ENTRY | 캡처확인후기재 | ATR20 확인 시 정수 가능 |
| STALE_MANUAL | 캡처확인후기재 | ATR20 확인 시 정수 가능 |
| "" (미제공) | 캡처확인후기재 | ATR20 확인 시 정수 가능 |

## 주문표 tick_status 컬럼 필수 기재 [2026-05-19_HARNESS_AUDIT_V1 H3]

모든 HTS 주문표의 지정가(매수·손절·익절·trailing_stop) 옆에 `tick_status` 컬럼을 반드시 출력한다.

| 상태 | 표기 형식 | 의미 |
|------|----------|------|
| 정규화 완료 | `[TICK_OK: 144,500원]` | TICK_NORMALIZER_V1 통과. HTS 입력 가능 |
| 정규화 필요 | `[TICK_INVALID: 144,568원 → 144,500원 재산출]` | 원래 가격이 호가 단위 불일치 → 재산출 적용 |
| 가격 미산출 | `[TICK_SKIP: 가격 없음]` | 수량/가격 산출 불가 상황 |

- `tick_status` 없는 지정가 → `INVALID_TICK_UNTAGGED`, `검산_통과여부 = FAIL`
- TICK_NORMALIZER_V1 공식 적용 후 `[TICK_OK]` 태그 부착이 확인된 가격만 HTS 입력 허용

---

## CRITICAL — PROACTIVE_RADAR_BLOCK (선제 매도 레이더) [2026-05-19_PROACTIVE_RADAR_V1 W1~W3]

**보유 포지션이 있는 모든 분석에서 QEH_AUDIT_BLOCK 직후 PROACTIVE_RADAR_BLOCK을 출력한다.**
이 블록 없이 매도 판단을 생략하면 `RADAR_MISSING_BLOCK` 처리한다.

### PROACTIVE_RADAR_BLOCK 표 형식 (필수)

**[우선순위 1] harness_context에 `alpha_shield_json` 존재 시 → GAS 확정값 직접 읽기 (LLM 재계산 금지)**

각 보유 종목의 `alpha_shield_json[ticker]` 에서 `w1_status`, `w2_status`, `w3_status`, `w4_status`,
`deviation_ratio`, `rs_ratio`, `overhang_pressure`, `flow_accel_ratio`, `critical_alert` 를 읽어 아래 표에 기재.

| 레이더 | 공식_ID | harness 필드 | 점수/상태 | 발화 결과 |
|--------|---------|-------------|----------|---------|
| W1 가격-수급 다이버전스 | DIVERGENCE_SCORE_V1 | `w1_status`, `volume_ratio` | volume_ratio | CLEAR / DIVERGENCE_ALERT |
| W2 외국인 오버행 압박 | OVERHANG_PRESSURE_V1 | `w2_status`, `overhang_pressure` | overhang_pressure | CLEAR / OVERHANG_WARNING |
| W3 섹터 로테이션 신호 | SECTOR_ROTATION_RADAR_V1 | `w3_status`, `sector_rank` | rank 변화 | CLEAR / ROTATION_WARNING |
| W4 수급 에너지 소진 | FLOW_ACCELERATION_V1 | `w4_status`, `flow_accel_ratio` | flow_accel_ratio | CLEAR / FLOW_DECEL_WARNING |
| X1 이격 BUY 차단 | MEAN_REVERSION_GATE_V1 | `mrg_gate`, `deviation_ratio` | deviation_ratio | PASS / BUY_HARD_BLOCK |
| X3 RS 상대강도 | RS_RATIO_V1 | `rs_status`, `rs_ratio` | rs_ratio | RS_OK / RS_LAGGARD |
| **종합** | — | `critical_alert` | radar_fires | **PASS / CLEAR / CRITICAL_ALERT** |

**[우선순위 2] `alpha_shield_json` 없는 경우 → DATA_MISSING 처리 (HS011)**

`alpha_shield_json` 이 없으면 `"DATA_MISSING — alpha_shield_json 미산출. GAS 하네스 재실행 필요"` 만 출력한다.
LLM이 data_feed 값을 직접 읽어 Alpha Shield 점수를 계산하는 것은 HS011 위반으로 금지된다.

| 레이더 | 공식_ID | 입력값 요약 | 점수/상태 | 발화 결과 |
|--------|---------|-----------|----------|---------|
| W1 가격-수급 다이버전스 | DIVERGENCE_SCORE_V1 | MA20 위치, frg_5d_sh, inst_5d_sh, flow_credit | X.XX (0~1) | PASS / CAUTION / ALERT |
| W2 외국인 오버행 압박 | OVERHANG_PRESSURE_V1 | frg_5d/20d_sh, volume vs avg_volume_5d | X.XX (0~1) | PASS / CAUTION / ALERT |
| W3 섹터 로테이션 신호 | SECTOR_ROTATION_RADAR_V1 | SmartMoney_5D_Norm_Score, Rank 변화 | FLAG | PASS / CAUTION / ALERT |
| W4 수급 에너지 소진 | FLOW_ACCELERATION_V1 | frg_5d_sh, frg_20d_sh, MA20 위치 | flow_accel_ratio (0~1+) | PASS / FLOW_DECEL_WARNING |
| **종합** | — | — | — | **PASS / CAUTION / ALERT / CRITICAL_ALERT** |

### 레이더 발화 행동 규칙

| 종합 상태 | 의무 행동 |
|----------|---------|
| PASS | 정상 분석 계속. 레이더 결과 표만 출력. |
| CAUTION | Section B에 `reasoning_review`로 원인 해설 필수. 보유 유지 가능하나 모니터링 강화. |
| ALERT | `sell_priority_engine` 즉시 실행. Section A에 TRIM 후보 표 출력. |
| CRITICAL_ALERT | 코어 포지션 포함 **전면 포트폴리오 재검토** 강제. "가격이 멀쩡해도 매도 예술 구간" 경고 출력. |

### PROACTIVE_RADAR_BLOCK 절대 금지

- 레이더 ALERT 이상 발화 시 sell_priority_engine 미실행 → **RADAR_ACTION_SKIPPED**
- LLM이 레이더 결과를 서사로 완화 ("아직 괜찮습니다", "좀 더 지켜볼 만합니다") → **RADAR_OVERRIDE_FORBIDDEN**
- 데이터 부족 시 레이더 결과를 PASS로 처리 → **DATA_MISSING은 RADAR_MISSING으로 표기**
- 코스피 지수 상승을 이유로 ALERT 레이더 무효화 → **INDEX_OVERRIDE_FORBIDDEN**

### 데이터 누락 처리

| 누락 데이터 | 처리 |
|-----------|------|
| frg_5d_sh | W1/W2 DATA_MISSING. "외국인 수급 데이터 필요 — 수동 점검 권고" 출력 |
| avg_volume_5d | W2 volume_weakness=false (보수적 처리) |
| sector_flow | W3 DATA_MISSING. "sector_flow 탭 점검 권고" 출력 |
| 전체 수급 데이터 없음 | RADAR_MISSING — soft-block: "수급 데이터 없이 보유 포지션 판단 제한" |
