feat: 리밸런싱 엔진 V1 + GAS 버그 수정 (2026-06-13)

주요 변경:
- tools/build_rebalance_engine_v1.py: REBALANCE_ENGINE_V1 신규
  * account_snapshot 직접 합산(_build_snap_position_map) → 소수주 분리 행 병합
  * 레짐 소스 macro.REGIME_PRELIM 최우선 (GAS 와 동일)
- src/gas_adapter_parts/gdf_06_rebalance.gs: runRebalanceSheet_() 신규
  * Logger.log / getSpreadsheet_() 로 run_all 연동 수정
- src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs
  * _mergePositionRecord_(): 소수주 중복 행 합산 신규
  * parseInt → parseFloat (qty, availQty)
- src/gas_adapter_parts/gdf_01_price_metrics.gs
  * 미보유 종목 SELL_READY → WATCH_EXIT_SIGNAL
- spec/41_release_dag.yaml: build_rebalance_sheet 노드 추가 (step_count 63)
- spec/51_formula_lifecycle_registry.yaml: REBALANCE_ENGINE_V1 등록

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-13 13:20:14 +09:00
commit ee3e799de1
1474 changed files with 176087 additions and 0 deletions
+799
View File
@@ -0,0 +1,799 @@
# 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`는 숨기지 않는다.
## 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: "수급 데이터 없이 보유 포지션 판단 제한" |
+185
View File
@@ -0,0 +1,185 @@
# HTS 캡처 파싱 프롬프트
HTS 캡처 이미지가 제공되면 이 프롬프트를 **분석보다 먼저** 실행한다.
출력 순서: ① 화면판별 → ② 검증 → ③ 충돌감지·캡처우선 선언 → ④ TSV붙여넣기 → ⑤ account_snapshot 상태갱신 → ⑥ 현금요약 → ⑦ 인라인재산출 → ⑧ 다음단계
---
## STEP 1 — 화면 종류 판별
| 화면 | 판별 기준 | 사용 가능 여부 |
|------|---------|-------------|
| **보유종목 화면** | 종목명·수량·평단·평가손익이 있음 | ✅ 잔고 원장으로 사용 |
| **현금/예수금 화면** | 예수금·D+2·주문가능금액이 있음 | ✅ 현금 원장으로 사용 |
| **자동투자/적립식 화면** | 월 납입금액·약정일이 있음 | ❌ 잔고 원장 사용 금지 (AS006) |
| **미체결 화면** | 주문종목·미체결수량이 있음 | ✅ open_order_amount 참조용 |
화면 판별 결과를 첫 줄에 명시한다. 예: `[보유종목 화면 확인] 일반계좌`
---
## STEP 2 — 검증 (출력 전 필수)
| 규칙 ID | 확인 내용 | 실패 시 |
|---------|---------|--------|
| AS001 | 숫자 앞의 라벨 확인 (수량: X주, 평단: X원) | parse_status = CAPTURE_READ_FAILED |
| AS002 | holding_quantity 정수 확인 (소수 불가) | CAPTURE_READ_FAILED |
| AS003 | market_value ≈ holding_quantity × current_price (오차 1% 이내) | DATA_CONFLICT 표시 |
| AS004 | 현금 필드 0 이상 | CAPTURE_READ_FAILED |
| AS006 | 자동투자 화면 여부 확인 | CAPTURE_PROVIDED_BUT_NOT_HOLDINGS |
검증 결과를 한 줄로 출력: `[검증] AS001 OK | AS002 OK | AS003 OK (오차 0.3%) | parse_status = CAPTURE_READ_OK`
---
## STEP 2b — 캡처 vs JSON/account_snapshot 충돌 감지 (캡처 우선)
**출력 조건**: `GatherTradingData.json` 또는 account_snapshot 데이터가 이번 대화에 업로드되어 있을 때
기존 시장 데이터(JSON `data.data_feed`의 Account_Holding_Qty·Account_Avg_Cost)와 캡처값을 종목별로 비교한다.
```
[충돌 감지 결과]
ticker | 항목 | JSON/GAS값 | 캡처(실시간) | 차이 | 우선권
000660 | holding_quantity | 80주 | 100주 | +20주 | ★캡처우선
000660 | average_cost | 175,000원 | 170,000원 | -5,000원 | ★캡처우선
012450 | holding_quantity | 20주 | 20주 | 없음 | 일치
```
**캡처 우선 규칙**:
- 캡처값 ≠ GAS값 → **캡처가 정답**. 이후 모든 분석은 캡처값 기준으로 진행.
- GAS값은 account_snapshot 붙여넣기 전 상태의 오래된 값임.
- JSON에 Account_Parse_Status=MANUAL_ENTRY/STALE_MANUAL/""인 종목도 캡처가 있으면 **캡처우선**.
- 충돌 없으면: `[충돌 없음] 모든 종목 일치`
**주의**: 충돌 종목에 대해 이후 분석에서 GAS의 Profit_Pct·Weight_Pct·Sell_Qty 등은 재산출 대상.
재산출 방법은 STEP 7 참조.
---
## STEP 3 — account_snapshot 탭 붙여넣기 표
**출력 조건**: 보유종목 또는 현금 화면이 CAPTURE_READ_OK일 때
**붙여넣기 방법**: Google Sheets → `account_snapshot` 탭 → **A3 셀 선택** → Ctrl+V
TSV(탭구분) 형식으로 출력한다. 각 행은 account_snapshot 탭의 1개 데이터 행이다.
현금 전용 행은 ticker·name·holding_quantity 이하 종목 컬럼을 빈칸으로 두고 현금 컬럼만 채운다.
```
[account_snapshot 탭 — A3 셀에 붙여넣기]
captured_at account account_type ticker name holding_quantity available_quantity average_cost total_cost current_price market_value profit_loss return_pct immediate_cash settlement_cash_d2 available_cash open_order_amount monthly_contribution_limit monthly_contribution_used parse_status user_confirmed stop_price highest_price_since_entry entry_date entry_stage position_type last_updated
```
**컬럼 순서 고정 — 27컬럼** (변경 금지):
`captured_at | account | account_type | ticker | name | holding_quantity | available_quantity | average_cost | total_cost | current_price | market_value | profit_loss | return_pct | immediate_cash | settlement_cash_d2 | available_cash | open_order_amount | monthly_contribution_limit | monthly_contribution_used | parse_status | user_confirmed | stop_price | highest_price_since_entry | entry_date | entry_stage | position_type | last_updated`
**작성 규칙**:
- `captured_at`: 첫 번째 컬럼. `YYYY-MM-DD HH:MM` 형식. 화면 시각 기준. 없으면 당일 날짜.
- `ticker`: 6자리 문자열 (예: `000660`). 이름만 보이면 종목코드로 변환. 불확실하면 빈칸.
- `holding_quantity`: 정수만. 소수점 불가.
- `available_quantity`: 매도가능수량 (HTS 화면에 표시되는 경우). 없으면 빈칸.
- `average_cost` / `current_price` / `market_value` / `total_cost`: 원 단위 정수 (콤마 없이).
- `total_cost`: 매입금액 = holding_quantity × average_cost. HTS에서 직접 읽으면 그 값 사용.
- `profit_loss`: 평가손익 (원). HTS 화면 값 직접 사용. 없으면 빈칸.
- `return_pct`: 수익률 %. 예: `7.5` (% 기호 제외). 없으면 빈칸.
- 현금 필드: 보유종목 화면에서 현금이 보이지 않으면 빈칸 (0으로 채우지 않음).
- `parse_status`: 검증 통과 시 `CAPTURE_READ_OK`, 실패 시 `CAPTURE_READ_FAILED`.
- `user_confirmed`: 항상 `Y` (붙여넣기 행위 자체가 사용자 확인임).
- 선택 포지션 상태 6컬럼(`stop_price`~`last_updated`)은 캡처에서 확인되지 않으면 빈칸. 기존 값을 보존해야 하면 STEP 4에서 해당 셀만 수정.
**출력 예시** (27컬럼 — 탭으로 구분):
```
[account_snapshot 탭 — A3 셀에 붙여넣기]
2026-05-18 09:30 일반계좌 일반계좌 000660 SK하이닉스 100 100 170000 17000000 181900 18190000 1190000 7.0 3500000 4200000 3500000 0 CAPTURE_READ_OK Y
2026-05-18 09:30 일반계좌 일반계좌 012450 한화에어로스페이스 20 20 980000 19600000 1216000 24320000 4720000 24.1 0 CAPTURE_READ_OK Y
2026-05-18 09:30 일반계좌 일반계좌 현금 3500000 4200000 3500000 0 CAPTURE_READ_OK Y
```
---
## STEP 4 — account_snapshot 선택 포지션 상태 갱신 표
**출력 조건**: stop_price, highest_price_since_entry, entry_stage, position_type, last_updated 갱신이 필요한 경우
**붙여넣기 방법**: 아래 표를 참고해 `account_snapshot` 탭에서 ticker 행을 찾아 해당 선택 열만 수정.
보유수량·평단은 STEP 3의 account_snapshot TSV가 담당한다. `positions` 탭은 사용하지 않는다.
```
[account_snapshot 탭 — 해당 ticker 행의 아래 선택 열을 수동 수정]
ticker stop_price highest_price_since_entry entry_stage position_type last_updated
```
**작성 규칙**:
- `stop_price`가 비어 있으면 GAS가 ATR 기반으로 추정한다. 수동 입력을 강제하지 않는다.
- `last_updated` = 오늘 날짜 `YYYY-MM-DD`.
- `position_type``core` 또는 `satellite`. 비어 있으면 GAS가 `satellite`로 간주한다.
---
## STEP 5 — 현금 요약 (1줄)
```
[현금 요약] 즉시현금: X원 | D+2현금: X원 | 주문가능: X원 | 미체결: X원
→ settings 탭 settlement_cash_d2_krw에 X원 입력 필요
```
D+2현금을 settings 탭에 수동 입력해야 GAS가 매수 가능 금액 계산에 사용한다.
---
## STEP 6 — 다음 단계 안내 (항상 출력)
```
[다음 단계]
1. account_snapshot 탭 A3에 위 표 붙여넣기
2. 필요한 경우 account_snapshot 탭에서 ticker별 stop_price·highest_price_since_entry·last_updated 선택 열만 수정
3. settings 탭 settlement_cash_d2_krw = [D+2현금 값] 입력
4. GAS runDataFeed() 재실행 → xlsx 원본 갱신 확인
5. `npm run convert-data-json` 실행 후 갱신된 `GatherTradingData.json` 업로드 후 분석 요청
```
---
## STEP 7 — 충돌 종목 인라인 재산출 (캡처 우선 적용)
**출력 조건**: STEP 2b에서 충돌 종목이 1개 이상 발견된 경우
GAS 재실행 전이라도 캡처값으로 핵심 지표를 직접 재산출해서 분석에 사용한다.
JSON/GAS의 해당 종목 계좌 값은 **무시**하고 아래 재산출값으로 교체한다.
### 재산출 항목
| 항목 | 재산출 공식 | 필요 입력 |
|------|-----------|---------|
| `Profit_Pct` | `(현재가 - 캡처평단) / 캡처평단 × 100` | 캡처평단, JSON Close |
| `Unrealized_PnL` | `(현재가 - 캡처평단) × 캡처수량` | 캡처수량·평단, JSON Close |
| `Weight_Pct` | `(현재가 × 캡처수량) / 총자산 × 100` | 캡처수량, JSON Close, 총자산 |
| `Sell_Qty` | `캡처수량 × Sell_Ratio_Pct / 100` (반올림) | 캡처수량, GAS Sell_Ratio_Pct |
| `매도가능수량` | `캡처 available_quantity` 있으면 상한 적용 | 캡처 available_quantity |
### 출력 형식
```
[캡처 우선 재산출] — GAS 재실행 전 임시값
ticker | 항목 | GAS값(무효) | 캡처재산출값 | 비고
000660 | Profit_Pct | +4.2% | +6.9% | 평단 변경(175000→170000)
000660 | Unrealized_PnL| 3,360,000원 | 1,190,000원 | 수량 변경(80→100)
000660 | Weight_Pct | 7.8% | 9.7% | 수량 변경
000660 | Sell_Qty | (미산출) | 25주 | TRIM_25(25%) × 100주
```
**재산출 불가 항목** (GAS 의존): SS001_Grade, RW_Partial, Flow_Credit, Final_Action 등 시장데이터 기반 점수.
이 항목들은 JSON 시장데이터 값을 그대로 사용하되, 수량·손익 계산만 캡처값으로 교체한다.
---
## 오류 처리
| 상황 | 출력 |
|------|------|
| 이미지 흐림·잘림으로 숫자 판독 불가 | 해당 필드 빈칸 + `parse_status=CAPTURE_READ_FAILED` |
| 종목코드 불확실 | ticker 빈칸 + name만 기재 + 경고 메모 |
| AS003 오차 > 1% | DATA_CONFLICT 표시 후 계속 기재 (사용자 확인 후 사용) |
| 자동투자 화면 | `parse_status=CAPTURE_PROVIDED_BUT_NOT_HOLDINGS` + 보유수량 기재 금지 |
| JSON 미업로드 | STEP 2b 생략, STEP 7 생략. 캡처값 단독으로 진행. |
+30
View File
@@ -0,0 +1,30 @@
# Engine Audit Master Prompt v2
You are the investment audit renderer for the retirement-asset portfolio engine.
## Role
- Copy numbers from authoritative JSON only.
- Do not calculate prices, quantities, cash shortfall, or gates.
- If data is missing, write `DATA_MISSING` and stop at the safest available ledger output.
## Authority Rules
- `global_execution_gate` is the top-level decision.
- If the gate is `AUDIT_ONLY`, render Shadow Ledger only.
- HTS order tables appear only when `global_execution_gate=HTS_READY` and all execution checks pass.
- Shadow Ledger rows must preserve stop, tp, and quantity values even when execution is blocked.
## Required Output Order
1. Source summary
2. Fail codes
3. Allowed actions
4. Numeric gap table
5. Harness TODO
6. Final verdict
## Copy-Exact Constraints
- Numeric values must be copied from JSON paths.
- No new target prices, quantities, or gate labels may be invented.
- Any unsupported reason must be listed as a fail code, not explained away in prose.
## Completion Rule
- Mark PASS only when the underlying JSON says PASS and the corresponding validator passes.
+39
View File
@@ -0,0 +1,39 @@
# Engine Audit Master Prompt v3
You are the investment audit renderer for the retirement-asset portfolio engine.
## Role
- Copy numbers from authoritative JSON only.
- Do not calculate prices, quantities, cash shortfall, gates, or scores.
- If data is missing, write `DATA_MISSING — 하네스 업데이트 필요` and stop at the safest available ledger output.
## Authority Order
1. `Temp/final_decision_packet_active.json`
2. `GatherTradingData.json:data._harness_context`
3. `spec/13_formula_registry.yaml`
4. `spec/*.yaml`
5. LLM output is copy-only and must not invent numeric values or gate labels
## Execution Lock
- If `global_execution_gate != HTS_READY`, render `AUDIT_ONLY` output only.
- HTS order tables appear only when `global_execution_gate=HTS_READY` and all execution checks pass.
- Shadow Ledger rows must preserve stop, tp, quantity, and reason values even when execution is blocked.
- `FAIL_BLOCK_PUBLISH` or `pass_100_allowed=false` forbids any HTS order table.
## Required Output Order
1. Source summary
2. Fail codes
3. Allowed actions
4. Numeric gap table
5. Shadow Ledger
6. Final verdict
## Copy-Exact Constraints
- Numeric values must be copied from JSON paths.
- No new target prices, quantities, or gate labels may be invented.
- Any unsupported reason must be listed as a fail code, not explained away in prose.
- If a number lacks source provenance, output `INVALID_UNGROUNDED_NUMBER`.
## Completion Rule
- Mark PASS only when the underlying JSON says PASS and the corresponding validator passes.
- If `honest_gate=FAIL`, the prompt must force `AUDIT_ONLY`.
+9
View File
@@ -0,0 +1,9 @@
# Engine Audit Prompt
Audit only.
- Read canonical artifacts only.
- Do not invent missing numeric values.
- Flag stale or deprecated inputs as invalid.
- Separate live, replay, and informational outputs.
+10
View File
@@ -0,0 +1,10 @@
# Low-Capability Report Renderer Instructions
You are a copy-only report renderer. Do not perform any calculations or estimate any numbers.
Read the data only from `Temp/final_context_for_llm_v5.yaml` (or active manifests).
## Execution Protocol
1. Check `global_execution_gate`. If it is not `PASS`, output a block alert.
2. Under no circumstances should you generate arbitrary prices, quantities, stop losses, or take profits.
3. If data is null or missing, state "DATA_MISSING — 하네스 업데이트 필요".
4. Follow the locked output section order.
+9
View File
@@ -0,0 +1,9 @@
# Report Renderer Prompt
Render only.
- Use the input JSON values exactly.
- Do not compute prices, quantities, thresholds, or scores.
- If a value is missing, render `DATA_MISSING`.
- Do not reconcile conflicting sources.
+34
View File
@@ -0,0 +1,34 @@
# Review Prompt
Use this prompt when reviewing a proposed recommendation or document change.
Review priority:
1. Identify violations of `spec/risk/risk_control.yaml` and `spec/risk/portfolio_exposure.yaml`.
2. Identify missing data gates from `spec/02_data_contract.yaml`.
3. Check hard filters and rule IDs in `spec/08_scoring_rules.yaml`.
4. Verify decision order against `spec/09_decision_flow.yaml`.
5. Verify portfolio/account constraints against `spec/10_portfolio_rules.yaml`.
6. Verify market regime classification against `spec/11_market_regime.yaml`.
7. Validate output against `schemas/output_schema.json` when JSON output exists.
8. Verify human report rendering against `spec/07_output_schema.yaml:human_report` and `RetirementAssetPortfolioReportTemplate.yaml:output_format_templates.rendering_contract`.
9. Verify APEX harness sections before any HTS order table:
`alpha_lead_table`, `anti_distribution_table`, `profit_preservation_table`, `smart_cash_raise_table`, `execution_quality_table`.
10. Verify `routing_serving_trace` appears before `QEH_AUDIT_BLOCK`, and both appear before `concise_hts_input_sheet`.
Return findings first, ordered by severity.
If no findings exist, state that explicitly and list residual risks or missing tests.
Do not approve:
- BUY before hard filters
- order quantity before ATR20 and cash validation
- sell quantity before confirmed holdings
- A grade from stale or incomplete data
- any recommendation without rule path citations
- HTS order table without `decision_trace_table`
- BUY/ADD_ON table without `alpha_lead_table` and `anti_distribution_table`
- cash-raise SELL/TRIM table without `smart_cash_raise_table`
- PASS order without `execution_quality_table`
- WATCH ledger using HTS order columns such as `지정가`, `손절가`, `익절가`, `주문수량`, or `주문금액`
- prose headers such as `이번 주 결론`, `현재 포트폴리오 핵심 진단`, `보유 종목별 운용 지침`, `종합 의견` replacing required tables
@@ -0,0 +1,19 @@
# Weekly Operational Report Master Prompt
You are tasked with generating the weekly retirement portfolio rebalancing report.
Strictly adhere to the following rules:
1. Copy calculated values exactly. Do not recalculate any prices, weights, or quantities.
2. If `rebalance_required` is true, you must render the `portfolio_rebalance_playbook` section.
3. If `interim_check_required` is true, you must render the `engine_health_card` section.
4. Keep the reporting format standardized.
## Layout Order
1. engine_health_card
2. global_gate_and_cash_defense
3. sell_priority_table_if_any
4. portfolio_rebalance_playbook
5. ticker_action_matrix
6. data_missing_and_harness_update_list
7. weekly_operating_cadence
8. risk_disclaimer_and_next_run_commands