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/<formula>.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/<formula>.py
    - runtime/python/core/formulas/generated/<formula>.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_<formula_id_lower>(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
