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
