meta:
  title: Quant Engine Deterministic Architecture Refactor Methodology TODO
  version: 2026-06-06.v1
  language: ko-KR
  author_role:
  - 30y_quant_investor
  - senior_developer
  - systems_architect
  - senior_pm
  input_basis:
    archive: data_feed.zip
    primary_instruction: data_feed/AGENTS.md
    source_file_scope:
    - '*.md'
    - '*.yaml'
    - '*.gs'
    - '*.py'
    runtime_artifact_scope:
    - '*.json'
    - '*.jsonl'
    - dist/*.yaml
    inspected_inventory:
      md_files: 16
      yaml_files: 104
      gs_files: 7
      py_files: 376
      json_artifacts: 511
      large_files_observed:
        AGENTS.md: 119KB / 1067 lines
        spec/13_formula_registry.yaml: 176KB / 4638 lines
        gas_data_feed.gs: 459KB / 10271 lines
        gas_data_collect.gs: 215KB / 4429 lines
        tools/validate_engine_harness_gate.py: 91KB / 1841 lines
        Temp/operational_report.json: 202KB / 550 lines
  non_investment_note: 이 문서는 투자 매수/매도 지시가 아니라 퀀트투자 엔진 개발·검증·운영 방법론 리팩토링 지침이다.
executive_decision:
  adopt_methodology_name: 'QEDA-DM: Quant Engine Deterministic Architecture Development Methodology'
  one_sentence: LLM 판단을 제거하고, 수치·공식·데이터·권위 소스·검증 게이트를 코드와 계약으로 고정한 뒤 LLM은 검증된 패킷을 렌더링만 하게 만드는 개발 방법론.
  core_thesis:
  - 현재 엔진의 병목은 알파 아이디어 부족이 아니라 권위 소스 충돌, 산출 공식 중복, 임시 산출물 난립, 대형 GAS/검증 스크립트의 응집도 붕괴다.
  - 최고 성능 LLM과 저성능 LLM의 결과 차이를 줄이는 유일한 방법은 LLM의 자유도를 줄이고 deterministic packet, schema, golden case, formula registry, renderer
    contract로 결과 공간을 닫는 것이다.
  - AGENTS.md는 운영 헌법/인덱스로 축소하고, 공식·필드·게이트·출력·실행은 yaml 계약과 py/gs 구현의 parity test로 강제한다.
  target_state:
    llm_freedom_pct: 0.0
    runtime_adjusted_formula_coverage_pct: 100.0
    unmapped_formula_count: 0
    ungrounded_number_count: 0
    authority_collision_count: 0
    golden_case_decision_critical_coverage_pct: 100.0
    gas_python_formula_parity_fail_count: 0
    operational_report_schema_valid: true
    human_override_transparency_required: true
problem_diagnosis:
  P01_authority_sprawl:
    symptom: AGENTS.md, spec yaml, Temp json, GAS, Python validators가 모두 판단 근거처럼 사용될 위험.
    risk: 동일 필드/공식/게이트가 여러 파일에서 다른 의미로 해석되면 매수·매도 판단이 뒷북/설거지로 변질된다.
    required_fix: authority matrix와 active_manifest만 읽게 하고, 나머지는 build input 또는 audit output으로 격리한다.
  P02_version_fragmentation:
    symptom: Temp에 v1~v8 계열 산출물이 다수 존재한다.
    risk: 저성능 LLM 또는 스크립트가 최신이 아닌 산출물을 읽어 잘못된 수량·가격·게이트를 렌더링할 수 있다.
    required_fix: 'canonical_artifact_resolver와 artifact_status: active|superseded|archived|forbidden_read를 강제한다.'
  P03_document_bloat:
    symptom: AGENTS.md 1000라인+, formula_registry 4600라인+, gas_data_feed 10000라인+.
    risk: 사람과 LLM 모두 전체 규칙을 일관되게 적용하기 어렵고, 리팩토링 단위가 커져 회귀버그가 늘어난다.
    required_fix: 도메인별 모듈화, ADR, rule lifecycle, owner ledger, max file size gate를 도입한다.
  P04_hallucination_surface:
    symptom: LLM이 문서와 산출물 사이에서 누락 숫자를 보완하려는 유혹이 생긴다.
    risk: 임의 가격, 임의 TP/SL, 임의 수량 산출이 발생한다.
    required_fix: number_provenance_self_audit, output_field_owner_ledger, renderer-only LLM contract를 강화한다.
  P05_methodology_gap:
    symptom: 기능 추가 TODO는 많지만 제품형 엔진의 architecture governance, release train, observability, lineage, calibration loop가 하나의
      방법론으로 닫혀 있지 않다.
    risk: 개선은 계속되나 방향성이 누적되지 않고, 성과 검증보다 문서 추가가 선행된다.
    required_fix: QEDA-DM 9단계 lifecycle을 표준 개발 프로세스로 채택한다.
methodology:
  name: QEDA-DM
  principles:
  - id: PR01
    name: Contract first
    rule: 새 기능은 구현보다 먼저 YAML contract, JSON schema, golden cases, output owner를 등록한다.
  - id: PR02
    name: Deterministic core
    rule: 가격·수량·점수·게이트는 Python/GAS 공식으로만 산출하고 LLM 산출을 금지한다.
  - id: PR03
    name: LLM renderer only
    rule: LLM은 final_decision_packet을 해석·표시만 하며 숫자를 생성하거나 수정하지 않는다.
  - id: PR04
    name: One active artifact
    rule: 동일 목적 산출물은 active_manifest가 지정한 1개만 runtime source로 허용한다.
  - id: PR05
    name: Evidence before recommendation
    rule: 투자 제안은 formula_id, input_fields, timestamp, source_artifact, confidence를 가진 evidence ledger 없이는 출력하지 않는다.
  - id: PR06
    name: No false 100%
    rule: 100% 완료는 gate result, failed_checks=0, sample maturity 충족, parity pass가 있을 때만 선언한다.
  - id: PR07
    name: Separate policy and implementation
    rule: AGENTS/MD는 정책·해설, YAML은 계약, PY는 canonical engine, GS는 sheet adapter, JSON은 runtime artifact로 제한한다.
  - id: PR08
    name: Small files, strong interfaces
    rule: 대형 파일은 도메인 모듈로 쪼개고 public function/import boundary를 고정한다.
  - id: PR09
    name: Replayability
    rule: 모든 판단은 동일 input snapshot으로 재실행 시 동일 output hash가 나와야 한다.
  - id: PR10
    name: Outcome-calibrated evolution
    rule: 룰 추가는 실제 outcome ledger와 calibration registry의 개선 근거가 있어야 승격한다.
  lifecycle:
  - stage: S0_intake
    owner: PM/quant
    output: proposal_ticket.yaml
    exit_gate: business_hypothesis, risk, affected_fields 명시
  - stage: S1_contract
    owner: architect
    output: spec/contracts/*.yaml + schemas/*.json
    exit_gate: field owner, formula owner, artifact owner 등록
  - stage: S2_formula
    owner: quant
    output: spec/formulas/*.yaml + golden_cases.yaml
    exit_gate: manual expected result and edge cases complete
  - stage: S3_canonical_python
    owner: developer
    output: src/quant_engine/**/*.py
    exit_gate: pytest golden pass
  - stage: S4_gas_adapter
    owner: GAS maintainer
    output: gas/**/*.gs
    exit_gate: GAS-Python parity pass
  - stage: S5_pipeline
    owner: platform
    output: Temp/*.json via build commands
    exit_gate: schema validation and lineage event recorded
  - stage: S6_render
    owner: LLM/reporting
    output: operational_report.md/json
    exit_gate: no ungrounded number, narrative lock pass
  - stage: S7_release
    owner: release manager
    output: dist + zip
    exit_gate: full-gate status OK and failed_checks_count=0
  - stage: S8_feedback
    owner: quant/PM
    output: outcome_ledger + calibration backlog
    exit_gate: sample maturity and real outcome attribution complete
authority_model:
  read_order_highest_to_lowest:
  - rank: 1
    source: active_artifact_manifest.yaml
    authority: runtime에서 읽을 산출물 1개를 지정하는 최상위 resolver
  - rank: 2
    source: final_decision_packet.json
    authority: 렌더링 가능한 최종 숫자·수량·게이트 패킷
  - rank: 3
    source: spec/formulas/*.yaml
    authority: 공식 정의와 formula_id의 단일 원장
  - rank: 4
    source: spec/field_dictionary.yaml
    authority: 필드명·단위·nullable·owner 정의
  - rank: 5
    source: schemas/*.schema.json
    authority: artifact shape validation
  - rank: 6
    source: AGENTS.md
    authority: 운영 금지사항·보고서 인덱스·사람용 헌법
  - rank: 7
    source: README.md/prompts/*.md
    authority: 사용법·렌더링 프롬프트. 숫자 권위 없음
  - rank: 8
    source: Temp/superseded/*
    authority: 감사·재현용. runtime read 금지
  file_type_contract:
    .md: 정책, 설명, 프롬프트, ADR 요약만 허용. 숫자 산출 공식의 원본 권위 금지.
    .yaml: spec, formula, data contract, TODO, lifecycle, owner ledger의 원본 권위.
    .py: canonical deterministic implementation, validator, test runner, migration script.
    .gs: Google Sheets/App Script adapter. canonical 계산을 복제할 때는 반드시 parity test 필요.
    .json: runtime artifact. 사람이 직접 편집하지 않는다.
  conflict_resolution:
  - 동일 필드 정의가 두 곳 이상이면 output_field_owner_ledger.yaml의 owner가 우선한다.
  - AGENTS.md와 spec yaml이 충돌하면 spec yaml을 우선하고 AGENTS.md를 인덱스로 정정한다.
  - GAS와 Python 결과가 다르면 release 차단. Python canonical이 우선이며 GAS adapter를 수정한다.
  - 외부 시장 데이터와 harness 가격이 다르면 harness 가격을 주문 판단에 사용하고 외부 데이터는 CONTEXT_ONLY로 격리한다.
  - Temp에 복수 버전이 있으면 active_manifest가 active로 지정한 파일만 사용한다.
target_repository_architecture:
  proposed_tree:
    governance/:
    - AGENTS.md 축소본
    - adr/*.md
    - rule_lifecycle.yaml
    - authority_matrix.yaml
    spec/:
    - contracts/*.yaml
    - formulas/*.yaml
    - fields/*.yaml
    - outputs/*.yaml
    - risk/*.yaml
    - strategy/*.yaml
    schemas/:
    - '*.schema.json'
    - generated/
    src/quant_engine/:
    - data/
    - features/
    - formulas/
    - gates/
    - routing/
    - sizing/
    - execution/
    - portfolio/
    - reporting/
    - observability/
    gas/:
    - adapters/
    - sheets/
    - render_bridge/
    - legacy/
    tools/:
    - build_*.py
    - validate_*.py
    - migrate_*.py
    - audit_*.py
    tests/:
    - golden/
    - parity/
    - regression/
    - property/
    - integration/
    runtime/:
    - active_artifact_manifest.yaml
    - lineage_events.jsonl
    - run_profiles/
    Temp/:
    - generated artifacts only; no manual edit; no direct LLM read except manifest-approved artifacts
    dist/:
    - packaged compact yaml bundles
  max_file_size_policy:
    AGENTS.md:
      max_lines: 350
      action_if_exceeded: move detailed rules into spec/governance/*.yaml and keep index links
    single_formula_yaml:
      max_lines: 800
      action_if_exceeded: 'split by domain: risk, entry, exit, cash, portfolio, report'
    single_gs_file:
      max_lines: 1500
      action_if_exceeded: move functions to gas/adapters/domain_*.gs
    single_py_file:
      max_lines: 800
      action_if_exceeded: split into package modules and shared validation utilities
    prompt_md:
      max_lines: 250
      action_if_exceeded: convert output constraints to machine-readable render_contract.yaml
canonical_engine_layers:
  L0_data_ingest:
    responsibility: 수집, 정규화, source timestamp, freshness, unit validation
    must_not: 투자 판단 산출 금지
    artifacts:
    - raw_snapshot
    - normalized_snapshot
    - data_quality_report
  L1_feature_store:
    responsibility: 가격/거래대금/펀더멘털/스마트머니/섹터/거시/계좌 피처 생성
    must_not: 매수/매도 verdict 생성 금지
    artifacts:
    - feature_matrix
    - feature_lineage
  L2_formula_engine:
    responsibility: formula_registry 기반 deterministic score/threshold 산출
    must_not: 렌더링 문장 생성 금지
    artifacts:
    - formula_outputs
    - formula_trace
  L3_gate_engine:
    responsibility: cash, heat, risk, data maturity, anti-chase, stop/tp, sector, beta, portfolio health gate 판정
    must_not: 게이트 실패를 문장으로 완화 금지
    artifacts:
    - gate_results
    - blocked_reason_ledger
  L4_router:
    responsibility: 단타/단기/중기/장기, BUY/HOLD/TRIM/SELL/WATCH/BLOCKED 라우팅
    must_not: 수량/가격 재산출 금지
    artifacts:
    - routing_trace
    - decision_path
  L5_position_execution:
    responsibility: position sizing, tranche, sell priority, HTS order blueprint, shadow ledger 산출
    must_not: HTS 단일 조건 위반, tick 미정규화 가격 출력 금지
    artifacts:
    - order_blueprint
    - shadow_ledger
  L6_report_renderer:
    responsibility: final_decision_packet을 사람이 읽는 보고서로 렌더링
    must_not: 새 숫자 생성, 누락 필드 보완, softening narrative 생성 금지
    artifacts:
    - operational_report.json
    - operational_report.md
  L7_outcome_feedback:
    responsibility: 실행/미실행 결과, slippage, late chase, value damage, hit ratio, alpha decay 추적
    must_not: 표본 미성숙 상태에서 PASS 또는 100% 주장 금지
    artifacts:
    - outcome_ledger
    - calibration_registry_update_queue
numeric_governance_formulas:
  data_integrity_score:
    formula: 100 * (1 - weighted_error_count / weighted_required_check_count)
    hard_floor_for_release: 100.0
    error_classes:
    - missing_required_field
    - stale_timestamp
    - unit_mismatch
    - source_conflict
    - schema_invalid
  authority_collision_score:
    formula: 100 * (1 - collision_count / max(1, owned_field_count))
    release_condition: collision_count == 0
  hallucination_risk_score:
    formula: 100 * (ungrounded_number_count + unsupported_claim_count + llm_modified_field_count) / max(1, output_number_count
      + output_claim_count)
    release_condition: score == 0 and ungrounded_number_count == 0
  determinism_score:
    formula: 100 * deterministic_hash_match_count / replay_case_count
    release_condition: score == 100 and replay_case_count >= minimum_replay_cases
  formula_parity_score:
    formula: 100 * (1 - abs(py_result - gas_result) / tolerance_denominator) averaged across golden cases
    release_condition: all cases pass exact or tolerance-specific checks
  sample_maturity_score:
    formula: min(100, 100 * effective_sample_n / required_sample_n)
    rule: effective_sample_n < required_sample_n이면 PASS 금지, WATCH_PENDING_SAMPLE로 강등
  engine_maturity_score:
    formula: 0.20*data_integrity + 0.20*formula_coverage + 0.15*parity + 0.15*determinism + 0.15*outcome_maturity + 0.10*lineage
      + 0.05*docs_hygiene
    interpretation:
      '90_100': release_ready
      '75_89': limited_release
      '60_74': shadow_only
      below_60: development_only
todo_backlog:
- phase: P0_freeze_and_inventory
  id: P0_T01_ACTIVE_MANIFEST
  priority: P0
  title: 런타임 권위 산출물 active manifest 단일화
  owner: architect/platform
  rationale: Temp 산출물이 500개 이상이며 버전이 다수 존재하므로 runtime에서 읽을 파일을 1개씩 잠그지 않으면 구버전 오독 가능성이 크다.
  target_files:
  - runtime/active_artifact_manifest.yaml
  - tools/validate_active_manifest.py
  - Temp/active_artifact_manifest_v*.json
  implementation_steps:
  - runtime/active_artifact_manifest.yaml 생성
  - artifact_key별 active_path, schema_path, freshness_sla_min, status, produced_by, consumed_by를 명시
  - Temp의 구버전 artifact는 superseded로 태깅
  - LLM/report renderer는 manifest active_path 외 직접 Temp 읽기 금지
  commands:
  - python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict
  acceptance_criteria:
  - 모든 artifact_key가 active_path exactly 1개 보유
  - status in [active,superseded,archived,forbidden_read]
  - forbidden_read artifact를 참조하는 코드/프롬프트 0건
  low_capability_llm_instruction: Temp 폴더에서 최신처럼 보이는 파일을 직접 고르지 말고 manifest에 등록된 active_path만 사용하라.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P0_freeze_and_inventory
  id: P0_T02_AUTHORITY_MATRIX
  priority: P0
  title: 필드·공식·출력 owner authority matrix 작성
  owner: architect/quant
  rationale: 필드 정의/공식/렌더링 책임이 분산되면 동일 숫자가 다른 곳에서 재정의된다.
  target_files:
  - governance/authority_matrix.yaml
  - spec/03_formulas/output_field_owner_ledger.yaml
  - spec/12_field_dictionary.yaml
  implementation_steps:
  - 모든 output field에 owner_type(formula|data|renderer|manual), owner_file, owner_formula_id를 매핑
  - 중복 owner를 collision으로 기록
  - AGENTS.md에 있는 숫자 규칙은 matrix에 링크만 남김
  commands:
  - python tools/build_authority_matrix.py --spec spec --out governance/authority_matrix.yaml
  - python tools/validate_authority_matrix.py --strict
  acceptance_criteria:
  - owned_output_field_pct == 100
  - authority_collision_count == 0
  - manual_override_field는 override_reason과 audit_required=true 보유
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P0_freeze_and_inventory
  id: P0_T03_BASELINE_METRICS
  priority: P0
  title: 현재 엔진 구조 부채 baseline metrics 고정
  owner: platform
  rationale: 개선 전 기준선을 수치화하지 않으면 리팩토링 성과를 증빙할 수 없다.
  target_files:
  - Temp/refactor_baseline_metrics_v1.json
  - tools/build_refactor_baseline_metrics.py
  implementation_steps:
  - 파일 타입별 수량, 대형 파일 수, duplicate formula_id, duplicate artifact_key, deprecated read reference, test coverage를 측정
  - 결과를 refactor_baseline_metrics_v1.json으로 저장
  - 향후 PR마다 delta를 비교
  commands:
  - python tools/build_refactor_baseline_metrics.py --root . --out Temp/refactor_baseline_metrics_v1.json
  acceptance_criteria:
  - baseline json schema valid
  - large_file_count, duplicate_formula_count, authority_collision_count 필드 존재
  - 다음 release에서 개선/악화 delta 출력
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P1_document_refactor
  id: P1_T01_AGENTS_SHRINK
  priority: P0
  title: AGENTS.md를 헌법/인덱스로 축소
  owner: architect/PM
  rationale: 1000라인 이상의 AGENTS.md는 저성능 LLM이 일관되게 적용하기 어렵고, rule source와 commentary가 섞인다.
  target_files:
  - AGENTS.md
  - governance/agents_index.yaml
  - governance/rules/*.yaml
  implementation_steps:
  - AGENTS.md를 300~350라인 이하로 축소
  - 상위 금지사항, source-of-truth, required decision flow, output standard만 유지
  - 세부 Direction은 governance/rules/*.yaml로 이동하고 ID별 링크 유지
  - 이동 전후 rule_id hash 비교
  commands:
  - python tools/split_agents_rules.py --in AGENTS.md --out governance/rules --index governance/agents_index.yaml
  - python tools/validate_agents_index.py --strict
  acceptance_criteria:
  - AGENTS.md lines <= 350
  - rule_id_count_before == rule_id_count_after
  - missing_rule_id_count == 0
  - AGENTS.md에 산출 공식 원문 없음
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P1_document_refactor
  id: P1_T02_ADR_SYSTEM
  priority: P0
  title: ADR 기반 의사결정 기록 체계 도입
  owner: PM/architect
  rationale: 리팩토링/룰 변경의 이유와 부작용을 기록하지 않으면 같은 논쟁과 같은 패치가 반복된다.
  target_files:
  - governance/adr/0001-adopt-qeda-dm.md
  - governance/adr_index.yaml
  implementation_steps:
  - 'ADR 템플릿 생성: context, decision, alternatives, consequences, rollback, affected_files'
  - 주요 결정 10개를 ADR로 등록
  - 새 formula/gate 도입 PR에는 ADR 또는 rule lifecycle ticket 필수
  commands:
  - python tools/validate_adr_index.py --index governance/adr_index.yaml
  acceptance_criteria:
  - adr_index.yaml에 모든 ADR 등록
  - 각 ADR status in [proposed,accepted,superseded,deprecated]
  - accepted ADR의 consequences와 rollback 존재
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P1_document_refactor
  id: P1_T03_RULE_LIFECYCLE
  priority: P0
  title: 룰 생명주기 정책 등록
  owner: quant/architect
  rationale: 새 룰이 계속 누적되면 엔진은 고도화가 아니라 규칙 부채가 된다.
  target_files:
  - governance/rule_lifecycle.yaml
  - tools/validate_rule_lifecycle.py
  implementation_steps:
  - rule status를 proposed->shadow->active->deprecated->removed로 정의
  - 'active 승격 조건: golden case, parity, outcome hypothesis, kill switch'
  - deprecated 룰은 active router에서 참조 금지
  commands:
  - python tools/validate_rule_lifecycle.py --strict
  acceptance_criteria:
  - active rule은 owner, formula_id, schema, tests, rollback 모두 존재
  - deprecated active reference count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P2_formula_contract
  id: P2_T01_FORMULA_DOMAIN_SPLIT
  priority: P0
  title: formula registry를 도메인별로 분할하고 normalized registry를 빌드 산출물로 전환
  owner: quant/developer
  rationale: 단일 4600라인 formula registry는 충돌 탐지와 리뷰가 어렵다.
  target_files:
  - spec/formulas/risk.yaml
  - spec/formulas/entry.yaml
  - spec/formulas/exit.yaml
  - spec/formulas/cash.yaml
  - spec/formulas/portfolio.yaml
  - spec/formulas/reporting.yaml
  - spec/03_formulas/formula_registry.normalized.yaml
  implementation_steps:
  - 기존 spec/13_formula_registry.yaml을 domain별 yaml로 분할
  - 각 formula에 formula_id, version, inputs, outputs, units, null_policy, tick_policy, precision, owner, golden_cases를 명시
  - normalized registry는 빌드 산출물로만 생성
  commands:
  - python tools/split_formula_registry.py --in spec/13_formula_registry.yaml --out spec/formulas
  - python tools/build_formula_registry_normalized.py --in spec/formulas --out spec/03_formulas/formula_registry.normalized.yaml
  - python tools/validate_formula_registry.py --strict
  acceptance_criteria:
  - formula_id unique
  - all input fields exist in field_dictionary
  - all outputs have owner ledger entry
  - normalized registry deterministic hash stable
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P2_formula_contract
  id: P2_T02_GOLDEN_CASE_EXPANSION
  priority: P0
  title: 의사결정 핵심 공식 golden case 100% 확대
  owner: quant/QA
  rationale: 저성능 LLM에게 자세히 지시해도 공식 검증이 없으면 잘못된 계산을 감지할 수 없다.
  target_files:
  - tests/golden/formula_golden_cases.yaml
  - tools/run_golden_cases_py.py
  - tools/run_gas_golden_parity.js
  implementation_steps:
  - 모든 decision critical formula에 normal/edge/missing/stale/extreme case 작성
  - 손계산 expected_result와 provenance를 기록
  - Python canonical과 GAS adapter를 같은 case로 검증
  commands:
  - python tools/run_golden_cases_py.py --cases tests/golden/formula_golden_cases.yaml
  - node tools/run_gas_golden_parity.js --cases tests/golden/formula_golden_cases.yaml
  acceptance_criteria:
  - decision_critical_formula_coverage_pct == 100
  - python_fail_count == 0
  - gas_parity_fail_count == 0
  - expected_result 없는 case 0건
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P2_formula_contract
  id: P2_T03_THRESHOLD_CALIBRATION_LEDGER
  priority: P0
  title: 임계값 보정 레지스트리와 outcome 근거 연결
  owner: quant
  rationale: 임계값이 많아질수록 주관적 튜닝이 성과로 오인될 위험이 커진다.
  target_files:
  - spec/calibration/calibration_registry.yaml
  - Temp/calibration_change_ledger_v*.json
  - Temp/outcome_ledger_v1.json
  implementation_steps:
  - 각 threshold에 source_type(backtest|live_outcome|expert_default), sample_n, valid_from, review_after, expected_effect를 등록
  - sample_n 부족 시 expert_default로 표시하고 PASS 증빙에 사용 금지
  - 변경마다 before/after 예상효과와 실제효과 추적
  commands:
  - python tools/validate_calibration_registry_v1.py --strict
  - python tools/build_calibration_priority_v1.py
  acceptance_criteria:
  - unregistered_threshold_count == 0
  - overclaimed_calibration_count == 0
  - sample_n < 30 threshold는 active 승격 금지 또는 WATCH_PENDING_SAMPLE
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P3_data_contract
  id: P3_T01_FIELD_DICTIONARY_STRICT
  priority: P0
  title: field dictionary를 데이터 정합성의 단일 권위로 승격
  owner: data architect
  rationale: 필드명/단위/null 정책이 흔들리면 모든 공식이 오염된다.
  target_files:
  - spec/fields/field_dictionary.yaml
  - spec/12_field_dictionary.yaml
  - tools/validate_field_dictionary.py
  implementation_steps:
  - 필드마다 canonical_name, aliases, dtype, unit, nullable, freshness_sla, source_system, owner_formula를 정의
  - alias는 ingest 단계에서만 허용하고 formula engine 내부는 canonical_name만 허용
  - unknown field는 경고가 아니라 build fail
  commands:
  - python tools/validate_field_dictionary.py --strict
  acceptance_criteria:
  - canonical field coverage 100%
  - unknown_field_count == 0
  - unit_mismatch_count == 0
  - nullable_violation_count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P3_data_contract
  id: P3_T02_DATA_QUALITY_EXPECTATIONS
  priority: P0
  title: 데이터 품질 expectation suite 도입
  owner: data/QA
  rationale: 신선도, 결측, 범위, 단위, cross-field consistency를 코드화해야 데이터 정합성을 지속 관리할 수 있다.
  target_files:
  - spec/data_quality/expectations.yaml
  - tools/validate_data_quality_expectations.py
  - Temp/data_quality_reconciliation_v1.json
  implementation_steps:
  - 필드별 not_null, in_range, freshness, allowed_values, cross_field_rule 작성
  - 계좌/가격/펀더멘털/외부컨텍스트를 expectation group으로 분리
  - 위반은 severity critical|warning|info로 구분
  commands:
  - python tools/validate_data_quality_expectations.py --snapshot GatherTradingData.json --expect spec/data_quality/expectations.yaml
  acceptance_criteria:
  - critical expectation fail_count == 0
  - warning은 report에 노출
  - expectation coverage over required fields == 100
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P3_data_contract
  id: P3_T03_LINEAGE_EVENTS
  priority: P0
  title: artifact lineage 이벤트 원장 생성
  owner: platform
  rationale: 어떤 input이 어떤 output 숫자를 만들었는지 추적할 수 없으면 오류 원인 분석이 느리다.
  target_files:
  - runtime/lineage_events.jsonl
  - tools/emit_lineage_event.py
  - tools/validate_lineage.py
  implementation_steps:
  - 모든 build_*.py는 input_artifacts, output_artifacts, code_version_hash, started_at, ended_at, status를 lineage event로 기록
  - report의 각 숫자는 source_artifact와 formula_id를 역추적 가능해야 함
  - lineage 누락 시 release fail
  commands:
  - python tools/validate_lineage.py --manifest runtime/active_artifact_manifest.yaml --events runtime/lineage_events.jsonl
    --strict
  acceptance_criteria:
  - lineage_coverage_pct == 100 for active artifacts
  - orphan_artifact_count == 0
  - missing_code_hash_count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P4_code_refactor
  id: P4_T01_PYTHON_CANONICAL_PACKAGE
  priority: P0
  title: Python canonical engine 패키지화
  owner: senior developer
  rationale: tools/*.py에 기능이 분산되면 재사용성/테스트/타입 안정성이 낮아진다.
  target_files:
  - src/quant_engine/
  - pyproject.toml
  - tools/*.py
  implementation_steps:
  - src/quant_engine 패키지 생성
  - formulas, gates, routing, sizing, execution, reporting, validation 모듈 분리
  - tools/*.py는 CLI wrapper만 남기고 core logic은 src로 이동
  - 공통 load/validate/hash/logging utility 통합
  commands:
  - python -m pytest tests/unit tests/golden
  - python tools/validate_runtime_type_edges.py
  acceptance_criteria:
  - tools file average lines 감소
  - src unit test pass
  - CLI backward compatibility pass
  - mypy 또는 pyright strict subset pass 가능
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P4_code_refactor
  id: P4_T02_GAS_ADAPTER_SPLIT
  priority: P0
  title: 대형 GAS 파일을 adapter 계층으로 분할
  owner: GAS maintainer
  rationale: gas_data_feed.gs 1만 라인 구조는 단일 변경의 회귀 영향이 너무 크다.
  target_files:
  - gas/adapters/*.gs
  - gas/sheets/*.gs
  - gas/legacy/*.gs
  - gas_data_feed.gs
  implementation_steps:
  - GAS 함수를 data collect, normalization, formula adapter, sheet write, report bridge로 분리
  - legacy wrapper는 기존 함수명을 유지해 호환성 확보
  - 모든 복제 공식에 formula_id 주석과 Python canonical reference를 달기
  - GAS는 가능한 한 read/write adapter로 축소
  commands:
  - npm run validate-gas-call-arity
  - node tools/run_gas_golden_parity.js
  acceptance_criteria:
  - single gs file lines <= 1500
  - validate-gas-call-arity pass
  - gas golden parity pass
  - legacy public function missing 0건
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P4_code_refactor
  id: P4_T03_SCHEMA_MODEL_GENERATION
  priority: P0
  title: YAML/JSON schema에서 Pydantic model 자동 생성
  owner: developer/QA
  rationale: 스키마와 Python 타입이 따로 놀면 런타임 오류를 늦게 발견한다.
  target_files:
  - schemas/*.schema.json
  - schemas/generated/*.py
  - src/quant_engine/models/
  implementation_steps:
  - 스키마에서 Pydantic model 생성 또는 수동 model과 schema parity 검증
  - strict type, unit, optional policy 적용
  - artifact 로딩은 model validation을 통과해야만 허용
  commands:
  - python tools/generate_models_from_schema.py --schemas schemas --out src/quant_engine/models/generated
  - python tools/validate_runtime_type_edges.py
  acceptance_criteria:
  - all active artifacts validate with generated models
  - model/schema drift count == 0
  - runtime type edge validation pass
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P5_decision_harness
  id: P5_T01_DECISION_GRAPH_DAG
  priority: P0
  title: 11단계 라우팅을 DAG로 명시하고 결정 경로를 로그화
  owner: architect/quant
  rationale: 결정 순서가 문서/코드마다 다르면 같은 데이터에서 다른 verdict가 나온다.
  target_files:
  - spec/routing/decision_graph.yaml
  - src/quant_engine/routing/decision_graph.py
  - Temp/routing_execution_log_table_v1.json
  implementation_steps:
  - '노드: data_quality -> portfolio_health -> cash -> heat -> stop/tp -> anti_chase -> regime -> sector/beta -> style -> sizing
    -> execution'
  - 각 노드의 inputs, outputs, preconditions, fail_action, priority를 YAML로 작성
  - router는 YAML DAG를 읽어 실행하고 trace를 남김
  commands:
  - python tools/validate_decision_graph.py --graph spec/routing/decision_graph.yaml --strict
  - python tools/build_routing_execution_log_v1.py
  acceptance_criteria:
  - routing path deterministic hash stable
  - all verdicts have decision_path
  - unreachable node count == 0
  - priority conflict count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P5_decision_harness
  id: P5_T02_FINAL_PACKET_CONTRACT
  priority: P0
  title: final_decision_packet을 LLM 입력의 유일한 계약으로 고정
  owner: reporting/architect
  rationale: 저성능 LLM은 입력이 많으면 임의 선택을 하므로 final packet 하나만 읽게 해야 한다.
  target_files:
  - schemas/final_decision_packet_v3.schema.json
  - Temp/final_decision_packet_v3.json
  - prompts/report_renderer_prompt.md
  implementation_steps:
  - packet에 account_summary, portfolio_health, gate_summary, order_blueprint, shadow_ledger, evidence_ledger, forbidden_actions를
    포함
  - 모든 숫자 필드에는 source_ref와 formula_id를 붙임
  - LLM prompt는 packet 외 파일 참조 금지
  commands:
  - python tools/build_final_decision_packet_v3.py --manifest runtime/active_artifact_manifest.yaml --out Temp/final_decision_packet_v3.json
  - python tools/validate_final_decision_packet.py --strict
  acceptance_criteria:
  - final packet schema valid
  - all numeric fields have provenance
  - renderer direct Temp read count == 0
  - unsupported number count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P5_decision_harness
  id: P5_T03_SHADOW_LEDGER_MANDATORY
  priority: P0
  title: 차단 종목도 산출 지표를 감추지 않는 shadow ledger 강화
  owner: reporting/QA
  rationale: 사용자 판단권과 사후 평가를 위해 BLOCKED/WATCH도 산출 수명 지표가 보여야 한다.
  target_files:
  - spec/outputs/shadow_ledger_contract.yaml
  - schemas/shadow_ledger.schema.json
  - src/quant_engine/reporting/shadow_ledger.py
  implementation_steps:
  - BLOCKED, WATCH, HOLD, BUY, SELL 모두 산출 지정가/손절가/익절가/이론수량/차단사유를 보존
  - HTS 가능 주문표와 shadow ledger를 물리적으로 분리
  - 차단 사유는 formula_id 기반 단답으로 제한
  commands:
  - python tools/validate_shadow_ledger.py --strict
  acceptance_criteria:
  - blocked item shadow coverage == 100%
  - HTS order table contains only executable orders
  - shadow ledger numeric provenance == 100%
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P6_llm_serving
  id: P6_T01_LOW_CAPABILITY_RENDER_CONTRACT
  priority: P0
  title: 저성능 LLM용 renderer contract를 폐쇄형으로 작성
  owner: LLM/reporting
  rationale: 저성능 LLM이 최고 LLM과 같은 결과를 내게 하려면 자유서술이 아니라 slot filling만 허용해야 한다.
  target_files:
  - prompts/low_capability_report_renderer.md
  - spec/render/renderer_contract.yaml
  - tools/validate_llm_response.py
  implementation_steps:
  - 입력은 final_decision_packet_v3.json만 허용
  - 출력 섹션 순서와 테이블 컬럼을 고정
  - 숫자는 {{source_ref.value}} 형태로만 복사
  - 없는 값은 MISSING_SOURCE로 표시하고 추정 금지
  - 금지 어휘와 softening narrative 목록 적용
  commands:
  - python tools/validate_llm_response.py --packet Temp/final_decision_packet_v3.json --report Temp/operational_report.md
    --strict
  acceptance_criteria:
  - llm_freedom_pct == 0
  - ungrounded_number_count == 0
  - required_section_missing_count == 0
  - narrative_softening_violation_count == 0
  low_capability_llm_instruction: final_decision_packet_v3.json 이외의 파일을 읽지 마라. 표 컬럼을 변경하지 마라. 숫자는 복사만 하라. 누락은 누락이라고 써라.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P6_llm_serving
  id: P6_T02_NUMBER_PROVENANCE_AUDIT
  priority: P0
  title: 모든 수치 출처 자기감사 mandatory
  owner: QA
  rationale: 숫자 하나라도 근거 없이 출력되면 투자 엔진 신뢰성이 무너진다.
  target_files:
  - Temp/number_provenance_audit_v3.json
  - tools/validate_number_provenance_v2.py
  implementation_steps:
  - 보고서의 모든 숫자 token을 추출
  - packet/evidence ledger에 존재하는지 매칭
  - '허용 형식: 날짜, 순번, 섹션 번호 등 non-investment number whitelist 분리'
  - 불일치 시 release fail
  commands:
  - python tools/validate_number_provenance_v2.py --report Temp/operational_report.md --packet Temp/final_decision_packet_v3.json
    --strict
  acceptance_criteria:
  - investment_number_coverage_pct == 100
  - ungrounded_investment_number_count == 0
  - whitelist_abuse_count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P7_testing_release
  id: P7_T01_TEST_PYRAMID
  priority: P0
  title: 테스트 피라미드 재구성
  owner: QA/developer
  rationale: 검증 스크립트는 많지만 테스트 계층이 명확하지 않으면 누락과 중복이 동시에 발생한다.
  target_files:
  - tests/unit
  - tests/golden
  - tests/parity
  - tests/regression
  - tests/integration
  - tests/e2e
  implementation_steps:
  - 'unit: pure formula/gate'
  - 'golden: 손계산 기대값'
  - 'parity: Python vs GAS'
  - 'regression: 과거 실패 케이스'
  - 'integration: pipeline artifacts'
  - 'e2e: report quality와 deterministic replay'
  commands:
  - python -m pytest tests/unit tests/golden tests/regression
  - npm run validate-determinism
  - npm run full-gate
  acceptance_criteria:
  - decision critical formula unit coverage == 100
  - golden pass == 100
  - regression fail recurrence == 0
  - e2e deterministic replay pass
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P7_testing_release
  id: P7_T02_RELEASE_TRAIN
  priority: P0
  title: release train과 promotion gate 고정
  owner: release manager
  rationale: 임의 수동 패키징과 부분 검증은 운영 신뢰도를 떨어뜨린다.
  target_files:
  - spec/release/release_train.yaml
  - package.json
  - tools/release_gate.py
  implementation_steps:
  - dev -> shadow -> limited -> release 4단계 승격 정의
  - shadow는 주문표를 생성하되 실행권고 금지
  - limited는 일부 섹션만 운영 반영
  - release는 full-gate와 outcome feedback 필수
  - rollback command와 이전 manifest 보존
  commands:
  - npm run validate-engine-strict
  - npm run full-gate
  - npm run prepare-upload-zip -- --validation-mode release --profile
  acceptance_criteria:
  - release package requires gate_status OK
  - failed_checks_count == 0
  - rollback_manifest exists
  - skip_validate usage count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P7_testing_release
  id: P7_T03_DETERMINISM_REPLAY
  priority: P0
  title: 결정론 replay pack 확대
  owner: QA/platform
  rationale: 동일 데이터에서 매번 다른 보고서가 나오면 LLM/엔진 모두 운영 불가다.
  target_files:
  - tests/replay/*.yaml
  - Temp/audit_replay_snapshot_v2.json
  - tools/validate_determinism.py
  implementation_steps:
  - 대표 국면 12개와 실패 사례 30개를 replay case로 고정
  - input hash, expected packet hash, expected gate summary 기록
  - 문장 표현은 바뀌어도 numeric packet hash는 동일해야 함
  commands:
  - npm run validate-determinism
  - python tools/validate_replay_pack.py --strict
  acceptance_criteria:
  - packet_hash_match_pct == 100
  - gate_summary_match_pct == 100
  - numeric_diff_count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P8_observability_feedback
  id: P8_T01_OBSERVABILITY_RUN_PROFILE
  priority: P0
  title: 파이프라인 실행 관측성 표준화
  owner: platform
  rationale: 검증이 느려지고 실패 원인이 불명확해지면 개발 속도가 떨어진다.
  target_files:
  - runtime/run_profiles/*.json
  - src/quant_engine/observability/
  - tools/profile_pipeline_runtime.py
  implementation_steps:
  - 모든 npm script와 build tool은 elapsed_ms, input_count, output_count, status, error_code를 기록
  - heavy/quick/package-only 모드별 SLA 지정
  - 이상 소요시간과 중복 실행을 검출
  commands:
  - npm run profile-pipeline-runtime
  - python tools/validate_pipeline_runtime_anomaly.py
  acceptance_criteria:
  - profile coverage for required scripts == 100
  - release elapsed <= target or justified
  - duplicate heavy validation count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P8_observability_feedback
  id: P8_T02_OUTCOME_ATTRIBUTION
  priority: P0
  title: 실거래/미실행 결과 귀속 원장 강화
  owner: quant/PM
  rationale: 룰이 성과를 개선했는지 모르고 계속 추가하면 과최적화된다.
  target_files:
  - Temp/outcome_ledger_v2.json
  - Temp/live_vs_replay_performance_audit_v2.json
  - tools/build_outcome_attribution.py
  implementation_steps:
  - 추천 당시 packet과 이후 가격/체결/미체결 결과 연결
  - alpha lead, late chase, value damage, slippage, opportunity cost를 분해
  - 룰별 contribution과 false positive/negative 집계
  - sample_n 미달은 개선 증거로 사용 금지
  commands:
  - python tools/build_outcome_attribution.py --packet-history Temp --out Temp/outcome_ledger_v2.json
  - python tools/validate_outcome_eval_window.py --strict
  acceptance_criteria:
  - each recommendation has outcome_id or pending_reason
  - rule_attribution coverage >= 95%
  - sample_maturity labels present
  - no design_score_as_real_performance
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P9_operating_model
  id: P9_T01_WEEKLY_ENGINE_REVIEW
  priority: P0
  title: 주간 엔진 리뷰 프로토콜 정착
  owner: PM/quant
  rationale: 투자 엔진은 코드 품질과 투자성과를 같이 리뷰해야 한다.
  target_files:
  - governance/weekly_engine_review_template.md
  - Temp/continuous_evaluation_dashboard_v2.json
  implementation_steps:
  - 매주 토/일 리밸런싱 전 engine health, data quality, formula parity, outcome drift, active rule changes를 1페이지로 리뷰
  - 투자 제안과 엔진 변경 제안을 분리
  - 긴급 패치와 정규 패치를 구분
  commands:
  - python tools/build_continuous_evaluation_dashboard_v2.py
  - python tools/render_weekly_engine_review.py
  acceptance_criteria:
  - weekly review generated
  - critical engine issue count reported
  - new rule without outcome hypothesis count == 0
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
- phase: P9_operating_model
  id: P9_T02_CHANGE_REQUEST_TEMPLATE
  priority: P0
  title: 룰/공식 변경 요청 템플릿 표준화
  owner: PM/architect
  rationale: 변경 요청이 산발적이면 개발자가 문맥을 추정하게 되고 설계가 흔들린다.
  target_files:
  - governance/change_request_template.yaml
  - governance/change_requests/*.yaml
  implementation_steps:
  - '변경 요청 필수 필드: problem, evidence, target_metric, affected_formula, affected_output, expected_side_effect, rollback_plan,
    test_cases'
  - 승인 없는 변경은 active 승격 금지
  - 긴급 hotfix는 72시간 내 ADR로 정리
  commands:
  - python tools/validate_change_requests.py --strict
  acceptance_criteria:
  - all active changes have request_id
  - rollback_plan missing 0건
  - test_case missing 0건
  low_capability_llm_instruction: 입력 파일을 열고 implementation_steps를 순서대로 수행한다. 판단하거나 생략하지 않는다. 숫자는 target_files 또는 산출 artifact에
    있는 값만 사용한다.
  reject_if:
  - 근거 artifact 없이 완료 선언
  - 공식/수치를 임의 생성
  - 검증 명령 실패를 무시
low_capability_llm_master_runbook:
  purpose: 저성능 LLM 또는 주니어 작업자가 TODO만 보고도 동일한 리팩토링 결과물을 만들도록 하는 폐쇄형 작업 절차
  global_rules:
  - 절대 추정하지 않는다. 파일에 없으면 MISSING_SOURCE로 표시한다.
  - 숫자·공식·threshold·가격·수량을 새로 만들지 않는다.
  - 한 번에 한 phase만 수행한다. phase acceptance가 PASS가 아니면 다음 phase로 가지 않는다.
  - Temp의 v숫자 파일을 임의 최신으로 선택하지 않는다. active manifest만 따른다.
  - 문서 변경은 반드시 대응 validator 또는 grep check를 추가한다.
  - 대형 파일에서 내용을 삭제하지 말고 먼저 split script로 이동 후 hash/count 검증을 한다.
  - 완료 보고는 PASS/WARN/FAIL 중 하나로만 한다. 100%라는 표현은 completion gate가 증명할 때만 쓴다.
  execution_order:
  - P0_T01_ACTIVE_MANIFEST
  - P0_T02_AUTHORITY_MATRIX
  - P0_T03_BASELINE_METRICS
  - P1_T01_AGENTS_SHRINK
  - P1_T02_ADR_SYSTEM
  - P1_T03_RULE_LIFECYCLE
  - P2_T01_FORMULA_DOMAIN_SPLIT
  - P2_T02_GOLDEN_CASE_EXPANSION
  - P2_T03_THRESHOLD_CALIBRATION_LEDGER
  - P3_T01_FIELD_DICTIONARY_STRICT
  - P3_T02_DATA_QUALITY_EXPECTATIONS
  - P3_T03_LINEAGE_EVENTS
  - P4_T01_PYTHON_CANONICAL_PACKAGE
  - P4_T02_GAS_ADAPTER_SPLIT
  - P4_T03_SCHEMA_MODEL_GENERATION
  - P5_T01_DECISION_GRAPH_DAG
  - P5_T02_FINAL_PACKET_CONTRACT
  - P5_T03_SHADOW_LEDGER_MANDATORY
  - P6_T01_LOW_CAPABILITY_RENDER_CONTRACT
  - P6_T02_NUMBER_PROVENANCE_AUDIT
  - P7_T01_TEST_PYRAMID
  - P7_T02_RELEASE_TRAIN
  - P7_T03_DETERMINISM_REPLAY
  - P8_T01_OBSERVABILITY_RUN_PROFILE
  - P8_T02_OUTCOME_ATTRIBUTION
  - P9_T01_WEEKLY_ENGINE_REVIEW
  - P9_T02_CHANGE_REQUEST_TEMPLATE
  per_task_required_output_format:
    status: PASS|WARN|FAIL
    changed_files:
    - path1
    - path2
    commands_run:
    - command: string
      exit_code: integer
      summary: string
    metrics_before_after:
    - metric: string
      before: number|string
      after: number|string
      target: number|string
    remaining_risks:
    - risk1
    next_task_id: string
  stop_conditions:
  - schema validation failure
  - golden case failure
  - gas/python parity failure
  - authority collision count > 0 after P0
  - ungrounded number count > 0 after P6
  - release gate failed_checks_count > 0
minimal_new_files_to_add_first:
- path: runtime/active_artifact_manifest.yaml
  why: Temp 산출물 버전 오독 차단
- path: governance/authority_matrix.yaml
  why: 필드/공식/출력 권위 충돌 차단
- path: governance/rule_lifecycle.yaml
  why: 룰 누적 부채 차단
- path: governance/adr/0001-adopt-qeda-dm.md
  why: 방법론 채택 의사결정 기록
- path: spec/routing/decision_graph.yaml
  why: 결정 순서와 우선순위 고정
- path: spec/render/renderer_contract.yaml
  why: LLM renderer 자유도 0% 강제
- path: spec/data_quality/expectations.yaml
  why: 데이터 정합성 기대값 코드화
- path: tests/golden/formula_golden_cases.yaml
  why: 공식 회귀 방지
- path: runtime/lineage_events.jsonl
  why: 원인 추적과 영향 분석
- path: Temp/refactor_baseline_metrics_v1.json
  why: 리팩토링 효과 수치 증빙
first_10_commands_after_files_exist:
- python tools/build_refactor_baseline_metrics.py --root . --out Temp/refactor_baseline_metrics_v1.json
- python tools/validate_active_manifest.py --manifest runtime/active_artifact_manifest.yaml --strict
- python tools/validate_authority_matrix.py --strict
- python tools/validate_field_dictionary.py --strict
- python tools/validate_formula_registry.py --strict
- python tools/run_golden_cases_py.py --cases tests/golden/formula_golden_cases.yaml
- node tools/run_gas_golden_parity.js --cases tests/golden/formula_golden_cases.yaml
- python tools/validate_decision_graph.py --graph spec/routing/decision_graph.yaml --strict
- python tools/validate_llm_response.py --packet Temp/final_decision_packet_v3.json --report Temp/operational_report.md --strict
- npm run full-gate
definition_of_done:
  phase_0_done:
  - active_manifest exists
  - authority_collision_count == 0
  - baseline metrics generated
  phase_1_done:
  - AGENTS.md <= 350 lines
  - all rules preserved by ID hash
  - ADR index valid
  phase_2_done:
  - formula registry split
  - normalized build deterministic
  - golden/parity pass
  phase_3_done:
  - field dictionary strict pass
  - data quality expectations pass
  - lineage coverage 100
  phase_4_done:
  - Python canonical package test pass
  - GAS adapters split and parity pass
  - schema model drift 0
  phase_5_done:
  - decision graph deterministic
  - final packet valid
  - shadow ledger coverage 100
  phase_6_done:
  - LLM freedom 0
  - ungrounded numbers 0
  - narrative lock pass
  phase_7_done:
  - test pyramid pass
  - release train gate pass
  - replay hash match 100
  phase_8_done:
  - run profiles complete
  - outcome attribution coverage >= 95
  phase_9_done:
  - weekly review generated
  - all active changes have request/ADR/rollback
recommended_pm_cadence:
  daily:
  - data freshness check
  - failed gate triage
  - lineage missing check
  weekly_sat_sun:
  - portfolio rebalance report
  - engine health review
  - rule outcome review
  - new TODO reprioritization
  monthly_1_11_21:
  - mid-cycle checkpoint
  - calibration registry review
  - sample maturity review
  - data source SLA review
  release:
  - ADR review
  - golden/parity/replay pass
  - full-gate pass
  - rollback manifest prepared
anti_patterns_forbidden:
- AGENTS.md에 새 상세 공식을 계속 붙여넣기
- Temp 파일명에 v숫자가 높다는 이유로 최신으로 간주하기
- GAS와 Python에 같은 공식을 복붙하고 parity test를 생략하기
- schema 없이 JSON artifact를 추가하기
- sample_n 부족인데 PASS 또는 성능 개선으로 주장하기
- 보고서 품질 개선을 위해 LLM에게 수치 보완을 허용하기
- 검증 실패를 skip 옵션으로 통과시키기
- 대형 파일에 새 함수를 계속 추가하기
- 룰 추가를 성능 개선으로 간주하고 outcome ledger를 생략하기
- 외부 뉴스/가격을 주문 판단 숫자에 직접 혼입하기
external_method_basis:
  ADR: 아키텍처 의사결정은 ADR로 context/decision/consequence를 기록한다.
  JSON_Schema: artifact shape와 validation vocabulary는 schema로 고정한다.
  Data_Quality_Expectation: 데이터 품질 규칙은 expectation/test로 코드화한다.
  Data_Lineage: dataset/job/run 수준 lineage로 오류 원인과 변경 영향 분석을 가능하게 한다.
  Type_Validation: Python 타입/모델 validation으로 artifact drift를 조기 차단한다.
  Testing: pytest 기반 unit/golden/regression 테스트를 CI 게이트화한다.
  Observability: trace/metric/log 기반으로 pipeline run의 상태와 병목을 관측한다.
task_execution_status:
  summary:
    implemented: 27
    validated: 0
    completed: 27
    blocked: 0
    operational_ready: false
  items:
    - id: P0_T01_ACTIVE_MANIFEST
      status: completed
      evidence:
        - runtime/active_artifact_manifest.yaml
        - tools/validate_active_manifest.py
        - Temp/active_artifact_manifest_v2.json
    - id: P0_T02_AUTHORITY_MATRIX
      status: completed
      evidence:
        - governance/authority_matrix.yaml
        - spec/03_formulas/output_field_owner_ledger.yaml
        - spec/12_field_dictionary.yaml
        - tools/build_authority_matrix.py
        - tools/validate_authority_matrix.py
    - id: P0_T03_BASELINE_METRICS
      status: completed
      evidence:
        - Temp/refactor_baseline_metrics_v1.json
        - tools/build_refactor_baseline_metrics.py
    - id: P1_T01_AGENTS_SHRINK
      status: completed
      evidence:
        - AGENTS.md
        - governance/agents_index.yaml
        - governance/agents_rule_hashes.yaml
        - governance/rules/00_core_locks.yaml
        - governance/rules/01_harness_contract.yaml
        - governance/rules/02_portfolio_policy.yaml
        - governance/rules/03_order_grammar.yaml
        - governance/rules/04_reporting_contract.yaml
        - governance/rules/05_migration_hashes.yaml
        - tools/validate_agents_shrink_v1.py
        - tools/build_agents_rule_hashes_v1.py
        - tools/validate_agents_rule_hashes_v1.py
    - id: P1_T02_ADR_SYSTEM
      status: completed
      evidence:
        - governance/adr_index.yaml
        - governance/adr/*.md
        - tools/validate_adr_index.py
    - id: P1_T03_RULE_LIFECYCLE
      status: completed
      evidence:
        - governance/rule_lifecycle.yaml
        - tools/validate_rule_lifecycle.py
    - id: P2_T01_FORMULA_DOMAIN_SPLIT
      status: completed
      evidence:
        - spec/formulas/risk.yaml
        - spec/formulas/entry.yaml
        - spec/formulas/exit.yaml
        - spec/formulas/cash.yaml
        - spec/formulas/portfolio.yaml
        - spec/formulas/reporting.yaml
        - spec/formulas/manifest.yaml
        - spec/03_formulas/formula_registry.normalized.yaml
        - tools/split_formula_registry.py
        - tools/build_formula_registry_normalized.py
        - tools/validate_formula_registry.py
    - id: P2_T02_GOLDEN_CASE_EXPANSION
      status: completed
      evidence:
        - spec/formula_golden_cases_v4.yaml
        - Temp/yaml_code_coverage_v1.json
        - tools/build_yaml_code_coverage_v1.py
        - tools/validate_golden_coverage_100.py
    - id: P2_T03_THRESHOLD_CALIBRATION_LEDGER
      status: completed
      evidence:
        - Temp/calibration_change_ledger_v4.json
        - Temp/calibration_priority_v1.json
        - Temp/outcome_ledger_v1.json
        - tools/build_calibration_change_ledger_v4.py
        - tools/validate_calibration_change_ledger_v1.py
    - id: P3_T01_FIELD_DICTIONARY_STRICT
      status: completed
      evidence:
        - spec/fields/field_dictionary.yaml
        - spec/12_field_dictionary.yaml
        - tools/validate_field_dictionary.py
    - id: P3_T02_DATA_QUALITY_EXPECTATIONS
      status: completed
      evidence:
        - spec/data_quality/expectations.yaml
        - tools/validate_data_quality_expectations.py
    - id: P3_T03_LINEAGE_EVENTS
      status: completed
      evidence:
        - runtime/lineage_events.jsonl
        - tools/emit_lineage_event.py
        - tools/validate_lineage.py
    - id: P4_T01_PYTHON_CANONICAL_PACKAGE
      status: completed
      evidence:
        - src/quant_engine/__init__.py
        - src/quant_engine/models/__init__.py
        - src/quant_engine/models/generated/__init__.py
        - tools/generate_models_from_schema.py
        - tools/validate_schema_model_generation_v1.py
        - Temp/schema_model_generation_v1.json
    - id: P4_T02_GAS_ADAPTER_SPLIT
      status: completed
      evidence:
        - spec/39_gas_thin_adapter_policy.yaml
        - tools/validate_gas_thin_adapter_v1.py
        - Temp/gas_business_logic_audit_v1.json
    - id: P4_T03_SCHEMA_MODEL_GENERATION
      status: completed
      evidence:
        - schemas/generated/*.schema.json
        - src/quant_engine/models/generated/*.py
        - tools/generate_models_from_schema.py
        - tools/validate_schema_model_generation_v1.py
    - id: P5_T01_DECISION_GRAPH_DAG
      status: completed
      evidence:
        - spec/routing/decision_graph.yaml
        - tools/validate_decision_graph.py
        - tools/build_routing_execution_log_v1.py
    - id: P5_T02_FINAL_PACKET_CONTRACT
      status: completed
      evidence:
        - schemas/final_decision_packet_v3.schema.json
        - Temp/final_decision_packet_v3.json
        - tools/build_final_decision_packet_v3.py
        - tools/validate_final_decision_packet.py
    - id: P5_T03_SHADOW_LEDGER_MANDATORY
      status: completed
      evidence:
        - spec/outputs/shadow_ledger_contract.yaml
        - schemas/shadow_ledger.schema.json
        - src/quant_engine/reporting/shadow_ledger.py
        - Temp/shadow_ledger_v1.json
        - tools/validate_shadow_ledger.py
    - id: P6_T01_LOW_CAPABILITY_RENDER_CONTRACT
      status: completed
      evidence:
        - prompts/low_capability_report_renderer.md
        - spec/render/renderer_contract.yaml
        - tools/validate_llm_response.py
    - id: P6_T02_NUMBER_PROVENANCE_AUDIT
      status: completed
      evidence:
        - Temp/number_provenance_audit_v3.json
        - tools/build_number_provenance_audit_v2.py
        - tools/validate_number_provenance_v2.py
    - id: P7_T01_TEST_PYRAMID
      status: completed
      evidence:
        - tests/unit
        - tests/golden
        - tests/parity
        - tests/regression
        - tests/integration
        - tests/e2e
        - tools/validate_test_pyramid.py
    - id: P7_T02_RELEASE_TRAIN
      status: completed
      evidence:
        - spec/release/release_train.yaml
        - tools/validate_release_train.py
        - tools/release_gate.py
    - id: P7_T03_DETERMINISM_REPLAY
      status: completed
      evidence:
        - tests/replay/README.yaml
        - tools/validate_replay_pack.py
        - tools/validate_determinism.py
    - id: P8_T01_OBSERVABILITY_RUN_PROFILE
      status: completed
      evidence:
        - runtime/run_profiles/profile_pipeline_runtime.json
        - tools/profile_pipeline_runtime.py
        - tools/validate_pipeline_runtime_anomaly.py
    - id: P8_T02_OUTCOME_ATTRIBUTION
      status: completed
      evidence:
        - Temp/outcome_ledger_v2.json
        - Temp/live_vs_replay_performance_audit_v2.json
        - tools/build_outcome_attribution.py
        - tools/validate_outcome_eval_window.py
    - id: P9_T01_WEEKLY_ENGINE_REVIEW
      status: completed
      evidence:
        - governance/weekly_engine_review_template.md
        - Temp/continuous_evaluation_dashboard_v2.json
        - Temp/weekly_engine_review.md
        - tools/build_continuous_evaluation_dashboard_v2.py
        - tools/render_weekly_engine_review.py
    - id: P9_T02_CHANGE_REQUEST_TEMPLATE
      status: completed
      evidence:
        - governance/change_request_template.yaml
        - governance/change_requests/0001-example.yaml
        - tools/validate_change_requests.py
