schema_version: quant_engine_structural_refactor_methodology_todo.v1.2026-06-07
language: ko-KR
document_type: contract_first_deterministic_quant_engine_refactor_todo
generated_at_kst: '2026-06-07T00:00:00+09:00'
download_filename: quant_engine_refactor_methodology_todo_20260607.yaml
purpose: 현재 .md, .yaml, .gs, .py 중심의 엔진을 지속 확장 가능한 구조로 재정렬한다. 저성능 LLM도 이 TODO만 순서대로 실행하면 고성능 LLM과 동일한 판단 패킷과 보고서를 만들도록 권위
  파일, 공식, 데이터, 하네스, 검증, 릴리스 절차를 단일화한다.
business_constants:
  target_asset_krw: 500000000
  default_investment_unit: weekly
  mandatory_weekly_rebalancing_days:
  - Saturday
  - Sunday
  mandatory_mid_month_review_days:
  - 1
  - 11
  - 21
  cash_defense_rule: D+2 정산예정 현금은 즉시현금 방어선 충족으로 간주
  llm_numeric_authority: LLM은 가격, 수량, 점수, TP, SL, 게이트를 생성하지 않고 하네스 값을 복사·해설만 한다.
source_basis:
  primary_policy: data_feed/AGENTS.md
  critical_read_order:
  - runtime/active_artifact_manifest.yaml
  - Temp/final_decision_packet_v3.json
  - spec/13_formula_registry.yaml
  - spec/12_field_dictionary.yaml
  - schemas/*.schema.json
  - governance/rules/*.yaml
  - spec/*.yaml
  current_hard_rules_from_agents:
  - 가격, 수량, TP, SL, 점수는 spec/13_formula_registry.yaml과 하네스 산출값만 사용한다.
  - 임의 계산, 임의 가격, 임의 수량, 미등록 공식은 금지한다.
  - 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요로만 표시한다.
  - 차단된 종목의 산출값은 숨기지 말고 shadow ledger에 남긴다.
  - Python canonical first, GAS adapter second 원칙을 따른다.
  - Temp/*.json은 런타임 산출물이며 직접 편집하지 않는다.
baseline_inventory_observed_from_zip:
  observed_total_files: 1623
  observed_extension_counts:
    .py: 717
    .json: 706
    .yaml: 137
    .md: 42
    .gs: 7
    .txt: 6
    .ps1: 4
    .jsonl: 2
    .log: 1
    .js: 1
  observed_top_directory_counts:
    Temp: 377
    src: 303
    tools: 266
    schemas: 160
    tests: 158
    runtime: 153
    spec: 104
    artifacts: 35
    governance: 24
    prompts: 9
    docs: 8
    examples: 8
  observed_python_distribution:
    runtime_generated_formula_py: 150
    src_quant_engine_py: 153
    tools_py: 261
    total_py_observed: 717
  observed_gas_files:
  - gas_apex_alpha_watch.gs
  - gas_apex_runtime_core.gs
  - gas_data_collect.gs
  - gas_data_feed.gs
  - gas_harness_rows.gs
  - gas_lib.gs
  - gas_report.gs
  observed_temp_duplicate_artifact_families_ge_3:
    count: 33
    examples:
      smart_cash_recovery: 7
      data_integrity_100_lock: 5
      horizon_routing_lock: 5
      canonical_metrics: 4
      final_execution_decision: 4
      prediction_accuracy_harness: 4
      engine_harness_gate_result: 3
      entry_freshness_gate: 3
  observed_package_json_scripts: 190
  observed_engine_gate_snapshot:
    engine_harness_gate_status: OK
    failed_checks_count: 0
    effective_formula_coverage_pct: 100.0
    gas_only_coverage_pct_observed: 58.56
    warn_only_measure_yaml_gs_ps_output: GAS-only/GS coverage warning exists; effective coverage is 100% because Python covers
      the missing formulas.
  observed_pass_100_snapshot:
    active_formula_id: PASS_100_CRITERIA_V3
    gate: BLOCK_EXECUTION
    score_0_100: 46.15
    passed_count: 6
    failed_count: 7
    hts_order_mode: THEORETICAL_ONLY
  observed_active_artifact_manifest_snapshot:
    formula_id: ACTIVE_ARTIFACT_MANIFEST_V2
    active_count_per_formula: 1
    authority_collision_count: 0
    stale_artifact_count: 0
    report_active_artifact_match_pct: 100.0
    single_truth_conflict_count: 0
senior_diagnosis:
  one_line: 엔진은 이미 하네스·커버리지·검증은 많이 갖췄지만, 산출물 버전 과다, 문서 분산, GAS/Python 책임 혼재, release-gate 비대화로 장기 유지보수 리스크가 커졌다.
  core_problem:
  - 알고리즘 자체보다 알고리즘을 변경·검증·폐기하는 운영체계가 더 중요해진 단계다.
  - Temp 산출물 버전이 많아지면 저성능 LLM은 최신 권위와 레거시 참조를 구분하지 못한다.
  - 190개 npm script는 강력하지만, 단일 release DAG와 실패 원인 맵이 없으면 절차가 파편화된다.
  - GAS가 7개 파일로 유지되지만 일부 파일은 과거 로직이 남을 가능성이 있어 thin adapter 정책을 강제해야 한다.
  - 보고서/프롬프트/규칙 문서가 분산될수록 narrative가 하네스 판단을 완화하거나 과장할 위험이 생긴다.
  target_state:
  - YAML은 계약·공식·정책·테스트 케이스의 유일한 인간 편집 원천으로 둔다.
  - Python은 모든 공식과 판단의 canonical implementation으로 둔다.
  - GAS는 collect, normalize, export, display만 수행하는 thin adapter로 둔다.
  - Markdown은 설명, ADR, runbook, prompt 용도만 허용하고 판단 권위를 갖지 않는다.
  - JSON은 runtime 산출물로만 취급하고 source of truth가 되지 않게 한다.
  - LLM은 final_decision_packet과 active_artifact_manifest를 읽어 렌더링만 한다.
recommended_methodology:
  name: 'CFD-QEOS: Contract-First Deterministic Quant Engineering Operating System'
  translation: 계약 우선·결정론적 퀀트 엔진 운영체계
  why_this_methodology:
  - 퀀트 엔진은 창의적 문서 작성 문제가 아니라 반복 가능한 산출물 생성 문제다.
  - 투자 판단은 경험칙이 아니라 입력 데이터, 공식, 게이트, 검증 결과의 함수여야 한다.
  - 저성능 LLM 호환성을 얻으려면 지시문을 늘리는 것이 아니라 자유도를 줄이고 입력·출력 계약을 고정해야 한다.
  - 장기 확장성은 새 팩터 추가 속도가 아니라 새 팩터가 기존 게이트와 충돌하지 않는지 증명하는 속도에서 나온다.
  five_non_negotiable_principles:
    P1_single_authority: 같은 의미의 필드는 active artifact가 1개만 존재해야 한다.
    P2_formula_registry_first: 새 숫자·점수·게이트는 먼저 formula registry에 등록하고, 단위·입력·결측 정책·owner·golden case를 명시한다.
    P3_python_canonical: 공식·판단·수량·TP/SL·리스크 스코어는 Python canonical 구현이 원본이다.
    P4_gas_thin_adapter: GAS는 외부 수집과 시트 입출력만 담당하며 투자 판단 로직을 보유하지 않는다.
    P5_renderer_no_calculation: Markdown 보고서와 LLM 응답은 계산하지 않고 final_decision_packet 값을 복사한다.
  allowed_source_extensions_policy:
    .yaml: contract, formula registry, data contract, policy, golden cases, release DAG, task plan
    .py: canonical engine, validator, builder, test, CLI wrapper
    .gs: Google Sheets/Apps Script thin adapter for collect-normalize-export-display only
    .md: runbook, ADR, doctrine, prompt, human explanation only; no numeric authority
    .json: generated runtime artifact only; do not hand-edit; not a durable source file
  canonical_dataflow:
  - raw_capture_or_sheet -> GAS collect/normalize/export
  - exported_data_json -> Python data contract validator
  - validated_data -> Python feature builders
  - features -> formula registry implementations
  - formula outputs -> gates and decision packet
  - decision packet -> active artifact manifest
  - manifest + packet -> report renderer
  - report renderer -> Markdown/LLM output with zero calculations
  release_lifecycle:
  - change_request_yaml 작성
  - ADR 또는 rule_lifecycle 항목 작성
  - spec/formula_registry 또는 relevant spec 갱신
  - schema/golden case 먼저 작성
  - Python canonical 구현
  - GAS adapter는 필요할 때만 thin wrapper 갱신
  - unit/parity/regression/e2e 검증
  - shadow ledger에서 N회 운용
  - performance readiness 기준 충족 시 active manifest 승격
  - 레거시 산출물은 legacy_reference_only로 잠그고 보고서 렌더링 차단
target_repository_structure:
  AGENTS.md: 운영 헌법과 읽기 순서만 유지. 장문 규칙은 governance/rules와 spec으로 이동.
  spec/:
    role: source of truth for contracts, formulas, gates, schemas, field dictionary
    must_contain:
    - 00_execution_contract.yaml
    - 02_data_contract.yaml
    - 09_decision_flow.yaml
    - 12_field_dictionary.yaml
    - 13_formula_registry.yaml
    - risk/*.yaml
    - strategy/*.yaml
    - execution/*.yaml
    must_not_contain:
    - runtime outputs
    - temporary audit outputs
    - duplicated narrative prompts
  src/quant_engine/:
    role: canonical Python package
    proposed_modules:
    - data_contracts/
    - features/
    - formulas/
    - gates/
    - portfolio/
    - execution/
    - reporting/
    - evaluation/
    - adapters/
  tools/: thin CLI wrappers only; business logic must import src.quant_engine modules.
  gas_*.gs: collect/normalize/export/display only; forbidden decision logic count must trend to zero.
  governance/: ADR, change requests, rule lifecycle, authority matrix, release policy.
  tests/: unit, parity, golden, regression, integration, e2e, leak, deterministic replay.
  runtime/: active manifest and runtime config; no hand editing.
  Temp/: generated artifacts only; no manual source authority; cleanup policy required.
  prompts/: renderer prompts only; prompts cannot define formulas or override gates.
  docs/: doctrine and runbook only; docs must cite spec IDs rather than redefining rules.
governance_score_formulas:
  authority_integrity_score:
    formula: 100 - 25*authority_collision_count - 10*stale_artifact_count - 10*legacy_reference_render_blocked_count - 5*duplicate_active_formula_count
    pass_threshold: 100
    block_threshold: < 95
  llm_hallucination_risk_score:
    formula: 20*missing_provenance_number_count + 15*renderer_calculation_count + 10*free_text_override_count + 10*data_missing_hidden_count
    pass_threshold: 0
    block_threshold: '> 0'
  formula_implementation_score:
    formula: 100 * implemented_formula_count / registered_formula_count
    pass_threshold: 100
  low_capability_reproducibility_score:
    formula: 100 - 20*non_deterministic_output_count - 10*ambiguous_instruction_count - 10*manual_selection_count - 10*missing_acceptance_test_count
    pass_threshold: 100
  quant_performance_readiness_score:
    formula: min(data_maturity_score, live_sample_score, prediction_quality_score, drawdown_control_score, execution_quality_score)
    pass_threshold: 90
    note: 평균이 아니라 최저축 기준. 약한 축 하나가 있으면 실전 승격 불가.
harness_suite_to_standardize:
- harness_id: H01_DATA_CONTRACT_GATE
  purpose: 필수 컬럼, 타입, 단위, 통화, 날짜, 원천, 결측 정책 검증
  block_if:
  - missing_critical_field_count > 0
  - schema_presence_score < 100
  - stale_data_ratio > 0
- harness_id: H02_FORMULA_REGISTRY_GATE
  purpose: 모든 공식이 registry, Python implementation, golden case, owner ledger를 갖는지 검증
  block_if:
  - unmapped_formula_count > 0
  - implementation_coverage_pct < 100
- harness_id: H03_SINGLE_TRUTH_GATE
  purpose: 동일 필드가 여러 active artifact에 존재하는지 검증
  block_if:
  - authority_collision_count > 0
  - single_truth_conflict_count > 0
- harness_id: H04_DETERMINISTIC_REPLAY_GATE
  purpose: 같은 입력 해시에서 같은 final_decision_packet이 나오는지 검증
  block_if:
  - decision_reproducibility_score < 1.0
- harness_id: H05_NO_LEAKAGE_GATE
  purpose: T+5/T+20 결과값이 신호 생성 시점 입력에 섞이지 않았는지 검증
  block_if:
  - future_leakage_count > 0
  - train_test_overlap_count > 0
- harness_id: H06_PERFORMANCE_READINESS_GATE
  purpose: 리플레이와 라이브 표본을 분리해 실제 승격 가능성을 평가
  block_if:
  - live_t20_count < 30
  - performance_readiness_score < 90
- harness_id: H07_EXECUTION_PRECEDENCE_GATE
  purpose: 하위 엔진 허용값이 최종 HTS 권한을 침범하지 못하게 차단
  block_if:
  - global_execution_gate != HTS_READY and hts_order_count > 0
  - misleading_execution_allowed_count > 0
- harness_id: H08_GAS_THIN_ADAPTER_GATE
  purpose: GAS 파일에 decision/sizing/stop/take_profit/risk_score 로직이 남아 있는지 검출
  block_if:
  - gas_forbidden_logic_count > 0
- harness_id: H09_RENDERER_NO_CALC_GATE
  purpose: 보고서와 LLM 응답의 임의 계산, 숫자 창작, 게이트 완화 표현 차단
  block_if:
  - renderer_calculation_count > 0
  - unproven_number_count > 0
- harness_id: H10_RELEASE_DAG_GATE
  purpose: 190개 스크립트를 단일 release graph로 정렬하고 선행 실패를 명확히 보고
  block_if:
  - release_dag_cycle_count > 0
  - required_gate_missing_count > 0
refactor_todo:
- id: P0-001
  priority: P0
  title: Source Authority Collapse — 파일 권위 체계 4계층으로 축소
  problem: 문서와 산출물이 많아지면서 저성능 LLM이 spec, prompt, Temp artifact, report 중 무엇이 최신 권위인지 혼동할 수 있다.
  methodology: repo_cartography + authority_matrix + runtime_manifest_lock
  target_state: 권위는 spec YAML, 구현은 Python, 어댑터는 GAS, 설명은 Markdown으로 분리하고 JSON은 생성물로만 둔다.
  files_to_create_or_modify:
  - AGENTS.md
  - governance/authority_matrix.yaml
  - runtime/active_artifact_manifest.yaml
  - tools/validate_source_authority_collapse_v1.py
  step_by_step_for_low_capability_llm:
  - 모든 파일을 extension과 directory 기준으로 분류한다.
  - .yaml 파일은 contract/formula/policy/golden_case/release_dag 중 하나의 role을 부여한다.
  - .py 파일은 canonical_module, cli_wrapper, validator, generated_model 중 하나의 role을 부여한다.
  - .gs 파일은 collect, normalize, export, display 외 role이 있으면 forbidden으로 표시한다.
  - .md 파일은 doctrine, ADR, runbook, prompt 중 하나의 role만 허용한다.
  - role이 없는 파일은 quarantine_candidate로 기록하고 runtime에서 읽지 않는다.
  - active_artifact_manifest는 final_decision_packet과 canonical artifact만 참조하게 한다.
  acceptance_tests:
  - python tools/validate_source_authority_collapse_v1.py --root . --out Temp/source_authority_collapse_v1.json
  - Temp/source_authority_collapse_v1.json.unclassified_source_file_count == 0
  - Temp/source_authority_collapse_v1.json.json_source_authority_count == 0
  - Temp/source_authority_collapse_v1.json.markdown_numeric_authority_count == 0
  completion_metric: authority_integrity_score == 100
  fail_policy: FAIL이면 보고서는 RELEASE_BLOCKED_BY_AUTHORITY_AMBIGUITY로 시작하고 신규 기능 병합 금지.
  depends_on: []
- id: P0-002
  priority: P0
  title: Formula Registry V2 — 모든 숫자의 owner, 단위, 입력, 결측, 구현 연결
  problem: 공식 수가 늘어날수록 미등록 숫자와 임의 계산이 가장 큰 홀루시네이션 원인이 된다.
  methodology: formula_contract_before_implementation
  target_state: spec/13_formula_registry.yaml 하나로 모든 점수·가격·수량·게이트·리스크 지표의 권위를 고정한다.
  files_to_create_or_modify:
  - spec/13_formula_registry.yaml
  - spec/03_formulas/output_field_owner_ledger.yaml
  - tools/validate_formula_registry_v2.py
  - tests/golden/formula_registry_v2_cases.yaml
  step_by_step_for_low_capability_llm:
  - 각 formula_id에 purpose, owner, inputs, input_units, output_unit, missing_policy, stale_policy, python_impl, golden_case_id,
    report_fields를 추가한다.
  - 공식이 가격을 내면 tick_normalizer 공식 ID를 반드시 연결한다.
  - 공식이 수량을 내면 position_sizing 또는 execution_contract 공식 ID를 반드시 연결한다.
  - 공식이 게이트를 내면 fail_policy와 downstream_block_targets를 반드시 연결한다.
  - report_fields에 없는 숫자는 Markdown 보고서에 출력하지 않는다.
  - formula registry에 없는 숫자는 DATA_MISSING이 아니라 FORMULA_UNREGISTERED로 차단한다.
  acceptance_tests:
  - python tools/validate_formula_registry_v2.py --registry spec/13_formula_registry.yaml
  - unowned_formula_count == 0
  - missing_python_impl_count == 0
  - missing_golden_case_count == 0
  - unregistered_report_number_count == 0
  completion_metric: formula_implementation_score == 100
  fail_policy: FAIL이면 해당 공식 산출물은 active manifest 승격 금지. 보고서에는 FORMULA_UNREGISTERED만 출력.
  depends_on:
  - P0-001
- id: P0-003
  priority: P0
  title: Decision Packet Monolith — 최종 판단 패킷 하나만 보고서 입력으로 허용
  problem: 보고서가 여러 Temp 산출물을 직접 읽으면 최신값/레거시값이 섞이고 수치 충돌이 발생한다.
  methodology: single_packet_rendering + provenance_lock
  target_state: 보고서 렌더러는 Temp/final_decision_packet_v4.json 또는 active manifest가 지정한 단일 패킷만 읽는다.
  files_to_create_or_modify:
  - spec/40_final_decision_packet_contract.yaml
  - tools/build_final_decision_packet_v4.py
  - tools/validate_final_decision_packet_v4.py
  - tools/render_operational_report.py
  step_by_step_for_low_capability_llm:
  - final_decision_packet_contract에 executive, portfolio, ticker, risk, execution, performance, data_quality 섹션을 정의한다.
  - 각 섹션의 모든 숫자는 source_path, json_pointer, formula_id, input_hash를 갖게 한다.
  - render_operational_report.py에서 Temp 하위 artifact 직접 읽기를 제거한다.
  - 렌더러가 추가 데이터가 필요하면 packet에 필드를 먼저 추가하고 다시 빌드한다.
  - legacy artifact는 packet builder만 읽을 수 있고 report renderer는 읽지 못하게 한다.
  acceptance_tests:
  - python tools/validate_final_decision_packet_v4.py --packet Temp/final_decision_packet_v4.json
  - python tools/validate_renderer_reads_packet_only_v1.py --renderer tools/render_operational_report.py
  - direct_temp_artifact_read_count_in_renderer == 0
  - packet_field_provenance_coverage_pct == 100
  completion_metric: packet_provenance_coverage_pct == 100 and direct_temp_read_count == 0
  fail_policy: FAIL이면 Markdown 생성 차단. LLM 응답은 final_decision_packet_missing_or_invalid만 표시.
  depends_on:
  - P0-001
  - P0-002
- id: P0-004
  priority: P0
  title: Release DAG V1 — 190개 script를 단일 유향 비순환 그래프로 정렬
  problem: 스크립트가 많으면 검증은 많은데 어떤 실패가 상위 실패인지 알기 어렵고, 저성능 LLM은 순서를 흔든다.
  methodology: DAG_orchestration + fail_fast_root_cause
  target_state: release_dag.yaml에 build, validate, render, package 단계를 명시하고 npm script는 DAG executor 하나로 수렴한다.
  files_to_create_or_modify:
  - spec/41_release_dag.yaml
  - tools/run_release_dag_v1.py
  - tools/validate_release_dag_v1.py
  - package.json
  step_by_step_for_low_capability_llm:
  - package.json scripts를 inventory로 추출한다.
  - 각 script를 build, validate, render, package, utility 중 하나로 분류한다.
  - script 간 depends_on을 release_dag.yaml에 명시한다.
  - DAG에 cycle이 있으면 즉시 실패 처리한다.
  - 동일 산출물을 여러 script가 만들면 artifact_owner를 1개만 남긴다.
  - npm run full-gate는 python tools/run_release_dag_v1.py --mode release 호출로 축소한다.
  acceptance_tests:
  - python tools/validate_release_dag_v1.py --dag spec/41_release_dag.yaml --package package.json
  - release_dag_cycle_count == 0
  - orphan_script_count == 0
  - duplicate_artifact_owner_count == 0
  - release_mode_required_gate_missing_count == 0
  completion_metric: release_dag_health_score == 100
  fail_policy: FAIL이면 release-gate 실행 금지. 가장 앞선 실패 노드 1개와 downstream skipped 목록만 출력.
  depends_on:
  - P0-001
- id: P0-005
  priority: P0
  title: Temp Artifact Retirement — 산출물 버전 과다 정리와 active/legacy 격리
  problem: Temp에 동일 family의 v1~vN 산출물이 누적되어 최신 권위와 참고용 레거시가 섞일 위험이 있다.
  methodology: active_manifest + quarantine_before_delete
  target_state: active artifact는 formula_id별 1개만 runtime에서 읽고, 나머지는 legacy_reference_only 또는 archive로 이동한다.
  files_to_create_or_modify:
  - tools/build_artifact_retirement_plan_v1.py
  - tools/validate_artifact_retirement_v1.py
  - runtime/active_artifact_manifest.yaml
  - governance/rules/05_migration_hashes.yaml
  step_by_step_for_low_capability_llm:
  - Temp/*.json, Temp/*.yaml, Temp/*.md 파일을 formula family별로 그룹화한다.
  - 각 family에서 active artifact 1개를 active_artifact_manifest와 비교한다.
  - active가 아닌 파일은 legacy_reference_only, archive_candidate, delete_candidate 중 하나로 분류한다.
  - 보고서와 LLM이 legacy_reference_only를 직접 읽으면 stale_artifact_count를 증가시킨다.
  - 아카이브 전 파일 hash를 governance/rules/05_migration_hashes.yaml에 남긴다.
  - delete는 하지 말고 1차는 quarantine manifest만 만든다.
  acceptance_tests:
  - python tools/build_artifact_retirement_plan_v1.py --temp Temp --manifest runtime/active_artifact_manifest.yaml --out Temp/artifact_retirement_plan_v1.json
  - python tools/validate_artifact_retirement_v1.py --plan Temp/artifact_retirement_plan_v1.json
  - active_count_per_formula == 1
  - report_legacy_direct_read_count == 0
  - authority_collision_count == 0
  completion_metric: active_count_per_formula == 1 and stale_artifact_count == 0
  fail_policy: FAIL이면 legacy artifact가 포함된 보고서 렌더링 차단.
  depends_on:
  - P0-003
- id: P0-006
  priority: P0
  title: GAS Thin Adapter Migration — Apps Script에서 판단 로직 제거
  problem: GAS와 Python이 동시에 판단하면 같은 공식의 결과가 미세하게 갈라지고 디버깅 비용이 폭증한다.
  methodology: extract_business_logic_to_python + adapter_parity_test
  target_state: GAS는 collect, normalize, export, display만 수행하고 decision/sizing/stop/take_profit/risk_score는 Python으로 이전한다.
  files_to_create_or_modify:
  - spec/39_gas_thin_adapter_policy.yaml
  - tools/audit_gas_business_logic_v2.py
  - tools/validate_gas_thin_adapter_v2.py
  - gas_*.gs
  - src/quant_engine/adapters/google_sheets.py
  step_by_step_for_low_capability_llm:
  - GAS 모든 함수를 파싱해 함수명, 호출자, 키워드, 라인 수를 추출한다.
  - decision, sizing, stop_loss, take_profit, risk_score, score, gate 키워드를 forbidden 후보로 분류한다.
  - forbidden 후보가 실제 투자 판단이면 Python src/quant_engine 모듈로 이관한다.
  - GAS에는 Python 산출물 또는 시트 값을 읽고 표시하는 wrapper만 남긴다.
  - GAS 라인 수 감소보다 forbidden_logic_count 감소를 KPI로 삼는다.
  - 이관 후 동일 입력에서 GAS 표시값과 Python packet 값의 parity를 검사한다.
  acceptance_tests:
  - python tools/audit_gas_business_logic_v2.py --root . --out Temp/gas_business_logic_audit_v2.json
  - python tools/validate_gas_thin_adapter_v2.py --audit Temp/gas_business_logic_audit_v2.json
  - gas_forbidden_logic_count == 0
  - gas_python_display_parity_pct == 100
  completion_metric: gas_forbidden_logic_count == 0
  fail_policy: FAIL이면 GAS 산출값은 display_only로 표시하고 final_decision_packet에 반영 금지.
  depends_on:
  - P0-002
- id: P0-007
  priority: P0
  title: Renderer No-Calculation Lock — 보고서와 LLM 응답 계산 금지
  problem: 보고서가 보기 좋게 만들기 위해 계산을 시작하면 하네스와 숫자가 다르게 된다.
  methodology: render_contract + static_analysis + packet_provenance_check
  target_state: renderer와 prompt는 packet 값 복사, 정렬, 누락 표시, 위험 해설만 수행한다.
  files_to_create_or_modify:
  - spec/42_renderer_contract.yaml
  - prompts/low_capability_report_renderer.md
  - tools/validate_renderer_no_calculation_v2.py
  - tools/validate_llm_response_contract_v4.py
  step_by_step_for_low_capability_llm:
  - 보고서 섹션별 허용 필드를 final_decision_packet_contract와 1:1 매핑한다.
  - 렌더러에서 +, -, *, /, round, percent 계산 사용을 금지하거나 whitelist한다.
  - 숫자를 출력할 때 provenance가 없으면 DATA_MISSING 또는 FORMULA_UNREGISTERED로 표시한다.
  - LLM 프롬프트에서 '추정', '대략', '내 계산상' 같은 임의 숫자 문구를 금지한다.
  - blocked/limited 종목도 산출된 가격·수량은 shadow ledger에 표시한다.
  - 게이트가 AUDIT_ONLY이면 모든 주문표를 THEORETICAL_ONLY로 표시한다.
  acceptance_tests:
  - python tools/validate_renderer_no_calculation_v2.py --renderer tools/render_operational_report.py
  - python tools/validate_llm_response_contract_v4.py --report Temp/operational_report.md --packet Temp/final_decision_packet_v4.json
  - renderer_calculation_count == 0
  - unproven_number_count == 0
  - gate_softening_phrase_count == 0
  completion_metric: llm_hallucination_risk_score == 0
  fail_policy: FAIL이면 보고서 첫 줄에 RENDERER_CONTRACT_FAIL 표시 후 투자 액션 출력 금지.
  depends_on:
  - P0-003
- id: P0-008
  priority: P0
  title: PASS_100 Honest Gate — 실행 가능성과 보고 가능성 분리
  problem: 현재 PASS_100이 BLOCK_EXECUTION이면 보고서는 가능해도 실제 HTS 주문은 이론값이어야 한다.
  methodology: truth_gate_before_execution_gate
  target_state: PASS_100 미달 시 모든 주문은 shadow/theoretical로 유지하고, 실전 실행은 HTS_READY와 live readiness를 모두 통과할 때만 허용한다.
  files_to_create_or_modify:
  - spec/30_completion_criteria_contract.yaml
  - tools/build_pass_100_criteria_v4.py
  - tools/validate_pass_100_honest_v2.py
  - tools/build_final_execution_decision_v5.py
  step_by_step_for_low_capability_llm:
  - PASS_100 기준을 data, formula, truth, performance, execution, renderer, authority 축으로 나눈다.
  - 각 기준은 actual, target, passed, source_json, formula_id, remediation을 갖게 한다.
  - 실패 기준이 DATA_GATED이면 예상 해소 조건만 표시하고 임의 우회 금지한다.
  - 실패 기준이 CODE_GATED이면 수정 파일과 테스트를 명시한다.
  - FINAL_EXECUTION_HTS_READY가 false이면 hts_order_count는 반드시 0이어야 한다.
  - PASS_100 미달이어도 리밸런싱 제안은 가능하지만 주문 실행 문구는 금지한다.
  acceptance_tests:
  - python tools/build_pass_100_criteria_v4.py --out Temp/pass_100_criteria_v4.json
  - python tools/validate_pass_100_honest_v2.py --criteria Temp/pass_100_criteria_v4.json --execution Temp/final_execution_decision_v5.json
  - if pass_100_allowed == false then hts_order_mode == THEORETICAL_ONLY
  - if global_execution_gate != HTS_READY then hts_order_count == 0
  completion_metric: execution_ambiguity_count == 0
  fail_policy: FAIL이면 HTS 주문표 렌더링 전체 차단. shadow ledger만 출력.
  depends_on:
  - P0-003
  - P0-007
- id: P1-009
  priority: P1
  title: Quant Factor Taxonomy — 단타/단기/중기/장기 팩터 계층화
  problem: 팩터가 늘면 투자기간별 의미가 섞여 뒷북 매수와 설거지 매수를 동시에 강화할 수 있다.
  methodology: horizon_specific_factor_contract
  target_state: 각 팩터는 horizon, decay, required_sample, market_regime, conflict_policy를 갖는다.
  files_to_create_or_modify:
  - spec/43_quant_factor_taxonomy.yaml
  - spec/strategy/*.yaml
  - tools/validate_factor_taxonomy_v1.py
  - src/quant_engine/features/
  step_by_step_for_low_capability_llm:
  - 모든 팩터를 scalping, short, mid, long 중 하나 이상의 horizon에 배정한다.
  - 각 팩터에 expected_decay_days와 rebalance_frequency를 명시한다.
  - 단타 팩터가 장기 보유 판단을 override하지 못하게 precedence를 정의한다.
  - 장기 펀더멘털 팩터가 당일 실행 가격을 직접 만들지 못하게 차단한다.
  - 스마트머니, 유동성, 펀더멘털, 모멘텀, 리스크 팩터의 conflict_policy를 정의한다.
  - 상충 시 평균을 내지 말고 gate precedence로 결론을 낸다.
  acceptance_tests:
  - python tools/validate_factor_taxonomy_v1.py --taxonomy spec/43_quant_factor_taxonomy.yaml --registry spec/13_formula_registry.yaml
  - unassigned_factor_count == 0
  - horizon_conflict_without_policy_count == 0
  - factor_without_decay_count == 0
  completion_metric: factor_taxonomy_coverage_pct == 100
  fail_policy: FAIL이면 신규 팩터 active 승격 금지. 기존 보고서에는 FACTOR_TAXONOMY_PENDING으로 표시.
  depends_on:
  - P0-002
- id: P1-010
  priority: P1
  title: Anti-Late-Chase / Anti-Distribution Harness — 뒷북·설거지 방지 전용 게이트
  problem: 추세 후행 신호가 강해질수록 사용자는 고점 매수와 저점 매도를 반복할 수 있다.
  methodology: pre_trade_gate + forward_return_calibration
  target_state: 진입 전 5D/20D 과열, pullback quality, volume exhaustion, foreign/institution flow, distribution risk를 독립 차단 게이트로
    둔다.
  files_to_create_or_modify:
  - spec/strategy/anti_late_entry_pullback_gate_v5.yaml
  - spec/strategy/pre_distribution_early_warning_v4.yaml
  - tools/build_anti_late_chase_v5.py
  - tools/validate_anti_distribution_v4.py
  step_by_step_for_low_capability_llm:
  - 각 후보 종목에 5D return, 20D return, MA20 distance, RSI, 거래대금 배율, 수급 3D/5D, 음봉 거래량을 계산한다.
  - 5일 급등 후 pullback_quality가 기준 미달이면 BUY가 아니라 WAIT_PULLBACK으로 둔다.
  - distribution_score가 기준 이상이면 신규매수는 BLOCK, 보유는 TRIM_REVIEW로 둔다.
  - late_chase_false_positive_rate를 T+5/T+20 결과로 매주 재계산한다.
  - threshold 변경은 calibration_change_ledger에 변경 전후 승률과 MDD를 기록한다.
  - 저성능 LLM은 신호 해석을 하지 말고 gate 결과와 reason_code만 복사한다.
  acceptance_tests:
  - python tools/build_anti_late_chase_v5.py --json GatherTradingData.json --out Temp/anti_late_chase_v5.json
  - python tools/validate_anti_distribution_v4.py --out Temp/anti_distribution_validation_v4.json
  - buy_after_5d_runup_without_pullback_count == 0
  - distribution_confirmed_buy_count == 0
  - late_chase_false_positive_rate <= 20
  completion_metric: late_chase_false_positive_rate <= 20 and distribution_confirmed_buy_count == 0
  fail_policy: FAIL이면 신규 BUY/ADD_ON은 SHADOW_LEDGER_ONLY. 기존 포지션은 보유/감축 판단만 허용.
  depends_on:
  - P1-009
- id: P1-011
  priority: P1
  title: Backtest/Replay/Live Separation — 리플레이 성과와 실전 성과 분리
  problem: 리플레이 성과가 좋아도 live 표본이 부족하면 실제 실행 엔진으로 승격하면 안 된다.
  methodology: evidence_segregation + promotion_gate
  target_state: backtest, replay, paper, live를 분리하고 각 단계별 승격 기준을 명확히 둔다.
  files_to_create_or_modify:
  - spec/29_backtest_harness_contract.yaml
  - spec/44_live_replay_separation.yaml
  - tools/build_live_replay_separation_v2.py
  - tools/validate_no_replay_live_mix_v1.py
  step_by_step_for_low_capability_llm:
  - 모든 outcome row에 source_type을 backtest, replay, paper, live 중 하나로 부여한다.
  - live가 아닌 성과는 HTS_READY 승격 기준에 직접 사용하지 않는다.
  - T+5, T+20, T+60 각각 required_live_sample을 정의한다.
  - 성과 지표는 hit_rate, payoff_ratio, avg_return, median_return, max_drawdown, turnover, slippage를 함께 기록한다.
  - 리플레이에서 개선된 threshold는 shadow로 N회 운용 후 live 승격한다.
  - 데이터 부족은 실패가 아니라 WAIT_SAMPLE로 보고하되 주문 실행에는 사용하지 않는다.
  acceptance_tests:
  - python tools/build_live_replay_separation_v2.py --hist Temp/proposal_evaluation_history.json --out Temp/live_replay_separation_v2.json
  - python tools/validate_no_replay_live_mix_v1.py --json Temp/live_replay_separation_v2.json
  - replay_used_as_live_count == 0
  - live_t20_count >= 30 before performance_ready == true
  completion_metric: replay_live_mix_count == 0
  fail_policy: FAIL이면 performance_ready=false, PASS_100 해당 기준 실패 유지.
  depends_on:
  - P0-008
- id: P1-012
  priority: P1
  title: Data Provenance Ledger — 모든 숫자에 원천과 신선도 부착
  problem: 출처와 시간 정보 없는 숫자는 그럴듯하지만 투자 엔진에서는 독이다.
  methodology: provenance_everywhere + stale_data_gate
  target_state: 모든 report number는 source_path, json_pointer, formula_id, input_hash, as_of, freshness_status를 갖는다.
  files_to_create_or_modify:
  - spec/45_number_provenance_contract.yaml
  - tools/build_number_provenance_ledger_v4.py
  - tools/validate_number_provenance_strict_v3.py
  - src/quant_engine/reporting/provenance.py
  step_by_step_for_low_capability_llm:
  - final_decision_packet의 모든 leaf 숫자를 순회한다.
  - 각 숫자가 provenance 객체를 갖지 않으면 violation으로 기록한다.
  - 시장 데이터는 as_of와 market_session을 기록한다.
  - 계좌 데이터는 capture_time과 D+2 정산현금 포함 여부를 기록한다.
  - 결측 또는 오래된 값은 confidence cap을 적용하고 신규 매수 게이트에 반영한다.
  - Markdown에 출력되는 숫자와 packet provenance를 1:1 대조한다.
  acceptance_tests:
  - python tools/build_number_provenance_ledger_v4.py --packet Temp/final_decision_packet_v4.json --out Temp/number_provenance_ledger_v4.json
  - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.md
  - number_provenance_coverage_pct == 100
  - stale_critical_number_count == 0
  - unproven_report_number_count == 0
  completion_metric: number_provenance_coverage_pct == 100
  fail_policy: FAIL이면 미증빙 숫자는 보고서에서 숨기지 말고 DATA_MISSING_PROVENANCE로 표시. 주문 판단에는 사용 금지.
  depends_on:
  - P0-003
  - P0-007
- id: P1-013
  priority: P1
  title: Portfolio Risk Budget Cascade — 목표 5억까지 손실 방어 우선순위 수치화
  problem: 목표금액 5억에 가까워질수록 수익률보다 손실 방어와 현금 방어선이 더 중요해진다.
  methodology: risk_budget_before_alpha
  target_state: 총자산, 목표갭, 현금비율, 포지션 heat, 섹터 집중도, beta, drawdown을 하나의 risk budget cascade로 묶는다.
  files_to_create_or_modify:
  - spec/36_goal_risk_budget_harness.yaml
  - spec/risk/aggregate_risk.yaml
  - tools/build_goal_risk_budget_harness_v3.py
  - tools/validate_risk_budget_cascade_v1.py
  step_by_step_for_low_capability_llm:
  - 총자산과 목표 5억의 gap_pct를 계산한다.
  - gap이 작아질수록 신규 위성 매수 한도를 자동 축소한다.
  - D+2 정산현금을 immediate_cash_equivalent로 포함한다.
  - 현금 방어선 미달이면 BUY보다 cash_recovery와 trim_review를 우선한다.
  - 섹터 집중도, 단일종목 비중, beta, 손실률을 total_heat로 통합한다.
  - risk_budget이 부족하면 알파 점수가 높아도 수량을 줄인다.
  acceptance_tests:
  - python tools/build_goal_risk_budget_harness_v3.py --json GatherTradingData.json --out Temp/goal_risk_budget_harness_v3.json
  - python tools/validate_risk_budget_cascade_v1.py --json Temp/goal_risk_budget_harness_v3.json
  - cash_equivalent_includes_d_plus_2 == true
  - risk_budget_overrun_order_count == 0
  - portfolio_heat_field_present == true
  completion_metric: risk_budget_violation_count == 0
  fail_policy: FAIL이면 신규매수 차단, 리밸런싱/현금회복/위험감축 제안만 허용.
  depends_on:
  - P0-002
  - P1-012
- id: P2-014
  priority: P2
  title: Document Shrink & Doctrine Split — 문서 과다를 3종으로 축소
  problem: 문서가 많으면 지침 충돌이 늘고, 긴 프롬프트는 저성능 LLM에서 오히려 일관성을 해친다.
  methodology: doctrine_minimalism + yaml_rule_authority
  target_state: Markdown은 doctrine, runbook, ADR 세 종류로만 남기고 세부 규칙은 YAML spec으로 이동한다.
  files_to_create_or_modify:
  - docs/doctrine.md
  - docs/runbook.md
  - governance/adr_index.yaml
  - tools/validate_docs_no_rule_duplication_v1.py
  - prompts/*.md
  step_by_step_for_low_capability_llm:
  - 모든 .md 파일을 doctrine, runbook, ADR, prompt, report_sample 중 하나로 분류한다.
  - Markdown 내부의 숫자 공식, 임계값, 권위 규칙을 찾아 spec YAML로 이동한다.
  - Markdown에는 spec ID 링크만 남긴다.
  - prompt는 입력/출력 형식과 금지사항만 포함하고 투자 이론을 중복 설명하지 않는다.
  - AGENTS.md는 읽기 순서와 하드 룰만 유지하고 200줄 이하를 목표로 한다.
  - 변경 후 validate_docs_no_rule_duplication을 실행한다.
  acceptance_tests:
  - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_v1.json
  - markdown_rule_duplication_count == 0
  - prompt_formula_definition_count == 0
  - agents_md_line_count <= 200
  completion_metric: markdown_rule_duplication_count == 0
  fail_policy: FAIL이면 문서 변경은 병합 가능하지만 release gate 승격 금지. 중복 규칙은 spec YAML로 이관할 때까지 보류.
  depends_on:
  - P0-001
  - P0-002
- id: P2-015
  priority: P2
  title: Change Request Discipline — 새 팩터/규칙/문서 추가의 표준 절차
  problem: 좋은 아이디어라도 검증 없이 추가되면 엔진은 똑똑해지는 것이 아니라 불안정해진다.
  methodology: CR -> shadow -> evidence -> active -> retire
  target_state: 모든 변경은 change_request YAML과 ADR/rule_lifecycle을 거쳐 shadow -> active로 승격한다.
  files_to_create_or_modify:
  - governance/change_request_template.yaml
  - governance/rule_lifecycle.yaml
  - governance/adr_index.yaml
  - tools/validate_change_request_v1.py
  step_by_step_for_low_capability_llm:
  - 새 제안은 반드시 change_request YAML로 시작한다.
  - 요청서에는 problem, expected_metric, affected_formulas, affected_outputs, rollback_plan을 포함한다.
  - 새 공식은 shadow_only 상태로 최소 N회 또는 required_sample까지 운용한다.
  - 기존 규칙과 충돌하면 authority_matrix에 precedence를 명시한다.
  - 성과 개선이 없거나 drawdown이 악화되면 retirement_condition에 따라 폐기한다.
  - 폐기된 규칙은 삭제 전에 migration hash와 reason을 남긴다.
  acceptance_tests:
  - python tools/validate_change_request_v1.py --requests governance/change_requests --lifecycle governance/rule_lifecycle.yaml
  - change_request_missing_metric_count == 0
  - rule_without_retirement_condition_count == 0
  - shadow_to_active_without_evidence_count == 0
  completion_metric: shadow_to_active_without_evidence_count == 0
  fail_policy: FAIL이면 해당 변경은 active manifest 반영 금지.
  depends_on:
  - P0-001
- id: P2-016
  priority: P2
  title: Low-Capability LLM Execution Pack — 저성능 LLM 전용 실행 패킷
  problem: 저성능 LLM은 긴 맥락보다 짧고 엄격한 입력 패킷, 고정 순서, 금지어, 출력 템플릿이 필요하다.
  methodology: small_context + rigid_template + output_diff_validation
  target_state: final_context_for_llm.json/yaml은 필수 필드만 담고, LLM은 체크리스트 순서대로 빈칸을 채운다.
  files_to_create_or_modify:
  - spec/31_low_capability_llm_response_contract.yaml
  - spec/46_low_capability_execution_pack.yaml
  - prompts/low_capability_report_renderer.md
  - tools/build_final_context_for_llm_v4.py
  - tools/validate_low_capability_pack_v1.py
  step_by_step_for_low_capability_llm:
  - final_decision_packet에서 LLM에 필요한 필드만 추려 final_context_for_llm_v4를 만든다.
  - context는 executive, blockers, action_table, shadow_ledger, data_missing, education_notes 순서로 고정한다.
  - 각 필드에는 display_value와 source_key를 함께 넣는다.
  - LLM 지시는 1) 복사 2) 정렬 3) 누락표시 4) 해설 순서만 허용한다.
  - LLM이 쓸 수 없는 동사는 예측한다, 보장한다, 확정한다, 계산했다로 정의한다.
  - 응답 검증기는 report와 packet의 숫자 차이를 0으로 요구한다.
  acceptance_tests:
  - python tools/build_final_context_for_llm_v4.py --packet Temp/final_decision_packet_v4.json --out Temp/final_context_for_llm_v4.yaml
  - python tools/validate_low_capability_pack_v1.py --context Temp/final_context_for_llm_v4.yaml --contract spec/46_low_capability_execution_pack.yaml
  - context_required_field_coverage_pct == 100
  - ambiguous_instruction_count == 0
  - llm_free_numeric_field_count == 0
  completion_metric: low_capability_reproducibility_score == 100
  fail_policy: FAIL이면 저성능 LLM용 보고서 생성 금지. 고성능 LLM도 같은 packet-only 모드로 제한.
  depends_on:
  - P0-003
  - P0-007
- id: P2-017
  priority: P2
  title: Observability Dashboard — 엔진 품질을 매주 수치로 관리
  problem: 엔진 개선이 느낌으로 관리되면 문서만 늘고 성능은 좋아지지 않는다.
  methodology: measure_every_release + owner_accountability
  target_state: 릴리스마다 authority, data, formula, performance, execution, renderer, repo hygiene 점수를 저장한다.
  files_to_create_or_modify:
  - spec/37_evaluation_dashboard_contract.yaml
  - tools/build_engine_observability_dashboard_v1.py
  - Temp/continuous_evaluation_dashboard_v3.json
  - docs/runbook.md
  step_by_step_for_low_capability_llm:
  - 각 release 실행 후 주요 품질 점수를 JSON으로 저장한다.
  - 점수는 현재값, 전회값, 변화량, 차단 사유, owner를 포함한다.
  - 주간 토/일 리밸런싱 때 dashboard를 먼저 읽는다.
  - 매월 1/11/21 중간점검에는 PASS_100 실패 기준과 성과 표본 누적을 별도 보고한다.
  - 점수가 악화된 항목은 자동으로 change_request 초안을 생성한다.
  - dashboard가 없으면 보고서는 DATA_MISSING_DASHBOARD로 시작한다.
  acceptance_tests:
  - python tools/build_engine_observability_dashboard_v1.py --root . --out Temp/continuous_evaluation_dashboard_v3.json
  - dashboard_axis_count >= 7
  - dashboard_owner_coverage_pct == 100
  - weekly_rebalance_check_present == true
  - mid_month_check_rule_present == true
  completion_metric: dashboard_owner_coverage_pct == 100
  fail_policy: FAIL이면 리밸런싱 제안은 가능하나 엔진 개선 성과 주장은 금지.
  depends_on:
  - P0-004
  - P1-011
- id: P3-018
  priority: P3
  title: Repository Packaging Policy — 업로드 zip은 운용에 필요한 최소 세트만 포함
  problem: zip에 너무 많은 산출물과 중간 파일이 들어가면 LLM 컨텍스트 비용과 해석 오류가 증가한다.
  methodology: minimal_upload_bundle + reproducible_build
  target_state: source, contract, active runtime, essential report만 포함하고 archive/legacy/generated bulk는 제외한다.
  files_to_create_or_modify:
  - tools/prepare_upload_zip.py
  - spec/47_packaging_policy.yaml
  - tools/validate_packaging_policy_v1.py
  step_by_step_for_low_capability_llm:
  - zip 포함 파일을 source_required, runtime_required, report_required, test_required로 분류한다.
  - Temp에서는 active manifest가 지정한 파일과 operational_report만 포함한다.
  - legacy_reference_only와 archive_candidate는 zip에서 제외한다.
  - generated Python model은 필요한 경우만 dist로 포함하고 원본 schema가 있으면 재생성 가능하게 한다.
  - zip 생성 후 포함 파일 수, 크기, excluded 이유를 manifest로 남긴다.
  - 업로드용 zip과 개발 전체 zip을 분리한다.
  acceptance_tests:
  - python tools/prepare_upload_zip.py --validation-mode release --profile
  - python tools/validate_packaging_policy_v1.py --zip ../data_feed.zip --policy spec/47_packaging_policy.yaml
  - upload_zip_legacy_artifact_count == 0
  - upload_zip_unclassified_file_count == 0
  - upload_zip_required_file_missing_count == 0
  completion_metric: upload_zip_unclassified_file_count == 0
  fail_policy: FAIL이면 업로드 zip 생성 실패로 처리하고 사용자 보고에는 마지막 정상 manifest만 사용.
  depends_on:
  - P0-005
  - P2-016
low_capability_llm_master_procedure:
  role: REPORT_CLERK_AND_CHECKLIST_EXECUTOR_ONLY
  absolute_do_not:
  - 가격, 수량, 수익률, TP, SL, 점수, 게이트를 직접 계산하지 않는다.
  - Temp legacy artifact를 임의로 최신값으로 선택하지 않는다.
  - PASS_100 미달 상태에서 HTS 실행 가능 문구를 쓰지 않는다.
  - 데이터 결측을 추정값으로 채우지 않는다.
  - 하네스가 BLOCK한 결론을 narrative로 완화하지 않는다.
  execution_order:
  - 1. AGENTS.md의 읽기 순서를 확인한다.
  - 2. runtime/active_artifact_manifest.yaml에서 active artifact만 확인한다.
  - 3. final_decision_packet을 읽고 모든 숫자의 provenance를 확인한다.
  - 4. PASS_100, final_execution_gate, hts_order_count를 먼저 출력한다.
  - 5. global_execution_gate가 HTS_READY가 아니면 모든 주문표를 THEORETICAL_ONLY로 표시한다.
  - 6. 종목별 action은 packet의 action_code와 reason_code만 복사한다.
  - 7. DATA_MISSING, FORMULA_UNREGISTERED, STALE_DATA는 숨기지 않고 표로 출력한다.
  - 8. 마지막에 이번 주 리밸런싱 TODO와 다음 검증 명령만 출력한다.
  fixed_output_sections:
  - A. 시스템 게이트와 차단 사유
  - B. 포트폴리오 현황과 목표 5억 gap
  - C. 현금/D+2 방어선
  - D. 종목별 action table
  - E. shadow ledger / theoretical orders
  - F. 데이터 결측·신선도·provenance
  - G. 이번 주 리밸런싱 액션
  - H. 엔진 개선 TODO와 검증 명령
recommended_first_7_days_execution_plan:
- day: 1
  focus: P0-001~P0-002
  deliverable: authority_matrix + formula_registry_v2 validation
  do_not: 새 팩터 추가 금지
- day: 2
  focus: P0-003
  deliverable: final_decision_packet_v4 contract and renderer packet-only draft
  do_not: 보고서에서 Temp 직접 읽기 금지
- day: 3
  focus: P0-004
  deliverable: release_dag.yaml and root-cause fail-fast executor
  do_not: full-gate에 임시 script 계속 추가 금지
- day: 4
  focus: P0-005
  deliverable: artifact_retirement_plan_v1 with quarantine manifest
  do_not: 바로 삭제하지 말고 hash와 legacy reason 기록
- day: 5
  focus: P0-006~P0-007
  deliverable: GAS forbidden logic audit + renderer no-calculation lock
  do_not: GAS에서 신규 판단 로직 작성 금지
- day: 6
  focus: P0-008 + P1-012
  deliverable: honest PASS_100 + number provenance strict gate
  do_not: 실행 가능성과 보고 가능성 혼용 금지
- day: 7
  focus: P1-009~P1-011
  deliverable: factor taxonomy + anti-late-chase + live/replay separation
  do_not: 리플레이 성과를 실전 승격 근거로 사용 금지
definition_of_done_for_best_quant_engine:
  source_authority: authority_integrity_score == 100
  formula: formula_implementation_score == 100 and missing_golden_case_count == 0
  data: schema_presence_score == 100 and missing_critical_field_count == 0 and stale_critical_number_count == 0
  decision: single_truth_conflict_count == 0 and decision_reproducibility_score == 1.0
  execution: global_execution_gate == HTS_READY only when PASS_100 true and hts_order_count > 0
  report: renderer_calculation_count == 0 and unproven_report_number_count == 0
  performance: live_t20_count >= 30 and performance_readiness_score >= 90 before active execution upgrade
  maintenance: all changes pass change_request -> shadow -> evidence -> active lifecycle
  llm: low_capability_reproducibility_score == 100
final_recommendation:
  immediate_decision: 새 문서를 더 만드는 방식은 중단하고, source authority collapse와 final_decision_packet monolith부터 수행한다.
  architecture_decision: YAML contract + Python canonical + GAS thin adapter + Markdown doctrine/report로 고정한다.
  pm_decision: P0-001~P0-008 전에는 신규 팩터나 매매 알고리즘 추가를 금지한다.
  quant_decision: 성과 개선은 리플레이가 아니라 live/paper 분리 표본과 drawdown 방어 기준으로만 승격한다.
  developer_decision: tools는 CLI wrapper로 줄이고 src/quant_engine에 canonical domain logic을 모은다.
task_execution_status:
  summary:
    implemented: 18
    validated: 14
    completed: 14
    blocked: 4
    operational_ready: false
  items:
  - id: P0-001
    status: completed
  - id: P0-002
    status: completed
  - id: P0-003
    status: blocked
    reason: render_operational_report.py의 Temp 직접 읽기 제거가 아직 남음
  - id: P0-004
    status: blocked
    reason: package.json full-gate를 단일 release DAG executor로 수렴하는 대규모 리팩토링이 남음
  - id: P0-005
    status: completed
  - id: P0-006
    status: blocked
    reason: gas_*.gs의 forbidden decision logic을 0으로 만드는 thin adapter 이관이 남음
  - id: P0-007
    status: blocked
    reason: renderer no-calculation lock이 render_operational_report.py 전체 정리 없이는 충족되지 않음
  - id: P0-008
    status: completed
  - id: P1-009
    status: completed
  - id: P1-010
    status: completed
  - id: P1-011
    status: completed
  - id: P1-012
    status: completed
  - id: P1-013
    status: completed
  - id: P2-014
    status: completed
  - id: P2-015
    status: completed
  - id: P2-016
    status: completed
  - id: P2-017
    status: completed
  - id: P3-018
    status: completed
