diff --git a/suggest/factor_rfc_template.yaml b/suggest/archive/factor_rfc_template.yaml similarity index 100% rename from suggest/factor_rfc_template.yaml rename to suggest/archive/factor_rfc_template.yaml diff --git a/suggest/qedd_quant_engine_refactor_master_todo_20260610.yaml b/suggest/archive/qedd_quant_engine_refactor_master_todo_20260610.yaml similarity index 100% rename from suggest/qedd_quant_engine_refactor_master_todo_20260610.yaml rename to suggest/archive/qedd_quant_engine_refactor_master_todo_20260610.yaml diff --git a/suggest/quant_engine_qedd_refactor_todo_v1.yaml b/suggest/archive/quant_engine_qedd_refactor_todo_v1.yaml similarity index 100% rename from suggest/quant_engine_qedd_refactor_todo_v1.yaml rename to suggest/archive/quant_engine_qedd_refactor_todo_v1.yaml diff --git a/suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml b/suggest/archive/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml similarity index 100% rename from suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml rename to suggest/archive/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml diff --git a/suggest/quant_engine_hardening_todo_v9.yaml b/suggest/quant_engine_hardening_todo_v9.yaml deleted file mode 100644 index cfab77b..0000000 --- a/suggest/quant_engine_hardening_todo_v9.yaml +++ /dev/null @@ -1,819 +0,0 @@ -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." diff --git a/suggest/quant_engine_qedd_refactor_master_todo_20260607.yaml b/suggest/quant_engine_qedd_refactor_master_todo_20260607.yaml deleted file mode 100644 index dfd4ad7..0000000 --- a/suggest/quant_engine_qedd_refactor_master_todo_20260607.yaml +++ /dev/null @@ -1,1102 +0,0 @@ -schema_version: quant_engine_qedd_refactor_master_todo.v2 -document_type: downloadable_yaml_refactor_playbook -language: ko-KR -created_at_kst: '2026-06-07T15:55:00+09:00' -plan_id: QEDD-QUANT-ENGINE-REFACTOR-20260607 -title: 저성능 LLM도 동일 결과를 내는 계약우선·증거주도 퀀트투자 엔진 리팩토링 TODO -executive_decision: - recommended_methodology: 'QEDD: Quant Evidence-Driven Development + Contract-First - Deterministic Engine' - one_sentence: spec가 계약을 정의하고, Python이 숫자를 계산하고, GAS는 수집/표시만 하며, Temp는 산출물만 담고, LLM은 - final packet을 복사·해설만 한다. - cold_verdict: 현재 구조는 방향성은 맞지만 GAS 대형화, 공식/도메인 파일 비대화, 중복 버전 가족, source_path 정합성 - 리스크를 더 엄격히 눌러야 장기 확장성이 생긴다. - north_star: 5억원 목표 자산 달성까지 주간 리밸런싱·수익방어·데이터정합성·검증가능성을 동시에 유지하는 운영 엔진 -business_constants: - target_asset_krw: 500000000 - default_investment_unit: weekly - mandatory_weekly_rebalancing_days: - - Saturday - - Sunday - mandatory_mid_month_review_days: - - 1 - - 11 - - 21 - cash_defense_rule: D+2 정산예정 현금은 즉시현금 방어선 충족으로 간주하되, 주문가능현금과 분리한다. - llm_numeric_authority: LLM은 가격, 수량, 점수, TP, SL, 게이트를 생성하지 않고 하네스 값을 복사·해설만 한다. -source_evidence: - source_zip: /mnt/data/data_feed.zip - source_zip_sha256: 59ae29ccdc2b843449410ad97adf5b4ea03a97196827e303349a5543f70d1238 - read_authority_files: - - AGENTS.md - - docs/doctrine.md - - runtime/active_artifact_manifest.yaml - - spec/40_final_decision_packet_contract.yaml - - spec/43_quant_factor_taxonomy.yaml - - spec/46_low_capability_execution_pack.yaml - - spec/41_release_dag.yaml - - spec/ownership_map.yaml - - package.json - agents_hard_rules_used: - - 가격·수량·TP·SL·점수는 공식 레지스트리와 하네스 산출값만 사용 - - 임의 계산·임의 가격·임의 수량·미등록 공식 금지 - - 하네스 결측은 DATA_MISSING으로만 표시 - - 차단 종목 산출값은 shadow ledger에 투명하게 기록 - - Python canonical first, GAS adapter second - - Temp는 런타임 산출물이며 직접 편집하지 않음 -observed_current_state: - repository_snapshot: - total_files: 1418 - requested_format_file_count_md_yaml_gs_py: 1037 - extension_counts: - .gs: 7 - .js: 1 - .json: 374 - .jsonl: 2 - .md: 38 - .ps1: 4 - .py: 827 - .yaml: 165 - requested_extension_counts: - .gs: 7 - .md: 38 - .py: 827 - .yaml: 165 - top_directory_counts: - tools: 353 - src: 328 - schemas: 165 - tests: 160 - runtime: 158 - spec: 122 - artifacts: 40 - governance: 25 - Temp: 18 - prompts: 9 - suggest: 9 - docs: 8 - examples: 8 - dist: 2 - AGENTS.md: 1 - largest_risk_files: - - path: gas_data_feed.gs - size_bytes: 470962 - - path: gas_data_collect.gs - size_bytes: 225777 - - path: spec/13_formula_registry.yaml - size_bytes: 180041 - - path: spec/13b_harness_formulas.yaml - size_bytes: 166900 - - path: Temp/operational_report.md - size_bytes: 237659 - duplicate_version_families_ge_3_count: 11 - duplicate_version_family_examples: - - count: 6 - directory: artifacts/archive/2026-06-06 - family: smart_cash_recovery_vX - extension: .json - examples: - - artifacts/archive/2026-06-06/smart_cash_recovery_v3.json - - artifacts/archive/2026-06-06/smart_cash_recovery_v4.json - - artifacts/archive/2026-06-06/smart_cash_recovery_v5.json - - artifacts/archive/2026-06-06/smart_cash_recovery_v6.json - - artifacts/archive/2026-06-06/smart_cash_recovery_v7.json - - count: 4 - directory: tools - family: build_smart_cash_recovery_vX - extension: .py - examples: - - tools/build_smart_cash_recovery_v3.py - - tools/build_smart_cash_recovery_v4.py - - tools/build_smart_cash_recovery_v5.py - - tools/build_smart_cash_recovery_v6.py - - count: 3 - directory: tools - family: run_release_dag_vX - extension: .py - examples: - - tools/run_release_dag_v1.py - - tools/run_release_dag_v2.py - - tools/run_release_dag_v3.py - - count: 3 - directory: tools - family: build_pass_100_criteria_vX - extension: .py - examples: - - tools/build_pass_100_criteria_v1.py - - tools/build_pass_100_criteria_v3.py - - tools/build_pass_100_criteria_v4.py - - count: 3 - directory: tools - family: build_final_execution_decision_vX - extension: .py - examples: - - tools/build_final_execution_decision_v1.py - - tools/build_final_execution_decision_v2.py - - tools/build_final_execution_decision_v4.py - - count: 3 - directory: spec - family: formula_golden_cases_vX - extension: .yaml - examples: - - spec/formula_golden_cases_v2.yaml - - spec/formula_golden_cases_v3.yaml - - spec/formula_golden_cases_v4.yaml - - count: 3 - directory: artifacts/archive/20260606 - family: release_gate_summary_vX - extension: .json - examples: - - artifacts/archive/20260606/release_gate_summary_v1.json - - artifacts/archive/20260606/release_gate_summary_v2.json - - artifacts/archive/20260606/release_gate_summary_v3.json - - count: 3 - directory: artifacts/archive/2026-06-06 - family: smart_money_liquidity_evidence_gate_vX - extension: .json - examples: - - artifacts/archive/2026-06-06/smart_money_liquidity_evidence_gate_v2.json - - artifacts/archive/2026-06-06/smart_money_liquidity_evidence_gate_v3.json - - artifacts/archive/2026-06-06/smart_money_liquidity_evidence_gate_v4.json - - count: 3 - directory: artifacts/archive/2026-06-06 - family: prediction_accuracy_harness_vX - extension: .json - examples: - - artifacts/archive/2026-06-06/prediction_accuracy_harness_v2.json - - artifacts/archive/2026-06-06/prediction_accuracy_harness_v3.json - - artifacts/archive/2026-06-06/prediction_accuracy_harness_v4.json - - count: 3 - directory: artifacts/archive/2026-06-06 - family: final_execution_decision_vX - extension: .json - examples: - - artifacts/archive/2026-06-06/final_execution_decision_v1.json - - artifacts/archive/2026-06-06/final_execution_decision_v2.json - - artifacts/archive/2026-06-06/final_execution_decision_v3.json - package_script_count: 21 - runtime_snapshot: - active_manifest_formula_id: ACTIVE_ARTIFACT_MANIFEST_V2 - active_manifest_canonical_source: Temp/final_decision_packet_active.json - active_manifest_report_active_artifact_match_pct: 100.0 - active_manifest_authority_collision_count: 0 - active_manifest_stale_artifact_count: 0 - engine_harness_gate_status: OK - engine_harness_failed_checks_count: 0 - release_dag_steps_total: 20 - release_dag_steps_passed: 20 - final_execution_gate: AUDIT_ONLY - current_total_asset_krw: 424096398.0 - goal_krw: 500000000.0 - cash_shortfall_min_krw: 36092555.0 - cash_recovered_krw: 57841575.0 - market_regime: overheated_or_event_week - selected_horizon: MID - selected_strategy: SCALP_MID - t5_prediction_match_rate_pct: 54.76 - t5_prediction_sample: 312 - t20_live_sample: 0 - prediction_calibration_state: MONITOR - diagnosis: - - id: D01 - severity: P0 - finding: GAS 파일 수는 적지만 핵심 GAS 파일이 지나치게 크다. - risk: GAS에 판단 로직이 남을수록 Python canonical 원칙과 검증 재현성이 깨진다. - fix: GAS business logic inventory → Python formula migration → GAS thin adapter - validator를 release gate로 둔다. - - id: D02 - severity: P0 - finding: 공식/하네스 YAML이 비대해져 사람이 직접 리뷰하기 어렵다. - risk: 공식 ID·필드·소유권 충돌이 누적되어 작은 수정이 시스템 전체 판단을 흔든다. - fix: 도메인별 formula registry로 분할하고 normalized registry는 자동 생성한다. - - id: D03 - severity: P0 - finding: packet provenance source_path의 실재 여부를 별도 검증해야 한다. - risk: 숫자 provenance가 있어도 실제 파일이 없으면 감사와 재현이 불가능하다. - fix: validate_packet_source_paths_v1을 release DAG에 추가한다. - - id: D04 - severity: P1 - finding: 중복 버전 가족이 아직 남아 있다. - risk: 저성능 LLM과 운영자가 최신 v 파일을 추측해 다른 판단을 낼 수 있다. - fix: active/canonical/archive 수명주기와 manifest-only read rule을 강제한다. - - id: D05 - severity: P1 - finding: T+5 예측 일치율은 54.76% MONITOR이고 T+20 live sample은 0건이다. - risk: 수익률 개선 팩터를 active로 서두르면 뒷북매수와 설거지 리스크가 커진다. - fix: shadow-before-active, live/replay 분리, T+20 live 최소 표본 기준을 강제한다. - - id: D06 - severity: P1 - finding: final execution gate가 AUDIT_ONLY다. - risk: 엔진은 보고·감사 모드로 봐야 하며 자동 실행 엔진처럼 취급하면 위험하다. - fix: execution readiness, data maturity, live outcome sample을 충족하기 전까지 theoretical/order - simulation으로 제한한다. -target_methodology: - name: 'QEDD: Quant Evidence-Driven Development' - principles: - - 'Contract first: 새 기능은 spec/schema/golden/owner ledger가 먼저다.' - - 'Python canonical: 모든 숫자 계산은 Python pure function 또는 generated runtime에서 한다.' - - 'GAS thin adapter: GAS는 수집·정규화·내보내기·표시만 한다.' - - 'Manifest-only serving: runtime은 active_artifact_manifest가 가리키는 파일만 읽는다.' - - 'Packet-only LLM: LLM은 final_decision_packet_active를 복사·해설만 한다.' - - 'Shadow before active: 신규 팩터는 검증 표본 누적 전 실행 판단에 사용하지 않는다.' - - 'Live/replay separation: replay는 연구용, live는 승격용이다.' - - 'Provenance or missing: 출처 없는 숫자는 0이 아니라 DATA_MISSING이다.' - - 'Entropy budget: 문서와 파일을 늘리기 전에 중복을 제거한다.' - - 'Risk before alpha: 신규 매수보다 손실 제한·현금 방어·수익 보존이 우선이다.' - forbidden_patterns: - - LLM이 가격·수량·TP·SL·점수를 새로 계산 - - GAS에 decision/sizing/exit/risk score 로직 추가 - - Temp 구버전 v 파일을 사람이 직접 선택 - - 리플레이 성과를 라이브 검증처럼 표현 - - 문서 추가로 규칙 충돌을 덮기 - - warn_only 결과를 active 승격 근거로 사용 - - 결측 필드를 0 또는 평균값으로 무단 대체 - - 차단 종목의 산출값을 숨기거나 active 주문처럼 표현 -target_architecture: - allowed_dependency_direction: L0 -> L1 -> L2 -> L3 -> L4 -> L5/L6 -> L7 only - layers: - - layer: L0_objective_policy - canonical_paths: - - spec/01_objective_profile.yaml - - spec/risk/*.yaml - - spec/operating_cadence.yaml - owns: - - 목표금액 - - 현금 방어선 - - D+2 현금 인정 - - 리밸런싱 주기 - - 위험예산 - must_not_own: - - 개별 종목 가격 산출 - - 보고서 문장 - - layer: L1_data_contract - canonical_paths: - - spec/02_data_contract.yaml - - spec/12_field_dictionary.yaml - - spec/14_raw_workbook_mapping.yaml - - schemas/*.schema.json - owns: - - 필드명 - - 단위 - - freshness SLA - - provenance - - 결측 정책 - must_not_own: - - 투자판단 - - 수량 계산 - - layer: L2_formula_registry - canonical_paths: - - spec/formulas/domains/*.yaml - - spec/03_formulas/formula_registry.normalized.yaml - owns: - - 공식 ID - - 입력/출력 - - 임계값 - - golden cases - - owner - - lifecycle - must_not_own: - - 렌더 문구 - - GAS 표시 방식 - - layer: L3_python_canonical_engine - canonical_paths: - - src/quant_engine - - runtime/python/core/formulas/generated - owns: - - 수치 계산 - - 게이트 판정 - - 사이징 - - 손절/익절 - - 팩터 점수 - - risk budget cascade - must_not_own: - - 장문 보고서 문장 - - raw HTS 화면 처리 - - layer: L4_tools_cli - canonical_paths: - - tools/*.py - owns: - - build - - validate - - render - - package - - audit - - migration - must_not_own: - - 핵심 투자 알고리즘 로직 - - layer: L5_gas_adapter - canonical_paths: - - gas_*.gs - owns: - - collect - - normalize - - export - - display - must_not_own: - - decision - - sizing - - stop_loss - - take_profit - - risk_score - - layer: L6_runtime_artifacts - canonical_paths: - - runtime/active_artifact_manifest.yaml - - Temp/*.json - - artifacts/canonical - owns: - - 실행 산출물 - - active artifact - - shadow ledger - - lineage - must_not_own: - - 소스 규칙 - - 새 공식 - - layer: L7_llm_packet_renderer - canonical_paths: - - prompts/low_capability_report_renderer.md - - spec/46_low_capability_execution_pack.yaml - owns: - - 복사 전용 설명 - - 액션 테이블 - - DATA_MISSING 표시 - must_not_own: - - 하네스 판정 번복 - - 숫자 창작 -release_gates: - hard_blockers: - - gate: validate_active_manifest - target: authority_collision_count == 0 and stale_artifact_count == 0 - - gate: validate_packet_source_paths - target: missing_source_path_count == 0 - - gate: validate_specs - target: VALIDATION OK - - gate: validate_formula_owner - target: formula_owner_coverage_pct == 100 - - gate: validate_golden_coverage - target: golden_case_coverage_pct == 100 - - gate: validate_gas_thin_adapter - target: gas_business_logic_token_count == 0 - - gate: validate_renderer_no_calculation - target: renderer_calculation_count == 0 - - gate: validate_number_provenance - target: ungrounded_number_count == 0 - - gate: validate_live_replay_separation - target: live_replay_mix_count == 0 - - gate: validate_report_packet_sync - target: report_consistency_score == 100 - - gate: audit_repository_entropy - target: repository_entropy_gate == PASS - promotion_thresholds: - new_factor_shadow_min_trading_days: 20 - new_factor_t20_live_sample_min: 30 - prediction_match_rate_min_for_active_review_pct: 58.0 - execution_expectancy_min_pct: 0.0 - max_drawdown_regression_allowed_pct: 0.0 - late_entry_loss_regression_allowed: false - demotion_triggers: - - T+20 live expectancy <= 0 after minimum sample - - late_entry loss cases increase versus baseline - - provenance gap appears in active report - - owner/reviewer missing after registry sync - - GAS starts producing decision fields - - replay metrics mixed into live promotion gate -refactor_roadmap: -- phase_id: P0_FREEZE_AND_TRUTH_LOCK - title: 권위·숫자·렌더링 동결선 확정 - target_window: D0~D2 - why: 저성능 LLM, GAS, Python, 문서가 서로 다른 파일을 읽으면 수익률보다 먼저 신뢰성이 무너진다. - entry_conditions: - - data_feed.zip 최신본 확보 - - runtime/active_artifact_manifest.yaml 존재 - - Temp/final_decision_packet_active.json 존재 - exit_criteria: - - active_manifest_single_source_pct == 100 - - renderer_calculation_count == 0 - - direct_temp_reads_outside_manifest == 0 - - all numeric fields have provenance or DATA_MISSING marker - todos: - - id: P0-001 - action: AGENTS.md 읽기 순서를 runtime/active_artifact_manifest.yaml → manifest alias - → final_decision_packet_active로만 고정한다. - owner: architect - files: - - AGENTS.md - - runtime/active_artifact_manifest.yaml - method: 'AGENTS.md에는 버전 파일명을 직접 쓰지 말고 alias명만 둔다. 예: final_decision_packet_active.' - done: AGENTS.md와 active_manifest의 canonical_source가 동일하고 validate_active_manifest가 - 통과한다. - status: completed - - id: P0-002 - action: final_decision_packet_active 내부 provenance의 존재하지 않는 source_path를 검사한다. - owner: engineer - files: - - Temp/final_decision_packet_active.json - - tools/validate_packet_source_paths_v1.py - method: packet의 모든 source_path를 루트 기준으로 stat하고 누락 시 release 차단. Temp/active_artifact_manifest_v2.json처럼 - 실재하지 않는 경로는 runtime/active_artifact_manifest.yaml로 치환하거나 생성 근거를 보존한다. - done: missing_packet_source_path_count == 0 - status: completed - - id: P0-003 - action: 보고서 렌더러 계산 금지 가드를 release-DAG P0에 둔다. - owner: engineer - files: - - tools/validate_renderer_no_calculation_v1.py - - spec/40_final_decision_packet_contract.yaml - method: +, -, *, /, round, parseFloat, Math.* 등 계산 토큰이 renderer 계층에서 발견되면 실패. - 단 문자열 포맷팅은 허용. - done: renderer_calculation_count == 0 - status: completed - - id: P0-004 - action: 숫자 provenance 강제 규칙을 JSON Schema와 validator 양쪽에 둔다. - owner: data_owner - files: - - schemas/*.schema.json - - tools/validate_number_provenance_strict_v3.py - method: display_value, source_path, json_pointer, formula_id, input_hash, freshness_status - 필수화. 누락 숫자는 DATA_MISSING만 허용. - done: ungrounded_number_count == 0 - status: completed - - id: P0-005 - action: 저성능 LLM용 실행 컨텍스트를 1개 파일로 고정한다. - owner: pm - files: - - Temp/final_context_for_llm_v5.yaml - - spec/46_low_capability_execution_pack.yaml - method: executive, blockers, action_table, shadow_ledger, data_missing, education_notes - 순서를 고정하고 모든 숫자는 packet에서 복사한다. - done: validate_low_capability_pack 통과 - status: completed -- phase_id: P1_GAS_THIN_ADAPTER_MIGRATION - title: GAS 비즈니스 로직 제거 및 Python canonical 이전 - target_window: D3~D10 - why: 현재 GAS 파일은 7개뿐이나 gas_data_feed.gs 470KB, gas_data_collect.gs 225KB로 크다. GAS가 - 판단 로직을 품으면 검증성과 재현성이 급락한다. - exit_criteria: - - gas_decision_token_count == 0 - - gas_sizing_token_count == 0 - - python_formula_runtime_coverage_pct == 100 - - gas_adapter_contract_pass == true - todos: - - id: P1-001 - action: gas_*.gs를 collect/normalize/export/display 함수로 분류한다. - owner: gas_engineer - files: - - gas_*.gs - - spec/39_gas_thin_adapter_policy.yaml - method: 함수명, 주석, 토큰을 스캔해 decision/sizing/TP/SL/risk_score 단어가 있는 함수를 migration - 후보로 표시한다. - done: gas_business_logic_inventory.yaml 생성 - status: completed - - id: P1-002 - action: GAS 내 decision, sizing, stop, take_profit, risk score 계산을 Python 공식으로 - 이전한다. - owner: engineer - files: - - src/quant_engine - - runtime/python/core/formulas/generated - - spec/13_formula_registry.yaml - method: 공식 ID별로 Python pure function을 작성하고 golden case를 먼저 만든 뒤 GAS에서는 결과 JSON만 - 표시한다. - done: validate_gas_thin_adapter_v1 통과 - status: completed - - id: P1-003 - action: GAS 함수 호출 arity와 export schema만 남기는 어댑터 계약을 강화한다. - owner: gas_engineer - files: - - tools/validate_gas_call_arity.py - - spec/22_pipeline_runtime_contract.yaml - method: GAS 함수는 raw input → canonical field 변환 → JSON export까지만 허용. 판단 문자열 생성 - 금지. - done: validate-gas-call-arity 통과 - status: completed - - id: P1-004 - action: 대형 GAS 파일을 내부 모듈 경계별로 얇게 나누되 외부 배포 파일 수는 유지한다. - owner: architect - files: - - gas_data_feed.gs - - gas_data_collect.gs - method: 원본은 빌드 산출물로 보고 source fragment를 src/gas_adapter_parts 또는 tools/templates에 - 둔다. 단 사용자 요청 범위가 .gs 유지라면 생성 스크립트로 단일 파일을 빌드한다. - done: single deployed GAS bundle reproduces same hash from parts - status: completed - - id: P1-005 - action: GAS와 Python parity test를 추가한다. - owner: qa - files: - - tests/parity - - tools/validate_gas_python_parity_v1.py - method: 동일 input fixture에서 GAS export와 Python ingest 결과의 canonical field hash를 - 비교한다. - done: gas_python_canonical_hash_match_pct == 100 - status: completed -- phase_id: P2_FORMULA_REGISTRY_NORMALIZATION - title: 공식·팩터·필드 소유권 정규화 - target_window: D7~D21 - why: 공식 레지스트리가 180KB, harness formulas가 166KB 수준이면 사람이 직접 검토하기 어렵다. 공식은 도메인 분할 + - 통합 인덱스로 관리해야 한다. - exit_criteria: - - formula_owner_coverage_pct == 100 - - formula_golden_case_coverage_pct == 100 - - formula_registry_cross_reference_error_count == 0 - - deprecated_formula_runtime_read_count == 0 - todos: - - id: P2-001 - action: spec/13_formula_registry.yaml을 도메인 파일로 분할하고 normalized registry를 자동 생성한다. - owner: architect - files: - - spec/formulas/domains/*.yaml - - spec/03_formulas/formula_registry.normalized.yaml - - tools/build_formula_registry_sync_v1.py - method: risk, entry, exit, sizing, liquidity, fundamental, performance, rendering - 도메인별 소유 파일을 만들고 spec/13은 generated index로 둔다. - done: source_registry_hash == normalized_registry_hash_basis - status: completed - - id: P2-002 - action: 공식마다 owner, reviewer, lifecycle_state, activation_date, retirement_condition을 - 필수화한다. - owner: pm - files: - - spec/factor_lifecycle_registry.yaml - - spec/ownership_map.yaml - - governance/authority_matrix.yaml - method: owner 없는 공식은 shadow_only로 강등하고 active 사용 금지. - done: formula_owner_coverage_pct == 100 - status: completed - - id: P2-003 - action: 공식 단위 golden case를 도메인별로 최소 3개 확보한다. - owner: qa - files: - - tests/golden - - spec/formula_golden_cases_v*.yaml - method: normal, boundary, missing-data 케이스를 각각 생성. 회귀 케이스는 실거래 손실/이익 케이스를 anonymized - fixture로 보존. - done: golden_case_min_per_formula >= 3 - status: completed - - id: P2-004 - action: 출력 필드 writer owner ledger를 공식 registry와 동기화한다. - owner: engineer - files: - - spec/03_formulas/output_field_owner_ledger.yaml - - tools/validate_output_field_owner_ledger_v1.py - method: 한 필드에 writer가 2개 이상이면 precedence와 merge policy를 명시하지 않는 한 실패. - done: unresolved_writer_collision_count == 0 - status: completed - - id: P2-005 - action: 결측 데이터 정책을 공식별로 hard_missing, impute_allowed, shadow_only로 구분한다. - owner: data_owner - files: - - spec/02_data_contract.yaml - - spec/28_imputed_data_exposure_contract.yaml - method: 펀더멘털 핵심지표 결측은 confidence cap을 낮추고, 가격·수량 결측은 실행 차단한다. - done: imputed_data_exposure_gate == PASS - status: completed -- phase_id: P3_QUANT_FACTOR_LIFECYCLE_AND_ANTI_LATE_ENTRY - title: 퀀트 팩터 생애주기와 뒷북매수 방지 하네스 - target_window: D14~D35 - why: 현재 T+5 일치율은 54.76% MONITOR, T+20 라이브 표본은 0건이다. 승격은 성과가 아니라 증거로만 해야 한다. - exit_criteria: - - new_factor_shadow_days >= 20 - - operational_t20_sample >= 30 before active - - late_entry_loss_reduction_pct measured - - live_replay_mix_count == 0 - todos: - - id: P3-001 - action: 모든 신규 팩터를 shadow → evidence → active → retire 4단계로 통제한다. - owner: quant_pm - files: - - spec/43_quant_factor_taxonomy.yaml - - spec/factor_lifecycle_registry.yaml - method: hypothesis, horizon, decay_half_life, input_fields, formula_id, conflict_precedence, - activation_threshold, retirement_condition을 비우면 release 실패. - done: validate_factor_lifecycle_v1 통과 - status: completed - - id: P3-002 - action: Anti-late-entry score를 entry gate의 1차 차단자로 승격한다. - owner: quant - files: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - src/quant_engine - method: 가격 위치, 거래대금 클라이맥스, gap extension, 20D/60D 이격, 외국인·기관 동시분산, 뉴스 이벤트 이후 추격 - 여부를 점수화한다. - done: late_entry_block_reason appears in packet for every blocked BUY - status: completed - - id: P3-003 - action: 스마트머니·유동성은 방향성보다 지속성을 우선한다. - owner: quant - files: - - spec/strategy/smart_money_liquidity_gate_v1.yaml - method: 1일 급증은 경고 신호, 3/5/20일 누적과 가격 반응을 함께 통과해야 가점. 급등 후 음봉 대량거래는 distribution - risk로 전환. - done: flow_acceleration_without_price_confirmation_penalty active - status: completed - - id: P3-004 - action: 펀더멘털 팩터는 장기/중기에서만 가중치를 크게 두고 단타에서는 risk cap으로만 쓴다. - owner: quant - files: - - spec/strategy/fundamental_quality_v3.yaml - - spec/43_quant_factor_taxonomy.yaml - method: ROE, OPM, FCF, 부채, 이익추정 상향은 mid/long alpha에 반영. scalping에서는 부실기업 회피 필터로 - 제한. - done: horizon_weight_matrix has no cross-horizon leakage - status: completed - - id: P3-005 - action: 예측률은 active/passive, decisive/inconclusive, live/replay를 분리해 기록한다. - owner: qa - files: - - spec/44_live_replay_separation.yaml - - Temp/prediction_accuracy_harness_v2.json - method: T+1, T+5, T+20을 별도 집계하고 replay는 live 승격 기준에 사용 금지. - done: live_replay_mix_count == 0 - status: completed - - id: P3-006 - action: 수익을 지키는 profit-preservation gate를 매수보다 먼저 평가한다. - owner: quant - files: - - spec/profit_preservation_contract.yaml - - spec/exit/dynamic_value_preservation_sell_v3.yaml - method: 보유 종목의 drawdown, thesis break, distribution, cash floor breach를 먼저 처리한 - 뒤 신규 매수 여지를 계산한다. - done: sell_priority_table always precedes buy table when sell candidates >= 2 - status: completed -- phase_id: P4_DATA_COLLECTION_AND_MATURITY - title: 데이터 수집·정합성·성숙도 게이트 강화 - target_window: D21~D45 - why: 운영 정확도는 모델보다 데이터 정합성에서 먼저 깨진다. 특히 HTS 캡처, D+2 현금, 체결/미체결, 계좌 현금은 실행 판단의 하드 - 게이트다. - exit_criteria: - - schema_presence_score >= 99 - - missing_critical_field_count == 0 - - account_snapshot_contract_pass == true - - D_plus_2_cash_rule_tested == true - todos: - - id: P4-001 - action: account_snapshot 캡처 파싱 결과를 canonical schema로 강제한다. - owner: data_owner - files: - - spec/15_account_snapshot_contract.yaml - - tools/validate_account_snapshot_contract_v1.py - method: 종목코드, 보유수량, 평균단가, 평가금액, 현금, D+2, 미체결을 필수 필드로 두고 결측 시 실행 차단. - done: account_snapshot_required_field_coverage == 100 - status: completed - - id: P4-002 - action: D+2 현금은 즉시현금 방어선 충족으로 인정하되 주문 가능 현금과 분리 표시한다. - owner: risk_owner - files: - - spec/risk/portfolio_exposure.yaml - - spec/15_account_snapshot_contract.yaml - method: cash_defense_available = cash_now + D_plus_2_settlement_cash, buy_power_cash - = broker_available_cash. 두 값을 섞지 않는다. - done: cash_defense_rule_unit_test_pass == true - status: completed - - id: P4-003 - action: 외부 시장 데이터 freshness SLA를 필드 단위로 둔다. - owner: data_owner - files: - - spec/02_data_contract.yaml - - spec/12_field_dictionary.yaml - method: 가격/거래량은 당일, 재무는 최근 분기, 매크로는 발표일 기준으로 SLA를 명시하고 초과 시 confidence cap. - done: stale_critical_field_count == 0 or execution blocked - status: completed - - id: P4-004 - action: raw workbook mapping과 canonical field dictionary를 1:1로 검증한다. - owner: data_engineer - files: - - spec/14_raw_workbook_mapping.yaml - - spec/12_field_dictionary.yaml - method: workbook column alias가 canonical field로 resolve되지 않으면 build 실패. - done: unresolved_raw_mapping_count == 0 - status: completed - - id: P4-005 - action: 데이터 품질 점수는 보고용이 아니라 gate 입력으로 사용한다. - owner: architect - files: - - spec/data_quality/expectations.yaml - - src/quant_engine - method: missing critical, stale critical, imputed exposure, provenance gap을 execution - readiness의 축으로 반영. - done: data_quality_to_execution_gate_trace exists - status: completed -- phase_id: P5_RELEASE_DAG_AND_REGRESSION_SYSTEM - title: 릴리스 DAG, 회귀 테스트, 롤백 체계 고정 - target_window: D30~D60 - why: 좋은 알고리즘도 검증 순서가 흔들리면 운영에서는 나쁜 알고리즘이 된다. - exit_criteria: - - release_dag_steps_all_pass == true - - rollback_manifest_ready == true - - mutation_test_min_score >= 80 - - performance_regression_alert_active == true - todos: - - id: P5-001 - action: release DAG를 P0 hard stop → schema → formula → data → decision → render - → package 순서로 선형화한다. - owner: devops - files: - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - method: 앞 단계 실패 시 뒤 단계는 실행하지 않는다. warn_only는 release 승격에 사용하지 않는다. - done: release_dag_run_v1 has 0 failed steps - status: completed - - id: P5-002 - action: 회귀 fixture를 buy/hold/sell/avoid/reject/insufficient_data 별로 유지한다. - owner: qa - files: - - examples/*.yaml - - tests/regression - method: 과거 손실을 만든 케이스를 반드시 fixture화하고, 새 팩터가 이를 악화시키면 실패. - done: regression_case_coverage_by_action == 100 - status: completed - - id: P5-003 - action: shadow ledger를 active ledger와 분리한다. - owner: qa - files: - - spec/outputs/shadow_ledger_contract.yaml - - Temp/shadow_ledger*.json - method: 차단 종목의 산출값은 숨기지 않되, active order table과 혼입 금지. - done: blocked_value_visibility == true and blocked_order_count == 0 - status: completed - - id: P5-004 - action: rollback manifest를 매 release마다 생성한다. - owner: devops - files: - - runtime/rollback_manifest_v*.yaml - method: 변경 전후 파일 hash, active alias, migration script, reverse script를 보존한다. - done: rollback_restore_test_pass == true - status: completed - - id: P5-005 - action: repository entropy budget을 release gate로 둔다. - owner: architect - files: - - spec/release/repository_entropy_budget.yaml - - tools/audit_repository_entropy_v2.py - method: 파일 수, Temp JSON, package scripts, 문서 라인 수, duplicate family를 예산화한다. 초과 - 시 기능 추가보다 정리 우선. - done: repository_entropy_gate == PASS - status: completed -- phase_id: P6_REPORTING_AND_LOW_CAPABILITY_LLM_OPERATIONS - title: 저성능 LLM도 동일 결과를 내는 보고 체계 - target_window: D45~D75 - why: LLM 성능 차이를 줄이는 유일한 방법은 판단을 LLM 밖으로 빼고, LLM에는 순서·복사·금지어만 주는 것이다. - exit_criteria: - - low_capability_packet_contract_pass == true - - report_packet_sync_score == 100 - - unsupported_reason_count == 0 - - hallucinated_claim_count == 0 - todos: - - id: P6-001 - action: 보고서 프롬프트를 “복사 전용 렌더러”로 축소한다. - owner: pm - files: - - prompts/low_capability_report_renderer.md - - prompts/weekly_operational_report_master_prompt_v1.md - method: 가격·수량·점수 계산 금지, packet json_pointer 표시, DATA_MISSING 문구 고정. - done: validate_low_capability_report_renderer 통과 - status: completed - - id: P6-002 - action: action_table은 항상 주문 가능성, 근거, 수량, 가격, TP, SL, 차단사유를 모두 포함한다. - owner: report_owner - files: - - spec/07_output_schema.yaml - - spec/40_final_decision_packet_contract.yaml - method: 차단되어도 산출값은 shadow ledger에 보이고 active 주문 문구는 금지한다. - done: blocked_action_table_completeness_pct == 100 - status: completed - - id: P6-003 - action: 주간 토/일 리밸런싱, 매월 1/11/21 중간점검을 operating cadence에 고정한다. - owner: pm - files: - - spec/operating_cadence.yaml - method: 리포트 첫 섹션에 오늘이 리밸런싱/중간점검 대상일 때 필수 체크리스트를 삽입한다. - done: cadence_trigger_test_pass == true - status: completed - - id: P6-004 - action: 교육 섹션은 판단을 바꾸지 않고 용어와 근거만 설명한다. - owner: report_owner - files: - - spec/46_low_capability_execution_pack.yaml - method: 교육 문장은 action_table 뒤에 배치. 신규 매수 유도성 표현 금지. - done: education_section_has_no_new_numeric_claim == true - status: completed - - id: P6-005 - action: 보고서 JSON과 MD의 숫자 동기화를 검증한다. - owner: qa - files: - - tools/validate_report_numeric_consistency_guard_v2.py - - Temp/operational_report.json - - Temp/operational_report.md - method: MD의 숫자가 packet/report JSON provenance와 불일치하면 release 차단. - done: report_consistency_score == 100 - status: completed -low_capability_llm_todo_playbook: - purpose: 이 절만 보고도 낮은 성능의 LLM 또는 주니어 운영자가 동일한 판단 패킷/보고서를 만들도록 하는 실행 순서 - execution_rule: 순서를 바꾸지 않는다. pass/fail을 각 단계마다 남긴다. 모르는 숫자는 DATA_MISSING으로 둔다. - steps: - - id: LC-001 - action: 작업 시작 전 AGENTS.md의 최우선 원칙 5개를 소리내어 체크하듯 확인한다. - method: '읽을 파일: AGENTS.md. 금지: 가격/수량/공식 임의 생성.' - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-002 - action: runtime/active_artifact_manifest.yaml을 먼저 열고 canonical_source와 active_aliases를 - 기록한다. - method: 다른 Temp 파일을 직접 고르지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-003 - action: canonical_source 파일 존재 여부와 hash/provenance를 검사한다. - method: 없으면 DATA_MISSING — active artifact missing으로 중단. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-004 - action: Temp/final_decision_packet_active.json만 보고 executive, blockers, action_table, - shadow_ledger를 만든다. - method: 보고서 본문이나 구버전 v 파일에서 숫자를 복사하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-005 - action: spec/13_formula_registry.yaml에서 공식 ID 존재 여부만 확인하고 계산은 하지 않는다. - method: 공식 해석이 애매하면 DATA_MISSING. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-006 - action: spec/12_field_dictionary.yaml에서 필드 단위와 별칭을 확인한다. - method: 원/%, 주, 배 등 단위 혼동 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-007 - action: schemas 또는 output contract로 필수 섹션 누락 여부를 검사한다. - method: 누락 섹션은 임의 보완하지 않고 missing list에 기록. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-008 - action: governance/rules/*.yaml로 금지행동과 ordering rule을 확인한다. - method: 특히 sell candidate >= 2이면 sell priority table 우선. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-009 - action: 데이터 결측은 숫자 0으로 대체하지 않는다. - method: 결측 문구는 DATA_MISSING — 하네스 업데이트 필요. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-010 - action: D+2 현금은 cash defense에는 포함하고 주문 가능 현금과 분리한다. - method: 두 값의 provenance를 별도로 기록. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-011 - action: 신규 매수 판단 전 sell/profit-preservation/cash-floor gate를 먼저 평가한다. - method: 수익 방어가 신규 알파보다 우선. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-012 - action: BUY/SELL/HOLD/AVOID/REJECT는 packet의 gate를 그대로 복사한다. - method: LLM이 판정을 업그레이드/다운그레이드하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-013 - action: 차단 종목도 산출된 reference price, stop, take-profit, 수량이 있으면 shadow ledger에 - 표시한다. - method: active order로 오인되는 문구 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-014 - action: 투자기간은 scalping/short/mid/long 중 packet 값을 사용한다. - method: 펀더멘털이 좋다는 이유로 단타를 장기로 바꾸지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-015 - action: 스마트머니·유동성 신호는 가격확인, 지속성, 분산위험을 함께 설명한다. - method: 하루 급증만으로 매수 근거를 만들지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-016 - action: 펀더멘털 점수는 입력 데이터 품질과 함께 표시한다. - method: 결측 보정값이면 confidence cap을 표기. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-017 - action: 매크로 위험 scale이 있으면 신규 매수 수량 제한을 우선 반영한다. - method: 수량 계산은 하네스 값만 사용. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-018 - action: 예측 성과는 T+1/T+5/T+20과 live/replay를 분리해 표기한다. - method: replay 성과를 live 검증처럼 표현하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-019 - action: T+20 live sample이 activation 기준 미달이면 active 승격 금지라고 쓴다. - method: 기대수익률을 확정형으로 쓰지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-020 - action: 보고서 첫 섹션에는 portfolio health, hard blockers, 오늘 해야 할 일 TOP3를 둔다. - method: 교육 내용보다 실행 차단 사유가 앞선다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-021 - action: 토요일/일요일이면 주간 리밸런싱 체크리스트를 반드시 삽입한다. - method: 목표 비중, cash floor, concentration, sell priority 확인. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-022 - action: 매월 1/11/21이면 중간점검 체크리스트를 반드시 삽입한다. - method: 성과/리스크/데이터/하네스 drift 확인. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-023 - action: 주문 문장은 단일 조건으로 짧게 쓴다. - method: 다중 조건 접속사 기반 주문문 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-024 - action: tick normalization 결과가 없으면 가격 주문을 active로 쓰지 않는다. - method: 가격 단위 오류는 즉시 차단. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-025 - action: TP stale이면 TP 값을 삭제하거나 stale로 표시한다. - method: 오래된 익절가를 최신처럼 표현하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-026 - action: 현금 부족이면 cash recovery optimizer의 우선순위만 따른다. - method: 좋아 보이는 종목을 임의 매도하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-027 - action: 손절은 절대손실, 상대손실, thesis break, distribution을 구분한다. - method: 감정적 손절/존버 표현 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-028 - action: 목표금액 5억 대비 gap은 packet의 total_asset_krw와 goal_krw만으로 표시한다. - method: 목표 달성률을 새로 계산하지 말고 제공값이 있을 때만 사용. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-029 - action: 모든 숫자 옆에는 가능한 경우 formula_id 또는 source_path를 둔다. - method: 출처 없는 숫자는 삭제. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-030 - action: 섹터/종목 위성 추천은 하네스 후보가 있을 때만 표시한다. - method: 후보가 없으면 DATA_MISSING. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-031 - action: 출력 마지막에는 미해결 데이터, 다음 하네스 업데이트, release gate 상태를 둔다. - method: 사용자 행동과 엔진 행동을 분리. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-032 - action: 리팩토링 변경은 change_request_template으로 먼저 작성한다. - method: 직접 spec 수정 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-033 - action: 새 공식은 contract → schema → golden case → Python → GAS adapter → renderer - 순서로만 도입한다. - method: 역순 개발 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-034 - action: 테스트 실패는 문구로 완화하지 않는다. - method: failed는 failed로 보고한다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-035 - action: 중복 파일을 발견하면 active/canonical/archive 중 하나로 분류한다. - method: 최신 v 파일을 사람이 추측하지 않는다. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. - - id: LC-036 - action: 최종 산출물은 하나의 YAML TODO와 필요한 최소 파일 변경 목록으로 끝낸다. - method: 문서 증식 금지. - acceptance: 작업 로그에 pass/fail과 근거 파일을 1줄로 남긴다. -quant_engine_algorithm_policy: - strategy_stack_order: - - cash_floor_and_settlement_defense - - hard_stop_and_profit_preservation - - market_regime_and_macro_scale - - data_quality_and_maturity_gate - - horizon_routing - - anti_late_entry_gate - - fundamental_quality_gate - - smart_money_liquidity_gate - - position_sizing_and_integer_lot - - execution_method_ladder - - shadow_ledger_and_report_rendering - factor_policy: - scalping: 유동성, 호가, 변동성, 추격매수 방지, 당일 이벤트 리스크 중심. 펀더멘털은 부실 회피 필터로 제한. - short: 가격 모멘텀, 거래대금 지속성, 수급 누적, 리스크 캡 중심. 과열/분산위험 패널티 강함. - mid: 펀더멘털 개선, 이익추정, 섹터 상대강도, 스마트머니 지속성의 균형. - long: ROE/FCF/부채/시장지위/밸류에이션 안전마진 중심. 단기 수급은 진입 타이밍 보정용. - anti_late_entry_formula_components: - - price_extension_vs_20d_60d_ma - - gap_up_after_news_event - - volume_climax_zscore - - upper_tail_or_long_red_candle_after_climax - - foreign_institution_distribution_3d_5d - - relative_strength_deceleration - - risk_reward_after_stop_distance - profit_preservation_components: - - absolute_floor_stop - - relative_underperformance_stop - - thesis_break_detector - - distribution_sell_detector - - cash_floor_recovery_optimizer - - breakeven_ratchet - - trailing_take_profit -file_diet_policy: - rules: - - AGENTS.md는 헌법과 인덱스만 유지하고 장문 규칙은 governance/rules 또는 spec로 이동한다. - - spec/13_formula_registry.yaml은 사람이 편집하는 원본이 아니라 generated normalized index로 전환한다. - - Temp는 release마다 active/canonical/archive 정책으로 청소한다. - - suggest는 채택/폐기 상태를 명시하고 runtime에서 절대 읽지 않는다. - - tools는 CLI wrapper, src/quant_engine은 business logic으로 경계를 고정한다. - - package scripts는 public workflow만 남기고 내부 하위 단계는 release DAG node로 관리한다. - budgets: - max_total_files: 2000 - max_package_scripts: 50 - max_temp_json_files: 50 - max_duplicate_version_families_ge_3: 0 - max_agents_md_lines: 180 - max_single_human_authored_yaml_lines: 1500 - max_gas_business_logic_tokens: 0 - cleanup_order: - - Temp stale artifacts - - suggest superseded plans - - tools duplicate build_vN scripts - - spec duplicate golden case versions - - large generated files moved to dist/runtime with manifest -definition_of_done: - minimum_done_for_refactor_v1: - - active manifest가 단일 권위로 동작한다. - - final packet source_path가 모두 실제 파일로 해소된다. - - LLM renderer는 계산을 하지 않는다. - - GAS는 판단 로직을 보유하지 않는다. - - 공식 owner/reviewer/lifecycle이 100% 채워진다. - - golden case와 regression fixture가 release gate에 연결된다. - - 신규 팩터는 shadow-before-active 원칙을 통과한다. - - 보고서 숫자는 packet provenance와 100% 동기화된다. - - 저성능 LLM용 execution pack만으로 동일 액션 테이블을 재현한다. - not_done_even_if_tests_pass: - - T+20 live sample이 부족한데 active 수익성 주장 사용 - - GAS에 계산 로직 잔존 - - source_path 실재성 검증 부재 - - 중복 v 파일을 사람이 추측해 선택 - - owner 없는 공식이 active output에 관여 -recommended_next_7_days: -- day: D0 - tasks: - - validate_packet_source_paths_v1 추가 - - AGENTS.md manifest-only 문구 보강 - - renderer no-calc gate release DAG 연결 -- day: D1 - tasks: - - GAS business logic inventory 생성 - - gas_data_feed.gs 판단 토큰 위치 목록화 - - migration backlog 작성 -- day: D2 - tasks: - - formula owner coverage validator 추가 - - owner 없는 공식 shadow_only 강등 정책 적용 -- day: D3 - tasks: - - spec/13 formula registry 도메인 분할 설계 - - normalized registry builder 확정 -- day: D4 - tasks: - - anti-late-entry golden cases 추가 - - 과거 뒷북매수/설거지 사례 fixture화 -- day: D5 - tasks: - - low capability execution pack v5 생성 - - 보고서와 packet 숫자 동기화 검증 -- day: D6-D7 - tasks: - - release DAG 전체 strict 실행 - - rollback manifest 생성 - - entropy audit와 cleanup plan 확정 -change_request_template: - required_fields: - - cr_id - - title - - problem - - hypothesis - - affected_layers - - files_to_change - - new_or_changed_formula_ids - - data_fields - - golden_cases - - shadow_plan - - rollback_plan - - release_gates - - owner - - reviewer - approval_rule: P0/P1 변경은 owner와 reviewer가 모두 있어야 active 반영 가능 diff --git a/suggest/quant_engine_refactor_master_plan_20260607.yaml b/suggest/quant_engine_refactor_master_plan_20260607.yaml deleted file mode 100644 index ddb12db..0000000 --- a/suggest/quant_engine_refactor_master_plan_20260607.yaml +++ /dev/null @@ -1,1322 +0,0 @@ -schema_version: quant_engine_refactor_master_plan.v1 -plan_id: QER-MASTER-REFACTOR-2026-06-07 -language: ko-KR -created_at_kst: '2026-06-07T02:30:00+09:00' -scope: - allowed_file_types: - - .md - - .yaml - - .gs - - .py - - .json - - .schema.json - - .jsonl - user_requested_primary_artifact: downloadable_yaml - investment_domain: retirement_asset_quant_engine - objective: 5억원 목표 자산 형성을 위한 주간 단위 투자 엔진을 흔들림 없이 확장/고도화/검증/렌더링하는 구조로 재정렬 - non_goals: - - LLM이 가격·수량·TP·SL·점수를 임의 생성하는 구조 - - GAS에 투자판단·사이징·위험점수 로직을 남기는 구조 - - 문서 수 증가로 문제를 덮는 방식 - - 검증 실패를 운영 판단으로 우회하는 방식 -source_evidence: - source_zip: /mnt/data/data_feed.zip - source_zip_sha256: f5ce3c4c7f5b0f778a6bbcc967b0e764f2032efa809a3442e10d7c5a752b9095 - read_authority_files: - - AGENTS.md - - runtime/active_artifact_manifest.yaml - - governance/agents_index.yaml - - governance/rules/*.yaml - - spec/*.yaml - - package.json - - Temp/final_decision_packet_v4.json - - Temp/engine_harness_gate_result.json - - Temp/harness_coverage_audit.json - - Temp/repo_hygiene_report.json - observed_repository_metrics: - total_file_count: 1691 - extension_counts: - .gs: 7 - .js: 1 - .json: 728 - .jsonl: 2 - .log: 1 - .md: 42 - .ps1: 4 - .py: 749 - .txt: 6 - .yaml: 152 - top_directory_file_counts: - Temp: 401 - src: 303 - tools: 298 - schemas: 160 - tests: 159 - runtime: 154 - spec: 113 - artifacts: 35 - governance: 24 - .: 13 - prompts: 9 - docs: 8 - examples: 8 - suggest: 5 - dist: 2 - package_script_count: 190 - version_duplicate_group_count_detected: 109 - analysis_generated_files_excluded: true - notable_duplicate_groups: - - Temp/smart_cash_recovery_v3..v9 - - Temp/final_decision_packet_v1..v4 - - Temp/final_execution_decision_v1..v4 - - Temp/data_integrity_100_lock_v1..v5 - - tools/build_smart_cash_recovery_v3..v6 - - spec/formula_golden_cases_v2..v4 - observed_engine_metrics: - engine_harness_gate_status: OK - failed_checks_count: 0 - formula_total: 292 - effective_formula_coverage_pct: 100.0 - gas_only_coverage_pct: 58.56 - python_coverage_pct: 41.44 - true_missing_formula_count: 0 - output_field_coverage_pct: 100.0 - formula_owner_coverage_pct: 0.0 - unresolved_writer_collision_count: 0 - resolved_collision_count: 13 - prediction_match_rate_pct: 54.76 - golden_test_coverage_ratio: 0.6086 - packet_ungrounded_number_count: 0 - llm_numeric_generation_allowed: 0 - pass_100_gate: BLOCK_EXECUTION - pass_100_score_0_100: 50.0 - execution_readiness_gate: BLOCK_EXECUTION - execution_readiness_min_axis_score: 37.2 -cold_assessment: - current_state_grade: B+ for governance direction, C+ for operational maintainability, B for numerical discipline, C for - file entropy control - core_diagnosis: - - id: D01 - finding: AGENTS.md는 final_decision_packet_v3를 읽으라고 하지만 active_artifact_manifest.yaml은 canonical_source를 final_decision_packet_v2로 - 둔다. 동시에 v4 패킷도 존재한다. - risk: 저성능 LLM·운영자·스크립트가 서로 다른 패킷을 읽어 판단 드리프트가 발생할 수 있다. - required_fix: runtime/active_artifact_manifest.yaml 한 곳만 최종 권위로 두고 AGENTS.md 읽기 순서는 manifest alias로만 연결한다. - severity: P0 - - id: D02 - finding: 공식 커버리지는 effective 100%지만 GAS-only 58.56%, Python 41.44%로 분산되어 있다. - risk: GAS와 Python의 책임 경계가 조금만 흐려져도 같은 공식이 서로 다른 구현으로 갈라진다. - required_fix: Python canonical implementation을 active로, GAS는 collect/normalize/export/display thin adapter로 고정한다. - severity: P0 - - id: D03 - finding: formula_owner_coverage_pct가 0.0으로 관측된다. output field coverage는 100%이나 공식 owner/status 소유권이 비어 있다. - risk: 새 공식 도입·수정·폐기 시 책임자가 없어 하네스가 통과해도 방법론이 파편화된다. - required_fix: spec/ownership_map.yaml 또는 governance/authority_matrix.yaml에 formula_owner, status_owner, reviewer를 필수화한다. - severity: P0 - - id: D04 - finding: Temp와 tools에 버전 산출물이 과밀하다. 전체 파일 1692개 중 Temp 401개, tools 298개, version duplicate group 109개가 관측된다. - risk: 최신 파일을 잘못 고르는 사람이 실수하고, 저성능 LLM은 오래된 v 파일을 근거로 답할 가능성이 커진다. - required_fix: active/canonical/archive 세 구역으로 수명주기를 강제하고, runtime은 manifest에 등재된 파일만 읽는다. - severity: P0 - - id: D05 - finding: prediction_match_rate_pct 54.76, golden_test_coverage_ratio 0.6086, PASS_100 BLOCK_EXECUTION 상태로 관측된다. - risk: 실행 판단을 공격적으로 자동화하기에는 아직 예측력·검증력·실행 준비도 근거가 부족하다. - required_fix: 신규 팩터는 반드시 shadow -> evidence -> active 승격을 거치고, live/replay/backtest를 혼합하지 않는다. - severity: P1 - decision: 문서를 더 만들지 말고, 권위 파일을 줄이고, 공식·데이터·렌더링·GAS의 경계를 강제하는 release-DAG 중심 개발법으로 전환한다. -target_architecture: - name: Canonical Contract Driven Quant Engine - one_sentence: spec가 계약을 정의하고, Python이 숫자를 계산하고, GAS는 데이터를 모으고, Temp는 산출물만 담고, LLM은 packet을 읽어 설명만 한다. - layers: - - layer: L0_objective_policy - directory: spec/01_objective_profile.yaml, spec/risk/*.yaml - owns: - - 목표금액 - - 현금 방어선 - - D+2 현금 인정 - - 주간 리밸런싱 - - 1/11/21 중간점검 - - 위험예산 - must_not_own: - - 개별 종목 최신 가격 산출 - - layer: L1_data_contract - directory: spec/02_data_contract.yaml, spec/12_field_dictionary.yaml, spec/14_raw_workbook_mapping.yaml, schemas/*.schema.json - owns: - - 필드명 - - 타입 - - 단위 - - freshness SLA - - provenance - - 결측 정책 - must_not_own: - - 투자판단 - - layer: L2_formula_registry - directory: spec/13_formula_registry.yaml, spec/formulas/*.yaml - owns: - - 공식 ID - - 입력 필드 - - 출력 필드 - - 공식 버전 - - 허용 범위 - - golden cases - - owner - must_not_own: - - 실행 렌더 문구 - - layer: L3_python_canonical_engine - directory: src/quant_engine, runtime/python/core/formulas/generated - owns: - - 수치 계산 - - 게이트 판정 - - 사이징 - - 손절·익절 - - 팩터 스코어 - - risk budget cascade - must_not_own: - - 사용자에게 보여줄 장문 보고서 문장 - - layer: L4_tools_cli - directory: tools/*.py - owns: - - build - - validate - - render - - package - - audit - - migration - must_not_own: - - 핵심 투자 알고리즘 로직 - - layer: L5_gas_adapter - directory: gas_*.gs - owns: - - collect - - normalize - - export - - display - must_not_own: - - decision - - sizing - - stop_loss - - take_profit - - risk_score - - layer: L6_runtime_artifacts - directory: Temp/, runtime/active_artifact_manifest.yaml, artifacts/canonical - owns: - - 실행 산출물 - - active artifact - - shadow ledger - - lineage - must_not_own: - - 소스 규칙 - - layer: L7_llm_packet_renderer - directory: prompts/low_capability_report_renderer.md, spec/46_low_capability_execution_pack.yaml - owns: - - 숫자 재계산 없는 설명 - - 액션 테이블 표시 - - DATA_MISSING 표시 - must_not_own: - - 하네스 판정 번복 - - 가격/수량 창작 - allowed_dependency_direction: L0 -> L1 -> L2 -> L3 -> L4 -> L5/L6 -> L7 only - forbidden_dependency_direction: - - report -> formula - - GAS -> decision logic - - LLM -> numeric generation - - Temp artifact -> spec authority - - deprecated artifact -> active runtime -development_methodology: - method_name: Spec First + Harness First + Shadow Promotion + Manifest Only Runtime - operating_principles: - - principle: single_source_of_truth - rule: 모든 운영 숫자는 runtime/active_artifact_manifest.yaml이 가리키는 active artifact에서만 읽는다. - test: validate_active_manifest_consistency must PASS - - principle: no_llm_numeric_generation - rule: LLM은 가격·수량·TP·SL·점수·비중을 계산하지 않는다. packet 숫자를 설명하고 누락 시 DATA_MISSING만 출력한다. - test: validate_number_provenance_v1 and low_capability_response_contract must PASS - - principle: contract_before_code - rule: 새 팩터/게이트/리포트 필드는 spec -> schema -> golden case -> owner ledger -> Python -> GAS adapter 순으로만 추가한다. - test: validate_specs, validate_schema_model_generation, validate_golden_coverage_100 must PASS - - principle: shadow_before_active - rule: 신규 공식은 shadow로 최소 live T+20 30건 또는 지정 표본을 채운 뒤 active 승격한다. - test: rule_lifecycle transition requires change_request and evidence ledger - - principle: live_replay_separation - rule: live, paper, backtest, replay 성과는 서로 다른 source_type으로 저장하며 live 성과처럼 혼합 표시하지 않는다. - test: validate_live_replay_separation must PASS - - principle: delete_or_archive_over_document - rule: 문서 추가보다 중복 제거, manifest 연결, 오래된 버전 archive 이동을 우선한다. - test: audit_repository_entropy thresholds must PASS -algorithm_design_standard: - factor_pipeline_order: - - data_quality_gate - - market_regime_gate - - portfolio_risk_budget_gate - - per_ticker_factor_scores - - horizon_router - - entry_exit_gate - - sizing - - order_blueprint - - shadow_ledger - - packet_renderer - minimum_factor_contract: - required_fields: - - factor_id - - hypothesis - - horizon - - decay_half_life - - market_regime_applicability - - input_fields - - formula_id - - expected_edge_formula - - data_quality_requirements - - conflict_precedence - - position_sizing_impact - - exit_impact - - golden_cases - - shadow_start_date - - activation_threshold - - retirement_condition - - owner - - reviewer - - source_type_allowed - forbidden_fields: - - free_text_score_without_formula - - manual_price_override_without_provenance - - llm_estimated_quantity - score_normalization_standard: - score_range: 0..100 - confidence_cap: min(data_quality_score, evidence_score, calibration_score) - negative_evidence_policy: risk/exit gates dominate bullish factor scores - conflict_resolution_order: - - hard_block - - risk_budget - - data_quality - - exit_signal - - cash_floor - - expected_edge - - momentum - - fundamental - - narrative - anti_late_entry_standard: - purpose: 뒷북 매수와 설거지 매수를 구조적으로 차단 - required_signals: - - entry_timing_decile - - pullback_quality - - volume_price_confirmation - - distribution_risk - - relative_strength_persistence - - freshness_of_breakout - hard_blocks: - - price_extended_without_pullback - - distribution_risk_high - - no_liquidity_confirmation - - event_gap_after_chase - - stale_signal - activation_rule: shadow에서 late_entry_false_positive_rate가 기존 active 대비 20% 이상 개선되고, opportunity_loss가 허용범위 내일 때만 active - 승격 - risk_budget_standard: - goal: 수익률을 올리되 수익금을 지키는 엔진 - rules: - - cash_floor is hard constraint - - D+2 cash counts as immediate cash defense - - single_name_cap and cluster_cap are hard constraints - - profit_lock_ratchet is mandatory after defined gain threshold - - drawdown_guard overrides buy signals - outputs: - - position_scale - - cash_raise_plan - - sell_priority_table - - risk_budget_cascade - - expected_damage_if_hold - - expected_damage_if_sell -refactor_phases: -- phase_id: P0 - name: 권위 충돌 제거와 런타임 단일화 - timebox: 1 release cycle - entry_criteria: - - current zip extracted - - AGENTS.md read - - runtime/active_artifact_manifest.yaml exists - exit_criteria: - - active_manifest_canonical_source matches AGENTS read order - - only one active final_decision_packet alias - - deprecated final_decision_packet files moved to artifacts/archive or marked inactive - - validate_active_manifest_consistency PASS - tasks: - - T001 - - T002 - - T003 - - T004 - - T005 - - T006 -- phase_id: P1 - name: 공식 소유권과 수명주기 강화 - timebox: 1-2 release cycles - entry_criteria: - - P0 complete - exit_criteria: - - formula_owner_coverage_pct == 100.0 - - status_owner_coverage_pct == 100.0 - - every formula has lifecycle state - - changed formula requires change_request - tasks: - - T010 - - T011 - - T012 - - T013 - - T014 - - T015 -- phase_id: P2 - name: GAS thin adapter 전환 - timebox: 2-4 release cycles - entry_criteria: - - forbidden GAS business logic inventory exists - exit_criteria: - - forbidden_gas_logic_count == 0 or approved exceptions only - - GAS exports inputs and displays outputs only - - Python/GAS golden parity PASS - tasks: - - T020 - - T021 - - T022 - - T023 - - T024 - - T025 -- phase_id: P3 - name: 저성능 LLM 실행 패킷 고정 - timebox: 1 release cycle - entry_criteria: - - final_decision_packet schema stable - exit_criteria: - - low_capability_response_contract PASS - - all report numbers have provenance - - renderer_calculation_count == 0 - tasks: - - T030 - - T031 - - T032 - - T033 - - T034 -- phase_id: P4 - name: 팩터 연구·백테스트·라이브 승격 체계 - timebox: continuous - entry_criteria: - - factor taxonomy active - exit_criteria: - - new factor cannot become active without live/paper/backtest separation and shadow ledger - - prediction lift dashboard produced weekly - tasks: - - T040 - - T041 - - T042 - - T043 - - T044 - - T045 - - T046 -- phase_id: P5 - name: 문서/파일 다이어트와 릴리즈 DAG 압축 - timebox: 2 release cycles - entry_criteria: - - entropy audit baseline captured - exit_criteria: - - package_script_count reduced or grouped - - version_duplicate_groups under threshold - - Temp active files manifest-only - - docs under size budget - tasks: - - T050 - - T051 - - T052 - - T053 - - T054 - - T055 -atomic_todo: -- id: T001 - priority: P0 - title: active packet alias 확정 - instruction: runtime/active_artifact_manifest.yaml에 final_decision_packet_active alias를 추가하고, 값은 현재 운영에서 읽을 단 하나의 파일만 가리키게 - 한다. AGENTS.md의 직접 파일명은 alias 참조로 바꾼다. - files_to_touch: - - runtime/active_artifact_manifest.yaml - - AGENTS.md - - governance/agents_index.yaml - acceptance: - - AGENTS.md에 final_decision_packet_v2/v3/v4 직접 하드코딩이 없다 - - manifest active_count_per_formula remains 1 - - report_authority_diff_count == 0 - validation_commands: - - python tools/validate_specs.py - - python tools/validate_active_artifact_manifest_v1.py || python tools/build_canonical_artifact_resolver_v1.py -- id: T002 - priority: P0 - title: final_decision_packet 버전 수명 정리 - instruction: Temp/final_decision_packet_v1..v4 중 active alias가 아닌 파일은 artifacts/archive/YYYY-MM-DD로 이동하거나 superseded_by를 - 명시한다. Temp에는 active 산출물과 최신 validation 결과만 둔다. - files_to_touch: - - Temp/final_decision_packet_*.json - - artifacts/archive/ - - runtime/lineage_events.jsonl - acceptance: - - Temp final_decision_packet active file count == 1 - - archive manifest records moved files - - lineage event exists for each moved artifact - validation_commands: - - python tools/audit_repository_entropy_v1.py --root . --out Temp/repo_entropy_after_p0.yaml -- id: T003 - priority: P0 - title: 운영 리포트와 packet 점수 동기화 검사 추가 - instruction: operational_report.json의 PASS_100, execution_readiness, prediction fields가 final_decision_packet_active와 동일한지 - 비교하는 validator를 만든다. 불일치 시 FAIL_BLOCK_PUBLISH. - files_to_touch: - - tools/validate_report_packet_sync_v1.py - - package.json - - schemas/operational_report.schema.json - acceptance: - - PASS_100 score/gate mismatch 발견 시 exit_code != 0 - - full-gate에 validator 포함 - - renderer는 packet 값을 그대로 표시 - validation_commands: - - python tools/validate_report_packet_sync_v1.py --packet Temp/final_decision_packet_active.json --report Temp/operational_report.json -- id: T004 - priority: P0 - title: 숫자 provenance 차단 강화 - instruction: 보고서 모든 숫자에 source_path, json_pointer, formula_id, input_hash, freshness_status가 없으면 렌더 차단한다. - files_to_touch: - - spec/45_number_provenance_contract.yaml - - tools/validate_number_provenance_v1.py - - prompts/low_capability_report_renderer.md - acceptance: - - ungrounded_number_count == 0 - - LLM numeric_generation_allowed == 0 - - DATA_MISSING 처리 케이스 golden test 존재 - validation_commands: - - npm run validate-llm-freedom - - python tools/validate_number_provenance_v1.py -- id: T005 - priority: P0 - title: release DAG 단일 진입점 정리 - instruction: package.json 190개 스크립트 중 운영자가 직접 실행할 entrypoint를 release-gate, full-gate, quick-gate, package-only, daily-feedback-report로 - 제한하고 나머지는 내부 stage로 분류한다. - files_to_touch: - - package.json - - spec/41_release_dag.yaml - - tools/run_release_dag_v1.py - - README.md - acceptance: - - README 운영 명령이 5개 이하 - - run_release_dag_v1.py가 stage orchestration 담당 - - 중복 npm chain 제거 또는 internal namespace 이동 - validation_commands: - - npm run full-gate - - npm run release-gate -- id: T006 - priority: P0 - title: DATA_MISSING 표준화 - instruction: 하네스 결측은 어떤 보고서에서도 추정값으로 채우지 말고 DATA_MISSING — 하네스 업데이트 필요 형식으로만 렌더한다. - files_to_touch: - - spec/46_low_capability_execution_pack.yaml - - schemas/low_capability_response_contract_v3.schema.json - - prompts/low_capability_report_renderer.md - - tests/golden/*missing* - acceptance: - - 결측 golden case에서 임의 수치 0건 - - DATA_MISSING phrase exactly appears - - blocked metrics still visible in shadow ledger - validation_commands: - - python tools/validate_low_capability_response_contract_v3.py || npm run validate-report-quality -- id: T010 - priority: P0 - title: 공식 owner/status 필수화 - instruction: spec/13_formula_registry.yaml의 모든 formula_id에 owner, reviewer, lifecycle_state, status_owner, output_owner를 - 요구한다. 누락 시 validate_specs 실패. - files_to_touch: - - spec/13_formula_registry.yaml - - spec/ownership_map.yaml - - governance/authority_matrix.yaml - - tools/validate_formula_owner_coverage_v1.py - acceptance: - - formula_owner_coverage_pct == 100.0 - - missing_owner_list length == 0 - - missing_status_list length == 0 - validation_commands: - - python tools/validate_formula_owner_coverage_v1.py - - python tools/validate_specs.py -- id: T011 - priority: P0 - title: change_request 없는 공식 변경 금지 - instruction: formula registry, risk policy, decision flow 변경은 governance/change_requests/*.yaml에 근거가 없으면 차단한다. - files_to_touch: - - governance/change_request_template.yaml - - governance/rule_lifecycle.yaml - - tools/validate_change_request_coverage_v1.py - acceptance: - - changed_formula_without_change_request_count == 0 - - change_request has before/after/expected_effect/rollback_plan/evidence_required - validation_commands: - - python tools/validate_change_request_coverage_v1.py -- id: T012 - priority: P1 - title: golden case coverage 100 하드게이트 - instruction: 공식별 최소 buy/sell/hold/reject/insufficient_data/edge_case golden case를 강제한다. 현재 coverage ratio 0.6086 수준은 active - 승격 기준으로 부족하다. - files_to_touch: - - spec/formula_golden_cases_v4.yaml - - tests/golden/ - - tools/validate_golden_coverage_100.py - acceptance: - - golden_test_coverage_ratio == 1.0 - - decision-critical formulas have 5 scenario classes - - edge cases include stale data and missing provenance - validation_commands: - - python tools/validate_golden_coverage_100.py - - python tools/run_formula_golden_cases_v2.py -- id: T013 - priority: P1 - title: 공식 충돌 해결 테이블 고정 - instruction: output_field_owner_collision_v1에서 resolved collision 13건은 예외가 아니라 명시적 precedence table로 유지한다. 새 충돌은 실패 처리한다. - files_to_touch: - - spec/execution_authority_matrix_v2.yaml - - spec/xref_matrix.yaml - - tools/validate_output_field_owner_collision_v1.py - acceptance: - - unresolved_writer_collision_count == 0 - - resolved collisions have explicit precedence reason - - new collision causes FAIL - validation_commands: - - python tools/validate_output_field_owner_collision_v1.py -- id: T014 - priority: P1 - title: 공식 버전 deprecation policy - instruction: _vN 파일은 active, shadow, archived, retired 중 하나의 상태를 가져야 한다. 같은 formula family에서 active는 1개만 허용한다. - files_to_touch: - - governance/rule_lifecycle.yaml - - runtime/active_artifact_manifest.yaml - - tools/validate_formula_version_lifecycle_v1.py - acceptance: - - active_count_per_formula == 1 - - stale_artifact_count == 0 - - version_duplicate_group_count under configured threshold - validation_commands: - - python tools/validate_formula_version_lifecycle_v1.py - - python tools/audit_repository_entropy_v1.py --root . --out Temp/repo_entropy.yaml -- id: T015 - priority: P1 - title: ADR와 spec 연결 강제 - instruction: governance/adr/*.md는 반드시 변경한 spec 파일과 validation command를 참조해야 한다. 단순 의견 문서는 archive한다. - files_to_touch: - - governance/adr_index.yaml - - governance/adr/*.md - - tools/validate_adr_spec_links_v1.py - acceptance: - - ADR without touched_spec_count == 0 - - ADR index hash updated - - obsolete docs archived - validation_commands: - - python tools/validate_adr_spec_links_v1.py -- id: T020 - priority: P0 - title: GAS business logic inventory 확정 - instruction: gas_*.gs의 모든 함수에 allowed_responsibility 태그를 붙인다. decision/sizing/stop_loss/take_profit/risk_score는 forbidden으로 - 분류한다. - files_to_touch: - - tools/audit_gas_business_logic_v1.py - - Temp/gas_business_logic_audit_v1.json - - spec/39_gas_thin_adapter_policy.yaml - acceptance: - - function_inventory_coverage_pct == 100.0 - - forbidden_function_count is measured - - approved exceptions only runtime_report_rendering/data_collection_helpers - validation_commands: - - python tools/audit_gas_business_logic_v1.py --out Temp/gas_business_logic_audit_v1.json -- id: T021 - priority: P0 - title: GAS 의사결정 로직 Python 이전 - instruction: GAS에서 발견된 decision/sizing/stop/tp/risk 로직을 src/quant_engine/core 또는 runtime/python/core/formulas/generated로 - 이전하고 GAS는 해당 결과를 읽기만 한다. - files_to_touch: - - src/quant_engine/ - - runtime/python/core/formulas/generated/ - - gas_*.gs - - tools/validate_gas_thin_adapter_v1.py - acceptance: - - forbidden_gas_logic_count decreases every release - - Python/GAS parity golden cases PASS - - GAS adapter has no hard-coded risk thresholds - validation_commands: - - python tools/validate_gas_thin_adapter_v1.py - - node tools/run_gas_golden_parity.js -- id: T022 - priority: P1 - title: GAS 함수 arity/contract 고정 - instruction: GAS export 함수의 인자 수, 반환 shape, sheet key를 schema로 고정한다. - files_to_touch: - - schemas/generated/gas_adapter_contract.schema.json - - tools/validate_gas_call_arity.py - - gas_*.gs - acceptance: - - validate-gas-call-arity PASS - - all exported rows have schema - - no silent null returns - validation_commands: - - npm run validate-gas-call-arity -- id: T023 - priority: P1 - title: 데이터 수집과 판단 시점 분리 - instruction: collect timestamp, normalize timestamp, decision timestamp를 분리하고 freshness_status를 packet까지 전달한다. - files_to_touch: - - spec/02_data_contract.yaml - - spec/45_number_provenance_contract.yaml - - tools/build_data_freshness_sla_v1.py - - gas_data_collect.gs - acceptance: - - every numeric field has freshness_status - - stale TP removed - - freshness SLA violations block active decision - validation_commands: - - python tools/build_data_freshness_sla_v1.py - - python tools/validate_number_provenance_v1.py -- id: T024 - priority: P1 - title: HTS/account snapshot 계약 강화 - instruction: account_snapshot 필드, D+2 현금, 예수금, 평가금, 매수가능금액을 schema로 고정하고 파싱 결과와 하네스 입력을 reconciliation한다. - files_to_touch: - - spec/15_account_snapshot_contract.yaml - - spec/14_raw_workbook_mapping.yaml - - tools/validate_account_snapshot_contract_v1.py - acceptance: - - D+2 cash treated as immediate cash defense - - snapshot_parse_error_count == 0 - - cash defense line provenance exists - validation_commands: - - python tools/validate_account_snapshot_contract_v1.py -- id: T025 - priority: P2 - title: GAS deployment checklist 자동화 - instruction: Apps Script 반영 후 runHarnessRefresh_ 실행, proposal_reference_json 생성, strict gate 전환까지 체크리스트를 스크립트로 만든다. - files_to_touch: - - README.md - - tools/validate_proposal_reference.py - - tools/gas_deployment_checklist_v1.py - acceptance: - - proposal_reference strict PASS - - operator checklist has exact commands - - rollback step documented - validation_commands: - - npm run validate-proposal-reference:strict - - npm run full-gate:proposal-strict -- id: T030 - priority: P0 - title: packet-only renderer 구현 - instruction: 보고서 렌더러는 final_decision_packet_active의 필드만 읽는다. 계산식, fallback 계산, 임의 보간을 제거한다. - files_to_touch: - - tools/render_operational_report_json.py - - prompts/low_capability_report_renderer.md - - spec/46_low_capability_execution_pack.yaml - acceptance: - - renderer_calculation_count == 0 - - all sections map to packet json_pointer - - missing data renders DATA_MISSING - validation_commands: - - python tools/validate_renderer_contract_v1.py - - npm run validate-report-sync -- id: T031 - priority: P0 - title: 저성능 LLM 응답 순서 고정 - instruction: 응답은 executive -> blockers -> action_table -> shadow_ledger -> data_missing -> education_notes 순서만 허용한다. - files_to_touch: - - spec/46_low_capability_execution_pack.yaml - - schemas/low_capability_response_contract_v3.schema.json - - prompts/low_capability_report_renderer.md - acceptance: - - section order fixed - - blocked items still display price/SL/TP/qty if available - - unsupported reason count is explicit - validation_commands: - - python tools/validate_low_capability_response_contract_v3.py -- id: T032 - priority: P1 - title: 문장-숫자 cross-check - instruction: 마크다운 문장에 있는 숫자와 JSON packet 숫자가 다르면 publish 차단한다. - files_to_touch: - - tools/validate_report_numerical_sync_v1.py - - schemas/operational_report.schema.json - acceptance: - - numeric_text_mismatch_count == 0 - - percent/원/주 단위 normalization handled - - stale extracted number fails test - validation_commands: - - python tools/validate_report_numerical_sync_v1.py --report Temp/operational_report.json --packet Temp/final_decision_packet_active.json -- id: T033 - priority: P1 - title: LLM forbidden phrase and hallucination audit - instruction: 보고서에 “예상”, “아마”, “대략”, “추정”처럼 하네스 없는 수치 완화 표현이 있는지 검사한다. - files_to_touch: - - tools/validate_llm_narrative_template_lock_v1.py - - prompts/report_renderer_prompt.md - acceptance: - - hallucination_risk_phrase_count == 0 for action table - - soft language allowed only education_notes - - gate cannot be softened by narrative - validation_commands: - - npm run validate-narrative-lock -- id: T034 - priority: P2 - title: 표준 한국어 액션 문법 - instruction: BUY/SELL/TRIM/HOLD/AVOID는 하나의 주문문에 다중 조건 접속사를 넣지 않는다. 조건은 별도 행으로 분리한다. - files_to_touch: - - spec/03_order_grammar.yaml - - schemas/order_blueprint_v2.schema.json - - tools/validate_order_grammar_v1.py - acceptance: - - multi_condition_order_sentence_count == 0 - - tick normalization PASS - - sell candidate >=2 triggers sell priority table first - validation_commands: - - python tools/validate_order_grammar_v1.py -- id: T040 - priority: P1 - title: 팩터 연구 RFC 템플릿 - instruction: 새 팩터는 hypothesis, expected edge, decay half-life, source type, conflict precedence, golden cases가 없으면 등록 불가. - files_to_touch: - - spec/43_quant_factor_taxonomy.yaml - - governance/change_request_template.yaml - - suggest/factor_rfc_template.yaml - acceptance: - - new_factor_missing_contract_count == 0 - - factor has owner and retirement condition - - no factor enters active without shadow evidence - validation_commands: - - python tools/validate_factor_contract_v1.py -- id: T041 - priority: P1 - title: 예측력 lift 측정 표준화 - instruction: prediction_match_rate_pct만 보지 말고 baseline random, benchmark, sector neutral, transaction cost after slippage - 대비 lift를 기록한다. - files_to_touch: - - spec/17_performance_contract.yaml - - tools/build_prediction_lift_dashboard_v1.py - - Temp/continuous_evaluation_dashboard_v*.json - acceptance: - - prediction_lift_vs_baseline_ppt exists - - t5/t20/t60 horizon separated - - sample_count and confidence interval included - validation_commands: - - python tools/build_prediction_lift_dashboard_v1.py -- id: T042 - priority: P1 - title: late-entry anti-chase 하네스 강화 - instruction: 신규 진입 추천이 추세 막차/분배 구간/이벤트 갭 이후인지 검증하는 false-positive ledger를 만든다. - files_to_touch: - - spec/strategy/anti_late_entry.yaml - - tools/build_anti_late_chase_v6.py - - tests/golden/anti_late_entry_cases.yaml - acceptance: - - late_entry_false_positive_rate tracked - - chase_block_reason displayed - - opportunity_loss tracked separately - validation_commands: - - python tools/build_anti_late_chase_v6.py - - python tools/validate_alpha_execution_harness.py GatherTradingData.json --check anti_late_entry -- id: T043 - priority: P1 - title: 스마트머니/유동성 composite 분해 - instruction: smart_money_score와 liquidity_score를 거래대금, 수급 주체, 회전율, 가격충격, spread proxy로 분해하고 각자 provenance를 둔다. - files_to_touch: - - spec/formulas/smart_money_liquidity.yaml - - tools/build_smart_money_liquidity_composite_v4.py - acceptance: - - component_scores sum or weighted formula documented - - liquidity trap flag exists - - thin liquidity blocks large orders - validation_commands: - - python tools/build_smart_money_liquidity_composite_v4.py -- id: T044 - priority: P2 - title: 펀더멘털 quality raw evidence 분리 - instruction: PER/PBR/ROE/영업이익증가율/현금흐름/부채비율 등 원천값과 정규화 점수를 분리한다. - files_to_touch: - - spec/strategy/fundamental_quality_v4.yaml - - tools/build_fundamental_raw_evidence_v4.py - - schemas/generated/fundamental_quality.schema.json - acceptance: - - raw fundamental value provenance exists - - imputed data exposure displayed - - fundamental stale data blocks long-horizon upgrade - validation_commands: - - python tools/build_fundamental_raw_evidence_v4.py - - python tools/validate_imputed_data_exposure_v1.py -- id: T045 - priority: P2 - title: exit waterfall engine 강화 - instruction: 손절, 상대손절, 시간손절, 수익보호 ratchet, 분배 위험, 현금회복 필요를 하나의 precedence waterfall로 정렬한다. - files_to_touch: - - spec/exit/exit_waterfall.yaml - - tools/build_sell_waterfall_engine_v3.py - - tests/golden/sell_waterfall_cases.yaml - acceptance: - - exit reason precedence deterministic - - sell priority table always before 2+ sell candidates - - value_damage_if_hold/sell both shown - validation_commands: - - python tools/build_sell_waterfall_engine_v3.py - - npm run validate-cash-raise-route -- id: T046 - priority: P2 - title: 라이브/리플레이 승격 대시보드 - instruction: replay EV, paper EV, live EV를 같은 표에 두되 source_type과 승격 가능 여부를 분리한다. - files_to_touch: - - spec/44_live_replay_separation.yaml - - tools/build_performance_readiness_replay_bridge_v2.py - acceptance: - - live_t20_count displayed - - replay cannot unlock active Kelly - - 'promotion_rule enforced: live_t20_count >= 30' - validation_commands: - - python tools/build_performance_readiness_replay_bridge_v2.py -- id: T050 - priority: P0 - title: Temp 파일 정책 적용 - instruction: Temp는 빌드 산출물 전용이다. active runtime 파일, latest validation 파일, current report 외 오래된 json은 archive로 이동한다. - files_to_touch: - - spec/47_packaging_policy.yaml - - tools/clean_temp_artifacts_v1.py - - artifacts/archive/ - acceptance: - - Temp file count reduced under configured budget - - archived files have manifest and hash - - runtime consumers do not read archived paths - validation_commands: - - python tools/clean_temp_artifacts_v1.py --dry-run - - python tools/audit_repository_entropy_v1.py --root . --out Temp/repo_entropy.yaml -- id: T051 - priority: P1 - title: tools CLI 역할 분리 - instruction: tools/*.py를 build_, validate_, render_, migrate_, audit_ prefix로 분류하고 핵심 공식 로직은 src/quant_engine으로 이전한다. - files_to_touch: - - tools/ - - src/quant_engine/ - - spec/34_architecture_boundaries.yaml - acceptance: - - tools_core_logic_count == 0 - - all tools have argparse help - - all tools return machine-readable status - validation_commands: - - python tools/validate_architecture_boundaries_v2.py -- id: T052 - priority: P1 - title: 문서 다이어트 - instruction: README는 운영 entrypoint만, AGENTS는 헌법/읽기 순서만, 상세 규칙은 governance/rules와 spec으로 이동한다. prompt 장문은 dist compact pack으로 - 압축한다. - files_to_touch: - - README.md - - AGENTS.md - - prompts/*.md - - docs/*.md - - dist/*.yaml - acceptance: - - AGENTS.md under configured line budget - - README commands <= 5 - - prompt/spec drift validator PASS - validation_commands: - - python tools/validate_agents_shrink_v1.py - - python tools/validate_prompt_spec_sync_v1.py -- id: T053 - priority: P1 - title: package whitelist 정리 - instruction: prepare_upload_zip는 source_required, runtime_required, report_required, test_required만 포함하고 archive/temp noise를 - 제외한다. - files_to_touch: - - tools/prepare_upload_zip.py - - spec/47_packaging_policy.yaml - acceptance: - - zip contains no deprecated artifacts unless archive profile - - release zip reproducible hash stable - - package profile recorded - validation_commands: - - npm run prepare-upload-zip:release - - npm run prepare-upload-zip:quick -- id: T054 - priority: P2 - title: 자동 엔트로피 예산 - instruction: 파일 수, 중복 버전 그룹, scripts 수, Temp 파일 수, 문서 라인 수에 release budget을 둔다. 초과 시 package 차단. - files_to_touch: - - tools/audit_repository_entropy_v2.py - - spec/release/repository_entropy_budget.yaml - - package.json - acceptance: - - repository_entropy_gate == PASS - - new docs require retirement of old docs or ADR justification - - script count budget enforced - validation_commands: - - python tools/audit_repository_entropy_v2.py --root . --out Temp/repo_entropy_v2.json -- id: T055 - priority: P2 - title: compact/ultra compact bundle 동등성 - instruction: dist compact yaml과 full source가 같은 decision packet을 만들어내는지 equivalence test를 둔다. - files_to_touch: - - dist/*.yaml - - tools/validate_compact_bundle_equivalence_v1.py - acceptance: - - compact_bundle_equivalence == PASS - - low capability pack contains all required sections - - missing source link count == 0 - validation_commands: - - python tools/validate_compact_bundle_equivalence_v1.py -low_capability_llm_execution_protocol: - role: 저성능 LLM 또는 주니어 운영자가 그대로 따라야 하는 절차 - strict_order: - - step: S00_extract_and_identify - do: - - zip 압축 해제 - - AGENTS.md 읽기 - - runtime/active_artifact_manifest.yaml 읽기 - - manifest가 가리키는 active packet만 열기 - never: - - Temp에서 최신처럼 보이는 v파일을 임의 선택하지 않는다 - - step: S01_validate_before_reading_report - do: - - npm run full-gate 또는 python tools/run_release_dag_v1.py --mode full 실행 - - failed_checks가 0인지 확인 - - WARN_ONLY와 FAIL을 구분 - never: - - 검증 실패 상태에서 투자 액션을 확정하지 않는다 - - step: S02_collect_required_numbers - do: - - portfolio health - - cash floor - - D+2 cash - - PASS_100 gate - - execution readiness - - per ticker verdict - - order blueprint - - shadow ledger - - data missing list를 packet에서만 복사 - never: - - 계산기로 보정하거나 평균을 임의로 낸다 - - step: S03_render_fixed_sections - do: - - executive - - blockers - - action_table - - shadow_ledger - - data_missing - - education_notes 순서로 출력 - never: - - 하네스가 BLOCK한 주문을 말로 완화하지 않는다 - - step: S04_check_numbers_again - do: - - 모든 숫자의 source_path/json_pointer/formula_id를 확인 - - 숫자 단위 원/주/% 확인 - - stale 표시 확인 - never: - - provenance 없는 숫자를 남긴다 - - step: S05_publish_or_block - do: - - validator PASS면 publish - - validator FAIL이면 FAIL_BLOCK_PUBLISH와 고칠 파일/명령만 출력 - never: - - 부분 PASS를 운영 PASS로 표현하지 않는다 - minimal_command_sequence: - - python tools/validate_specs.py - - python tools/validate_golden_coverage_100.py - - python tools/validate_calibration_registry_v1.py - - python tools/validate_schema_model_generation_v1.py - - python tools/validate_gas_thin_adapter_v1.py - - python tools/validate_agents_shrink_v1.py - - npm run full-gate - - npm run validate-report-sync - response_contract: 모든 응답은 packet-only 숫자와 DATA_MISSING 표준을 사용한다. -release_quality_gates: - must_pass_before_operational_use: - - validate_specs - - validate_schema_model_generation - - validate_formula_owner_coverage - - validate_golden_coverage_100 - - validate_number_provenance - - validate_active_manifest_consistency - - validate_gas_thin_adapter - - validate_report_packet_sync - - validate_low_capability_response_contract - - full_gate - numeric_thresholds: - effective_formula_coverage_pct: 100.0 - true_missing_formula_count: 0 - formula_owner_coverage_pct: 100.0 - ungrounded_number_count: 0 - active_count_per_formula: 1 - authority_collision_count: 0 - renderer_calculation_count: 0 - live_t20_min_before_active_kelly: 30 - golden_test_coverage_ratio_for_active: 1.0 - prediction_lift_required_for_new_factor_pct_points: 3.0 - late_entry_false_positive_reduction_required_pct: 20.0 - publish_blockers: - - failed_checks_count > 0 - - unresolved_writer_collision_count > 0 - - formula_owner_coverage_pct < 100 - - ungrounded_number_count > 0 - - active packet alias mismatch - - LLM numeric_generation_allowed != 0 - - renderer_calculation_count > 0 - - GAS forbidden business logic without exception -file_diet_policy: - target_state: 소스는 적고, 계약은 명확하고, 산출물은 manifest로만 접근한다. - budgets: - AGENTS_md_max_lines: 120 - README_operational_commands_max: 5 - active_temp_final_packet_count: 1 - active_formula_version_per_family: 1 - prompt_files_active_max: 3 - package_operator_entrypoints_max: 5 - archive_rules: - - Temp의 오래된 v파일은 artifacts/archive/YYYY-MM-DD로 이동 - - artifacts/canonical에는 active가 아닌 참조용 canonical만 둔다 - - docs/adr는 결정 근거만 남기고 튜토리얼성 설명은 README나 runbook으로 병합 - - prompts는 low_capability, report_renderer, audit 세 종류로 축소 - - dist compact/ultra compact는 source와 equivalence test가 있을 때만 유지 -pm_operating_model: - cadence: - weekly: - - 토/일 리밸런싱 제안 전 full-gate 실행 - - prediction lift dashboard 갱신 - - late-entry false positive review - - cash defense check including D+2 cash - monthly_day_1_11_21: - - 중간점검 packet 생성 - - rule lifecycle review - - retire candidates review - - owner coverage audit - per_change: - - change_request 작성 - - shadow run - - golden case 추가 - - release gate 통과 후 active 승격 - roles: - quant_owner: 공식 가설, 기대수익, 승격/폐기 조건 승인 - data_owner: 필드, freshness, provenance, 결측 정책 승인 - engine_owner: Python canonical implementation과 validators 책임 - gas_owner: 수집/정규화/표시 adapter 책임 - report_owner: packet-only renderer와 저성능 LLM 응답 계약 책임 - release_manager: manifest, archive, package, DAG, gate 상태 책임 - definition_of_done: - - contract exists - - schema exists - - owner exists - - golden cases exist - - shadow evidence exists for new factor - - Python canonical implementation exists - - GAS is thin or exception recorded - - number provenance exists - - release gate PASS - - rollback path documented -recommended_immediate_sequence: -- '1) P0: active packet alias mismatch 해결' -- '2) P0: formula owner coverage 0%를 100%로 올리는 validator 추가' -- '3) P0: report-packet numeric sync validator 추가' -- '4) P0: Temp active artifact 1개 정책 적용' -- '5) P1: golden coverage 100%를 active 승격 기준으로 전환' -- '6) P1: GAS business logic inventory 후 Python 이관 순차 진행' -- '7) P1: 저성능 LLM packet-only renderer 고정' -- '8) P2: factor shadow/evidence/active 승격 대시보드 운영화' -success_definition: 저성능 LLM이 final_decision_packet_active와 이 YAML의 TODO만 읽어도, 고성능 LLM과 동일한 숫자·동일한 차단·동일한 액션 테이블·동일한 DATA_MISSING - 판단을 출력하면 성공이다. -task_execution_status: - summary: - completed: 36 - blocked: 0 - total: 36 - operational_ready: false - items: - - id: T001 - status: PASS - evidence: - - runtime/active_artifact_manifest.yaml canonical_source moved to final_decision_packet_active.json - - AGENTS.md reads Temp/final_decision_packet_active.json only - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict: PASS - - id: T002 - status: PASS - evidence: - - tools/build_final_decision_packet_v3.py and tools/build_final_decision_packet_v4.py now read Temp/final_decision_packet_active.json - - runtime/active_artifact_manifest.yaml removes v1/v2 precedence from active source routing - - python tools/run_release_dag_v1.py --mode release: PASS - - id: T003 - status: PASS - evidence: - - tools/validate_report_packet_sync_v1.py added - - package.json validate-report-packet-sync added - - tools/run_release_dag_v1.py release/full now includes the packet/report sync check - - python tools/validate_report_packet_sync_v1.py --packet Temp/final_decision_packet_active.json --report Temp/operational_report.json: PASS - - id: T004 - status: PASS - evidence: - - tools/render_operational_report.py now attaches numeric_provenance to numeric sections in the active report - - tools/validate_number_provenance_v1.py now checks the required source_path/json_pointer/formula_id/input_hash/freshness_status fields - - python tools/validate_number_provenance_v1.py: PASS - - id: T005 - status: PASS - evidence: - - package.json now exposes the five top-level ops:* entrypoints - - tools/validate_operator_entrypoints_v1.py added - - python tools/validate_operator_entrypoints_v1.py: PASS - - id: T006 - status: PASS - evidence: - - prompts/low_capability_report_renderer.md now forces DATA_MISSING — 하네스 업데이트 필요 - - spec/render/renderer_contract.yaml uses final_decision_packet_active.json and DATA_MISSING token - - id: T010 - status: PASS - evidence: - - python tools/validate_formula_owner_coverage_v1.py: PASS - - owner_coverage_pct=100.0 - - id: T011 - status: PASS - evidence: - - tools/validate_change_request_coverage_v1.py added - - python tools/validate_change_request_coverage_v1.py: PASS - - id: T012 - status: PASS - evidence: - - python tools/validate_golden_coverage_100.py: PASS - - golden_coverage_ratio=1.0000 - - id: T013 - status: PASS - evidence: - - python tools/validate_output_field_owner_collision_v1.py: PASS - - unresolved_writer_collision_count=0 - - id: T014 - status: PASS - evidence: - - tools/validate_formula_version_lifecycle_v1.py added - - python tools/validate_formula_version_lifecycle_v1.py: PASS - - id: T015 - status: PASS - evidence: - - tools/validate_adr_spec_links_v1.py added - - python tools/validate_adr_spec_links_v1.py: PASS - - id: T020 - status: PASS - evidence: - - tools/audit_gas_business_logic_v1.py now emits a full function inventory with allowed_responsibility tagging - - Temp/gas_business_logic_audit_v1.json records function_inventory_coverage_pct=100.0 - - python tools/audit_gas_business_logic_v1.py --out Temp/gas_business_logic_audit_v1.json: PASS - - id: T021 - status: PASS - evidence: - - python tools/audit_gas_business_logic_v1.py --out Temp/gas_business_logic_audit_v1.json: PASS (forbidden_function_count=0) - - python tools/validate_gas_thin_adapter_v1.py: PASS (forbidden_gas_business_logic_count=0) - - id: T022 - status: PASS - evidence: - - schemas/generated/gas_adapter_contract.schema.json added - - python tools/validate_gas_call_arity.py: PASS - - package.json validate-gas-call-arity script already wired - - id: T023 - status: PASS - evidence: - - tools/build_data_freshness_sla_v1.py added - - freshness_status is propagated from harness_context into the freshness SLA artifact - - python tools/build_data_freshness_sla_v1.py: PASS - - id: T024 - status: PASS - evidence: - - tools/validate_account_snapshot_contract_v1.py added - - python tools/validate_account_snapshot_contract_v1.py: PASS - - id: T025 - status: PASS - evidence: - - tools/gas_deployment_checklist_v1.py added as the operator-facing checklist wrapper - - python tools/gas_deployment_checklist_v1.py --mode release: PASS - - python tools/run_deployment_checklist_v1.py --mode release: PASS - - id: T030 - status: PASS - evidence: - - prompts/low_capability_report_renderer.md and spec/render/renderer_contract.yaml point to final_decision_packet_active.json - - python tools/validate_no_temp_runtime_read_v1.py: PASS - - python tools/validate_renderer_no_calculation_v1.py: PASS - - id: T031 - status: PASS - evidence: - - tools/validate_low_capability_response_contract_v3.py added - - python tools/validate_low_capability_response_contract_v3.py: PASS - - python tools/validate_renderer_section_order_v1.py: PASS - - id: T032 - status: PASS - evidence: - - tools/validate_report_numerical_sync_v1.py added - - python tools/validate_report_numerical_sync_v1.py: PASS - - id: T033 - status: PASS - evidence: - - tools/build_llm_narrative_template_lock_v1.py run on Temp/operational_report.json - - python tools/validate_prompt_formula_leak_v1.py: PASS - - id: T034 - status: PASS - evidence: - - tools/validate_order_grammar_v1.py added - - python tools/validate_order_grammar_v1.py: PASS - - id: T040 - status: PASS - evidence: - - suggest/factor_rfc_template.yaml added - - python tools/validate_factor_contract_v1.py: PASS - - id: T041 - status: PASS - evidence: - - tools/build_prediction_lift_dashboard_v1.py added - - python tools/build_prediction_lift_dashboard_v1.py: PASS - - id: T042 - status: PASS - evidence: - - tools/build_anti_late_chase_v6.py added - - python tools/build_anti_late_chase_v6.py: PASS - - id: T043 - status: PASS - evidence: - - tools/build_smart_money_liquidity_composite_v4.py added - - python tools/build_smart_money_liquidity_composite_v4.py: PASS - - id: T044 - status: PASS - evidence: - - tools/build_fundamental_raw_evidence_v4.py added - - python tools/build_fundamental_raw_evidence_v4.py: PASS - - python tools/validate_imputed_data_exposure_v1.py: PASS - - id: T045 - status: PASS - evidence: - - tools/build_sell_waterfall_engine_v3.py added - - python tools/build_sell_waterfall_engine_v3.py: PASS - - id: T046 - status: PASS - evidence: - - tools/build_performance_readiness_replay_bridge_v2.py added - - python tools/build_performance_readiness_replay_bridge_v2.py: PASS - - id: T050 - status: PASS - evidence: - - tools/clean_temp_artifacts_v1.py --apply archived release_gate_summary_v1/v2/v3.json - - artifacts/archive/20260606/temp_cleanup_manifest_v1.json written with hashes - - runtime consumers remain pointed at active artifacts only - - id: T051 - status: PASS - evidence: - - python tools/validate_tool_thin_wrapper_v1.py: PASS - - python tools/validate_architecture_boundaries_v2.py: PASS - - python tools/run_release_dag_v1.py --mode release: PASS - - tools/measure_yaml_gs_ps_coverage.py, tools/run_engine_audit_golden_cases_v1.py, and tools/run_integration_test_v1.py now route through src/quant_engine wrappers - - id: T052 - status: PASS - evidence: - - AGENTS.md is reduced to the core operating constitution and read order - - python tools/validate_agents_shrink_v1.py: PASS - - id: T053 - status: PASS - evidence: - - tools/prepare_upload_zip.py now trims Temp noise to the active whitelist - - python tools/validate_packaging_policy_v2.py --zip ..\data_feed.zip: PASS - - python tools/validate_packaging_policy_v1.py --zip ..\data_feed.zip --policy spec/47_packaging_policy.yaml: PASS - - id: T054 - status: PASS - evidence: - - spec/release/repository_entropy_budget.yaml added - - tools/audit_repository_entropy_v2.py added - - python tools/audit_repository_entropy_v2.py --root . --out Temp/repo_entropy_v2.json: PASS - - id: T055 - status: PASS - evidence: - - python tools/validate_compact_bundle_equivalence_v1.py: PASS diff --git a/suggest/quant_engine_refactor_master_todo.yaml b/suggest/quant_engine_refactor_master_todo.yaml deleted file mode 100644 index 5d81c02..0000000 --- a/suggest/quant_engine_refactor_master_todo.yaml +++ /dev/null @@ -1,866 +0,0 @@ -document: - id: quant_engine_refactor_master_todo_v1 - title: 저성능 LLM용 퀀트투자 엔진 리팩토링 마스터 TODO - version: 1.0.0 - created_at_kst: '2026-06-06T22:16:11+09:00' - language: ko-KR - purpose: 저성능 LLM이 TODO 상세리스트만 보고도 고성능 LLM과 동일한 방향의 퀀트투자 엔진 리팩토링 산출물을 만들 수 있도록 작업 절차, 금지사항, 검증 기준, 완료조건을 결정론적으로 고정한다. - core_methodology: 'QEDD: Quant Engine Deterministic Development' -top_level_goal: - from: LLM 판단형·문서 누적형·Temp 산출물 의존형 엔진 - to: 명세 주도형·공식 등록형·canonical artifact 기반·Python 결정론 계산형·GAS thin adapter 구조의 퀀트투자 엔진 - business_goal: 목표금액 5억 달성 과정에서 수익률을 추구하되, 수익금 방어·현금 방어선·하네스 검증·데이터 정합성을 우선하는 실전 운용형 엔진으로 전환한다. -non_negotiable_rules_for_low_capability_llm: -- LLM은 투자 판단자가 아니라 리팩토링 실행자다. -- 가격·수량·비율·점수·목표가·손절가·익절가를 새로 만들지 않는다. -- spec/13_formula_registry.yaml 또는 정규화된 formula_registry에 없는 formula_id를 만들지 않는다. -- Temp의 다중 버전 파일을 runtime source로 직접 사용하지 않는다. -- canonical_manifest에 지정된 파일만 runtime source로 인정한다. -- replay 성과를 live 성과처럼 표현하지 않는다. -- live T+20 표본 30건 미만이면 active 또는 PASS_100으로 승격하지 않는다. -- 검증 실패를 설명이나 문장으로 우회하지 않는다. -- 파일이 없거나 수치 출처가 없으면 DATA_MISSING으로 표시한다. -- GAS에 신규 투자 판단 로직을 추가하지 않는다. -- 프롬프트에 가격·수량·임계값 계산 지시를 추가하지 않는다. -- 하네스 FAIL 상태에서 주문표를 실행 가능 상태로 렌더링하지 않는다. -target_metrics: - formula_runtime_coverage_pct: 100 - formula_owner_coverage_pct: 100 - formula_output_field_owner_coverage_pct: 100 - ungrounded_number_count: 0 - prompt_formula_leak_count: 0 - gas_business_logic_count: 0 - runtime_temp_direct_read_count: 0 - deprecated_artifact_runtime_read_count: 0 - replay_live_mix_count: 0 - low_n_pass_count: 0 - active_without_live_t20_30_count: 0 - llm_generated_trade_numbers_count: 0 -todo_card_contract: - required_fields: - - priority - - objective - - read_files - - write_files - - exact_steps - - validation_commands - - acceptance_criteria - - forbidden_actions - - output_format - execution_rule: 각 TODO는 read_files를 먼저 확인하고, exact_steps만 수행한 뒤 validation_commands를 실행하고, acceptance_criteria 기준으로 PASS/FAIL/BLOCKED를 - 판단한다. -result_report_schema: - result: - todo_id: string - status: PASS | FAIL | BLOCKED - files_changed: - - string - validation_result: string - failed_reason: string | null - next_required_todo: string | null -master_execution_order: - phase_0_freeze: - - P0-001 - phase_1_constitution_and_authority: - - P0-002 - - P0-003 - - P0-004 - - P0-005 - phase_2_formula_truth: - - P0-006 - - P0-007 - - P0-008 - - P0-009 - phase_3_gas_boundary: - - P0-010 - - P0-011 - phase_4_formula_compiler: - - P1-001 - - P1-002 - - P1-003 - phase_5_report_and_llm_context: - - P1-004 - - P1-005 - phase_6_strategy_validation: - - P1-006 - - P1-007 - phase_7_release_gate: - - P1-008 - - P1-009 - phase_8_docs: - - P2-001 - - P2-002 -todos: - P0-001: - priority: P0 - objective: 리팩토링 전 현재 상태를 숫자로 고정한다. - read_files: - - AGENTS.md - - package.json - - spec/ - - prompts/ - - tools/ - - Temp/ - - GatherTradingData.json - write_files: - - Temp/refactor_baseline_inventory_v1.json - exact_steps: - - 전체 파일 수를 계산한다. - - 확장자별 파일 수를 계산한다. - - Temp 파일 수를 계산한다. - - .gs 파일별 라인 수와 전체 라인 수를 계산한다. - - tools/*.py 개수를 계산한다. - - spec/*.yaml 개수를 계산한다. - - prompts/*.md 개수를 계산한다. - - package.json scripts 개수를 계산한다. - - 결과를 JSON으로 저장한다. - validation_commands: - - python tools/validate_specs.py - - npm run lint-hygiene - acceptance_criteria: - - Temp/refactor_baseline_inventory_v1.json exists - - total_files > 0 - - temp_file_count > 0 - - gas_line_count_total > 0 - - python_tool_count > 0 - forbidden_actions: - - 파일 삭제 금지 - - 공식 수정 금지 - - AGENTS.md 수정 금지 - output_format: result_report_schema - P0-002: - priority: P0 - objective: AGENTS.md를 거대 규칙집에서 최상위 헌법으로 축소하기 위한 후보 파일을 만든다. - read_files: - - AGENTS.md - - spec/00_execution_contract.yaml - - spec/33_execution_precedence_lock.yaml - - spec/34_architecture_boundaries.yaml - - spec/35_rule_lifecycle_governance_v3.yaml - write_files: - - docs/proposed_AGENTS_constitution_v1.md - - docs/agents_rule_extraction_map_v1.yaml - exact_steps: - - AGENTS.md에서 Hard-Lock, 금지사항, 우선순위, 출력규칙을 분류한다. - - 중복 규칙을 하나의 rule_key로 묶는다. - - AGENTS.md에 남길 최상위 원칙 12개 이하만 추출한다. - - 세부 규칙은 spec 파일로 이동할 위치를 매핑한다. - - 원문 파일은 삭제하거나 직접 축소하지 않는다. - validation_commands: - - python tools/validate_specs.py - acceptance_criteria: - - docs/proposed_AGENTS_constitution_v1.md exists - - docs/agents_rule_extraction_map_v1.yaml exists - - constitution principle count <= 12 - - each extracted rule has target_spec_path - forbidden_actions: - - AGENTS.md 직접 축소 금지 - - 규칙 의미 변경 금지 - - 새 투자 공식 추가 금지 - output_format: result_report_schema - P0-003: - priority: P0 - objective: 동일 개념의 다중 버전 JSON 중 런타임에서 읽을 단일 canonical 파일을 지정한다. - read_files: - - spec/32_canonical_artifact_resolver.yaml - - Temp/ - write_files: - - artifacts/canonical_manifest.yaml - - artifacts/canonical/ - - artifacts/archive/ - exact_steps: - - spec/32_canonical_artifact_resolver.yaml의 canonical_versions를 읽는다. - - 각 개념별 canonical 파일명을 확인한다. - - canonical 파일을 artifacts/canonical/ 아래 안정 경로로 복사한다. - - deprecated 파일은 artifacts/archive/YYYY-MM-DD/ 아래로 복사한다. - - canonical_manifest.yaml에 concept, canonical_path, source_file, deprecated_files를 기록한다. - validation_commands: - - python tools/validate_specs.py - - python tools/build_canonical_artifact_resolver_v1.py - acceptance_criteria: - - artifacts/canonical_manifest.yaml exists - - each concept has exactly one canonical_path - - deprecated_files are not canonical_path - - canonical file exists for every active concept - forbidden_actions: - - Temp 원본 삭제 금지 - - canonical을 임의 선택 금지 - - 파일명이 최신 버전 같다는 이유만으로 선택 금지 - output_format: result_report_schema - P0-004: - priority: P0 - objective: 런타임 코드가 Temp의 다중 버전 산출물을 직접 읽지 못하도록 검사기를 준비한다. - read_files: - - tools/ - - package.json - - artifacts/canonical_manifest.yaml - write_files: - - tools/validate_no_temp_runtime_read_v1.py - - spec/38_runtime_artifact_read_policy.yaml - exact_steps: - - tools/*.py에서 'Temp/' 문자열 사용 위치를 검색한다. - - package.json scripts에서 Temp 입력 파일을 검색한다. - - '허용 목록을 만든다: build output, audit output, archive output.' - - '금지 목록을 만든다: decision input, report input, gate input.' - - runtime input으로 Temp/*.json을 읽으면 FAIL 처리한다. - - canonical_manifest 경유 입력이면 PASS 처리한다. - validation_commands: - - python tools/validate_no_temp_runtime_read_v1.py - acceptance_criteria: - - validator exits 0 only when runtime inputs use canonical manifest - - all violations include file path and line number - - allowed output writes are not falsely blocked - forbidden_actions: - - 전체 Temp 사용을 무조건 금지하지 말 것 - - build output과 runtime input을 혼동하지 말 것 - output_format: result_report_schema - P0-005: - priority: P0 - objective: deprecated artifact를 읽는 코드와 스크립트를 차단한다. - read_files: - - artifacts/canonical_manifest.yaml - - spec/32_canonical_artifact_resolver.yaml - - tools/ - - package.json - write_files: - - tools/validate_deprecated_artifact_read_v1.py - exact_steps: - - deprecated artifact 파일명 목록을 canonical_manifest에서 읽는다. - - tools/*.py와 package.json에서 해당 파일명을 검색한다. - - deprecated 파일이 입력으로 사용되면 FAIL 처리한다. - - deprecated 파일이 archive 또는 audit 설명에만 나오면 PASS 처리한다. - validation_commands: - - python tools/validate_deprecated_artifact_read_v1.py - acceptance_criteria: - - deprecated runtime read count == 0 - - violations contain path, line, artifact_name - forbidden_actions: - - deprecated 파일 삭제로 해결 금지 - - 문자열 이름 변경으로 우회 금지 - output_format: result_report_schema - P0-006: - priority: P0 - objective: 모든 공식에 owner, lifecycle, output field를 지정한다. - read_files: - - spec/13_formula_registry.yaml - - spec/35_rule_lifecycle_governance_v3.yaml - - spec/ownership_map.yaml - write_files: - - spec/03_formulas/formula_registry.normalized.yaml - - Temp/formula_owner_coverage_v1.json - exact_steps: - - spec/13_formula_registry.yaml의 모든 formula_id를 추출한다. - - 각 formula_id에 owner가 있는지 확인한다. - - 각 formula_id에 status가 있는지 확인한다. - - 각 formula_id에 output_fields가 있는지 확인한다. - - 누락된 항목은 임의 보완하지 말고 MISSING으로 기록한다. - - normalized 파일에는 기존 값을 그대로 복사하고 누락 필드는 TODO_REQUIRED로 표시한다. - validation_commands: - - python tools/validate_formula_runtime_registry_v1.py - - python tools/validate_golden_coverage_100.py - acceptance_criteria: - - formula_count > 0 - - owner_coverage_pct == 100 OR missing_owner_list is non-empty - - output_field_coverage_pct == 100 OR missing_output_field_list is non-empty - forbidden_actions: - - owner를 추측해서 채우지 말 것 - - 공식 의미를 변경하지 말 것 - output_format: result_report_schema - P0-007: - priority: P0 - objective: 동일 output field를 여러 공식이 쓰는 충돌을 차단한다. - read_files: - - spec/13_formula_registry.yaml - - spec/ownership_map.yaml - write_files: - - spec/03_formulas/output_field_owner_ledger.yaml - - tools/validate_output_field_owner_collision_v1.py - exact_steps: - - 모든 formula_id의 output field를 추출한다. - - field별 writer formula 목록을 만든다. - - writer가 2개 이상이면 precedence_required로 표시한다. - - precedence가 없으면 FAIL 처리한다. - - reader formula와 writer formula를 분리한다. - validation_commands: - - python tools/validate_output_field_owner_collision_v1.py - acceptance_criteria: - - unresolved_writer_collision_count == 0 - - each output field has one primary_writer - - multi_writer fields require explicit precedence - forbidden_actions: - - 충돌 field를 삭제하지 말 것 - - writer/reader를 혼동하지 말 것 - output_format: result_report_schema - P0-008: - priority: P0 - objective: 보고서·주문표·판단표의 모든 숫자에 source를 강제한다. - read_files: - - Temp/operational_report.json - - Temp/operational_report.md - - tools/validate_number_provenance_v1.py - - prompts/ - write_files: - - spec/06_output/number_provenance_contract.yaml - - tools/validate_number_provenance_strict_v2.py - exact_steps: - - operational_report.json의 숫자 필드를 전부 스캔한다. - - 각 숫자에 source_json, source_field, formula_id가 있는지 확인한다. - - 'markdown 보고서의 주문표 숫자에 [src: ...] 표기가 있는지 확인한다.' - - 없는 숫자는 INVALID_UNGROUNDED_NUMBER로 분류한다. - validation_commands: - - python tools/validate_number_provenance_v1.py - - python tools/validate_number_provenance_strict_v2.py - acceptance_criteria: - - ungrounded_number_count == 0 - - all trade action numbers have source_json - - all trade action numbers have formula_id - forbidden_actions: - - 숫자 삭제로 통과 금지 - - source를 임의 파일로 연결 금지 - output_format: result_report_schema - P0-009: - priority: P0 - objective: 프롬프트가 공식·임계값·가격·수량을 직접 만들지 못하게 한다. - read_files: - - prompts/ - - spec/13_formula_registry.yaml - write_files: - - tools/validate_prompt_formula_leak_v1.py - - Temp/prompt_formula_leak_audit_v1.json - exact_steps: - - prompts/*.md에서 원화 가격 패턴을 검색한다. - - 비율 임계값 패턴을 검색한다. - - '''계산'', ''산출'', ''조정'', ''약'', ''대략'', ''상황에 따라'' 문맥을 검색한다.' - - formula_id 인용 없이 숫자 산출을 지시하면 FAIL 처리한다. - - prompt는 renderer 역할만 하도록 수정 후보를 기록한다. - validation_commands: - - python tools/validate_prompt_formula_leak_v1.py - acceptance_criteria: - - prompt_formula_leak_count == 0 - - 'all prompts say: use only input JSON values' - forbidden_actions: - - 프롬프트에서 매수/매도 가격 계산 금지 - - 프롬프트에서 임계값 새로 정의 금지 - output_format: result_report_schema - P0-010: - priority: P0 - objective: GAS 파일에서 투자 판단 로직을 찾아 Python 이전 대상으로 분류한다. - read_files: - - gas_apex_alpha_watch.gs - - gas_apex_runtime_core.gs - - gas_data_collect.gs - - gas_data_feed.gs - - gas_harness_rows.gs - - gas_lib.gs - - gas_report.gs - write_files: - - Temp/gas_business_logic_audit_v1.json - - spec/34_architecture_boundaries.yaml - exact_steps: - - 'GAS 파일에서 다음 키워드를 검색한다: stop, loss, take, profit, cash, shortfall, buy, sell, score, weight, risk, target, quantity.' - - 각 위치를 collect, normalize, export, render, business_logic 중 하나로 분류한다. - - business_logic으로 분류된 함수는 Python 이전 후보로 기록한다. - - GAS에 남길 함수와 제거할 함수를 분리한다. - validation_commands: - - python tools/validate_gas_call_arity.py - acceptance_criteria: - - gas_business_logic_audit_v1.json exists - - each suspicious function has classification - - business_logic_count is measured - forbidden_actions: - - GAS 코드 즉시 삭제 금지 - - 함수명만 보고 판단하지 말고 본문 키워드 확인 - output_format: result_report_schema - P0-011: - priority: P0 - objective: GAS의 허용 책임을 수집·정규화·입출력으로 제한한다. - read_files: - - Temp/gas_business_logic_audit_v1.json - - spec/34_architecture_boundaries.yaml - write_files: - - spec/34_architecture_boundaries.yaml - - spec/39_gas_thin_adapter_policy.yaml - - tools/validate_gas_thin_adapter_v1.py - exact_steps: - - 'GAS 허용 함수 유형을 정의한다: collect, normalize, export, display.' - - 'GAS 금지 함수 유형을 정의한다: decision, sizing, stop_loss, take_profit, risk_score.' - - validate_gas_thin_adapter_v1.py가 금지 키워드와 함수 분류를 검사하게 한다. - validation_commands: - - python tools/validate_gas_thin_adapter_v1.py - acceptance_criteria: - - forbidden_gas_business_logic_count == 0 OR migration_plan exists - - all GAS exceptions are explicitly listed - forbidden_actions: - - GAS에서 신규 투자 공식 추가 금지 - output_format: result_report_schema - P1-001: - priority: P1 - objective: formula_registry에서 Python stub, schema, golden test를 자동 생성한다. - read_files: - - spec/13_formula_registry.yaml - - spec/formula_golden_cases_v4.yaml - write_files: - - tools/compile_formula_registry_v1.py - - runtime/python/core/formulas/generated/ - - tests/golden/generated/ - - schemas/generated/ - - Temp/formula_compile_report_v1.json - exact_steps: - - formula_registry를 읽는다. - - formula_id별 inputs, outputs, owner, status를 추출한다. - - 공식별 Python stub 파일을 생성한다. - - 공식별 golden test stub을 생성한다. - - 공식별 JSON schema fragment를 생성한다. - - formula_dependency_graph.json을 생성한다. - validation_commands: - - python tools/compile_formula_registry_v1.py --dry-run - - python tools/validate_formula_golden_cases.py - - python tools/validate_golden_coverage_100.py - acceptance_criteria: - - compile_report.status == OK - - generated_stub_count == active_formula_count - - golden_stub_count == active_formula_count - forbidden_actions: - - 공식 계산식을 임의 생성하지 말 것 - - stub은 NotImplemented 또는 기존 구현 연결만 허용 - output_format: result_report_schema - P1-002: - priority: P1 - objective: 공식 상태를 draft → candidate → shadow_only → advisory → active → deprecated → removed로 제한한다. - read_files: - - spec/35_rule_lifecycle_governance_v3.yaml - - spec/13_formula_registry.yaml - write_files: - - spec/00_governance/rule_lifecycle.yaml - - tools/validate_rule_lifecycle_strict_v1.py - exact_steps: - - 허용 status enum을 정의한다. - - active 승격 조건을 정의한다. - - shadow_only 최소 live T+20 표본 30건 조건을 정의한다. - - deprecated 공식이 runtime input에 사용되면 FAIL 처리한다. - - removed 공식이 문서 외부에서 참조되면 FAIL 처리한다. - validation_commands: - - python tools/validate_rule_lifecycle_policy.py - - python tools/validate_rule_lifecycle_strict_v1.py - acceptance_criteria: - - invalid_status_count == 0 - - active_without_live_t20_count == 0 - - deprecated_runtime_reference_count == 0 - forbidden_actions: - - sample 부족 공식을 active로 승격 금지 - - replay 성과만으로 active 승격 금지 - output_format: result_report_schema - P1-003: - priority: P1 - objective: 표본 부족 상태에서 PASS가 나오지 못하게 한다. - read_files: - - Temp/continuous_evaluation_dashboard_v1.json - - Temp/pass_100_criteria_v3.json - - Temp/algorithm_guidance_proof_v1.json - write_files: - - tools/validate_low_n_pass_gate_v1.py - - spec/37_evaluation_dashboard_contract.yaml - exact_steps: - - live T+20 표본 수를 읽는다. - - min_required와 current_live_t20을 비교한다. - - current_live_t20 < min_required이면 performance_ready는 FAIL이어야 한다. - - 이 상태에서 PASS_100 또는 active 승격이 있으면 FAIL 처리한다. - validation_commands: - - python tools/validate_low_n_pass_gate_v1.py - - npm run build-continuous-evaluation-dashboard-v1 - acceptance_criteria: - - low_n_pass_count == 0 - - live_t20_less_than_30 implies pass_100_allowed == false - forbidden_actions: - - pending 표본을 evaluated 표본으로 계산 금지 - - replay 표본을 live 표본으로 계산 금지 - output_format: result_report_schema - P1-004: - priority: P1 - objective: LLM 리포트 렌더링 입력을 final_context_for_llm 하나로 통합한다. - read_files: - - Temp/final_context_for_llm_v1.json - - Temp/final_context_for_llm_v2.json - - Temp/final_context_for_llm_v3.json - - Temp/operational_report.json - - artifacts/canonical_manifest.yaml - write_files: - - artifacts/canonical/final_context_for_llm.json - - schemas/final_context_for_llm.schema.json - - tools/validate_final_context_for_llm_v1.py - exact_steps: - - canonical_manifest에서 final_context_for_llm 최신 권위 버전을 확인한다. - - canonical/final_context_for_llm.json으로 안정 경로를 만든다. - - 리포트 렌더러는 이 파일만 읽게 한다. - - schema를 만들어 필수 필드를 고정한다. - validation_commands: - - python tools/validate_final_context_for_llm_v1.py - - python tools/validate_operational_report_contract.py - acceptance_criteria: - - renderer_input_count == 1 - - final_context_schema_status == OK - - deprecated final_context versions not used by renderer - forbidden_actions: - - LLM이 여러 Temp 파일을 직접 조회하게 하지 말 것 - output_format: result_report_schema - P1-005: - priority: P1 - objective: render_operational_report.py가 계산하지 않고 렌더링만 하도록 제한한다. - read_files: - - tools/render_operational_report.py - - spec/34_architecture_boundaries.yaml - write_files: - - tools/validate_renderer_no_calculation_v1.py - exact_steps: - - render_operational_report.py에서 산술 연산 위치를 검색한다. - - '허용: 문자열 포맷, 표 렌더링, null 표시.' - - '금지: 가격 계산, 수량 계산, 점수 계산, 게이트 재판정.' - - 금지 로직 발견 시 formula builder로 이전 후보를 기록한다. - validation_commands: - - python tools/validate_renderer_no_calculation_v1.py - acceptance_criteria: - - renderer_calculation_count == 0 - - renderer_gate_redecision_count == 0 - forbidden_actions: - - 렌더러에서 수치 보정 금지 - - 렌더러에서 누락값 대체 계산 금지 - output_format: result_report_schema - P1-006: - priority: P1 - objective: 새 전략 공식은 live 검증 전까지 주문 판단에 직접 반영하지 않는다. - read_files: - - spec/35_rule_lifecycle_governance_v3.yaml - - Temp/continuous_evaluation_dashboard_v1.json - - Temp/proposal_evaluation_history.json - write_files: - - spec/05_strategy/strategy_release_stage_policy.yaml - - tools/validate_strategy_release_stage_v1.py - exact_steps: - - 전략 공식을 draft, candidate, shadow_only, advisory, active로 분류한다. - - shadow_only 공식은 리포트에 참고값만 출력한다. - - advisory 공식은 주문표에 직접 수량을 만들 수 없다. - - active 공식만 final_execution_decision에 반영할 수 있다. - - live T+20 30건 미만이면 active 금지. - validation_commands: - - python tools/validate_strategy_release_stage_v1.py - acceptance_criteria: - - shadow_formula_execution_impact_count == 0 - - advisory_formula_direct_order_count == 0 - - active_formula_live_sample_violation_count == 0 - forbidden_actions: - - 성과 미검증 공식을 주문 수량에 반영 금지 - output_format: result_report_schema - P1-007: - priority: P1 - objective: replay 성과와 live 성과를 완전히 분리한다. - read_files: - - Temp/continuous_evaluation_dashboard_v1.json - - Temp/proposal_evaluation_history.json - - tools/build_continuous_evaluation_dashboard_v1.py - write_files: - - spec/37_evaluation_dashboard_contract.yaml - - tools/validate_replay_live_separation_v1.py - exact_steps: - - replay_record_count와 live_evaluated_t20을 별도 필드로 유지한다. - - replay 성과는 informational로만 표시한다. - - live_evaluated_t20 < 30이면 expectancy, win_rate, max_drawdown은 null이어야 한다. - - 리포트가 replay 성과를 실전 성과처럼 표현하면 FAIL 처리한다. - validation_commands: - - python tools/validate_replay_live_separation_v1.py - - npm run build-continuous-evaluation-dashboard-v1 - acceptance_criteria: - - replay_live_mix_count == 0 - - live_metrics_null_when_insufficient == true - forbidden_actions: - - replay 결과로 PASS_100 충족 금지 - output_format: result_report_schema - P1-008: - priority: P1 - objective: release gate가 항상 같은 순서로 실행되게 한다. - read_files: - - package.json - - spec/22_pipeline_runtime_contract.yaml - - spec/23_low_capability_llm_pipeline_todo.yaml - write_files: - - spec/00_governance/release_gate_sequence.yaml - - tools/validate_release_gate_sequence_v1.py - exact_steps: - - package.json의 release 관련 scripts를 읽는다. - - validate-specs, validate-data-sample, validate-gas-call-arity, full-gate, pass-100 관련 순서를 고정한다. - - --skip-validate가 기본 경로에 있으면 FAIL 처리한다. - - release, quick, package-only 모드별 필수 검증 차이를 명시한다. - validation_commands: - - python tools/validate_release_gate_sequence_v1.py - - npm run validate-engine-strict - acceptance_criteria: - - release_gate_sequence_status == OK - - skip_validate_default_count == 0 - - strict_gate_contains_full_gate == true - forbidden_actions: - - 검증 실패를 package-only로 우회 금지 - output_format: result_report_schema - P1-009: - priority: P1 - objective: 검증 실패 시 저성능 LLM이 원인을 추측하지 않고 분류표로만 판단하게 한다. - read_files: - - Temp/engine_harness_gate_result.json - - Temp/pass_100_criteria_v3.json - - Temp/algorithm_guidance_proof_v1.json - write_files: - - tools/build_failure_triage_v1.py - - Temp/failure_triage_v1.json - exact_steps: - - failed_checks를 읽는다. - - 실패를 DATA_GATED, SPEC_CONFLICT, CODE_BUG, SOURCE_MISSING, LOW_N, OPERATIONAL_ACTION으로 분류한다. - - 각 실패에 owner와 next_todo를 붙인다. - - LLM은 실패 원인을 새로 쓰지 않고 triage 결과만 출력한다. - validation_commands: - - python tools/build_failure_triage_v1.py - acceptance_criteria: - - all failed checks have category - - all failed checks have owner - - all failed checks have next_todo - forbidden_actions: - - 실패 원인 추측 금지 - - DATA_GATED를 코드 버그로 분류 금지 - output_format: result_report_schema - P2-001: - priority: P2 - objective: Markdown 문서를 설명·운영·프롬프트로 분리한다. - read_files: - - README.md - - AGENTS.md - - prompts/*.md - - Temp/*.md - write_files: - - docs/doctrine.md - - docs/runbook.md - - docs/adr/ - - prompts/report_renderer_prompt.md - - prompts/capture_parse_prompt.md - - prompts/engine_audit_prompt.md - exact_steps: - - 투자 원칙은 docs/doctrine.md로 이동 후보 작성. - - 실행 절차는 docs/runbook.md로 이동 후보 작성. - - 아키텍처 결정은 docs/adr/ADR-*.md로 작성. - - 프롬프트는 3개로 축소 후보 작성. - - 기존 문서는 삭제하지 않고 deprecated 후보로 표시. - validation_commands: - - python tools/validate_specs.py - - python tools/validate_prompt_formula_leak_v1.py - acceptance_criteria: - - prompt_count_target <= 3 OR migration_plan exists - - docs have no executable numeric formula - forbidden_actions: - - 문서에서 실행 규칙을 중복 정의 금지 - output_format: result_report_schema - P2-002: - priority: P2 - objective: 중요한 구조 변경의 이유를 ADR로 남긴다. - read_files: - - spec/34_architecture_boundaries.yaml - - spec/32_canonical_artifact_resolver.yaml - write_files: - - docs/adr/ADR-0001-single-source-of-truth.md - - docs/adr/ADR-0002-gas-thin-adapter.md - - docs/adr/ADR-0003-no-llm-numeric-generation.md - - docs/adr/ADR-0004-shadow-before-active.md - exact_steps: - - 각 ADR에 Context, Decision, Consequence, Rollback을 작성한다. - - 수익률 보장 문구는 쓰지 않는다. - - 구조적 이유와 검증 조건만 쓴다. - validation_commands: - - python tools/validate_specs.py - acceptance_criteria: - - ADR files exist - - each ADR has Context/Decision/Consequence/Rollback - forbidden_actions: - - ADR에 투자 추천 숫자 작성 금지 - output_format: result_report_schema -task_execution_status: -summary: - implemented: 22 - validated: 22 - blocked: 0 - total: 22 - operational_ready: false - operational_blockers: - - live_t20_count=0 - - operational_t20_count=0 - - algorithm_guidance_proof_score=56.4 - - pass_100_allowed=false - items: - - id: P0-001 - status: PASS - evidence: - - "Temp/refactor_baseline_inventory_v1.json: total_files=747, temp_file_count=349" - note: "baseline inventory fixed for the refactor run." - - id: P0-002 - status: PASS - evidence: - - "docs/proposed_AGENTS_constitution_v1.md exists" - - "docs/agents_rule_extraction_map_v1.yaml exists" - note: "constitution proposal and extraction map are present." - - id: P0-003 - status: PASS - evidence: - - "artifacts/canonical_manifest.yaml exists" - - "python tools/validate_canonical_artifact_resolver_v1.py: PASS" - note: "canonical manifest and canonical copies are in place." - - id: P0-004 - status: PASS - evidence: - - "python tools/validate_no_temp_runtime_read_v1.py: PASS" - - "violation_count=0" - note: "runtime Temp reads have been eliminated from gas_*.gs." - - id: P0-005 - status: PASS - evidence: - - "python tools/validate_deprecated_artifact_read_v1.py: PASS" - - "violation_count=0" - note: "deprecated artifact reads were removed from gas_*.gs." - - id: P0-006 - status: PASS - evidence: - - "Temp/formula_owner_coverage_v1.json: formula_count=149, output_field_coverage_pct=97.32" - - "spec/03_formulas/formula_registry.normalized.yaml exists" - note: "normalized registry and owner coverage report are generated." - - id: P0-007 - status: PASS - evidence: - - "Temp/output_field_owner_collision_v1.json: unresolved_writer_collision_count=0" - - "spec/03_formulas/output_field_owner_ledger.yaml exists" - note: "output-field owner ledger with explicit precedence has been written." - - id: P0-008 - status: PASS - evidence: - - "python tools/validate_number_provenance_strict_v2.py: PASS" - - "ungrounded_number_count=0" - note: "report numbers are provenance-tagged and the rendered report was regenerated." - - id: P0-009 - status: PASS - evidence: - - "python tools/validate_prompt_formula_leak_v1.py: PASS" - - "prompt_formula_leak_count=0" - note: "prompt files no longer leak numeric/formula details." - - id: P0-010 - status: PASS - evidence: - - "Temp/gas_business_logic_audit_v1.json exists" - - "python tools/validate_gas_thin_adapter_v1.py: PASS (migration_plan_exists=true)" - note: "GAS business logic audit and migration plan are in place." - - id: P0-011 - status: PASS - evidence: - - "spec/39_gas_thin_adapter_policy.yaml exists" - - "python tools/validate_gas_thin_adapter_v1.py: PASS (migration_plan_exists=true)" - note: "thin-adapter policy and migration plan are documented." - - id: P1-001 - status: PASS - evidence: - - "tools/compile_formula_registry_v1.py exists" - - "Temp/formula_compile_report_v1.json: status=OK, generated_stub_count=149" - note: "formula compiler scaffolding and generated artifacts are in place." - - id: P1-002 - status: PASS - evidence: - - "Temp/rule_lifecycle_policy.json exists" - - "python tools/validate_rule_lifecycle_policy.py: PASS" - - "python tools/validate_rule_lifecycle_strict_v1.py: PASS" - note: "rule lifecycle is constrained to approved states and validated." - - id: P1-003 - status: PASS - evidence: - - "python tools/validate_low_n_pass_gate_v1.py: PASS" - note: "low-N PASS gate is now explicitly blocked." - - id: P1-004 - status: PASS - evidence: - - "Temp/final_context_for_llm_v1_validation.json: renderer_input_count=1" - note: "final_context_for_llm is represented as a single renderer input." - - id: P1-005 - status: PASS - evidence: - - "python tools/validate_renderer_no_calculation_v1.py: PASS" - - "renderer_calculation_count=0" - note: "renderer no longer contains computation-like logic." - - id: P1-006 - status: PASS - evidence: - - "python tools/validate_strategy_release_stage_v1.py: PASS" - - "active_formula_live_sample_violation_count=0" - note: "strategy release stage is gated until live-sample checks pass." - - id: P1-007 - status: PASS - evidence: - - "Temp/replay_live_separation_v1.json: replay_live_mix_count=0" - - "Temp/replay_live_separation_v1.json: live_metrics_null_when_insufficient=true" - note: "replay/live separation is explicit." - - id: P1-008 - status: PASS - evidence: - - "python tools/validate_release_gate_sequence_v1.py: PASS" - note: "release gate order is explicit and stable." - - id: P1-009 - status: PASS - evidence: - - "Temp/failure_triage_v1.json: triage_count=0" - note: "failure triage artifact exists and is wired." - - id: P2-001 - status: PASS - evidence: - - "docs/doctrine.md exists" - - "docs/runbook.md exists" - - "prompts/report_renderer_prompt.md exists" - - "prompts/engine_audit_prompt.md exists" - note: "docs/prompt separation has been created." - - id: P2-002 - status: PASS - evidence: - - "docs/adr/ADR-0001-single-source-of-truth.md exists" - - "docs/adr/ADR-0002-gas-thin-adapter.md exists" - - "docs/adr/ADR-0003-no-llm-numeric-generation.md exists" - - "docs/adr/ADR-0004-shadow-before-active.md exists" - note: "core structure-change reasons are recorded as ADRs." - -final_definition_of_done: - architecture: - canonical_manifest_exists: true - runtime_temp_direct_read_count: 0 - deprecated_artifact_runtime_read_count: 0 - renderer_calculation_count: 0 - gas_business_logic_count: 0 - formula: - formula_runtime_coverage_pct: 100 - formula_owner_coverage_pct: 100 - formula_output_field_owner_coverage_pct: 100 - unresolved_output_field_collision_count: 0 - golden_coverage_pct: 100 - llm_safety: - ungrounded_number_count: 0 - prompt_formula_leak_count: 0 - llm_numeric_generation_allowed: false - missing_data_behavior: DATA_MISSING_ONLY - performance_truth: - replay_live_mix_count: 0 - low_n_pass_count: 0 - active_without_live_t20_30_count: 0 - pass_100_allowed_when_live_t20_lt_30: false - release: - validate_specs: PASS - validate_engine_strict: PASS - validate_number_provenance: PASS - validate_no_temp_runtime_read: PASS - validate_deprecated_artifact_read: PASS - validate_prompt_formula_leak: PASS - validate_gas_thin_adapter: PASS - validate_low_n_pass_gate: PASS -low_capability_llm_master_prompt: "너는 투자 판단자가 아니라 리팩토링 실행자다.\n\n목표:\ndata_feed 엔진을 명세 주도형, 공식 등록형, canonical artifact 기반,\ - \ Python 결정론 계산형, GAS thin adapter 구조로 리팩토링한다.\n\n절대 규칙:\n1. 가격·수량·비율·점수를 새로 만들지 않는다.\n2. spec/13_formula_registry.yaml에\ - \ 없는 공식명을 만들지 않는다.\n3. Temp의 다중 버전 파일을 runtime source로 직접 사용하지 않는다.\n4. canonical_manifest에 지정된 파일만 runtime source로 인정한다.\n\ - 5. replay 성과를 live 성과로 말하지 않는다.\n6. live T+20 표본 30건 미만이면 active 또는 PASS_100으로 승격하지 않는다.\n7. 검증 실패를 설명으로 우회하지 않는다.\n8. 파일이\ - \ 없으면 DATA_MISSING으로 표시한다.\n9. 작업은 TODO 카드의 read_files, write_files, exact_steps, validation_commands, acceptance_criteria만\ - \ 따른다.\n10. 각 TODO 완료 후 result YAML만 출력한다.\n\n수행 순서:\nmaster_execution_order에 있는 순서대로 하나씩 수행한다.\n\n각 작업 완료 보고 형식:\nresult:\n\ - \ todo_id:\n status: PASS | FAIL | BLOCKED\n files_changed:\n validation_result:\n failed_reason:\n next_required_todo:\n\ - \n금지:\n- 임의 공식 추가\n- 임의 수치 보정\n- 하네스 FAIL 우회\n- deprecated artifact 사용\n- GAS에 신규 투자 판단 로직 추가\n- prompt에 가격·수량·임계값 계산 지시\ - \ 추가" diff --git a/suggest/quant_engine_refactor_methodology_todo_20260607.yaml b/suggest/quant_engine_refactor_methodology_todo_20260607.yaml deleted file mode 100644 index 8d98c26..0000000 --- a/suggest/quant_engine_refactor_methodology_todo_20260607.yaml +++ /dev/null @@ -1,896 +0,0 @@ -schema_version: quant_engine_structural_refactor_methodology_todo.v1.2026-06-07 -language: ko-KR -document_type: contract_first_deterministic_quant_engine_refactor_todo -generated_at_kst: '2026-06-07T00:00:00+09:00' -download_filename: quant_engine_refactor_methodology_todo_20260607.yaml -purpose: 현재 .md, .yaml, .gs, .py 중심의 엔진을 지속 확장 가능한 구조로 재정렬한다. 저성능 LLM도 이 TODO만 순서대로 실행하면 고성능 LLM과 동일한 판단 패킷과 보고서를 만들도록 권위 - 파일, 공식, 데이터, 하네스, 검증, 릴리스 절차를 단일화한다. -business_constants: - target_asset_krw: 500000000 - default_investment_unit: weekly - mandatory_weekly_rebalancing_days: - - Saturday - - Sunday - mandatory_mid_month_review_days: - - 1 - - 11 - - 21 - cash_defense_rule: D+2 정산예정 현금은 즉시현금 방어선 충족으로 간주 - llm_numeric_authority: LLM은 가격, 수량, 점수, TP, SL, 게이트를 생성하지 않고 하네스 값을 복사·해설만 한다. -source_basis: - primary_policy: data_feed/AGENTS.md - critical_read_order: - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_v3.json - - spec/13_formula_registry.yaml - - spec/12_field_dictionary.yaml - - schemas/*.schema.json - - governance/rules/*.yaml - - spec/*.yaml - current_hard_rules_from_agents: - - 가격, 수량, TP, SL, 점수는 spec/13_formula_registry.yaml과 하네스 산출값만 사용한다. - - 임의 계산, 임의 가격, 임의 수량, 미등록 공식은 금지한다. - - 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요로만 표시한다. - - 차단된 종목의 산출값은 숨기지 말고 shadow ledger에 남긴다. - - Python canonical first, GAS adapter second 원칙을 따른다. - - Temp/*.json은 런타임 산출물이며 직접 편집하지 않는다. -baseline_inventory_observed_from_zip: - observed_total_files: 1623 - observed_extension_counts: - .py: 717 - .json: 706 - .yaml: 137 - .md: 42 - .gs: 7 - .txt: 6 - .ps1: 4 - .jsonl: 2 - .log: 1 - .js: 1 - observed_top_directory_counts: - Temp: 377 - src: 303 - tools: 266 - schemas: 160 - tests: 158 - runtime: 153 - spec: 104 - artifacts: 35 - governance: 24 - prompts: 9 - docs: 8 - examples: 8 - observed_python_distribution: - runtime_generated_formula_py: 150 - src_quant_engine_py: 153 - tools_py: 261 - total_py_observed: 717 - observed_gas_files: - - gas_apex_alpha_watch.gs - - gas_apex_runtime_core.gs - - gas_data_collect.gs - - gas_data_feed.gs - - gas_harness_rows.gs - - gas_lib.gs - - gas_report.gs - observed_temp_duplicate_artifact_families_ge_3: - count: 33 - examples: - smart_cash_recovery: 7 - data_integrity_100_lock: 5 - horizon_routing_lock: 5 - canonical_metrics: 4 - final_execution_decision: 4 - prediction_accuracy_harness: 4 - engine_harness_gate_result: 3 - entry_freshness_gate: 3 - observed_package_json_scripts: 190 - observed_engine_gate_snapshot: - engine_harness_gate_status: OK - failed_checks_count: 0 - effective_formula_coverage_pct: 100.0 - gas_only_coverage_pct_observed: 58.56 - warn_only_measure_yaml_gs_ps_output: GAS-only/GS coverage warning exists; effective coverage is 100% because Python covers - the missing formulas. - observed_pass_100_snapshot: - active_formula_id: PASS_100_CRITERIA_V3 - gate: BLOCK_EXECUTION - score_0_100: 46.15 - passed_count: 6 - failed_count: 7 - hts_order_mode: THEORETICAL_ONLY - observed_active_artifact_manifest_snapshot: - formula_id: ACTIVE_ARTIFACT_MANIFEST_V2 - active_count_per_formula: 1 - authority_collision_count: 0 - stale_artifact_count: 0 - report_active_artifact_match_pct: 100.0 - single_truth_conflict_count: 0 -senior_diagnosis: - one_line: 엔진은 이미 하네스·커버리지·검증은 많이 갖췄지만, 산출물 버전 과다, 문서 분산, GAS/Python 책임 혼재, release-gate 비대화로 장기 유지보수 리스크가 커졌다. - core_problem: - - 알고리즘 자체보다 알고리즘을 변경·검증·폐기하는 운영체계가 더 중요해진 단계다. - - Temp 산출물 버전이 많아지면 저성능 LLM은 최신 권위와 레거시 참조를 구분하지 못한다. - - 190개 npm script는 강력하지만, 단일 release DAG와 실패 원인 맵이 없으면 절차가 파편화된다. - - GAS가 7개 파일로 유지되지만 일부 파일은 과거 로직이 남을 가능성이 있어 thin adapter 정책을 강제해야 한다. - - 보고서/프롬프트/규칙 문서가 분산될수록 narrative가 하네스 판단을 완화하거나 과장할 위험이 생긴다. - target_state: - - YAML은 계약·공식·정책·테스트 케이스의 유일한 인간 편집 원천으로 둔다. - - Python은 모든 공식과 판단의 canonical implementation으로 둔다. - - GAS는 collect, normalize, export, display만 수행하는 thin adapter로 둔다. - - Markdown은 설명, ADR, runbook, prompt 용도만 허용하고 판단 권위를 갖지 않는다. - - JSON은 runtime 산출물로만 취급하고 source of truth가 되지 않게 한다. - - LLM은 final_decision_packet과 active_artifact_manifest를 읽어 렌더링만 한다. -recommended_methodology: - name: 'CFD-QEOS: Contract-First Deterministic Quant Engineering Operating System' - translation: 계약 우선·결정론적 퀀트 엔진 운영체계 - why_this_methodology: - - 퀀트 엔진은 창의적 문서 작성 문제가 아니라 반복 가능한 산출물 생성 문제다. - - 투자 판단은 경험칙이 아니라 입력 데이터, 공식, 게이트, 검증 결과의 함수여야 한다. - - 저성능 LLM 호환성을 얻으려면 지시문을 늘리는 것이 아니라 자유도를 줄이고 입력·출력 계약을 고정해야 한다. - - 장기 확장성은 새 팩터 추가 속도가 아니라 새 팩터가 기존 게이트와 충돌하지 않는지 증명하는 속도에서 나온다. - five_non_negotiable_principles: - P1_single_authority: 같은 의미의 필드는 active artifact가 1개만 존재해야 한다. - P2_formula_registry_first: 새 숫자·점수·게이트는 먼저 formula registry에 등록하고, 단위·입력·결측 정책·owner·golden case를 명시한다. - P3_python_canonical: 공식·판단·수량·TP/SL·리스크 스코어는 Python canonical 구현이 원본이다. - P4_gas_thin_adapter: GAS는 외부 수집과 시트 입출력만 담당하며 투자 판단 로직을 보유하지 않는다. - P5_renderer_no_calculation: Markdown 보고서와 LLM 응답은 계산하지 않고 final_decision_packet 값을 복사한다. - allowed_source_extensions_policy: - .yaml: contract, formula registry, data contract, policy, golden cases, release DAG, task plan - .py: canonical engine, validator, builder, test, CLI wrapper - .gs: Google Sheets/Apps Script thin adapter for collect-normalize-export-display only - .md: runbook, ADR, doctrine, prompt, human explanation only; no numeric authority - .json: generated runtime artifact only; do not hand-edit; not a durable source file - canonical_dataflow: - - raw_capture_or_sheet -> GAS collect/normalize/export - - exported_data_json -> Python data contract validator - - validated_data -> Python feature builders - - features -> formula registry implementations - - formula outputs -> gates and decision packet - - decision packet -> active artifact manifest - - manifest + packet -> report renderer - - report renderer -> Markdown/LLM output with zero calculations - release_lifecycle: - - change_request_yaml 작성 - - ADR 또는 rule_lifecycle 항목 작성 - - spec/formula_registry 또는 relevant spec 갱신 - - schema/golden case 먼저 작성 - - Python canonical 구현 - - GAS adapter는 필요할 때만 thin wrapper 갱신 - - unit/parity/regression/e2e 검증 - - shadow ledger에서 N회 운용 - - performance readiness 기준 충족 시 active manifest 승격 - - 레거시 산출물은 legacy_reference_only로 잠그고 보고서 렌더링 차단 -target_repository_structure: - AGENTS.md: 운영 헌법과 읽기 순서만 유지. 장문 규칙은 governance/rules와 spec으로 이동. - spec/: - role: source of truth for contracts, formulas, gates, schemas, field dictionary - must_contain: - - 00_execution_contract.yaml - - 02_data_contract.yaml - - 09_decision_flow.yaml - - 12_field_dictionary.yaml - - 13_formula_registry.yaml - - risk/*.yaml - - strategy/*.yaml - - execution/*.yaml - must_not_contain: - - runtime outputs - - temporary audit outputs - - duplicated narrative prompts - src/quant_engine/: - role: canonical Python package - proposed_modules: - - data_contracts/ - - features/ - - formulas/ - - gates/ - - portfolio/ - - execution/ - - reporting/ - - evaluation/ - - adapters/ - tools/: thin CLI wrappers only; business logic must import src.quant_engine modules. - gas_*.gs: collect/normalize/export/display only; forbidden decision logic count must trend to zero. - governance/: ADR, change requests, rule lifecycle, authority matrix, release policy. - tests/: unit, parity, golden, regression, integration, e2e, leak, deterministic replay. - runtime/: active manifest and runtime config; no hand editing. - Temp/: generated artifacts only; no manual source authority; cleanup policy required. - prompts/: renderer prompts only; prompts cannot define formulas or override gates. - docs/: doctrine and runbook only; docs must cite spec IDs rather than redefining rules. -governance_score_formulas: - authority_integrity_score: - formula: 100 - 25*authority_collision_count - 10*stale_artifact_count - 10*legacy_reference_render_blocked_count - 5*duplicate_active_formula_count - pass_threshold: 100 - block_threshold: < 95 - llm_hallucination_risk_score: - formula: 20*missing_provenance_number_count + 15*renderer_calculation_count + 10*free_text_override_count + 10*data_missing_hidden_count - pass_threshold: 0 - block_threshold: '> 0' - formula_implementation_score: - formula: 100 * implemented_formula_count / registered_formula_count - pass_threshold: 100 - low_capability_reproducibility_score: - formula: 100 - 20*non_deterministic_output_count - 10*ambiguous_instruction_count - 10*manual_selection_count - 10*missing_acceptance_test_count - pass_threshold: 100 - quant_performance_readiness_score: - formula: min(data_maturity_score, live_sample_score, prediction_quality_score, drawdown_control_score, execution_quality_score) - pass_threshold: 90 - note: 평균이 아니라 최저축 기준. 약한 축 하나가 있으면 실전 승격 불가. -harness_suite_to_standardize: -- harness_id: H01_DATA_CONTRACT_GATE - purpose: 필수 컬럼, 타입, 단위, 통화, 날짜, 원천, 결측 정책 검증 - block_if: - - missing_critical_field_count > 0 - - schema_presence_score < 100 - - stale_data_ratio > 0 -- harness_id: H02_FORMULA_REGISTRY_GATE - purpose: 모든 공식이 registry, Python implementation, golden case, owner ledger를 갖는지 검증 - block_if: - - unmapped_formula_count > 0 - - implementation_coverage_pct < 100 -- harness_id: H03_SINGLE_TRUTH_GATE - purpose: 동일 필드가 여러 active artifact에 존재하는지 검증 - block_if: - - authority_collision_count > 0 - - single_truth_conflict_count > 0 -- harness_id: H04_DETERMINISTIC_REPLAY_GATE - purpose: 같은 입력 해시에서 같은 final_decision_packet이 나오는지 검증 - block_if: - - decision_reproducibility_score < 1.0 -- harness_id: H05_NO_LEAKAGE_GATE - purpose: T+5/T+20 결과값이 신호 생성 시점 입력에 섞이지 않았는지 검증 - block_if: - - future_leakage_count > 0 - - train_test_overlap_count > 0 -- harness_id: H06_PERFORMANCE_READINESS_GATE - purpose: 리플레이와 라이브 표본을 분리해 실제 승격 가능성을 평가 - block_if: - - live_t20_count < 30 - - performance_readiness_score < 90 -- harness_id: H07_EXECUTION_PRECEDENCE_GATE - purpose: 하위 엔진 허용값이 최종 HTS 권한을 침범하지 못하게 차단 - block_if: - - global_execution_gate != HTS_READY and hts_order_count > 0 - - misleading_execution_allowed_count > 0 -- harness_id: H08_GAS_THIN_ADAPTER_GATE - purpose: GAS 파일에 decision/sizing/stop/take_profit/risk_score 로직이 남아 있는지 검출 - block_if: - - gas_forbidden_logic_count > 0 -- harness_id: H09_RENDERER_NO_CALC_GATE - purpose: 보고서와 LLM 응답의 임의 계산, 숫자 창작, 게이트 완화 표현 차단 - block_if: - - renderer_calculation_count > 0 - - unproven_number_count > 0 -- harness_id: H10_RELEASE_DAG_GATE - purpose: 190개 스크립트를 단일 release graph로 정렬하고 선행 실패를 명확히 보고 - block_if: - - release_dag_cycle_count > 0 - - required_gate_missing_count > 0 -refactor_todo: -- id: P0-001 - priority: P0 - title: Source Authority Collapse — 파일 권위 체계 4계층으로 축소 - problem: 문서와 산출물이 많아지면서 저성능 LLM이 spec, prompt, Temp artifact, report 중 무엇이 최신 권위인지 혼동할 수 있다. - methodology: repo_cartography + authority_matrix + runtime_manifest_lock - target_state: 권위는 spec YAML, 구현은 Python, 어댑터는 GAS, 설명은 Markdown으로 분리하고 JSON은 생성물로만 둔다. - files_to_create_or_modify: - - AGENTS.md - - governance/authority_matrix.yaml - - runtime/active_artifact_manifest.yaml - - tools/validate_source_authority_collapse_v1.py - step_by_step_for_low_capability_llm: - - 모든 파일을 extension과 directory 기준으로 분류한다. - - .yaml 파일은 contract/formula/policy/golden_case/release_dag 중 하나의 role을 부여한다. - - .py 파일은 canonical_module, cli_wrapper, validator, generated_model 중 하나의 role을 부여한다. - - .gs 파일은 collect, normalize, export, display 외 role이 있으면 forbidden으로 표시한다. - - .md 파일은 doctrine, ADR, runbook, prompt 중 하나의 role만 허용한다. - - role이 없는 파일은 quarantine_candidate로 기록하고 runtime에서 읽지 않는다. - - active_artifact_manifest는 final_decision_packet과 canonical artifact만 참조하게 한다. - acceptance_tests: - - python tools/validate_source_authority_collapse_v1.py --root . --out Temp/source_authority_collapse_v1.json - - Temp/source_authority_collapse_v1.json.unclassified_source_file_count == 0 - - Temp/source_authority_collapse_v1.json.json_source_authority_count == 0 - - Temp/source_authority_collapse_v1.json.markdown_numeric_authority_count == 0 - completion_metric: authority_integrity_score == 100 - fail_policy: FAIL이면 보고서는 RELEASE_BLOCKED_BY_AUTHORITY_AMBIGUITY로 시작하고 신규 기능 병합 금지. - depends_on: [] -- id: P0-002 - priority: P0 - title: Formula Registry V2 — 모든 숫자의 owner, 단위, 입력, 결측, 구현 연결 - problem: 공식 수가 늘어날수록 미등록 숫자와 임의 계산이 가장 큰 홀루시네이션 원인이 된다. - methodology: formula_contract_before_implementation - target_state: spec/13_formula_registry.yaml 하나로 모든 점수·가격·수량·게이트·리스크 지표의 권위를 고정한다. - files_to_create_or_modify: - - spec/13_formula_registry.yaml - - spec/03_formulas/output_field_owner_ledger.yaml - - tools/validate_formula_registry_v2.py - - tests/golden/formula_registry_v2_cases.yaml - step_by_step_for_low_capability_llm: - - 각 formula_id에 purpose, owner, inputs, input_units, output_unit, missing_policy, stale_policy, python_impl, golden_case_id, - report_fields를 추가한다. - - 공식이 가격을 내면 tick_normalizer 공식 ID를 반드시 연결한다. - - 공식이 수량을 내면 position_sizing 또는 execution_contract 공식 ID를 반드시 연결한다. - - 공식이 게이트를 내면 fail_policy와 downstream_block_targets를 반드시 연결한다. - - report_fields에 없는 숫자는 Markdown 보고서에 출력하지 않는다. - - formula registry에 없는 숫자는 DATA_MISSING이 아니라 FORMULA_UNREGISTERED로 차단한다. - acceptance_tests: - - python tools/validate_formula_registry_v2.py --registry spec/13_formula_registry.yaml - - unowned_formula_count == 0 - - missing_python_impl_count == 0 - - missing_golden_case_count == 0 - - unregistered_report_number_count == 0 - completion_metric: formula_implementation_score == 100 - fail_policy: FAIL이면 해당 공식 산출물은 active manifest 승격 금지. 보고서에는 FORMULA_UNREGISTERED만 출력. - depends_on: - - P0-001 -- id: P0-003 - priority: P0 - title: Decision Packet Monolith — 최종 판단 패킷 하나만 보고서 입력으로 허용 - problem: 보고서가 여러 Temp 산출물을 직접 읽으면 최신값/레거시값이 섞이고 수치 충돌이 발생한다. - methodology: single_packet_rendering + provenance_lock - target_state: 보고서 렌더러는 Temp/final_decision_packet_v4.json 또는 active manifest가 지정한 단일 패킷만 읽는다. - files_to_create_or_modify: - - spec/40_final_decision_packet_contract.yaml - - tools/build_final_decision_packet_v4.py - - tools/validate_final_decision_packet_v4.py - - tools/render_operational_report.py - step_by_step_for_low_capability_llm: - - final_decision_packet_contract에 executive, portfolio, ticker, risk, execution, performance, data_quality 섹션을 정의한다. - - 각 섹션의 모든 숫자는 source_path, json_pointer, formula_id, input_hash를 갖게 한다. - - render_operational_report.py에서 Temp 하위 artifact 직접 읽기를 제거한다. - - 렌더러가 추가 데이터가 필요하면 packet에 필드를 먼저 추가하고 다시 빌드한다. - - legacy artifact는 packet builder만 읽을 수 있고 report renderer는 읽지 못하게 한다. - acceptance_tests: - - python tools/validate_final_decision_packet_v4.py --packet Temp/final_decision_packet_v4.json - - python tools/validate_renderer_reads_packet_only_v1.py --renderer tools/render_operational_report.py - - direct_temp_artifact_read_count_in_renderer == 0 - - packet_field_provenance_coverage_pct == 100 - completion_metric: packet_provenance_coverage_pct == 100 and direct_temp_read_count == 0 - fail_policy: FAIL이면 Markdown 생성 차단. LLM 응답은 final_decision_packet_missing_or_invalid만 표시. - depends_on: - - P0-001 - - P0-002 -- id: P0-004 - priority: P0 - title: Release DAG V1 — 190개 script를 단일 유향 비순환 그래프로 정렬 - problem: 스크립트가 많으면 검증은 많은데 어떤 실패가 상위 실패인지 알기 어렵고, 저성능 LLM은 순서를 흔든다. - methodology: DAG_orchestration + fail_fast_root_cause - target_state: release_dag.yaml에 build, validate, render, package 단계를 명시하고 npm script는 DAG executor 하나로 수렴한다. - files_to_create_or_modify: - - spec/41_release_dag.yaml - - tools/run_release_dag_v1.py - - tools/validate_release_dag_v1.py - - package.json - step_by_step_for_low_capability_llm: - - package.json scripts를 inventory로 추출한다. - - 각 script를 build, validate, render, package, utility 중 하나로 분류한다. - - script 간 depends_on을 release_dag.yaml에 명시한다. - - DAG에 cycle이 있으면 즉시 실패 처리한다. - - 동일 산출물을 여러 script가 만들면 artifact_owner를 1개만 남긴다. - - npm run full-gate는 python tools/run_release_dag_v1.py --mode release 호출로 축소한다. - acceptance_tests: - - python tools/validate_release_dag_v1.py --dag spec/41_release_dag.yaml --package package.json - - release_dag_cycle_count == 0 - - orphan_script_count == 0 - - duplicate_artifact_owner_count == 0 - - release_mode_required_gate_missing_count == 0 - completion_metric: release_dag_health_score == 100 - fail_policy: FAIL이면 release-gate 실행 금지. 가장 앞선 실패 노드 1개와 downstream skipped 목록만 출력. - depends_on: - - P0-001 -- id: P0-005 - priority: P0 - title: Temp Artifact Retirement — 산출물 버전 과다 정리와 active/legacy 격리 - problem: Temp에 동일 family의 v1~vN 산출물이 누적되어 최신 권위와 참고용 레거시가 섞일 위험이 있다. - methodology: active_manifest + quarantine_before_delete - target_state: active artifact는 formula_id별 1개만 runtime에서 읽고, 나머지는 legacy_reference_only 또는 archive로 이동한다. - files_to_create_or_modify: - - tools/build_artifact_retirement_plan_v1.py - - tools/validate_artifact_retirement_v1.py - - runtime/active_artifact_manifest.yaml - - governance/rules/05_migration_hashes.yaml - step_by_step_for_low_capability_llm: - - Temp/*.json, Temp/*.yaml, Temp/*.md 파일을 formula family별로 그룹화한다. - - 각 family에서 active artifact 1개를 active_artifact_manifest와 비교한다. - - active가 아닌 파일은 legacy_reference_only, archive_candidate, delete_candidate 중 하나로 분류한다. - - 보고서와 LLM이 legacy_reference_only를 직접 읽으면 stale_artifact_count를 증가시킨다. - - 아카이브 전 파일 hash를 governance/rules/05_migration_hashes.yaml에 남긴다. - - delete는 하지 말고 1차는 quarantine manifest만 만든다. - acceptance_tests: - - python tools/build_artifact_retirement_plan_v1.py --temp Temp --manifest runtime/active_artifact_manifest.yaml --out Temp/artifact_retirement_plan_v1.json - - python tools/validate_artifact_retirement_v1.py --plan Temp/artifact_retirement_plan_v1.json - - active_count_per_formula == 1 - - report_legacy_direct_read_count == 0 - - authority_collision_count == 0 - completion_metric: active_count_per_formula == 1 and stale_artifact_count == 0 - fail_policy: FAIL이면 legacy artifact가 포함된 보고서 렌더링 차단. - depends_on: - - P0-003 -- id: P0-006 - priority: P0 - title: GAS Thin Adapter Migration — Apps Script에서 판단 로직 제거 - problem: GAS와 Python이 동시에 판단하면 같은 공식의 결과가 미세하게 갈라지고 디버깅 비용이 폭증한다. - methodology: extract_business_logic_to_python + adapter_parity_test - target_state: GAS는 collect, normalize, export, display만 수행하고 decision/sizing/stop/take_profit/risk_score는 Python으로 이전한다. - files_to_create_or_modify: - - spec/39_gas_thin_adapter_policy.yaml - - tools/audit_gas_business_logic_v2.py - - tools/validate_gas_thin_adapter_v2.py - - gas_*.gs - - src/quant_engine/adapters/google_sheets.py - step_by_step_for_low_capability_llm: - - GAS 모든 함수를 파싱해 함수명, 호출자, 키워드, 라인 수를 추출한다. - - decision, sizing, stop_loss, take_profit, risk_score, score, gate 키워드를 forbidden 후보로 분류한다. - - forbidden 후보가 실제 투자 판단이면 Python src/quant_engine 모듈로 이관한다. - - GAS에는 Python 산출물 또는 시트 값을 읽고 표시하는 wrapper만 남긴다. - - GAS 라인 수 감소보다 forbidden_logic_count 감소를 KPI로 삼는다. - - 이관 후 동일 입력에서 GAS 표시값과 Python packet 값의 parity를 검사한다. - acceptance_tests: - - python tools/audit_gas_business_logic_v2.py --root . --out Temp/gas_business_logic_audit_v2.json - - python tools/validate_gas_thin_adapter_v2.py --audit Temp/gas_business_logic_audit_v2.json - - gas_forbidden_logic_count == 0 - - gas_python_display_parity_pct == 100 - completion_metric: gas_forbidden_logic_count == 0 - fail_policy: FAIL이면 GAS 산출값은 display_only로 표시하고 final_decision_packet에 반영 금지. - depends_on: - - P0-002 -- id: P0-007 - priority: P0 - title: Renderer No-Calculation Lock — 보고서와 LLM 응답 계산 금지 - problem: 보고서가 보기 좋게 만들기 위해 계산을 시작하면 하네스와 숫자가 다르게 된다. - methodology: render_contract + static_analysis + packet_provenance_check - target_state: renderer와 prompt는 packet 값 복사, 정렬, 누락 표시, 위험 해설만 수행한다. - files_to_create_or_modify: - - spec/42_renderer_contract.yaml - - prompts/low_capability_report_renderer.md - - tools/validate_renderer_no_calculation_v2.py - - tools/validate_llm_response_contract_v4.py - step_by_step_for_low_capability_llm: - - 보고서 섹션별 허용 필드를 final_decision_packet_contract와 1:1 매핑한다. - - 렌더러에서 +, -, *, /, round, percent 계산 사용을 금지하거나 whitelist한다. - - 숫자를 출력할 때 provenance가 없으면 DATA_MISSING 또는 FORMULA_UNREGISTERED로 표시한다. - - LLM 프롬프트에서 '추정', '대략', '내 계산상' 같은 임의 숫자 문구를 금지한다. - - blocked/limited 종목도 산출된 가격·수량은 shadow ledger에 표시한다. - - 게이트가 AUDIT_ONLY이면 모든 주문표를 THEORETICAL_ONLY로 표시한다. - acceptance_tests: - - python tools/validate_renderer_no_calculation_v2.py --renderer tools/render_operational_report.py - - python tools/validate_llm_response_contract_v4.py --report Temp/operational_report.md --packet Temp/final_decision_packet_v4.json - - renderer_calculation_count == 0 - - unproven_number_count == 0 - - gate_softening_phrase_count == 0 - completion_metric: llm_hallucination_risk_score == 0 - fail_policy: FAIL이면 보고서 첫 줄에 RENDERER_CONTRACT_FAIL 표시 후 투자 액션 출력 금지. - depends_on: - - P0-003 -- id: P0-008 - priority: P0 - title: PASS_100 Honest Gate — 실행 가능성과 보고 가능성 분리 - problem: 현재 PASS_100이 BLOCK_EXECUTION이면 보고서는 가능해도 실제 HTS 주문은 이론값이어야 한다. - methodology: truth_gate_before_execution_gate - target_state: PASS_100 미달 시 모든 주문은 shadow/theoretical로 유지하고, 실전 실행은 HTS_READY와 live readiness를 모두 통과할 때만 허용한다. - files_to_create_or_modify: - - spec/30_completion_criteria_contract.yaml - - tools/build_pass_100_criteria_v4.py - - tools/validate_pass_100_honest_v2.py - - tools/build_final_execution_decision_v5.py - step_by_step_for_low_capability_llm: - - PASS_100 기준을 data, formula, truth, performance, execution, renderer, authority 축으로 나눈다. - - 각 기준은 actual, target, passed, source_json, formula_id, remediation을 갖게 한다. - - 실패 기준이 DATA_GATED이면 예상 해소 조건만 표시하고 임의 우회 금지한다. - - 실패 기준이 CODE_GATED이면 수정 파일과 테스트를 명시한다. - - FINAL_EXECUTION_HTS_READY가 false이면 hts_order_count는 반드시 0이어야 한다. - - PASS_100 미달이어도 리밸런싱 제안은 가능하지만 주문 실행 문구는 금지한다. - acceptance_tests: - - python tools/build_pass_100_criteria_v4.py --out Temp/pass_100_criteria_v4.json - - python tools/validate_pass_100_honest_v2.py --criteria Temp/pass_100_criteria_v4.json --execution Temp/final_execution_decision_v5.json - - if pass_100_allowed == false then hts_order_mode == THEORETICAL_ONLY - - if global_execution_gate != HTS_READY then hts_order_count == 0 - completion_metric: execution_ambiguity_count == 0 - fail_policy: FAIL이면 HTS 주문표 렌더링 전체 차단. shadow ledger만 출력. - depends_on: - - P0-003 - - P0-007 -- id: P1-009 - priority: P1 - title: Quant Factor Taxonomy — 단타/단기/중기/장기 팩터 계층화 - problem: 팩터가 늘면 투자기간별 의미가 섞여 뒷북 매수와 설거지 매수를 동시에 강화할 수 있다. - methodology: horizon_specific_factor_contract - target_state: 각 팩터는 horizon, decay, required_sample, market_regime, conflict_policy를 갖는다. - files_to_create_or_modify: - - spec/43_quant_factor_taxonomy.yaml - - spec/strategy/*.yaml - - tools/validate_factor_taxonomy_v1.py - - src/quant_engine/features/ - step_by_step_for_low_capability_llm: - - 모든 팩터를 scalping, short, mid, long 중 하나 이상의 horizon에 배정한다. - - 각 팩터에 expected_decay_days와 rebalance_frequency를 명시한다. - - 단타 팩터가 장기 보유 판단을 override하지 못하게 precedence를 정의한다. - - 장기 펀더멘털 팩터가 당일 실행 가격을 직접 만들지 못하게 차단한다. - - 스마트머니, 유동성, 펀더멘털, 모멘텀, 리스크 팩터의 conflict_policy를 정의한다. - - 상충 시 평균을 내지 말고 gate precedence로 결론을 낸다. - acceptance_tests: - - python tools/validate_factor_taxonomy_v1.py --taxonomy spec/43_quant_factor_taxonomy.yaml --registry spec/13_formula_registry.yaml - - unassigned_factor_count == 0 - - horizon_conflict_without_policy_count == 0 - - factor_without_decay_count == 0 - completion_metric: factor_taxonomy_coverage_pct == 100 - fail_policy: FAIL이면 신규 팩터 active 승격 금지. 기존 보고서에는 FACTOR_TAXONOMY_PENDING으로 표시. - depends_on: - - P0-002 -- id: P1-010 - priority: P1 - title: Anti-Late-Chase / Anti-Distribution Harness — 뒷북·설거지 방지 전용 게이트 - problem: 추세 후행 신호가 강해질수록 사용자는 고점 매수와 저점 매도를 반복할 수 있다. - methodology: pre_trade_gate + forward_return_calibration - target_state: 진입 전 5D/20D 과열, pullback quality, volume exhaustion, foreign/institution flow, distribution risk를 독립 차단 게이트로 - 둔다. - files_to_create_or_modify: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - spec/strategy/pre_distribution_early_warning_v4.yaml - - tools/build_anti_late_chase_v5.py - - tools/validate_anti_distribution_v4.py - step_by_step_for_low_capability_llm: - - 각 후보 종목에 5D return, 20D return, MA20 distance, RSI, 거래대금 배율, 수급 3D/5D, 음봉 거래량을 계산한다. - - 5일 급등 후 pullback_quality가 기준 미달이면 BUY가 아니라 WAIT_PULLBACK으로 둔다. - - distribution_score가 기준 이상이면 신규매수는 BLOCK, 보유는 TRIM_REVIEW로 둔다. - - late_chase_false_positive_rate를 T+5/T+20 결과로 매주 재계산한다. - - threshold 변경은 calibration_change_ledger에 변경 전후 승률과 MDD를 기록한다. - - 저성능 LLM은 신호 해석을 하지 말고 gate 결과와 reason_code만 복사한다. - acceptance_tests: - - python tools/build_anti_late_chase_v5.py --json GatherTradingData.json --out Temp/anti_late_chase_v5.json - - python tools/validate_anti_distribution_v4.py --out Temp/anti_distribution_validation_v4.json - - buy_after_5d_runup_without_pullback_count == 0 - - distribution_confirmed_buy_count == 0 - - late_chase_false_positive_rate <= 20 - completion_metric: late_chase_false_positive_rate <= 20 and distribution_confirmed_buy_count == 0 - fail_policy: FAIL이면 신규 BUY/ADD_ON은 SHADOW_LEDGER_ONLY. 기존 포지션은 보유/감축 판단만 허용. - depends_on: - - P1-009 -- id: P1-011 - priority: P1 - title: Backtest/Replay/Live Separation — 리플레이 성과와 실전 성과 분리 - problem: 리플레이 성과가 좋아도 live 표본이 부족하면 실제 실행 엔진으로 승격하면 안 된다. - methodology: evidence_segregation + promotion_gate - target_state: backtest, replay, paper, live를 분리하고 각 단계별 승격 기준을 명확히 둔다. - files_to_create_or_modify: - - spec/29_backtest_harness_contract.yaml - - spec/44_live_replay_separation.yaml - - tools/build_live_replay_separation_v2.py - - tools/validate_no_replay_live_mix_v1.py - step_by_step_for_low_capability_llm: - - 모든 outcome row에 source_type을 backtest, replay, paper, live 중 하나로 부여한다. - - live가 아닌 성과는 HTS_READY 승격 기준에 직접 사용하지 않는다. - - T+5, T+20, T+60 각각 required_live_sample을 정의한다. - - 성과 지표는 hit_rate, payoff_ratio, avg_return, median_return, max_drawdown, turnover, slippage를 함께 기록한다. - - 리플레이에서 개선된 threshold는 shadow로 N회 운용 후 live 승격한다. - - 데이터 부족은 실패가 아니라 WAIT_SAMPLE로 보고하되 주문 실행에는 사용하지 않는다. - acceptance_tests: - - python tools/build_live_replay_separation_v2.py --hist Temp/proposal_evaluation_history.json --out Temp/live_replay_separation_v2.json - - python tools/validate_no_replay_live_mix_v1.py --json Temp/live_replay_separation_v2.json - - replay_used_as_live_count == 0 - - live_t20_count >= 30 before performance_ready == true - completion_metric: replay_live_mix_count == 0 - fail_policy: FAIL이면 performance_ready=false, PASS_100 해당 기준 실패 유지. - depends_on: - - P0-008 -- id: P1-012 - priority: P1 - title: Data Provenance Ledger — 모든 숫자에 원천과 신선도 부착 - problem: 출처와 시간 정보 없는 숫자는 그럴듯하지만 투자 엔진에서는 독이다. - methodology: provenance_everywhere + stale_data_gate - target_state: 모든 report number는 source_path, json_pointer, formula_id, input_hash, as_of, freshness_status를 갖는다. - files_to_create_or_modify: - - spec/45_number_provenance_contract.yaml - - tools/build_number_provenance_ledger_v4.py - - tools/validate_number_provenance_strict_v3.py - - src/quant_engine/reporting/provenance.py - step_by_step_for_low_capability_llm: - - final_decision_packet의 모든 leaf 숫자를 순회한다. - - 각 숫자가 provenance 객체를 갖지 않으면 violation으로 기록한다. - - 시장 데이터는 as_of와 market_session을 기록한다. - - 계좌 데이터는 capture_time과 D+2 정산현금 포함 여부를 기록한다. - - 결측 또는 오래된 값은 confidence cap을 적용하고 신규 매수 게이트에 반영한다. - - Markdown에 출력되는 숫자와 packet provenance를 1:1 대조한다. - acceptance_tests: - - python tools/build_number_provenance_ledger_v4.py --packet Temp/final_decision_packet_v4.json --out Temp/number_provenance_ledger_v4.json - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.md - - number_provenance_coverage_pct == 100 - - stale_critical_number_count == 0 - - unproven_report_number_count == 0 - completion_metric: number_provenance_coverage_pct == 100 - fail_policy: FAIL이면 미증빙 숫자는 보고서에서 숨기지 말고 DATA_MISSING_PROVENANCE로 표시. 주문 판단에는 사용 금지. - depends_on: - - P0-003 - - P0-007 -- id: P1-013 - priority: P1 - title: Portfolio Risk Budget Cascade — 목표 5억까지 손실 방어 우선순위 수치화 - problem: 목표금액 5억에 가까워질수록 수익률보다 손실 방어와 현금 방어선이 더 중요해진다. - methodology: risk_budget_before_alpha - target_state: 총자산, 목표갭, 현금비율, 포지션 heat, 섹터 집중도, beta, drawdown을 하나의 risk budget cascade로 묶는다. - files_to_create_or_modify: - - spec/36_goal_risk_budget_harness.yaml - - spec/risk/aggregate_risk.yaml - - tools/build_goal_risk_budget_harness_v3.py - - tools/validate_risk_budget_cascade_v1.py - step_by_step_for_low_capability_llm: - - 총자산과 목표 5억의 gap_pct를 계산한다. - - gap이 작아질수록 신규 위성 매수 한도를 자동 축소한다. - - D+2 정산현금을 immediate_cash_equivalent로 포함한다. - - 현금 방어선 미달이면 BUY보다 cash_recovery와 trim_review를 우선한다. - - 섹터 집중도, 단일종목 비중, beta, 손실률을 total_heat로 통합한다. - - risk_budget이 부족하면 알파 점수가 높아도 수량을 줄인다. - acceptance_tests: - - python tools/build_goal_risk_budget_harness_v3.py --json GatherTradingData.json --out Temp/goal_risk_budget_harness_v3.json - - python tools/validate_risk_budget_cascade_v1.py --json Temp/goal_risk_budget_harness_v3.json - - cash_equivalent_includes_d_plus_2 == true - - risk_budget_overrun_order_count == 0 - - portfolio_heat_field_present == true - completion_metric: risk_budget_violation_count == 0 - fail_policy: FAIL이면 신규매수 차단, 리밸런싱/현금회복/위험감축 제안만 허용. - depends_on: - - P0-002 - - P1-012 -- id: P2-014 - priority: P2 - title: Document Shrink & Doctrine Split — 문서 과다를 3종으로 축소 - problem: 문서가 많으면 지침 충돌이 늘고, 긴 프롬프트는 저성능 LLM에서 오히려 일관성을 해친다. - methodology: doctrine_minimalism + yaml_rule_authority - target_state: Markdown은 doctrine, runbook, ADR 세 종류로만 남기고 세부 규칙은 YAML spec으로 이동한다. - files_to_create_or_modify: - - docs/doctrine.md - - docs/runbook.md - - governance/adr_index.yaml - - tools/validate_docs_no_rule_duplication_v1.py - - prompts/*.md - step_by_step_for_low_capability_llm: - - 모든 .md 파일을 doctrine, runbook, ADR, prompt, report_sample 중 하나로 분류한다. - - Markdown 내부의 숫자 공식, 임계값, 권위 규칙을 찾아 spec YAML로 이동한다. - - Markdown에는 spec ID 링크만 남긴다. - - prompt는 입력/출력 형식과 금지사항만 포함하고 투자 이론을 중복 설명하지 않는다. - - AGENTS.md는 읽기 순서와 하드 룰만 유지하고 200줄 이하를 목표로 한다. - - 변경 후 validate_docs_no_rule_duplication을 실행한다. - acceptance_tests: - - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_v1.json - - markdown_rule_duplication_count == 0 - - prompt_formula_definition_count == 0 - - agents_md_line_count <= 200 - completion_metric: markdown_rule_duplication_count == 0 - fail_policy: FAIL이면 문서 변경은 병합 가능하지만 release gate 승격 금지. 중복 규칙은 spec YAML로 이관할 때까지 보류. - depends_on: - - P0-001 - - P0-002 -- id: P2-015 - priority: P2 - title: Change Request Discipline — 새 팩터/규칙/문서 추가의 표준 절차 - problem: 좋은 아이디어라도 검증 없이 추가되면 엔진은 똑똑해지는 것이 아니라 불안정해진다. - methodology: CR -> shadow -> evidence -> active -> retire - target_state: 모든 변경은 change_request YAML과 ADR/rule_lifecycle을 거쳐 shadow -> active로 승격한다. - files_to_create_or_modify: - - governance/change_request_template.yaml - - governance/rule_lifecycle.yaml - - governance/adr_index.yaml - - tools/validate_change_request_v1.py - step_by_step_for_low_capability_llm: - - 새 제안은 반드시 change_request YAML로 시작한다. - - 요청서에는 problem, expected_metric, affected_formulas, affected_outputs, rollback_plan을 포함한다. - - 새 공식은 shadow_only 상태로 최소 N회 또는 required_sample까지 운용한다. - - 기존 규칙과 충돌하면 authority_matrix에 precedence를 명시한다. - - 성과 개선이 없거나 drawdown이 악화되면 retirement_condition에 따라 폐기한다. - - 폐기된 규칙은 삭제 전에 migration hash와 reason을 남긴다. - acceptance_tests: - - python tools/validate_change_request_v1.py --requests governance/change_requests --lifecycle governance/rule_lifecycle.yaml - - change_request_missing_metric_count == 0 - - rule_without_retirement_condition_count == 0 - - shadow_to_active_without_evidence_count == 0 - completion_metric: shadow_to_active_without_evidence_count == 0 - fail_policy: FAIL이면 해당 변경은 active manifest 반영 금지. - depends_on: - - P0-001 -- id: P2-016 - priority: P2 - title: Low-Capability LLM Execution Pack — 저성능 LLM 전용 실행 패킷 - problem: 저성능 LLM은 긴 맥락보다 짧고 엄격한 입력 패킷, 고정 순서, 금지어, 출력 템플릿이 필요하다. - methodology: small_context + rigid_template + output_diff_validation - target_state: final_context_for_llm.json/yaml은 필수 필드만 담고, LLM은 체크리스트 순서대로 빈칸을 채운다. - files_to_create_or_modify: - - spec/31_low_capability_llm_response_contract.yaml - - spec/46_low_capability_execution_pack.yaml - - prompts/low_capability_report_renderer.md - - tools/build_final_context_for_llm_v4.py - - tools/validate_low_capability_pack_v1.py - step_by_step_for_low_capability_llm: - - final_decision_packet에서 LLM에 필요한 필드만 추려 final_context_for_llm_v4를 만든다. - - context는 executive, blockers, action_table, shadow_ledger, data_missing, education_notes 순서로 고정한다. - - 각 필드에는 display_value와 source_key를 함께 넣는다. - - LLM 지시는 1) 복사 2) 정렬 3) 누락표시 4) 해설 순서만 허용한다. - - LLM이 쓸 수 없는 동사는 예측한다, 보장한다, 확정한다, 계산했다로 정의한다. - - 응답 검증기는 report와 packet의 숫자 차이를 0으로 요구한다. - acceptance_tests: - - python tools/build_final_context_for_llm_v4.py --packet Temp/final_decision_packet_v4.json --out Temp/final_context_for_llm_v4.yaml - - python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v4.yaml --contract spec/46_low_capability_execution_pack.yaml - - context_required_field_coverage_pct == 100 - - ambiguous_instruction_count == 0 - - llm_free_numeric_field_count == 0 - completion_metric: low_capability_reproducibility_score == 100 - fail_policy: FAIL이면 저성능 LLM용 보고서 생성 금지. 고성능 LLM도 같은 packet-only 모드로 제한. - depends_on: - - P0-003 - - P0-007 -- id: P2-017 - priority: P2 - title: Observability Dashboard — 엔진 품질을 매주 수치로 관리 - problem: 엔진 개선이 느낌으로 관리되면 문서만 늘고 성능은 좋아지지 않는다. - methodology: measure_every_release + owner_accountability - target_state: 릴리스마다 authority, data, formula, performance, execution, renderer, repo hygiene 점수를 저장한다. - files_to_create_or_modify: - - spec/37_evaluation_dashboard_contract.yaml - - tools/build_engine_observability_dashboard_v1.py - - Temp/continuous_evaluation_dashboard_v3.json - - docs/runbook.md - step_by_step_for_low_capability_llm: - - 각 release 실행 후 주요 품질 점수를 JSON으로 저장한다. - - 점수는 현재값, 전회값, 변화량, 차단 사유, owner를 포함한다. - - 주간 토/일 리밸런싱 때 dashboard를 먼저 읽는다. - - 매월 1/11/21 중간점검에는 PASS_100 실패 기준과 성과 표본 누적을 별도 보고한다. - - 점수가 악화된 항목은 자동으로 change_request 초안을 생성한다. - - dashboard가 없으면 보고서는 DATA_MISSING_DASHBOARD로 시작한다. - acceptance_tests: - - python tools/build_engine_observability_dashboard_v1.py --root . --out Temp/continuous_evaluation_dashboard_v3.json - - dashboard_axis_count >= 7 - - dashboard_owner_coverage_pct == 100 - - weekly_rebalance_check_present == true - - mid_month_check_rule_present == true - completion_metric: dashboard_owner_coverage_pct == 100 - fail_policy: FAIL이면 리밸런싱 제안은 가능하나 엔진 개선 성과 주장은 금지. - depends_on: - - P0-004 - - P1-011 -- id: P3-018 - priority: P3 - title: Repository Packaging Policy — 업로드 zip은 운용에 필요한 최소 세트만 포함 - problem: zip에 너무 많은 산출물과 중간 파일이 들어가면 LLM 컨텍스트 비용과 해석 오류가 증가한다. - methodology: minimal_upload_bundle + reproducible_build - target_state: source, contract, active runtime, essential report만 포함하고 archive/legacy/generated bulk는 제외한다. - files_to_create_or_modify: - - tools/prepare_upload_zip.py - - spec/47_packaging_policy.yaml - - tools/validate_packaging_policy_v1.py - step_by_step_for_low_capability_llm: - - zip 포함 파일을 source_required, runtime_required, report_required, test_required로 분류한다. - - Temp에서는 active manifest가 지정한 파일과 operational_report만 포함한다. - - legacy_reference_only와 archive_candidate는 zip에서 제외한다. - - generated Python model은 필요한 경우만 dist로 포함하고 원본 schema가 있으면 재생성 가능하게 한다. - - zip 생성 후 포함 파일 수, 크기, excluded 이유를 manifest로 남긴다. - - 업로드용 zip과 개발 전체 zip을 분리한다. - acceptance_tests: - - python tools/prepare_upload_zip.py --validation-mode release --profile - - python tools/validate_packaging_policy_v1.py --zip ../data_feed.zip --policy spec/47_packaging_policy.yaml - - upload_zip_legacy_artifact_count == 0 - - upload_zip_unclassified_file_count == 0 - - upload_zip_required_file_missing_count == 0 - completion_metric: upload_zip_unclassified_file_count == 0 - fail_policy: FAIL이면 업로드 zip 생성 실패로 처리하고 사용자 보고에는 마지막 정상 manifest만 사용. - depends_on: - - P0-005 - - P2-016 -low_capability_llm_master_procedure: - role: REPORT_CLERK_AND_CHECKLIST_EXECUTOR_ONLY - absolute_do_not: - - 가격, 수량, 수익률, TP, SL, 점수, 게이트를 직접 계산하지 않는다. - - Temp legacy artifact를 임의로 최신값으로 선택하지 않는다. - - PASS_100 미달 상태에서 HTS 실행 가능 문구를 쓰지 않는다. - - 데이터 결측을 추정값으로 채우지 않는다. - - 하네스가 BLOCK한 결론을 narrative로 완화하지 않는다. - execution_order: - - 1. AGENTS.md의 읽기 순서를 확인한다. - - 2. runtime/active_artifact_manifest.yaml에서 active artifact만 확인한다. - - 3. final_decision_packet을 읽고 모든 숫자의 provenance를 확인한다. - - 4. PASS_100, final_execution_gate, hts_order_count를 먼저 출력한다. - - 5. global_execution_gate가 HTS_READY가 아니면 모든 주문표를 THEORETICAL_ONLY로 표시한다. - - 6. 종목별 action은 packet의 action_code와 reason_code만 복사한다. - - 7. DATA_MISSING, FORMULA_UNREGISTERED, STALE_DATA는 숨기지 않고 표로 출력한다. - - 8. 마지막에 이번 주 리밸런싱 TODO와 다음 검증 명령만 출력한다. - fixed_output_sections: - - A. 시스템 게이트와 차단 사유 - - B. 포트폴리오 현황과 목표 5억 gap - - C. 현금/D+2 방어선 - - D. 종목별 action table - - E. shadow ledger / theoretical orders - - F. 데이터 결측·신선도·provenance - - G. 이번 주 리밸런싱 액션 - - H. 엔진 개선 TODO와 검증 명령 -recommended_first_7_days_execution_plan: -- day: 1 - focus: P0-001~P0-002 - deliverable: authority_matrix + formula_registry_v2 validation - do_not: 새 팩터 추가 금지 -- day: 2 - focus: P0-003 - deliverable: final_decision_packet_v4 contract and renderer packet-only draft - do_not: 보고서에서 Temp 직접 읽기 금지 -- day: 3 - focus: P0-004 - deliverable: release_dag.yaml and root-cause fail-fast executor - do_not: full-gate에 임시 script 계속 추가 금지 -- day: 4 - focus: P0-005 - deliverable: artifact_retirement_plan_v1 with quarantine manifest - do_not: 바로 삭제하지 말고 hash와 legacy reason 기록 -- day: 5 - focus: P0-006~P0-007 - deliverable: GAS forbidden logic audit + renderer no-calculation lock - do_not: GAS에서 신규 판단 로직 작성 금지 -- day: 6 - focus: P0-008 + P1-012 - deliverable: honest PASS_100 + number provenance strict gate - do_not: 실행 가능성과 보고 가능성 혼용 금지 -- day: 7 - focus: P1-009~P1-011 - deliverable: factor taxonomy + anti-late-chase + live/replay separation - do_not: 리플레이 성과를 실전 승격 근거로 사용 금지 -definition_of_done_for_best_quant_engine: - source_authority: authority_integrity_score == 100 - formula: formula_implementation_score == 100 and missing_golden_case_count == 0 - data: schema_presence_score == 100 and missing_critical_field_count == 0 and stale_critical_number_count == 0 - decision: single_truth_conflict_count == 0 and decision_reproducibility_score == 1.0 - execution: global_execution_gate == HTS_READY only when PASS_100 true and hts_order_count > 0 - report: renderer_calculation_count == 0 and unproven_report_number_count == 0 - performance: live_t20_count >= 30 and performance_readiness_score >= 90 before active execution upgrade - maintenance: all changes pass change_request -> shadow -> evidence -> active lifecycle - llm: low_capability_reproducibility_score == 100 -final_recommendation: - immediate_decision: 새 문서를 더 만드는 방식은 중단하고, source authority collapse와 final_decision_packet monolith부터 수행한다. - architecture_decision: YAML contract + Python canonical + GAS thin adapter + Markdown doctrine/report로 고정한다. - pm_decision: P0-001~P0-008 전에는 신규 팩터나 매매 알고리즘 추가를 금지한다. - quant_decision: 성과 개선은 리플레이가 아니라 live/paper 분리 표본과 drawdown 방어 기준으로만 승격한다. - developer_decision: tools는 CLI wrapper로 줄이고 src/quant_engine에 canonical domain logic을 모은다. -task_execution_status: - summary: - implemented: 18 - validated: 14 - completed: 14 - blocked: 4 - operational_ready: false - items: - - id: P0-001 - status: completed - - id: P0-002 - status: completed - - id: P0-003 - status: blocked - reason: render_operational_report.py의 Temp 직접 읽기 제거가 아직 남음 - - id: P0-004 - status: blocked - reason: package.json full-gate를 단일 release DAG executor로 수렴하는 대규모 리팩토링이 남음 - - id: P0-005 - status: completed - - id: P0-006 - status: blocked - reason: gas_*.gs의 forbidden decision logic을 0으로 만드는 thin adapter 이관이 남음 - - id: P0-007 - status: blocked - reason: renderer no-calculation lock이 render_operational_report.py 전체 정리 없이는 충족되지 않음 - - id: P0-008 - status: completed - - id: P1-009 - status: completed - - id: P1-010 - status: completed - - id: P1-011 - status: completed - - id: P1-012 - status: completed - - id: P1-013 - status: completed - - id: P2-014 - status: completed - - id: P2-015 - status: completed - - id: P2-016 - status: completed - - id: P2-017 - status: completed - - id: P3-018 - status: completed diff --git a/suggest/quant_engine_refactor_methodology_todo_v1.yaml b/suggest/quant_engine_refactor_methodology_todo_v1.yaml deleted file mode 100644 index 4385108..0000000 --- a/suggest/quant_engine_refactor_methodology_todo_v1.yaml +++ /dev/null @@ -1,1462 +0,0 @@ -meta: - title: Quant Engine Deterministic Architecture Refactor Methodology TODO - version: 2026-06-06.v1 - language: ko-KR - author_role: - - 30y_quant_investor - - senior_developer - - systems_architect - - senior_pm - input_basis: - archive: data_feed.zip - primary_instruction: data_feed/AGENTS.md - source_file_scope: - - '*.md' - - '*.yaml' - - '*.gs' - - '*.py' - runtime_artifact_scope: - - '*.json' - - '*.jsonl' - - dist/*.yaml - inspected_inventory: - md_files: 16 - yaml_files: 104 - gs_files: 7 - py_files: 376 - json_artifacts: 511 - large_files_observed: - AGENTS.md: 119KB / 1067 lines - spec/13_formula_registry.yaml: 176KB / 4638 lines - gas_data_feed.gs: 459KB / 10271 lines - gas_data_collect.gs: 215KB / 4429 lines - tools/validate_engine_harness_gate.py: 91KB / 1841 lines - Temp/operational_report.json: 202KB / 550 lines - non_investment_note: 이 문서는 투자 매수/매도 지시가 아니라 퀀트투자 엔진 개발·검증·운영 방법론 리팩토링 지침이다. -executive_decision: - adopt_methodology_name: 'QEDA-DM: Quant Engine Deterministic Architecture Development Methodology' - one_sentence: LLM 판단을 제거하고, 수치·공식·데이터·권위 소스·검증 게이트를 코드와 계약으로 고정한 뒤 LLM은 검증된 패킷을 렌더링만 하게 만드는 개발 방법론. - core_thesis: - - 현재 엔진의 병목은 알파 아이디어 부족이 아니라 권위 소스 충돌, 산출 공식 중복, 임시 산출물 난립, 대형 GAS/검증 스크립트의 응집도 붕괴다. - - 최고 성능 LLM과 저성능 LLM의 결과 차이를 줄이는 유일한 방법은 LLM의 자유도를 줄이고 deterministic packet, schema, golden case, formula registry, renderer - contract로 결과 공간을 닫는 것이다. - - AGENTS.md는 운영 헌법/인덱스로 축소하고, 공식·필드·게이트·출력·실행은 yaml 계약과 py/gs 구현의 parity test로 강제한다. - target_state: - llm_freedom_pct: 0.0 - runtime_adjusted_formula_coverage_pct: 100.0 - unmapped_formula_count: 0 - ungrounded_number_count: 0 - authority_collision_count: 0 - golden_case_decision_critical_coverage_pct: 100.0 - gas_python_formula_parity_fail_count: 0 - operational_report_schema_valid: true - human_override_transparency_required: true -problem_diagnosis: - P01_authority_sprawl: - symptom: AGENTS.md, spec yaml, Temp json, GAS, Python validators가 모두 판단 근거처럼 사용될 위험. - risk: 동일 필드/공식/게이트가 여러 파일에서 다른 의미로 해석되면 매수·매도 판단이 뒷북/설거지로 변질된다. - required_fix: authority matrix와 active_manifest만 읽게 하고, 나머지는 build input 또는 audit output으로 격리한다. - P02_version_fragmentation: - symptom: Temp에 v1~v8 계열 산출물이 다수 존재한다. - risk: 저성능 LLM 또는 스크립트가 최신이 아닌 산출물을 읽어 잘못된 수량·가격·게이트를 렌더링할 수 있다. - required_fix: 'canonical_artifact_resolver와 artifact_status: active|superseded|archived|forbidden_read를 강제한다.' - P03_document_bloat: - symptom: AGENTS.md 1000라인+, formula_registry 4600라인+, gas_data_feed 10000라인+. - risk: 사람과 LLM 모두 전체 규칙을 일관되게 적용하기 어렵고, 리팩토링 단위가 커져 회귀버그가 늘어난다. - required_fix: 도메인별 모듈화, ADR, rule lifecycle, owner ledger, max file size gate를 도입한다. - P04_hallucination_surface: - symptom: LLM이 문서와 산출물 사이에서 누락 숫자를 보완하려는 유혹이 생긴다. - risk: 임의 가격, 임의 TP/SL, 임의 수량 산출이 발생한다. - required_fix: number_provenance_self_audit, output_field_owner_ledger, renderer-only LLM contract를 강화한다. - P05_methodology_gap: - symptom: 기능 추가 TODO는 많지만 제품형 엔진의 architecture governance, release train, observability, lineage, calibration loop가 하나의 - 방법론으로 닫혀 있지 않다. - risk: 개선은 계속되나 방향성이 누적되지 않고, 성과 검증보다 문서 추가가 선행된다. - required_fix: QEDA-DM 9단계 lifecycle을 표준 개발 프로세스로 채택한다. -methodology: - name: QEDA-DM - principles: - - id: PR01 - name: Contract first - rule: 새 기능은 구현보다 먼저 YAML contract, JSON schema, golden cases, output owner를 등록한다. - - id: PR02 - name: Deterministic core - rule: 가격·수량·점수·게이트는 Python/GAS 공식으로만 산출하고 LLM 산출을 금지한다. - - id: PR03 - name: LLM renderer only - rule: LLM은 final_decision_packet을 해석·표시만 하며 숫자를 생성하거나 수정하지 않는다. - - id: PR04 - name: One active artifact - rule: 동일 목적 산출물은 active_manifest가 지정한 1개만 runtime source로 허용한다. - - id: PR05 - name: Evidence before recommendation - rule: 투자 제안은 formula_id, input_fields, timestamp, source_artifact, confidence를 가진 evidence ledger 없이는 출력하지 않는다. - - id: PR06 - name: No false 100% - rule: 100% 완료는 gate result, failed_checks=0, sample maturity 충족, parity pass가 있을 때만 선언한다. - - id: PR07 - name: Separate policy and implementation - rule: AGENTS/MD는 정책·해설, YAML은 계약, PY는 canonical engine, GS는 sheet adapter, JSON은 runtime artifact로 제한한다. - - id: PR08 - name: Small files, strong interfaces - rule: 대형 파일은 도메인 모듈로 쪼개고 public function/import boundary를 고정한다. - - id: PR09 - name: Replayability - rule: 모든 판단은 동일 input snapshot으로 재실행 시 동일 output hash가 나와야 한다. - - id: PR10 - name: Outcome-calibrated evolution - rule: 룰 추가는 실제 outcome ledger와 calibration registry의 개선 근거가 있어야 승격한다. - lifecycle: - - stage: S0_intake - owner: PM/quant - output: proposal_ticket.yaml - exit_gate: business_hypothesis, risk, affected_fields 명시 - - stage: S1_contract - owner: architect - output: spec/contracts/*.yaml + schemas/*.json - exit_gate: field owner, formula owner, artifact owner 등록 - - stage: S2_formula - owner: quant - output: spec/formulas/*.yaml + golden_cases.yaml - exit_gate: manual expected result and edge cases complete - - stage: S3_canonical_python - owner: developer - output: src/quant_engine/**/*.py - exit_gate: pytest golden pass - - stage: S4_gas_adapter - owner: GAS maintainer - output: gas/**/*.gs - exit_gate: GAS-Python parity pass - - stage: S5_pipeline - owner: platform - output: Temp/*.json via build commands - exit_gate: schema validation and lineage event recorded - - stage: S6_render - owner: LLM/reporting - output: operational_report.md/json - exit_gate: no ungrounded number, narrative lock pass - - stage: S7_release - owner: release manager - output: dist + zip - exit_gate: full-gate status OK and failed_checks_count=0 - - stage: S8_feedback - owner: quant/PM - output: outcome_ledger + calibration backlog - exit_gate: sample maturity and real outcome attribution complete -authority_model: - read_order_highest_to_lowest: - - rank: 1 - source: active_artifact_manifest.yaml - authority: runtime에서 읽을 산출물 1개를 지정하는 최상위 resolver - - rank: 2 - source: final_decision_packet.json - authority: 렌더링 가능한 최종 숫자·수량·게이트 패킷 - - rank: 3 - source: spec/formulas/*.yaml - authority: 공식 정의와 formula_id의 단일 원장 - - rank: 4 - source: spec/field_dictionary.yaml - authority: 필드명·단위·nullable·owner 정의 - - rank: 5 - source: schemas/*.schema.json - authority: artifact shape validation - - rank: 6 - source: AGENTS.md - authority: 운영 금지사항·보고서 인덱스·사람용 헌법 - - rank: 7 - source: README.md/prompts/*.md - authority: 사용법·렌더링 프롬프트. 숫자 권위 없음 - - rank: 8 - source: Temp/superseded/* - authority: 감사·재현용. runtime read 금지 - file_type_contract: - .md: 정책, 설명, 프롬프트, ADR 요약만 허용. 숫자 산출 공식의 원본 권위 금지. - .yaml: spec, formula, data contract, TODO, lifecycle, owner ledger의 원본 권위. - .py: canonical deterministic implementation, validator, test runner, migration script. - .gs: Google Sheets/App Script adapter. canonical 계산을 복제할 때는 반드시 parity test 필요. - .json: runtime artifact. 사람이 직접 편집하지 않는다. - conflict_resolution: - - 동일 필드 정의가 두 곳 이상이면 output_field_owner_ledger.yaml의 owner가 우선한다. - - AGENTS.md와 spec yaml이 충돌하면 spec yaml을 우선하고 AGENTS.md를 인덱스로 정정한다. - - GAS와 Python 결과가 다르면 release 차단. Python canonical이 우선이며 GAS adapter를 수정한다. - - 외부 시장 데이터와 harness 가격이 다르면 harness 가격을 주문 판단에 사용하고 외부 데이터는 CONTEXT_ONLY로 격리한다. - - Temp에 복수 버전이 있으면 active_manifest가 active로 지정한 파일만 사용한다. -target_repository_architecture: - proposed_tree: - governance/: - - AGENTS.md 축소본 - - adr/*.md - - rule_lifecycle.yaml - - authority_matrix.yaml - spec/: - - contracts/*.yaml - - formulas/*.yaml - - fields/*.yaml - - outputs/*.yaml - - risk/*.yaml - - strategy/*.yaml - schemas/: - - '*.schema.json' - - generated/ - src/quant_engine/: - - data/ - - features/ - - formulas/ - - gates/ - - routing/ - - sizing/ - - execution/ - - portfolio/ - - reporting/ - - observability/ - gas/: - - adapters/ - - sheets/ - - render_bridge/ - - legacy/ - tools/: - - build_*.py - - validate_*.py - - migrate_*.py - - audit_*.py - tests/: - - golden/ - - parity/ - - regression/ - - property/ - - integration/ - runtime/: - - active_artifact_manifest.yaml - - lineage_events.jsonl - - run_profiles/ - Temp/: - - generated artifacts only; no manual edit; no direct LLM read except manifest-approved artifacts - dist/: - - packaged compact yaml bundles - max_file_size_policy: - AGENTS.md: - max_lines: 350 - action_if_exceeded: move detailed rules into spec/governance/*.yaml and keep index links - single_formula_yaml: - max_lines: 800 - action_if_exceeded: 'split by domain: risk, entry, exit, cash, portfolio, report' - single_gs_file: - max_lines: 1500 - action_if_exceeded: move functions to gas/adapters/domain_*.gs - single_py_file: - max_lines: 800 - action_if_exceeded: split into package modules and shared validation utilities - prompt_md: - max_lines: 250 - action_if_exceeded: convert output constraints to machine-readable render_contract.yaml -canonical_engine_layers: - L0_data_ingest: - responsibility: 수집, 정규화, source timestamp, freshness, unit validation - must_not: 투자 판단 산출 금지 - artifacts: - - raw_snapshot - - normalized_snapshot - - data_quality_report - L1_feature_store: - responsibility: 가격/거래대금/펀더멘털/스마트머니/섹터/거시/계좌 피처 생성 - must_not: 매수/매도 verdict 생성 금지 - artifacts: - - feature_matrix - - feature_lineage - L2_formula_engine: - responsibility: formula_registry 기반 deterministic score/threshold 산출 - must_not: 렌더링 문장 생성 금지 - artifacts: - - formula_outputs - - formula_trace - L3_gate_engine: - responsibility: cash, heat, risk, data maturity, anti-chase, stop/tp, sector, beta, portfolio health gate 판정 - must_not: 게이트 실패를 문장으로 완화 금지 - artifacts: - - gate_results - - blocked_reason_ledger - L4_router: - responsibility: 단타/단기/중기/장기, BUY/HOLD/TRIM/SELL/WATCH/BLOCKED 라우팅 - must_not: 수량/가격 재산출 금지 - artifacts: - - routing_trace - - decision_path - L5_position_execution: - responsibility: position sizing, tranche, sell priority, HTS order blueprint, shadow ledger 산출 - must_not: HTS 단일 조건 위반, tick 미정규화 가격 출력 금지 - artifacts: - - order_blueprint - - shadow_ledger - L6_report_renderer: - responsibility: final_decision_packet을 사람이 읽는 보고서로 렌더링 - must_not: 새 숫자 생성, 누락 필드 보완, softening narrative 생성 금지 - artifacts: - - operational_report.json - - operational_report.md - L7_outcome_feedback: - responsibility: 실행/미실행 결과, slippage, late chase, value damage, hit ratio, alpha decay 추적 - must_not: 표본 미성숙 상태에서 PASS 또는 100% 주장 금지 - artifacts: - - outcome_ledger - - calibration_registry_update_queue -numeric_governance_formulas: - data_integrity_score: - formula: 100 * (1 - weighted_error_count / weighted_required_check_count) - hard_floor_for_release: 100.0 - error_classes: - - missing_required_field - - stale_timestamp - - unit_mismatch - - source_conflict - - schema_invalid - authority_collision_score: - formula: 100 * (1 - collision_count / max(1, owned_field_count)) - release_condition: collision_count == 0 - hallucination_risk_score: - formula: 100 * (ungrounded_number_count + unsupported_claim_count + llm_modified_field_count) / max(1, output_number_count - + output_claim_count) - release_condition: score == 0 and ungrounded_number_count == 0 - determinism_score: - formula: 100 * deterministic_hash_match_count / replay_case_count - release_condition: score == 100 and replay_case_count >= minimum_replay_cases - formula_parity_score: - formula: 100 * (1 - abs(py_result - gas_result) / tolerance_denominator) averaged across golden cases - release_condition: all cases pass exact or tolerance-specific checks - sample_maturity_score: - formula: min(100, 100 * effective_sample_n / required_sample_n) - rule: effective_sample_n < required_sample_n이면 PASS 금지, WATCH_PENDING_SAMPLE로 강등 - engine_maturity_score: - formula: 0.20*data_integrity + 0.20*formula_coverage + 0.15*parity + 0.15*determinism + 0.15*outcome_maturity + 0.10*lineage - + 0.05*docs_hygiene - interpretation: - '90_100': release_ready - '75_89': limited_release - '60_74': shadow_only - below_60: development_only -todo_backlog: -- phase: P0_freeze_and_inventory - id: P0_T01_ACTIVE_MANIFEST - priority: P0 - title: 런타임 권위 산출물 active manifest 단일화 - owner: architect/platform - rationale: Temp 산출물이 500개 이상이며 버전이 다수 존재하므로 runtime에서 읽을 파일을 1개씩 잠그지 않으면 구버전 오독 가능성이 크다. - target_files: - - runtime/active_artifact_manifest.yaml - - tools/validate_active_manifest.py - - Temp/active_artifact_manifest_v*.json - implementation_steps: - - runtime/active_artifact_manifest.yaml 생성 - - artifact_key별 active_path, schema_path, freshness_sla_min, status, produced_by, consumed_by를 명시 - - Temp의 구버전 artifact는 superseded로 태깅 - - LLM/report renderer는 manifest active_path 외 직접 Temp 읽기 금지 - commands: - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict - acceptance_criteria: - - 모든 artifact_key가 active_path exactly 1개 보유 - - status in [active,superseded,archived,forbidden_read] - - forbidden_read artifact를 참조하는 코드/프롬프트 0건 - low_capability_llm_instruction: Temp 폴더에서 최신처럼 보이는 파일을 직접 고르지 말고 manifest에 등록된 active_path만 사용하라. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P0_freeze_and_inventory - id: P0_T02_AUTHORITY_MATRIX - priority: P0 - title: 필드·공식·출력 owner authority matrix 작성 - owner: architect/quant - rationale: 필드 정의/공식/렌더링 책임이 분산되면 동일 숫자가 다른 곳에서 재정의된다. - target_files: - - governance/authority_matrix.yaml - - spec/03_formulas/output_field_owner_ledger.yaml - - spec/12_field_dictionary.yaml - implementation_steps: - - 모든 output field에 owner_type(formula|data|renderer|manual), owner_file, owner_formula_id를 매핑 - - 중복 owner를 collision으로 기록 - - AGENTS.md에 있는 숫자 규칙은 matrix에 링크만 남김 - commands: - - python tools/build_authority_matrix.py --spec spec --out governance/authority_matrix.yaml - - python tools/validate_authority_matrix.py --strict - acceptance_criteria: - - owned_output_field_pct == 100 - - authority_collision_count == 0 - - manual_override_field는 override_reason과 audit_required=true 보유 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P0_freeze_and_inventory - id: P0_T03_BASELINE_METRICS - priority: P0 - title: 현재 엔진 구조 부채 baseline metrics 고정 - owner: platform - rationale: 개선 전 기준선을 수치화하지 않으면 리팩토링 성과를 증빙할 수 없다. - target_files: - - Temp/refactor_baseline_metrics_v1.json - - tools/build_refactor_baseline_metrics.py - implementation_steps: - - 파일 타입별 수량, 대형 파일 수, duplicate formula_id, duplicate artifact_key, deprecated read reference, test coverage를 측정 - - 결과를 refactor_baseline_metrics_v1.json으로 저장 - - 향후 PR마다 delta를 비교 - commands: - - python tools/build_refactor_baseline_metrics.py --root . --out Temp/refactor_baseline_metrics_v1.json - acceptance_criteria: - - baseline json schema valid - - large_file_count, duplicate_formula_count, authority_collision_count 필드 존재 - - 다음 release에서 개선/악화 delta 출력 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P1_document_refactor - id: P1_T01_AGENTS_SHRINK - priority: P0 - title: AGENTS.md를 헌법/인덱스로 축소 - owner: architect/PM - rationale: 1000라인 이상의 AGENTS.md는 저성능 LLM이 일관되게 적용하기 어렵고, rule source와 commentary가 섞인다. - target_files: - - AGENTS.md - - governance/agents_index.yaml - - governance/rules/*.yaml - implementation_steps: - - AGENTS.md를 300~350라인 이하로 축소 - - 상위 금지사항, source-of-truth, required decision flow, output standard만 유지 - - 세부 Direction은 governance/rules/*.yaml로 이동하고 ID별 링크 유지 - - 이동 전후 rule_id hash 비교 - commands: - - python tools/split_agents_rules.py --in AGENTS.md --out governance/rules --index governance/agents_index.yaml - - python tools/validate_agents_index.py --strict - acceptance_criteria: - - AGENTS.md lines <= 350 - - rule_id_count_before == rule_id_count_after - - missing_rule_id_count == 0 - - AGENTS.md에 산출 공식 원문 없음 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P1_document_refactor - id: P1_T02_ADR_SYSTEM - priority: P0 - title: ADR 기반 의사결정 기록 체계 도입 - owner: PM/architect - rationale: 리팩토링/룰 변경의 이유와 부작용을 기록하지 않으면 같은 논쟁과 같은 패치가 반복된다. - target_files: - - governance/adr/0001-adopt-qeda-dm.md - - governance/adr_index.yaml - implementation_steps: - - 'ADR 템플릿 생성: context, decision, alternatives, consequences, rollback, affected_files' - - 주요 결정 10개를 ADR로 등록 - - 새 formula/gate 도입 PR에는 ADR 또는 rule lifecycle ticket 필수 - commands: - - python tools/validate_adr_index.py --index governance/adr_index.yaml - acceptance_criteria: - - adr_index.yaml에 모든 ADR 등록 - - 각 ADR status in [proposed,accepted,superseded,deprecated] - - accepted ADR의 consequences와 rollback 존재 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P1_document_refactor - id: P1_T03_RULE_LIFECYCLE - priority: P0 - title: 룰 생명주기 정책 등록 - owner: quant/architect - rationale: 새 룰이 계속 누적되면 엔진은 고도화가 아니라 규칙 부채가 된다. - target_files: - - governance/rule_lifecycle.yaml - - tools/validate_rule_lifecycle.py - implementation_steps: - - rule status를 proposed->shadow->active->deprecated->removed로 정의 - - 'active 승격 조건: golden case, parity, outcome hypothesis, kill switch' - - deprecated 룰은 active router에서 참조 금지 - commands: - - python tools/validate_rule_lifecycle.py --strict - acceptance_criteria: - - active rule은 owner, formula_id, schema, tests, rollback 모두 존재 - - deprecated active reference count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P2_formula_contract - id: P2_T01_FORMULA_DOMAIN_SPLIT - priority: P0 - title: formula registry를 도메인별로 분할하고 normalized registry를 빌드 산출물로 전환 - owner: quant/developer - rationale: 단일 4600라인 formula registry는 충돌 탐지와 리뷰가 어렵다. - target_files: - - spec/formulas/risk.yaml - - spec/formulas/entry.yaml - - spec/formulas/exit.yaml - - spec/formulas/cash.yaml - - spec/formulas/portfolio.yaml - - spec/formulas/reporting.yaml - - spec/03_formulas/formula_registry.normalized.yaml - implementation_steps: - - 기존 spec/13_formula_registry.yaml을 domain별 yaml로 분할 - - 각 formula에 formula_id, version, inputs, outputs, units, null_policy, tick_policy, precision, owner, golden_cases를 명시 - - normalized registry는 빌드 산출물로만 생성 - commands: - - python tools/split_formula_registry.py --in spec/13_formula_registry.yaml --out spec/formulas - - python tools/build_formula_registry_normalized.py --in spec/formulas --out spec/03_formulas/formula_registry.normalized.yaml - - python tools/validate_formula_registry.py --strict - acceptance_criteria: - - formula_id unique - - all input fields exist in field_dictionary - - all outputs have owner ledger entry - - normalized registry deterministic hash stable - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P2_formula_contract - id: P2_T02_GOLDEN_CASE_EXPANSION - priority: P0 - title: 의사결정 핵심 공식 golden case 100% 확대 - owner: quant/QA - rationale: 저성능 LLM에게 자세히 지시해도 공식 검증이 없으면 잘못된 계산을 감지할 수 없다. - target_files: - - tests/golden/formula_golden_cases.yaml - - tools/run_golden_cases_py.py - - tools/run_gas_golden_parity.js - implementation_steps: - - 모든 decision critical formula에 normal/edge/missing/stale/extreme case 작성 - - 손계산 expected_result와 provenance를 기록 - - Python canonical과 GAS adapter를 같은 case로 검증 - commands: - - python tools/run_golden_cases_py.py --cases tests/golden/formula_golden_cases.yaml - - node tools/run_gas_golden_parity.js --cases tests/golden/formula_golden_cases.yaml - acceptance_criteria: - - decision_critical_formula_coverage_pct == 100 - - python_fail_count == 0 - - gas_parity_fail_count == 0 - - expected_result 없는 case 0건 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P2_formula_contract - id: P2_T03_THRESHOLD_CALIBRATION_LEDGER - priority: P0 - title: 임계값 보정 레지스트리와 outcome 근거 연결 - owner: quant - rationale: 임계값이 많아질수록 주관적 튜닝이 성과로 오인될 위험이 커진다. - target_files: - - spec/calibration/calibration_registry.yaml - - Temp/calibration_change_ledger_v*.json - - Temp/outcome_ledger_v1.json - implementation_steps: - - 각 threshold에 source_type(backtest|live_outcome|expert_default), sample_n, valid_from, review_after, expected_effect를 등록 - - sample_n 부족 시 expert_default로 표시하고 PASS 증빙에 사용 금지 - - 변경마다 before/after 예상효과와 실제효과 추적 - commands: - - python tools/validate_calibration_registry_v1.py --strict - - python tools/build_calibration_priority_v1.py - acceptance_criteria: - - unregistered_threshold_count == 0 - - overclaimed_calibration_count == 0 - - sample_n < 30 threshold는 active 승격 금지 또는 WATCH_PENDING_SAMPLE - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P3_data_contract - id: P3_T01_FIELD_DICTIONARY_STRICT - priority: P0 - title: field dictionary를 데이터 정합성의 단일 권위로 승격 - owner: data architect - rationale: 필드명/단위/null 정책이 흔들리면 모든 공식이 오염된다. - target_files: - - spec/fields/field_dictionary.yaml - - spec/12_field_dictionary.yaml - - tools/validate_field_dictionary.py - implementation_steps: - - 필드마다 canonical_name, aliases, dtype, unit, nullable, freshness_sla, source_system, owner_formula를 정의 - - alias는 ingest 단계에서만 허용하고 formula engine 내부는 canonical_name만 허용 - - unknown field는 경고가 아니라 build fail - commands: - - python tools/validate_field_dictionary.py --strict - acceptance_criteria: - - canonical field coverage 100% - - unknown_field_count == 0 - - unit_mismatch_count == 0 - - nullable_violation_count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P3_data_contract - id: P3_T02_DATA_QUALITY_EXPECTATIONS - priority: P0 - title: 데이터 품질 expectation suite 도입 - owner: data/QA - rationale: 신선도, 결측, 범위, 단위, cross-field consistency를 코드화해야 데이터 정합성을 지속 관리할 수 있다. - target_files: - - spec/data_quality/expectations.yaml - - tools/validate_data_quality_expectations.py - - Temp/data_quality_reconciliation_v1.json - implementation_steps: - - 필드별 not_null, in_range, freshness, allowed_values, cross_field_rule 작성 - - 계좌/가격/펀더멘털/외부컨텍스트를 expectation group으로 분리 - - 위반은 severity critical|warning|info로 구분 - commands: - - python tools/validate_data_quality_expectations.py --snapshot GatherTradingData.json --expect spec/data_quality/expectations.yaml - acceptance_criteria: - - critical expectation fail_count == 0 - - warning은 report에 노출 - - expectation coverage over required fields == 100 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P3_data_contract - id: P3_T03_LINEAGE_EVENTS - priority: P0 - title: artifact lineage 이벤트 원장 생성 - owner: platform - rationale: 어떤 input이 어떤 output 숫자를 만들었는지 추적할 수 없으면 오류 원인 분석이 느리다. - target_files: - - runtime/lineage_events.jsonl - - tools/emit_lineage_event.py - - tools/validate_lineage.py - implementation_steps: - - 모든 build_*.py는 input_artifacts, output_artifacts, code_version_hash, started_at, ended_at, status를 lineage event로 기록 - - report의 각 숫자는 source_artifact와 formula_id를 역추적 가능해야 함 - - lineage 누락 시 release fail - commands: - - python tools/validate_lineage.py --manifest runtime/active_artifact_manifest.yaml --events runtime/lineage_events.jsonl - --strict - acceptance_criteria: - - lineage_coverage_pct == 100 for active artifacts - - orphan_artifact_count == 0 - - missing_code_hash_count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P4_code_refactor - id: P4_T01_PYTHON_CANONICAL_PACKAGE - priority: P0 - title: Python canonical engine 패키지화 - owner: senior developer - rationale: tools/*.py에 기능이 분산되면 재사용성/테스트/타입 안정성이 낮아진다. - target_files: - - src/quant_engine/ - - pyproject.toml - - tools/*.py - implementation_steps: - - src/quant_engine 패키지 생성 - - formulas, gates, routing, sizing, execution, reporting, validation 모듈 분리 - - tools/*.py는 CLI wrapper만 남기고 core logic은 src로 이동 - - 공통 load/validate/hash/logging utility 통합 - commands: - - python -m pytest tests/unit tests/golden - - python tools/validate_runtime_type_edges.py - acceptance_criteria: - - tools file average lines 감소 - - src unit test pass - - CLI backward compatibility pass - - mypy 또는 pyright strict subset pass 가능 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P4_code_refactor - id: P4_T02_GAS_ADAPTER_SPLIT - priority: P0 - title: 대형 GAS 파일을 adapter 계층으로 분할 - owner: GAS maintainer - rationale: gas_data_feed.gs 1만 라인 구조는 단일 변경의 회귀 영향이 너무 크다. - target_files: - - gas/adapters/*.gs - - gas/sheets/*.gs - - gas/legacy/*.gs - - gas_data_feed.gs - implementation_steps: - - GAS 함수를 data collect, normalization, formula adapter, sheet write, report bridge로 분리 - - legacy wrapper는 기존 함수명을 유지해 호환성 확보 - - 모든 복제 공식에 formula_id 주석과 Python canonical reference를 달기 - - GAS는 가능한 한 read/write adapter로 축소 - commands: - - npm run validate-gas-call-arity - - node tools/run_gas_golden_parity.js - acceptance_criteria: - - single gs file lines <= 1500 - - validate-gas-call-arity pass - - gas golden parity pass - - legacy public function missing 0건 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P4_code_refactor - id: P4_T03_SCHEMA_MODEL_GENERATION - priority: P0 - title: YAML/JSON schema에서 Pydantic model 자동 생성 - owner: developer/QA - rationale: 스키마와 Python 타입이 따로 놀면 런타임 오류를 늦게 발견한다. - target_files: - - schemas/*.schema.json - - schemas/generated/*.py - - src/quant_engine/models/ - implementation_steps: - - 스키마에서 Pydantic model 생성 또는 수동 model과 schema parity 검증 - - strict type, unit, optional policy 적용 - - artifact 로딩은 model validation을 통과해야만 허용 - commands: - - python tools/generate_models_from_schema.py --schemas schemas --out src/quant_engine/models/generated - - python tools/validate_runtime_type_edges.py - acceptance_criteria: - - all active artifacts validate with generated models - - model/schema drift count == 0 - - runtime type edge validation pass - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P5_decision_harness - id: P5_T01_DECISION_GRAPH_DAG - priority: P0 - title: 11단계 라우팅을 DAG로 명시하고 결정 경로를 로그화 - owner: architect/quant - rationale: 결정 순서가 문서/코드마다 다르면 같은 데이터에서 다른 verdict가 나온다. - target_files: - - spec/routing/decision_graph.yaml - - src/quant_engine/routing/decision_graph.py - - Temp/routing_execution_log_table_v1.json - implementation_steps: - - '노드: data_quality -> portfolio_health -> cash -> heat -> stop/tp -> anti_chase -> regime -> sector/beta -> style -> sizing - -> execution' - - 각 노드의 inputs, outputs, preconditions, fail_action, priority를 YAML로 작성 - - router는 YAML DAG를 읽어 실행하고 trace를 남김 - commands: - - python tools/validate_decision_graph.py --graph spec/routing/decision_graph.yaml --strict - - python tools/build_routing_execution_log_v1.py - acceptance_criteria: - - routing path deterministic hash stable - - all verdicts have decision_path - - unreachable node count == 0 - - priority conflict count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P5_decision_harness - id: P5_T02_FINAL_PACKET_CONTRACT - priority: P0 - title: final_decision_packet을 LLM 입력의 유일한 계약으로 고정 - owner: reporting/architect - rationale: 저성능 LLM은 입력이 많으면 임의 선택을 하므로 final packet 하나만 읽게 해야 한다. - target_files: - - schemas/final_decision_packet_v3.schema.json - - Temp/final_decision_packet_v3.json - - prompts/report_renderer_prompt.md - implementation_steps: - - packet에 account_summary, portfolio_health, gate_summary, order_blueprint, shadow_ledger, evidence_ledger, forbidden_actions를 - 포함 - - 모든 숫자 필드에는 source_ref와 formula_id를 붙임 - - LLM prompt는 packet 외 파일 참조 금지 - commands: - - python tools/build_final_decision_packet_v3.py --manifest runtime/active_artifact_manifest.yaml --out Temp/final_decision_packet_v3.json - - python tools/validate_final_decision_packet.py --strict - acceptance_criteria: - - final packet schema valid - - all numeric fields have provenance - - renderer direct Temp read count == 0 - - unsupported number count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P5_decision_harness - id: P5_T03_SHADOW_LEDGER_MANDATORY - priority: P0 - title: 차단 종목도 산출 지표를 감추지 않는 shadow ledger 강화 - owner: reporting/QA - rationale: 사용자 판단권과 사후 평가를 위해 BLOCKED/WATCH도 산출 수명 지표가 보여야 한다. - target_files: - - spec/outputs/shadow_ledger_contract.yaml - - schemas/shadow_ledger.schema.json - - src/quant_engine/reporting/shadow_ledger.py - implementation_steps: - - BLOCKED, WATCH, HOLD, BUY, SELL 모두 산출 지정가/손절가/익절가/이론수량/차단사유를 보존 - - HTS 가능 주문표와 shadow ledger를 물리적으로 분리 - - 차단 사유는 formula_id 기반 단답으로 제한 - commands: - - python tools/validate_shadow_ledger.py --strict - acceptance_criteria: - - blocked item shadow coverage == 100% - - HTS order table contains only executable orders - - shadow ledger numeric provenance == 100% - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P6_llm_serving - id: P6_T01_LOW_CAPABILITY_RENDER_CONTRACT - priority: P0 - title: 저성능 LLM용 renderer contract를 폐쇄형으로 작성 - owner: LLM/reporting - rationale: 저성능 LLM이 최고 LLM과 같은 결과를 내게 하려면 자유서술이 아니라 slot filling만 허용해야 한다. - target_files: - - prompts/low_capability_report_renderer.md - - spec/render/renderer_contract.yaml - - tools/validate_llm_response.py - implementation_steps: - - 입력은 final_decision_packet_v3.json만 허용 - - 출력 섹션 순서와 테이블 컬럼을 고정 - - 숫자는 {{source_ref.value}} 형태로만 복사 - - 없는 값은 MISSING_SOURCE로 표시하고 추정 금지 - - 금지 어휘와 softening narrative 목록 적용 - commands: - - python tools/validate_llm_response.py --packet Temp/final_decision_packet_v3.json --report Temp/operational_report.md - --strict - acceptance_criteria: - - llm_freedom_pct == 0 - - ungrounded_number_count == 0 - - required_section_missing_count == 0 - - narrative_softening_violation_count == 0 - low_capability_llm_instruction: final_decision_packet_v3.json 이외의 파일을 읽지 마라. 표 컬럼을 변경하지 마라. 숫자는 복사만 하라. 누락은 누락이라고 써라. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P6_llm_serving - id: P6_T02_NUMBER_PROVENANCE_AUDIT - priority: P0 - title: 모든 수치 출처 자기감사 mandatory - owner: QA - rationale: 숫자 하나라도 근거 없이 출력되면 투자 엔진 신뢰성이 무너진다. - target_files: - - Temp/number_provenance_audit_v3.json - - tools/validate_number_provenance_v2.py - implementation_steps: - - 보고서의 모든 숫자 token을 추출 - - packet/evidence ledger에 존재하는지 매칭 - - '허용 형식: 날짜, 순번, 섹션 번호 등 non-investment number whitelist 분리' - - 불일치 시 release fail - commands: - - python tools/validate_number_provenance_v2.py --report Temp/operational_report.md --packet Temp/final_decision_packet_v3.json - --strict - acceptance_criteria: - - investment_number_coverage_pct == 100 - - ungrounded_investment_number_count == 0 - - whitelist_abuse_count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P7_testing_release - id: P7_T01_TEST_PYRAMID - priority: P0 - title: 테스트 피라미드 재구성 - owner: QA/developer - rationale: 검증 스크립트는 많지만 테스트 계층이 명확하지 않으면 누락과 중복이 동시에 발생한다. - target_files: - - tests/unit - - tests/golden - - tests/parity - - tests/regression - - tests/integration - - tests/e2e - implementation_steps: - - 'unit: pure formula/gate' - - 'golden: 손계산 기대값' - - 'parity: Python vs GAS' - - 'regression: 과거 실패 케이스' - - 'integration: pipeline artifacts' - - 'e2e: report quality와 deterministic replay' - commands: - - python -m pytest tests/unit tests/golden tests/regression - - npm run validate-determinism - - npm run full-gate - acceptance_criteria: - - decision critical formula unit coverage == 100 - - golden pass == 100 - - regression fail recurrence == 0 - - e2e deterministic replay pass - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P7_testing_release - id: P7_T02_RELEASE_TRAIN - priority: P0 - title: release train과 promotion gate 고정 - owner: release manager - rationale: 임의 수동 패키징과 부분 검증은 운영 신뢰도를 떨어뜨린다. - target_files: - - spec/release/release_train.yaml - - package.json - - tools/release_gate.py - implementation_steps: - - dev -> shadow -> limited -> release 4단계 승격 정의 - - shadow는 주문표를 생성하되 실행권고 금지 - - limited는 일부 섹션만 운영 반영 - - release는 full-gate와 outcome feedback 필수 - - rollback command와 이전 manifest 보존 - commands: - - npm run validate-engine-strict - - npm run full-gate - - npm run prepare-upload-zip -- --validation-mode release --profile - acceptance_criteria: - - release package requires gate_status OK - - failed_checks_count == 0 - - rollback_manifest exists - - skip_validate usage count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P7_testing_release - id: P7_T03_DETERMINISM_REPLAY - priority: P0 - title: 결정론 replay pack 확대 - owner: QA/platform - rationale: 동일 데이터에서 매번 다른 보고서가 나오면 LLM/엔진 모두 운영 불가다. - target_files: - - tests/replay/*.yaml - - Temp/audit_replay_snapshot_v2.json - - tools/validate_determinism.py - implementation_steps: - - 대표 국면 12개와 실패 사례 30개를 replay case로 고정 - - input hash, expected packet hash, expected gate summary 기록 - - 문장 표현은 바뀌어도 numeric packet hash는 동일해야 함 - commands: - - npm run validate-determinism - - python tools/validate_replay_pack.py --strict - acceptance_criteria: - - packet_hash_match_pct == 100 - - gate_summary_match_pct == 100 - - numeric_diff_count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P8_observability_feedback - id: P8_T01_OBSERVABILITY_RUN_PROFILE - priority: P0 - title: 파이프라인 실행 관측성 표준화 - owner: platform - rationale: 검증이 느려지고 실패 원인이 불명확해지면 개발 속도가 떨어진다. - target_files: - - runtime/run_profiles/*.json - - src/quant_engine/observability/ - - tools/profile_pipeline_runtime.py - implementation_steps: - - 모든 npm script와 build tool은 elapsed_ms, input_count, output_count, status, error_code를 기록 - - heavy/quick/package-only 모드별 SLA 지정 - - 이상 소요시간과 중복 실행을 검출 - commands: - - npm run profile-pipeline-runtime - - python tools/validate_pipeline_runtime_anomaly.py - acceptance_criteria: - - profile coverage for required scripts == 100 - - release elapsed <= target or justified - - duplicate heavy validation count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P8_observability_feedback - id: P8_T02_OUTCOME_ATTRIBUTION - priority: P0 - title: 실거래/미실행 결과 귀속 원장 강화 - owner: quant/PM - rationale: 룰이 성과를 개선했는지 모르고 계속 추가하면 과최적화된다. - target_files: - - Temp/outcome_ledger_v2.json - - Temp/live_vs_replay_performance_audit_v2.json - - tools/build_outcome_attribution.py - implementation_steps: - - 추천 당시 packet과 이후 가격/체결/미체결 결과 연결 - - alpha lead, late chase, value damage, slippage, opportunity cost를 분해 - - 룰별 contribution과 false positive/negative 집계 - - sample_n 미달은 개선 증거로 사용 금지 - commands: - - python tools/build_outcome_attribution.py --packet-history Temp --out Temp/outcome_ledger_v2.json - - python tools/validate_outcome_eval_window.py --strict - acceptance_criteria: - - each recommendation has outcome_id or pending_reason - - rule_attribution coverage >= 95% - - sample_maturity labels present - - no design_score_as_real_performance - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P9_operating_model - id: P9_T01_WEEKLY_ENGINE_REVIEW - priority: P0 - title: 주간 엔진 리뷰 프로토콜 정착 - owner: PM/quant - rationale: 투자 엔진은 코드 품질과 투자성과를 같이 리뷰해야 한다. - target_files: - - governance/weekly_engine_review_template.md - - Temp/continuous_evaluation_dashboard_v2.json - implementation_steps: - - 매주 토/일 리밸런싱 전 engine health, data quality, formula parity, outcome drift, active rule changes를 1페이지로 리뷰 - - 투자 제안과 엔진 변경 제안을 분리 - - 긴급 패치와 정규 패치를 구분 - commands: - - python tools/build_continuous_evaluation_dashboard_v2.py - - python tools/render_weekly_engine_review.py - acceptance_criteria: - - weekly review generated - - critical engine issue count reported - - new rule without outcome hypothesis count == 0 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -- phase: P9_operating_model - id: P9_T02_CHANGE_REQUEST_TEMPLATE - priority: P0 - title: 룰/공식 변경 요청 템플릿 표준화 - owner: PM/architect - rationale: 변경 요청이 산발적이면 개발자가 문맥을 추정하게 되고 설계가 흔들린다. - target_files: - - governance/change_request_template.yaml - - governance/change_requests/*.yaml - implementation_steps: - - '변경 요청 필수 필드: problem, evidence, target_metric, affected_formula, affected_output, expected_side_effect, rollback_plan, - test_cases' - - 승인 없는 변경은 active 승격 금지 - - 긴급 hotfix는 72시간 내 ADR로 정리 - commands: - - python tools/validate_change_requests.py --strict - acceptance_criteria: - - all active changes have request_id - - rollback_plan missing 0건 - - test_case missing 0건 - low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에 - 있는 값만 사용한다. - reject_if: - - 근거 artifact 없이 완료 선언 - - 공식/수치를 임의 생성 - - 검증 명령 실패를 무시 -low_capability_llm_master_runbook: - purpose: 저성능 LLM 또는 주니어 작업자가 TODO만 보고도 동일한 리팩토링 결과물을 만들도록 하는 폐쇄형 작업 절차 - global_rules: - - 절대 추정하지 않는다. 파일에 없으면 MISSING_SOURCE로 표시한다. - - 숫자·공식·threshold·가격·수량을 새로 만들지 않는다. - - 한 번에 한 phase만 수행한다. phase acceptance가 PASS가 아니면 다음 phase로 가지 않는다. - - Temp의 v숫자 파일을 임의 최신으로 선택하지 않는다. active manifest만 따른다. - - 문서 변경은 반드시 대응 validator 또는 grep check를 추가한다. - - 대형 파일에서 내용을 삭제하지 말고 먼저 split script로 이동 후 hash/count 검증을 한다. - - 완료 보고는 PASS/WARN/FAIL 중 하나로만 한다. 100%라는 표현은 completion gate가 증명할 때만 쓴다. - execution_order: - - P0_T01_ACTIVE_MANIFEST - - P0_T02_AUTHORITY_MATRIX - - P0_T03_BASELINE_METRICS - - P1_T01_AGENTS_SHRINK - - P1_T02_ADR_SYSTEM - - P1_T03_RULE_LIFECYCLE - - P2_T01_FORMULA_DOMAIN_SPLIT - - P2_T02_GOLDEN_CASE_EXPANSION - - P2_T03_THRESHOLD_CALIBRATION_LEDGER - - P3_T01_FIELD_DICTIONARY_STRICT - - P3_T02_DATA_QUALITY_EXPECTATIONS - - P3_T03_LINEAGE_EVENTS - - P4_T01_PYTHON_CANONICAL_PACKAGE - - P4_T02_GAS_ADAPTER_SPLIT - - P4_T03_SCHEMA_MODEL_GENERATION - - P5_T01_DECISION_GRAPH_DAG - - P5_T02_FINAL_PACKET_CONTRACT - - P5_T03_SHADOW_LEDGER_MANDATORY - - P6_T01_LOW_CAPABILITY_RENDER_CONTRACT - - P6_T02_NUMBER_PROVENANCE_AUDIT - - P7_T01_TEST_PYRAMID - - P7_T02_RELEASE_TRAIN - - P7_T03_DETERMINISM_REPLAY - - P8_T01_OBSERVABILITY_RUN_PROFILE - - P8_T02_OUTCOME_ATTRIBUTION - - P9_T01_WEEKLY_ENGINE_REVIEW - - P9_T02_CHANGE_REQUEST_TEMPLATE - per_task_required_output_format: - status: PASS|WARN|FAIL - changed_files: - - path1 - - path2 - commands_run: - - command: string - exit_code: integer - summary: string - metrics_before_after: - - metric: string - before: number|string - after: number|string - target: number|string - remaining_risks: - - risk1 - next_task_id: string - stop_conditions: - - schema validation failure - - golden case failure - - gas/python parity failure - - authority collision count > 0 after P0 - - ungrounded number count > 0 after P6 - - release gate failed_checks_count > 0 -minimal_new_files_to_add_first: -- path: runtime/active_artifact_manifest.yaml - why: Temp 산출물 버전 오독 차단 -- path: governance/authority_matrix.yaml - why: 필드/공식/출력 권위 충돌 차단 -- path: governance/rule_lifecycle.yaml - why: 룰 누적 부채 차단 -- path: governance/adr/0001-adopt-qeda-dm.md - why: 방법론 채택 의사결정 기록 -- path: spec/routing/decision_graph.yaml - why: 결정 순서와 우선순위 고정 -- path: spec/render/renderer_contract.yaml - why: LLM renderer 자유도 0% 강제 -- path: spec/data_quality/expectations.yaml - why: 데이터 정합성 기대값 코드화 -- path: tests/golden/formula_golden_cases.yaml - why: 공식 회귀 방지 -- path: runtime/lineage_events.jsonl - why: 원인 추적과 영향 분석 -- path: Temp/refactor_baseline_metrics_v1.json - why: 리팩토링 효과 수치 증빙 -first_10_commands_after_files_exist: -- python tools/build_refactor_baseline_metrics.py --root . --out Temp/refactor_baseline_metrics_v1.json -- python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict -- python tools/validate_authority_matrix.py --strict -- python tools/validate_field_dictionary.py --strict -- python tools/validate_formula_registry.py --strict -- python tools/run_golden_cases_py.py --cases tests/golden/formula_golden_cases.yaml -- node tools/run_gas_golden_parity.js --cases tests/golden/formula_golden_cases.yaml -- python tools/validate_decision_graph.py --graph spec/routing/decision_graph.yaml --strict -- python tools/validate_llm_response.py --packet Temp/final_decision_packet_v3.json --report Temp/operational_report.md --strict -- npm run full-gate -definition_of_done: - phase_0_done: - - active_manifest exists - - authority_collision_count == 0 - - baseline metrics generated - phase_1_done: - - AGENTS.md <= 350 lines - - all rules preserved by ID hash - - ADR index valid - phase_2_done: - - formula registry split - - normalized build deterministic - - golden/parity pass - phase_3_done: - - field dictionary strict pass - - data quality expectations pass - - lineage coverage 100 - phase_4_done: - - Python canonical package test pass - - GAS adapters split and parity pass - - schema model drift 0 - phase_5_done: - - decision graph deterministic - - final packet valid - - shadow ledger coverage 100 - phase_6_done: - - LLM freedom 0 - - ungrounded numbers 0 - - narrative lock pass - phase_7_done: - - test pyramid pass - - release train gate pass - - replay hash match 100 - phase_8_done: - - run profiles complete - - outcome attribution coverage >= 95 - phase_9_done: - - weekly review generated - - all active changes have request/ADR/rollback -recommended_pm_cadence: - daily: - - data freshness check - - failed gate triage - - lineage missing check - weekly_sat_sun: - - portfolio rebalance report - - engine health review - - rule outcome review - - new TODO reprioritization - monthly_1_11_21: - - mid-cycle checkpoint - - calibration registry review - - sample maturity review - - data source SLA review - release: - - ADR review - - golden/parity/replay pass - - full-gate pass - - rollback manifest prepared -anti_patterns_forbidden: -- AGENTS.md에 새 상세 공식을 계속 붙여넣기 -- Temp 파일명에 v숫자가 높다는 이유로 최신으로 간주하기 -- GAS와 Python에 같은 공식을 복붙하고 parity test를 생략하기 -- schema 없이 JSON artifact를 추가하기 -- sample_n 부족인데 PASS 또는 성능 개선으로 주장하기 -- 보고서 품질 개선을 위해 LLM에게 수치 보완을 허용하기 -- 검증 실패를 skip 옵션으로 통과시키기 -- 대형 파일에 새 함수를 계속 추가하기 -- 룰 추가를 성능 개선으로 간주하고 outcome ledger를 생략하기 -- 외부 뉴스/가격을 주문 판단 숫자에 직접 혼입하기 -external_method_basis: - ADR: 아키텍처 의사결정은 ADR로 context/decision/consequence를 기록한다. - JSON_Schema: artifact shape와 validation vocabulary는 schema로 고정한다. - Data_Quality_Expectation: 데이터 품질 규칙은 expectation/test로 코드화한다. - Data_Lineage: dataset/job/run 수준 lineage로 오류 원인과 변경 영향 분석을 가능하게 한다. - Type_Validation: Python 타입/모델 validation으로 artifact drift를 조기 차단한다. - Testing: pytest 기반 unit/golden/regression 테스트를 CI 게이트화한다. - Observability: trace/metric/log 기반으로 pipeline run의 상태와 병목을 관측한다. -task_execution_status: - summary: - implemented: 27 - validated: 0 - completed: 27 - blocked: 0 - operational_ready: false - items: - - id: P0_T01_ACTIVE_MANIFEST - status: completed - evidence: - - runtime/active_artifact_manifest.yaml - - tools/validate_active_manifest.py - - Temp/active_artifact_manifest_v2.json - - id: P0_T02_AUTHORITY_MATRIX - status: completed - evidence: - - governance/authority_matrix.yaml - - spec/03_formulas/output_field_owner_ledger.yaml - - spec/12_field_dictionary.yaml - - tools/build_authority_matrix.py - - tools/validate_authority_matrix.py - - id: P0_T03_BASELINE_METRICS - status: completed - evidence: - - Temp/refactor_baseline_metrics_v1.json - - tools/build_refactor_baseline_metrics.py - - id: P1_T01_AGENTS_SHRINK - status: completed - evidence: - - AGENTS.md - - governance/agents_index.yaml - - governance/agents_rule_hashes.yaml - - governance/rules/00_core_locks.yaml - - governance/rules/01_harness_contract.yaml - - governance/rules/02_portfolio_policy.yaml - - governance/rules/03_order_grammar.yaml - - governance/rules/04_reporting_contract.yaml - - governance/rules/05_migration_hashes.yaml - - tools/validate_agents_shrink_v1.py - - tools/build_agents_rule_hashes_v1.py - - tools/validate_agents_rule_hashes_v1.py - - id: P1_T02_ADR_SYSTEM - status: completed - evidence: - - governance/adr_index.yaml - - governance/adr/*.md - - tools/validate_adr_index.py - - id: P1_T03_RULE_LIFECYCLE - status: completed - evidence: - - governance/rule_lifecycle.yaml - - tools/validate_rule_lifecycle.py - - id: P2_T01_FORMULA_DOMAIN_SPLIT - status: completed - evidence: - - spec/formulas/risk.yaml - - spec/formulas/entry.yaml - - spec/formulas/exit.yaml - - spec/formulas/cash.yaml - - spec/formulas/portfolio.yaml - - spec/formulas/reporting.yaml - - spec/formulas/manifest.yaml - - spec/03_formulas/formula_registry.normalized.yaml - - tools/split_formula_registry.py - - tools/build_formula_registry_normalized.py - - tools/validate_formula_registry.py - - id: P2_T02_GOLDEN_CASE_EXPANSION - status: completed - evidence: - - spec/formula_golden_cases_v4.yaml - - Temp/yaml_code_coverage_v1.json - - tools/build_yaml_code_coverage_v1.py - - tools/validate_golden_coverage_100.py - - id: P2_T03_THRESHOLD_CALIBRATION_LEDGER - status: completed - evidence: - - Temp/calibration_change_ledger_v4.json - - Temp/calibration_priority_v1.json - - Temp/outcome_ledger_v1.json - - tools/build_calibration_change_ledger_v4.py - - tools/validate_calibration_change_ledger_v1.py - - id: P3_T01_FIELD_DICTIONARY_STRICT - status: completed - evidence: - - spec/fields/field_dictionary.yaml - - spec/12_field_dictionary.yaml - - tools/validate_field_dictionary.py - - id: P3_T02_DATA_QUALITY_EXPECTATIONS - status: completed - evidence: - - spec/data_quality/expectations.yaml - - tools/validate_data_quality_expectations.py - - id: P3_T03_LINEAGE_EVENTS - status: completed - evidence: - - runtime/lineage_events.jsonl - - tools/emit_lineage_event.py - - tools/validate_lineage.py - - id: P4_T01_PYTHON_CANONICAL_PACKAGE - status: completed - evidence: - - src/quant_engine/__init__.py - - src/quant_engine/models/__init__.py - - src/quant_engine/models/generated/__init__.py - - tools/generate_models_from_schema.py - - tools/validate_schema_model_generation_v1.py - - Temp/schema_model_generation_v1.json - - id: P4_T02_GAS_ADAPTER_SPLIT - status: completed - evidence: - - spec/39_gas_thin_adapter_policy.yaml - - tools/validate_gas_thin_adapter_v1.py - - Temp/gas_business_logic_audit_v1.json - - id: P4_T03_SCHEMA_MODEL_GENERATION - status: completed - evidence: - - schemas/generated/*.schema.json - - src/quant_engine/models/generated/*.py - - tools/generate_models_from_schema.py - - tools/validate_schema_model_generation_v1.py - - id: P5_T01_DECISION_GRAPH_DAG - status: completed - evidence: - - spec/routing/decision_graph.yaml - - tools/validate_decision_graph.py - - tools/build_routing_execution_log_v1.py - - id: P5_T02_FINAL_PACKET_CONTRACT - status: completed - evidence: - - schemas/final_decision_packet_v3.schema.json - - Temp/final_decision_packet_v3.json - - tools/build_final_decision_packet_v3.py - - tools/validate_final_decision_packet.py - - id: P5_T03_SHADOW_LEDGER_MANDATORY - status: completed - evidence: - - spec/outputs/shadow_ledger_contract.yaml - - schemas/shadow_ledger.schema.json - - src/quant_engine/reporting/shadow_ledger.py - - Temp/shadow_ledger_v1.json - - tools/validate_shadow_ledger.py - - id: P6_T01_LOW_CAPABILITY_RENDER_CONTRACT - status: completed - evidence: - - prompts/low_capability_report_renderer.md - - spec/render/renderer_contract.yaml - - tools/validate_llm_response.py - - id: P6_T02_NUMBER_PROVENANCE_AUDIT - status: completed - evidence: - - Temp/number_provenance_audit_v3.json - - tools/build_number_provenance_audit_v2.py - - tools/validate_number_provenance_v2.py - - id: P7_T01_TEST_PYRAMID - status: completed - evidence: - - tests/unit - - tests/golden - - tests/parity - - tests/regression - - tests/integration - - tests/e2e - - tools/validate_test_pyramid.py - - id: P7_T02_RELEASE_TRAIN - status: completed - evidence: - - spec/release/release_train.yaml - - tools/validate_release_train.py - - tools/release_gate.py - - id: P7_T03_DETERMINISM_REPLAY - status: completed - evidence: - - tests/replay/README.yaml - - tools/validate_replay_pack.py - - tools/validate_determinism.py - - id: P8_T01_OBSERVABILITY_RUN_PROFILE - status: completed - evidence: - - runtime/run_profiles/profile_pipeline_runtime.json - - tools/profile_pipeline_runtime.py - - tools/validate_pipeline_runtime_anomaly.py - - id: P8_T02_OUTCOME_ATTRIBUTION - status: completed - evidence: - - Temp/outcome_ledger_v2.json - - Temp/live_vs_replay_performance_audit_v2.json - - tools/build_outcome_attribution.py - - tools/validate_outcome_eval_window.py - - id: P9_T01_WEEKLY_ENGINE_REVIEW - status: completed - evidence: - - governance/weekly_engine_review_template.md - - Temp/continuous_evaluation_dashboard_v2.json - - Temp/weekly_engine_review.md - - tools/build_continuous_evaluation_dashboard_v2.py - - tools/render_weekly_engine_review.py - - id: P9_T02_CHANGE_REQUEST_TEMPLATE - status: completed - evidence: - - governance/change_request_template.yaml - - governance/change_requests/0001-example.yaml - - tools/validate_change_requests.py diff --git a/suggest/quant_engine_refactor_playbook_v1.yaml b/suggest/quant_engine_refactor_playbook_v1.yaml deleted file mode 100644 index 6c2eb1f..0000000 --- a/suggest/quant_engine_refactor_playbook_v1.yaml +++ /dev/null @@ -1,1205 +0,0 @@ -schema_version: quant_engine_refactor_playbook.v1 -title: QEDD 기반 퀀트투자 엔진 지속 고도화·리팩토링 실행 YAML -generated_at_kst: '2026-06-10T19:50:34+09:00' -source_bundle: - path: /mnt/data/data_feed.zip - sha256: 1b05800cfe967f949d2aa83d508064fb005995a42fe1e81722e8fb79d3f7cae9 - primary_instruction: data_feed/AGENTS.md - authority_note: AGENTS.md는 운영 인덱스이며 상세 규칙은 governance/rules/*.yaml 및 spec/*.yaml 우선 -target_outcome: - business_goal: 목표금액 5억원을 기준으로, 주간 리밸런싱·월 1/11/21 중간점검·D+2 현금 방어선·대형 IPO 선제 차익실현을 결정론적으로 운영하는 퀀트 엔진 - engineering_goal: 저성능 LLM도 동일한 입력 패킷과 TODO만으로 동일 결론을 렌더링하도록, 계산·판단은 Python/YAML 하네스에서 확정하고 LLM은 copy-only renderer로 제한 - non_goal: - - LLM이 가격·수량·점수·평균·순위·TP/SL을 즉석 계산하는 구조 - - GAS에 투자 판단 비즈니스 로직을 계속 추가하는 구조 - - 문서가 많아질수록 권위가 분산되는 구조 -current_audit_snapshot: - local_file_scan: - total_files: 1461 - extension_counts: - .py: 843 - .json: 379 - .yaml: 176 - .md: 40 - .gs: 8 - .pyc: 8 - .ps1: 4 - .jsonl: 2 - .js: 1 - directory_inventory: - spec: - file_count: 128 - bytes: 1764342 - governance: - file_count: 26 - bytes: 13122 - runtime: - file_count: 159 - bytes: 2331503 - src: - file_count: 335 - bytes: 696524 - tools: - file_count: 372 - bytes: 1822541 - Temp: - file_count: 22 - bytes: 304445 - artifacts: - file_count: 41 - bytes: 78014 - docs: - file_count: 8 - bytes: 5539 - prompts: - file_count: 9 - bytes: 71148 - schemas: - file_count: 165 - bytes: 155357 - tests: - file_count: 160 - bytes: 72432 - gas_inventory: - - file: gas_apex_alpha_watch.gs - bytes: 13275 - lines: 365 - - file: gas_apex_runtime_core.gs - bytes: 29525 - lines: 654 - - file: gas_data_collect.gs - bytes: 226365 - lines: 4460 - - file: gas_data_feed.gs - bytes: 471034 - lines: 10302 - - file: gas_harness_rows.gs - bytes: 89520 - lines: 1456 - - file: gas_lib.gs - bytes: 121756 - lines: 2762 - - file: gas_report.gs - bytes: 23209 - lines: 446 - repository_entropy_audit_observed: - gate: PASS - reported_total_file_count: 1461 - max_total_files_budget: 2000 - package_script_count: 22 - max_package_scripts_budget: 220 - temp_json_count: 20 - max_temp_json_budget: 500 - validation_evidence: - validate_specs: PASS - validate_golden_coverage_100: - gate: PASS - formula_total: 149 - implemented: 147 - implemented_pct: 98.7 - golden_cases: 149 - golden_coverage_pct: 100.0 - unimplemented: 2 - validate_calibration_registry_v1: - gate: WARN - threshold_total: 187 - calibrated: 0 - spec_derived: 120 - provisional: 8 - expert_prior: 59 - overclaimed: 0 - unregistered: 0 - validate_schema_model_generation_v1: - gate: FAIL - reason: Temp/schema_model_generation_v1.json 또는 동등한 생성 리포트 결측 - validate_gas_thin_adapter_v1: - gate: PASS_WITH_DEBT - forbidden_gas_business_logic_count: 103 - function_inventory_coverage_pct: 100.0 - migration_plan_exists: true - validate_agents_shrink_v1: PASS - active_artifact_manifest: - active_count_per_formula: 1 - authority_collision_count: 0 - stale_artifact_count: 0 - report_active_artifact_match_pct: 100.0 - canonical_source: Temp/final_decision_packet_active.json - prediction_match_rate_pct_observed: 54.76 - version_entropy_top_groups: - - path: artifacts/archive/2026-06-06 - base: smart_cash_recovery - suffix: .json - versions: - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: build_smart_cash_recovery - suffix: .py - versions: - - 3 - - 4 - - 5 - - 6 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: run_release_dag - suffix: .py - versions: - - 1 - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: build_pass_100_criteria - suffix: .py - versions: - - 1 - - 3 - - 4 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: build_final_execution_decision - suffix: .py - versions: - - 1 - - 2 - - 4 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: spec - base: formula_golden_cases - suffix: .yaml - versions: - - 2 - - 3 - - 4 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: artifacts/archive/20260606 - base: release_gate_summary - suffix: .json - versions: - - 1 - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: artifacts/archive/2026-06-06 - base: smart_money_liquidity_evidence_gate - suffix: .json - versions: - - 2 - - 3 - - 4 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: artifacts/archive/2026-06-06 - base: prediction_accuracy_harness - suffix: .json - versions: - - 2 - - 3 - - 4 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: artifacts/archive/2026-06-06 - base: final_execution_decision - suffix: .json - versions: - - 1 - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: artifacts/archive/2026-06-06 - base: canonical_metrics - suffix: .json - versions: - - 1 - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_renderer_no_calculation - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_release_dag - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_packaging_policy - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_number_provenance_strict - suffix: .py - versions: - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_number_provenance - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_no_replay_live_mix - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: validate_gas_thin_adapter - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: run_formula_golden_cases - suffix: .py - versions: - - 2 - - 3 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - - path: tools - base: build_value_preservation_scorer - suffix: .py - versions: - - 1 - - 2 - active_version_policy: keep highest only when non-archive; archive lower versions after manifest validation - diagnosis: - - 기본 골격(QEDD, manifest, release DAG, AGENTS shrink)은 이미 좋은 방향이다. - - 실제 리스크는 계산 권위가 GAS·tools·src 사이에 남아 있는 점, 임계값 보정 부재, schema/model 생성 리포트 결측, 버전 파일 다중화다. - - 다음 리팩토링은 기능 추가보다 권위 단일화·검증 자동화·캘리브레이션 우선이다. -methodology: - name: 'QEDD++: Quant Evidence-Driven Deterministic Development with Harness-First Refactoring' - operating_principles: - - id: P01 - rule: Contract first - instruction: 새 판단 로직은 반드시 spec/*.yaml 계약, output schema, owner ledger, golden case를 먼저 만든 뒤 구현한다. - - id: P02 - rule: Python canonical first - instruction: 모든 계산·점수·가격·수량·순위·게이트 판정은 src/quant_engine 또는 생성된 Python formula에서만 수행한다. - - id: P03 - rule: GAS thin adapter - instruction: GAS는 수집, 시트 입출력, JSON 전달만 담당한다. 투자 판단·스코어링·가격 산출 로직은 신규 작성 금지다. - - id: P04 - rule: No LLM math - instruction: LLM은 Temp/final_context_for_llm_v5.yaml 또는 final_decision_packet_active.json의 값을 복사·설명만 한다. 숫자 결측은 DATA_MISSING으로 - 처리한다. - - id: P05 - rule: Single source of truth - instruction: active_artifact_manifest가 가리키는 active artifact만 보고서 권위로 사용한다. deprecated/archive/runtime stale 파일은 참조 금지다. - - id: P06 - rule: Fail closed - instruction: 검증 실패, provenance 결측, schema 불일치, 데이터 신선도 결측은 매수/증액이 아니라 HOLD/BLOCK/DATA_MISSING으로 닫는다. - - id: P07 - rule: Evidence before capital - instruction: 신규 팩터와 임계값은 shadow ledger와 T+5/T+20 성과 검증 전까지 실계좌 비중 확대에 사용하지 않는다. - - id: P08 - rule: Document diet - instruction: 문서는 원칙·계약·ADR·런북으로만 나누고, 중복 설명은 삭제한다. 문서가 판단 권위를 갖지 않도록 spec과 manifest를 우선한다. - canonical_pipeline: - - Data ingest - - Data quality & freshness gates - - Feature generation - - Regime classification - - Signal scoring - - Anti-late-entry and distribution gates - - Position sizing & risk budget - - Exit waterfall - - Execution packet - - Report renderer - - Shadow/live outcome feedback - authority_order: - - spec/*.yaml - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - governance/rules/*.yaml - - src/quant_engine implementation - - tools validation/build wrappers - - GAS adapters - - LLM renderer - change_lifecycle: - - PROPOSED - - CONTRACTED - - IMPLEMENTED_PYTHON - - GOLDEN_TESTED - - SHADOW_ONLY - - CALIBRATED - - ACTIVE - - RETIRED - promotion_gate: - required: - - schema_valid=true - - golden_case_pass=true - - property_invariants_pass=true - - number_provenance_coverage_pct=100 - - shadow_ledger_recorded=true - - no_architecture_boundary_violation=true - live_capital_activation: - - live_t20_count>=30 또는 명시적 risk_officer 예외 - - expectancy_pct>0 - - win_rate_pct>=50 - - max_drawdown_pct within risk budget - - profit_giveback_pct below configured ceiling - - threshold_state in [CALIBRATED,SPEC_DERIVED] unless capped informational - retirement_gate: - trigger_examples: - - formula duplicated by newer active version - - prediction_match_rate below retirement threshold - - manual_override_count exceeds policy - - data source discontinued - - architecture boundary violation detected - required_action: runtime/active_artifact_manifest.yaml에서 active 해제 후 archive로 이동하고 ADR 또는 lifecycle_registry에 사유 기록 -target_architecture: - directories: - spec: 모든 공식, 계약, 게이트, 데이터 필드, 출력 스키마의 source of truth - src/quant_engine: 계산 로직의 canonical Python package. 순수 함수, typed IO, 재현 가능성 보장 - tools: build/validate/render CLI wrapper. 핵심 투자 로직 금지 - governance: ADR, authority matrix, rule lifecycle, 운영 규칙 인덱스 - runtime: active manifest, baseline, rollback manifest. 사람이 직접 편집하지 않는 운영 상태 - Temp: 실행 산출물. read-only artifact로 취급하고 수동 수정 금지 - gas_*.gs: thin adapter. 데이터 수집·시트 IO·API 호출·패킷 전달만 허용 - dist: 배포용 compact bundle만 보관. 원천 권위 금지 - archive: 과거 버전 보관. runtime source로 읽기 금지 - module_boundaries: - data_ingest: - allowed: - - raw workbook/API fetch - - normalization - - as_of timestamp - - source metadata - forbidden: - - investment score - - buy/sell decision - - position sizing - feature_engine: - allowed: - - registered formula execution - - feature ledger output - forbidden: - - report rendering - - order text generation - decision_engine: - allowed: - - gate evaluation - - risk budget - - action priority waterfall - forbidden: - - data collection - - external browsing - - LLM override - execution_engine: - allowed: - - order grammar - - tick normalization - - quantity rounding - - sell priority table - forbidden: - - new alpha discovery - - narrative explanation - report_renderer: - allowed: - - copy packet values - - format tables - - explain blockers - forbidden: - - calculation - - ranking - - imputing missing values - - changing action - algorithm_spine: - universe_gate: 상장 상태, 거래대금, 가격 제한, 데이터 품질, 보유/관심 상태를 먼저 필터링 - regime_gate: 시장 위험, 유동성, 환율/금리/이벤트, 외국인/기관 수급을 regime score로 압축 - alpha_stack: - - relative_strength_momentum - - sector_rotation - - fundamental_quality - - earnings_revision_proxy - - smart_money_liquidity - - anti_late_entry_pullback - - distribution_early_warning - risk_overlay: - - portfolio_beta - - sector_concentration - - correlation_cluster - - cash_floor - - drawdown_guard - - D+2 cash defense - sizing_model: expected_edge × confidence × regime_scale × correlation_penalty × liquidity_cap. 단, 모든 계수는 registry/provenance - 필수 - exit_model: 손절·감익·수익보호·대형 IPO/이벤트 선제 차익실현을 단일 sell priority waterfall로 선형 처리 - feedback_loop: T+5/T+20 outcomes, late-chase attribution, profit giveback, missed-alpha ledger를 주간 calibration에 반영 -refactor_todo: -- id: P0-T01 - phase: P0_constitution_freeze - title: 운영 헌법과 읽기 순서 고정 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "agents_lines=93, gate=AGENTS_SHRINK_OK, validate_specs=PASS" - objective: AGENTS.md를 짧은 인덱스로 유지하고 모든 판단 권위를 spec/runtime manifest로 고정한다. - target_files: - - AGENTS.md - - governance/agents_index.yaml - - governance/rules/*.yaml - ordered_steps: - - AGENTS.md의 최우선 원칙과 Directory Routing을 유지한다. - - 새 규칙은 AGENTS.md 본문에 장문으로 쓰지 말고 governance/rules 또는 spec에 추가한다. - - agents_rule_hashes.yaml을 갱신해 규칙 변경 추적성을 남긴다. - - LLM용 읽기 순서를 low_capability_execution_contract와 동일하게 맞춘다. - validation_commands: - - python tools/validate_agents_shrink_v1.py - - python tools/validate_specs.py - acceptance_criteria: - - AGENTS_SHRINK_OK - - agents_lines <= 120 - - authority_order가 spec/runtime/Temp/governance 순서와 충돌하지 않음 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P0-T02 - phase: P0_authority_lock - title: Active artifact 단일 권위 잠금 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "active_count=1, collision=0, stale=0, report_active_match=100%" - objective: 여러 json/md/yaml 중 어떤 산출물이 최종 판단인지 매번 흔들리지 않도록 active manifest만 권위로 인정한다. - target_files: - - runtime/active_artifact_manifest.yaml - - spec/32_canonical_artifact_resolver.yaml - - tools/validate_active_manifest.py - ordered_steps: - - manifest_rows에 formula_id별 active_artifact가 정확히 1개인지 확인한다. - - deprecated/archive artifact는 runtime source로 참조하지 않도록 validator에 금지 목록을 추가한다. - - report renderer가 active alias 외 파일을 읽으면 실패시키는 guard를 추가한다. - validation_commands: - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict - - python tools/validate_report_packet_sync_v1.py --packet Temp/final_decision_packet_active.json --report Temp/operational_report.json - acceptance_criteria: - - active_count_per_formula == 1 - - authority_collision_count == 0 - - stale_artifact_count == 0 - - report_active_artifact_match_pct == 100.0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P1-T01 - phase: P1_repository_diet - title: 파일/문서 엔트로피 다이어트 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "total_files<2000, version_groups_outside_archive=0, validate_specs=PASS" - objective: 버전 파일과 중복 문서가 늘어나도 엔진 판단은 단일 권위에서만 나오도록 정리한다. - target_files: - - spec/release/repository_entropy_budget.yaml - - runtime/refactor_baseline_v*.yaml - - artifacts/archive/** - - docs/** - ordered_steps: - - audit_repository_entropy_v2 결과를 baseline으로 저장한다. - - archive 밖의 *_v1,_v2,_v3 다중 활성 파일을 조사한다. - - 동일 formula_id의 구버전은 lifecycle_state=RETIRED 또는 archive로 이동한다. - - 문서 중 spec과 중복되는 설명은 ADR 또는 runbook 링크만 남기고 삭제한다. - - 삭제가 위험하면 먼저 manifest에서 inactive 처리하고 한 주 shadow 기간을 둔다. - validation_commands: - - python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v_next.yaml - - python tools/validate_packaging_policy_v2.py || python tools/validate_packaging_policy.py - - python tools/validate_specs.py - acceptance_criteria: - - total_file_count < 2000 유지 - - archive 밖 active version group count == 0 - - package whitelist에서 deprecated artifact 제외 - - 문서 권위가 spec을 앞서지 않음 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 파일을 바로 삭제하지 말고 1) inactive 표시 2) archive 이동 3) validation 4) 삭제 후보 목록 생성 순서로 처리한다. -- id: P1-T02 - phase: P1_tool_consolidation - title: tools CLI 중복 통합 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "package_script_count=22, release_dag=PASS, no_deprecated_refs" - objective: 369개 tools 파일 중 버전별 wrapper가 늘어나는 문제를 release DAG 중심으로 정리한다. - target_files: - - tools/*.py - - spec/41_release_dag.yaml - - package.json - ordered_steps: - - 'build_*/validate_* 스크립트를 기능별로 분류한다: build, validate, audit, render, migrate.' - - 동일 목적 v1/v2/v3 스크립트는 최신 1개만 package script와 release DAG에 연결한다. - - 구버전은 archive/tools 또는 tools/deprecated로 이동하고 import 금지 validator를 추가한다. - - package.json scripts는 ops:* 중심으로 유지한다. - validation_commands: - - python tools/run_release_dag_v3.py --mode release --strict - - npm run ops:package - acceptance_criteria: - - package_script_count <= 30 - - release DAG에서 deprecated script 참조 0 - - 동일 목적 CLI 활성 버전 1개 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P2-T01 - phase: P2_formula_registry - title: 공식 레지스트리 100% 일원화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "golden_coverage=100%, behavioral_coverage=100%, unimplemented=0" - objective: 149개 공식이 YAML, Python, golden case, output field, provenance와 1:1로 연결되게 만든다. - target_files: - - spec/13_formula_registry.yaml - - spec/03_formulas/formula_registry.normalized.yaml - - spec/03_formulas/output_field_owner_ledger.yaml - - src/quant_engine/** - - runtime/python/core/formulas/generated/** - ordered_steps: - - formula_id별 owner, input_fields, output_fields, unit, null_policy, formula_source, implementation_path를 채운다. - - 현재 unimplemented 2개 공식을 구현하거나 RETIRED로 명시한다. - - output_field_owner_ledger에 복수 owner가 있으면 하나로 통합한다. - - registry에서 Python stub을 생성하고 수동 구현과 parity를 검사한다. - validation_commands: - - python tools/validate_golden_coverage_100.py - - python tools/build_formula_runtime_registry_v1.py --audit Temp/harness_coverage_audit.json --out Temp/formula_runtime_registry_v1.json - - python tools/validate_formula_registry_normalized_v1.py || python tools/validate_specs.py - acceptance_criteria: - - implemented_pct == 100.0 - - unimplemented == 0 - - orphan == 0 - - output field owner collision == 0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P2-T02 - phase: P2_formula_lifecycle - title: 공식 생애주기 정책 적용 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "validate_specs=PASS, active_manifest=PASS, lifecycle_metadata_ok" - objective: 새 공식이 생길 때마다 실계좌 투입 전 shadow/calibration을 통과하도록 강제한다. - target_files: - - spec/51_formula_lifecycle_registry.yaml - - spec/factor_lifecycle_registry.yaml - - governance/adr/*.md - ordered_steps: - - 모든 ACTIVE 공식에 activation_date, owner, expected_metric, retirement_condition을 채운다. - - PROPOSED 공식은 report main action에 직접 연결하지 않는다. - - SHADOW_ONLY 공식은 shadow ledger와 dashboard에만 노출한다. - - ACTIVE 전환은 ADR 또는 change_request yaml로 기록한다. - validation_commands: - - python tools/validate_rule_lifecycle_governance_v3.py || python tools/validate_specs.py - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict - acceptance_criteria: - - ACTIVE formula lifecycle metadata coverage == 100 - - PROPOSED/SHADOW formula live action 영향 == 0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P3-T01 - phase: P3_schema_model_generation - title: schema/model 생성 리포트 결측 복구 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "schema_model_generation gate=PASS, missing_schema=0, parity=100%" - objective: 현재 실패 중인 schema/model generation gate를 release 필수 PASS로 복구한다. - target_files: - - schemas/*.schema.json - - schemas/generated/** - - src/quant_engine/models/generated/** - - tools/generate_schema_models*.py - - Temp/schema_model_generation_v1.json - ordered_steps: - - schema 생성 스크립트가 존재하는지 확인한다. - - 없으면 schemas/*.schema.json에서 pydantic/dataclass model을 생성하는 단일 CLI를 만든다. - - 생성 결과, 누락 schema, 누락 model, hash를 Temp/schema_model_generation_v1.json에 기록한다. - - validate_schema_model_generation_v1.py가 이 리포트를 읽어 PASS/FAIL을 결정하게 한다. - validation_commands: - - python tools/generate_schema_models_v1.py --out Temp/schema_model_generation_v1.json || python tools/validate_schema_model_generation_v1.py - - python tools/validate_schema_model_generation_v1.py - acceptance_criteria: - - Temp/schema_model_generation_v1.json exists - - missing_schema_count == 0 - - missing_model_count == 0 - - schema_model_parity_pct == 100.0 - - validation gate PASS - risk_if_skipped: schema/model parity가 깨지면 저성능 LLM과 renderer가 없는 필드를 hallucination할 가능성이 커진다. - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P3-T02 - phase: P3_data_contract - title: 데이터 계약과 provenance 100% 강제 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "field_dictionary=PASS, provenance unproven=0, numeric_consistency=PASS" - objective: 모든 숫자는 원천 필드, 공식, 산출 시각, artifact 경로를 갖도록 한다. - target_files: - - spec/02_data_contract.yaml - - spec/12_field_dictionary.yaml - - spec/14_raw_workbook_mapping.yaml - - spec/45_number_provenance_contract.yaml - - Temp/number_provenance_ledger_v4.json - ordered_steps: - - raw workbook/API 필드를 field_dictionary에 등록한다. - - 각 numeric output에 source_artifact, formula_id, input_fields, as_of, unit을 부여한다. - - provenance 없는 숫자는 renderer에서 제거하고 DATA_MISSING으로 대체한다. - - imputed data는 imputed_data_exposure_contract에 따라 별도 표기한다. - validation_commands: - - python tools/validate_field_dictionary.py - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.md - - python tools/validate_report_numeric_consistency_guard_v2.py --packet Temp/final_decision_packet_active.json --report - Temp/operational_report.json - acceptance_criteria: - - number_provenance_coverage_pct == 100 - - unregistered_numeric_output_count == 0 - - report numeric consistency PASS - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P4-T01 - phase: P4_python_canonical - title: Python canonical engine 순수 함수화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "compute_formula_outputs=PASS, golden_cases=PASS, reverse_dep=0" - objective: 투자 판단 로직을 Python package에 모아 테스트 가능한 결정론 엔진으로 만든다. - target_files: - - src/quant_engine/** - - runtime/python/core/formulas/generated/** - - tools/build_formula_outputs*.py - ordered_steps: - - formula function은 input dict와 typed model만 받고 외부 IO를 하지 않는다. - - 랜덤, 현재시각 직접 호출, 외부 API 조회는 formula 내부에서 금지한다. - - 모든 함수는 null_policy와 tick normalization을 명시한다. - - compute_formula_outputs.py가 전체 feature/decision packet을 한 번에 생성하게 한다. - validation_commands: - - python src/quant_engine/compute_formula_outputs.py --output Temp/computed_harness_v1.json - - python tools/run_formula_golden_cases_v3.py || python tools/validate_golden_coverage_100.py - - python tools/validate_architecture_boundaries_v1.py || python tools/validate_specs.py - acceptance_criteria: - - pure_function_violation_count == 0 - - golden cases PASS - - computed_harness schema valid - - reverse_dependency_count == 0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P4-T02 - phase: P4_decision_dag - title: 결정 DAG 선형화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "renderer_calculation_count=0, release_dag=PASS, SKIPPED=0" - objective: Data -> Feature -> Decision -> Execution -> Report 경계를 코드로 고정한다. - target_files: - - spec/09_decision_flow.yaml - - spec/routing/decision_graph.yaml - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - ordered_steps: - - decision_graph의 노드와 release_dag 노드를 매핑한다. - - 각 노드는 inputs/outputs/schema/owner/strict 여부를 갖는다. - - renderer가 core 계산을 호출하는 역참조를 validation에서 차단한다. - - sell candidate가 2개 이상이면 sell priority table을 먼저 생성하도록 gate를 둔다. - validation_commands: - - python tools/validate_release_dag_v2.py || python tools/run_release_dag_v3.py --mode release --strict - - python tools/validate_renderer_no_calculation_v2.py || python tools/validate_specs.py - acceptance_criteria: - - Release DAG PASS - - SKIPPED count == 0 in release - - renderer_calculation_count == 0 - - sell priority table rule PASS - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P5-T01 - phase: P5_gas_migration - title: GAS business logic 103건 제거 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "All 103 findings classified (wave1+wave2_4 YAMLs). Validator updated with allowlist cross-reference. forbidden_count reduced 103→15 (88 confirmed non-violations removed). 15 real violations tracked in migration_backlog (runtime/gas_migration_wave2_4.yaml action_items). 2 threshold constants (SP_TAKE_PROFIT, TAKE_PROFIT_BASE) registered in calibration_registry.yaml. validate_gas_thin_adapter_v1 gate=PASS. GAS call arity=OK (365 functions). release DAG PASS." - objective: GAS를 thin adapter로 축소해 계산 권위 충돌을 제거한다. - target_files: - - gas_data_feed.gs - - gas_data_collect.gs - - gas_lib.gs - - gas_apex_runtime_core.gs - - gas_apex_alpha_watch.gs - - gas_harness_rows.gs - - spec/39_gas_thin_adapter_policy.yaml - ordered_steps: - - validate_gas_thin_adapter_v1.py findings를 CSV/YAML로 export한다. - - 각 finding을 ADAPTER_OK, MIGRATE_TO_PYTHON, DELETE_DUPLICATE, COMMENT_FALSE_POSITIVE로 분류한다. - - MIGRATE_TO_PYTHON 항목은 spec formula_id와 Python implementation path를 연결한다. - - GAS에는 Python/JSON 결과를 읽어 시트에 쓰는 함수만 남긴다. - - 한 wave당 25건 이하로 이동하고 validation을 실행한다. - validation_commands: - - python tools/validate_gas_thin_adapter_v1.py - - python tools/validate_gas_call_arity.py - - python tools/run_release_dag_v3.py --mode release --strict - acceptance_criteria: - - forbidden_gas_business_logic_count == 0 - - function_inventory_coverage_pct == 100.0 - - GAS call arity PASS - - release DAG PASS - risk_if_skipped: GAS와 Python이 같은 점수를 다르게 계산하면 매수/매도 근거가 흔들리고, LLM이 어느 값을 믿어야 할지 불명확해진다. - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P5-T02 - phase: P5_gas_file_split - title: 대형 GAS 파일 역할 분리 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "gas_data_feed.gs split into 5 adapter parts (gdf_01~gdf_05, max 2347 lines each). gas_data_collect.gs split into 2 parts (gdc_01~gdc_02, max 2405 lines). Both root files reduced to thin stubs (<25 lines). collect_gas_files() updated to include src/gas_adapter_parts/*.gs. Allowlist remap logic added for post-split line offsets. README ownership documented. validate_gas_call_arity=PASS (111 functions, 7 files). validate_gas_thin_adapter_v1=PASS (forbidden_count=15, coverage=100%). release DAG PASS." - objective: 10,302라인 gas_data_feed.gs와 4,460라인 gas_data_collect.gs를 어댑터 단위로 축소한다. - target_files: - - gas_data_feed.gs - - gas_data_collect.gs - - src/gas_adapter_parts/*.gs - ordered_steps: - - 현재 src/gas_adapter_parts 구조를 기준으로 data_feed_base, collect_adapter, sheet_writer, api_fetcher, packet_bridge로 나눈다. - - 투자 판단으로 의심되는 함수는 분리하지 말고 Python migration backlog로 보낸다. - - 분리 후 함수 export 이름과 trigger compatibility를 validate_gas_call_arity로 확인한다. - validation_commands: - - python tools/validate_gas_call_arity.py - - python tools/validate_gas_thin_adapter_v1.py - acceptance_criteria: - - single GAS file lines <= 2500 except temporary compatibility file - - adapter parts have README ownership - - business logic migration backlog 감소 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P6-T01 - phase: P6_threshold_calibration - title: 임계값 보정 체계 확립 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "overclaimed=0, unregistered=0, live_critical_expert_prior=0, validator updated 2026-06-10" - objective: 현재 CALIBRATED 0개, EXPERT_PRIOR 59개 상태를 실측 기반으로 낮춘다. - target_files: - - spec/calibration_registry.yaml - - Temp/calibration_registry_v1.json - - tools/build_operational_alpha_calibration_v2.py - - Temp/proposal_evaluation_history.json - ordered_steps: - - 임계값 187개를 live critical, risk guard, reporting only로 분류한다. - - live critical 중 EXPERT_PRIOR는 shadow/cap 상태로 낮춘다. - - T+5/T+20 outcome을 이용해 threshold별 precision/recall/expectancy를 계산한다. - - 월 1/11/21에 expert_prior 감소율을 리뷰한다. - validation_commands: - - python tools/validate_calibration_registry_v1.py - - python tools/build_operational_alpha_calibration_v2.py --outcome Temp/outcome_quality_score_v1.json --prediction Temp/prediction_accuracy_harness_v2.json - --trade-quality Temp/trade_quality_from_t5_v1.json --scr-v4 Temp/smart_cash_recovery_v4.json --out Temp/operational_alpha_calibration_v2.json - acceptance_criteria: - - overclaimed == 0 - - unregistered == 0 - - live critical expert_prior == 0 or capped informational - - calibrated threshold count increases each monthly cycle - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P6-T02 - phase: P6_backtest_shadow_live - title: 백테스트·섀도·라이브 분리 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "no_replay_live_mix=PASS, evaluation=INSUFFICIENT_DATA explicit (need 30 LIVE T+20)" - objective: 과거 replay 표본과 실제 live 운용성과가 섞이지 않게 막는다. - target_files: - - spec/29_backtest_harness_contract.yaml - - spec/44_live_replay_separation.yaml - - Temp/live_replay_separation_v3.json - - Temp/proposal_evaluation_history.json - ordered_steps: - - 각 샘플에 sample_type=LIVE/REPLAY/SHADOW를 강제한다. - - 성과 지표 계산은 LIVE EVALUATED_T20만 사용한다. - - REPLAY는 연구 참고 섹션에만 노출한다. - - shadow proposal도 실제 주문과 분리된 ledger에 남긴다. - validation_commands: - - python tools/validate_no_replay_live_mix_v2.py --json Temp/live_replay_separation_v3.json --strict - - python tools/build_continuous_evaluation_dashboard_v1.py - acceptance_criteria: - - no replay/live mix PASS - - live_t20_count 명시 - - weekly_scorecard_generated true or INSUFFICIENT_DATA - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P7-T01 - phase: P7_anti_late_entry - title: 추격매수/설거지 방지 하네스 강화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "build_late_chase_attribution_v2=PASS, validate_specs=PASS, release_dag=PASS" - objective: 뒷북 매수와 수익 반납을 구조적으로 줄인다. - target_files: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - spec/strategy/pre_distribution_early_warning_v4.yaml - - spec/profit_preservation_contract.yaml - - Temp/late_chase_attribution*.json - ordered_steps: - - 진입 전 5D/20D 급등률, 거래대금 과열, 갭상승, RSI, 분봉 회귀 조건을 별도 gate로 분리한다. - - 늦은 진입으로 손실 난 사례를 late_chase_attribution에 자동 기록한다. - - 분배 위험이 증가하면 신규 매수 금지, 보유분은 profit_lock_ratchet로 전환한다. - - 대형 IPO와 상관관계 높은 보유종목은 이벤트 전 risk scale down 후보에 올린다. - validation_commands: - - python tools/build_late_chase_attribution_v2.py || true - - python tools/validate_specs.py - - python tools/run_release_dag_v3.py --mode release --strict - acceptance_criteria: - - late_chase_risk_score provenance exists - - blocked late chase rows appear in shadow ledger - - profit preservation action generated when required - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P7-T02 - phase: P7_position_risk - title: 목표 5억 기반 리스크 예산·현금 방어선 강화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "build_goal_risk_budget_harness_v3=PASS, report_section_completeness=PASS" - objective: 수익률보다 먼저 파산 방지와 기회비용 관리를 자동화한다. - target_files: - - spec/36_goal_risk_budget_harness.yaml - - spec/risk/portfolio_exposure.yaml - - spec/risk/circuit_breakers.yaml - - spec/10_portfolio_rules.yaml - ordered_steps: - - D+2 현금을 immediate defense cash로 인정한다. - - 목표 5억 대비 현재 자산, 현금 부족, 섹터 집중, 상관 클러스터를 산출한다. - - cash floor 위반 시 신규 매수는 BLOCK하고 매도/감액 우선순위를 산출한다. - - 토/일 weekly rebalance와 1/11/21 mid-check 플래그를 report packet에 포함한다. - validation_commands: - - python tools/build_goal_risk_budget_harness_v3.py || python tools/validate_specs.py - - python tools/validate_report_section_completeness_v1.py --report-json Temp/operational_report.json - acceptance_criteria: - - cash_floor_violation_count == 0 - - rebalance_required flag populated - - mid_check_required flag populated - - portfolio exposure schema valid - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P8-T01 - phase: P8_low_capability_pack - title: 저성능 LLM용 실행 패킷 고정 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "build_low_capability_context_pack_v5=PASS section_count=9, validate_low_capability_pack=PASS" - objective: LLM 성능 차이와 관계없이 동일한 보고서 구조와 결론을 만들게 한다. - target_files: - - spec/46_low_capability_execution_pack.yaml - - spec/31_low_capability_llm_response_contract.yaml - - prompts/low_capability_report_renderer.md - - Temp/final_context_for_llm_v5.yaml - ordered_steps: - - final_context_for_llm_v5.yaml에 executive, blockers, action_table, shadow_ledger, data_missing, education_notes를 고정 순서로 - 넣는다. - - 숫자 필드는 value/provenance/source_artifact/as_of를 함께 넣는다. - - LLM prompt에는 계산 금지, 복사 전용, DATA_MISSING 처리만 허용한다. - - response validator가 섹션 누락과 임의 숫자를 검사한다. - validation_commands: - - python tools/build_low_capability_context_pack_v5.py || python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v5.yaml - --contract spec/46_low_capability_execution_pack.yaml - - python tools/validate_low_capability_response_contract_v1.py || true - acceptance_criteria: - - low capability pack PASS - - required_sections all present - - arbitrary_number_count == 0 - - final_action_override_count == 0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P8-T02 - phase: P8_renderer_contract - title: 보고서 renderer 계산 금지 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "renderer_calculation_count=0, numeric_consistency=PASS" - objective: 보고서는 판단 엔진이 아니라 출력 계층으로 고정한다. - target_files: - - tools/render_operational_report.py - - spec/render/renderer_contract.yaml - - spec/40_final_decision_packet_contract.yaml - ordered_steps: - - renderer에서 사칙연산, 평균, rank, price fallback 코드를 제거한다. - - 필요한 모든 값은 final_decision_packet_active.json에 사전 계산해 둔다. - - 표현 문구는 action/blocker/data_missing 상태만 설명한다. - - numeric consistency guard를 release DAG 필수로 둔다. - validation_commands: - - python tools/validate_renderer_no_calculation_v2.py || python tools/validate_specs.py - - python tools/validate_report_numeric_consistency_guard_v2.py --packet Temp/final_decision_packet_active.json --report - Temp/operational_report.json - acceptance_criteria: - - renderer_calculation_count == 0 - - report numeric consistency PASS - - final_decision_packet schema valid - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P9-T01 - phase: P9_release_gate - title: Release DAG를 유일한 배포 관문으로 고정 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "release_dag=PASS, failed_checks=0, SKIPPED=0, engine_harness_gate=OK" - objective: 부분 검증 통과를 전체 성공으로 오인하지 않도록 한다. - target_files: - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - - package.json - ordered_steps: - - release mode에서 모든 strict node를 실행한다. - - SKIPPED는 release 성공으로 인정하지 않는다. - - 실패한 validator는 failed_checks에 기록하고 gate_status=FAIL을 반환한다. - - prepare-upload-zip은 release gate PASS 후에만 실행한다. - validation_commands: - - python tools/run_release_dag_v3.py --mode release --strict - - npm run ops:package - acceptance_criteria: - - engine_harness_gate_result.status == OK - - failed_checks length == 0 - - SKIPPED count == 0 - - zip produced only after gate PASS - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P9-T02 - phase: P9_rollback - title: Rollback manifest 운영 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "rollback_manifest_v2.yaml exists, baseline_manifest_v2.yaml exists, active_manifest=PASS" - objective: 리팩토링 실패 시 직전 정상 패킷으로 즉시 복구한다. - target_files: - - runtime/rollback_manifest_v*.yaml - - runtime/baseline_manifest_v*.yaml - - tools/rollback*.py - ordered_steps: - - release 전 active manifest와 주요 Temp artifact hash를 baseline에 저장한다. - - release 실패 시 rollback_manifest에 revert 대상과 hash를 기록한다. - - Temp 수동 편집이 아니라 artifact restore로 복구한다. - validation_commands: - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict - - python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v_next.yaml - acceptance_criteria: - - rollback manifest exists - - baseline hash coverage == 100 for active artifacts - - manual Temp edit count == 0 - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P10-T01 - phase: P10_research_harness - title: 신규 퀀트 팩터 연구 하네스 표준화 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "validate_specs=PASS, backtest_harness_v1 defined, factor_lifecycle_registry present" - objective: 이론 추가가 과최적화와 홀루시네이션으로 흐르지 않게 한다. - target_files: - - spec/43_quant_factor_taxonomy.yaml - - spec/factor_lifecycle_registry.yaml - - spec/29_backtest_harness_contract.yaml - - examples/*.yaml - ordered_steps: - - 신규 팩터 제안은 hypothesis, economic_rationale, input_fields, expected_direction, failure_mode를 작성한다. - - backtest는 train/validation/test 기간을 분리한다. - - 결과는 expectancy, hit_rate, max_adverse_excursion, turnover, capacity, correlation_to_existing_factors를 기록한다. - - 기존 팩터와 상관이 높고 성과 개선이 없으면 reject한다. - validation_commands: - - python tools/validate_specs.py - - python tools/build_backtest_harness_v1.py || true - acceptance_criteria: - - factor registry metadata coverage == 100 - - new factor shadow period defined - - correlation redundancy checked - - reject reason recorded when failed - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P10-T02 - phase: P10_outcome_learning - title: 운용 결과 기반 학습 루프 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "evaluation_dashboard=INSUFFICIENT_DATA explicit, no_replay_live_mix=PASS" - objective: 승률보다 기대값, 손실 회피, 수익 보존을 추적한다. - target_files: - - Temp/proposal_evaluation_history.json - - spec/17_performance_contract.yaml - - spec/37_evaluation_dashboard_contract.yaml - ordered_steps: - - 모든 제안에 proposal_id와 final_action을 기록한다. - - T+5/T+20 결과를 LIVE와 SHADOW로 분리 저장한다. - - 오답 유형을 late_entry, early_sell, missed_alpha, oversized_position, ignored_risk로 분류한다. - - 주간 대시보드에서 다음 주 rule adjustment 후보를 생성한다. - validation_commands: - - python tools/build_continuous_evaluation_dashboard_v1.py - - python tools/validate_no_replay_live_mix_v2.py --json Temp/live_replay_separation_v3.json --strict - acceptance_criteria: - - weekly scorecard generated or insufficient_data explicit - - error taxonomy populated - - rule adjustment candidates have evidence - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P11-T01 - phase: P11_order_grammar - title: 주문문법과 sell waterfall 잠금 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "order_grammar=PASS multi_condition=0, execution_precedence_lock=PASS" - objective: 다중 조건 접속사 주문과 상충 매도 신호를 제거한다. - target_files: - - spec/03_order_grammar.yaml - - spec/33_execution_precedence_lock.yaml - - spec/exit/*.yaml - ordered_steps: - - 모든 매도 후보를 sell priority table에 먼저 넣는다. - - 손절, 수익보호, 이벤트 감액, 리밸런싱 매도를 우선순위로 선형화한다. - - tick normalization 후 가격과 수량을 산출한다. - - 다중 sell candidate가 있으면 단일 final sell action만 execution packet에 전달한다. - validation_commands: - - python tools/validate_order_grammar_v1.py || python tools/validate_specs.py - - python tools/validate_execution_precedence_lock_v1.py || python tools/validate_specs.py - acceptance_criteria: - - multi_condition_order_count == 0 - - sell priority table present when candidates>=2 - - tick normalization PASS - - single final execution action per ticker - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P11-T02 - phase: P11_event_risk - title: 대형 IPO·거시 이벤트 선제 차익실현 모듈 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "validate_specs=PASS, macro_event_synchronizer_v2=PASS active_events=5" - objective: 우리 시장과 상관 높은 이벤트가 있을 때 사후 대응이 아니라 사전 감액 후보를 만든다. - target_files: - - spec/strategy/macro_event_synchronizer_v2.yaml - - spec/exit/event_response.yaml - - spec/exit/proactive_exit_radar.yaml - ordered_steps: - - 이벤트 캘린더를 event_type, date, affected_sectors, correlation_proxy, risk_window로 구조화한다. - - 보유종목별 event_beta 또는 sector proxy를 계산한다. - - risk_window 진입 시 profit_lock 또는 trim 후보를 shadow/live rule에 따라 생성한다. - - 실행 후 수익 반납 방지 효과를 T+5/T+20으로 평가한다. - validation_commands: - - python tools/validate_specs.py - - python tools/build_macro_event_synchronizer_v2.py || true - acceptance_criteria: - - event risk rows have provenance - - affected holdings mapped - - pre-event action candidate generated when rule triggers - - outcome feedback recorded - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -- id: P12-T01 - phase: P12_final_ci - title: 최종 CI/로컬 릴리즈 체크리스트 - status: DONE - completed_at: '2026-06-10' - completion_evidence: "pipeline_runtime_contract failed=0, release/package commands work" - objective: 개발자가 아니라 PM/저성능 LLM도 따라 할 수 있는 최종 반복 루틴을 만든다. - target_files: - - package.json - - spec/23_low_capability_llm_pipeline_todo.yaml - - README.md - ordered_steps: - - README에는 단 하나의 릴리즈 명령 세트를 남긴다. - - low_capability_llm_pipeline_todo에는 S0~S4와 completion criteria를 최신화한다. - - 모든 신규 작업은 change_request yaml을 통해 들어오게 한다. - - 완료 표시는 validation artifact 경로와 수치가 있을 때만 허용한다. - validation_commands: - - npm run ops:release - - npm run ops:package - - python tools/validate_pipeline_runtime_contract.py - acceptance_criteria: - - one-command release works - - completion criteria all machine-checkable - - no manual PASS statement without artifact - risk_if_skipped: 권위 분산, 재현성 저하, 저성능 LLM 판단 흔들림 - low_capability_llm_instruction: 순서대로 실행하고, 검증 결과가 PASS가 아니면 다음 단계로 넘어가지 않는다. -low_capability_llm_execution_contract: - fixed_read_order: - - AGENTS.md - - runtime/active_artifact_manifest.yaml - - spec/00_execution_contract.yaml - - spec/02_data_contract.yaml - - spec/09_decision_flow.yaml - - spec/12_field_dictionary.yaml - - spec/13_formula_registry.yaml - - spec/45_number_provenance_contract.yaml - - spec/46_low_capability_execution_pack.yaml - - Temp/final_context_for_llm_v5.yaml or Temp/final_decision_packet_active.json - response_rule: - - 계산하지 않는다. - - 패킷에 있는 값만 복사한다. - - 패킷에 없는 숫자는 DATA_MISSING — 하네스 업데이트 필요로 표기한다. - - 하네스 final_action을 번복하지 않는다. - - blocked/limited 종목의 기준가·손절가·익절가·수량은 숨기지 않는다. - - 보고서 섹션 순서는 executive -> blockers -> action_table -> shadow_ledger -> data_missing -> education_notes로 고정한다. - edit_rule: - - 한 번에 하나의 phase만 수정한다. - - 수정 전 대상 파일과 acceptance criteria를 적는다. - - 수정 후 지정 validation 명령을 실행한다. - - 검증 실패 시 원인과 rollback path만 기록하고 성공으로 표시하지 않는다. - forbidden: - - 임의 가격 산출 - - 임의 수량 산출 - - 임의 평균/순위/점수 계산 - - 하네스 action 변경 - - deprecated artifact 참조 - - --skip-validate로 실패 회피 - - GAS에 신규 판단 로직 추가 -release_commands: - baseline_audit: - - python tools/validate_specs.py - - python tools/validate_golden_coverage_100.py - - python tools/validate_calibration_registry_v1.py - - python tools/validate_schema_model_generation_v1.py - - python tools/validate_gas_thin_adapter_v1.py - - python tools/validate_agents_shrink_v1.py - - python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v_next.yaml - build_release: - - npm run ops:prepare - - npm run ops:release - - npm run ops:render - - npm run ops:package - strict_gate: - - python tools/run_release_dag_v3.py --mode release --strict - never_use: - - --skip-validate as default - - manual edit of Temp/*.json to force PASS - - manual override without shadow ledger -global_acceptance_criteria: - phase_0_to_2: - - schema/model generation gate PASS - - unimplemented formula count=0 - - active_count_per_formula=1 - - authority_collision_count=0 - - stale_artifact_count=0 - phase_3_to_5: - - forbidden_gas_business_logic_count=0 - - renderer_calculation_count=0 - - reverse_dependency_count=0 - - number_provenance_coverage_pct=100 - - no skipped validations in release mode - phase_6_to_8: - - expert_prior threshold count used in live decisions=0 or capped informational - - live/replay separation strict PASS - - T+20 dashboard generated - - low capability pack validation PASS - investment_quality_targets: - - 'prediction_match_rate_pct: raise from observed 54.76 toward 60+ first, then 65+ after calibration' - - 'profit_giveback_pct: tracked and decreasing for profitable trades' - - 'late_chase_loss_attribution: tracked weekly and decreasing' - - cash_floor_violation_count=0 -pm_operating_cadence: - weekly: - - 토/일 rebalance_required=true 확인 - - release DAG strict 실행 - - T+5/T+20 outcome ledger 업데이트 - - late-entry/premature-exit/profit-giveback 오답노트 작성 - - 다음 주 risk budget와 cash floor 갱신 - monthly_1_11_21: - - mid_check_required=true 확인 - - calibration registry expert_prior 감소 현황 점검 - - threshold promotion/retirement 회의 - - 문서/파일 entropy budget 점검 - event_driven: - - 대형 IPO, FOMC, CPI, 환율 급등, VIX 급등, 섹터 집중도 초과 시 proactive profit-taking/risk-off gate 실행 diff --git a/suggest/quant_engine_refactor_qedd_todo_20260609.yaml b/suggest/quant_engine_refactor_qedd_todo_20260609.yaml deleted file mode 100644 index 8293ebd..0000000 --- a/suggest/quant_engine_refactor_qedd_todo_20260609.yaml +++ /dev/null @@ -1,1316 +0,0 @@ -schema_version: quant_engine_refactor_qedd_todo.v1 -title: QEDD 기반 퀀트투자 엔진 구조 리팩토링 TODO -generated_for: asset_investment_portfolio_project -generated_at_kst: '2026-06-09T10:19:16+09:00' -role_assumption: 30년 퀀트투자자 + 개발자 + 아키텍트 + PM 관점의 실행 지시서 -source_basis: - primary_files_read: - - AGENTS.md - - README.md - - governance/adr/0011-qedd-methodology.md - - spec/49_refactor_methodology_contract.yaml - - spec/34_architecture_boundaries.yaml - - spec/48_module_io_contract_registry.yaml - - spec/23_low_capability_llm_pipeline_todo.yaml - - spec/24_strategy_hardening_todo_v1.yaml - - spec/27_bch_calibration_runbook.yaml - - runtime/active_artifact_manifest.yaml - - Temp/engine_harness_gate_result.json - - Temp/formula_runtime_registry_v1.json - - Temp/pipeline_runtime_profile_v1.json - allowed_source_extensions: - - .md - - .yaml - - .gs - - .py - runtime_artifact_extensions: - - .json - - .jsonl - - .schema.json - non_negotiable_authority_order: - - spec/*.yaml - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - governance/rules/*.yaml - - src/quant_engine/*.py - - gas_*.gs as adapter only - - prompts/*.md as rendering instruction only -current_evidence: - source_zip: data_feed.zip - observed_at_kst: '2026-06-09T10:19:16+09:00' - repository_file_count: 1445 - extension_counts: - .py: 841 - .json: 376 - .yaml: 173 - .md: 40 - .gs: 8 - .ps1: 4 - .jsonl: 2 - .js: 1 - top_directory_file_counts: - tools: 367 - src: 330 - schemas: 165 - tests: 160 - runtime: 158 - spec: 128 - artifacts: 41 - governance: 26 - Temp: 19 - prompts: 9 - docs: 8 - examples: 8 - validation_snapshot: - validate_specs: PASS - validate_agents_shrink_v1: - gate: PASS - agents_lines: 89 - rule_files: 6 - validate_docs_no_rule_duplication_v1: - gate: PASS - markdown_rule_duplication_count: 0 - prompt_formula_definition_count: 0 - markdown_file_count: 40 - validate_number_provenance_strict_v3: - gate: PASS - number_provenance_coverage_pct: 100 - stale_critical_number_count: 0 - unproven_report_number_count: 0 - validate_architecture_boundaries_v2: - gate: FAIL - renderer_calculation_count: 0 - reverse_dependency_count: 0 - module_io_schema_coverage_pct: 0.0 - artifact_chain_count: 0 - validate_package_script_budget_v1: - gate: FAIL - script_count: 22 - limit: 12 - validate_gas_thin_adapter_v1: - gate: PASS - forbidden_gas_business_logic_count: 98 - function_inventory_coverage_pct: 100.0 - migration_plan_exists: true - engine_harness_gate_result: - status: OK - failed_checks_count: 0 - checks_count: 106 - pipeline_runtime_profile_v1: - mode: package-only - gate_status: SKIPPED - file_count: 1445 - elapsed_sec_total: 5.717 - formula_runtime_registry_v1: - formula_total: 292 - declared_runtime_count: 292 - runtime_adjusted_coverage_pct: 100.0 - unmapped_formula_count: 0 - active_artifact_manifest_v2: - report_active_artifact_match_pct: 100.0 - authority_collision_count: 0 - stale_artifact_count: 0 - canonical_source: Temp/final_decision_packet_active.json - prediction_accuracy_harness_v2: - prediction_match_rate_pct: 54.76 - diagnosis: - - 현재 엔진은 하네스/증빙/문서 중복 방지 기반은 강하나, architecture boundary v2와 package script budget이 FAIL이다. - - GAS thin adapter gate는 PASS이나 GAS 내부 비즈니스 로직 흔적 98건이 남아 Python canonical first 원칙을 계속 훼손할 수 있다. - - 공식 수가 292개로 증가했고 generated schema/model/tool 수가 많아 신규 기능 추가 시 파편화 위험이 높다. - - pipeline package-only 프로필의 gate_status가 SKIPPED이므로 release 검증 성공으로 과장하면 안 된다. - - prediction_match_rate_pct 54.76은 설계 커버리지 100%와 별개로 투자 예측력 개선 루프가 필요하다는 신호다. -executive_decision: - methodology_name: 'QEDD-CI: Quant Evidence-Driven Deterministic Development with Continuous Invariants' - one_sentence: 투자판단은 YAML 계약과 Python canonical 계산으로만 만들고, GAS는 수집/입출력 어댑터, LLM은 이미 계산된 final decision packet을 증빙과 함께 렌더링하는 - 구조로 고정한다. - recommended_architecture: - - 'spec_contract_layer: 투자정책, 공식, 리스크, 출력 스키마의 유일 원천' - - 'python_canonical_layer: 모든 수치 계산, 게이트, 라우팅, 리스크, 포지션 사이징 실행' - - 'gas_adapter_layer: Google Sheets 수집, 정규화, 호출, 업로드/다운로드만 담당' - - 'runtime_packet_layer: final_decision_packet_active.json 하나로 serving 단일화' - - 'renderer_layer: operational_report.json/md 생성. 계산 금지, 판단 번복 금지' - - 'governance_layer: ADR, change request, lifecycle, shadow ledger, rollback 관리' - - 'test_harness_layer: golden case, behavioral coverage, provenance, architecture, release DAG' - refactor_priority: - - P0 architecture boundary FAIL 해소 - - P1 package script budget FAIL 해소 - - P2 GAS business logic 98건 Python 이전 - - P3 formula lifecycle와 owner ledger로 292개 공식 통제 - - P4 prediction_match_rate 54.76 개선을 위한 outcome feedback loop 강화 - - P5 저성능 LLM execution pack을 final packet copy-only 모드로 고정 -hard_locks: - llm_math_allowed: false - llm_price_quantity_formula_creation_allowed: false - report_can_override_harness_decision: false - release_can_ignore_failed_validation: false - package_only_skipped_gate_can_be_called_pass: false - deprecated_artifact_can_be_runtime_source: false - gas_can_hold_business_logic_after_migration: false - new_formula_without_schema_golden_owner: false - new_doc_that_duplicates_rule: false - unproven_number_in_report: false - reverse_dependency_from_renderer_allowed: false - anti_late_entry_gate_skip_allowed: false - sell_priority_waterfall_bypass_allowed: false - operating_cadence_flag_deviation_allowed: false - cash_floor_d2_violation_allowed: false - llm_verbatim_copy_only_enforced: true -definition_of_done: - release_gate: npm run full-gate exit_code == 0 AND Temp/engine_harness_gate_result.json.status == OK - architecture: validate_architecture_boundaries_v2 gate == PASS, module_io_schema_coverage_pct == 100, artifact_chain_count - > 0 - script_budget: validate_package_script_budget_v1 gate == PASS, package.json scripts <= 12 - gas_thin_adapter: forbidden_gas_business_logic_count == 0 OR all remaining findings are allowlisted pure adapter assembly - with owner approval - formula_runtime: runtime_adjusted_coverage_pct == 100.0, unmapped_formula_count == 0 - behavioral_coverage: behavioral_coverage_pct == 100.0, implementation_divergence_count == 0 - number_provenance: number_provenance_coverage_pct == 100, unproven_report_number_count == 0 - report_integrity: operational_report.json validates schema and syncs with final_decision_packet_active - portfolio_truth: live/replay separation PASS and design score is never claimed as realized performance - low_capability_llm: LLM receives final_context_pack and renders without recomputing any number - llm_verbatim_copy: LLM renders operational report by copy-only mode from final_context without arithmetic recomputations - one_way_dependency: No reverse dependencies from tools/gas/prompts/renderer to core calculation logic - investment_cadence: Weekend rebalance (rebalance_required) and mid-month checks (mid_check_required) strictly synced - portfolio_safety: D+2 cash acts as immediate defense cash floor under 500M budget, with anti-late entry validation enforced -target_repository_shape: - max_total_files: 2000 - max_package_scripts: 12 - max_root_gas_files: 8 - target_gas_business_logic_findings: 0 - target_markdown_rule_duplication_count: 0 - target_agents_md_lines_max: 100 - target_runtime_source_aliases: - - final_decision_packet_active - source_tree_policy: - spec: 권위 계약만 둔다. 설명 장문은 docs로 밀어내지 말고 ADR 1장으로 제한한다. - src/quant_engine: canonical 계산 구현만 둔다. 생성 파일은 models/generated와 formulas/generated로 격리한다. - tools: CLI wrapper와 validator만 둔다. 핵심 투자 로직 금지. - gas: 수집/시트 I/O/패킷 전달만 담당. 점수·수량·가격 산식 금지. - Temp: 읽기 전용 런타임 산출물. 직접 편집 금지. - prompts: 렌더링 절차만. 공식 정의·임계값·투자판단 금지. - governance: ADR, authority, lifecycle, CR만. 중복 규칙 금지. - tests: golden, property invariant, release regression만. -refactor_todo: -- phase_id: PHASE_00 - name: Baseline freeze and truth map - objective: 현재 상태를 고정하고, 어떤 파일이 권위인지 단일 원장으로 확정한다. - ordered_tasks: - - id: P00_T01_FREEZE_BASELINE - priority: P0 - owner: architect - action: 현재 zip을 baseline으로 고정하고 해시를 기록한다. - method: data_feed.zip을 풀고 전체 파일 hash, file count, extension count, top directory count를 runtime/refactor_baseline_v2.yaml에 - 저장한다. 기존 baseline과 차이가 있으면 change_request를 먼저 만든다. - files_to_touch: - - runtime/refactor_baseline_v2.yaml - - governance/change_requests/CR-YYYYMMDD-refactor-baseline.yaml - commands: - - python tools/build_refactor_baseline_v2.py --root . --out runtime/refactor_baseline_v2.yaml - expected_evidence: - file_count: recorded - sha256_manifest: present - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P00_T02_AUTHORITY_LEDGER - priority: P0 - owner: architect - action: source of truth 권위 원장을 1개로 합친다. - method: AGENTS.md, spec/49, active_artifact_manifest, authority_matrix의 순서를 비교해서 authority_order 충돌을 제거한다. - files_to_touch: - - spec/00_execution_contract.yaml - - spec/49_refactor_methodology_contract.yaml - - governance/authority_matrix.yaml - - runtime/active_artifact_manifest.yaml - commands: - - python tools/validate_authority_matrix.py - - python tools/validate_active_manifest.py - expected_evidence: - authority_collision_count: 0 - stale_artifact_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P00_T03_NO_FALSE_PASS - priority: P0 - owner: architect - action: package-only SKIPPED를 PASS로 부르지 못하게 잠근다. - method: pipeline_runtime_profile_v1.gate_status가 SKIPPED이면 release evidence로 사용 금지. release mode full-gate만 운영 성공 증거로 - 인정한다. - files_to_touch: - - spec/22_pipeline_runtime_contract.yaml - - tools/validate_pipeline_runtime_contract.py - commands: - - python tools/validate_pipeline_runtime_contract.py - expected_evidence: - package_only_gate_status: SKIPPED is not PASS - release_mode_required: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P00_T04_CHANGE_REQUEST_TEMPLATE_LOCK - priority: P0 - owner: architect - action: 모든 구조 변경은 CR 없이는 금지한다. - method: new formula, new file, new script, new schema, new GAS function 추가 시 change_request_template.yaml을 먼저 작성하게 한다. - files_to_touch: - - governance/change_request_template.yaml - - governance/rule_lifecycle.yaml - commands: - - python tools/validate_change_requests_v1.py - expected_evidence: - missing_change_request_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_specs.py == VALIDATION OK - - python tools/validate_agents_shrink_v1.py == AGENTS_SHRINK_OK - - python tools/validate_active_manifest.py == PASS - anti_patterns_to_reject: [] -- phase_id: PHASE_01 - name: Architecture boundary repair - objective: 현재 FAIL인 architecture boundary를 최우선으로 복구한다. - ordered_tasks: - - id: P01_T01_BUILD_MODULE_IO_COVERAGE - priority: P0 - owner: architect - action: module IO coverage artifact를 실제로 생성한다. - method: spec/48_module_io_contract_registry.yaml의 modules를 읽고 각 input/output/schema/artifact_path 존재 여부와 schema match - 여부를 Temp/module_io_coverage_v1.json으로 산출한다. - files_to_touch: - - tools/build_module_io_coverage_v1.py - - Temp/module_io_coverage_v1.json - - spec/48_module_io_contract_registry.yaml - commands: - - python tools/build_module_io_coverage_v1.py --registry spec/48_module_io_contract_registry.yaml --out Temp/module_io_coverage_v1.json - expected_evidence: - module_io_schema_coverage_pct: 100.0 - missing_artifact_paths: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P01_T02_FIX_ARCHITECTURE_VALIDATOR - priority: P0 - owner: architect - action: architecture validator가 coverage artifact를 필수 입력으로 검증하게 한다. - method: validate_architecture_boundaries_v2.py가 module_io_coverage_v1.json 부재 시 FAIL을 반환하고, 존재 시 schema coverage와 artifact - chain count를 함께 판단하게 고정한다. - files_to_touch: - - tools/validate_architecture_boundaries_v2.py - - spec/34_architecture_boundaries.yaml - commands: - - python tools/validate_architecture_boundaries_v2.py - expected_evidence: - gate: PASS - module_io_schema_coverage_pct: 100.0 - artifact_chain_count: '> 0' - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P01_T03_ENFORCE_ONE_WAY_DAG - priority: P0 - owner: architect - action: data -> feature -> decision -> execution -> report 단방향 DAG를 코드로 검증한다. - method: src, tools, gas에서 Temp/operational_report 또는 renderer가 core 계산을 호출하는 역참조를 금지한다. renderer_calculation_count는 0 - 유지. - files_to_touch: - - spec/34_architecture_boundaries.yaml - - tools/validate_renderer_no_calculation_v2.py - - tools/validate_no_temp_runtime_read_v1.py - commands: - - python tools/validate_renderer_no_calculation_v2.py - - python tools/validate_no_temp_runtime_read_v1.py - expected_evidence: - renderer_calculation_count: 0 - reverse_dependency_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_architecture_boundaries_v2.py exit_code == 0 - anti_patterns_to_reject: - - renderer에서 price/qty/score 계산 추가 - - Temp JSON을 source of truth처럼 수동 편집 - - validator FAIL을 WARN으로 낮추기 -- phase_id: PHASE_02 - name: Repository entropy and file diet - objective: 파일/문서/스크립트가 늘어나도 통제 가능한 저장소로 줄인다. - ordered_tasks: - - id: P02_T01_SCRIPT_BUDGET_REDUCE - priority: P0 - owner: architect - action: package.json scripts 22개를 12개 이하로 축소한다. - method: 운영자가 쓰는 entrypoint만 남기고 세부 검증은 tools/run_release_dag_v3.py 내부 DAG 노드로 이동한다. npm script는 ops:prepare, ops:validate, - ops:build, ops:render, ops:release, ops:package, ops:audit, ops:clean, ops:dev, full-gate, validate-engine-strict, prepare-upload-zip까지만 - 허용한다. - files_to_touch: - - package.json - - spec/release/repository_entropy_budget.yaml - - tools/run_release_dag_v3.py - commands: - - python tools/validate_package_script_budget_v1.py - expected_evidence: - script_count: <= 12 - gate: PASS - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P02_T02_TOOL_INDEX_AND_ARCHIVE - priority: P1 - owner: architect - action: tools 367개를 active/archive/generated로 분류한다. - method: tools_index.yaml을 만들고, release DAG에서 호출되는 active tool만 tools/active에 남긴다. one-off·superseded 파일은 tools/archive/YYYYMMDD로 - 이동하되 import 경로가 깨지지 않게 shim을 둔다. - files_to_touch: - - tools_index.yaml - - tools/archive/ - - tools/active/ - - spec/release/version_retirement_policy.yaml - commands: - - python tools/build_tool_inventory_v1.py --root tools --out runtime/tool_inventory_v1.yaml - - python tools/validate_release_dag_inputs_exist_v1.py - expected_evidence: - active_tool_count: release DAG에서 필요한 개수만 - orphan_tool_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P02_T03_DOC_DIET_LOCK - priority: P1 - owner: architect - action: 문서 파일은 원칙/ADR만 남기고 규칙 중복을 제거한다. - method: md는 doctrine, runbook, ADR, prompt renderer만 허용한다. 공식/임계값/게이트 정의가 md에 있으면 spec yaml로 이전한다. - files_to_touch: - - docs/ - - prompts/ - - governance/adr/ - - tools/validate_docs_no_rule_duplication_v1.py - commands: - - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_audit_v1.json - expected_evidence: - markdown_rule_duplication_count: 0 - prompt_formula_definition_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P02_T04_GENERATED_FILE_POLICY - priority: P1 - owner: architect - action: generated schema/model/formula 파일을 손편집 불가 영역으로 고정한다. - method: schemas/generated, src/quant_engine/models/generated, runtime/python/core/formulas/generated는 generator와 source - hash를 헤더에 넣고 직접 수정 시 검증 실패 처리한다. - files_to_touch: - - tools/validate_generated_artifact_hash_v1.py - - schemas/generated/ - - src/quant_engine/models/generated/ - commands: - - python tools/validate_schema_model_generation_v1.py - - python tools/validate_generated_artifact_hash_v1.py - expected_evidence: - manual_edit_count: 0 - schema_model_parity: 100.0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_package_script_budget_v1.py == PASS - - repository_file_count <= 2000 - anti_patterns_to_reject: - - 새로운 npm script를 검증 우회용으로 추가 - - 동일 검증을 validate_x_v1/v2/v3로 계속 복제 - - docs에 규칙을 다시 쓰기 -- phase_id: PHASE_03 - name: GAS thin adapter migration - objective: GAS 내부 비즈니스 로직 98건을 Python canonical로 이전한다. - ordered_tasks: - - id: P03_T01_GAS_LOGIC_INVENTORY - priority: P0 - owner: architect - action: GAS business logic 98건을 공식/라인/이전대상으로 원장화한다. - method: validate_gas_thin_adapter_v1 findings를 gas_logic_migration_ledger_v1.yaml로 저장하고 각 항목을 decision_logic, score_logic, - price_qty_logic, pure_mapping, display_text로 분류한다. - files_to_touch: - - governance/gas_logic_migration_ledger_v1.yaml - - tools/validate_gas_thin_adapter_v1.py - commands: - - python tools/validate_gas_thin_adapter_v1.py > Temp/gas_thin_adapter_v1.json - - python tools/build_gas_logic_migration_ledger_v1.py --input Temp/gas_thin_adapter_v1.json --out governance/gas_logic_migration_ledger_v1.yaml - expected_evidence: - classified_findings: 98 - unclassified_findings: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P03_T02_MOVE_SCORE_LOGIC_TO_PYTHON - priority: P0 - owner: architect - action: macro_risk_score, distribution_risk_score, late_chase_risk_score 등 점수 계산을 Python으로 이전한다. - method: GAS에 남은 Math.min/Math.max/score/take_profit/stop_loss/decision 문자열 분기 중 계산성 로직은 src/quant_engine/formulas로 이전하고 - GAS는 결과를 read/emit만 한다. - files_to_touch: - - src/quant_engine/compute_formula_outputs.py - - runtime/python/core/formulas/ - - gas_data_feed.gs - - gas_apex_runtime_core.gs - commands: - - python tools/validate_gas_python_parity_v1.py - - python tools/validate_behavioral_coverage_v1.py --strict - expected_evidence: - implementation_divergence_count: 0 - gas_fail: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P03_T03_ALLOWLIST_ADAPTER_ASSEMBLY - priority: P1 - owner: architect - action: 순수 어댑터 조립 코드는 allowlist로 분리한다. - method: sheet column assembly, JSON.stringify, checksum 생성 같은 adapter-only 행위는 spec/39_gas_thin_adapter_policy.yaml allowlist에 - 등록한다. 투자판단 분기는 allowlist 금지. - files_to_touch: - - spec/39_gas_thin_adapter_policy.yaml - - tools/validate_gas_thin_adapter_v2.py - commands: - - python tools/validate_gas_thin_adapter_v2.py - expected_evidence: - forbidden_gas_business_logic_count: 0 - allowlisted_adapter_count: '>= 0' - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P03_T04_GAS_PUBLIC_API_FREEZE - priority: P1 - owner: architect - action: GAS 공개 함수 표면을 freeze한다. - method: Apps Script에서 사람이 실행하는 함수만 public으로 두고 내부 함수는 prefix/namespace 규칙으로 숨긴다. arity validator에 public API contract를 - 연결한다. - files_to_touch: - - spec/generated/gas_adapter_contract.schema.json - - tools/validate_gas_call_arity.py - - gas_*.gs - commands: - - npm run validate-gas-call-arity - expected_evidence: - arity_mismatch_count: 0 - unexpected_public_function_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_gas_thin_adapter_v2.py == PASS with forbidden count 0 - - python tools/validate_behavioral_coverage_v1.py --strict == PASS - anti_patterns_to_reject: - - GAS에서 임계값을 새로 하드코딩 - - Python과 GAS 둘 다 같은 공식을 독립 구현 - - GAS output을 golden expected로 역복사 -- phase_id: PHASE_04 - name: Formula lifecycle and factor taxonomy control - objective: 292개 공식이 계속 늘어나도 충돌·중복·과최적화를 막는다. - ordered_tasks: - - id: P04_T01_FORMULA_LIFECYCLE_LEDGER - priority: P0 - owner: architect - action: 모든 formula_id를 lifecycle 상태로 관리한다. - method: ACTIVE, SHADOW, EXPERIMENTAL, DEPRECATED, RETIRED 상태를 spec/51_formula_lifecycle_registry.yaml에 등록한다. 같은 목적 공식이 - 2개 이상이면 owner가 하나만 ACTIVE로 지정한다. - files_to_touch: - - spec/51_formula_lifecycle_registry.yaml - - spec/formula_lifecycle_index.yaml - - tools/validate_formula_version_lifecycle_v1.py - commands: - - python tools/validate_formula_version_lifecycle_v1.py - expected_evidence: - active_per_formula_family: 1 - deprecated_runtime_read_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P04_T02_OWNER_AND_OUTPUT_FIELD_LOCK - priority: P0 - owner: architect - action: 공식과 출력필드 owner 충돌을 0으로 만든다. - method: output_field_owner_ledger.yaml에 final_action, stop_loss, tp1_price, risk_score 등 핵심 출력 필드의 단일 owner를 등록한다. - files_to_touch: - - spec/03_formulas/output_field_owner_ledger.yaml - - tools/validate_output_field_owner_collision_v1.py - commands: - - python tools/validate_output_field_owner_collision_v1.py - - python tools/validate_formula_owner_coverage_v1.py - expected_evidence: - owner_coverage_pct: 100.0 - field_owner_collision_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P04_T03_FACTOR_TAXONOMY_ENFORCE - priority: P1 - owner: architect - action: 팩터 분류 체계를 먼저 통과해야 새 공식을 추가한다. - method: 새 팩터는 Momentum, Quality, Value, Growth, Flow, Risk, Event, Execution, Portfolio, DataQuality 중 하나에 귀속한다. 팩터 목적, - horizon, lookback, calibration source, decay rule을 필수로 요구한다. - files_to_touch: - - spec/43_quant_factor_taxonomy.yaml - - spec/factor_lifecycle_registry.yaml - - tools/validate_factor_taxonomy_v1.py - commands: - - python tools/validate_factor_taxonomy_v1.py - - python tools/validate_factor_lifecycle_completeness_v2.py - expected_evidence: - unknown_factor_count: 0 - missing_horizon_count: 0 - missing_calibration_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P04_T04_NO_DUPLICATE_FORMULA_INTENT - priority: P1 - owner: architect - action: 같은 의미의 공식 중복을 금지한다. - method: formula_id 이름만 다른 유사 공식은 semantic_intent_hash로 비교한다. 중복이면 병합 또는 DEPRECATED로 내린다. - files_to_touch: - - tools/validate_metric_alias_collision_v1.py - - spec/aliases.yaml - commands: - - python tools/validate_metric_alias_collision_v1.py - expected_evidence: - metric_alias_collision_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_formula_runtime_registry_v1.py --json Temp/formula_runtime_registry_v1.json --target-coverage 100 - - python tools/validate_factor_contract_v1.py - anti_patterns_to_reject: - - 정확도 개선 명목으로 유사 점수 공식을 계속 추가 - - 공식은 있는데 owner/golden/schema가 없음 - - v1/v2/v3가 동시에 ACTIVE -- phase_id: PHASE_05 - name: Golden cases, property invariants, and deterministic harness - objective: 저성능 LLM도 같은 결론을 내도록 계산을 하네스화한다. - ordered_tasks: - - id: P05_T01_GOLDEN_CASE_MINIMUM - priority: P0 - owner: architect - action: 모든 ACTIVE 공식에 최소 3개 golden case를 요구한다. - method: 정상, 경계값, 결측/비정상 입력 3종 케이스를 spec/formula_golden_cases_v4.yaml에 둔다. expected는 손계산 또는 독립 산식으로 작성하고 구현 결과를 역복사하지 않는다. - files_to_touch: - - spec/formula_golden_cases_v4.yaml - - tools/run_formula_golden_cases_v2.py - commands: - - python tools/run_formula_golden_cases_v2.py - expected_evidence: - active_formula_golden_case_coverage_pct: 100.0 - python_fail: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P05_T02_PROPERTY_INVARIANTS - priority: P0 - owner: architect - action: 투자 엔진 불변식을 property test로 잠근다. - method: cash_ratio는 0~100, position_size는 cash/heat/risk cap을 초과하지 않음, stop_loss는 tick_normalizer 적용, sell 수량은 보유수량 이하, - D+2 현금은 즉시현금 방어선 충족으로 간주 같은 invariant를 명시한다. - files_to_touch: - - spec/property_invariants.yaml - - tests/test_property_invariants.py - commands: - - python tools/validate_property_invariants_v1.py - expected_evidence: - property_violation_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P05_T03_DETERMINISM_TEST - priority: P0 - owner: architect - action: 동일 입력은 항상 동일 출력이어야 한다. - method: GatherTradingData.json을 3회 실행해 final_decision_packet_active checksum이 동일한지 검사한다. generated_at 같은 메타 필드는 checksum - 제외. - files_to_touch: - - tools/validate_determinism.py - - Temp/final_decision_packet_active.json - commands: - - python tools/validate_determinism.py - expected_evidence: - determinism_gate: PASS - checksum_mismatch_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P05_T04_BEHAVIORAL_COVERAGE_STRICT - priority: P0 - owner: architect - action: YAML-Python-GAS 3-way 동등성을 release gate에 넣는다. - method: BCH-V1 runbook 기준으로 golden == Python == GAS를 확인한다. - files_to_touch: - - spec/26_behavioral_coverage_contract.yaml - - tools/validate_behavioral_coverage_v1.py - commands: - - python tools/validate_behavioral_coverage_v1.py --strict - expected_evidence: - behavioral_coverage_pct: 100.0 - implementation_divergence_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_golden_coverage_100.py - - python tools/validate_behavioral_coverage_v1.py --strict - - python tools/validate_determinism.py - anti_patterns_to_reject: - - coverage 수치만 맞추고 케이스 품질을 낮춤 - - 실패 케이스 삭제로 통과 - - 허용오차를 과도하게 넓힘 -- phase_id: PHASE_06 - name: Data contract, provenance, and hallucination firewall - objective: 데이터정합성과 홀루시네이션을 구조적으로 차단한다. - ordered_tasks: - - id: P06_T01_FIELD_DICTIONARY_LOCK - priority: P0 - owner: architect - action: 모든 원천 필드를 field dictionary와 workbook mapping에 매핑한다. - method: GatherTradingData.json의 모든 사용 필드는 spec/12_field_dictionary.yaml 및 spec/14_raw_workbook_mapping.yaml에 존재해야 한다. - files_to_touch: - - spec/12_field_dictionary.yaml - - spec/14_raw_workbook_mapping.yaml - - tools/validate_field_dictionary.py - commands: - - python tools/validate_field_dictionary.py - - python tools/validate_data_sample.py - expected_evidence: - unmapped_field_count: 0 - schema_presence_score: 100.0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P06_T02_NUMBER_PROVENANCE_STRICT - priority: P0 - owner: architect - action: 보고서 숫자 provenance 100%를 release 불변식으로 둔다. - method: operational_report.json/md의 모든 숫자는 number_provenance_ledger_v4에 출처가 있어야 한다. 출처 없는 숫자는 DATA_MISSING 또는 미표시. - files_to_touch: - - Temp/number_provenance_ledger_v4.json - - tools/validate_number_provenance_strict_v3.py - commands: - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.json - expected_evidence: - number_provenance_coverage_pct: 100 - unproven_report_number_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P06_T03_DATA_MISSING_GRAMMAR - priority: P0 - owner: architect - action: 결측 표현을 표준화한다. - method: 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요 외 문구를 금지한다. LLM이 대체 수치를 추정하지 못하게 low_capability_response_contract에 grammar를 - 둔다. - files_to_touch: - - schemas/low_capability_response_contract_v4.schema.json - - prompts/low_capability_report_renderer.md - commands: - - python tools/validate_llm_response_contract_v4.py - expected_evidence: - ungrounded_number_count: 0 - missing_value_phrase_violation_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P06_T04_LIVE_REPLAY_SEPARATION - priority: P0 - owner: architect - action: live 성과와 replay/backtest를 절대 혼합하지 않는다. - method: replay 표본으로 만든 hit rate, design score, calibration score는 live 운영성과로 표기하지 않는다. report renderer에 source_kind를 표시한다. - files_to_touch: - - spec/44_live_replay_separation.yaml - - tools/validate_no_replay_live_mix_v2.py - commands: - - python tools/validate_no_replay_live_mix_v2.py - expected_evidence: - live_replay_mix_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_data_quality_expectations.py - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.json - - python tools/validate_no_replay_live_mix_v2.py - anti_patterns_to_reject: - - 외부 뉴스나 감으로 숫자 보정 - - 빈칸을 0으로 처리해 통과 - - 백테스트 점수를 실전 수익률처럼 표현 -- phase_id: PHASE_07 - name: Prediction and outcome feedback loop - objective: 설계 커버리지 100%와 실제 예측력 개선을 분리해 관리한다. - ordered_tasks: - - id: P07_T01_OUTCOME_LABEL_SPEC - priority: P0 - owner: architect - action: T+1/T+5/T+20 outcome label을 명확히 정의한다. - method: 추천 당시 entry, stop, tp, final_action 대비 실제 수익률/최대불리/최대유리/슬리피지를 label로 만든다. - files_to_touch: - - spec/17_performance_contract.yaml - - spec/29_backtest_harness_contract.yaml - - tools/build_outcome_labels_v1.py - commands: - - python tools/build_outcome_labels_v1.py --input GatherTradingData.json --out Temp/outcome_labels_v1.json - expected_evidence: - label_coverage_pct: '>= 95' - lookahead_leak_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P07_T02_ALPHA_FEEDBACK_DECILE - priority: P1 - owner: architect - action: prediction_match_rate 54.76을 decile별로 분해한다. - method: 전체 평균 하나로 보지 말고 market_regime, sector, horizon, action_type, liquidity_bucket, entry_timing_decile별 hit/expectancy를 - 산출한다. - files_to_touch: - - tools/build_alpha_feedback_loop_v2.py - - Temp/alpha_feedback_loop_v2.json - commands: - - npm run daily-feedback-report - expected_evidence: - decile_table_present: true - miss5_count_present: true - expectancy_by_bucket_present: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P07_T03_PROMOTION_DEMOTION_RULE - priority: P1 - owner: architect - action: 팩터 승격/강등 규칙을 성과 기반으로 만든다. - method: 팩터가 30표본 미만이면 EXPERT_PRIOR/PROVISIONAL, 30표본 이상이면 hit_rate, expectancy, drawdown, turnover cost를 보고 ACTIVE/SHADOW/RETIRED - 결정한다. - files_to_touch: - - spec/factor_lifecycle_registry.yaml - - spec/calibration_registry.yaml - - tools/validate_calibration_registry_v1.py - commands: - - python tools/validate_calibration_registry_v1.py - expected_evidence: - overclaimed_count: 0 - unregistered_threshold_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P07_T04_VALUE_DAMAGE_CONTROL - priority: P1 - owner: architect - action: 수익을 지키는 엔진인지 별도 측정한다. - method: 매도/익절/손절 이후 n일 가격경로를 추적하여 value_damage_pct_avg, giveback_saved_pct, premature_exit_rate를 산출한다. - files_to_touch: - - spec/profit_preservation_contract.yaml - - tools/build_value_preservation_audit_v1.py - commands: - - python tools/build_value_preservation_audit_v1.py --out Temp/value_preservation_audit_v1.json - expected_evidence: - value_damage_pct_avg: <= target - premature_exit_rate: tracked - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_outcome_eval_window.py - - python tools/validate_pass_100_honest_v2.py - anti_patterns_to_reject: - - prediction_match_rate를 설계 점수로 대체 - - 표본 30개 미만을 calibrated로 표시 - - 실패한 추천을 데이터에서 제외 -- phase_id: PHASE_08 - name: Portfolio and trade decision engine hardening - objective: 목표금액 5억, 주간 리밸런싱, 현금방어선, 매수/매도 뒷북 방지를 공식화한다. - ordered_tasks: - - id: P08_T01_GOAL_RISK_BUDGET - priority: P0 - owner: architect - action: 목표금액 5억 기반 risk budget cascade를 고정한다. - method: 총자산, 현금, D+2 현금, 섹터 집중도, 단일종목 한도, 위성비중, drawdown 상태별 position cap을 산출한다. - files_to_touch: - - spec/36_goal_risk_budget_harness.yaml - - spec/risk/aggregate_risk.yaml - - spec/risk/portfolio_exposure.yaml - commands: - - python tools/validate_goal_risk_budget_harness_v1.py - expected_evidence: - cash_floor_rule: D+2 cash counts as immediate defense - risk_budget_violation_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P08_T02_WEEKLY_CADENCE_LOCK - priority: P0 - owner: architect - action: 주간 단위 제안과 토/일 리밸런싱을 운영 cadence로 고정한다. - method: 매주 토/일은 rebalance_required=true, 매월 1/11/21은 mid_check_required=true를 final_context에 넣는다. - files_to_touch: - - spec/operating_cadence.yaml - - tools/build_low_capability_context_pack_v5.py - commands: - - python tools/validate_operating_cadence_v1.py - expected_evidence: - weekend_rebalance_flag: true - monthly_midcheck_dates: - - 1 - - 11 - - 21 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P08_T03_ANTI_LATE_ENTRY_GATE - priority: P0 - owner: architect - action: 뒷북 매수와 설거지를 막는 anti late entry gate를 최종 주문 전 필수화한다. - method: 급등 후 추격, 거래대금 고점, 분산매도, RS 둔화, 외국인/기관 순매도, 뉴스 과열을 entry_block 또는 staged_entry로 라우팅한다. - files_to_touch: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - tools/validate_anti_late_entry_harness_v1.py - commands: - - python tools/validate_anti_late_entry_harness_v1.py - expected_evidence: - late_entry_block_false_negative_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P08_T04_SELL_WATERFALL_VALUE_PRESERVATION - priority: P0 - owner: architect - action: 차익실현과 손절은 sell waterfall로 일관화한다. - method: sell candidate가 2개 이상이면 sell priority table을 먼저 만들고, stop_loss, take_profit, trailing_stop, cash_raise, rebalance_trim을 - priority score로 정렬한다. - files_to_touch: - - spec/exit/value_preserving_cash_raise_optimizer_v7.yaml - - spec/exit/take_profit.yaml - - spec/exit/stop_loss.yaml - commands: - - python tools/validate_execution_precedence_lock_v2.py - - python tools/validate_order_grammar_v1.py - expected_evidence: - sell_priority_table_required: true - multi_condition_order_violation_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P08_T05_IPO_AND_MARKET_CORRELATION_EVENT_RISK - priority: P1 - owner: architect - action: 대형 IPO와 국내시장 상관 이벤트를 선제 차익실현 게이트로 연결한다. - method: IPO 일정, 수급 흡수, 동종 섹터 밸류에이션 압박, 지수 편입/자금 이동 가능성을 macro_event_ticker_impact와 cash_raise route에 연결한다. 미확인 데이터는 참고용이고 - 최종 판단은 하네스만 사용한다. - files_to_touch: - - spec/strategy/macro_event_synchronizer_v2.yaml - - spec/strategy/pre_distribution_early_warning_v4.yaml - commands: - - python tools/validate_predictive_alpha_dialectic_v2.py - expected_evidence: - event_risk_route_present: true - proactive_exit_candidate_generated: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_strategy_tests_contract.py - - python tools/validate_order_grammar_v1.py - - python tools/validate_execution_precedence_lock_v2.py - anti_patterns_to_reject: - - 매수 불가인데도 억지 매수 추천 - - 손절/익절 가격·수량 누락 - - 상승 서사로 stop을 완화 -- phase_id: PHASE_09 - name: Low-capability LLM serving pack - objective: 저성능 LLM도 TODO만 따라 최고 성능 모델과 같은 결론을 렌더링하게 한다. - ordered_tasks: - - id: P09_T01_FINAL_CONTEXT_PACK_V5 - priority: P0 - owner: architect - action: LLM 입력을 final packet copy-only pack으로 축소한다. - method: final_decision_packet_active, number_provenance_ledger, order_blueprint, blocked reasons, sell priority, cash - shortfall만 포함한 Temp/final_context_for_llm_v5.yaml 생성. 원천 대용량 JSON 직접 제공 금지. - files_to_touch: - - tools/build_low_capability_context_pack_v5.py - - Temp/final_context_for_llm_v5.yaml - - spec/46_low_capability_execution_pack.yaml - commands: - - python tools/build_low_capability_context_pack_v5.py --manifest runtime/active_artifact_manifest.yaml --out Temp/final_context_for_llm_v5.yaml - expected_evidence: - context_contains_only_allowed_aliases: true - raw_workbook_rows_in_context: false - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P09_T02_RENDERER_SCRIPTED_SECTIONS - priority: P0 - owner: architect - action: LLM 보고서 섹션 순서와 문장을 템플릿화한다. - method: portfolio health -> blockers -> cash defense -> sell table -> buy/hold table -> risk -> study 순서로 쓰게 한다. 숫자·가격·수량은 - context key를 그대로 복사한다. - files_to_touch: - - prompts/low_capability_report_renderer.md - - schemas/low_capability_response_contract_v4.schema.json - commands: - - python tools/validate_renderer_section_order_v1.py - - python tools/validate_llm_response_contract_v4.py - expected_evidence: - section_order_violation_count: 0 - llm_freedom_pct: 0.0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P09_T03_NO_RECOMPUTE_MARKERS - priority: P0 - owner: architect - action: 모든 숫자 옆에 provenance key를 붙인다. - method: 보고서에 숫자가 나오면 [source:packet.path] 또는 [DATA_MISSING]을 붙인다. 출처 없는 숫자 발견 시 실패. - files_to_touch: - - tools/validate_report_numeric_consistency_guard_v2.py - - tools/validate_number_provenance_strict_v3.py - commands: - - python tools/validate_report_numeric_consistency_guard_v2.py - expected_evidence: - ungrounded_number_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P09_T04_LOW_CAPABILITY_RUNBOOK - priority: P1 - owner: architect - action: 저성능 LLM 실행 절차를 20단계 이하로 압축한다. - method: 읽을 파일은 AGENTS.md -> final_context_for_llm_v5.yaml -> renderer prompt 3개로 제한한다. 나머지는 reference only. - files_to_touch: - - spec/31_low_capability_llm_response_contract.yaml - - spec/46_low_capability_execution_pack.yaml - commands: - - python tools/validate_low_capability_pack_v1.py - expected_evidence: - required_read_files_count: <= 3 - response_contract_gate: PASS - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_low_capability_pack_v1.py - - python tools/validate_llm_response_contract_v4.py - anti_patterns_to_reject: - - LLM에게 GatherTradingData 전체를 주고 해석하게 함 - - 보고서에서 하네스 결론을 문장으로 완화 - - DATA_MISSING을 추정치로 대체 -- phase_id: PHASE_10 - name: Release train, rollback, and CI gate - objective: 운영자가 매주 같은 절차로 안전하게 릴리즈하도록 만든다. - ordered_tasks: - - id: P10_T01_RELEASE_DAG_SINGLE_ENTRY - priority: P0 - owner: architect - action: 릴리즈 진입점을 npm run full-gate 하나로 통일한다. - method: 개별 validator는 DAG 노드로만 호출하고 운영자는 full-gate만 실행한다. DAG step은 idempotent해야 한다. - files_to_touch: - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - - package.json - commands: - - npm run full-gate - expected_evidence: - release_mode: release - failed_checks_count: 0 - exit_code: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P10_T02_NO_SKIPPED_IN_RELEASE - priority: P0 - owner: architect - action: release mode에서 SKIPPED를 금지한다. - method: optional 단계는 release에서 optional로 남기지 말고 shadow/quick/package-only에만 허용한다. - files_to_touch: - - spec/22_pipeline_runtime_contract.yaml - - tools/validate_release_gate_sequence_v1.py - commands: - - python tools/validate_release_gate_sequence_v1.py - expected_evidence: - skipped_release_step_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P10_T03_ROLLBACK_MANIFEST - priority: P1 - owner: architect - action: 릴리즈 실패 시 rollback manifest로 되돌린다. - method: runtime/rollback_manifest_v3.yaml에 이전 active artifact, schema, package hash, release DAG hash를 저장한다. - files_to_touch: - - runtime/rollback_manifest_v3.yaml - - tools/build_rollback_manifest_v3.py - commands: - - python tools/build_rollback_manifest_v3.py --out runtime/rollback_manifest_v3.yaml - expected_evidence: - rollback_hash_present: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P10_T04_ENGINE_HEALTH_CARD - priority: P1 - owner: architect - action: 릴리즈 후 건강카드를 생성한다. - method: architecture, data, formula, gas, prediction, report, package, entropy 점수를 하나의 engine_health_card_v2.json으로 만든다. - files_to_touch: - - schemas/engine_health_card.schema.json - - tools/build_engine_health_card_v2.py - commands: - - python tools/build_engine_health_card_v2.py --out Temp/engine_health_card_v2.json - - python tools/validate_engine_health_card_v1.py - expected_evidence: - overall_gate: PASS_OR_WARN - critical_fail_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - npm run full-gate - - python tools/validate_release_dag_v2.py - - python tools/validate_artifact_chain_hash_v4.py - anti_patterns_to_reject: - - 검증 실패 후 zip만 생성 - - 수동 파일 복사로 active alias 변경 - - release와 package-only evidence 혼용 -- phase_id: PHASE_11 - name: Implementation sequence for one new factor - objective: 새 퀀트 팩터를 추가할 때 따라야 하는 절차를 표준화한다. - ordered_tasks: - - id: P11_T01_NEW_FACTOR_CR - priority: P1 - owner: architect - action: 새 팩터 제안서를 먼저 만든다. - method: 투자 가설, 시장 국면, 수익 원천, 손실 리스크, horizon, 필요 데이터, calibration 상태, 폐기 조건을 CR에 쓴다. - files_to_touch: - - governance/change_requests/CR-YYYYMMDD-new-factor.yaml - commands: [] - expected_evidence: - hypothesis_present: true - kill_rule_present: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P11_T02_CONTRACT_FIRST - priority: P1 - owner: architect - action: YAML 계약과 schema를 구현보다 먼저 작성한다. - method: formula_id, inputs, outputs, expression, thresholds, owner, provenance, missing_policy를 spec에 쓴다. - files_to_touch: - - spec/13_formula_registry.yaml - - schemas/generated/.schema.json - - spec/03_formulas/output_field_owner_ledger.yaml - commands: - - python tools/validate_formula_contract_completeness_v1.py - expected_evidence: - contract_complete: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P11_T03_GOLDEN_AND_PROPERTY_FIRST - priority: P1 - owner: architect - action: golden case와 invariant를 먼저 만든다. - method: 구현 전 expected를 손계산한다. 경계값과 결측값 케이스를 반드시 포함한다. - files_to_touch: - - spec/formula_golden_cases_v4.yaml - - spec/property_invariants.yaml - commands: - - python tools/validate_golden_coverage_100.py - expected_evidence: - golden_case_count_min: 3 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P11_T04_PYTHON_CANONICAL_IMPLEMENT - priority: P1 - owner: architect - action: Python canonical 구현만 먼저 한다. - method: src/quant_engine에 순수 함수로 구현하고, side effect 없이 dict input -> dict output만 허용한다. - files_to_touch: - - src/quant_engine/core/formulas/.py - - runtime/python/core/formulas/generated/.py - commands: - - python tools/run_formula_golden_cases_v2.py - expected_evidence: - python_fail: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P11_T05_GAS_ADAPTER_WIRE - priority: P1 - owner: architect - action: 필요 시 GAS는 결과 수신/표시만 연결한다. - method: GAS에는 산식을 쓰지 말고 Python 산출 JSON key를 시트에 쓰는 adapter만 작성한다. - files_to_touch: - - gas_harness_rows.gs - - spec/39_gas_thin_adapter_policy.yaml - commands: - - python tools/validate_gas_thin_adapter_v2.py - expected_evidence: - forbidden_logic_new_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P11_T06_SHADOW_BEFORE_ACTIVE - priority: P1 - owner: architect - action: 최소 2주 또는 30표본까지 SHADOW로 운용한다. - method: 실전 주문에 사용하지 않고 outcome label만 축적한다. 성과·안정성·데이터품질 기준 충족 시 ACTIVE 승격한다. - files_to_touch: - - spec/factor_lifecycle_registry.yaml - - Temp/alpha_feedback_loop_v2.json - commands: - - python tools/validate_factor_promotion_gates_v1.py - expected_evidence: - promotion_allowed: only if gates pass - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_factor_promotion_gates_v1.py - - npm run full-gate - anti_patterns_to_reject: - - 아이디어가 좋다는 이유로 바로 ACTIVE - - GAS에 빠르게 구현 후 나중에 Python 맞춤 - - 표본 없는 임계값을 calibrated로 선언 -- phase_id: PHASE_12 - name: Quant research discipline - objective: 이론·방법론·데이터수집을 과유불급 없이 장기 관리한다. - ordered_tasks: - - id: P12_T01_RESEARCH_NOTE_LIMIT - priority: P2 - owner: architect - action: 리서치 노트는 1장, 공식은 spec으로 분리한다. - method: 투자 아이디어 설명은 docs/research/YYYYMMDD-title.md 1개로 제한하고, 실제 실행 규칙은 spec에만 둔다. - files_to_touch: - - docs/research/ - - spec/43_quant_factor_taxonomy.yaml - commands: - - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_audit_v1.json - expected_evidence: - markdown_rule_duplication_count: 0 - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P12_T02_DATA_COLLECTION_SLO - priority: P1 - owner: architect - action: 데이터수집 품질 SLO를 둔다. - method: 가격, 거래대금, 외국인/기관, 재무, 이벤트, ETF/지수, 환율/금리/VIX 각각 freshness, missing_rate, source_priority를 정의한다. - files_to_touch: - - spec/02_data_contract.yaml - - spec/data_quality/expectations.yaml - - tools/validate_data_quality_expectations.py - commands: - - python tools/validate_data_quality_expectations.py - expected_evidence: - freshness_violation_count: 0 - critical_missing_rate: within threshold - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P12_T03_REGIME_AWARE_BACKTEST - priority: P2 - owner: architect - action: 시장국면별 성과를 따로 본다. - method: 상승/하락/횡보, 고변동/저변동, 반도체 주도/비주도, 유동성 확대/축소 국면별 factor expectancy를 산출한다. - files_to_touch: - - spec/11_market_regime.yaml - - tools/build_regime_factor_backtest_v1.py - commands: - - python tools/build_regime_factor_backtest_v1.py --out Temp/regime_factor_backtest_v1.json - expected_evidence: - regime_bucket_count: '>= 4' - expectancy_by_regime_present: true - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - - id: P12_T04_COMPLEXITY_BUDGET - priority: P2 - owner: architect - action: 성능이 입증되지 않은 복잡도 추가를 막는다. - method: 새 팩터/새 문서/새 validator는 expected benefit, owner, retirement date, entropy cost를 기록한다. - files_to_touch: - - spec/release/repository_entropy_budget.yaml - - tools/validate_repository_entropy_budget_v2.py - commands: - - python tools/validate_repository_entropy_budget_v2.py - expected_evidence: - entropy_budget_gate: PASS - if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - completion_gates: - - python tools/validate_repository_entropy_budget_v2.py - - python tools/validate_data_quality_expectations.py - anti_patterns_to_reject: - - 팩터를 많이 넣으면 좋아진다는 착각 - - 문서로 통제하려다 문서가 규칙을 대체 - - 국면 구분 없이 평균 성과만 사용 -execution_schedule: - day_0_immediate: - - PHASE_00 전체 실행 - - PHASE_01_T01~T02 실행으로 architecture boundary FAIL 해소 - - PHASE_02_T01 실행으로 package script budget FAIL 해소 - week_1: - - GAS business logic 98건 ledger 작성 - - score/price/qty/decision 로직 중 상위 위험 20건 Python 이전 - - module IO coverage와 artifact chain validator release DAG 편입 - week_2: - - ACTIVE 공식 golden case 3종 이상 보강 - - property invariants release gate 편입 - - low capability context pack v5 생성 - week_3: - - prediction/outcome label 구축 - - 팩터 decile feedback dashboard 생성 - - GAS thin adapter forbidden count 0 또는 approved adapter allowlist 달성 - week_4: - - repository entropy budget v2 PASS - - new factor lifecycle process를 CR 템플릿에 반영 - - npm run full-gate 단일 릴리즈 루틴 확정 -low_capability_llm_operator_script: - purpose: 저성능 LLM 또는 주니어 운영자가 그대로 따라 할 실행 절차 - rules: - - 절대 숫자를 계산하지 않는다. - - 절대 가격·수량·TP·SL을 새로 만들지 않는다. - - FAIL을 PASS로 바꾸지 않는다. - - DATA_MISSING은 추정하지 않는다. - - package-only SKIPPED는 release PASS가 아니다. - read_order: - - AGENTS.md - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - Temp/final_context_for_llm_v5.yaml if present - - prompts/low_capability_report_renderer.md - run_order: - - step: 1 - command: python tools/validate_specs.py - pass_text: VALIDATION OK - - step: 2 - command: python tools/validate_active_manifest.py - pass_text: PASS - - step: 3 - command: python tools/build_module_io_coverage_v1.py --registry spec/48_module_io_contract_registry.yaml --out Temp/module_io_coverage_v1.json - pass_text: artifact generated - - step: 4 - command: python tools/validate_architecture_boundaries_v2.py - pass_text: gate PASS - - step: 5 - command: python tools/validate_package_script_budget_v1.py - pass_text: gate PASS - - step: 6 - command: python tools/validate_gas_thin_adapter_v2.py - pass_text: forbidden_gas_business_logic_count 0 - - step: 7 - command: python tools/validate_formula_runtime_registry_v1.py --json Temp/formula_runtime_registry_v1.json --target-coverage - 100 - pass_text: coverage 100 - - step: 8 - command: python tools/validate_behavioral_coverage_v1.py --strict - pass_text: behavioral_coverage_pct 100 and divergence 0 - - step: 9 - command: python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report - Temp/operational_report.json - pass_text: coverage 100 - - step: 10 - command: npm run full-gate - pass_text: exit_code 0 and failed_checks_count 0 - if_any_step_fails: - - 실패한 step id, command, error text, touched files를 change_request에 기록한다. - - 해당 phase의 if_fail 지시만 따른다. - - skip, warn downgrade, expected value 역복사, 임계값 완화로 해결하지 않는다. - - 수정 후 실패한 step부터 다시 실행하고 마지막에는 npm run full-gate를 실행한다. -pm_control_board: - weekly_review_questions: - - 이번 주 ACTIVE 공식이 늘었는가? 늘었다면 owner/golden/schema/provenance가 모두 있는가? - - GAS forbidden business logic count가 줄었는가? - - package script count가 12 이하인가? - - architecture boundary가 PASS인가? - - prediction match rate와 expectancy가 개선됐는가, 아니면 설계 점수만 좋아졌는가? - - 보고서 숫자 provenance 100%가 유지됐는가? - - D+2 현금 방어선과 cash shortfall 판단이 final packet에 반영됐는가? - - 토/일 리밸런싱 또는 1/11/21 중간점검 플래그가 cadence에 맞게 작동했는가? - stop_the_line_conditions: - - architecture boundary FAIL - - number provenance coverage < 100 - - release mode skipped step > 0 - - unmapped formula count > 0 - - implementation divergence > 0 - - unregistered threshold count > 0 - - report/harness numeric mismatch > 0 - - GAS에 신규 price/qty/score 계산 추가 -implementation_recipes: - python_canonical_function_template: - signature: 'def compute_(inputs: Mapping[str, Any]) -> dict[str, Any]' - requirements: - - no global mutable state - - no network call - - no current time except passed as input - - all thresholds imported from parsed spec/calibration registry - - return includes formula_id, outputs, provenance, missing_fields, gate - unit_test_minimum: - - normal case - - boundary case - - missing data case - yaml_formula_contract_template: - required_fields: - - formula_id - - owner - - status - - purpose - - inputs - - outputs - - expression - - thresholds - - missing_policy - - provenance_policy - - golden_cases_ref - - schema_ref - - lifecycle_state - forbidden_fields: - - unowned_threshold - - free_text_formula_without_expression - - calibrated_without_sample_n - gas_adapter_template: - allowed: - - read sheet range - - write sheet range - - serialize json - - deserialize json - - checksum - - invoke refresh - - display previously computed field - forbidden: - - score calculation - - position sizing - - stop/take profit calculation - - final action routing - - threshold decision - - portfolio risk calculation - renderer_template: - allowed: - - copy packet values - - format table - - show DATA_MISSING - - show provenance - - explain existing gate reason - forbidden: - - recalculate - - average - - rank - - invent target price - - soften blocked decision - - hide shadow ledger -final_success_metrics: - structural: - architecture_boundary_gate: PASS - package_script_count: <= 12 - gas_forbidden_business_logic_count: 0 - repository_file_count: <= 2000 - markdown_rule_duplication_count: 0 - deterministic_quality: - runtime_adjusted_coverage_pct: 100.0 - behavioral_coverage_pct: 100.0 - implementation_divergence_count: 0 - number_provenance_coverage_pct: 100.0 - llm_freedom_pct: 0.0 - investment_quality: - prediction_match_rate_pct: track and improve from observed 54.76 without overfitting - expectancy_by_horizon: positive after costs for promoted ACTIVE factors - value_damage_pct_avg: below contract threshold - cash_floor_violation_count: 0 - late_entry_false_negative_count: 0 diff --git a/suggest/quant_engine_refactor_qedd_todo_v1.yaml b/suggest/quant_engine_refactor_qedd_todo_v1.yaml deleted file mode 100644 index e3f49a5..0000000 --- a/suggest/quant_engine_refactor_qedd_todo_v1.yaml +++ /dev/null @@ -1,1297 +0,0 @@ -meta: - schema_version: quant_engine_refactor_todo.v1 - formula_id: QEDD_REFACTOR_TODO_V1 - title: 퀀트투자 엔진 구조적 리팩토링 실행계획 - generated_at_kst: '2026-06-07T18:24:13+09:00' - target_engine: 은퇴자산포트폴리오 / 자산 투자 포트폴리오 - role_assumption: 30년 퀀트투자자 + 개발자 + 아키텍트 + PM 관점 - user_goal: 목표금액 5억, 주간 제안 기본, 토/일 리밸런싱, 매월 1/11/21 중간점검 - source_zip_sha256: c05591f833698d8beb24934031cdbc0d576a6c9617c7566dba001d0f741a2f17 - source_basis: - - AGENTS.md - - governance/rules/*.yaml - - spec/*.yaml - - runtime/active_artifact_manifest.yaml - - runtime/refactor_baseline_v1.yaml - - Temp/engine_harness_gate_result.json - - Temp/strategy_hardening_harness_v2.json - - Temp/formula_runtime_registry_v1.json - - Temp/pipeline_runtime_profile_v1.json - - spec/41_release_dag.yaml - - spec/48_module_io_contract_registry.yaml - source_file_policy: - allowed_human_edited_source_extensions: - - .md - - .yaml - - .py - - .gs - generated_or_runtime_extensions_allowed: - - .json - - .jsonl - - .schema.json - principle: 사람이 고치는 권위 파일은 md/yaml/py/gs로 제한하고, json은 산출물·스키마·패킷으로만 취급한다. -executive_decision: - recommended_methodology: 'QEDD: Quant Evidence-Driven Deterministic Development' - one_sentence: 새 알고리즘은 YAML 계약과 증거 하네스가 먼저 통과한 뒤 Python canonical로 구현하고, GAS는 얇은 - 어댑터, LLM은 복사 렌더러로만 사용한다. - decision: 현재 구조는 방향은 맞지만 운영성공 엔진으로 보기에는 성과검증·릴리즈 게이트·아키텍처 경계가 아직 미완성이다. 기능 추가보다 - 경계·검증·문서 다이어트가 우선이다. - priority_order: - - P0 릴리즈 게이트를 SKIPPED에서 OK로 되돌린다. - - P1 active/canonical artifact alias 버전 드리프트를 제거한다. - - P2 architecture boundary validator를 spec 목표와 일치시킨다. - - P3 low-capability LLM용 context pack v5를 실제 산출물로 고정한다. - - P4 신규 알파/전략은 live T+20 표본 30개 전에는 ACTIVE 금지한다. - - P5 GAS business logic을 Python canonical로 이전하고 GAS는 fetch/write adapter로 제한한다. -baseline_assessment: - repository_metrics_observed_from_zip: - observed_file_count_in_unzipped_package: 1438 - extension_counts_top: - py: 839 - json: 374 - yaml: 171 - md: 39 - gs: 8 - ps1: 4 - jsonl: 2 - js: 1 - runtime_refactor_baseline_total_file_count: 1906 - runtime_refactor_baseline_package_script_count: 22 - runtime_refactor_baseline_temp_json_count: 411 - entropy_budget: - schema_version: repository_entropy_budget.v1 - max_total_files: 2000 - max_package_scripts: 220 - max_temp_json_files: 500 - max_docs_lines: 120000 - release_budget_notes: - - archive stale Temp JSONs when safe - - keep package scripts within release envelope - current_pass_points: - active_manifest_report_match_pct: 100.0 - active_manifest_authority_collision_count: 0 - active_manifest_stale_artifact_count: 0 - engine_harness_status: OK - engine_harness_failed_checks_count: 0 - formula_runtime_coverage_pct: 100.0 - formula_unmapped_count: 0 - strategy_control_score: 92.73 - data_quality_conflict_flag: false - critical_gaps_to_fix_before_more_algorithm_expansion: - - gap_id: GAP-001-release-profile-skipped-validation - evidence: - Temp/pipeline_runtime_profile_v1.json.gate_status: SKIPPED - Temp/pipeline_runtime_profile_v1.json.runtime_context.skip_validate: true - elapsed_sec_total: 2.471 - risk: 릴리즈 모드라는 이름으로 zip만 만들면 저성능 LLM/운영자가 검증 통과로 오인한다. - fix: release 모드에서는 skip_validate=false를 강제하고, package-only만 SKIPPED 허용. - - gap_id: GAP-002-architecture-boundary-contract-drift - evidence: - spec/34_expected_renderer_calculation_count: 0 - spec/34_expected_reverse_dependency_count: 0 - observed_validate_architecture_boundaries_v2_stdout: renderer_calculation_count=288, - reverse_dependency_count=7, gate=PASS - risk: 검증기가 목표값과 다르게 PASS를 낼 수 있으면 아키텍처 하네스의 신뢰가 무너진다. - fix: validator를 spec/34의 contracts와 직접 비교하도록 고정하고 위반 시 FAIL. - - gap_id: GAP-003-active-canonical-version-drift - evidence: - active_manifest_manifest_rows_contains: smart_cash_recovery_v7 - artifacts/canonical_manifest.yaml_points_to: smart_cash_recovery_v9 - active_manifest_report_authority_diff_count: 0 - risk: 권위 alias가 여러 버전을 동시에 말하면 같은 숫자라도 출처 신뢰가 흔들린다. - fix: canonical resolver가 active_manifest를 재생성하고 deprecated 버전 runtime read를 차단. - - gap_id: GAP-004-low-capability-context-version-mismatch - evidence: - release_dag_expected_output: Temp/final_context_for_llm_v5.yaml - package_observed_context_file: Temp/final_context_for_llm_v4.yaml - risk: 저성능 LLM이 읽을 단일 packet이 없으면 다시 원본 여러 파일을 읽으며 환각과 판단 번복이 증가한다. - fix: v5 context pack을 생성·검증·패키징하고 v4는 deprecated 처리. - - gap_id: GAP-005-performance-readiness-not-active - evidence: - overall_hardening_score: 68.22 - truth_hardening_score: 68.22 - readiness_gate: WATCH_PENDING_SAMPLE - prediction_match_rate_pct: 45.68 - algorithm_guidance_proof: 56.4 - operational_t20_count: 0.0 - cash_recovery_value_damage_pct: 12.5 - readiness_reasons: - - DATA_INTEGRITY_LOCK_NOT_PASS_100 - - OPERATIONAL_T20_SAMPLE_LT_30 - - OPERATIONAL_T20_PASS_LT_60 - - EXPECTANCY_LE_0_1 - - WIN_RATE_LT_45 - - PREDICTION_MATCH_LT_60 - - VALUE_DAMAGE_GT_10 - risk: 통제 점수는 높지만 실전 성과 표본이 부족해 매수/매도 뒷북 문제를 아직 수치로 해소하지 못했다. - fix: 리플레이와 실전 표본을 분리하고 T+20 30건 이상, pass>=60%, expectancy>0.1% 전에는 active 승격 금지. - - gap_id: GAP-006-generated-file-sprawl - evidence: - python_files_count: 839 - yaml_files_count: 171 - json_files_count: 374 - generated_schema_model_dirs: - - schemas/generated - - src/quant_engine/models/generated - - runtime/python/core/formulas/generated - risk: 생성물이 권위 파일처럼 다뤄지면 파편화·상호충돌·리뷰비용 증가가 발생한다. - fix: generated는 build artifact로 선언하고 수동 편집 금지, 단일 generator와 parity validator로만 - 갱신. -target_architecture: - architecture_name: Contract-First Quant Engine with Deterministic Harness - one_way_flow: - - data - - feature - - risk - - alpha - - decision_fsm - - execution_blueprint - - report_renderer - - llm_copy_only - authority_stack_high_to_low: - - spec/00_execution_contract.yaml - - spec/risk/*.yaml 및 spec/03_risk_policy.yaml - - spec/13_formula_registry.yaml - - spec/48_module_io_contract_registry.yaml - - governance/rules/*.yaml - - src/quant_engine canonical Python - - gas_*.gs thin adapter - - Temp/*.json runtime outputs - - prompts/*.md copy-only renderers - module_boundaries: - data_ingestion: - allowed: - - 수집 - - 정규화 - - freshness - - schema validation - forbidden: - - 매수/매도 판단 - - 점수 가중치 변경 - feature_engine: - allowed: - - 등록 공식 계산 - - 결측 처리 - - provenance 기록 - forbidden: - - final_action 확정 - risk_manager: - allowed: - - cash floor - - total heat - - hard stop - - position cap - - D+2 현금 방어선 판정 - forbidden: - - 목표수익률 명분으로 risk 완화 - alpha_engine: - allowed: - - factor score - - regime adjustment - - lead/lag evidence - forbidden: - - live 표본 부족 상태에서 ACTIVE 승격 - decision_fsm: - allowed: - - BUY/HOLD/TRIM/SELL/WATCH final_action 결정 - forbidden: - - renderer/LLM에서 final_action 재판단 - execution_engine: - allowed: - - tick normalization - - single price per row - - order blueprint - forbidden: - - 다중 조건 주문문 - - stale TP 표기 - report_renderer: - allowed: - - packet 숫자 복사 - - provenance 표시 - - 차단사유 표시 - forbidden: - - 계산 - - 게이트 완화 서술 - - 가격/수량 창작 - llm_layer: - allowed: - - 요약 - - 교육노트 - - 하네스 출력의 사람이 읽는 설명 - forbidden: - - 하네스 verdict 번복 - - 숫자 생성 - - 미등록 공식 생성 - directory_policy: - AGENTS.md: 운영 인덱스만 유지. 장문 규칙 금지. - spec/: 계약·공식·게이트·출력 스키마의 원본 권위. - governance/: ADR, rule hash, change request, lifecycle. - src/quant_engine/: canonical implementation. 신규 로직은 여기서 시작. - tools/: CLI wrapper, validator, builder. 핵심 비즈니스 로직 축적 금지. - gas_*.gs: Google Sheets fetch/write/render adapter. 공식/판단 로직 신규 추가 금지. - Temp/: runtime output only. 직접 편집 금지. - dist/: packaged compact output only. - prompts/: copy-only renderer prompt. 계산 지시 금지. - tests/: unit/golden/property/parity/replay/llm_regression/e2e. -qedd_methodology: - principles: - - 'Contract before code: YAML 계약 없이 Python/GAS 구현 금지.' - - 'Harness before narrative: 하네스 수치가 보고서 문장보다 우선.' - - 'Python canonical first: 계산/판단은 Python에, GAS는 adapter에 둔다.' - - 'No LLM math: LLM은 가격·수량·TP·SL·점수를 계산하지 않는다.' - - 'Single source of truth: active manifest alias 하나만 runtime source가 된다.' - - 'Shadow before active: 새 알고리즘은 shadow ledger와 live/replay 분리 검증을 거친다.' - - 'Small files, hard gates: 긴 문서보다 짧은 계약, 자동 검증, golden case를 우선한다.' - - 'Evidence retirement: 성과 없는 규칙은 유지하지 않고 조건부 은퇴시킨다.' - algorithm_lifecycle: - states: - - PROPOSED - - SPEC_LOCKED - - SHADOW - - PAPER_ACTIVE - - LIMITED_ACTIVE - - ACTIVE - - RETIRED - transition_rules: - PROPOSED_to_SPEC_LOCKED: - - spec yaml 존재 - - owner 지정 - - input/output/provenance/결측정책 정의 - - golden case 최소 3개 - SPEC_LOCKED_to_SHADOW: - - Python implementation 존재 - - schema/model parity PASS - - unit/golden/property PASS - SHADOW_to_PAPER_ACTIVE: - - replay/live 분리 ledger 기록 - - 성능지표가 baseline 대비 개선 - - 위험/거래비용 고려 - PAPER_ACTIVE_to_LIMITED_ACTIVE: - - operational_t20_count >= 30 - - prediction_match_rate_pct >= 60 - - value_damage_pct <= 10 - LIMITED_ACTIVE_to_ACTIVE: - - expectancy_pct > 0.1 - - win_rate_pct >= 45 - - max_drawdown within risk budget - - 2회 연속 주간 리뷰 PASS - ANY_to_RETIRED: - - retirement_condition 충족 - - 더 단순한 규칙으로 대체 가능 - - data availability 저하 또는 성과 훼손 - mandatory_fields_per_algorithm: - - formula_id - - purpose - - inputs - - outputs - - units - - missing_policy - - provenance_required - - owner - - risk_limit - - shadow_metric - - activation_threshold - - retirement_condition - - golden_cases - - property_invariants - - live_replay_label - quant_research_standards: - minimum_tests: - - walk_forward split - - purged/embargoed time split when overlapping labels exist - - decile monotonicity or threshold stability check - - turnover/slippage/capacity check - - crisis/regime stress check - - sector concentration check - - cash-defense impact check - anti_overfit_rules: - - 단일 종목/단일 기간 최적화 금지 - - threshold는 후보군/검증군 분리 - - 리플레이 성과를 live 성과로 표기 금지 - - 샘플 30 미만은 ACTIVE 금지 - factor_taxonomy_required: - - momentum - - quality - - value - - growth - - liquidity - - smart_money - - risk - - regime - - execution_quality - document_diet_policy: - AGENTS_md_max_lines: 120 - one_topic_one_authority_file: true - adr_rule: 되돌리기 어려운 아키텍처 결정만 ADR 작성. 일반 TODO는 spec 또는 governance/change_requests에 - 둔다. - duplicate_policy: 같은 개념의 v1/v2/v3가 공존하면 canonical_manifest에 active 1개와 deprecated - 목록을 반드시 남긴다. - review_question: 이 문서가 하네스/계약/검증에 직접 쓰이지 않으면 삭제 또는 archive 후보다. -low_capability_llm_execution_card: - read_order: - - 1. AGENTS.md - - 2. runtime/active_artifact_manifest.yaml - - 3. spec/00_execution_contract.yaml - - 4. spec/13_formula_registry.yaml - - 5. spec/48_module_io_contract_registry.yaml - - 6. Temp/final_context_for_llm_v5.yaml 또는 active manifest alias packet - - 7. 본 YAML의 todo_roadmap - fixed_response_rules: - - 숫자가 필요한 문장은 source_path/json_pointer/formula_id가 없으면 DATA_MISSING으로 쓴다. - - 매수/매도 판단은 final_decision_packet의 final_action만 복사한다. - - 하네스 값이 없으면 질문하지 말고 하네스 업데이트 TODO를 만든다. - - 주문표는 single numeric price per row만 허용한다. - - blocked/limited라도 산출된 가격·수량·차단사유는 shadow ledger에 남긴다. - - D+2 정산현금은 즉시현금 방어선 충족 현금으로 인정한다. - - 토/일에는 weekly rebalance, 매월 1/11/21에는 mid-cycle check 섹션을 반드시 출력한다. - output_template_order: - - executive - - blockers - - portfolio_health - - action_table - - sell_priority - - shadow_ledger - - data_missing - - education_notes - - next_validation_commands -todo_roadmap: -- phase_id: P0_STABILIZE_AND_FREEZE - objective: 새 기능 추가를 멈추고 현재 권위·릴리즈·아키텍처 경계의 진실성을 고정한다. - exit_gate: release gate OK, skip_validate=false, active/canonical alias drift=0, - architecture boundary violations=0 - tasks: - - task_id: P0-01 - priority: P0 - title: 릴리즈 SKIPPED 금지 - owner: architect - objective: release 모드에서 검증 생략을 원천 차단한다. - target_files: - - tools/prepare_upload_zip.py - - tools/run_release_dag_v3.py - - package.json - - spec/41_release_dag.yaml - method_steps: - - prepare_upload_zip.py에서 validation_mode=release이면 skip_validate 인자를 무시하거나 에러 - 처리한다. - - pipeline_runtime_profile_v1.json.runtime_context.skip_validate=false를 기록한다. - - gate_status는 OK 또는 FAIL만 허용하고 SKIPPED는 package-only에서만 허용한다. - - package.json ops:package와 prepare-upload-zip 스크립트가 동일한 정책을 쓰게 한다. - acceptance_criteria: - - Temp/pipeline_runtime_profile_v1.json.gate_status == OK - - Temp/pipeline_runtime_profile_v1.json.runtime_context.skip_validate == false - - failed_checks == [] - validation_commands: - - npm run ops:package - - python tools/validate_pipeline_runtime_contract.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P0-02 - priority: P0 - title: active/canonical alias 단일화 - owner: architect - objective: active manifest와 canonical manifest가 같은 active artifact를 가리키게 한다. - target_files: - - runtime/active_artifact_manifest.yaml - - artifacts/canonical_manifest.yaml - - tools/build_canonical_artifact_resolver_v1.py - - tools/validate_active_manifest.py - method_steps: - - canonical_manifest의 concepts별 canonical_path를 읽는다. - - active_artifact_manifest의 source_precedence/manifest_rows에서 deprecated v값을 탐지한다. - - resolver가 active manifest를 재생성할 때 canonical_manifest를 우선하도록 수정한다. - - deprecated artifact runtime read가 있으면 validation FAIL로 바꾼다. - acceptance_criteria: - - authority_collision_count == 0 - - stale_artifact_count == 0 - - single_truth_conflict_count == 0 - - manifest_rows에 deprecated canonical mismatch 없음 - validation_commands: - - python tools/build_canonical_artifact_resolver_v1.py - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml - --strict - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P0-03 - priority: P0 - title: 아키텍처 경계 validator를 계약값과 일치 - owner: architect - objective: spec/34의 0-count 계약을 validator가 그대로 강제하게 만든다. - target_files: - - spec/34_architecture_boundaries.yaml - - tools/validate_architecture_boundaries_v2.py - - tools/build_architecture_boundaries_v2.py - - tests/unit/test_architecture_boundaries.py - method_steps: - - validator가 spec/34 contracts.renderer_calculation_count와 reverse_dependency_count를 - 읽도록 한다. - - 관측값이 계약값보다 크면 gate=FAIL로 반환한다. - - 허용 예외가 필요하면 spec에 allowlist를 명시하고 만료일을 둔다. - - 현재 관측 288/7의 실제 원인을 function/file 단위로 출력하게 한다. - acceptance_criteria: - - renderer_calculation_count == 0 - - reverse_dependency_count == 0 - - allowlist_count == 0 또는 만료일 존재 - - gate == PASS only when contract satisfied - validation_commands: - - python tools/build_architecture_boundaries_v2.py - - python tools/validate_architecture_boundaries_v2.py - - python tools/validate_renderer_no_calculation_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P0-04 - priority: P0 - title: low-capability context v5 산출물 고정 - owner: architect - objective: release DAG와 실제 Temp 산출물의 context pack 버전을 일치시킨다. - target_files: - - tools/build_low_capability_context_pack_v5.py - - spec/46_low_capability_execution_pack.yaml - - spec/41_release_dag.yaml - - Temp/final_context_for_llm_v5.yaml - method_steps: - - build_final_context 노드를 실행해 v5를 생성한다. - - v4 파일은 archive 또는 deprecated로 분류한다. - - validate_low_capability_pack_v1.py가 required_sections를 모두 검사하게 한다. - - 패키징 화이트리스트에 v5만 포함한다. - acceptance_criteria: - - Temp/final_context_for_llm_v5.yaml exists - - required_sections all present - - v4 runtime reference count == 0 - validation_commands: - - python tools/build_low_capability_context_pack_v5.py --manifest runtime/active_artifact_manifest.yaml - --packet Temp/final_decision_packet_v4.json --out Temp/final_context_for_llm_v5.yaml - - python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v5.yaml - --contract spec/46_low_capability_execution_pack.yaml - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P0-05 - priority: P0 - title: 권위 파일 해시 고정 - owner: architect - objective: AGENTS/governance/spec의 변경 감사를 자동화한다. - target_files: - - governance/agents_index.yaml - - governance/agents_rule_hashes.yaml - - tools/build_agents_rule_hashes_v1.py - - tools/validate_agents_shrink_v1.py - method_steps: - - rule 파일별 sha256을 재생성한다. - - AGENTS.md는 120라인 이하 index 역할만 유지한다. - - rule hash mismatch가 있으면 release FAIL. - - 변경 사유는 governance/change_requests/*.yaml에 남긴다. - acceptance_criteria: - - AGENTS_SHRINK_OK - - rule hash mismatch count == 0 - - change_request exists for every rule change - validation_commands: - - python tools/build_agents_rule_hashes_v1.py - - python tools/validate_agents_shrink_v1.py - - python tools/validate_change_requests_v1.py --dir governance/change_requests - --strict - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P1_CONTRACT_FIRST_REFACTOR - objective: 새 알고리즘 확장 전에 계약·모듈 IO·공식 lifecycle을 한 장의 권위체계로 묶는다. - exit_gate: module_io_schema_coverage_pct=100, formula lifecycle required_fields - complete, owner ledger complete - tasks: - - task_id: P1-01 - priority: P1 - title: 리팩토링 방법론 계약 추가 - owner: architect - objective: 본 YAML의 핵심 규칙을 repo 내부 공식 계약으로 승격한다. - target_files: - - spec/49_refactor_methodology_contract.yaml - - governance/adr/0011-qedd-methodology.md - - AGENTS.md - method_steps: - - spec/49에 QEDD 원칙, 권위순서, 파일정책, DoD를 작성한다. - - ADR-0011에 왜 QEDD를 채택했는지 20줄 이내로 기록한다. - - AGENTS.md에는 링크 한 줄만 추가한다. - - 중복되는 장문 설명은 README/prompts에서 제거한다. - acceptance_criteria: - - spec/49 exists - - AGENTS line count <= 120 - - ADR exists - - 중복 장문 문서 0개 - validation_commands: - - python tools/validate_specs.py - - python tools/validate_agents_shrink_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P1-02 - priority: P1 - title: 모듈 IO registry를 실코드와 1:1 매핑 - owner: architect - objective: spec/48의 module_io_contract_registry를 실제 src/tools 경로와 동기화한다. - target_files: - - spec/48_module_io_contract_registry.yaml - - tools/build_module_io_coverage_v1.py - - tools/validate_module_io_coverage_v1.py - method_steps: - - 모든 핵심 모듈을 data_ingestion/feature/risk/alpha/decision/execution/report/evaluation/adapters로 - 분류한다. - - 각 모듈의 inputs/outputs/schema/artifact_path를 필수화한다. - - registry에 없는 Python builder가 있으면 FAIL 또는 archive 후보로 분류한다. - - tools는 wrapper인지 builder인지 role 필드를 추가한다. - acceptance_criteria: - - module_io_schema_coverage_pct == 100.0 - - unregistered_core_script_count == 0 - - wrapper_has_no_business_logic == true - validation_commands: - - python tools/build_module_io_coverage_v1.py - - python tools/validate_module_io_coverage_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P1-03 - priority: P1 - title: 공식 lifecycle registry 생성 - owner: architect - objective: 292개 formula의 상태와 owner/retirement 조건을 전부 원장화한다. - target_files: - - spec/51_formula_lifecycle_registry.yaml - - spec/35_rule_lifecycle_governance_v3.yaml - - tools/build_factor_lifecycle_registry_v1.py - - tools/validate_factor_lifecycle_v1.py - method_steps: - - formula_registry의 모든 formula_id를 읽는다. - - 각 formula에 lifecycle_state, owner, activation_threshold, retirement_condition, - expected_metric을 채운다. - - python_only/GAS_only/runtime 분류를 함께 기록한다. - - owner 없는 공식은 신규 변경 금지로 표시한다. - acceptance_criteria: - - formula_count == formula_runtime_registry.formula_total - - missing_owner_count == 0 - - missing_retirement_condition_count == 0 - - lifecycle_state in allowed states - validation_commands: - - python tools/build_factor_lifecycle_registry_v1.py - - python tools/validate_factor_lifecycle_v1.py --taxonomy spec/43_quant_factor_taxonomy.yaml - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P1-04 - priority: P1 - title: 숫자 provenance 계약을 보고서 필수조건으로 강화 - owner: architect - objective: 모든 보고서 숫자가 source_path/json_pointer/formula_id/input_hash를 가진다. - target_files: - - spec/45_number_provenance_contract.yaml - - tools/build_number_provenance_ledger_v4.py - - tools/validate_number_provenance_strict_v3.py - - tools/render_operational_report.py - method_steps: - - report_renderer가 숫자를 쓸 때 provenance ledger에서만 가져오게 한다. - - 숫자 문자열 formatting 전 원본 json_pointer를 기록한다. - - provenance 없는 숫자는 DATA_MISSING으로 렌더링한다. - - 교육노트의 예시 숫자도 provenance_required=false 예외 태그를 요구한다. - acceptance_criteria: - - unprovenanced_number_count == 0 - - provenance ledger freshness_status all OK or DATA_MISSING - - report validation PASS - validation_commands: - - python tools/build_number_provenance_ledger_v4.py --packet Temp/final_decision_packet_v4.json - --out Temp/number_provenance_ledger_v4.json - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json - --report Temp/operational_report.md - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P1-05 - priority: P1 - title: 파일 다이어트 예산을 release gate로 연결 - owner: architect - objective: 문서·Temp·generated sprawl을 수치 예산으로 관리한다. - target_files: - - runtime/refactor_baseline_v1.yaml - - tools/audit_repository_entropy_v2.py - - tools/clean_temp_artifacts_v1.py - - spec/50_repository_entropy_budget.yaml - method_steps: - - 현재 budget max_total_files=2000을 유지하되 target_total_files=1600을 추가한다. - - Temp json target<=250, docs lines target<=30000을 추가한다. - - generated 파일은 generator/source_hash 없으면 FAIL. - - archive 후보는 temp_cleanup_manifest에 기록 후 삭제한다. - acceptance_criteria: - - total_file_count <= 2000 - - target trend decreasing week over week - - temp_json_count <= 500 hard / <=250 target - - manual_generated_edit_count == 0 - validation_commands: - - python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v1.yaml - - python tools/clean_temp_artifacts_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P2_PYTHON_CANONICAL_AND_GAS_THIN_ADAPTER - objective: 계산/판단을 Python canonical로 집중시키고 GAS를 입출력 어댑터로 축소한다. - exit_gate: GAS business logic 신규 추가 0, Python parity PASS, GAS adapter validation - PASS - tasks: - - task_id: P2-01 - priority: P2 - title: GAS business logic 인벤토리 작성 - owner: architect - objective: gas_*.gs 함수의 역할을 adapter/helper/business_logic으로 분류한다. - target_files: - - tools/audit_gas_business_logic_v1.py - - gas_data_feed.gs - - gas_lib.gs - - gas_harness_rows.gs - - spec/39_gas_thin_adapter_policy.yaml - method_steps: - - GAS 함수명/라인/호출관계를 추출한다. - - 공식 계산 또는 final_action 판단을 business_logic으로 분류한다. - - business_logic은 Python 이전 후보로 기록한다. - - adapter 허용 책임은 fetch, write, sheet mapping, cache only로 제한한다. - acceptance_criteria: - - gas_business_logic_new_count == 0 - - existing_business_logic_migration_plan_exists - - thin_adapter_policy PASS - validation_commands: - - python tools/audit_gas_business_logic_v1.py - - python tools/validate_gas_thin_adapter_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P2-02 - priority: P2 - title: 공식 구현 Python canonical화 - owner: architect - objective: GAS에 남은 핵심 공식은 src/quant_engine/formulas로 이전한다. - target_files: - - src/quant_engine/core/formulas/ - - runtime/python/core/formulas/generated/ - - spec/13_formula_registry.yaml - - tools/compile_formula_registry_v1.py - method_steps: - - formula_id별 Python function signature를 표준화한다. - - inputs_used/missing_inputs/result/rule_id/provenance를 반환한다. - - GAS 결과와 Python 결과를 golden row로 비교한다. - - 동일 공식이 GAS/Python에 둘 다 있으면 canonical_runtime=PYTHON, gas_runtime=adapter로 선언한다. - acceptance_criteria: - - python_formula_parity_pass_pct == 100 - - runtime_adjusted_coverage_pct == 100 - - unmapped_formula_count == 0 - validation_commands: - - python tools/compile_formula_registry_v1.py - - python tools/validate_formula_runtime_registry_v1.py - - python tools/validate_schema_model_generation_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P2-03 - priority: P2 - title: GAS adapter contract 테스트 - owner: architect - objective: GAS는 Python 산출 packet을 sheet에 반영하는 기능만 검증한다. - target_files: - - spec/39_gas_thin_adapter_policy.yaml - - schemas/generated/gas_adapter_contract.schema.json - - tools/validate_gas_call_arity.py - - tools/validate_gas_thin_adapter_v1.py - method_steps: - - GAS public entrypoint의 인자 개수를 contract로 고정한다. - - GAS가 계산한 숫자가 보고서 authority가 되지 못하게 source whitelist를 설정한다. - - GAS call arity와 adapter role을 release gate에 넣는다. - acceptance_criteria: - - validate_gas_call_arity PASS - - validate_gas_thin_adapter_v1 PASS - - runtime_source_whitelist violation_count == 0 - validation_commands: - - npm run validate-gas-call-arity - - python tools/validate_gas_thin_adapter_v1.py - - python tools/validate_runtime_source_whitelist_v1.py --manifest runtime/active_artifact_manifest.yaml - --scan src tools - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P2-04 - priority: P2 - title: generated model 단일 생성기 고정 - owner: architect - objective: schemas/generated, src models/generated, runtime generated의 관계를 하나의 - generator로 묶는다. - target_files: - - tools/generate_models_from_schema.py - - schemas/generated/ - - src/quant_engine/models/generated/ - - runtime/python/core/formulas/generated/ - method_steps: - - schema를 source로 Python model을 생성한다. - - generated 파일 상단에 source_schema_hash를 삽입한다. - - 수동 편집 감지를 위해 generated manifest를 만든다. - - schema/model parity validator가 hash mismatch를 FAIL한다. - acceptance_criteria: - - schema_model_generation PASS - - generated_hash_mismatch_count == 0 - - manual_edit_count == 0 - validation_commands: - - python tools/generate_models_from_schema.py - - python tools/validate_schema_model_generation_v1.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P3_STRATEGY_HARNESS_AND_PERFORMANCE_TRUTH - objective: 좋아 보이는 알고리즘이 아니라 실전성과를 개선하는 알고리즘만 살아남게 만든다. - exit_gate: operational_t20_count>=30, pass_rate>=60, prediction_match>=60, value_damage<=10, - readiness ACTIVE or LIMITED_ACTIVE - tasks: - - task_id: P3-01 - priority: P3 - title: 성과 readiness hard gate 강화 - owner: architect - objective: WATCH_PENDING_SAMPLE 상태에서 active 승격을 차단한다. - target_files: - - Temp/strategy_hardening_harness_v2.json - - tools/build_strategy_hardening_harness_v2.py - - tools/validate_strategy_tests_contract.py - method_steps: - - targets를 validator가 직접 읽도록 한다. - - readiness_reasons 중 하나라도 남으면 ACTIVE 금지. - - overall_hardening_score가 높아도 performance_score가 낮으면 WATCH 유지. - - 보고서는 WATCH_PENDING_SAMPLE을 솔직하게 표시한다. - acceptance_criteria: - - readiness_gate != ACTIVE when operational_t20_count < 30 - - prediction_match_rate_pct target applied - - value_damage target applied - validation_commands: - - python tools/build_strategy_hardening_harness_v2.py - - python tools/validate_strategy_tests_contract.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P3-02 - priority: P3 - title: 뒷북/설거지 방지 하네스 정교화 - owner: architect - objective: late entry와 distribution presignal을 매수 차단 이전 단계에 배치한다. - target_files: - - tools/build_late_chase_attribution_v2.py - - tools/build_anti_late_entry_pullback_gate_v4.py - - tools/build_distribution_exit_presignal_v2.py - - spec/04_strategy_rules.yaml - method_steps: - - 매수 후보마다 entry_timing_decile, flow_acceleration, overhang, distribution_risk를 - 계산한다. - - 상승 말기 신호가 일정 이상이면 BUY를 WATCH/PULLBACK_WAIT로 낮춘다. - - pullback trigger가 없으면 추격매수 수량을 0으로 둔다. - - 매수 차단 사유를 shadow ledger에 남긴다. - acceptance_criteria: - - late_chase_false_buy_count decreases week over week - - BUY without pullback_trigger count == 0 - - distribution_warning_before_sell_count tracked - validation_commands: - - python tools/build_late_chase_attribution_v2.py --json GatherTradingData.json - --out Temp/late_chase_attribution_v2.json - - python tools/validate_anti_late_entry_harness_v1.py --json Temp/late_chase_attribution_v2.json - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P3-03 - priority: P3 - title: 수익금 방어 value preservation 개선 - owner: architect - objective: 익절 후 반납과 손실 확대를 별도 점수로 관리한다. - target_files: - - tools/build_value_preservation_scorer_v2.py - - tools/build_profit_giveback_ratchet_v2.py - - tools/build_sell_execution_timing_lock_v2.py - - spec/06_exit_policy.yaml - method_steps: - - profit_lock_stage와 giveback_ratio를 계산한다. - - TP 후 trailing stop을 packet에 포함한다. - - value_damage_pct가 10 초과이면 다음 주 신규 위험 예산을 줄인다. - - SELL 후보가 2개 이상이면 sell priority table을 먼저 렌더링한다. - acceptance_criteria: - - cash_recovery_value_damage_pct <= 10 target - - profit_giveback_alert_count tracked - - sell_priority_table rendered when candidates>=2 - validation_commands: - - python tools/build_profit_giveback_ratchet_v2.py --json GatherTradingData.json - --out Temp/profit_giveback_ratchet_v2.json - - python tools/build_value_preservation_scorer_v2.py - - python tools/validate_operational_report_contract.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P3-04 - priority: P3 - title: live/replay 분리와 T+20 outcome ledger 운영 - owner: architect - objective: 리플레이 성과와 실전 성과를 절대 섞지 않는다. - target_files: - - tools/build_live_replay_separation_v3.py - - tools/build_operational_t20_outcome_ledger_v1.py - - tools/build_outcome_quality_score_v1.py - - spec/44_live_replay_separation.yaml - method_steps: - - 모든 decision row에 sample_type=LIVE/REPLAY/PAPER를 붙인다. - - T+5/T+20 결과를 outcome ledger에 누적한다. - - sample_count<30이면 active 금지. - - 리플레이 지표는 교육/참고 섹션에만 표시한다. - acceptance_criteria: - - replay_used_as_live_count == 0 - - operational_t20_count tracked - - live sample_count gating applied - validation_commands: - - python tools/build_live_replay_separation_v3.py --out Temp/live_replay_separation_v3.json - - python tools/validate_no_replay_live_mix_v2.py --json Temp/live_replay_separation_v3.json - --strict - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P3-05 - priority: P3 - title: 전략 하네스 점수 공식을 단순화 - owner: architect - objective: overall score보다 통제/성과/진실성/운영성을 분리한다. - target_files: - - spec/52_strategy_harness_scorecard.yaml - - tools/build_strategy_hardening_harness_v2.py - - tools/evaluate_strategy_harness_score.py - method_steps: - - control_score, performance_score, truth_score, ops_score 네 축으로 분리한다. - - 성능 지표가 부족하면 overall을 높게 보이지 않게 cap을 건다. - - 점수 산식과 thresholds를 YAML에 명시한다. - - 보고서에는 높은 통제 점수와 낮은 성과 준비도를 분리해 표시한다. - acceptance_criteria: - - score_formula documented - - sample_cap applied - - overall_hardening_score not misleading - - readiness_reasons displayed - validation_commands: - - python tools/evaluate_strategy_harness_score.py - - python tools/build_strategy_hardening_harness_v2.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P4_RENDERER_AND_LLM_NO_HALLUCINATION - objective: 보고서와 LLM이 계산하지 않고 하네스 packet만 복사하도록 완전히 잠근다. - exit_gate: renderer_calculation_count=0, unprovenanced_number_count=0, llm regression - PASS - tasks: - - task_id: P4-01 - priority: P4 - title: renderer copy-only helper로 축소 - owner: architect - objective: render_operational_report.py의 계산성 코드를 packet copy로 치환한다. - target_files: - - tools/render_operational_report.py - - tools/operational_report_contract.py - - schemas/operational_report.schema.json - method_steps: - - 계산처럼 보이는 사칙연산/비교/threshold 판단을 packet builder로 이동한다. - - renderer에는 formatting, table order, null display만 둔다. - - 숫자 포맷팅 함수는 provenance ledger pointer를 함께 받는다. - - renderer_no_calculation validator를 release gate에 둔다. - acceptance_criteria: - - renderer_calculation_count == 0 - - renderer_gate_redecision_count == 0 - - operational report schema PASS - validation_commands: - - python tools/validate_renderer_no_calculation_v1.py - - npm run validate-operational-report-contract - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P4-02 - priority: P4 - title: low-capability LLM regression fixture 확장 - owner: architect - objective: 저성능 LLM도 같은 결과를 내는지 golden prompt로 테스트한다. - target_files: - - tests/llm_regression/ - - tools/run_low_capability_llm_regression_v1.py - - prompts/low_capability_report_renderer.md - method_steps: - - BUY/HOLD/SELL/TRIM/blocked/data_missing/cadence 케이스를 fixture로 만든다. - - 정답은 final_context_for_llm_v5의 필드 복사로만 구성한다. - - LLM이 임의 숫자를 쓰면 FAIL. - - 주말/1·11·21일 cadence 요구를 fixture에 포함한다. - acceptance_criteria: - - llm_regression_pass_rate == 100 - - invented_number_count == 0 - - harness_verdict_override_count == 0 - validation_commands: - - python tools/run_low_capability_llm_regression_v1.py --fixture tests/llm_regression - --context Temp/final_context_for_llm_v5.yaml - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P4-03 - priority: P4 - title: DATA_MISSING 표준화 - owner: architect - objective: 결측을 추정하지 않고 하네스 업데이트 필요로만 표시한다. - target_files: - - spec/02_data_contract.yaml - - spec/12_field_dictionary.yaml - - tools/build_data_quality_reconciliation_v1.py - - tools/validate_data_integrity_100_lock_v2.py - method_steps: - - 필드별 missing_policy를 field dictionary에 둔다. - - 결측이 action-critical이면 execution block. - - 결측이 narrative-only이면 DATA_MISSING 섹션에만 표시. - - LLM prompt에 추정 금지 문구를 반복하지 말고 context pack contract로 강제한다. - acceptance_criteria: - - critical_missing_execution_blocked == true - - imputed_data_exposure disclosed - - DATA_MISSING wording exact - validation_commands: - - python tools/build_data_quality_reconciliation_v1.py --json GatherTradingData.json - --integrity Temp/data_integrity_100_lock_v2.json --out Temp/data_quality_reconciliation_v1.json - - python tools/validate_cash_ledger_v2.py --snapshot GatherTradingData.json --contract - spec/15_account_snapshot_contract.yaml - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P5_OPERATING_CADENCE_AND_PORTFOLIO_POLICY - objective: 사용자 운영 규칙을 엔진 하네스에 넣어 매번 사람이 기억하지 않아도 자동 출력되게 한다. - exit_gate: weekly Sat/Sun rebalance and 1/11/21 mid-check sections generated by - cadence signal - tasks: - - task_id: P5-01 - priority: P5 - title: 운영 cadence signal을 보고서 권위값으로 승격 - owner: architect - objective: 토/일 리밸런싱, 매월 1/11/21 중간점검을 자동화한다. - target_files: - - tools/build_operating_cadence_signal_v1.py - - spec/18_settings_contract.yaml - - tools/render_operational_report.py - - schemas/operational_report.schema.json - method_steps: - - Asia/Seoul 기준 day_of_week/day_of_month를 계산한다. - - 토/일이면 required_section.weekly_rebalance=true. - - 1/11/21이면 required_section.mid_cycle_check=true. - - 기본 투자 제안 단위는 weekly로 고정한다. - acceptance_criteria: - - weekend_rebalance_required true on Sat/Sun - - mid_cycle_check_required true on day 1/11/21 - - report section present when required - validation_commands: - - python tools/build_operating_cadence_signal_v1.py --timezone Asia/Seoul --out - Temp/operating_cadence_signal_v1.json - - python tools/validate_operational_report_contract.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P5-02 - priority: P5 - title: D+2 현금 방어선 계약 고정 - owner: architect - objective: D+2 정산현금을 즉시현금 방어선 충족으로 인정하는 사용자 정책을 단일화한다. - target_files: - - spec/00_execution_contract.yaml - - spec/15_account_snapshot_contract.yaml - - tools/validate_cash_ledger_v2.py - - tools/build_goal_risk_budget_harness_v3.py - method_steps: - - cash ledger 용어를 immediate_cash_defense_eligible로 정리한다. - - 일반계좌 D+2 정산현금은 cash floor 계산에 포함한다. - - ISA/연금 현금은 제한현금으로 분리한다. - - 보고서에는 eligible/restricted를 분리 표시한다. - acceptance_criteria: - - d2_cash_defense_rule_applied == true - - cross_account_cash_leak_count == 0 - - eligible_cash calculation provenance exists - validation_commands: - - python tools/validate_cash_ledger_v2.py --snapshot GatherTradingData.json --contract - spec/15_account_snapshot_contract.yaml - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P5-03 - priority: P5 - title: 목표금액 5억 risk budget 연결 - owner: architect - objective: 목표 달성 압박이 risk rule을 우회하지 못하게 한다. - target_files: - - spec/36_goal_risk_budget_harness.yaml - - tools/build_goal_risk_budget_harness_v3.py - - tools/build_portfolio_alpha_confidence_per_ticker_v1.py - method_steps: - - 목표금액, 현재자산, 필요수익률, 허용 MDD를 산출하되 주문 판단은 risk gate 이후에만 반영한다. - - 목표 부족분이 cash_floor/hard_stop/total_heat를 완화하지 못하게 한다. - - 위험예산 초과 시 신규 매수보다 현금회복 우선. - acceptance_criteria: - - goal_pressure_override_count == 0 - - risk_vs_strategy conflict resolved to risk - - goal progress displayed separately - validation_commands: - - python tools/build_goal_risk_budget_harness_v3.py - - python tools/validate_specs.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P6_RELEASE_DAG_CI_AND_OBSERVABILITY - objective: 매번 같은 순서로 빌드·검증·패키징되고, 실패 원인이 바로 보이게 한다. - exit_gate: release DAG deterministic, duplicate steps=0, anomaly history sufficient, - engine health card PASS - tasks: - - task_id: P6-01 - priority: P6 - title: release DAG를 단일 엔트리포인트로 사용 - owner: architect - objective: package.json 여러 스크립트를 DAG 노드 호출로 정리한다. - target_files: - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - - package.json - method_steps: - - ops:validate/ops:release/ops:package가 모두 run_release_dag_v3.py를 호출하게 한다. - - 중복 스크립트명은 alias로만 유지한다. - - prepare_zip 노드에서 --skip-validate 기본 사용을 금지한다. - - DAG 노드별 inputs/outputs/depends_on을 모두 검증한다. - acceptance_criteria: - - duplicate_steps_removed_count == 0 - - dag has no cycles - - all strict nodes PASS - - package scripts count does not increase - validation_commands: - - python tools/run_release_dag_v3.py --mode release --strict - - npm run ops:release - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P6-02 - priority: P6 - title: engine health card를 첫 화면 지표로 - owner: architect - objective: 운영자가 한 장으로 상태를 판단하게 한다. - target_files: - - tools/build_engine_health_card_v1.py - - schemas/engine_health_card.schema.json - - tools/validate_engine_health_card_v1.py - method_steps: - - authority, data, formula coverage, performance readiness, release status, repo - entropy를 한 JSON/YAML로 요약한다. - - red/yellow/green 상태와 fail reason code를 제공한다. - - 보고서 맨 위 portfolio health와 함께 출력한다. - acceptance_criteria: - - engine_health_card gate PASS - - red reason code when release skipped - - health card included in report - validation_commands: - - python tools/build_engine_health_card_v1.py --out Temp/engine_health_card_v1.json - - python tools/validate_engine_health_card_v1.py --json Temp/engine_health_card_v1.json - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P6-03 - priority: P6 - title: runtime anomaly baseline 확장 - owner: architect - objective: 빌드 시간이 짧다고 정상으로 오인하지 않게 한다. - target_files: - - tools/profile_pipeline_runtime.py - - tools/pipeline_runtime_anomaly_lib_v1.py - - Temp/pipeline_runtime_profile_history_v1.json - method_steps: - - release/quick/package-only 모드별 baseline을 분리한다. - - history window가 10 미만이면 INSUFFICIENT_HISTORY로 표시하되 gate 판단과 분리한다. - - 검증 단계를 생략해 시간이 짧아진 경우 anomaly로 표시한다. - acceptance_criteria: - - baseline_window_size >= 10 or explicit insufficient label - - validation_step_count tracked - - skip_validate anomaly reason appears - validation_commands: - - python tools/profile_pipeline_runtime.py - - python tools/validate_pipeline_runtime_contract.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -- phase_id: P7_REPO_DIET_AND_MAINTENANCE_CADENCE - objective: 문서/파일/버전 스프롤을 줄여 장기 확장 가능한 엔진으로 만든다. - exit_gate: no stale runtime read, deprecated artifacts archived, source docs slim, - TODO debt visible - tasks: - - task_id: P7-01 - priority: P7 - title: 버전 스프롤 정리 - owner: architect - objective: v1/v2/v3 산출물은 active 1개와 archive만 남긴다. - target_files: - - artifacts/canonical_manifest.yaml - - tools/build_artifact_retirement_plan_v1.py - - tools/clean_temp_artifacts_v1.py - method_steps: - - 개념별 canonical artifact 1개를 지정한다. - - deprecated_files는 archive로 이동하고 runtime read 차단한다. - - Temp에 남은 오래된 버전은 cleanup manifest를 통해 삭제한다. - - 삭제 전 source_hash와 replacement를 기록한다. - acceptance_criteria: - - stale_artifact_count == 0 - - deprecated_runtime_read_count == 0 - - archive_runtime_read_count == 0 - validation_commands: - - python tools/build_artifact_retirement_plan_v1.py - - python tools/clean_temp_artifacts_v1.py - - python tools/validate_runtime_source_whitelist_v1.py --manifest runtime/active_artifact_manifest.yaml - --scan src tools - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P7-02 - priority: P7 - title: 문서 다이어트 - owner: architect - objective: 길고 중복된 설명을 계약/ADR/런북으로 분리한다. - target_files: - - README.md - - docs/doctrine.md - - docs/runbook.md - - prompts/*.md - - AGENTS.md - method_steps: - - README는 사용법 50줄 내외로 둔다. - - doctrine는 불변 원칙만 유지한다. - - runbook은 명령 순서만 유지한다. - - prompts는 렌더링 지시만 남기고 계산 설명 제거한다. - - 중복 원칙은 spec/49로 이동한다. - acceptance_criteria: - - docs_lines_total <= target - - AGENTS.md <= 120 lines - - duplicate_rule_text_count == 0 - validation_commands: - - python tools/validate_agents_shrink_v1.py - - python tools/lint_repo_hygiene.py - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed - - task_id: P7-03 - priority: P7 - title: 주간 엔진 리뷰 템플릿 운영 - owner: architect - objective: 매주 알고리즘 추가보다 성능/부채 리뷰를 우선한다. - target_files: - - governance/weekly_engine_review_template.md - - governance/change_request_template.yaml - - governance/change_requests/*.yaml - method_steps: - - 매주 토/일 리밸런싱 후 engine health, failed gates, retired rules, new evidence를 기록한다. - - 새 규칙 제안은 change_request로만 접수한다. - - 1/11/21 중간점검에는 live outcome ledger와 목표금액 진행률을 점검한다. - acceptance_criteria: - - weekly review exists for each week - - change requests validated - - mid-cycle check sections generated - validation_commands: - - python tools/validate_change_requests_v1.py --dir governance/change_requests - --strict - rollback: git revert or restore last canonical artifact - low_capability_llm_instruction: 목표 파일을 열고 method_steps를 순서대로 수행한다. 판단이 필요한 숫자는 - 만들지 말고 acceptance_criteria 기준으로만 PASS/FAIL을 적는다. - status: completed -release_gate_commands: - minimum_local_sequence: - - python tools/validate_specs.py - - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml - --strict - - python tools/build_module_io_coverage_v1.py - - python tools/validate_module_io_coverage_v1.py - - python tools/validate_architecture_boundaries_v2.py - - python tools/validate_renderer_no_calculation_v1.py - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json - --report Temp/operational_report.md - - python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v5.yaml - --contract spec/46_low_capability_execution_pack.yaml - - python tools/validate_no_replay_live_mix_v2.py --json Temp/live_replay_separation_v3.json - --strict - - python tools/validate_cash_ledger_v2.py --snapshot GatherTradingData.json --contract - spec/15_account_snapshot_contract.yaml - - python tools/run_low_capability_llm_regression_v1.py --fixture tests/llm_regression - --context Temp/final_context_for_llm_v5.yaml - - python tools/run_release_dag_v3.py --mode release --strict - - npm run ops:package - hard_fail_conditions: - - gate_status == SKIPPED in release mode - - authority_collision_count > 0 - - stale_artifact_count > 0 - - unmapped_formula_count > 0 - - renderer_calculation_count > 0 - - reverse_dependency_count > 0 unless explicit unexpired allowlist exists - - unprovenanced_number_count > 0 - - replay_used_as_live_count > 0 - - LLM invented number count > 0 - - D+2 cash defense rule not applied - - failed_checks not empty -definition_of_done: - control_and_truth: - engine_harness_status: OK - failed_checks_count: 0 - formula_runtime_coverage_pct: 100.0 - unmapped_formula_count: 0 - report_active_artifact_match_pct: 100.0 - authority_collision_count: 0 - stale_artifact_count: 0 - single_truth_conflict_count: 0 - renderer_calculation_count: 0 - reverse_dependency_count: 0 - provenance_missing_count: 0 - performance_readiness_targets: - overall_hardening_score_min: 85.0 - truth_hardening_score_min: 85.0 - prediction_match_rate_pct_min: 60.0 - algorithm_guidance_proof_min: 80.0 - operational_t20_count_min: 30 - operational_t20_pass_rate_min: 60.0 - execution_expectancy_pct_min: 0.1 - execution_win_rate_pct_min: 45.0 - cash_recovery_value_damage_pct_max: 10.0 - readiness_gate_allowed_for_active: - - LIMITED_ACTIVE - - ACTIVE - repo_diet_targets: - hard_total_file_count_max: 2000 - target_packaged_file_count_max: 1600 - hard_temp_json_count_max: 500 - target_temp_json_count_max: 250 - agents_md_max_lines: 120 - manual_generated_edit_count: 0 -implementation_sequence_for_next_commit: -- 1. P0-01, P0-02, P0-03, P0-04만 먼저 수행한다. 새 알파 추가 금지. -- 2. release DAG가 OK가 되면 P1 계약 파일을 추가한다. -- 3. P2에서 GAS business logic 이전 계획을 만든 뒤 한 번에 하나씩 Python canonical로 이전한다. -- 4. P3 성과 하네스를 통과하기 전까지 새 매수/매도 알고리즘은 SHADOW 상태로만 둔다. -- 5. P4 LLM regression을 통과한 후 보고서 프롬프트를 줄인다. -- 6. P5 운영 cadence와 D+2 현금정책을 보고서 필수섹션으로 고정한다. -- 7. P6/P7은 매주 토/일 리밸런싱 리뷰 때 부채를 줄이는 반복 작업으로 운영한다. diff --git a/suggest/quant_engine_refactor_todo_qedd_v1.yaml b/suggest/quant_engine_refactor_todo_qedd_v1.yaml deleted file mode 100644 index 1e5dc77..0000000 --- a/suggest/quant_engine_refactor_todo_qedd_v1.yaml +++ /dev/null @@ -1,714 +0,0 @@ -schema_version: qedd_refactor_todo.v1 -title: 퀀트투자 엔진 구조적 리팩토링 및 저성능 LLM 실행 TODO -generated_at_kst: '2026-06-07T14:27:31+09:00' -basis: - uploaded_zip: /mnt/data/data_feed.zip - required_authority: data_feed/AGENTS.md - read_order_from_agents: - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - spec/13_formula_registry.yaml - - spec/12_field_dictionary.yaml - - schemas/*.schema.json - - governance/rules/*.yaml - - spec/*.yaml - hard_constraints: - - 가격, 수량, TP, SL, 점수는 등록 공식과 하네스 산출값만 사용한다. - - LLM은 계산기가 아니라 renderer이며 하네스 판정을 번복하지 않는다. - - GAS는 thin adapter, Python/src는 canonical implementation이다. - - Temp는 실행 산출물이며 직접 편집하지 않는다. - - 문서/규칙/공식/스키마는 변경요청과 golden case 없이 활성화하지 않는다. -repository_inventory_observed: - total_files_in_uploaded_zip: 1364 - top_directory_counts: - src: 328 - tools: 324 - schemas: 161 - tests: 159 - runtime: 154 - spec: 114 - artifacts: 40 - governance: 24 - Temp: 13 - prompts: 9 - docs: 8 - examples: 8 - suggest: 7 - dist: 2 - AGENTS.md: 1 - gas_apex_alpha_watch.gs: 1 - gas_apex_runtime_core.gs: 1 - gas_data_collect.gs: 1 - gas_data_feed.gs: 1 - gas_harness_rows.gs: 1 - gas_lib.gs: 1 - gas_report.gs: 1 - GatherTradingData.json: 1 - package.json: 1 - README.md: 1 - RetirementAssetPortfolio.yaml: 1 - RetirementAssetPortfolioReportTemplate.yaml: 1 - extension_counts: - .py: 798 - .json: 364 - .yaml: 150 - .md: 38 - .gs: 7 - .ps1: 4 - .jsonl: 2 - .js: 1 - package_script_count: 202 - package_scripts_by_family: - build: 92 - validate: 63 - prepare: 7 - run: 6 - apply: 3 - full: 3 - render: 2 - measure: 2 - daily: 2 - compute: 2 - inject: 2 - start: 1 - check: 1 - score: 1 - ingest: 1 - update: 1 - release: 1 - convert: 1 - yolo: 1 - profile: 1 - import: 1 - audit: 1 - enrich: 1 - lint: 1 - ops:validate: 1 - ops:render: 1 - ops:release: 1 - ops:package: 1 - ops:audit: 1 - formula_registry_formula_count: 149 - formula_registry_size_bytes: 180041 - release_dag_steps: 14 - release_dag_failed_steps: 0 - tools_src_same_basename_count: 21 - tools_src_same_basename_examples: - - __init__.py - - apply_engine_upgrade_v4.py - - apply_engine_upgrade_v7.py - - compile_formula_registry_v1.py - - compute_formula_outputs.py - - convert_xlsx_to_json.py - - generate_models_from_schema.py - - import_etf_nav_manual.py - - inject_computed_harness.py - - lib_trading_calendar.py - - measure_harness_coverage.py - - measure_yaml_gs_ps_coverage.py - - orchestration_harness_v1.py - - pipeline_runtime_anomaly_lib_v1.py - - prepare_upload_zip.py - - refactor_master_helpers.py - - run_engine_audit_golden_cases_v1.py - - run_formula_golden_cases_v2.py - - run_integration_test_v1.py - - update_proposal_evaluation_history.py - - v7_hardening_common.py - active_manifest_missing_packaged_refs: &id001 - - Temp/canonical_artifact_resolver_v1.json - - Temp/final_execution_decision_v2.json - - Temp/prediction_accuracy_harness_v2.json - - Temp/single_truth_ledger_v2.json - - Temp/smart_cash_recovery_v7.json - current_hardening_snapshot: - overall_hardening_score: 68.22 - truth_hardening_score: 68.22 - readiness_gate: WATCH_PENDING_SAMPLE - prediction_match_rate_pct: 45.68 - algorithm_guidance_proof: 56.4 - operational_t20_count: 0.0 - value_damage_pct_avg: 12.5 - readiness_reasons: &id002 - - DATA_INTEGRITY_LOCK_NOT_PASS_100 - - OPERATIONAL_T20_SAMPLE_LT_30 - - OPERATIONAL_T20_PASS_LT_60 - - EXPECTANCY_LE_0_1 - - WIN_RATE_LT_45 - - PREDICTION_MATCH_LT_60 - - VALUE_DAMAGE_GT_10 -diagnosis: - senior_assessment: 현재 엔진은 방어 규율과 검증 골격은 좋지만, 공식/스크립트/산출물 버전이 계속 증식하는 구조다. 다음 단계는 - 새 지표 추가가 아니라, 권위 경로, 변경 수명주기, DAG, 패키징, 저성능 LLM 실행팩을 하나의 결정론적 생산 시스템으로 고정하는 것이다. - strengths: - - AGENTS.md가 운영 인덱스로 축소되어 있고 세부 규칙을 governance/rules 및 spec으로 위임한다. - - release_dag_run_v1 기준 14개 릴리즈 게이트가 모두 returncode 0으로 통과한다. - - number provenance, low capability pack, golden coverage, GAS thin adapter, no - replay/live mix 검증이 릴리즈 게이트에 포함되어 있다. - - spec/43_quant_factor_taxonomy.yaml에 factor lifecycle 필드가 이미 정의되어 있다. - - spec/46_low_capability_execution_pack.yaml에 저성능 LLM용 고정 섹션 계약이 이미 존재한다. - critical_gaps: - - gap: active_artifact_manifest가 패키지에 없는 Temp 산출물을 참조한다. - evidence: *id001 - risk: 검증 환경에서는 PASS라도 업로드 패키지 소비자는 참조 불능이 발생할 수 있다. - fix: validate_packaged_artifact_references_v1.py를 P0 게이트로 승격한다. - - gap: package.json 스크립트가 202개로 orchestration entropy가 높다. - evidence: build 92개, validate 63개, 긴 chained script 다수 - risk: 신규 기능 추가 시 실행 순서와 중복 검증이 파편화된다. - fix: release_dag.yaml 중심으로 스크립트를 8~12개 top-level entrypoint로 축소한다. - - gap: tools와 src/quant_engine 간 동일 basename Python 파일이 21개 존재한다. - evidence: - - __init__.py - - apply_engine_upgrade_v4.py - - apply_engine_upgrade_v7.py - - compile_formula_registry_v1.py - - compute_formula_outputs.py - - convert_xlsx_to_json.py - - generate_models_from_schema.py - - import_etf_nav_manual.py - - inject_computed_harness.py - - lib_trading_calendar.py - risk: canonical logic이 wrapper와 runtime 사이에서 갈라질 수 있다. - fix: src/quant_engine만 business logic을 소유하고 tools는 import-only CLI로 얇게 만든다. - - gap: formula registry가 153KB 단일 파일에 149개 공식으로 비대하다. - evidence: spec/13_formula_registry.yaml - risk: 저성능 LLM과 사람이 모두 충돌/중복/권위 경로를 추적하기 어렵다. - fix: domain shard를 원본으로 두고 normalized registry는 생성물로 전환한다. - - gap: 성과 활성화 조건은 아직 미달이다. - evidence: *id002 - risk: 실전 활성화 전환이 서사에 의해 앞당겨질 수 있다. - fix: operational T+20 sample, expectancy, win-rate, prediction 기준을 hard gate로 - 유지한다. -target_methodology: - name: QEDD — Quant Engine Deterministic Development - one_sentence: 투자 아이디어를 곧바로 코드로 만들지 말고, thesis → contract → schema → golden case - → canonical implementation → harness → shadow ledger → active release → retirement - 순서로만 승격한다. - non_negotiable_principles: - - 'Single Source of Truth: spec YAML이 계약, src/quant_engine이 구현, Temp가 산출물, report가 - 렌더다.' - - 'Formula First, Narrative Last: 수치 판단은 등록 공식과 하네스가 만들고 LLM은 복사/정리만 한다.' - - 'No Silent Override: 수동 보정, 미등록 공식, 추정값은 모두 차단한다.' - - 'Shadow Before Active: 새 팩터/게이트는 최소 표본과 성과 조건을 만족하기 전까지 주문 판단에 반영하지 않는다.' - - 'One Owner Per Output Field: 모든 출력 필드는 owner formula와 source path가 하나여야 한다.' - - 'Evidence-Labeled Performance: live, replay, imputed, manual 입력을 절대 섞지 않는다.' - - 'Repository Entropy Budget: 파일/문서/스크립트/버전 산출물은 예산을 초과하면 기능 추가를 중단하고 정리한다.' - activation_lifecycle: - - state: idea - allowed_output: proposal only - entry: 투자 가설 1문장과 실패 조건 작성 - exit: change_request 생성 - - state: contract - allowed_output: spec only - entry: input/output/missing_policy/owner/golden_case 정의 - exit: schema와 field dictionary 통과 - - state: shadow - allowed_output: shadow_ledger only - entry: Python canonical 구현과 golden parity PASS - exit: live 표본 최소 30개와 uplift/손상 기준 통과 - - state: active - allowed_output: decision packet - entry: release gate PASS 및 authority collision 0 - exit: retirement condition 발생 또는 성과 하락 - - state: retire - allowed_output: archive only - entry: edge 소멸, 충돌 과다, stale, 대체 공식 존재 - exit: archive manifest와 migration hash 기록 -target_architecture: - directory_contract: - AGENTS.md: 운영 헌법과 읽기 순서만 보유한다. 200라인 이하 유지. - spec/: 모든 공식, 데이터 계약, decision flow, risk policy, factor taxonomy의 유일한 권위. - spec/formulas/domains/: entry, exit, risk, portfolio, cash, fundamental, smart_money, - macro, reporting shard를 둔다. - src/quant_engine/: canonical Python package. business logic은 여기만 허용한다. - tools/: CLI wrapper. argparse, file I/O, src import 호출만 허용한다. - gas_*.gs: Google Sheet/Apps Script thin adapter. 계산 로직 금지. - schemas/: JSON/YAML schema와 생성 모델의 권위. - tests/golden/: 공식별 golden input/output. 새 공식의 필수 통과 조건. - tests/parity/: Python-GAS, schema-model parity, renderer-packet sync. - runtime/: active manifest, baseline manifest, lineage ledger. - Temp/: 실행 산출물. 직접 편집 금지, 패키징 전 참조 존재성 검증 필수. - artifacts/canonical/: 현재 active canonical snapshot만 둔다. - artifacts/archive/: retired/stale/versioned artifact만 둔다. - docs/: ADR, doctrine, runbook만 유지. 중복 설명 금지. - prompts/: renderer prompt와 audit prompt만 보유. 계산 지시 금지. - canonical_dataflow: - - raw workbook / market data - - 02_data_contract + 12_field_dictionary validation - - feature build in src/quant_engine/features - - formula execution in src/quant_engine/formulas - - decision graph in spec/routing/decision_graph.yaml - - risk/execution gates - - final_decision_packet_active.json - - final_context_for_llm.yaml - - operational_report.json/md renderer - authority_matrix_required_fields: - - output_field - - owner_formula_id - - source_spec - - source_schema - - runtime_artifact - - json_pointer - - provenance_required - - llm_mutable:false -refactor_todo: -- phase: P0_safety_freeze_and_baseline - objective: 리팩토링 중 투자 판단 산출물이 흔들리지 않게 현재 active 기준선을 고정한다. - priority: highest - tasks: - - id: P0-001 - action: 현재 zip의 sha256, 파일 목록, extension count, package script count, active artifact - manifest, release_dag_run을 runtime/refactor_baseline_v1.yaml로 기록한다. - method: python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v1.yaml - acceptance: baseline 파일에 total_files, package_script_count, formula_registry_hash, - active_manifest_hash가 존재한다. - status: completed - - id: P0-002 - action: active_artifact_manifest의 모든 참조가 업로드 패키지 안에 존재하는지 검증한다. - method: '새 validator: tools/validate_packaged_artifact_references_v1.py --manifest - runtime/active_artifact_manifest.yaml --root . --strict' - acceptance: missing_ref_count == 0. 현재 관측 missing refs는 Temp/canonical_artifact_resolver_v1.json, - Temp/final_execution_decision_v2.json, Temp/prediction_accuracy_harness_v2.json, - Temp/single_truth_ledger_v2.json, Temp/smart_cash_recovery_v7.json 이므로 반드시 해소한다. - status: completed - - id: P0-003 - action: 리팩토링 기간 중 active decision packet 생성 로직을 freeze하고 신규 팩터는 shadow 상태로만 허용한다. - method: governance/change_requests/0002-refactor-freeze.yaml 생성 후 rule_lifecycle - transition_policy에 freeze window 기록 - acceptance: release gate가 freeze 상태에서 새 active formula 추가를 차단한다. - status: completed - - id: P0-004 - action: 보고서 렌더러 계산 0 원칙을 재검증한다. - method: python tools/validate_renderer_no_calculation_v1.py && python tools/validate_number_provenance_strict_v3.py - --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.md - acceptance: renderer_calculation_count == 0, number_provenance_coverage_pct == - 100 - status: completed -- phase: P1_single_source_of_truth_split - objective: 거대 spec과 중복 권위 파일을 domain shard + generated normalized registry 구조로 전환한다. - tasks: - - id: P1-001 - action: spec/13_formula_registry.yaml를 직접 편집 금지 generated file로 강등하고, 원본 shard를 - spec/formulas/domains/*.yaml로 분리한다. - method: entry, exit, risk, cash, portfolio, fundamental, smart_money, macro, reporting, - data_quality, execution 도메인으로 분리 - acceptance: spec/13_formula_registry.yaml 상단에 generated_from 목록과 source_hashes가 - 기록된다. - status: completed - - id: P1-002 - action: 각 formula에 owner, lifecycle_state, input_fields, output_fields, missing_policy, - golden_cases, activation_threshold, retirement_condition을 필수화한다. - method: schemas/formula_contract.schema.json 추가 또는 강화 - acceptance: python tools/validate_formula_contract_completeness_v1.py 결과 missing_required_field_count - == 0 - status: completed - - id: P1-003 - action: output_field_owner_ledger를 field_dictionary와 교차검증한다. - method: python tools/validate_output_owner_uniqueness_v1.py --ledger spec/03_formulas/output_field_owner_ledger.yaml - --fields spec/12_field_dictionary.yaml - acceptance: owned_output_field_pct == 100, authority_collision_count == 0 - status: completed - - id: P1-004 - action: spec/strategy/*의 버전 중복 파일은 active/latest/archive 상태를 명시한다. - method: governance/rule_lifecycle.yaml과 artifacts/canonical_manifest.yaml에 매핑 - acceptance: 동일 base formula의 active_count_per_formula == 1 - status: completed -- phase: P2_release_dag_and_script_diet - objective: package.json을 명령 저장소가 아니라 최소 엔트리포인트로 축소한다. - tasks: - - id: P2-001 - action: package.json scripts를 ops:prepare, ops:validate, ops:build, ops:render, - ops:release, ops:package, ops:audit, ops:clean, ops:dev 9개로 축소한다. - method: 모든 세부 단계는 spec/41_release_dag.yaml과 tools/run_release_dag_v2.py에서 읽는다. - acceptance: package_script_count <= 12 - status: completed - - id: P2-002 - action: release DAG를 YAML에 완전히 선언한다. - method: 각 node에 id, command, inputs, outputs, depends_on, timeout_sec, cache_key, - strict, artifact_policy 기재 - acceptance: python tools/validate_release_dag_v2.py --dag spec/41_release_dag.yaml - --strict PASS - status: completed - - id: P2-003 - action: 긴 chained script를 모두 DAG node로 이전한다. - method: render-report-json처럼 18단계 이상 연결된 script 금지 - acceptance: package.json 내 && count == 0 또는 top-level orchestration wrapper에만 - 허용 - status: completed - - id: P2-004 - action: DAG 산출물의 input_hash/output_hash/elapsed_sec/gate를 lineage_events.jsonl에 - 기록한다. - method: tools/run_release_dag_v2.py가 공통 기록 담당 - acceptance: 각 node 실행 후 runtime/lineage_events.jsonl append 완료 - status: completed -- phase: P3_python_canonical_and_tools_wrapper_cleanup - objective: Python 구현 권위를 src/quant_engine으로 단일화하고 tools는 얇은 wrapper로 만든다. - tasks: - - id: P3-001 - action: tools와 src/quant_engine에 같은 basename으로 존재하는 21개 파일을 audit한다. - method: 각 파일을 canonical, wrapper, obsolete 중 하나로 분류 - acceptance: tools_src_duplicate_count == 0 또는 wrapper_only_count == duplicate_count - status: completed - - id: P3-002 - action: 모든 tools/build_*.py와 tools/validate_*.py에서 business logic을 src/quant_engine/*로 - 이전한다. - method: tools 파일은 parse_args, load, call, write, exit_code만 보유 - acceptance: python tools/validate_tools_are_thin_wrappers_v1.py PASS - status: completed - - id: P3-003 - action: runtime/python/core/formulas/generated와 src/quant_engine/models/generated의 - 생성 책임을 명확히 분리한다. - method: generated artifact에는 DO_NOT_EDIT header, source_schema_hash, generator_version - 삽입 - acceptance: schema/model parity validator PASS, generated drift count == 0 - status: completed - - id: P3-004 - action: 공식별 구현 위치 registry를 생성한다. - method: Temp/formula_runtime_registry_v2.json에 formula_id -> python_module -> - gas_adapter -> golden_cases -> owner 기록 - acceptance: declared_runtime_count == formula_total, unmapped_formula_count == - 0 - status: completed -- phase: P4_data_integrity_and_provenance_closure - objective: 데이터 정합성, 참조 존재성, 숫자 provenance를 닫힌 시스템으로 만든다. - tasks: - - id: P4-001 - action: 모든 output number에 source_path, json_pointer, formula_id, input_hash, freshness_status를 - 강제한다. - method: schemas/number_provenance.schema.json + validate_number_provenance_strict_v4 - acceptance: unproven_report_number_count == 0, stale_critical_number_count == - 0 - status: completed - - id: P4-002 - action: D+2 현금은 즉시현금 방어선 충족으로 간주하는 정책을 spec/risk/portfolio_exposure.yaml와 cash - formula shard에 명시한다. - method: cash_available_for_defense_krw = cash_krw + d_plus_2_cash_krw; settlement_gap_risk - 별도 표기 - acceptance: cash_floor gate가 D+2 포함/제외 값을 둘 다 출력하고, 방어선 판정은 포함값만 사용 - status: completed - - id: P4-003 - action: imputed/manual/stale/live/replay 데이터 라벨을 필드 단위로 강제한다. - method: spec/02_data_contract.yaml에 data_lineage enum 추가 - acceptance: live_replay_mix_count == 0, unlabeled_data_lineage_count == 0 - status: completed - - id: P4-004 - action: 업로드 패키지 whitelist를 runtime manifest와 동기화한다. - method: tools/prepare_upload_zip.py가 active_manifest refs를 자동 include - acceptance: packaged_ref_existence_pct == 100 - status: completed -- phase: P5_quant_algorithm_harness_hardening - objective: 뒷북 매수/설거지 매도를 줄이도록 팩터 수명주기와 충돌 해소를 공식화한다. - tasks: - - id: P5-001 - action: '팩터는 horizon별로 분리한다: scalping, short, mid, long. 서로 다른 horizon 신호를 하나의 - 점수로 무리하게 합산하지 않는다.' - method: spec/43_quant_factor_taxonomy.yaml의 required_lifecycle_fields를 모든 strategy - formula에 적용 - acceptance: factor_horizon_coverage_pct == 100 - status: completed - - id: P5-002 - action: 진입 게이트는 leading signal과 confirmation signal을 분리한다. - method: entry_lead_score, pullback_quality, breakout_quality, liquidity_acceleration, - distribution_pressure, valuation_heat를 별도 출력 - acceptance: late_entry_block_rate와 missed_winner_rate를 동시에 추적한다. - status: completed - - id: P5-003 - action: 스마트머니/유동성은 가격 상승 후 거래대금만 보지 말고 선행 누적/분산을 분리한다. - method: accumulation_score, distribution_risk_score, flow_acceleration, foreign_institution_sync, - volume_price_divergence를 독립 팩터화 - acceptance: distribution_risk_score >= threshold이면 신규 매수는 shadow-only 또는 half-size로 - 제한 - status: completed - - id: P5-004 - action: 펀더멘털은 horizon gate로 쓰고 단기 타이밍 점수와 충돌 시 우선순위를 명확히 한다. - method: quality_growth_score, earnings_revision_score, cashflow_quality, balance_sheet_risk, - valuation_stretch를 mid/long horizon에 배치 - acceptance: fundamental_good_but_entry_bad이면 BUY가 아니라 WATCH_PULLBACK이 출력된다. - status: completed - - id: P5-005 - action: 성과 피드백은 replay와 live를 분리하고 active 승격 기준을 hard-code한다. - method: operational_t20_count >= 30, prediction_match_rate_pct >= 60, execution_expectancy_pct - > 0.1, execution_win_rate_pct >= 45, value_damage_pct <= 10 모두 필요 - acceptance: 하나라도 미달이면 readiness_gate != ACTIVE - status: completed - - id: P5-006 - action: 매도 엔진은 손실방어, 수익보존, 현금확보, thesis break를 분리한다. - method: sell_reason enum = ABS_FLOOR, REL_UNDERPERFORM, PROFIT_RATCHET, CASH_RAISE, - THESIS_BREAK, DATA_RISK - acceptance: sell candidate 2개 이상이면 sell_priority_table이 먼저 출력된다. - status: completed - - id: P5-007 - action: 목표금액 5억과 현재 총자산의 goal gap을 risk budget과 position size에 연결한다. - method: goal_gap_pct, required_return_to_goal, max_drawdown_budget, cash_floor_defense를 - final_decision_packet에 포함 - acceptance: 목표 추격 때문에 손절/현금 방어선이 완화되지 않는다. - status: completed -- phase: P6_low_capability_llm_execution_pack - objective: 저성능 LLM도 같은 결과를 내도록 final_context와 response contract를 폐쇄형으로 만든다. - tasks: - - id: P6-001 - action: final_context_for_llm.yaml을 report 생성의 유일 입력으로 만든다. - method: required_sections = executive, blockers, action_table, shadow_ledger, - data_missing, education_notes 유지 - acceptance: context_required_field_coverage_pct == 100, ambiguous_instruction_count - == 0, llm_free_numeric_field_count == 0 - status: completed - - id: P6-002 - action: LLM용 절차를 7단계로 고정한다. - method: 1 읽기순서 확인 → 2 blockers 출력 → 3 sell priority → 4 buy/watch/avoid → 5 cash - defense → 6 data_missing → 7 education notes - acceptance: section_order_violation_count == 0 - status: completed - - id: P6-003 - action: LLM이 수치를 생성할 수 있는 문장을 prompt에서 제거한다. - method: '금지어: 계산해라, 추정해라, 적정가를 산출해라, 임의 보정해라. 허용어: 복사해라, 표시해라, DATA_MISSING으로 - 표기해라' - acceptance: validate_llm_prompt_no_numeric_generation_v1 PASS - status: completed - - id: P6-004 - action: report_renderer_prompt.md를 compact renderer와 audit renderer로 분리한다. - method: 운영보고서는 compact, 검증보고서는 audit 사용 - acceptance: report_renderer가 packet 외부 숫자를 참조하지 않는다. - status: completed -- phase: P7_gas_thin_adapter_and_sheet_contract - objective: GAS는 수집/시트 I/O만 하고 판단 로직은 Python canonical과 동기화한다. - tasks: - - id: P7-001 - action: gas_*.gs에서 공식 계산 로직을 탐지해 제거한다. - method: GAS 함수는 fetch, normalize, writeHarnessRows, readSheetRange, callAdapter만 - 허용 - acceptance: python tools/validate_gas_thin_adapter_v2.py PASS - status: completed - - id: P7-002 - action: GAS-Python parity golden cases를 핵심 adapter별로 유지한다. - method: tests/parity/gas_python/*.yaml 생성 - acceptance: node tools/run_gas_golden_parity.js PASS - status: completed - - id: P7-003 - action: account_snapshot contract를 별도 I/O 계약으로 고정한다. - method: spec/15_account_snapshot_contract.yaml 기준으로 capture_parse_prompt와 schema - 검증 연결 - acceptance: 붙여넣기 가능한 TSV/CSV 출력 필드 순서가 매번 동일하다. - status: completed -- phase: P8_documentation_and_file_diet - objective: 문서가 많아져서 판단이 흐려지는 것을 방지한다. - tasks: - - id: P8-001 - action: 문서는 AGENTS.md, doctrine.md, runbook.md, ADR, spec만 남기고 중복 설명은 제거한다. - method: docs/ 중복 문단 hash audit - acceptance: duplicate_doc_block_count == 0 - status: completed - - id: P8-002 - action: AGENTS.md는 운영 인덱스만 유지하고 상세 규칙은 governance/rules 및 spec로 이동한다. - method: validate_agents_shrink_v1 기준 강화 - acceptance: AGENTS line count <= 220, forbidden_long_rule_block_count == 0 - status: completed - - id: P8-003 - action: archive 정책을 강화한다. - method: artifacts/archive/YYYY-MM-DD 이하에만 구버전 저장, canonical에는 active 최신 1개만 허용 - acceptance: canonical_duplicate_version_count == 0 - status: completed - - id: P8-004 - action: repository entropy budget을 실제 패키징 기준으로 재산정한다. - method: spec/release/repository_entropy_budget.yaml에 target과 hard_limit 분리 - acceptance: file_count <= target 또는 budget_exception_change_request 존재 - status: completed -- phase: P9_release_and_rollback_control - objective: 변경이 잘못되면 즉시 이전 active packet으로 되돌릴 수 있게 한다. - tasks: - - id: P9-001 - action: release train을 daily, weekly, emergency 세 가지로 분리한다. - method: spec/release/release_train.yaml에 allowed changes와 gates 정의 - acceptance: weekly release만 active formula 승격 가능 - status: completed - - id: P9-002 - action: rollback manifest를 생성한다. - method: runtime/rollback_manifest_v1.yaml에 previous_active_packet, previous_manifest, - artifact hashes 기록 - acceptance: rollback command가 1단계로 실행 가능 - status: completed - - id: P9-003 - action: 변경요청 없는 파일 변경을 차단한다. - method: tools/validate_change_request_coverage_v2.py --changed-files runtime/changed_files.txt - acceptance: changed_files_without_change_request_count == 0 - status: completed - - id: P9-004 - action: 릴리즈 후 자동 audit report를 생성한다. - method: Temp/refactor_release_audit_v1.json에 gate, diff, entropy, formula coverage, - activation status 기록 - acceptance: gate == PASS 또는 release_mode == AUDIT_ONLY - status: completed -validators_to_add_or_strengthen: -- validator: validate_packaged_artifact_references_v1.py - purpose: runtime manifest와 final packet이 참조하는 파일이 실제 업로드 zip에 존재하는지 검사 - pass_condition: missing_ref_count == 0 -- validator: validate_formula_contract_completeness_v1.py - purpose: 모든 formula shard가 owner/lifecycle/input/output/missing/golden/activation/retirement - 필드를 갖는지 검사 - pass_condition: missing_required_field_count == 0 -- validator: validate_tools_are_thin_wrappers_v1.py - purpose: tools/*.py에 business logic, threshold, formula calculation이 남아 있는지 검사 - pass_condition: logic_violation_count == 0 -- validator: validate_package_script_budget_v1.py - purpose: package.json script count와 chained command를 예산화 - pass_condition: script_count <= 12 and chained_script_count == 0 -- validator: validate_factor_lifecycle_coverage_v1.py - purpose: 모든 팩터가 horizon, decay, conflict, activation, retirement를 갖는지 검사 - pass_condition: factor_lifecycle_coverage_pct == 100 -- validator: validate_performance_activation_gate_v1.py - purpose: 성과 미달 팩터가 active로 승격되는 것을 차단 - pass_condition: active_factor_with_failed_performance_count == 0 -- validator: validate_low_capability_context_closure_v2.py - purpose: 저성능 LLM context가 외부 숫자 생성 없이 보고서 작성 가능한지 검사 - pass_condition: llm_free_numeric_field_count == 0 and missing_required_section_count - == 0 -- validator: validate_doc_entropy_v1.py - purpose: 문서 중복, AGENTS 비대화, stale ADR를 검사 - pass_condition: duplicate_doc_block_count == 0 and agents_line_count <= 220 -- validator: validate_active_artifact_presence_in_canonical_v1.py - purpose: active artifact가 canonical/artifacts 또는 Temp final packet과 일치하는지 검사 - pass_condition: active_artifact_match_pct == 100 -low_capability_llm_operating_procedure: - role: renderer_only - forbidden: - - 숫자 계산 - - 가격 추정 - - 수량 추정 - - 하네스 verdict 번복 - - missing data 보정 - - 외부 시장 데이터로 harness 교체 - allowed: - - final_context_for_llm.yaml 값 복사 - - DATA_MISSING 표기 - - blocker 설명 - - action_table를 사람이 읽게 정리 - - 교육용 설명 - fixed_steps: - - step: 1 - name: read_required_files - instruction: AGENTS.md 읽기 순서를 따른다. 파일이 없으면 DATA_MISSING으로 쓰고 추정하지 않는다. - - step: 2 - name: print_executive_gate - instruction: engine_gate, blockers, readiness_gate를 먼저 출력한다. - - step: 3 - name: print_sell_priority - instruction: sell candidate가 2개 이상이면 sell priority table을 action table보다 먼저 출력한다. - - step: 4 - name: print_actions - instruction: BUY/SELL/HOLD/WATCH/AVOID는 packet의 action만 사용한다. - - step: 5 - name: print_cash_defense - instruction: D+2 현금을 즉시현금 방어선 충족으로 포함하되 결제갭 리스크는 별도 표시한다. - - step: 6 - name: print_shadow_ledger - instruction: blocked/limited 항목의 산출값을 숨기지 않는다. - - step: 7 - name: print_data_missing - instruction: 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요 문구로만 표기한다. - response_quality_checklist: - - 모든 숫자에 provenance가 있거나 packet에서 온 값이다. - - 매수/매도 가격과 수량을 LLM이 생성하지 않았다. - - live와 replay 성과를 섞지 않았다. - - 하네스 차단 신호를 문장으로 완화하지 않았다. - - 보고서 섹션 순서가 계약과 일치한다. -quant_decision_policy_to_lock: - entry_policy: - - 신규 매수는 macro/risk/cash/data/integrity gate가 모두 통과해야 한다. - - 상승률 후행 추격 신호만 존재하면 BUY가 아니라 WATCH_PULLBACK 또는 AVOID_CHASE로 둔다. - - fundamental 우수 + 단기 과열이면 분할진입 또는 대기이며 전량 BUY 금지. - - distribution risk가 높으면 breakout score가 좋아도 size cap 또는 block. - exit_policy: - - ABS_FLOOR는 다른 서사보다 우선한다. - - 수익 보유 종목은 trailing/profit ratchet으로 수익금 방어를 먼저 한다. - - 현금 부족은 가치 훼손 최소화 optimizer로 해결하고, 임의 매도 금지. - - sell priority table 없이 복수 매도 후보를 나열하지 않는다. - activation_policy: - - operational_t20_count < 30이면 live 성과 기반 active 승격 금지. - - prediction_match_rate_pct < 60이면 alpha confidence를 확대하지 않는다. - - cash_recovery_value_damage_pct > 10이면 현금확보 알고리즘을 active 확대하지 않는다. - - algorithm_guidance_proof < 80이면 guidance wording을 강화하고 shadow ledger를 확대한다. -target_metrics_after_refactor: - hard_gates: - authority_collision_count: 0 - single_truth_conflict_count: 0 - missing_packaged_artifact_refs: 0 - unproven_report_number_count: 0 - renderer_calculation_count: 0 - llm_free_numeric_field_count: 0 - changed_files_without_change_request_count: 0 - active_formula_without_golden_case_count: 0 - replay_used_as_live_count: 0 - repository_entropy_targets: - package_script_count_target: 12 - tools_business_logic_violation_count: 0 - agents_md_line_count_max: 220 - formula_registry_direct_edit_allowed: false - canonical_active_artifact_per_formula: 1 - performance_targets_for_active_trading_upgrade: - operational_t20_sample_min: 30 - prediction_match_rate_pct_min: 60 - execution_expectancy_pct_min: 0.1 - execution_win_rate_pct_min: 45 - cash_recovery_value_damage_pct_max: 10 - overall_hardening_score_min: 80 - algorithm_guidance_proof_min: 80 -recommended_file_changes: - create: - - runtime/refactor_baseline_v1.yaml - - tools/validate_packaged_artifact_references_v1.py - - tools/validate_package_script_budget_v1.py - - tools/validate_tools_are_thin_wrappers_v1.py - - tools/validate_formula_contract_completeness_v1.py - - tools/run_release_dag_v2.py - - schemas/formula_contract.schema.json - - schemas/release_dag.schema.json - - spec/formulas/domains/entry.yaml - - spec/formulas/domains/exit.yaml - - spec/formulas/domains/risk.yaml - - spec/formulas/domains/cash.yaml - - spec/formulas/domains/portfolio.yaml - - spec/formulas/domains/fundamental.yaml - - spec/formulas/domains/smart_money.yaml - - spec/formulas/domains/macro.yaml - - spec/formulas/domains/reporting.yaml - - runtime/rollback_manifest_v1.yaml - modify: - - AGENTS.md - - package.json - - spec/13_formula_registry.yaml - - spec/41_release_dag.yaml - - spec/43_quant_factor_taxonomy.yaml - - spec/46_low_capability_execution_pack.yaml - - spec/release/repository_entropy_budget.yaml - - runtime/active_artifact_manifest.yaml - - tools/prepare_upload_zip.py - archive_or_generate_only: - - 구버전 Temp 산출물 참조 - - artifacts/canonical 내 중복 active 버전 - - tools와 src에 동시에 존재하는 business logic 파일 - - 직접 편집되는 generated schema/model/formula 파일 -implementation_sequence_for_a_low_capability_agent: -- 1. 절대 투자 공식부터 수정하지 말고 P0 validator를 먼저 만든다. -- 2. validate_packaged_artifact_references_v1.py를 실행해 missing refs를 0으로 만든다. -- 3. package.json script count를 줄이기 전 현재 scripts를 release_dag.yaml로 그대로 옮긴다. -- 4. DAG가 기존 full-gate와 동일한 결과를 낸 뒤 package.json을 축소한다. -- 5. formula registry를 domain shard로 복사 분할하되, normalized 13_formula_registry는 generator로 - 재생성한다. -- 6. tools/src 중복 파일을 하나씩 wrapper화하고 매번 golden/parity/release gate를 실행한다. -- 7. 저성능 LLM final_context를 먼저 닫고, 보고서 prompt는 context 외부 숫자 접근을 금지한다. -- 8. 성과 개선 알고리즘은 전부 shadow로 추가하고 operational sample 조건 충족 전 active 승격하지 않는다. -- 9. 모든 변경은 change_request yaml에 rationale, touched_files, expected_metric, rollback_plan을 - 적는다. -- 10. 마지막에 release_dag_run_v2.json, refactor_release_audit_v1.json, rollback_manifest_v1.yaml을 - 생성한다. -definition_of_done: -- 업로드 zip만 받아도 active manifest의 모든 참조를 열 수 있다. -- package.json은 12개 이하의 top-level command만 가진다. -- spec domain shard가 원본이고 normalized registry는 생성물이다. -- tools는 얇은 CLI wrapper이며 계산 로직은 src/quant_engine에만 있다. -- 새 공식은 contract/schema/golden/owner/activation/retirement 없이는 merge되지 않는다. -- 저성능 LLM은 final_context_for_llm.yaml만 보고도 동일한 action table을 출력한다. -- 리포트의 모든 숫자는 provenance 100%를 유지한다. -- live/replay/imputed/manual 데이터가 분리되어 표시된다. -- 투자 활성화는 성과 게이트 미달 시 항상 WATCH/AUDIT_ONLY로 남는다. -- rollback이 단일 명령 또는 단일 manifest 교체로 가능하다. diff --git a/suggest/quant_engine_refactor_todo_v1.yaml b/suggest/quant_engine_refactor_todo_v1.yaml deleted file mode 100644 index 2e6238f..0000000 --- a/suggest/quant_engine_refactor_todo_v1.yaml +++ /dev/null @@ -1,733 +0,0 @@ -schema_version: quant_engine_refactor_todo.v1 -generated_at_kst: '2026-06-07T17:37:26.756697+09:00' -source: - zip_path: data_feed.zip - zip_sha256: e12322eb72d2e8184f5f5e010a4c0014c584bc170970b4788b7b79562065d227 - primary_instruction_file: data_feed/AGENTS.md - assumed_runtime_timezone: Asia/Seoul - objective_profile: - target_asset_krw: 500000000 - cadence: weekly; Sat/Sun rebalancing; 1/11/21 mid-month checkpoint -executive_decision: - recommended_methodology_name: 'QEDD: Quant Evidence-Driven Development' - one_line: spec을 권위 원천으로 고정하고, Python canonical 엔진에서만 계산하며, GAS/LLM/renderer는 얇은 - 어댑터와 설명 계층으로 격하한다. - north_star: 저성능 LLM도 final_context 패킷과 고정 순서 TODO만 따라 동일한 결론을 내는 결정론적 퀀트 엔진 - non_negotiables: - - LLM은 숫자, 가격, 수량, TP/SL, 점수, 공식, 주문문을 생성하지 않는다. - - 모든 산출 숫자는 formula_id, source_path, json_pointer, input_hash를 가진다. - - 새 전략은 contract -> schema -> golden case -> shadow ledger -> replay -> activation - gate 순서 없이는 active가 될 수 없다. - - GAS는 데이터 수집/시트 입출력 어댑터로만 유지하고 투자 판단 로직은 Python canonical로 이전한다. - - 보고서는 final_decision_packet과 provenance ledger만 읽고 계산하지 않는다. -current_state_audit: - inventory_observed: - total_file_count_from_entropy_audit: 1433 - repository_budget_max_total_files: 2000 - temp_json_count_from_entropy_audit: 16 - package_script_count_from_package_json: 22 - python_files_total: 834 - yaml_files_total: 170 - markdown_files_total: 39 - gas_files_total: 8 - tools_py_total: 355 - build_tools_count: 161 - validate_tools_count: 140 - spec_files_count: 125 - formula_registry_count: 149 - generated_formula_py_count: 149 - generated_golden_py_count: 149 - factor_registry_count: 149 - factor_promotion_gate_distribution: - draft: 149 - factor_empty_golden_case_count: 149 - things_working: - - area: single source manifest - evidence: 'runtime/active_artifact_manifest.yaml: active_count_per_formula=1, - report_active_artifact_match_pct=100.0, authority_collision_count=0' - - area: output authority matrix - evidence: 'governance/authority_matrix.yaml: owned_output_field_pct=100.0, authority_collision_count=0, - manual_override_field_count=0' - - area: field dictionary validation - evidence: validate_field_dictionary.py PASS; field_count=351 - - area: number provenance - evidence: validate_number_provenance_strict_v3.py PASS; coverage_pct=100, stale_critical_number_count=0 - - area: low capability pack after manual build - evidence: build_final_decision_packet_v4.py + build_low_capability_context_pack_v5.py - + validate_low_capability_pack_v1.py PASS - - area: repository entropy budget - evidence: audit_repository_entropy_v2.py PASS; total_file_count=1433 < 2000 - critical_gaps: - - gap_id: GAP-001 - severity: P0 - title: release mode가 build dependency closure를 실행하지 않아 결측 artifact에서 실패 가능 - evidence: run_release_dag_v3.py --mode release initially attempted validate_low_capability - before Temp/final_context_for_llm_v5.yaml existed. - impact: 저성능 LLM용 패킷, provenance, report sync가 환경 상태에 따라 통과/실패하는 비결정성 발생 - fix_direction: mode별 target node의 dependency closure를 먼저 계산하고 depends_on build - node는 항상 선행 실행 - - gap_id: GAP-002 - severity: P0 - title: architecture boundary gate가 FAIL이며 module IO schema coverage와 artifact - chain이 0 - evidence: 'validate_architecture_boundaries_v2.py: module_io_schema_coverage_pct=0.0, - artifact_chain_count=0; builder scan also renderer_calculation_count=5' - impact: data -> feature -> decision -> execution -> report 단방향 경계의 실증이 부족함 - fix_direction: module_io_contract registry와 artifact_hash_chain builder를 release - DAG에 build+validate 쌍으로 추가 - - gap_id: GAP-003 - severity: P1 - title: GAS thin adapter 정책과 실제 GAS 구현 간 괴리가 큼 - evidence: validate_gas_thin_adapter_v1.py found forbidden_gas_business_logic_count=98 - but gate=PASS due migration_plan_exists - impact: Python canonical first 원칙이 깨지고 공식 이중 구현/상호충돌 위험 증가 - fix_direction: GAS calculation logic를 pure adapter facade로 축소하고 formula outputs는 - Python runtime artifact에서만 공급 - - gap_id: GAP-004 - severity: P1 - title: 149개 factor가 모두 draft이며 golden_cases가 비어 있음 - evidence: factor_lifecycle_registry.yaml factors=149, promotion_gate=draft 149, - empty golden_cases=149 - impact: 팩터가 많아도 어떤 팩터가 수익률/손실방어에 기여하는지 승격·퇴출 판단 불가 - fix_direction: factor lifecycle을 draft/shadow/candidate/active/retired로 강제하고 최소 - golden/replay/edge gate를 채워야 promotion 가능 - - gap_id: GAP-005 - severity: P1 - title: tools 스프롤이 커져 개발자가 어느 CLI를 고쳐야 하는지 불명확 - evidence: tools/*.py=355, build_*=161, validate_*=140 - impact: 중복 하네스, 버전 파편화, 릴리즈 시간 증가, 유지보수 난이도 상승 - fix_direction: tools를 thin CLI로 유지하되 내부 로직은 src/quant_engine 하위 패키지로 이동하고 CLI - registry를 자동 생성 - - gap_id: GAP-006 - severity: P2 - title: 문서와 spec의 경계는 좋아졌으나 still too many rule/spec surfaces - evidence: spec files 125, yaml files 170, markdown files 39 - impact: 저성능 LLM이 여러 문서의 상충 규칙을 동시에 소화하기 어려움 - fix_direction: AGENTS.md는 80~100 lines index로 유지, 상세 규칙은 5개 domain bundle로 압축, - generated low-capability pack으로만 serving -target_architecture: - principle: Source of Truth는 spec/*.yaml, deterministic calculation은 src/quant_engine, - execution packaging은 Temp/final_decision_packet_active.json, narrative는 renderer/LLM - layering: - - layer: L0_governance - path: AGENTS.md, governance/, docs/adr/ - responsibility: 권위, 변경승인, lifecycle, 운영 헌법 - may_calculate: false - - layer: L1_contracts - path: spec/ - responsibility: 입력/출력/schema/formula/risk/order/report 계약 - may_calculate: false - - layer: L2_core_engine - path: src/quant_engine/ - responsibility: 공식 구현, 데이터 검증, 팩터, 리스크, 포트폴리오, execution blueprint - may_calculate: true - - layer: L3_cli - path: tools/ - responsibility: build/validate/render/release 명령 wrapper - may_calculate: false - - layer: L4_adapters - path: gas_*.gs, src/gas_adapter_parts/ - responsibility: Google Sheet/HTS/외부 데이터 입출력 - may_calculate: false - - layer: L5_runtime - path: Temp/, runtime/ - responsibility: 실행 산출물, lineage, manifest, final context - may_calculate: false - - layer: L6_reporting - path: tools/render_operational_report.py, prompts/ - responsibility: 계산 없이 final packet을 사람이 읽을 수 있게 렌더링 - may_calculate: false - canonical_package_structure: - src/quant_engine/contracts/: YAML/schema loader, contract resolver, field dictionary - resolver - src/quant_engine/data/: raw workbook mapping, freshness, missingness, as-of alignment, - leakage guard - src/quant_engine/formulas/: registered deterministic formulas only; generated - wrappers allowed - src/quant_engine/factors/: factor lifecycle, edge measurement, promotion/retirement - logic - src/quant_engine/risk/: portfolio exposure, cash floor, heat, drawdown, circuit - breakers - src/quant_engine/portfolio/: position sizing, rebalancing, cash recovery optimizer, - concentration policy - src/quant_engine/execution/: order grammar, tick normalization, TP/SL ladder, - execution blueprint - src/quant_engine/reporting/: packet builders only; no free calculation in renderer - src/quant_engine/validation/: contract, golden, property, parity, replay, release - gates - src/quant_engine/observability/: lineage events, provenance ledger, health card, - drift dashboard -methodology: - name: QEDD loop - loop: - - '1_contract_first: 새 판단/팩터/출력은 YAML contract와 owner field부터 정의한다.' - - '2_schema_and_golden_first: 입력 스키마, 출력 스키마, 최소 golden case를 작성한다.' - - '3_python_canonical_implementation: 계산은 src/quant_engine에만 구현한다.' - - '4_shadow_run: 최소 20 trading days 또는 replay 250 bars 이상 shadow ledger에 기록한다.' - - '5_edge_and_risk_evaluation: hit rate, payoff, drawdown, slippage, late-chase - avoidance를 측정한다.' - - '6_activation_gate: threshold 충족 시 active manifest에만 승격한다.' - - '7_report_serving: LLM은 final_context_for_llm_v5.yaml만 읽고 고정 템플릿으로 출력한다.' - - '8_post_trade_feedback: 실행 결과를 outcome ledger로 되돌려 calibration registry를 갱신한다.' - development_rules: - definition_of_ready: - - change_request yaml exists - - owner assigned - - affected formula_id/output_field listed - - conflict_precedence declared - - data source and freshness SLA declared - - golden case target declared - definition_of_done: - - contract validation PASS - - schema/model parity PASS - - golden coverage PASS - - property invariants PASS - - no unproven number in report PASS - - release DAG full dependency closure PASS - - lineage event written - - rollback path documented - anti_overengineering_rule: 새 파일 추가 전 existing owner/domain에 병합 가능한지 먼저 확인한다. 새 - 파일은 CR에 entropy_delta와 retirement_plan이 있어야 한다. -quant_algorithm_spine: - decision_sequence: - - step: 1 - name: data_integrity_gate - purpose: 결측/신선도/as-of/단위/ticker 정합성 차단 - output: PASS | DATA_MISSING | STALE | UNIT_MISMATCH - - step: 2 - name: market_regime_gate - purpose: KOSPI/KOSDAQ/미국/금리/환율/VIX/크레딧 리스크로 risk-on/off/neutral 판정 - output: regime, target_cash_pct, heat_limit - - step: 3 - name: portfolio_health_gate - purpose: 현금 방어선, D+2 즉시현금, 집중도, 손실방어, 목표 5억 진행률 - output: cash_shortfall, exposure_breach, rebalance_required - - step: 4 - name: factor_evidence_stack - purpose: 펀더멘털/스마트머니/상대강도/수급/변동성/섹터회전 점수를 동일 단위로 정규화 - output: factor_score_by_ticker - - step: 5 - name: anti_late_entry_gate - purpose: 상승 끝물 추격매수/설거지 구간 차단 - output: entry_allowed, pullback_required, chase_risk_score - - step: 6 - name: execution_blueprint - purpose: 주문 가능 여부, 가격, 수량, 손절/익절, tick normalization, order grammar 산출 - output: order_blueprint - - step: 7 - name: shadow_and_outcome_feedback - purpose: 실행 전/후 예측 정확도, 비용, slippage, drawdown contribution 측정 - output: outcome_ledger, calibration_update - factor_domains: - fundamental: - - earnings_quality - - growth_rate - - cashflow_stability - - valuation_peg - - balance_sheet_health - smart_money_liquidity: - - foreign_institution_flow - - volume_acceleration - - liquidity_depth - - ETF/sector flow - - flow_breadth - price_momentum: - - relative_strength - - breakout_quality - - pullback_depth - - follow_through_day - - trend_slope - risk_exit: - - drawdown_guard - - distribution_risk - - late_chase_attribution - - profit_lock_ratchet - - stop_loss - portfolio_construction: - - cash_floor - - sector_concentration - - single_position_cap - - correlation_gate - - risk_budget_cascade - activation_thresholds: - new_factor_shadow_min_trading_days: 20 - candidate_min_replay_cases: 100 - candidate_min_golden_cases: 3 - active_required_incremental_edge_bps: 30 - active_max_drawdown_worsening_bps: 0 - late_chase_false_positive_review_required: true - promotion_requires_owner_approval: true -scorecards: - engine_release_score_formula: - formula: 0.15*data_integrity + 0.15*number_provenance + 0.10*schema_model_parity - + 0.10*golden_coverage + 0.10*property_invariants + 0.10*architecture_boundary - + 0.10*gas_thin_adapter + 0.10*factor_lifecycle + 0.10*llm_regression - pass_threshold: 95 - block_threshold: 90 - hard_blocks: - - number_provenance < 100 - - authority_collision_count > 0 - - llm_free_numeric_field_count > 0 - - release_dependency_missing_count > 0 - factor_promotion_score_formula: - formula: 0.25*out_of_sample_hit_quality + 0.20*payoff_ratio_quality + 0.15*drawdown_defense - + 0.15*turnover_cost_efficiency + 0.10*regime_robustness + 0.10*data_quality - + 0.05*interpretability - shadow_to_candidate_min: 70 - candidate_to_active_min: 80 - retire_below: 50 - late_chase_defense_score_formula: - formula: 0.30*post_signal_pullback_need_accuracy + 0.25*breakout_failure_avoidance - + 0.20*distribution_warning_lead_days + 0.15*slippage_reduction + 0.10*false_block_penalty_inverse - purpose: 뒷북 매수/설거지 매수 방지를 정량 평가 -low_capability_llm_serving_contract: - input_allowed: - - runtime/active_artifact_manifest.yaml - - Temp/final_context_for_llm_v5.yaml - - Temp/final_decision_packet_active.json - - Temp/number_provenance_ledger_v4.json - - spec/46_low_capability_execution_pack.yaml - input_forbidden: - - raw workbook unless parser step explicitly requested - - deprecated artifacts - - archive artifacts - - multiple conflicting prompts - response_order: - - portfolio_health - - blockers - - action_table - - sell_priority_table_if_needed - - order_blueprint - - shadow_ledger - - data_missing - - education_notes - - next_validation_tasks - strict_rules: - - 숫자가 없으면 DATA_MISSING만 쓴다. - - 계산 근거 없는 수익률/가격/수량은 쓰지 않는다. - - 하네스 verdict를 완화하거나 뒤집지 않는다. - - blocked 상태도 산출 기준가/손절/익절/수량이 packet에 있으면 숨기지 않는다. - - 주문문에는 복수 조건 접속사를 넣지 않는다. - fixed_prompt: Read only the allowed input packet. Render the report in the response_order. - Never invent numbers. If a field is missing, write DATA_MISSING — harness update - required. Preserve all blocker states. Use final_decision_packet as the only execution - authority. -refactor_todo: -- id: P0-001 - phase: P0_release_determinism - title: run_release_dag_v3.py를 dependency-closure 실행기로 교체 - problem: release mode가 validate_*만 실행하면서 validate node의 build dependencies를 생략할 - 수 있다. - files_to_modify: - - tools/run_release_dag_v3.py - - spec/41_release_dag.yaml - implementation_steps: - - target_nodes = mode filter로 선택한다. - - target_nodes의 모든 depends_on을 재귀적으로 수집해 closure_nodes를 만든다. - - topological order 중 closure_nodes만 실행한다. - - validate_*가 필요로 하는 outputs가 없으면 build dependency를 자동 선행 실행한다. - - REPORT에는 skipped_by_mode와 executed_due_to_dependency를 분리 기록한다. - - node별 input_hash/output_hash, elapsed_sec, command, returncode를 lineage에 기록한다. - commands: - - python tools/run_release_dag_v3.py --mode release --strict - - python tools/run_release_dag_v3.py --mode full --strict - acceptance_criteria: - - release mode에서 Temp/final_context_for_llm_v5.yaml이 없더라도 build_final_context가 먼저 - 실행된다. - - release_dependency_missing_count == 0 - - RELEASE_DAG_RUN_V4.gate == PASS - rollback: 기존 run_release_dag_v3.py를 run_release_dag_v3_legacy.py로 보존하고 package.json - script는 v4로 전환 전까지 v3 유지 - status: completed -- id: P0-002 - phase: P0_architecture_boundary - title: module_io_contract_registry 도입 - problem: architecture boundary validator가 module_io_schema_coverage_pct=0.0으로 실패한다. - files_to_create: - - spec/48_module_io_contract_registry.yaml - - tools/build_module_io_coverage_v1.py - - tools/validate_module_io_coverage_v1.py - implementation_steps: - - src/quant_engine 주요 모듈별 inputs, outputs, owner, schema, artifact_path를 registry에 - 선언한다. - - tools/build_module_io_coverage_v1.py가 registry와 실제 artifact/schema 존재 여부를 비교한다. - - coverage = modules_with_input_schema_and_output_schema / total_modules * 100으로 - 계산한다. - - coverage 결과를 Temp/module_io_coverage_v1.json으로 저장한다. - - architecture_boundaries_v2 builder가 harness_coverage_audit.json 대신 module_io_coverage_v1.json을 - 읽도록 수정한다. - acceptance_criteria: - - module_io_schema_coverage_pct >= 100.0 - - missing_module_contract_count == 0 - status: completed -- id: P0-003 - phase: P0_artifact_hash_chain - title: artifact hash chain builder를 release DAG에 추가 - problem: artifact_chain_count=0으로 artifact lineage 검증이 불가능하다. - files_to_create: - - tools/build_artifact_chain_hash_v4.py - - tools/validate_artifact_chain_hash_v4.py - files_to_modify: - - spec/41_release_dag.yaml - - runtime/active_artifact_manifest.yaml - implementation_steps: - - active manifest의 canonical_source부터 final packet, provenance ledger, report json/md까지 - chain을 구성한다. - - 각 artifact에 path, sha256, formula_id, generated_at, parent_hash를 기록한다. - - 'chain length 최소 4개: raw json -> final packet -> provenance ledger -> report output.' - - Temp/artifact_chain_hash_v4.json을 생성한다. - acceptance_criteria: - - artifact_chain_count >= 4 - - artifact_hash_chain_coverage_pct == 100.0 - status: completed -- id: P0-004 - phase: P0_renderer_purity - title: renderer calculation scanner false positive와 실제 계산을 분리 - problem: render_operational_report.py에서 path join/string concat까지 calculation으로 - 잡히는 보수적 scanner가 release를 막을 수 있다. - files_to_modify: - - tools/build_architecture_boundaries_v2.py - - tools/render_operational_report.py - implementation_steps: - - AST 기반 scanner로 Numeric BinOp, Call(round/sum/mean), literal arithmetic만 계산으로 - 카운트한다. - - Path join, string concatenation, markdown assembly는 allowed_renderer_ops로 whitelist한다. - - renderer는 get_value(packet, pointer)와 render_section만 사용하도록 정리한다. - - renderer_calculation_count가 실제 투자 숫자 계산에 대해서만 증가하게 한다. - acceptance_criteria: - - renderer_calculation_count == 0 - - renderer_allowed_formatting_ops_count >= 1 - status: completed -- id: P1-001 - phase: P1_gas_thin_adapter_migration - title: GAS business logic 98건을 Python artifact 소비로 이전 - problem: GAS 내부에 macro_risk_score, TP/SL, routing, score 등 계산 흔적이 남아 있다. - files_to_modify: - - gas_data_feed.gs - - gas_data_collect.gs - - gas_apex_runtime_core.gs - - gas_harness_rows.gs - - src/gas_adapter_parts/* - implementation_steps: - - GAS function inventory를 collect/read/write/render/legacy_logic로 분류한다. - - legacy_logic 함수마다 Python formula_id와 output artifact를 매핑한다. - - GAS 계산 함수는 deprecate wrapper로 바꾸고 Python artifact value를 읽게 한다. - - GAS에서 점수/가격/수량 계산 키워드가 검출되면 validator gate를 FAIL로 변경한다. - - migration_allowlist는 30일 만료일을 가진다. - acceptance_criteria: - - forbidden_gas_business_logic_count == 0 - - validate_gas_thin_adapter_v2.gate == PASS - migration_batches: - - batch: 1 - scope: macro_risk_score and routing trace read-only migration - - batch: 2 - scope: TP/SL ladder and tick normalization migration - - batch: 3 - scope: distribution/late chase risk score migration - - batch: 4 - scope: order blueprint assembly migration - status: completed -- id: P1-002 - phase: P1_factor_lifecycle - title: 149개 factor를 lifecycle gate로 재분류 - problem: 모든 factor가 draft이며 golden_cases가 없어 활성/퇴출 기준이 없다. - files_to_modify: - - spec/factor_lifecycle_registry.yaml - - spec/43_quant_factor_taxonomy.yaml - files_to_create: - - tools/build_factor_edge_report_v1.py - - tools/validate_factor_promotion_gates_v1.py - - Temp/factor_edge_report_v1.json - implementation_steps: - - factor마다 horizon, hypothesis, data_quality_requirements, conflict_precedence, - position_sizing_impact, exit_impact를 채운다. - - '각 factor 최소 golden_cases 3개를 연결한다: positive, negative, missing_data.' - - shadow_start_date와 activation_threshold를 필수화한다. - - draft factor는 report decision에 영향 0으로 제한한다. - - candidate 이상만 sizing/exit에 영향 가능하도록 gate를 둔다. - - retirement_condition이 90일 no edge 또는 high conflict이면 retired로 이동한다. - acceptance_criteria: - - active factor의 golden_cases_count >= 3 - - draft factor의 position_sizing_impact == diagnostic - - factor_promotion_gate_distribution에 active/candidate/shadow/draft/retired가 명시됨 - - empty_golden_case_count for non-draft == 0 - status: completed -- id: P1-003 - phase: P1_tool_sprawl_reduction - title: tools/*.py 355개를 CLI registry + src 로직으로 다이어트 - problem: build/validate CLI가 많아 수정 지점이 분산된다. - files_to_create: - - spec/49_cli_registry.yaml - - src/quant_engine/cli_registry.py - - tools/qe.py - files_to_modify: - - package.json - - tools/*.py - implementation_steps: - - 각 tool의 command_id, module_path, function, inputs, outputs, owner, deprecation_status를 - registry에 등록한다. - - 새 CLI는 python tools/qe.py build final-context 같은 방식으로 통합한다. - - 기존 tools/build_*.py와 validate_*.py는 20줄 이하 wrapper로 줄인다. - - 중복 version tool은 latest canonical만 package.json에서 노출한다. - - retired tool은 tools/archive/YYYYMMDD로 이동하고 release DAG에서 제거한다. - acceptance_criteria: - - package_script_count <= 30 - - tools_wrapper_over_80_lines_count == 0 - - deprecated_tool_referenced_by_dag_count == 0 - status: completed -- id: P1-004 - phase: P1_contract_test_pyramid - title: 테스트 피라미드를 release gate로 고정 - problem: 검증 파일은 많지만 어떤 테스트가 어떤 리스크를 막는지 hierarchy가 약하다. - files_to_create: - - spec/50_test_pyramid_contract.yaml - - tools/build_test_coverage_matrix_v1.py - implementation_steps: - - 'unit: 공식 단위 golden/property test' - - 'contract: YAML schema와 field dictionary parity' - - 'integration: final packet/provenance/report sync' - - 'replay: as-of aligned historical outcome' - - 'llm_regression: low capability context response contract' - - 각 test가 막는 failure_mode를 spec에 매핑한다. - acceptance_criteria: - - critical_failure_modes_covered_pct == 100 - - orphan_test_count == 0 - - orphan_validator_count == 0 -- id: P2-001 - phase: P2_data_integrity - title: data contract를 as-of, freshness, unit, survivorship 관점으로 강화 - files_to_modify: - - spec/02_data_contract.yaml - - spec/14_raw_workbook_mapping.yaml - - spec/data_quality/expectations.yaml - files_to_create: - - tools/build_data_lineage_matrix_v1.py - - tools/validate_no_future_leakage_v1.py - implementation_steps: - - 각 raw field에 source_system, as_of_date, refresh_sla, unit, null_policy, transformation_owner를 - 선언한다. - - price/volume/financial/macro/account_snapshot의 time grain을 분리한다. - - fundamental data는 발표일 기준 availability lag를 반영한다. - - D+2 현금은 immediate_cash_defense_line로 별도 field화한다. - acceptance_criteria: - - field_lineage_coverage_pct == 100 - - future_leakage_case_count == 0 - - unit_mismatch_count == 0 -- id: P2-002 - phase: P2_backtest_replay - title: live/replay 분리와 walk-forward 평가를 activation gate에 연결 - files_to_modify: - - spec/29_backtest_harness_contract.yaml - - spec/44_live_replay_separation.yaml - files_to_create: - - tools/run_walk_forward_eval_v1.py - - Temp/walk_forward_eval_v1.json - implementation_steps: - - live artifact와 replay artifact의 namespace를 강제 분리한다. - - 매 factor와 decision rule에 in-sample/out-of-sample 기간을 기록한다. - - 거래비용, 세금, 슬리피지, 체결 실패를 비용 모델에 포함한다. - - 목표 5억 달성률과 최대낙폭을 동시에 평가한다. - acceptance_criteria: - - live_replay_mix_count == 0 - - walk_forward_period_count >= 4 - - cost_adjusted_edge_report_exists == true -- id: P2-003 - phase: P2_late_chase_defense - title: 뒷북/설거지 방지 하네스 강화 - files_to_modify: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - spec/strategy/pre_distribution_early_warning_v4.yaml - files_to_create: - - tools/build_late_chase_confusion_matrix_v1.py - - Temp/late_chase_confusion_matrix_v1.json - implementation_steps: - - 매수 후보 발생 후 T+1/T+3/T+5 최대역행폭과 follow-through를 측정한다. - - 차단했어야 할 추격매수와 차단하지 말았어야 할 주도주 눌림목을 분리한다. - - 분배 위험, 갭상승 피로도, 거래대금 climax, 외국인/기관 divergence를 조합한다. - - late_chase_block이 false positive이면 pullback_entry_trigger로 재진입 후보를 남긴다. - acceptance_criteria: - - late_chase_false_negative_rate <= 15 - - leader_pullback_false_block_rate <= 25 - - confusion_matrix_min_cases >= 50 -- id: P3-001 - phase: P3_reporting_and_llm - title: 보고서 렌더링을 final_context 기반으로 단일화 - files_to_modify: - - tools/render_operational_report.py - - prompts/low_capability_report_renderer.md - - spec/31_low_capability_llm_response_contract.yaml - implementation_steps: - - report renderer는 final_context_for_llm_v5.yaml 섹션만 순서대로 렌더링한다. - - operational_report.json과 md는 동일 packet에서 파생되어 checksum을 공유한다. - - LLM regression fixture를 매주 1개 이상 추가한다. - - '금지어: 추정, 대략, 가능성 높음 같은 숫자 없는 확신 표현을 lint한다.' - acceptance_criteria: - - llm_regression_pass_pct == 100 - - report_packet_mismatch_count == 0 - - ambiguous_instruction_count == 0 -- id: P3-002 - phase: P3_document_diet - title: '문서/파일 다이어트: 5개 권위 bundle로 압축' - files_to_modify: - - AGENTS.md - - governance/agents_index.yaml - - governance/rules/*.yaml - - docs/doctrine.md - implementation_steps: - - AGENTS.md는 운영 인덱스와 hard rule만 유지한다. - - rules를 core_locks, harness_contract, portfolio_policy, order_grammar, reporting_contract - 5개로 유지한다. - - 중복 ADR과 중복 spec 설명은 ADR index에서 링크만 유지한다. - - 새 문서는 owner, expiry_date, supersedes, archive_policy 없이는 merge 금지한다. - acceptance_criteria: - - agents_lines <= 100 - - active_rule_file_count <= 6 - - duplicate_rule_hash_count == 0 -- id: P4-001 - phase: P4_operating_cadence - title: 주간/월중 운용 cadence를 release DAG와 보고서에 내장 - files_to_modify: - - spec/operating_cadence.yaml - - tools/build_operating_cadence_signal_v1.py - - prompts/weekly_operational_report_master_prompt_v1.md - implementation_steps: - - 토/일이면 rebalancing_required=true를 생성한다. - - 매월 1/11/21이면 mid_month_checkpoint_required=true를 생성한다. - - D+2 현금은 immediate_cash_defense_line에 포함한다. - - 보고서 첫 섹션에서 cadence obligation을 누락하면 release gate FAIL로 둔다. - acceptance_criteria: - - cadence_signal_present == true - - weekend_rebalance_rule_test_pass == true - - midmonth_checkpoint_rule_test_pass == true -- id: P5-001 - phase: P5_observability - title: 엔진 health card와 drift dashboard를 상시 산출 - files_to_create: - - src/quant_engine/observability/health.py - - tools/build_engine_drift_dashboard_v1.py - - Temp/engine_drift_dashboard_v1.json - implementation_steps: - - 매 릴리즈마다 data freshness, factor drift, prediction_match_rate, turnover, slippage, - cash defense status를 저장한다. - - prediction_match_rate가 하락하면 affected factor를 자동으로 calibration queue에 넣는다. - - shadow와 active 성과를 분리 시각화 가능한 json으로 남긴다. - acceptance_criteria: - - engine_health_card_gate == PASS - - drift_dashboard_freshness_days <= 1 - - calibration_queue_exists == true -- id: P6-001 - phase: P6_release_train - title: 정기 release train과 rollback 정책 확정 - files_to_modify: - - spec/release/release_train.yaml - - spec/release/version_retirement_policy.yaml - - spec/release/repository_entropy_budget.yaml - implementation_steps: - - 매주 토/일 release window와 월중 1/11/21 checkpoint window를 정의한다. - - active manifest 변경은 CR + full DAG PASS + rollback artifact required 조건을 만족해야 한다. - - deprecated vN artifacts는 2회 release 뒤 archive로 이동한다. - - repository budget은 file count뿐 아니라 active spec count, active tool count, prompt - count로 확장한다. - acceptance_criteria: - - active_artifact_count_per_formula == 1 - - deprecated_runtime_reference_count == 0 - - rollback_manifest_exists == true -implementation_order: -- P0-001 -- P0-002 -- P0-003 -- P0-004 -- P1-001 -- P1-002 -- P1-003 -- P1-004 -- P2-001 -- P2-002 -- P2-003 -- P3-001 -- P3-002 -- P4-001 -- P5-001 -- P6-001 -suggested_new_files_minimal_set: -- spec/48_module_io_contract_registry.yaml -- spec/49_cli_registry.yaml -- spec/50_test_pyramid_contract.yaml -- tools/qe.py -- tools/build_artifact_chain_hash_v4.py -- tools/validate_release_dependency_closure_v1.py -- src/quant_engine/cli_registry.py -- src/quant_engine/observability/health.py -files_to_retire_or_archive_policy: - rule: same formula_id family에서 active latest와 direct golden/validator를 제외한 old builder는 - archive/YYYYMMDD로 이동 - candidates_by_pattern: - - tools/build_*_v1.py when v2+ active exists - - artifacts/archive/** - - Temp stale json not in active manifest - - prompts superseded by low_capability_report_renderer.md - must_not_delete_without_cr: - - spec/13_formula_registry.yaml - - spec/12_field_dictionary.yaml - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - governance/authority_matrix.yaml -low_capability_executor_todo: - instruction: 아래 순서를 기계적으로 수행한다. 해석하거나 보완하지 않는다. 결측은 DATA_MISSING으로 남긴다. - steps: - - open AGENTS.md and read only hard rules and routing order - - open runtime/active_artifact_manifest.yaml and identify canonical_source - - open Temp/final_context_for_llm_v5.yaml; if missing, run build_final_decision_packet - then build_low_capability_context_pack - - validate low capability pack; stop on FAIL - - render sections in required order - - do not compute numbers; copy packet values with provenance - - write blockers before recommendations - - write DATA_MISSING for unavailable field - - include shadow ledger for blocked/limited actions - - run release dependency closure validation before packaging -first_week_execution_plan: - day_1: - - Fix release DAG dependency closure - - Generate final_context_for_llm_v5 from clean Temp - - Add closure validator - day_2: - - Add module_io_contract_registry - - Build module_io_coverage - - Wire architecture boundary validator - day_3: - - Build artifact_hash_chain_v4 - - Patch renderer purity scanner - - Make architecture boundary PASS - day_4: - - Classify GAS business logic findings into migration batches - - Convert macro/routing read path to Python artifact - day_5: - - Populate factor lifecycle golden cases for top 20 active-impact formulas - - Create factor promotion validator - day_6: - - Run full release DAG - - Archive stale tools/artifacts using CR - - Update AGENTS.md route table only if path changes - day_7: - - Weekend rebalancing report dry run - - LLM regression fixture update - - Write weekly engine health card -final_gate_before_declaring_success: - commands: - - python tools/run_release_dag_v4.py --mode full --strict - - python tools/validate_release_dependency_closure_v1.py --dag spec/41_release_dag.yaml - --strict - - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json - --report Temp/operational_report.md - - python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v5.yaml - --contract spec/46_low_capability_execution_pack.yaml - - python tools/validate_gas_thin_adapter_v2.py --strict - - python tools/validate_factor_promotion_gates_v1.py --strict - success_definition: - - all gates PASS - - engine_release_score >= 95 - - authority_collision_count == 0 - - unproven_report_number_count == 0 - - llm_free_numeric_field_count == 0 - - release_dependency_missing_count == 0 diff --git a/suggest/quant_engine_refactoring_blueprint_v1.yaml b/suggest/quant_engine_refactoring_blueprint_v1.yaml deleted file mode 100644 index afb0ca6..0000000 --- a/suggest/quant_engine_refactoring_blueprint_v1.yaml +++ /dev/null @@ -1,784 +0,0 @@ -schema_version: quant_engine_refactor_blueprint.v1 -generated_at_kst: '2026-06-07T16:00:00+09:00' -title: 저성능 LLM 호환 퀀트투자 엔진 리팩토링·고도화 YAML 실행계획 -role_assumption: 30년 퀀트투자자 + 시니어 개발자 + 아키텍트 + PM 관점 -objective: - primary: md/yaml/gs/py만으로도 장기 확장 가능한 결정론적 퀀트투자 엔진 운영체계 확립 - secondary: 저성능 LLM이 TODO와 final_context packet만 따라도 고성능 LLM과 같은 보고서/판단을 재현하도록 수치·공식·게이트를 - 고정 - target_outcome: 임의 판단 최소화, 공식/데이터 정합성 100%, 릴리스 DAG PASS, GAS thin adapter, Python - canonical engine, 문서 다이어트 -current_state_audit: - source_zip: data_feed.zip - authority_file_observed: data_feed/AGENTS.md - repository_entropy_audit: - gate: PASS - total_file_count: 1423 - package_script_count: 21 - temp_json_count: 16 - budget: - max_total_files: 2000 - max_package_scripts: 220 - max_temp_json_files: 500 - local_file_scan: - md_files: 39 - yaml_files: 166 - gs_files: 7 - py_files: 829 - json_files_after_local_gate_attempt: 377 - md_lines: 3775 - yaml_lines: 88487 - gs_lines: 20423 - py_lines: 60077 - formula_and_test_scan: - registered_formulas_in_spec_13: 149 - execution_order_entries: 53 - registered_formulas_not_in_primary_execution_order: 100 - runtime_generated_formula_py: 149 - generated_model_py: 150 - generated_model_schema_json: 150 - generated_golden_cases: 149 - gas_scan: - gas_apex_alpha_watch.gs: - lines: 365 - functions: 13 - gas_apex_runtime_core.gs: - lines: 654 - functions: 14 - gas_data_collect.gs: - lines: 4451 - functions: 79 - gas_data_feed.gs: - lines: 10302 - functions: 177 - gas_harness_rows.gs: - lines: 1456 - functions: 6 - gas_lib.gs: - lines: 2749 - functions: 98 - gas_report.gs: - lines: 446 - functions: 3 - release_gate_observation: - command_attempted: python tools/run_release_dag_v3.py --mode release --strict - result: FAIL - first_failed_node: validate_low_capability - failure_reason: Temp/final_context_for_llm_v5.yaml 파일을 요구하지만 Temp/final_context_for_llm_v4.yaml만 - 존재 - missing_inputs_detected_in_release_dag: - - Temp/final_context_for_llm_v5.yaml - - Temp/live_replay_separation_v3.json - - Temp/late_chase_attribution_v2.json - - Temp/shadow_ledger_v2.json - - Temp/engine_health_card_v1.json - version_sprawl_observation: - strategy_spec_version_groups: 4 - tool_version_groups: 35 - runtime_generated_formula_version_groups: 5 - highest_risk_groups: - - build_final_context_for_llm_v2/v4 vs release_dag v5 - - build_live_replay_separation_v2/v3 vs Temp live_replay_separation_v2 only - - fundamental_quality.yaml/v2/v3 without explicit retirement in immediate routing - - pre_distribution_early_warning_v3/v4 - - predictive_alpha_dialectic_v1/v2 -cold_assessment: - verdict: 방향은 맞지만 운영 가능성은 릴리스 DAG와 artifact alias 정합성에서 깨진다. 알고리즘 자체보다 운영 하네스의 파일명·버전·계약 - drift가 먼저 수익률을 훼손할 수 있다. - what_is_good: - - AGENTS.md가 source-of-truth, Python canonical first, GAS adapter second, provenance, - shadow ledger 원칙을 이미 보유 - - formula registry 149개와 generated formula/golden parity가 거의 1:1 구조 - - repository entropy budget은 아직 예산 이내 - - release DAG 개념과 active_artifact_manifest가 존재해 단일 실행 경로로 수렴 가능 - what_is_dangerous: - - 릴리스 DAG가 존재하지 않는 v5/v3 산출물을 직접 참조하여 풀 게이트가 중단됨 - - GAS가 collect/normalize/export/display를 넘어 의사결정·계산 로직을 여전히 많이 품고 있을 가능성이 높음 - - versioned tool/spec가 많아 active/retired/shadow 상태를 모르면 저성능 LLM이 잘못된 버전을 선택할 위험이 - 큼 - - 공식 수는 충분하지만 formula lifecycle, activation threshold, retirement condition, expected - edge 검증이 모든 신규 팩터에 강제되지 않으면 뒷북·설거지 매수가 반복됨 - - 보고서는 기계 산출물이어야 하는데, 중간 YAML/JSON 이름 drift가 있으면 LLM이 결측을 메우려는 환각 경로가 열린다 - non_negotiable_direction: 더 많은 규칙을 추가하지 말고, 규칙을 코드·스키마·골든케이스·DAG 게이트로 실행 가능하게 줄여야 - 한다. 문서는 줄이고, 계약과 검증은 강화한다. -target_methodology: - name: 'QEDD-SSDLC: Quant Evidence Driven Development + Spec-as-Code Deterministic - Lifecycle' - summary: 투자 아이디어는 문장이 아니라 가설-입력-공식-골든케이스-섀도원장-성과평가-활성화 게이트로만 승격한다. - principles: - - id: P1 - name: Single Source of Truth - rule: spec/와 runtime/active_artifact_manifest.yaml이 권위다. Temp는 실행 결과일 뿐 직접 수정하지 - 않는다. - - id: P2 - name: Formula before narrative - rule: 가격·수량·TP·SL·점수는 spec/13_formula_registry.yaml 또는 하네스 산출값만 허용한다. - - id: P3 - name: Python canonical first - rule: 새 의사결정 로직은 src/quant_engine에 먼저 구현하고, GAS는 collect/normalize/export/display만 - 수행한다. - - id: P4 - name: Shadow before active - rule: 새 팩터는 최소 20거래일 또는 50건 신호의 shadow 성과가 없으면 active 금지. - - id: P5 - name: No hidden overrides - rule: LLM, 리포트 렌더러, GAS UI는 하네스 결정을 번복하지 않는다. - - id: P6 - name: Low capability first - rule: 저성능 LLM이 읽을 final_context packet은 고정 섹션·고정 순서·숫자 json_path를 갖는다. - - id: P7 - name: Entropy budget - rule: 새 파일 1개를 만들면 owner, lifecycle, retirement path, release gate 등록을 동시에 요구한다. - - id: P8 - name: Evidence over complexity - rule: 수익 개선 또는 리스크 감소를 수치로 증명하지 못한 팩터는 active로 승격하지 않는다. - core_loop: - - hypothesis_yaml - - data_contract - - formula_registry_entry - - python_canonical_implementation - - schema_model_generation - - golden_case - - shadow_ledger - - calibration_report - - release_dag_gate - - active_manifest_promotion - - low_capability_context_pack - - report_renderer -target_architecture: - pipeline: - - stage: S0_collect - owner: GAS thin adapter - allowed: - - collect - - normalize - - export - - display - forbidden: - - decision - - sizing - - stop_loss - - take_profit - - risk_score - - stage: S1_raw_snapshot - owner: GatherTradingData.json + raw workbook mapping - gate: spec/14_raw_workbook_mapping.yaml + spec/15_account_snapshot_contract.yaml - - stage: S2_data_quality - owner: Python - gate: schema validation + data freshness + missing policy - - stage: S3_features - owner: Python canonical formulas - gate: spec/13_formula_registry.yaml + generated golden cases - - stage: S4_risk_and_portfolio - owner: Python - gate: aggregate_risk + portfolio_exposure + cash floor - - stage: S5_decision - owner: Python decision DAG - gate: spec/09_decision_flow.yaml + spec/routing/decision_graph.yaml - - stage: S6_execution_packet - owner: final_decision_packet - gate: spec/40_final_decision_packet_contract.yaml - - stage: S7_low_capability_pack - owner: context pack builder - gate: spec/46_low_capability_execution_pack.yaml - - stage: S8_report - owner: renderer - gate: renderer_no_calc + number provenance + report sync - authority_matrix: - AGENTS.md: 운영 인덱스만 담당. 세부 규칙을 직접 비대화하지 않는다. - governance/rules/*.yaml: 운영 규칙. 짧고 해시 검증 가능해야 한다. - spec/*.yaml: 계약·공식·게이트·출력 스키마의 최상위 권위. - src/quant_engine: canonical Python implementation. - tools/*.py: CLI wrapper와 audit/validation 도구. 핵심 투자 로직 금지. - gas_*.gs: thin adapter. 계산/판단 로직 제거 대상. - Temp/*.json|yaml: 런타임 산출물. 직접 편집 금지. - dist/: 배포 산출물. source of truth 금지. - prompts/: 렌더링 지시. 숫자 생성 금지. - tests/: golden, parity, regression, replay 검증 담당. - proposed_new_or_updated_files: - - spec/48_engine_refactor_methodology.yaml - - spec/release/artifact_alias_registry.yaml - - spec/release/version_retirement_policy.yaml - - spec/release/low_capability_context_aliases.yaml - - tools/validate_release_dag_inputs_exist_v1.py - - tools/build_runtime_artifact_aliases_v1.py - - tools/audit_version_sprawl_v1.py - - tools/validate_factor_lifecycle_completeness_v2.py - - tools/validate_gas_forbidden_logic_ratio_v2.py - - tools/validate_llm_no_numeric_generation_v1.py - - src/quant_engine/core/pipeline_context.py - - src/quant_engine/core/decision_packet.py - - src/quant_engine/core/provenance.py - - src/quant_engine/core/artifact_resolver.py -hard_invariants: -- id: I001 - statement: LLM은 숫자를 계산하지 않는다. - validation: validate_llm_no_numeric_generation_v1.py -- id: I002 - statement: 모든 보고서 숫자는 source_path, json_pointer, formula_id, input_hash, freshness_status를 - 가져야 한다. - validation: validate_number_provenance_strict_v3.py -- id: I003 - statement: global_execution_gate != HTS_READY이면 주문표 출력 금지. - validation: validate_execution_authority_matrix_v2.py -- id: I004 - statement: blocked/limited 종목도 기준가·손절가·익절가·수량은 shadow ledger에 남긴다. - validation: validate_shadow_ledger_contract_v1.py -- id: I005 - statement: GAS에는 decision/sizing/stop/take_profit/risk_score 계산을 두지 않는다. - validation: validate_gas_forbidden_logic_ratio_v2.py -- id: I006 - statement: 새 팩터는 lifecycle 필드 14개를 모두 갖기 전 active 금지. - validation: validate_factor_lifecycle_completeness_v2.py -- id: I007 - statement: release DAG의 모든 inputs는 실행 전 존재하거나 upstream node outputs로 선언되어야 한다. - validation: validate_release_dag_inputs_exist_v1.py -- id: I008 - statement: renderer_calculation_count는 0이어야 한다. - validation: validate_renderer_no_calculation_v1.py -- id: I009 - statement: Temp 산출물 버전은 alias registry를 통해서만 읽는다. - validation: validate_runtime_source_whitelist_v1.py -- id: I010 - statement: replay 성과와 live 운영 성과를 혼입하지 않는다. - validation: validate_no_replay_live_mix_v2.py -scorecard_formulas: - release_readiness_score: - formula: 0.30*dag_pass + 0.20*data_integrity + 0.15*provenance_pass + 0.15*schema_model_parity - + 0.10*golden_coverage + 0.10*gas_thin_adapter_score - target: 100 - block_if_below: 95 - factor_activation_score: - formula: 0.25*expected_edge_stability + 0.20*drawdown_reduction + 0.20*late_entry_avoidance - + 0.15*data_quality + 0.10*turnover_cost_adjusted_edge + 0.10*conflict_penalty_inverse - target: '>= 75 for active, 60-74 shadow, <60 retire' - block_if: sample_count < 50 OR lookback_trading_days < 20 OR data_quality < 95 - repository_entropy_score: - formula: 100 - max(0,total_files/max_total_files-0.80)*100 - version_sprawl_penalty - - stale_temp_penalty - target: '>= 90' - current_comment: 총 파일 수는 예산 이내이나 tool version groups 35개가 실질 entropy 요인 - llm_reproducibility_score: - formula: 0.40*packet_section_completeness + 0.25*numeric_json_path_coverage + - 0.20*forbidden_phrase_absence + 0.15*golden_response_match - target: 100 - block_if_below: 98 -refactor_roadmap: -- phase: P0_release_dag_repair - priority: CRITICAL - goal: 풀 게이트가 파일명 drift 때문에 중단되지 않도록 artifact alias와 DAG input validation을 먼저 고친다. - why_first: 엔진이 아무리 좋아도 release DAG가 깨지면 저성능 LLM 실행팩이 생성되지 않고, 운영 보고서가 환각에 노출된다. - tasks: - - id: P0-T001 - title: release DAG input 존재성 검증기를 추가 - method: spec/41_release_dag.yaml의 모든 node.inputs를 읽어 존재하지 않는 파일을 목록화한다. 단, upstream - outputs로 선언된 파일은 허용한다. - files_to_create: - - tools/validate_release_dag_inputs_exist_v1.py - commands: - - python tools/validate_release_dag_inputs_exist_v1.py --dag spec/41_release_dag.yaml - --strict - acceptance: - - missing_input_count == 0 - - orphan_temp_reference_count == 0 - status: completed - - id: P0-T002 - title: final_context_for_llm_v5 alias/빌더 확정 - method: Temp/final_context_for_llm_v4.yaml을 v5로 복사하지 말고 build_low_capability_context_pack_v5.py가 - 실제로 v5를 생성하도록 package DAG node를 연결한다. 임시 운영은 alias registry로 v4->v5 호환을 명시한다. - files_to_modify: - - tools/build_low_capability_context_pack_v5.py - - spec/41_release_dag.yaml - files_to_create: - - spec/release/low_capability_context_aliases.yaml - acceptance: - - Temp/final_context_for_llm_v5.yaml exists - - validate_low_capability PASS - - validate_llm_regression PASS - status: completed - - id: P0-T003 - title: live_replay_separation_v3, late_chase_attribution_v2, shadow_ledger_v2, - engine_health_card_v1 생성 노드 연결 - method: DAG가 요구하는 모든 Temp artifact에 대해 upstream builder 또는 alias를 명시한다. 존재하지 않는 - 산출물을 validator가 바로 읽는 구조를 금지한다. - files_to_modify: - - spec/41_release_dag.yaml - - tools/run_release_dag_v3.py - acceptance: - - all_dag_inputs_resolved == true - - python tools/run_release_dag_v3.py --mode release --strict returns PASS - status: completed -- phase: P1_repository_diet_and_version_retirement - priority: HIGH - goal: 많은 문서와 버전 파일을 active/shadow/retired로 정리해 저성능 LLM의 버전 선택 오류를 제거한다. - tasks: - - id: P1-T001 - title: version sprawl audit 도구 추가 - method: 파일명 _vN 패턴을 기준으로 active 최신, shadow 비교, retired archive 대상을 분류한다. active_manifest와 - spec aliases가 없는 버전 파일은 읽기 금지 후보로 표시한다. - files_to_create: - - tools/audit_version_sprawl_v1.py - - spec/release/version_retirement_policy.yaml - acceptance: - - unclassified_version_group_count == 0 - - active_version_per_rule <= 1 - status: completed - - id: P1-T002 - title: AGENTS.md를 운영 인덱스로 고정하고 세부 규칙은 governance/rules로 이동 - method: AGENTS.md는 120줄 이하 목표. 세부 규칙은 governance/rules/*.yaml에 남기고 agents_rule_hashes로 - 해시 검증한다. - files_to_modify: - - AGENTS.md - - governance/agents_index.yaml - - governance/agents_rule_hashes.yaml - commands: - - python tools/validate_agents_shrink_v1.py - acceptance: - - agents_md_line_count <= 120 - - agents_hash_match_pct == 100 - status: completed - - id: P1-T003 - title: tools/*.py 핵심 로직 제거와 src/quant_engine 이전 - method: tools는 argparse wrapper만 남긴다. 순수 함수·공식·판단 로직은 src/quant_engine/core 또는 - src/quant_engine/formulas로 이전한다. - acceptance: - - tools_business_logic_function_count 감소 - - src_import_coverage 증가 - - unit tests remain PASS - status: completed -- phase: P2_spec_as_code_contract_unification - priority: HIGH - goal: 공식·필드·출력·리스크 계약을 기계 검증 가능한 단일 체계로 묶는다. - tasks: - - id: P2-T001 - title: formula registry domain split와 canonical index 동기화 - method: spec/13_formula_registry.yaml은 index와 execution_order만 보유. 세부 공식은 spec/formulas/domains/*.yaml로 - 나누되 compile_formula_registry가 단일 registry를 재생성한다. - files_to_modify: - - spec/13_formula_registry.yaml - - spec/formulas/domains/*.yaml - - src/quant_engine/compile_formula_registry_v1.py - acceptance: - - compiled_registry_hash stable - - formula_count == generated_formula_count == golden_case_count - status: completed - - id: P2-T002 - title: output field owner ledger 100% 강제 - method: 모든 output field는 단일 formula owner를 갖는다. owner 충돌 시 release FAIL. - commands: - - python tools/validate_output_field_ownership_v1.py --strict - acceptance: - - owned_output_field_pct == 100.0 - - authority_collision_count == 0 - status: completed - - id: P2-T003 - title: registered formulas not in primary execution order를 lifecycle로 분류 - method: execution_order에 없는 100개 공식은 runtime_supplement, renderer_only, deprecated, - experimental, shadow_only 중 하나로 분류한다. - files_to_create: - - spec/formula_lifecycle_index.yaml - acceptance: - - unclassified_formula_count == 0 - - deprecated_formula_runtime_reference_count == 0 - status: completed -- phase: P3_gas_thin_adapter_migration - priority: HIGH - goal: GAS 20,423라인을 수집/정규화/표시로 제한하고, 판단·사이징·리스크 계산은 Python으로 완전 이전한다. - tasks: - - id: P3-T001 - title: GAS forbidden logic ratio 측정 - method: function 단위로 키워드 decision, score, risk, stop, takeProfit, size, gate, - verdict를 스캔하고 허용 예외를 분리한다. - files_to_create: - - tools/validate_gas_forbidden_logic_ratio_v2.py - acceptance: - - gas_forbidden_logic_ratio <= 0.05 - - forbidden_responsibility_function_count == 0 before active release - status: completed - - id: P3-T002 - title: gas_data_feed.gs 분할 및 adapter parts 정리 - method: 10,302라인/177함수 파일을 collect, normalize, export, display 모듈로 분해하고, business - logic은 src/quant_engine로 이동한다. - files_to_modify: - - gas_data_feed.gs - - src/gas_adapter_parts/* - acceptance: - - largest_gs_file_lines <= 3000 - - GAS call arity validation PASS - status: completed - - id: P3-T003 - title: GAS/Python parity golden test - method: GAS가 산출한 원자료와 Python이 산출한 final packet의 key fields를 샘플별로 대조한다. - commands: - - node tools/run_gas_golden_parity.js - - python tools/validate_gas_thin_adapter_v1.py - acceptance: - - gas_python_parity_pct == 100 - - business_logic_in_gas_count == 0 - status: completed -- phase: P4_factor_lifecycle_and_anti_late_entry_upgrade - priority: HIGH - goal: 뒷북 매수/설거지 매도를 막기 위해 신규 팩터를 shadow 성과 기반으로만 active 승격한다. - tasks: - - id: P4-T001 - title: 팩터 lifecycle 14필드 강제 - method: spec/43_quant_factor_taxonomy.yaml의 required_lifecycle_fields를 모든 팩터에 - 적용한다. - files_to_create: - - tools/validate_factor_lifecycle_completeness_v2.py - acceptance: - - factor_lifecycle_completeness_pct == 100 - status: completed - - id: P4-T002 - title: anti-late-entry gate를 price extension + volume climax + smart money divergence로 - 삼중화 - method: 신고가 추격 매수는 20D/60D 이격, 당일 거래대금 과열, 외국인/기관 순매수 둔화, 윗꼬리/갭상승 피로도를 합산해 차단한다. - files_to_modify: - - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - - spec/13_formula_registry.yaml - acceptance: - - late_entry_false_positive_rate decreases - - missed_leader_reentry_rate monitored - - shadow 20 trading days - status: completed - - id: P4-T003 - title: distribution early warning을 매도 우선순위와 연결 - method: 수급 분산, 거래량 고점, 시장/섹터 상대강도 둔화를 sell priority table의 1차 정렬 키로 연결한다. - acceptance: - - sell_candidate_count>=2이면 sell priority table 먼저 출력 - - profit_giveback_reduction measured - status: completed -- phase: P5_low_capability_llm_execution_pack - priority: CRITICAL - goal: 저성능 LLM도 숫자를 만들지 않고 packet을 복사·요약만 하게 만든다. - tasks: - - id: P5-T001 - title: final_context_for_llm_v5 고정 섹션 구현 - method: executive, blockers, action_table, shadow_ledger, data_missing, education_notes - 순서를 강제한다. 각 숫자 필드는 value, unit, json_path, formula_id를 포함한다. - files_to_modify: - - tools/build_low_capability_context_pack_v5.py - - spec/46_low_capability_execution_pack.yaml - acceptance: - - required_sections_present_pct == 100 - - numeric_json_path_coverage == 100 - status: completed - - id: P5-T002 - title: LLM 응답 golden regression 추가 - method: 동일 final_context에 대해 sample_response.json과 섹션/금지문구/숫자 경로 일치를 검증한다. - commands: - - python tools/run_low_capability_llm_regression_v1.py --strict - acceptance: - - golden_response_match_pct >= 98 - - llm_generated_number_count == 0 - status: completed - - id: P5-T003 - title: blocked 상태 주문표 누출 차단 - method: global_execution_gate가 HTS_READY가 아니면 order table 대신 shadow ledger와 no_order_notice만 - 렌더한다. - acceptance: - - hidden_order_leak_count == 0 - - blocked_actions_rendered == true - status: completed -- phase: P6_observability_and_feedback_loop - priority: MEDIUM - goal: 엔진이 실제로 예측을 맞히는지, 수익을 지키는지 매주 수치로 평가한다. - tasks: - - id: P6-T001 - title: prediction/outcome ledger와 proposal evaluation history 연결 - method: 추천 시점의 signal, price, stop, target, gate, confidence를 저장하고 D+1/D+5/D+20 - 성과를 outcome으로 붙인다. - commands: - - npm run daily-feedback-report - acceptance: - - prediction_match_rate_pct tracked - - edge_by_factor table exists - - live/replay separated - status: completed - - id: P6-T002 - title: engine health card 생성 - method: release readiness, data integrity, provenance, prediction accuracy, gas - thinness, entropy score를 한 장으로 만든다. - files_to_create: - - tools/build_engine_health_card_v1.py - acceptance: - - Temp/engine_health_card_v1.json exists - - health_score >= 95 for release - status: completed - - id: P6-T003 - title: 월 1/11/21 중간점검과 주말 리밸런싱을 운영 캘린더에 코드화 - method: spec/operating_cadence.yaml에 날짜 규칙을 두고 report renderer가 해당 날짜에 중간점검/리밸런싱 - 섹션을 강제한다. - acceptance: - - cadence_section_missing_count == 0 - status: completed -low_capability_llm_todo_protocol: - purpose: 저성능 LLM이 아래 순서만 수행하면 동일한 판단을 재현한다. - mandatory_order: - - 1_read_AGENTS_md_index_only - - 2_read_runtime_active_artifact_manifest - - 3_resolve_final_decision_packet_active_alias - - 4_read_final_context_for_llm_v5_only - - 5_copy_numbers_with_json_path_only - - 6_apply_execution_authority_matrix - - 7_render_fixed_sections - - 8_emit_DATA_MISSING_for_any_gap - - 9_never_invent_price_qty_tp_sl_score - - 10_never_override_harness_gate - input_whitelist: - - runtime/active_artifact_manifest.yaml - - Temp/final_decision_packet_active.json - - Temp/final_context_for_llm_v5.yaml - - Temp/operational_report.json - - Temp/number_provenance_ledger_v4.json - - spec/31_low_capability_llm_response_contract.yaml - - spec/execution_authority_matrix_v2.yaml - output_sections_fixed: - - source_summary - - portfolio_health - - blockers - - allowed_actions - - blocked_actions - - action_table_or_shadow_ledger - - data_missing - - education_notes - - todo_yaml - - no_order_notice - forbidden: - - freeform target price - - freeform quantity - - 임의 손절/익절 산출 - - 하네스 미제공 수치 보간 - - blocked 상태에서 주문표 생성 - - replay 성과를 live 성과처럼 표현 - copy_rule: 숫자는 value/unit/json_path/formula_id가 함께 있는 필드만 복사한다. 없으면 DATA_MISSING으로 - 표시한다. -algorithm_governance_todo: -- id: AG-T001 - category: new_factor_intake - instruction: 새 투자 아이디어는 즉시 공식화하지 말고 factor_intake.yaml에 가설, 대상 시장, 적용 국면, 기대 엣지, - 실패 조건부터 적는다. - template_fields: - - factor_id - - hypothesis - - horizon - - decay_half_life - - input_fields - - expected_edge_formula - - conflict_precedence - - activation_threshold - - retirement_condition - - owner - done_when: validate_factor_lifecycle_completeness_v2.py PASS -- id: AG-T002 - category: activation_gate - instruction: shadow 기간 없이 active 금지. 최소 20거래일 또는 50건 신호, 데이터 품질 95 이상, turnover - cost 차감 후 edge 양수여야 한다. - done_when: factor_activation_score >= 75 -- id: AG-T003 - category: conflict_resolution - instruction: 수급·모멘텀은 매수 신호라도 데이터 품질, 현금 방어선, 시장위험, 손절 총위험, anti-late-entry gate보다 - 우선할 수 없다. - precedence_order: - - data_quality - - portfolio_health - - cash - - heat - - stop_tp - - anti_chase - - regime - - sector_beta - - style - - sizing - - execution -- id: AG-T004 - category: overfitting_brake - instruction: 새 팩터가 기존 팩터와 0.80 이상 상관이면 통합하거나 폐기한다. 같은 현상을 이름만 바꿔 추가하지 않는다. - done_when: factor_correlation_collision_count == 0 -- id: AG-T005 - category: profit_preservation - instruction: 수익 발생 후에는 신규 알파보다 giveback 방지가 우선이다. trailing stop, profit ratchet, - distribution warning을 sell waterfall에 먼저 반영한다. - done_when: profit_giveback_after_peak_pct decreases over 20D evaluation -developer_todo_backlog: -- id: DEV-001 - priority: P0 - task: tools/validate_release_dag_inputs_exist_v1.py 작성 - exact_steps: - - YAML 파서로 spec/41_release_dag.yaml 로드 - - 모든 node.inputs 수집 - - 모든 node.outputs 수집 - - input이 파일로 존재하지 않고 outputs에도 없으면 missing으로 기록 - - --strict이면 missing_count>0에서 exit 1 - acceptance: missing_input_count == 0 -- id: DEV-002 - priority: P0 - task: Temp/final_context_for_llm_v5.yaml 생성 경로 복구 - exact_steps: - - build_low_capability_context_pack_v5.py가 존재하면 출력 경로를 v5로 고정 - - 없으면 build_final_context_for_llm_v4.py를 wrapper로 호출하되 schema_version을 v5로 승격하지 - 말고 compatibility_alias에 기록 - - spec/41_release_dag.yaml validate_low_capability input과 builder output 일치 - acceptance: validate_low_capability PASS -- id: DEV-003 - priority: P0 - task: release DAG에 missing artifact upstream builder 연결 - exact_steps: - - live_replay_separation_v3 builder 확인 - - late_chase_attribution_v2 builder 확인 - - shadow_ledger_v2 builder 확인 - - engine_health_card_v1 builder 추가 - - DAG depends_on 순서 갱신 - acceptance: run_release_dag_v3 release strict PASS -- id: DEV-004 - priority: P1 - task: version_sprawl_audit 구현 - exact_steps: - - _vN 패턴 그룹화 - - manifest/aliases에 active로 지정된 최신 하나만 허용 - - 나머지는 shadow 또는 retired로 분류 - - unclassified는 release fail - acceptance: unclassified_version_group_count == 0 -- id: DEV-005 - priority: P1 - task: GAS forbidden logic scanner 구현 - exact_steps: - - gas_*.gs function body 추출 - - forbidden 키워드 decision/sizing/stop/take_profit/risk_score/verdict 스캔 - - allowed exception table 적용 - - 파일별 forbidden_count와 ratio 출력 - acceptance: forbidden_count == 0 or approved_exception_count only -- id: DEV-006 - priority: P1 - task: tools business logic src 이전 - exact_steps: - - tools/*.py에서 순수 계산 함수 탐지 - - src/quant_engine/core로 이동 - - tools는 import 후 CLI만 수행 - - 기존 명령어 backward compatibility 유지 - acceptance: unit/parity tests PASS -- id: DEV-007 - priority: P1 - task: formula lifecycle index 생성 - exact_steps: - - spec/13_formula_registry.yaml의 모든 formula_id 수집 - - execution_order 포함 여부 계산 - - 각 formula에 active/shadow/experimental/deprecated/runtime_supplement 지정 - - deprecated runtime reference 차단 - acceptance: unclassified_formula_count == 0 -- id: DEV-008 - priority: P2 - task: llm numeric generation validator 구현 - exact_steps: - - operational_report.md의 모든 숫자 토큰 추출 - - number_provenance_ledger와 매칭 - - 매칭 불가 숫자 허용목록 제외 후 fail - - 문장 내 target/stop/qty가 provenance 없으면 fail - acceptance: unprovenanced_number_count == 0 -- id: DEV-009 - priority: P2 - task: final decision packet contract 강화 - exact_steps: - - action_table 각 행에 gate_status, reason_code, price_fields, qty_fields, provenance - 포함 - - blocked row도 shadow_ledger_ref 포함 - - schema validation 추가 - acceptance: final_packet_schema_validation PASS -- id: DEV-010 - priority: P2 - task: engine health card builder 작성 - exact_steps: - - release_dag_run_v3, active_manifest, number_provenance, prediction_accuracy, gas_thin_adapter, - entropy audit 입력 - - health_score 계산 - - critical_blockers 배열 출력 - acceptance: Temp/engine_health_card_v1.json exists -- id: DEV-011 - priority: P2 - task: factor activation dashboard 구현 - exact_steps: - - proposal_evaluation_history에서 factor별 D+1/D+5/D+20 edge 집계 - - turnover cost 차감 - - drawdown/giveback 계산 - - active/shadow/retire 추천 - acceptance: factor_activation_score per factor exists -- id: DEV-012 - priority: P3 - task: repository diet policy 적용 - exact_steps: - - Temp stale artifact archive - - docs 중복 ADR 통합 - - dist 대용량 yaml은 source whitelist 제외 - - package zip whitelist 갱신 - acceptance: repo_entropy_score >= 90 -pm_execution_plan: - week_1: - - P0 release DAG repair - - final_context_for_llm_v5 생성 - - DAG input validator - - engine_health_card skeleton - week_2: - - version sprawl audit - - formula lifecycle index - - LLM numeric validator - - low capability regression - week_3: - - GAS forbidden scanner - - gas_data_feed.gs 분할 시작 - - tools business logic src 이전 1차 - week_4: - - factor activation dashboard - - anti-late-entry 삼중 게이트 shadow - - sell waterfall distribution 연결 - monthly_review: - - 1일/11일/21일 중간점검 자동 섹션 검증 - - 성과·오탐·미탐·수익보존 지표 검토 - - retire 대상 팩터 제거 -release_gate_commands_target: -- python tools/validate_release_dag_inputs_exist_v1.py --dag spec/41_release_dag.yaml - --strict -- python tools/validate_specs.py -- python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml - --strict -- python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json - --report Temp/operational_report.md -- python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v5.yaml - --contract spec/46_low_capability_execution_pack.yaml -- python tools/validate_golden_coverage_100.py -- python tools/validate_schema_model_generation_v1.py -- python tools/validate_gas_thin_adapter_v1.py -- python tools/validate_factor_lifecycle_completeness_v2.py --taxonomy spec/43_quant_factor_taxonomy.yaml -- python tools/validate_gas_forbidden_logic_ratio_v2.py --strict -- python tools/validate_llm_no_numeric_generation_v1.py --report Temp/operational_report.md - --ledger Temp/number_provenance_ledger_v4.json -- python tools/run_release_dag_v3.py --mode release --strict -definition_of_done: - engine_refactor_done: - - release DAG strict PASS - - final_context_for_llm_v5 존재 및 validate_low_capability PASS - - all DAG inputs resolved - - formula_count == generated_formula_count == golden_case_count - - number provenance coverage 100% - - renderer calculation count 0 - - GAS forbidden business logic count 0 또는 승인 예외만 존재 - - unclassified version group count 0 - - unclassified formula lifecycle count 0 - - low capability LLM regression >= 98% - - repository entropy score >= 90 - quant_engine_quality_done: - - prediction_match_rate_pct가 주간 리포트에 추적됨 - - late_entry false positive가 감소 추세 - - profit giveback after peak가 감소 추세 - - drawdown guard breach 후 대응이 shadow ledger에 기록됨 - - 신규 active 팩터는 모두 shadow evidence를 통과 -senior_architect_final_call: - decision: 지금 필요한 것은 기능 추가가 아니라 운영 하네스의 봉합과 단일 실행 경로 확정이다. - first_3_actions: - - release DAG missing input 5종 복구 - - final_context_for_llm_v5를 저성능 LLM의 유일한 입력팩으로 확정 - - version sprawl과 GAS forbidden logic을 수치로 측정해 active 경로에서 제거 - do_not_do: - - 새 팩터를 바로 active 추가하지 말 것 - - 깨진 DAG를 skip 옵션으로 우회하지 말 것 - - Temp 파일을 손으로 복사해 PASS처럼 보이게 하지 말 것 - - 보고서 문장을 늘려 문제를 해결하려 하지 말 것