schema_version: quant_engine_refactor_qedd_todo.v1 title: QEDD 기반 퀀트투자 엔진 구조 리팩토링 TODO generated_for: asset_investment_portfolio_project generated_at_kst: '2026-06-09T10:19:16+09:00' role_assumption: 30년 퀀트투자자 + 개발자 + 아키텍트 + PM 관점의 실행 지시서 source_basis: primary_files_read: - AGENTS.md - README.md - governance/adr/0011-qedd-methodology.md - spec/49_refactor_methodology_contract.yaml - spec/34_architecture_boundaries.yaml - spec/48_module_io_contract_registry.yaml - spec/23_low_capability_llm_pipeline_todo.yaml - spec/24_strategy_hardening_todo_v1.yaml - spec/27_bch_calibration_runbook.yaml - runtime/active_artifact_manifest.yaml - Temp/engine_harness_gate_result.json - Temp/formula_runtime_registry_v1.json - Temp/pipeline_runtime_profile_v1.json allowed_source_extensions: - .md - .yaml - .gs - .py runtime_artifact_extensions: - .json - .jsonl - .schema.json non_negotiable_authority_order: - spec/*.yaml - runtime/active_artifact_manifest.yaml - Temp/final_decision_packet_active.json - governance/rules/*.yaml - src/quant_engine/*.py - gas_*.gs as adapter only - prompts/*.md as rendering instruction only current_evidence: source_zip: data_feed.zip observed_at_kst: '2026-06-09T10:19:16+09:00' repository_file_count: 1445 extension_counts: .py: 841 .json: 376 .yaml: 173 .md: 40 .gs: 8 .ps1: 4 .jsonl: 2 .js: 1 top_directory_file_counts: tools: 367 src: 330 schemas: 165 tests: 160 runtime: 158 spec: 128 artifacts: 41 governance: 26 Temp: 19 prompts: 9 docs: 8 examples: 8 validation_snapshot: validate_specs: PASS validate_agents_shrink_v1: gate: PASS agents_lines: 89 rule_files: 6 validate_docs_no_rule_duplication_v1: gate: PASS markdown_rule_duplication_count: 0 prompt_formula_definition_count: 0 markdown_file_count: 40 validate_number_provenance_strict_v3: gate: PASS number_provenance_coverage_pct: 100 stale_critical_number_count: 0 unproven_report_number_count: 0 validate_architecture_boundaries_v2: gate: FAIL renderer_calculation_count: 0 reverse_dependency_count: 0 module_io_schema_coverage_pct: 0.0 artifact_chain_count: 0 validate_package_script_budget_v1: gate: FAIL script_count: 22 limit: 12 validate_gas_thin_adapter_v1: gate: PASS forbidden_gas_business_logic_count: 98 function_inventory_coverage_pct: 100.0 migration_plan_exists: true engine_harness_gate_result: status: OK failed_checks_count: 0 checks_count: 106 pipeline_runtime_profile_v1: mode: package-only gate_status: SKIPPED file_count: 1445 elapsed_sec_total: 5.717 formula_runtime_registry_v1: formula_total: 292 declared_runtime_count: 292 runtime_adjusted_coverage_pct: 100.0 unmapped_formula_count: 0 active_artifact_manifest_v2: report_active_artifact_match_pct: 100.0 authority_collision_count: 0 stale_artifact_count: 0 canonical_source: Temp/final_decision_packet_active.json prediction_accuracy_harness_v2: prediction_match_rate_pct: 54.76 diagnosis: - 현재 엔진은 하네스/증빙/문서 중복 방지 기반은 강하나, architecture boundary v2와 package script budget이 FAIL이다. - GAS thin adapter gate는 PASS이나 GAS 내부 비즈니스 로직 흔적 98건이 남아 Python canonical first 원칙을 계속 훼손할 수 있다. - 공식 수가 292개로 증가했고 generated schema/model/tool 수가 많아 신규 기능 추가 시 파편화 위험이 높다. - pipeline package-only 프로필의 gate_status가 SKIPPED이므로 release 검증 성공으로 과장하면 안 된다. - prediction_match_rate_pct 54.76은 설계 커버리지 100%와 별개로 투자 예측력 개선 루프가 필요하다는 신호다. executive_decision: methodology_name: 'QEDD-CI: Quant Evidence-Driven Deterministic Development with Continuous Invariants' one_sentence: 투자판단은 YAML 계약과 Python canonical 계산으로만 만들고, GAS는 수집/입출력 어댑터, LLM은 이미 계산된 final decision packet을 증빙과 함께 렌더링하는 구조로 고정한다. recommended_architecture: - 'spec_contract_layer: 투자정책, 공식, 리스크, 출력 스키마의 유일 원천' - 'python_canonical_layer: 모든 수치 계산, 게이트, 라우팅, 리스크, 포지션 사이징 실행' - 'gas_adapter_layer: Google Sheets 수집, 정규화, 호출, 업로드/다운로드만 담당' - 'runtime_packet_layer: final_decision_packet_active.json 하나로 serving 단일화' - 'renderer_layer: operational_report.json/md 생성. 계산 금지, 판단 번복 금지' - 'governance_layer: ADR, change request, lifecycle, shadow ledger, rollback 관리' - 'test_harness_layer: golden case, behavioral coverage, provenance, architecture, release DAG' refactor_priority: - P0 architecture boundary FAIL 해소 - P1 package script budget FAIL 해소 - P2 GAS business logic 98건 Python 이전 - P3 formula lifecycle와 owner ledger로 292개 공식 통제 - P4 prediction_match_rate 54.76 개선을 위한 outcome feedback loop 강화 - P5 저성능 LLM execution pack을 final packet copy-only 모드로 고정 hard_locks: llm_math_allowed: false llm_price_quantity_formula_creation_allowed: false report_can_override_harness_decision: false release_can_ignore_failed_validation: false package_only_skipped_gate_can_be_called_pass: false deprecated_artifact_can_be_runtime_source: false gas_can_hold_business_logic_after_migration: false new_formula_without_schema_golden_owner: false new_doc_that_duplicates_rule: false unproven_number_in_report: false reverse_dependency_from_renderer_allowed: false anti_late_entry_gate_skip_allowed: false sell_priority_waterfall_bypass_allowed: false operating_cadence_flag_deviation_allowed: false cash_floor_d2_violation_allowed: false llm_verbatim_copy_only_enforced: true definition_of_done: release_gate: npm run full-gate exit_code == 0 AND Temp/engine_harness_gate_result.json.status == OK architecture: validate_architecture_boundaries_v2 gate == PASS, module_io_schema_coverage_pct == 100, artifact_chain_count > 0 script_budget: validate_package_script_budget_v1 gate == PASS, package.json scripts <= 12 gas_thin_adapter: forbidden_gas_business_logic_count == 0 OR all remaining findings are allowlisted pure adapter assembly with owner approval formula_runtime: runtime_adjusted_coverage_pct == 100.0, unmapped_formula_count == 0 behavioral_coverage: behavioral_coverage_pct == 100.0, implementation_divergence_count == 0 number_provenance: number_provenance_coverage_pct == 100, unproven_report_number_count == 0 report_integrity: operational_report.json validates schema and syncs with final_decision_packet_active portfolio_truth: live/replay separation PASS and design score is never claimed as realized performance low_capability_llm: LLM receives final_context_pack and renders without recomputing any number llm_verbatim_copy: LLM renders operational report by copy-only mode from final_context without arithmetic recomputations one_way_dependency: No reverse dependencies from tools/gas/prompts/renderer to core calculation logic investment_cadence: Weekend rebalance (rebalance_required) and mid-month checks (mid_check_required) strictly synced portfolio_safety: D+2 cash acts as immediate defense cash floor under 500M budget, with anti-late entry validation enforced target_repository_shape: max_total_files: 2000 max_package_scripts: 12 max_root_gas_files: 8 target_gas_business_logic_findings: 0 target_markdown_rule_duplication_count: 0 target_agents_md_lines_max: 100 target_runtime_source_aliases: - final_decision_packet_active source_tree_policy: spec: 권위 계약만 둔다. 설명 장문은 docs로 밀어내지 말고 ADR 1장으로 제한한다. src/quant_engine: canonical 계산 구현만 둔다. 생성 파일은 models/generated와 formulas/generated로 격리한다. tools: CLI wrapper와 validator만 둔다. 핵심 투자 로직 금지. gas: 수집/시트 I/O/패킷 전달만 담당. 점수·수량·가격 산식 금지. Temp: 읽기 전용 런타임 산출물. 직접 편집 금지. prompts: 렌더링 절차만. 공식 정의·임계값·투자판단 금지. governance: ADR, authority, lifecycle, CR만. 중복 규칙 금지. tests: golden, property invariant, release regression만. refactor_todo: - phase_id: PHASE_00 name: Baseline freeze and truth map objective: 현재 상태를 고정하고, 어떤 파일이 권위인지 단일 원장으로 확정한다. ordered_tasks: - id: P00_T01_FREEZE_BASELINE priority: P0 owner: architect action: 현재 zip을 baseline으로 고정하고 해시를 기록한다. method: data_feed.zip을 풀고 전체 파일 hash, file count, extension count, top directory count를 runtime/refactor_baseline_v2.yaml에 저장한다. 기존 baseline과 차이가 있으면 change_request를 먼저 만든다. files_to_touch: - runtime/refactor_baseline_v2.yaml - governance/change_requests/CR-YYYYMMDD-refactor-baseline.yaml commands: - python tools/build_refactor_baseline_v2.py --root . --out runtime/refactor_baseline_v2.yaml expected_evidence: file_count: recorded sha256_manifest: present if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P00_T02_AUTHORITY_LEDGER priority: P0 owner: architect action: source of truth 권위 원장을 1개로 합친다. method: AGENTS.md, spec/49, active_artifact_manifest, authority_matrix의 순서를 비교해서 authority_order 충돌을 제거한다. files_to_touch: - spec/00_execution_contract.yaml - spec/49_refactor_methodology_contract.yaml - governance/authority_matrix.yaml - runtime/active_artifact_manifest.yaml commands: - python tools/validate_authority_matrix.py - python tools/validate_active_manifest.py expected_evidence: authority_collision_count: 0 stale_artifact_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P00_T03_NO_FALSE_PASS priority: P0 owner: architect action: package-only SKIPPED를 PASS로 부르지 못하게 잠근다. method: pipeline_runtime_profile_v1.gate_status가 SKIPPED이면 release evidence로 사용 금지. release mode full-gate만 운영 성공 증거로 인정한다. files_to_touch: - spec/22_pipeline_runtime_contract.yaml - tools/validate_pipeline_runtime_contract.py commands: - python tools/validate_pipeline_runtime_contract.py expected_evidence: package_only_gate_status: SKIPPED is not PASS release_mode_required: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P00_T04_CHANGE_REQUEST_TEMPLATE_LOCK priority: P0 owner: architect action: 모든 구조 변경은 CR 없이는 금지한다. method: new formula, new file, new script, new schema, new GAS function 추가 시 change_request_template.yaml을 먼저 작성하게 한다. files_to_touch: - governance/change_request_template.yaml - governance/rule_lifecycle.yaml commands: - python tools/validate_change_requests_v1.py expected_evidence: missing_change_request_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_specs.py == VALIDATION OK - python tools/validate_agents_shrink_v1.py == AGENTS_SHRINK_OK - python tools/validate_active_manifest.py == PASS anti_patterns_to_reject: [] - phase_id: PHASE_01 name: Architecture boundary repair objective: 현재 FAIL인 architecture boundary를 최우선으로 복구한다. ordered_tasks: - id: P01_T01_BUILD_MODULE_IO_COVERAGE priority: P0 owner: architect action: module IO coverage artifact를 실제로 생성한다. method: spec/48_module_io_contract_registry.yaml의 modules를 읽고 각 input/output/schema/artifact_path 존재 여부와 schema match 여부를 Temp/module_io_coverage_v1.json으로 산출한다. files_to_touch: - tools/build_module_io_coverage_v1.py - Temp/module_io_coverage_v1.json - spec/48_module_io_contract_registry.yaml commands: - python tools/build_module_io_coverage_v1.py --registry spec/48_module_io_contract_registry.yaml --out Temp/module_io_coverage_v1.json expected_evidence: module_io_schema_coverage_pct: 100.0 missing_artifact_paths: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P01_T02_FIX_ARCHITECTURE_VALIDATOR priority: P0 owner: architect action: architecture validator가 coverage artifact를 필수 입력으로 검증하게 한다. method: validate_architecture_boundaries_v2.py가 module_io_coverage_v1.json 부재 시 FAIL을 반환하고, 존재 시 schema coverage와 artifact chain count를 함께 판단하게 고정한다. files_to_touch: - tools/validate_architecture_boundaries_v2.py - spec/34_architecture_boundaries.yaml commands: - python tools/validate_architecture_boundaries_v2.py expected_evidence: gate: PASS module_io_schema_coverage_pct: 100.0 artifact_chain_count: '> 0' if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P01_T03_ENFORCE_ONE_WAY_DAG priority: P0 owner: architect action: data -> feature -> decision -> execution -> report 단방향 DAG를 코드로 검증한다. method: src, tools, gas에서 Temp/operational_report 또는 renderer가 core 계산을 호출하는 역참조를 금지한다. renderer_calculation_count는 0 유지. files_to_touch: - spec/34_architecture_boundaries.yaml - tools/validate_renderer_no_calculation_v2.py - tools/validate_no_temp_runtime_read_v1.py commands: - python tools/validate_renderer_no_calculation_v2.py - python tools/validate_no_temp_runtime_read_v1.py expected_evidence: renderer_calculation_count: 0 reverse_dependency_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_architecture_boundaries_v2.py exit_code == 0 anti_patterns_to_reject: - renderer에서 price/qty/score 계산 추가 - Temp JSON을 source of truth처럼 수동 편집 - validator FAIL을 WARN으로 낮추기 - phase_id: PHASE_02 name: Repository entropy and file diet objective: 파일/문서/스크립트가 늘어나도 통제 가능한 저장소로 줄인다. ordered_tasks: - id: P02_T01_SCRIPT_BUDGET_REDUCE priority: P0 owner: architect action: package.json scripts 22개를 12개 이하로 축소한다. method: 운영자가 쓰는 entrypoint만 남기고 세부 검증은 tools/run_release_dag_v3.py 내부 DAG 노드로 이동한다. npm script는 ops:prepare, ops:validate, ops:build, ops:render, ops:release, ops:package, ops:audit, ops:clean, ops:dev, full-gate, validate-engine-strict, prepare-upload-zip까지만 허용한다. files_to_touch: - package.json - spec/release/repository_entropy_budget.yaml - tools/run_release_dag_v3.py commands: - python tools/validate_package_script_budget_v1.py expected_evidence: script_count: <= 12 gate: PASS if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P02_T02_TOOL_INDEX_AND_ARCHIVE priority: P1 owner: architect action: tools 367개를 active/archive/generated로 분류한다. method: tools_index.yaml을 만들고, release DAG에서 호출되는 active tool만 tools/active에 남긴다. one-off·superseded 파일은 tools/archive/YYYYMMDD로 이동하되 import 경로가 깨지지 않게 shim을 둔다. files_to_touch: - tools_index.yaml - tools/archive/ - tools/active/ - spec/release/version_retirement_policy.yaml commands: - python tools/build_tool_inventory_v1.py --root tools --out runtime/tool_inventory_v1.yaml - python tools/validate_release_dag_inputs_exist_v1.py expected_evidence: active_tool_count: release DAG에서 필요한 개수만 orphan_tool_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P02_T03_DOC_DIET_LOCK priority: P1 owner: architect action: 문서 파일은 원칙/ADR만 남기고 규칙 중복을 제거한다. method: md는 doctrine, runbook, ADR, prompt renderer만 허용한다. 공식/임계값/게이트 정의가 md에 있으면 spec yaml로 이전한다. files_to_touch: - docs/ - prompts/ - governance/adr/ - tools/validate_docs_no_rule_duplication_v1.py commands: - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_audit_v1.json expected_evidence: markdown_rule_duplication_count: 0 prompt_formula_definition_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P02_T04_GENERATED_FILE_POLICY priority: P1 owner: architect action: generated schema/model/formula 파일을 손편집 불가 영역으로 고정한다. method: schemas/generated, src/quant_engine/models/generated, runtime/python/core/formulas/generated는 generator와 source hash를 헤더에 넣고 직접 수정 시 검증 실패 처리한다. files_to_touch: - tools/validate_generated_artifact_hash_v1.py - schemas/generated/ - src/quant_engine/models/generated/ commands: - python tools/validate_schema_model_generation_v1.py - python tools/validate_generated_artifact_hash_v1.py expected_evidence: manual_edit_count: 0 schema_model_parity: 100.0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_package_script_budget_v1.py == PASS - repository_file_count <= 2000 anti_patterns_to_reject: - 새로운 npm script를 검증 우회용으로 추가 - 동일 검증을 validate_x_v1/v2/v3로 계속 복제 - docs에 규칙을 다시 쓰기 - phase_id: PHASE_03 name: GAS thin adapter migration objective: GAS 내부 비즈니스 로직 98건을 Python canonical로 이전한다. ordered_tasks: - id: P03_T01_GAS_LOGIC_INVENTORY priority: P0 owner: architect action: GAS business logic 98건을 공식/라인/이전대상으로 원장화한다. method: validate_gas_thin_adapter_v1 findings를 gas_logic_migration_ledger_v1.yaml로 저장하고 각 항목을 decision_logic, score_logic, price_qty_logic, pure_mapping, display_text로 분류한다. files_to_touch: - governance/gas_logic_migration_ledger_v1.yaml - tools/validate_gas_thin_adapter_v1.py commands: - python tools/validate_gas_thin_adapter_v1.py > Temp/gas_thin_adapter_v1.json - python tools/build_gas_logic_migration_ledger_v1.py --input Temp/gas_thin_adapter_v1.json --out governance/gas_logic_migration_ledger_v1.yaml expected_evidence: classified_findings: 98 unclassified_findings: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P03_T02_MOVE_SCORE_LOGIC_TO_PYTHON priority: P0 owner: architect action: macro_risk_score, distribution_risk_score, late_chase_risk_score 등 점수 계산을 Python으로 이전한다. method: GAS에 남은 Math.min/Math.max/score/take_profit/stop_loss/decision 문자열 분기 중 계산성 로직은 src/quant_engine/formulas로 이전하고 GAS는 결과를 read/emit만 한다. files_to_touch: - src/quant_engine/compute_formula_outputs.py - runtime/python/core/formulas/ - gas_data_feed.gs - gas_apex_runtime_core.gs commands: - python tools/validate_gas_python_parity_v1.py - python tools/validate_behavioral_coverage_v1.py --strict expected_evidence: implementation_divergence_count: 0 gas_fail: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P03_T03_ALLOWLIST_ADAPTER_ASSEMBLY priority: P1 owner: architect action: 순수 어댑터 조립 코드는 allowlist로 분리한다. method: sheet column assembly, JSON.stringify, checksum 생성 같은 adapter-only 행위는 spec/39_gas_thin_adapter_policy.yaml allowlist에 등록한다. 투자판단 분기는 allowlist 금지. files_to_touch: - spec/39_gas_thin_adapter_policy.yaml - tools/validate_gas_thin_adapter_v2.py commands: - python tools/validate_gas_thin_adapter_v2.py expected_evidence: forbidden_gas_business_logic_count: 0 allowlisted_adapter_count: '>= 0' if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P03_T04_GAS_PUBLIC_API_FREEZE priority: P1 owner: architect action: GAS 공개 함수 표면을 freeze한다. method: Apps Script에서 사람이 실행하는 함수만 public으로 두고 내부 함수는 prefix/namespace 규칙으로 숨긴다. arity validator에 public API contract를 연결한다. files_to_touch: - spec/generated/gas_adapter_contract.schema.json - tools/validate_gas_call_arity.py - gas_*.gs commands: - npm run validate-gas-call-arity expected_evidence: arity_mismatch_count: 0 unexpected_public_function_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_gas_thin_adapter_v2.py == PASS with forbidden count 0 - python tools/validate_behavioral_coverage_v1.py --strict == PASS anti_patterns_to_reject: - GAS에서 임계값을 새로 하드코딩 - Python과 GAS 둘 다 같은 공식을 독립 구현 - GAS output을 golden expected로 역복사 - phase_id: PHASE_04 name: Formula lifecycle and factor taxonomy control objective: 292개 공식이 계속 늘어나도 충돌·중복·과최적화를 막는다. ordered_tasks: - id: P04_T01_FORMULA_LIFECYCLE_LEDGER priority: P0 owner: architect action: 모든 formula_id를 lifecycle 상태로 관리한다. method: ACTIVE, SHADOW, EXPERIMENTAL, DEPRECATED, RETIRED 상태를 spec/51_formula_lifecycle_registry.yaml에 등록한다. 같은 목적 공식이 2개 이상이면 owner가 하나만 ACTIVE로 지정한다. files_to_touch: - spec/51_formula_lifecycle_registry.yaml - spec/formula_lifecycle_index.yaml - tools/validate_formula_version_lifecycle_v1.py commands: - python tools/validate_formula_version_lifecycle_v1.py expected_evidence: active_per_formula_family: 1 deprecated_runtime_read_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P04_T02_OWNER_AND_OUTPUT_FIELD_LOCK priority: P0 owner: architect action: 공식과 출력필드 owner 충돌을 0으로 만든다. method: output_field_owner_ledger.yaml에 final_action, stop_loss, tp1_price, risk_score 등 핵심 출력 필드의 단일 owner를 등록한다. files_to_touch: - spec/03_formulas/output_field_owner_ledger.yaml - tools/validate_output_field_owner_collision_v1.py commands: - python tools/validate_output_field_owner_collision_v1.py - python tools/validate_formula_owner_coverage_v1.py expected_evidence: owner_coverage_pct: 100.0 field_owner_collision_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P04_T03_FACTOR_TAXONOMY_ENFORCE priority: P1 owner: architect action: 팩터 분류 체계를 먼저 통과해야 새 공식을 추가한다. method: 새 팩터는 Momentum, Quality, Value, Growth, Flow, Risk, Event, Execution, Portfolio, DataQuality 중 하나에 귀속한다. 팩터 목적, horizon, lookback, calibration source, decay rule을 필수로 요구한다. files_to_touch: - spec/43_quant_factor_taxonomy.yaml - spec/factor_lifecycle_registry.yaml - tools/validate_factor_taxonomy_v1.py commands: - python tools/validate_factor_taxonomy_v1.py - python tools/validate_factor_lifecycle_completeness_v2.py expected_evidence: unknown_factor_count: 0 missing_horizon_count: 0 missing_calibration_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P04_T04_NO_DUPLICATE_FORMULA_INTENT priority: P1 owner: architect action: 같은 의미의 공식 중복을 금지한다. method: formula_id 이름만 다른 유사 공식은 semantic_intent_hash로 비교한다. 중복이면 병합 또는 DEPRECATED로 내린다. files_to_touch: - tools/validate_metric_alias_collision_v1.py - spec/aliases.yaml commands: - python tools/validate_metric_alias_collision_v1.py expected_evidence: metric_alias_collision_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_formula_runtime_registry_v1.py --json Temp/formula_runtime_registry_v1.json --target-coverage 100 - python tools/validate_factor_contract_v1.py anti_patterns_to_reject: - 정확도 개선 명목으로 유사 점수 공식을 계속 추가 - 공식은 있는데 owner/golden/schema가 없음 - v1/v2/v3가 동시에 ACTIVE - phase_id: PHASE_05 name: Golden cases, property invariants, and deterministic harness objective: 저성능 LLM도 같은 결론을 내도록 계산을 하네스화한다. ordered_tasks: - id: P05_T01_GOLDEN_CASE_MINIMUM priority: P0 owner: architect action: 모든 ACTIVE 공식에 최소 3개 golden case를 요구한다. method: 정상, 경계값, 결측/비정상 입력 3종 케이스를 spec/formula_golden_cases_v4.yaml에 둔다. expected는 손계산 또는 독립 산식으로 작성하고 구현 결과를 역복사하지 않는다. files_to_touch: - spec/formula_golden_cases_v4.yaml - tools/run_formula_golden_cases_v2.py commands: - python tools/run_formula_golden_cases_v2.py expected_evidence: active_formula_golden_case_coverage_pct: 100.0 python_fail: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P05_T02_PROPERTY_INVARIANTS priority: P0 owner: architect action: 투자 엔진 불변식을 property test로 잠근다. method: cash_ratio는 0~100, position_size는 cash/heat/risk cap을 초과하지 않음, stop_loss는 tick_normalizer 적용, sell 수량은 보유수량 이하, D+2 현금은 즉시현금 방어선 충족으로 간주 같은 invariant를 명시한다. files_to_touch: - spec/property_invariants.yaml - tests/test_property_invariants.py commands: - python tools/validate_property_invariants_v1.py expected_evidence: property_violation_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P05_T03_DETERMINISM_TEST priority: P0 owner: architect action: 동일 입력은 항상 동일 출력이어야 한다. method: GatherTradingData.json을 3회 실행해 final_decision_packet_active checksum이 동일한지 검사한다. generated_at 같은 메타 필드는 checksum 제외. files_to_touch: - tools/validate_determinism.py - Temp/final_decision_packet_active.json commands: - python tools/validate_determinism.py expected_evidence: determinism_gate: PASS checksum_mismatch_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P05_T04_BEHAVIORAL_COVERAGE_STRICT priority: P0 owner: architect action: YAML-Python-GAS 3-way 동등성을 release gate에 넣는다. method: BCH-V1 runbook 기준으로 golden == Python == GAS를 확인한다. files_to_touch: - spec/26_behavioral_coverage_contract.yaml - tools/validate_behavioral_coverage_v1.py commands: - python tools/validate_behavioral_coverage_v1.py --strict expected_evidence: behavioral_coverage_pct: 100.0 implementation_divergence_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_golden_coverage_100.py - python tools/validate_behavioral_coverage_v1.py --strict - python tools/validate_determinism.py anti_patterns_to_reject: - coverage 수치만 맞추고 케이스 품질을 낮춤 - 실패 케이스 삭제로 통과 - 허용오차를 과도하게 넓힘 - phase_id: PHASE_06 name: Data contract, provenance, and hallucination firewall objective: 데이터정합성과 홀루시네이션을 구조적으로 차단한다. ordered_tasks: - id: P06_T01_FIELD_DICTIONARY_LOCK priority: P0 owner: architect action: 모든 원천 필드를 field dictionary와 workbook mapping에 매핑한다. method: GatherTradingData.json의 모든 사용 필드는 spec/12_field_dictionary.yaml 및 spec/14_raw_workbook_mapping.yaml에 존재해야 한다. files_to_touch: - spec/12_field_dictionary.yaml - spec/14_raw_workbook_mapping.yaml - tools/validate_field_dictionary.py commands: - python tools/validate_field_dictionary.py - python tools/validate_data_sample.py expected_evidence: unmapped_field_count: 0 schema_presence_score: 100.0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P06_T02_NUMBER_PROVENANCE_STRICT priority: P0 owner: architect action: 보고서 숫자 provenance 100%를 release 불변식으로 둔다. method: operational_report.json/md의 모든 숫자는 number_provenance_ledger_v4에 출처가 있어야 한다. 출처 없는 숫자는 DATA_MISSING 또는 미표시. files_to_touch: - Temp/number_provenance_ledger_v4.json - tools/validate_number_provenance_strict_v3.py commands: - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.json expected_evidence: number_provenance_coverage_pct: 100 unproven_report_number_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P06_T03_DATA_MISSING_GRAMMAR priority: P0 owner: architect action: 결측 표현을 표준화한다. method: 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요 외 문구를 금지한다. LLM이 대체 수치를 추정하지 못하게 low_capability_response_contract에 grammar를 둔다. files_to_touch: - schemas/low_capability_response_contract_v4.schema.json - prompts/low_capability_report_renderer.md commands: - python tools/validate_llm_response_contract_v4.py expected_evidence: ungrounded_number_count: 0 missing_value_phrase_violation_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P06_T04_LIVE_REPLAY_SEPARATION priority: P0 owner: architect action: live 성과와 replay/backtest를 절대 혼합하지 않는다. method: replay 표본으로 만든 hit rate, design score, calibration score는 live 운영성과로 표기하지 않는다. report renderer에 source_kind를 표시한다. files_to_touch: - spec/44_live_replay_separation.yaml - tools/validate_no_replay_live_mix_v2.py commands: - python tools/validate_no_replay_live_mix_v2.py expected_evidence: live_replay_mix_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_data_quality_expectations.py - python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.json - python tools/validate_no_replay_live_mix_v2.py anti_patterns_to_reject: - 외부 뉴스나 감으로 숫자 보정 - 빈칸을 0으로 처리해 통과 - 백테스트 점수를 실전 수익률처럼 표현 - phase_id: PHASE_07 name: Prediction and outcome feedback loop objective: 설계 커버리지 100%와 실제 예측력 개선을 분리해 관리한다. ordered_tasks: - id: P07_T01_OUTCOME_LABEL_SPEC priority: P0 owner: architect action: T+1/T+5/T+20 outcome label을 명확히 정의한다. method: 추천 당시 entry, stop, tp, final_action 대비 실제 수익률/최대불리/최대유리/슬리피지를 label로 만든다. files_to_touch: - spec/17_performance_contract.yaml - spec/29_backtest_harness_contract.yaml - tools/build_outcome_labels_v1.py commands: - python tools/build_outcome_labels_v1.py --input GatherTradingData.json --out Temp/outcome_labels_v1.json expected_evidence: label_coverage_pct: '>= 95' lookahead_leak_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P07_T02_ALPHA_FEEDBACK_DECILE priority: P1 owner: architect action: prediction_match_rate 54.76을 decile별로 분해한다. method: 전체 평균 하나로 보지 말고 market_regime, sector, horizon, action_type, liquidity_bucket, entry_timing_decile별 hit/expectancy를 산출한다. files_to_touch: - tools/build_alpha_feedback_loop_v2.py - Temp/alpha_feedback_loop_v2.json commands: - npm run daily-feedback-report expected_evidence: decile_table_present: true miss5_count_present: true expectancy_by_bucket_present: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P07_T03_PROMOTION_DEMOTION_RULE priority: P1 owner: architect action: 팩터 승격/강등 규칙을 성과 기반으로 만든다. method: 팩터가 30표본 미만이면 EXPERT_PRIOR/PROVISIONAL, 30표본 이상이면 hit_rate, expectancy, drawdown, turnover cost를 보고 ACTIVE/SHADOW/RETIRED 결정한다. files_to_touch: - spec/factor_lifecycle_registry.yaml - spec/calibration_registry.yaml - tools/validate_calibration_registry_v1.py commands: - python tools/validate_calibration_registry_v1.py expected_evidence: overclaimed_count: 0 unregistered_threshold_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P07_T04_VALUE_DAMAGE_CONTROL priority: P1 owner: architect action: 수익을 지키는 엔진인지 별도 측정한다. method: 매도/익절/손절 이후 n일 가격경로를 추적하여 value_damage_pct_avg, giveback_saved_pct, premature_exit_rate를 산출한다. files_to_touch: - spec/profit_preservation_contract.yaml - tools/build_value_preservation_audit_v1.py commands: - python tools/build_value_preservation_audit_v1.py --out Temp/value_preservation_audit_v1.json expected_evidence: value_damage_pct_avg: <= target premature_exit_rate: tracked if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_outcome_eval_window.py - python tools/validate_pass_100_honest_v2.py anti_patterns_to_reject: - prediction_match_rate를 설계 점수로 대체 - 표본 30개 미만을 calibrated로 표시 - 실패한 추천을 데이터에서 제외 - phase_id: PHASE_08 name: Portfolio and trade decision engine hardening objective: 목표금액 5억, 주간 리밸런싱, 현금방어선, 매수/매도 뒷북 방지를 공식화한다. ordered_tasks: - id: P08_T01_GOAL_RISK_BUDGET priority: P0 owner: architect action: 목표금액 5억 기반 risk budget cascade를 고정한다. method: 총자산, 현금, D+2 현금, 섹터 집중도, 단일종목 한도, 위성비중, drawdown 상태별 position cap을 산출한다. files_to_touch: - spec/36_goal_risk_budget_harness.yaml - spec/risk/aggregate_risk.yaml - spec/risk/portfolio_exposure.yaml commands: - python tools/validate_goal_risk_budget_harness_v1.py expected_evidence: cash_floor_rule: D+2 cash counts as immediate defense risk_budget_violation_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P08_T02_WEEKLY_CADENCE_LOCK priority: P0 owner: architect action: 주간 단위 제안과 토/일 리밸런싱을 운영 cadence로 고정한다. method: 매주 토/일은 rebalance_required=true, 매월 1/11/21은 mid_check_required=true를 final_context에 넣는다. files_to_touch: - spec/operating_cadence.yaml - tools/build_low_capability_context_pack_v5.py commands: - python tools/validate_operating_cadence_v1.py expected_evidence: weekend_rebalance_flag: true monthly_midcheck_dates: - 1 - 11 - 21 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P08_T03_ANTI_LATE_ENTRY_GATE priority: P0 owner: architect action: 뒷북 매수와 설거지를 막는 anti late entry gate를 최종 주문 전 필수화한다. method: 급등 후 추격, 거래대금 고점, 분산매도, RS 둔화, 외국인/기관 순매도, 뉴스 과열을 entry_block 또는 staged_entry로 라우팅한다. files_to_touch: - spec/strategy/anti_late_entry_pullback_gate_v5.yaml - tools/validate_anti_late_entry_harness_v1.py commands: - python tools/validate_anti_late_entry_harness_v1.py expected_evidence: late_entry_block_false_negative_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P08_T04_SELL_WATERFALL_VALUE_PRESERVATION priority: P0 owner: architect action: 차익실현과 손절은 sell waterfall로 일관화한다. method: sell candidate가 2개 이상이면 sell priority table을 먼저 만들고, stop_loss, take_profit, trailing_stop, cash_raise, rebalance_trim을 priority score로 정렬한다. files_to_touch: - spec/exit/value_preserving_cash_raise_optimizer_v7.yaml - spec/exit/take_profit.yaml - spec/exit/stop_loss.yaml commands: - python tools/validate_execution_precedence_lock_v2.py - python tools/validate_order_grammar_v1.py expected_evidence: sell_priority_table_required: true multi_condition_order_violation_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P08_T05_IPO_AND_MARKET_CORRELATION_EVENT_RISK priority: P1 owner: architect action: 대형 IPO와 국내시장 상관 이벤트를 선제 차익실현 게이트로 연결한다. method: IPO 일정, 수급 흡수, 동종 섹터 밸류에이션 압박, 지수 편입/자금 이동 가능성을 macro_event_ticker_impact와 cash_raise route에 연결한다. 미확인 데이터는 참고용이고 최종 판단은 하네스만 사용한다. files_to_touch: - spec/strategy/macro_event_synchronizer_v2.yaml - spec/strategy/pre_distribution_early_warning_v4.yaml commands: - python tools/validate_predictive_alpha_dialectic_v2.py expected_evidence: event_risk_route_present: true proactive_exit_candidate_generated: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_strategy_tests_contract.py - python tools/validate_order_grammar_v1.py - python tools/validate_execution_precedence_lock_v2.py anti_patterns_to_reject: - 매수 불가인데도 억지 매수 추천 - 손절/익절 가격·수량 누락 - 상승 서사로 stop을 완화 - phase_id: PHASE_09 name: Low-capability LLM serving pack objective: 저성능 LLM도 TODO만 따라 최고 성능 모델과 같은 결론을 렌더링하게 한다. ordered_tasks: - id: P09_T01_FINAL_CONTEXT_PACK_V5 priority: P0 owner: architect action: LLM 입력을 final packet copy-only pack으로 축소한다. method: final_decision_packet_active, number_provenance_ledger, order_blueprint, blocked reasons, sell priority, cash shortfall만 포함한 Temp/final_context_for_llm_v5.yaml 생성. 원천 대용량 JSON 직접 제공 금지. files_to_touch: - tools/build_low_capability_context_pack_v5.py - Temp/final_context_for_llm_v5.yaml - spec/46_low_capability_execution_pack.yaml commands: - python tools/build_low_capability_context_pack_v5.py --manifest runtime/active_artifact_manifest.yaml --out Temp/final_context_for_llm_v5.yaml expected_evidence: context_contains_only_allowed_aliases: true raw_workbook_rows_in_context: false if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P09_T02_RENDERER_SCRIPTED_SECTIONS priority: P0 owner: architect action: LLM 보고서 섹션 순서와 문장을 템플릿화한다. method: portfolio health -> blockers -> cash defense -> sell table -> buy/hold table -> risk -> study 순서로 쓰게 한다. 숫자·가격·수량은 context key를 그대로 복사한다. files_to_touch: - prompts/low_capability_report_renderer.md - schemas/low_capability_response_contract_v4.schema.json commands: - python tools/validate_renderer_section_order_v1.py - python tools/validate_llm_response_contract_v4.py expected_evidence: section_order_violation_count: 0 llm_freedom_pct: 0.0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P09_T03_NO_RECOMPUTE_MARKERS priority: P0 owner: architect action: 모든 숫자 옆에 provenance key를 붙인다. method: 보고서에 숫자가 나오면 [source:packet.path] 또는 [DATA_MISSING]을 붙인다. 출처 없는 숫자 발견 시 실패. files_to_touch: - tools/validate_report_numeric_consistency_guard_v2.py - tools/validate_number_provenance_strict_v3.py commands: - python tools/validate_report_numeric_consistency_guard_v2.py expected_evidence: ungrounded_number_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P09_T04_LOW_CAPABILITY_RUNBOOK priority: P1 owner: architect action: 저성능 LLM 실행 절차를 20단계 이하로 압축한다. method: 읽을 파일은 AGENTS.md -> final_context_for_llm_v5.yaml -> renderer prompt 3개로 제한한다. 나머지는 reference only. files_to_touch: - spec/31_low_capability_llm_response_contract.yaml - spec/46_low_capability_execution_pack.yaml commands: - python tools/validate_low_capability_pack_v1.py expected_evidence: required_read_files_count: <= 3 response_contract_gate: PASS if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_low_capability_pack_v1.py - python tools/validate_llm_response_contract_v4.py anti_patterns_to_reject: - LLM에게 GatherTradingData 전체를 주고 해석하게 함 - 보고서에서 하네스 결론을 문장으로 완화 - DATA_MISSING을 추정치로 대체 - phase_id: PHASE_10 name: Release train, rollback, and CI gate objective: 운영자가 매주 같은 절차로 안전하게 릴리즈하도록 만든다. ordered_tasks: - id: P10_T01_RELEASE_DAG_SINGLE_ENTRY priority: P0 owner: architect action: 릴리즈 진입점을 npm run full-gate 하나로 통일한다. method: 개별 validator는 DAG 노드로만 호출하고 운영자는 full-gate만 실행한다. DAG step은 idempotent해야 한다. files_to_touch: - spec/41_release_dag.yaml - tools/run_release_dag_v3.py - package.json commands: - npm run full-gate expected_evidence: release_mode: release failed_checks_count: 0 exit_code: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P10_T02_NO_SKIPPED_IN_RELEASE priority: P0 owner: architect action: release mode에서 SKIPPED를 금지한다. method: optional 단계는 release에서 optional로 남기지 말고 shadow/quick/package-only에만 허용한다. files_to_touch: - spec/22_pipeline_runtime_contract.yaml - tools/validate_release_gate_sequence_v1.py commands: - python tools/validate_release_gate_sequence_v1.py expected_evidence: skipped_release_step_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P10_T03_ROLLBACK_MANIFEST priority: P1 owner: architect action: 릴리즈 실패 시 rollback manifest로 되돌린다. method: runtime/rollback_manifest_v3.yaml에 이전 active artifact, schema, package hash, release DAG hash를 저장한다. files_to_touch: - runtime/rollback_manifest_v3.yaml - tools/build_rollback_manifest_v3.py commands: - python tools/build_rollback_manifest_v3.py --out runtime/rollback_manifest_v3.yaml expected_evidence: rollback_hash_present: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P10_T04_ENGINE_HEALTH_CARD priority: P1 owner: architect action: 릴리즈 후 건강카드를 생성한다. method: architecture, data, formula, gas, prediction, report, package, entropy 점수를 하나의 engine_health_card_v2.json으로 만든다. files_to_touch: - schemas/engine_health_card.schema.json - tools/build_engine_health_card_v2.py commands: - python tools/build_engine_health_card_v2.py --out Temp/engine_health_card_v2.json - python tools/validate_engine_health_card_v1.py expected_evidence: overall_gate: PASS_OR_WARN critical_fail_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - npm run full-gate - python tools/validate_release_dag_v2.py - python tools/validate_artifact_chain_hash_v4.py anti_patterns_to_reject: - 검증 실패 후 zip만 생성 - 수동 파일 복사로 active alias 변경 - release와 package-only evidence 혼용 - phase_id: PHASE_11 name: Implementation sequence for one new factor objective: 새 퀀트 팩터를 추가할 때 따라야 하는 절차를 표준화한다. ordered_tasks: - id: P11_T01_NEW_FACTOR_CR priority: P1 owner: architect action: 새 팩터 제안서를 먼저 만든다. method: 투자 가설, 시장 국면, 수익 원천, 손실 리스크, horizon, 필요 데이터, calibration 상태, 폐기 조건을 CR에 쓴다. files_to_touch: - governance/change_requests/CR-YYYYMMDD-new-factor.yaml commands: [] expected_evidence: hypothesis_present: true kill_rule_present: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P11_T02_CONTRACT_FIRST priority: P1 owner: architect action: YAML 계약과 schema를 구현보다 먼저 작성한다. method: formula_id, inputs, outputs, expression, thresholds, owner, provenance, missing_policy를 spec에 쓴다. files_to_touch: - spec/13_formula_registry.yaml - schemas/generated/.schema.json - spec/03_formulas/output_field_owner_ledger.yaml commands: - python tools/validate_formula_contract_completeness_v1.py expected_evidence: contract_complete: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P11_T03_GOLDEN_AND_PROPERTY_FIRST priority: P1 owner: architect action: golden case와 invariant를 먼저 만든다. method: 구현 전 expected를 손계산한다. 경계값과 결측값 케이스를 반드시 포함한다. files_to_touch: - spec/formula_golden_cases_v4.yaml - spec/property_invariants.yaml commands: - python tools/validate_golden_coverage_100.py expected_evidence: golden_case_count_min: 3 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P11_T04_PYTHON_CANONICAL_IMPLEMENT priority: P1 owner: architect action: Python canonical 구현만 먼저 한다. method: src/quant_engine에 순수 함수로 구현하고, side effect 없이 dict input -> dict output만 허용한다. files_to_touch: - src/quant_engine/core/formulas/.py - runtime/python/core/formulas/generated/.py commands: - python tools/run_formula_golden_cases_v2.py expected_evidence: python_fail: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P11_T05_GAS_ADAPTER_WIRE priority: P1 owner: architect action: 필요 시 GAS는 결과 수신/표시만 연결한다. method: GAS에는 산식을 쓰지 말고 Python 산출 JSON key를 시트에 쓰는 adapter만 작성한다. files_to_touch: - gas_harness_rows.gs - spec/39_gas_thin_adapter_policy.yaml commands: - python tools/validate_gas_thin_adapter_v2.py expected_evidence: forbidden_logic_new_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P11_T06_SHADOW_BEFORE_ACTIVE priority: P1 owner: architect action: 최소 2주 또는 30표본까지 SHADOW로 운용한다. method: 실전 주문에 사용하지 않고 outcome label만 축적한다. 성과·안정성·데이터품질 기준 충족 시 ACTIVE 승격한다. files_to_touch: - spec/factor_lifecycle_registry.yaml - Temp/alpha_feedback_loop_v2.json commands: - python tools/validate_factor_promotion_gates_v1.py expected_evidence: promotion_allowed: only if gates pass if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_factor_promotion_gates_v1.py - npm run full-gate anti_patterns_to_reject: - 아이디어가 좋다는 이유로 바로 ACTIVE - GAS에 빠르게 구현 후 나중에 Python 맞춤 - 표본 없는 임계값을 calibrated로 선언 - phase_id: PHASE_12 name: Quant research discipline objective: 이론·방법론·데이터수집을 과유불급 없이 장기 관리한다. ordered_tasks: - id: P12_T01_RESEARCH_NOTE_LIMIT priority: P2 owner: architect action: 리서치 노트는 1장, 공식은 spec으로 분리한다. method: 투자 아이디어 설명은 docs/research/YYYYMMDD-title.md 1개로 제한하고, 실제 실행 규칙은 spec에만 둔다. files_to_touch: - docs/research/ - spec/43_quant_factor_taxonomy.yaml commands: - python tools/validate_docs_no_rule_duplication_v1.py --root . --out Temp/docs_rule_duplication_audit_v1.json expected_evidence: markdown_rule_duplication_count: 0 if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P12_T02_DATA_COLLECTION_SLO priority: P1 owner: architect action: 데이터수집 품질 SLO를 둔다. method: 가격, 거래대금, 외국인/기관, 재무, 이벤트, ETF/지수, 환율/금리/VIX 각각 freshness, missing_rate, source_priority를 정의한다. files_to_touch: - spec/02_data_contract.yaml - spec/data_quality/expectations.yaml - tools/validate_data_quality_expectations.py commands: - python tools/validate_data_quality_expectations.py expected_evidence: freshness_violation_count: 0 critical_missing_rate: within threshold if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P12_T03_REGIME_AWARE_BACKTEST priority: P2 owner: architect action: 시장국면별 성과를 따로 본다. method: 상승/하락/횡보, 고변동/저변동, 반도체 주도/비주도, 유동성 확대/축소 국면별 factor expectancy를 산출한다. files_to_touch: - spec/11_market_regime.yaml - tools/build_regime_factor_backtest_v1.py commands: - python tools/build_regime_factor_backtest_v1.py --out Temp/regime_factor_backtest_v1.json expected_evidence: regime_bucket_count: '>= 4' expectancy_by_regime_present: true if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. - id: P12_T04_COMPLEXITY_BUDGET priority: P2 owner: architect action: 성능이 입증되지 않은 복잡도 추가를 막는다. method: 새 팩터/새 문서/새 validator는 expected benefit, owner, retirement date, entropy cost를 기록한다. files_to_touch: - spec/release/repository_entropy_budget.yaml - tools/validate_repository_entropy_budget_v2.py commands: - python tools/validate_repository_entropy_budget_v2.py expected_evidence: entropy_budget_gate: PASS if_fail: 실패 원인을 수치로 기록하고 이전 단계로 되돌린다. 임시 예외나 skip으로 통과 처리하지 않는다. completion_gates: - python tools/validate_repository_entropy_budget_v2.py - python tools/validate_data_quality_expectations.py anti_patterns_to_reject: - 팩터를 많이 넣으면 좋아진다는 착각 - 문서로 통제하려다 문서가 규칙을 대체 - 국면 구분 없이 평균 성과만 사용 execution_schedule: day_0_immediate: - PHASE_00 전체 실행 - PHASE_01_T01~T02 실행으로 architecture boundary FAIL 해소 - PHASE_02_T01 실행으로 package script budget FAIL 해소 week_1: - GAS business logic 98건 ledger 작성 - score/price/qty/decision 로직 중 상위 위험 20건 Python 이전 - module IO coverage와 artifact chain validator release DAG 편입 week_2: - ACTIVE 공식 golden case 3종 이상 보강 - property invariants release gate 편입 - low capability context pack v5 생성 week_3: - prediction/outcome label 구축 - 팩터 decile feedback dashboard 생성 - GAS thin adapter forbidden count 0 또는 approved adapter allowlist 달성 week_4: - repository entropy budget v2 PASS - new factor lifecycle process를 CR 템플릿에 반영 - npm run full-gate 단일 릴리즈 루틴 확정 low_capability_llm_operator_script: purpose: 저성능 LLM 또는 주니어 운영자가 그대로 따라 할 실행 절차 rules: - 절대 숫자를 계산하지 않는다. - 절대 가격·수량·TP·SL을 새로 만들지 않는다. - FAIL을 PASS로 바꾸지 않는다. - DATA_MISSING은 추정하지 않는다. - package-only SKIPPED는 release PASS가 아니다. read_order: - AGENTS.md - runtime/active_artifact_manifest.yaml - Temp/final_decision_packet_active.json - Temp/final_context_for_llm_v5.yaml if present - prompts/low_capability_report_renderer.md run_order: - step: 1 command: python tools/validate_specs.py pass_text: VALIDATION OK - step: 2 command: python tools/validate_active_manifest.py pass_text: PASS - step: 3 command: python tools/build_module_io_coverage_v1.py --registry spec/48_module_io_contract_registry.yaml --out Temp/module_io_coverage_v1.json pass_text: artifact generated - step: 4 command: python tools/validate_architecture_boundaries_v2.py pass_text: gate PASS - step: 5 command: python tools/validate_package_script_budget_v1.py pass_text: gate PASS - step: 6 command: python tools/validate_gas_thin_adapter_v2.py pass_text: forbidden_gas_business_logic_count 0 - step: 7 command: python tools/validate_formula_runtime_registry_v1.py --json Temp/formula_runtime_registry_v1.json --target-coverage 100 pass_text: coverage 100 - step: 8 command: python tools/validate_behavioral_coverage_v1.py --strict pass_text: behavioral_coverage_pct 100 and divergence 0 - step: 9 command: python tools/validate_number_provenance_strict_v3.py --ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.json pass_text: coverage 100 - step: 10 command: npm run full-gate pass_text: exit_code 0 and failed_checks_count 0 if_any_step_fails: - 실패한 step id, command, error text, touched files를 change_request에 기록한다. - 해당 phase의 if_fail 지시만 따른다. - skip, warn downgrade, expected value 역복사, 임계값 완화로 해결하지 않는다. - 수정 후 실패한 step부터 다시 실행하고 마지막에는 npm run full-gate를 실행한다. pm_control_board: weekly_review_questions: - 이번 주 ACTIVE 공식이 늘었는가? 늘었다면 owner/golden/schema/provenance가 모두 있는가? - GAS forbidden business logic count가 줄었는가? - package script count가 12 이하인가? - architecture boundary가 PASS인가? - prediction match rate와 expectancy가 개선됐는가, 아니면 설계 점수만 좋아졌는가? - 보고서 숫자 provenance 100%가 유지됐는가? - D+2 현금 방어선과 cash shortfall 판단이 final packet에 반영됐는가? - 토/일 리밸런싱 또는 1/11/21 중간점검 플래그가 cadence에 맞게 작동했는가? stop_the_line_conditions: - architecture boundary FAIL - number provenance coverage < 100 - release mode skipped step > 0 - unmapped formula count > 0 - implementation divergence > 0 - unregistered threshold count > 0 - report/harness numeric mismatch > 0 - GAS에 신규 price/qty/score 계산 추가 implementation_recipes: python_canonical_function_template: signature: 'def compute_(inputs: Mapping[str, Any]) -> dict[str, Any]' requirements: - no global mutable state - no network call - no current time except passed as input - all thresholds imported from parsed spec/calibration registry - return includes formula_id, outputs, provenance, missing_fields, gate unit_test_minimum: - normal case - boundary case - missing data case yaml_formula_contract_template: required_fields: - formula_id - owner - status - purpose - inputs - outputs - expression - thresholds - missing_policy - provenance_policy - golden_cases_ref - schema_ref - lifecycle_state forbidden_fields: - unowned_threshold - free_text_formula_without_expression - calibrated_without_sample_n gas_adapter_template: allowed: - read sheet range - write sheet range - serialize json - deserialize json - checksum - invoke refresh - display previously computed field forbidden: - score calculation - position sizing - stop/take profit calculation - final action routing - threshold decision - portfolio risk calculation renderer_template: allowed: - copy packet values - format table - show DATA_MISSING - show provenance - explain existing gate reason forbidden: - recalculate - average - rank - invent target price - soften blocked decision - hide shadow ledger final_success_metrics: structural: architecture_boundary_gate: PASS package_script_count: <= 12 gas_forbidden_business_logic_count: 0 repository_file_count: <= 2000 markdown_rule_duplication_count: 0 deterministic_quality: runtime_adjusted_coverage_pct: 100.0 behavioral_coverage_pct: 100.0 implementation_divergence_count: 0 number_provenance_coverage_pct: 100.0 llm_freedom_pct: 0.0 investment_quality: prediction_match_rate_pct: track and improve from observed 54.76 without overfitting expectancy_by_horizon: positive after costs for promoted ACTIVE factors value_damage_pct_avg: below contract threshold cash_floor_violation_count: 0 late_entry_false_negative_count: 0