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 반영 가능
