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