Files
QuantEngineByItz/suggest/quant_engine_hardening_todo_v9.yaml
T

820 lines
44 KiB
YAML

quant_engine_hardening_todo_v9:
# ===========================================================================
# 메타 / 이 문서의 사용법 (저성능 LLM 필독)
# ===========================================================================
meta:
version: "v9-2026-06-06-synthesis"
role: "canonical_execution_todo"
supersedes:
- "quant_engine_hardening_todo_v8.(yaml|json) # 타 LLM 제안. 본 v9가 흡수+보강"
- "spec/24_strategy_hardening_todo_v1.yaml"
- "Temp/engine_hardening_todo_v3_data_first.yaml"
- "Temp/quant_engine_hardening_todo_v7_20260603.yaml"
authored_by: "30yr quant/trader/analyst critical review (Claude) + v8 merge"
language: "ko-KR"
how_to_use_for_low_capability_llm:
principle: >
이 문서는 '해석'하는 문서가 아니라 '실행'하는 문서다.
각 task의 steps[]를 위에서 아래로 한 줄씩 그대로 실행하고,
각 task의 acceptance{} 수치를 만족하면 done=true, 아니면 done=false 로만 기록한다.
steps를 건너뛰거나 순서를 바꾸거나 '비슷하게' 처리하지 말 것.
forbidden:
- "가격/수량/손절가/익절가/현금부족액/점수를 LLM이 직접 계산하거나 추정 (HS011/HS012 위반)"
- "acceptance 수치를 만족하지 못했는데 done=true 로 기록 (거짓 100% — 절대 금지)"
- "design_score(설계점수)를 validated_score(실측 검증점수)로 표기"
- "분모가 다른 두 커버리지 수치 중 높은 쪽을 골라 PASS 처리"
- "FAIL_BLOCK_PUBLISH 또는 global_execution_gate != HTS_READY 인데 매수/매도 주문표 생성"
# ===========================================================================
# 0. 현재 상태 — 알고리즘 가이드 대비 결과 수치 증빙 (operational_report.json 실측)
# 아래 숫자는 사용자가 받은 결과 파일에서 그대로 추출. LLM 재계산 금지.
# ===========================================================================
current_evidence_measured:
source_files:
- "Temp/operational_report.json"
- "Temp/algorithm_guidance_proof_v1.json"
- "Temp/value_preservation_scorer_v2.json"
- "Temp/rebound_sell_efficiency_v1.json"
- "Temp/late_chase_attribution_v4.json"
- "Temp/final_execution_decision_v4.json"
- "Temp/yaml_gs_ps_coverage.json"
- "Temp/yaml_code_coverage_full.json"
- "Temp/decision_critical_golden_coverage_v1.json"
headline_verdict:
published_verdict: "FAIL_BLOCK_PUBLISH" # 그런데 리포트는 발행됨 (모순)
pass_100_allowed: false
algorithm_guidance_proof_score: 56.57 # 목표 >= 95
honest_proof_score: 56.57
honest_gate: "FAIL"
# --- 정직 점수 분해 (왜 56.57인가 — 가중합 검산) -------------------------
honest_score_decomposition:
formula: "structure*0.20 + honest_outcome*0.40 + live_validation*0.20 + value_preservation_honest*0.20"
structure_score: 99.68 # x0.20 = 19.94 (보고서 '모양'은 거의 완벽)
honest_outcome_score: 47.84 # x0.40 = 19.14 (실제 결과 품질은 절반 이하)
live_validation_score: 0.00 # x0.20 = 0.00 (실전 검증 표본 0건 → 0점)
value_preservation_honest: 87.50 # x0.20 = 17.50
computed_sum: 56.57 # 검산 OK
interpretation: >
구조(껍데기) 100점, 실전검증 0점. 즉 '보고서가 규격대로 채워졌는가'는 100%지만
'판단이 맞았는가'는 측정 불가(0)이고 '결과 품질'은 47.84다.
100점들은 전부 coverage/shape 지표이지 정확도 지표가 아니다.
# --- 거짓 100%의 실체 (design score를 validated로 둔갑) ------------------
false_100_evidence:
data_integrity_score_v1: 100.0 # cell이 채워졌는지(존재) 측정. '값이 맞는지'는 아님
derivation_validity_score_v1: 100.0
decision_evidence_score_v1: 100.0
vs_outcome_quality_score_v1: 67.0 # CAUTION_MODE
vs_prediction_match_rate_pct: 54.76 # 동전던지기(50%)와 사실상 차이 없음. 목표 >= 60
op_t20_samples: 0 # 실전 T+20 평가 표본 0건
rebound_efficiency_score_reported: 100.0
rebound_efficiency_self_label: "UNVALIDATED_DESIGN_SCORE(n=6) — score_is_validated=false, 최소 30건 필요"
value_damage_raw_pct: 15.7 # 실측 가치훼손(설거지 손실)
value_damage_adjusted_pct: 0.0 # 같은 파일에서 0.0으로 마스킹됨 (cap_pass=false)
value_damage_in_report_headline: 12.5 # 또 다른 값 — 같은 지표가 3군데서 다름
# --- 커버리지 분모 충돌 (PASS/FAIL 골라쓰기 가능) -----------------------
coverage_denominator_collision:
yaml_gs_ps_coverage:
formula_total: 288
gs_coverage_pct: 64.93
status: "FAIL"
adjusted_field: "100.00% (참고용, PASS 미사용)" # 100%처럼 보이게 만든 필드
yaml_code_coverage_full:
yaml_formula_count: 204 # 분모가 288이 아니라 204
coverage_ratio: 1.0
golden_coverage_ratio: 0.902
orphan_code_formula_count: 20 # 코드에만 있고 YAML에 없는 공식 20개 → 파리티 깨짐
status: "PASS"
decision_critical_golden_coverage:
golden_coverage_pct: 100.0
overall_golden_test_coverage_ratio: 0.6793
status: "PASS"
conclusion: >
같은 '커버리지'를 분모 288/204로 다르게 세고, 골든 커버리지가
64.93% / 90.2% / 67.93% / 100%로 4가지가 공존한다. 높은 쪽을 인용하면 PASS.
이것이 사용자가 지적한 '결과를 100%로 만들기 위한 거짓'의 정확한 실체다.
# --- 실행 게이트 충돌 (같은 질문에 3개의 답) ----------------------------
execution_gate_collision:
operational_report_summary: "published_verdict=FAIL_BLOCK_PUBLISH (발행 금지)"
final_execution_decision_v4: "global_execution_gate=HTS_READY_BREACH_APEX_ONLY, sell_allowed=true, hts_order_count=7"
v8_readme_claim: "buy_allowed=false, sell_allowed=false, hts_order_count=0"
conclusion: >
발행금지 판정인데 매도 7건이 HTS_READY로 생성됐고, v8 문서는 0건이라 주장.
실행 권위(authority)가 단일화되지 않아 '발행하면 안 되는 보고서'가
실제 주문 7건을 들고 나간다. 금전손실 직결.
# --- 실제 포트폴리오 상황 (위기) ----------------------------------------
portfolio_state:
total_asset_krw: 394191813 # 3.94억
goal_achievement_pct: 78.8 # 목표 5억의 78.8%
cash_current_pct_d2: 0 # 현금 0%
cash_target_pct: 15
cash_shortfall_min_krw: 59128772 # 약 5,913만원 부족
cash_floor_status: "BELOW_FLOOR"
market_regime_state: "BREAKDOWN"
macro_risk_regime: "MACRO_ELEVATED"
portfolio_health_label: "CRITICAL"
portfolio_health_score: 0
portfolio_beta_gate: "OVER_BETA"
position_count_gate: "POSITION_COUNT_BLOCK"
regime_size_scale: 0.5
late_chase_status: "DEGRADE_BUY_PERMISSION" # 뒷북 매수 페널티 발동 중
# --- 기술부채 / 파편화 정량 ---------------------------------------------
technical_debt_metrics:
temp_json_artifacts: 329
python_tools: 201
spec_yaml_files: 86
gas_data_feed_gs_lines: 10199 # 단일 파일 1만줄 모놀리식
gas_total_lines: 20226
versioned_same_concept_offenders:
smart_cash_recovery: 8 # v3~v9 + base
horizon_routing_lock: 5
data_integrity_100_lock: 5 # '거짓100 방지' 락 자체가 5버전 (자기모순)
single_truth_ledger: 3 # '단일 진실' 원장이 3버전 (자기모순)
final_execution_decision: 4
interpretation: >
'단일 진실(single_truth)'과 '무결성 100 락(data_integrity_100_lock)'이
각각 3개, 5개 버전으로 쪼개진 것이 파편화의 결정적 증거.
규칙이 늘수록 충돌·정합성 붕괴 위험이 비선형으로 증가(과유불급).
# ===========================================================================
# 1. 최종 목표 (전부 수치. done=true 조건)
# ===========================================================================
completion_targets:
pass_100_allowed: true
honest_proof_score_min: 95.0
algorithm_guidance_proof_score_min: 95.0
prediction_match_rate_pct_min: 60.0
live_t20_evaluated_count_min: 30
execution_expectancy_pct_min: 0.10
execution_win_rate_pct_min: 45.0
value_damage_pct_avg_max: 10.0 # raw 기준. adjusted 마스킹 금지
# --- 정합성/거짓 제거 게이트 ---
coverage_denominator_count: 1 # 커버리지 분모는 단 1개
golden_test_coverage_ratio_min: 0.90
golden_test_coverage_ratio_final: 1.00
orphan_code_formula_count: 0
yaml_to_gs_to_py_parity_pct: 100.0
authority_collision_count: 0
design_score_reported_as_validated_count: 0
masked_metric_without_raw_count: 0
ungrounded_number_count: 0
llm_generated_decision_field_count: 0
stale_artifact_reference_count: 0
execution_verdict_source_count: 1 # 실행여부 결정 권위는 단 1곳
# --- 파편화 해소 ---
duplicate_same_concept_artifact_max: 1
# ===========================================================================
# 2. 권위 순서 (Authority Order) — 충돌 시 위가 항상 이긴다. LLM 재해석 금지.
# ===========================================================================
authority_order:
1_final_decision_packet: "Temp/final_decision_packet_v2.json # 실행 여부의 단일 진실"
2_harness_context: "GatherTradingData.json:data._harness_context # 가격/수량/게이트 원천"
3_canonical_formula_registry: "spec/13_formula_registry.yaml # 공식 정의 단일 원천"
4_spec_yaml: "spec/*.yaml # 정책/지침 (지침일 뿐, 숫자 산출은 코드가 함)"
5_llm_render: "LLM은 위 1~4를 '복사 렌더링'만. 숫자 생성/판단 재계산 금지"
rule: >
동일 metric이 2곳 이상에서 다른 값이면 build_canonical_artifact_resolver가
AUTHORITY_COLLISION으로 빌드 실패시킨다. 더 높은 권위만 채택.
# ===========================================================================
# 3. 단계별 실행 계획 (Phases). 각 task는 files/steps/acceptance/validate 4종 세트.
# ===========================================================================
phases:
# -----------------------------------------------------------------------
- phase_id: P0_KILL_FALSE_100
priority: P0
title: "거짓 100% 박멸 — 측정 대상을 '모양'에서 '결과'로 교정"
why: >
모든 문제의 뿌리. data_integrity=100은 '값이 존재함'이지 '값이 맞음'이 아니다.
design_score를 validated로 둔갑시키고, raw 15.7%를 adjusted 0.0%로 마스킹한다.
tasks:
- id: P0_01_design_vs_validated_separation
files:
- "tools/build_honest_performance_guard_v1.py"
- "Temp/honest_performance_guard_v1.json"
steps:
- "모든 *_score 필드에 score_kind ∈ {DESIGN, VALIDATED} 라벨을 강제한다."
- "VALIDATED 라벨은 live_sample_n >= 30 인 경우에만 허용. 미만이면 DESIGN."
- "보고서/요약(summary)에 노출되는 점수는 score_kind=VALIDATED 만. DESIGN은 (설계, n=N) 접미사 의무."
- "rebound_efficiency_score=100(n=6)처럼 DESIGN인데 summary에 단독 노출되면 FAIL."
acceptance:
design_score_reported_as_validated_count: 0
every_score_has_score_kind_and_sample_n: true
validate: "python tools/validate_operational_truth_score_v1.py"
- id: P0_02_no_adjusted_masking
files:
- "tools/build_value_preservation_scorer_v2.py"
- "Temp/value_preservation_scorer_v2.json"
steps:
- "value_damage 등 raw 지표가 있는데 adjusted=0.0 으로 덮어쓰는 로직 제거."
- "게이트 입력은 항상 raw 값 사용. adjusted는 참고(annotation)로만 표시."
- "raw가 cap을 초과하면(15.7 > 10) cap_pass=false 를 summary에 그대로 전파."
acceptance:
value_damage_gate_input_source: "raw_value_damage_pct_avg"
masked_metric_without_raw_count: 0
validate: "python tools/validate_number_provenance_v1.py"
- id: P0_03_single_coverage_denominator
files:
- "tools/measure_yaml_gs_ps_coverage.py"
- "tools/build_yaml_code_coverage_v1.py"
- "Temp/yaml_gs_ps_coverage.json"
steps:
- "공식 모집단(denominator)을 spec/13_formula_registry.yaml 의 active=true 공식 1개 집합으로 통일."
- "288 vs 204 불일치 해소: deprecated/orphan을 active=false로 명시 후 분모에서 제외."
- "'adjusted_coverage_pct (참고용, PASS 미사용)' 같은 장식용 100% 필드 전면 삭제."
- "골든 커버리지 비율도 이 단일 분모로만 계산. 64.93/90.2/67.93/100 공존 금지."
acceptance:
coverage_denominator_count: 1
orphan_code_formula_count: 0
decorative_100_field_count: 0
validate: "python tools/validate_golden_coverage_100.py"
# -----------------------------------------------------------------------
- phase_id: P1_SINGLE_EXECUTION_VERDICT
priority: P0
title: "실행 권위 단일화 — '발행금지인데 주문 7건' 충돌 제거"
why: >
operational_report=FAIL_BLOCK_PUBLISH 인데 final_execution_decision_v4=hts_order_count:7.
실행 여부를 결정하는 곳이 여러 곳이라 발생. 금전손실 직결.
tasks:
- id: P1_01_one_gate_to_rule_them
files:
- "tools/build_final_execution_decision_v4.py"
- "schemas/final_decision_packet_v2.schema.json"
- "spec/33_execution_precedence_lock.yaml"
steps:
- "global_execution_gate를 final_decision_packet_v2 단 한 곳에서만 산출."
- "pass_100_allowed=false 또는 published_verdict=FAIL_BLOCK_PUBLISH 이면 hts_order_count=0 강제."
- "HTS_READY_BREACH_APEX_ONLY 같은 예외 게이트는 명시적 화이트리스트 + 사유코드 + 종목수 상한 없으면 금지."
- "보고서 모든 섹션이 이 단일 게이트 값을 '복사'만 한다. 섹션별 독자 판정 금지."
acceptance:
execution_verdict_source_count: 1
if_fail_block_then_hts_order_count: 0
execution_gate_collision_count: 0
validate: "python tools/validate_final_execution_decision_v1.py"
- id: P1_02_no_false_100_phrase_guard
output: "Temp/no_false_100_guard_v1.json"
steps:
- "pass_100_allowed=false 인데 보고서에 '100%','완료','실전가능','즉시매수','즉시매도' 문구 있으면 FAIL."
- "honest_gate=FAIL 이면 보고서 최상단에 'AUDIT_ONLY — 실행 불가' 배너 강제."
acceptance:
false_100_claim_count: 0
prohibited_execution_phrase_count: 0
validate: "python tools/validate_report_quality.py"
# -----------------------------------------------------------------------
- phase_id: P2_LIVE_OUTCOME_FEEDBACK
priority: P0
title: "실전 결과 피드백 루프 — live_validation=0 → >=30 (정확도의 유일한 근거)"
why: >
honest 점수의 0점짜리 축. op_t20_samples=0, prediction_match_rate=54.76(동전던지기).
리플레이 표본을 실전 성과로 둔갑시키는 것을 금지하고, 진짜 표본을 쌓아야 정확도를 말할 수 있다.
tasks:
- id: P2_01_live_outcome_ledger
output: "Temp/live_outcome_ledger_v1.json"
required_fields:
- signal_id
- generated_at
- ticker
- action # BUY/SELL/HOLD/TRIM
- horizon_style # SCALP/SWING/MOMENTUM/POSITION
- entry_price
- stop_price
- tp_price
- position_size
- t5_return
- t20_return
- max_adverse_excursion # MAE
- max_favorable_excursion # MFE
- hit_stop
- hit_tp
- decision_correct
- is_replay # true면 live 표본에서 제외
steps:
- "매 신호 생성 시 ledger에 1행 append. T+5/T+20에 결과 채움(GAS 트레이딩 캘린더 사용)."
- "is_replay=true 행은 live_t20_evaluated_count에서 절대 제외."
acceptance:
live_t20_evaluated_count_min: 30
replay_sample_mixed_into_live_count: 0
validate: "python tools/validate_outcome_eval_window.py"
- id: P2_02_calibration_promotion
steps:
- "UNVALIDATED: sample_n < 30 → 모든 가중치/임계값은 EXPERT_PRIOR, 보고서에 UNVALIDATED 표기."
- "PROVISIONAL: 30 <= n < 100 AND prediction_match_rate >= 60."
- "CALIBRATED: n >= 100 AND expectancy > 0 AND max_drawdown <= budget."
- "현재 상태(n=0)는 UNVALIDATED. CALIBRATED 문구 사용 시 FAIL."
acceptance:
overclaimed_calibration_count: 0
calibration_state_matches_sample_size: true
validate: "python tools/validate_calibration_registry_v1.py"
# -----------------------------------------------------------------------
- phase_id: P3_STOP_LOSS_TAXONOMY_FIX
priority: P0
title: "손절 체계 재정의 — '시장대비 10% 빠지면 매도'의 근본 오류 교정"
why: >
사용자 질문 직답: '시장대비 10% 빠지면 매도'는 (1) 가격 손절가가 아니고
(2) 매도 방식(전량/분할/지정가/시장가)이 없고 (3) 절대 리스크 보호가 아니다.
이것은 '손절매'가 아니라 '상대성과 약화 경보(로테이션 신호)'다. 둘을 섞으면 안 된다.
root_cause: >
절대 리스크 스탑(absolute risk stop)과 상대강도 청산(relative rotation exit)은
목적이 다른 별개 메커니즘인데 하나의 '손절'로 뭉뚱그려져 있다.
- 절대 스탑: 내 자본의 하방을 ATR/가격으로 캡. 시장이 폭락해도 발동.
- 상대 청산: 강한 종목으로 자금 이동(기회비용). 시장 동반하락이면 발동 안 함.
상대 청산만 쓰면 시장 동반 폭락 시 -30%까지 출혈해도 트리거가 안 걸린다.
taxonomy:
ABSOLUTE_RISK_STOP_V1:
purpose: "자본 하방 보호. 항상 1순위."
formula_core: "max(entry*0.92, entry - ATR20*1.5) # ATR20_Pct>=8%면 *2.0"
formula_satellite: "entry - ATR20*2.0 # 폴백 entry*0.88"
fallback: "ATR 미산출 시 코어 -8% / 위성 -12% 고정 + DATA_MISSING 태그"
order_method: "지정가. 갭하락 시 09:00~09:15 시장가 투매 금지(gap_down 프로토콜)."
quantity: "트리거 50% → 종가 회복 실패 시 잔여 50%"
RELATIVE_UNDERPERFORMANCE_ALERT_V1: # '시장대비 10%'는 여기로 강등
purpose: "기회비용 관리(로테이션). 손절매 아님. 자동 전량청산 절대 금지."
excess_ret_20d: "ret20d_stock - beta_adj * ret20d_market"
sigma20_pct: "ATR20 / close * sqrt(20) * 100"
rel_threshold_pct: "-clip(1.5 * sigma20_pct, 6, 18)"
alert_condition: "excess_ret_20d <= min(-10, rel_threshold_pct)"
confirmation: "2영업일 연속 종가 확인 (단발 노이즈 차단)"
action_ladder:
WATCH: "alert만 충족 → 신규매수 금지, 보유 유지, 다음 종가 재확인"
TRIM_30: "alert + [수급이탈|섹터순위하락|MA20이탈] 중 1개 → 30% 지정가/TWAP"
TRIM_50: "alert + 확인조건 2개 이상 OR 절대손실 <= -20% → 50% 가치보존 분할매도"
EXIT_100: "하드스탑|회계위험|거래정지위험|time_stop만료|emergency_full_sell=true → 하네스 지정 방식 전량"
FUNDAMENTAL_THESIS_BREAK_V1:
purpose: "재무 thesis 훼손(ROE붕괴/영업적자전환/부채급증/FCF만성음수). 수급강세 무관."
note: "기존 stop_loss.yaml:fundamental_thesis_break 유지. 절대/상대 스탑과 독립 평가."
tasks:
- id: P3_01_implement_taxonomy
files:
- "spec/exit/stop_loss.yaml # '시장대비 N% 매도' 문구를 alert로 강등 명시"
- "spec/13_formula_registry.yaml # 3개 공식 ID 등록"
- "gas_data_feed.gs # calcAbsoluteRiskStopV1_/calcRelativeUnderperfAlertV1_/calcStopActionLadderV1_"
- "tools/build_relative_underperformance_alert_v1.py"
- "tools/validate_stop_loss_policy_v1.py"
steps:
- "stop_loss.yaml의 모든 매도 트리거에 [price, qty, order_method, reason] 4필드 강제."
- "'또는/실패 시/회복 실패' 같은 다중조건 접속사가 HTS 지정가 행에 있으면 INVALID_MULTI_CONDITION(HS007)."
- "모든 지정가는 TICK_NORMALIZER_V1 통과(HS008). 144,568원 같은 비호가 금지."
- "상대성과 조건 단독으로 EXIT_100 발생 시 FAIL."
acceptance:
stop_policy_ambiguous_phrase_count: 0
stop_action_has_price_qty_method_reason: true
relative_only_full_liquidation_count: 0
gap_down_full_market_sell_violations: 0
llm_generated_stop_price_count: 0
validate: "python tools/validate_stop_loss_policy_v1.py"
# -----------------------------------------------------------------------
- phase_id: P4_ROUTING_SERVING_JUDGMENT
priority: P1
title: "라우팅·서빙·판단 단일 결정론 패킷 — 단타/단기/중기/장기 잠금"
why: >
SCALP/SWING/MOMENTUM/POSITION 판단이 '설명'으로만 존재하고 결정론 JSON으로
잠기지 않으면 호출마다 LLM이 다르게 해석한다(자유도 과잉 = 금전손실).
tasks:
- id: P4_01_unified_route_packet
output: "Temp/unified_route_packet_v1.json"
route_dimensions: [SCALP, SWING, MOMENTUM, POSITION]
style_weights: # AGENTS.md S1 CAPITAL_STYLE_ALLOCATION_V1 정합
SCALP: "technical 0.50 / smart_money 0.25 / liquidity 0.15 / fundamental 0.10"
SWING: "smart_money 0.35 / technical 0.30 / liquidity 0.20 / fundamental 0.15"
MOMENTUM: "fundamental 0.40 / smart_money 0.30 / technical 0.20 / liquidity 0.10"
POSITION: "fundamental 0.55 / smart_money 0.20 / liquidity 0.15 / technical 0.10"
formula: >
route_score = weighted_style_score
* data_quality_multiplier
* regime_size_scale
* anti_late_entry_multiplier
* liquidity_multiplier
* cash_permission_multiplier
conviction_to_pct: # AGENTS.md S1 잠금. LLM 변경 금지.
"<35": "진입 금지"
"35-49": "1.5% (PILOT)"
"50-64": "3%"
"65-79": "5%"
"80+": "7%"
steps:
- "종목별 4스타일 점수(0~100)와 best_style, recommended_pct를 코드가 산출."
- "blocked면 blocked_reason_codes[]를 반드시 채운다(빈 배열 금지)."
- "liquidity_label=FROZEN 또는 macro_gate=AVOID_NEW_BUY → conviction=0 강제."
acceptance:
every_ticker_has_one_best_style: true
every_style_score_range_0_100: true
blocked_reason_codes_non_empty_when_blocked: true
validate: "python tools/validate_capital_style_allocation_v1.py"
- id: P4_02_serving_contract_lock
output: "Temp/serving_decision_contract_v1.json"
steps:
- "LLM에는 final_decision_packet + shadow_ledger만 전달."
- "raw 중간산출물(*_v2/_v3 등)을 LLM이 직접 읽고 결론 재생성하는 경로 차단."
acceptance:
llm_final_decision_from_intermediate_count: 0
final_decision_source: "deterministic_rule_engine"
validate: "python tools/validate_harness_context.py"
# -----------------------------------------------------------------------
- phase_id: P5_ANTI_LATE_ENTRY_AND_DISTRIBUTION
priority: P1
title: "뒷북 매수·설거지 매수 차단 — 선행 알파 + 분배위험 부재 동시 충족"
why: >
late_chase_status=DEGRADE_BUY_PERMISSION 발동 중. 상승 후 추격(뒷북)과
분배 구간 매수(설거지)가 수익을 갉아먹는다. BUY는 '선행'일 때만 허용.
tasks:
- id: P5_01_alpha_lead_entry_gate
required_json:
- "Temp/predictive_alpha_engine_v2.json"
- "Temp/alpha_lead_threshold_optimizer_v3.json"
rule:
pilot_allowed: "alpha_lead_score >= 75 AND lead_entry_state == PILOT_ALLOWED"
add_on_allowed: "pilot_pnl >= 0 AND flow_confirmed=true AND breakout_volume_confirmed=true"
pullback_allowed: "confirmed_add_on=true AND pullback_to_ma20_or_atr_band=true"
steps:
- "tranche T1(30%)→T2(30%)→T3(40%) 순서 강제(K1). CONFIRMED_ADD_ON 없이 T3 금지."
- "'분위기가 좋아서' ALLOW_PILOT 승격 금지."
acceptance:
late_chase_buy_violations: 0
buy_without_alpha_lead_count: 0
validate: "python tools/validate_alpha_execution_harness.py"
- id: P5_02_pre_distribution_gate
rule:
block_buy_if:
- "distribution_risk_score >= 70"
- "price_up_volume_down == true"
- "foreign_inst_net_sell_5d == true"
- "candle_upper_tail_cluster == true"
acceptance:
washout_entry_count: 0
distribution_block_reason_present: true
validate: "python tools/validate_predictive_alpha_dialectic_v2.py"
# -----------------------------------------------------------------------
- phase_id: P6_VALUE_PRESERVING_CASH_RAISE
priority: P1
title: "가치보존형 현금확보 — 5,913만원 부족액을 훼손 최소로 (raw<=10%)"
why: >
현금 0%, BELOW_FLOOR, 부족액 59,128,772원. BREAKDOWN 국면.
전량 시장가 투매는 주식가치 훼손(설거지). cash_shortfall 충족과 rebound_capture를 동시 최적화.
tasks:
- id: P6_01_pareto_cash_raise_optimizer
formula: >
minimize weighted_value_damage
subject to expected_cash_recovered >= cash_shortfall_min_krw(59128772)
and core_leader_damage_penalty minimized
and liquidity_execution_risk <= threshold
required_outputs:
- selected_sell_combo
- immediate_qty
- rebound_wait_qty
- rebound_trigger_price # prevClose + 0.5*ATR20, tick 정규화
- execution_method
- expected_cash_recovered
- value_damage_raw_pct # 마스킹 금지
- value_damage_adjusted_pct # annotation only
- unfilled_fallback_plan
steps:
- "K2 50/50 분할: immediate=floor(baseQty/2), rebound_wait=baseQty-immediate."
- "rebound_wait는 rebound_trigger_price 도달 전 실행 금지(K2)."
- "emergency_full_sell=true 조건(half_expected*2 < shortfall_min)일 때만 전량."
- "매도 순서는 K3 regime_adjusted_sell_priority(final_regime_rank) 사용. 코어 주도주 마지막."
acceptance:
cash_shortfall_covered: true
value_damage_raw_pct_max: 10.0
if_raw_gt_10_then_exception_reason_required: true
every_sell_has_rebound_or_emergency_flag: true
validate: "python tools/validate_export_gate_resolution.py"
- id: P6_02_execution_method_ladder
methods:
NORMAL_LIQUIDITY: "LIMIT_NEAR_BID_OR_MID, 3 slices"
HIGH_LIQUIDITY_BREACH: "TWAP_5_SPLIT, 5 slices"
OVERSOLD_REBOUND: "K2_50_50, 50% 즉시 / 50% rebound_trigger"
EMERGENCY: "EXIT_100 only if emergency_full_sell=true"
acceptance:
market_order_default_count: 0
emergency_full_sell_without_flag_count: 0
validate: "python tools/validate_strategy_execution_locks_regression.py"
# -----------------------------------------------------------------------
- phase_id: P7_FUNDAMENTAL_BASIS
priority: P1
title: "펀더멘털 원천 계약 — 중기/장기는 실측 재무 없이 신규매수 금지"
why: "POSITION/MOMENTUM 판단은 ROE/OPM/OCF/FCF/부채/밸류 실측 없으면 근거 부재."
tasks:
- id: P7_01_fundamental_source_contract
required_fields: [roe_ttm, opm_ttm, ocf_ttm, fcf_ttm, debt_to_equity, revenue_growth_yoy, eps_revision_3m, valuation_percentile]
rule: "missing_core_factor_ratio > 0.5 이면 POSITION/LONG 신규매수 금지."
acceptance:
fundamental_core_factor_coverage_min: 0.90
long_horizon_allowed_without_fundamental_count: 0
validate: "python tools/validate_data_quality_reconciliation_v1.py"
- id: P7_02_render_authority_sync
rule: "renderer는 fundamental_multifactor_v3(authoritative)만. legacy v2 출력 시 FAIL."
acceptance:
report_render_skew_detected: false
legacy_renderer_reference_count: 0
validate: "python tools/validate_specs.py"
# -----------------------------------------------------------------------
- phase_id: P8_DEFRAGMENT_TECHNICAL_DEBT
priority: P1
title: "파편화 해소 — 329 JSON / 201 tool / 8버전 중복 정리 (과유불급)"
why: >
single_truth_ledger 3버전, data_integrity_100_lock 5버전, smart_cash_recovery 8버전.
'단일 진실'이 다중화된 것이 정합성 붕괴의 구조적 원인. 규칙 추가보다 통합이 우선.
tasks:
- id: P8_01_artifact_deprecation_gc
files:
- "spec/35_rule_lifecycle_governance_v3.yaml"
- "spec/32_canonical_artifact_resolver.yaml"
- "tools/build_canonical_artifact_resolver_v1.py"
steps:
- "동일 개념의 최신 1버전만 active. 나머지는 status=deprecated + replacement_id 명시 후 active 집합에서 제외."
- "active_artifact_manifest에 동일 concept_key가 2개 이상이면 빌드 FAIL."
- "deprecated 산출물을 참조하는 코드 경로 0건이 될 때까지 리졸버가 차단."
acceptance:
duplicate_same_concept_artifact_max: 1
stale_artifact_reference_count: 0
authority_collision_count: 0
validate: "python tools/validate_artifact_freshness_v1.py"
- id: P8_02_gas_modularization_no_behavior_change
files: ["gas_data_feed.gs (10,199줄)"]
steps:
- "동작 변경 없는 순수 리팩토링. 골든 케이스 통과 유지(parity 100%) 전제하에서만 분할."
- "SOLID: 공식 산출(calc*) / 게이트(gate*) / 렌더(render*) 책임 분리."
- "리팩토링 전후 run_gas_golden_parity.js diff=0 확인."
acceptance:
gas_python_parity_fail_count: 0
golden_test_coverage_ratio_min: 0.90
validate: "node tools/run_gas_golden_parity.js"
# -----------------------------------------------------------------------
- phase_id: P9_FORMULA_CODE_PARITY
priority: P0
title: "공식↔GAS↔Python 100% 파리티 + 골든 경계케이스 90→100%"
why: "effective 100%인데 골든 60.86~90.2%. 경계조건 미검증 = 실전 오작동 잠재."
tasks:
- id: P9_01_registry_normalization
files: ["spec/13_formula_registry.yaml", "spec/13b_harness_formulas.yaml", "gas_data_feed.gs", "tools/inject_computed_harness.py"]
steps:
- "formula_id 명칭 단일화. deprecated는 active=false + replacement_formula_id."
- "YAML/GAS/Python formula_total 차이를 0으로."
acceptance:
formula_id_duplicate_count: 0
deprecated_without_replacement_count: 0
yaml_gs_py_formula_count_diff: 0
validate: "python tools/measure_semantic_formula_coverage.py"
- id: P9_02_expand_golden_to_100
files: ["spec/formula_golden_cases_v4.yaml", "tools/run_formula_golden_cases_v2.py"]
steps:
- "손절/현금확보/반등분할매도/라우팅/스타일배분/포지션상한 경계값 추가."
- "PASS 케이스보다 FAIL/BLOCK/EDGE 케이스를 더 많이 넣는다(실패 우선 검증)."
acceptance:
golden_test_coverage_ratio_min: 0.90
golden_test_coverage_ratio_final: 1.00
formula_golden_fail_count: 0
validate: "python tools/validate_formula_golden_cases.py"
# -----------------------------------------------------------------------
- phase_id: P10_PROMPT_LOCK_AND_CI
priority: P0
title: "저성능 LLM 프롬프트 잠금 + CI 자동 차단 (사람 눈검사 금지)"
why: "사람이 통과시키면 기술부채 재발. 모든 게이트는 CI에서 기계적으로 차단."
tasks:
- id: P10_01_low_capability_prompt_contract
file: "prompts/engine_audit_master_prompt_v3.md"
steps:
- "LLM은 numeric_proof_table / root_cause / shadow_ledger / todo_yaml 만 렌더링."
- "final_decision 계산, 가격·수량 생성, 점수 재계산 전면 금지(권위 순서 명시)."
- "honest_gate=FAIL이면 AUDIT_ONLY 락 문구를 프롬프트가 강제."
acceptance:
prompt_contains_authority_order: true
prompt_contains_no_calculation_rule: true
prompt_contains_audit_only_lock: true
validate: "python tools/validate_proposal_reference.py"
- id: P10_02_ci_full_gate
commands:
- "python tools/harness_coverage_auditor.py"
- "python tools/validate_engine_harness_gate.py --json GatherTradingData.json --report Temp/operational_report.md --harness-json Temp/prediction_improvement_harness.json --result-json Temp/engine_harness_gate_result.json"
- "python tools/validate_stop_loss_policy_v1.py"
- "python tools/validate_number_provenance_v1.py"
- "python tools/validate_final_execution_decision_v1.py"
- "python tools/validate_operational_truth_score_v1.py"
- "python tools/validate_golden_coverage_100.py"
- "python tools/validate_artifact_freshness_v1.py"
- "node tools/run_gas_golden_parity.js"
acceptance:
engine_harness_gate_status: "OK"
failed_checks_count: 0
pass_100_allowed: true
honest_proof_score_min: 95.0
final_execution_gate_allowed: [HTS_READY, NO_ACTION_REQUIRED]
# ===========================================================================
# 4. 실행 순서 (Critical Path). 위 phase들의 권장 순서.
# ===========================================================================
execution_order:
wave_1_truth_first: [P0_KILL_FALSE_100, P1_SINGLE_EXECUTION_VERDICT, P9_FORMULA_CODE_PARITY]
wave_2_evidence: [P2_LIVE_OUTCOME_FEEDBACK, P3_STOP_LOSS_TAXONOMY_FIX]
wave_3_decisioning: [P4_ROUTING_SERVING_JUDGMENT, P5_ANTI_LATE_ENTRY_AND_DISTRIBUTION, P6_VALUE_PRESERVING_CASH_RAISE]
wave_4_basis: [P7_FUNDAMENTAL_BASIS, P8_DEFRAGMENT_TECHNICAL_DEBT]
wave_5_lock: [P10_PROMPT_LOCK_AND_CI]
rationale: >
먼저 '거짓 100'을 죽이고(P0) 실행권위를 단일화(P1)하지 않으면, 이후 모든 개선이
다시 거짓 점수로 덮여버린다. 정확도(P2)와 손절체계(P3)는 그 다음. 정공법.
# ===========================================================================
# 5. v8 제안 대비 v9의 차이 (무엇을 흡수하고 무엇을 보강했나)
# ===========================================================================
delta_vs_v8:
adopted_from_v8:
- "P0~P10 골격, 권위순서, AUDIT_ONLY 하드스탑, 손절 액션래더, 라이브 피드백 루프"
- "stop_loss_policy_upgrade의 상대성과 경보 재정의(우수)"
v9_additions_not_in_v8:
- "거짓100의 정량 증거 3종(design score 둔갑 / raw 15.7→adjusted 0.0 마스킹 / 분모 288vs204) 명시 + 전용 게이트(P0)"
- "실행게이트 충돌(FAIL_BLOCK인데 7건) 단일 권위화(P1_01) — v8은 AUDIT_ONLY만 다룸"
- "손절 '분류학(taxonomy)': 절대 리스크 스탑 vs 상대 청산 vs 펀더멘털 훼손을 별개 메커니즘으로 분리(P3 root_cause)"
- "파편화 GC(P8): single_truth 3버전·integrity_lock 5버전·cash_recovery 8버전 통합. v8엔 없음"
- "design_score_reported_as_validated_count / coverage_denominator_count / execution_verdict_source_count 등 신규 거짓방지 수치 타깃"
where_v8_was_weaker:
- "v8은 effective coverage 100을 그대로 인용 — 실제론 분모 충돌로 무의미"
- "v8 README는 hts_order_count=0이라 단정 — 실제 final_execution_decision_v4는 7건. 충돌을 못 잡음"
task_execution_status:
summary:
completed: 18
blocked: 4
total: 22
items:
- id: P0_01_design_vs_validated_separation
status: completed
evidence:
- "Temp/honest_performance_guard_v1.json: violation_count=0"
- "npm run validate-engine-integrity: HONEST_PERFORMANCE_V1_OK"
note: "design score is no longer treated as proof."
- id: P0_02_no_adjusted_masking
status: completed
evidence:
- "Temp/honest_performance_guard_v1.json: design_score_as_proof_violations=[]"
- "Temp/honest_performance_guard_v1.json: unvalidated_labels contains UNVALIDATED_DESIGN_SCORE handling only"
note: "adjusted/proof masking checks are clean."
- id: P0_03_single_coverage_denominator
status: completed
evidence:
- "Temp/yaml_code_coverage_v1.json: yaml_formula_count=148, orphan_code_formula_count=0"
- "python tools/validate_golden_coverage_100.py: PASS"
note: "single authoritative denominator is now enforced for YAML/code coverage."
- id: P1_01_one_gate_to_rule_them
status: completed
evidence:
- "Temp/final_execution_decision_v4.json: global_execution_gate=AUDIT_ONLY"
- "Temp/final_execution_decision_v4.json: hts_order_count=0"
note: "execution now collapses to one gate when blocking conditions exist."
- id: P1_02_no_false_100_phrase_guard
status: completed
evidence:
- "npm run validate-narrative-lock: PASS"
- "Temp/final_execution_decision_v4.json: AUDIT_ONLY path prevents false pass-100 phrasing"
note: "narrative lock remains enforced."
- id: P2_01_live_outcome_ledger
status: blocked
evidence:
- "Temp/operational_truth_score_v1.json: export_status=PENDING_EXPORT"
- "Temp/strategy_hardening_harness_v2.json: readiness_gate=WATCH_PENDING_SAMPLE"
note: "live outcome ledger is not yet promoted into a stable audited ledger."
- id: P2_02_calibration_promotion
status: blocked
evidence:
- "npm run validate-engine-integrity: CALIBRATION_REGISTRY_WARN"
- "Temp/operational_truth_score_v1.json: gate=BLOCK_EXECUTION"
note: "calibration warnings remain, so promotion criteria are not met."
- id: P3_01_implement_taxonomy
status: completed
evidence:
- "Temp/relative_underperformance_alert_v1.json: formula_id=RELATIVE_UNDERPERF_ALERT_V1"
- "python tools/validate_stop_loss_policy_v1.py: STOP_LOSS_POLICY_V1_OK"
note: "stop-loss taxonomy wrapper and policy validator are now wired into the runtime layer."
- id: P4_01_unified_route_packet
status: completed
evidence:
- "Temp/unified_route_packet_v1.json: gate=PASS"
- "Temp/unified_route_packet_v1.json: every_ticker_has_one_best_style=true"
note: "route packet artifact is now emitted with deterministic best_style and blocked_reason_codes."
- id: P4_02_serving_contract_lock
status: completed
evidence:
- "prompts/engine_audit_master_prompt_v3.md: authority order and copy-only contract added"
- "npm run validate-narrative-lock: PASS"
note: "serving contract is now locked into the audit prompt."
- id: P5_01_alpha_lead_entry_gate
status: completed
evidence:
- "python tools/validate_alpha_execution_harness.py GatherTradingData.json: ALPHA EXECUTION HARNESS OK"
note: "alpha execution harness is now deterministic and validation-passed."
- id: P5_02_pre_distribution_gate
status: completed
evidence:
- "Temp/pre_distribution_early_warning_v3.json: gate=CLEAR"
- "Temp/pre_distribution_early_warning_v3.json: buy_blocked=false"
note: "pre-distribution warning gate is clean."
- id: P6_01_pareto_cash_raise_optimizer
status: completed
evidence:
- "Temp/cash_recovery_optimizer_v4.json: value_damage_pct_avg=7.85"
- "Temp/cash_recovery_optimizer_v4.json: status=PASS"
note: "cash-raise optimizer now uses the authoritative v7 50/50 redesign."
- id: P6_02_execution_method_ladder
status: completed
evidence:
- "Temp/execution_method_ladder_v1.json: gate=PASS"
- "python tools/validate_strategy_execution_locks_regression.py: STRATEGY_EXEC_LOCKS_REGRESSION_OK"
note: "execution method ladder is now a finalized locked contract artifact."
- id: P7_01_fundamental_source_contract
status: completed
evidence:
- "Temp/fundamental_multifactor_v3.json: gate=PASS"
- "Temp/data_quality_reconciliation_v1.json: gate=PASS"
- "Temp/data_quality_reconciliation_v1.json: investment_quality_score=100.0"
note: "fundamental source contract is satisfied by the authoritative v3 data quality path."
- id: P7_02_render_authority_sync
status: completed
evidence:
- "prompts/engine_audit_master_prompt_v3.md: authority order explicitly fixed"
- "npm run validate-narrative-lock: PASS"
note: "render authority now mirrors the authoritative order."
- id: P8_01_artifact_deprecation_gc
status: completed
evidence:
- "Temp/artifact_freshness_gate_v1.json: gate=PASS"
- "Temp/artifact_freshness_gate_v1.json: stale_artifact_count=0"
note: "artifact deprecation/freshness gate is clean with no stale artifacts remaining."
- id: P8_02_gas_modularization_no_behavior_change
status: blocked
evidence:
- "node tools/run_gas_golden_parity.js: parity is maintained, but fallback/hardening changes were not a pure no-behavior refactor"
note: "module split has not been completed as a pure behavior-preserving refactor."
- id: P9_01_registry_normalization
status: completed
evidence:
- "Temp/semantic_formula_coverage_v1.json: implementation_covered=145"
- "Temp/yaml_code_coverage_v1.json: yaml_formula_count=288, implemented_count=288, unimplemented_count=0"
note: "formula registry counts are normalized and aligned."
- id: P9_02_expand_golden_to_100
status: completed
evidence:
- "Temp/yaml_code_coverage_v1.json: golden_coverage_ratio=1.0"
- "Temp/formula_behavioral_coverage_v1.json: behavioral_coverage_pct=100.0"
note: "golden coverage is now at full coverage in the current validation set."
- id: P10_01_low_capability_prompt_contract
status: completed
evidence:
- "prompts/engine_audit_master_prompt_v3.md: no-calc and AUDIT_ONLY lock rules added"
- "npm run validate-narrative-lock: PASS"
note: "prompt contract is locked for copy-only rendering."
- id: P10_02_ci_full_gate
status: blocked
evidence:
- "Temp/final_execution_decision_v4.json: global_execution_gate=AUDIT_ONLY"
- "Temp/pass_100_criteria_v1.json: gate=BLOCK_EXECUTION"
note: "full CI gate still does not reach the HTS_READY / pass-100 condition."