ee3e799de1
주요 변경: - tools/build_rebalance_engine_v1.py: REBALANCE_ENGINE_V1 신규 * account_snapshot 직접 합산(_build_snap_position_map) → 소수주 분리 행 병합 * 레짐 소스 macro.REGIME_PRELIM 최우선 (GAS 와 동일) - src/gas_adapter_parts/gdf_06_rebalance.gs: runRebalanceSheet_() 신규 * Logger.log / getSpreadsheet_() 로 run_all 연동 수정 - src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs * _mergePositionRecord_(): 소수주 중복 행 합산 신규 * parseInt → parseFloat (qty, availQty) - src/gas_adapter_parts/gdf_01_price_metrics.gs * 미보유 종목 SELL_READY → WATCH_EXIT_SIGNAL - spec/41_release_dag.yaml: build_rebalance_sheet 노드 추가 (step_count 63) - spec/51_formula_lifecycle_registry.yaml: REBALANCE_ENGINE_V1 등록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
715 lines
35 KiB
YAML
715 lines
35 KiB
YAML
schema_version: qedd_refactor_todo.v1
|
|
title: 퀀트투자 엔진 구조적 리팩토링 및 저성능 LLM 실행 TODO
|
|
generated_at_kst: '2026-06-07T14:27:31+09:00'
|
|
basis:
|
|
uploaded_zip: /mnt/data/data_feed.zip
|
|
required_authority: data_feed/AGENTS.md
|
|
read_order_from_agents:
|
|
- runtime/active_artifact_manifest.yaml
|
|
- Temp/final_decision_packet_active.json
|
|
- spec/13_formula_registry.yaml
|
|
- spec/12_field_dictionary.yaml
|
|
- schemas/*.schema.json
|
|
- governance/rules/*.yaml
|
|
- spec/*.yaml
|
|
hard_constraints:
|
|
- 가격, 수량, TP, SL, 점수는 등록 공식과 하네스 산출값만 사용한다.
|
|
- LLM은 계산기가 아니라 renderer이며 하네스 판정을 번복하지 않는다.
|
|
- GAS는 thin adapter, Python/src는 canonical implementation이다.
|
|
- Temp는 실행 산출물이며 직접 편집하지 않는다.
|
|
- 문서/규칙/공식/스키마는 변경요청과 golden case 없이 활성화하지 않는다.
|
|
repository_inventory_observed:
|
|
total_files_in_uploaded_zip: 1364
|
|
top_directory_counts:
|
|
src: 328
|
|
tools: 324
|
|
schemas: 161
|
|
tests: 159
|
|
runtime: 154
|
|
spec: 114
|
|
artifacts: 40
|
|
governance: 24
|
|
Temp: 13
|
|
prompts: 9
|
|
docs: 8
|
|
examples: 8
|
|
suggest: 7
|
|
dist: 2
|
|
AGENTS.md: 1
|
|
gas_apex_alpha_watch.gs: 1
|
|
gas_apex_runtime_core.gs: 1
|
|
gas_data_collect.gs: 1
|
|
gas_data_feed.gs: 1
|
|
gas_harness_rows.gs: 1
|
|
gas_lib.gs: 1
|
|
gas_report.gs: 1
|
|
GatherTradingData.json: 1
|
|
package.json: 1
|
|
README.md: 1
|
|
RetirementAssetPortfolio.yaml: 1
|
|
RetirementAssetPortfolioReportTemplate.yaml: 1
|
|
extension_counts:
|
|
.py: 798
|
|
.json: 364
|
|
.yaml: 150
|
|
.md: 38
|
|
.gs: 7
|
|
.ps1: 4
|
|
.jsonl: 2
|
|
.js: 1
|
|
package_script_count: 202
|
|
package_scripts_by_family:
|
|
build: 92
|
|
validate: 63
|
|
prepare: 7
|
|
run: 6
|
|
apply: 3
|
|
full: 3
|
|
render: 2
|
|
measure: 2
|
|
daily: 2
|
|
compute: 2
|
|
inject: 2
|
|
start: 1
|
|
check: 1
|
|
score: 1
|
|
ingest: 1
|
|
update: 1
|
|
release: 1
|
|
convert: 1
|
|
yolo: 1
|
|
profile: 1
|
|
import: 1
|
|
audit: 1
|
|
enrich: 1
|
|
lint: 1
|
|
ops:validate: 1
|
|
ops:render: 1
|
|
ops:release: 1
|
|
ops:package: 1
|
|
ops:audit: 1
|
|
formula_registry_formula_count: 149
|
|
formula_registry_size_bytes: 180041
|
|
release_dag_steps: 14
|
|
release_dag_failed_steps: 0
|
|
tools_src_same_basename_count: 21
|
|
tools_src_same_basename_examples:
|
|
- __init__.py
|
|
- apply_engine_upgrade_v4.py
|
|
- apply_engine_upgrade_v7.py
|
|
- compile_formula_registry_v1.py
|
|
- compute_formula_outputs.py
|
|
- convert_xlsx_to_json.py
|
|
- generate_models_from_schema.py
|
|
- import_etf_nav_manual.py
|
|
- inject_computed_harness.py
|
|
- lib_trading_calendar.py
|
|
- measure_harness_coverage.py
|
|
- measure_yaml_gs_ps_coverage.py
|
|
- orchestration_harness_v1.py
|
|
- pipeline_runtime_anomaly_lib_v1.py
|
|
- prepare_upload_zip.py
|
|
- refactor_master_helpers.py
|
|
- run_engine_audit_golden_cases_v1.py
|
|
- run_formula_golden_cases_v2.py
|
|
- run_integration_test_v1.py
|
|
- update_proposal_evaluation_history.py
|
|
- v7_hardening_common.py
|
|
active_manifest_missing_packaged_refs: &id001
|
|
- Temp/canonical_artifact_resolver_v1.json
|
|
- Temp/final_execution_decision_v2.json
|
|
- Temp/prediction_accuracy_harness_v2.json
|
|
- Temp/single_truth_ledger_v2.json
|
|
- Temp/smart_cash_recovery_v7.json
|
|
current_hardening_snapshot:
|
|
overall_hardening_score: 68.22
|
|
truth_hardening_score: 68.22
|
|
readiness_gate: WATCH_PENDING_SAMPLE
|
|
prediction_match_rate_pct: 45.68
|
|
algorithm_guidance_proof: 56.4
|
|
operational_t20_count: 0.0
|
|
value_damage_pct_avg: 12.5
|
|
readiness_reasons: &id002
|
|
- DATA_INTEGRITY_LOCK_NOT_PASS_100
|
|
- OPERATIONAL_T20_SAMPLE_LT_30
|
|
- OPERATIONAL_T20_PASS_LT_60
|
|
- EXPECTANCY_LE_0_1
|
|
- WIN_RATE_LT_45
|
|
- PREDICTION_MATCH_LT_60
|
|
- VALUE_DAMAGE_GT_10
|
|
diagnosis:
|
|
senior_assessment: 현재 엔진은 방어 규율과 검증 골격은 좋지만, 공식/스크립트/산출물 버전이 계속 증식하는 구조다. 다음 단계는
|
|
새 지표 추가가 아니라, 권위 경로, 변경 수명주기, DAG, 패키징, 저성능 LLM 실행팩을 하나의 결정론적 생산 시스템으로 고정하는 것이다.
|
|
strengths:
|
|
- AGENTS.md가 운영 인덱스로 축소되어 있고 세부 규칙을 governance/rules 및 spec으로 위임한다.
|
|
- release_dag_run_v1 기준 14개 릴리즈 게이트가 모두 returncode 0으로 통과한다.
|
|
- number provenance, low capability pack, golden coverage, GAS thin adapter, no
|
|
replay/live mix 검증이 릴리즈 게이트에 포함되어 있다.
|
|
- spec/43_quant_factor_taxonomy.yaml에 factor lifecycle 필드가 이미 정의되어 있다.
|
|
- spec/46_low_capability_execution_pack.yaml에 저성능 LLM용 고정 섹션 계약이 이미 존재한다.
|
|
critical_gaps:
|
|
- gap: active_artifact_manifest가 패키지에 없는 Temp 산출물을 참조한다.
|
|
evidence: *id001
|
|
risk: 검증 환경에서는 PASS라도 업로드 패키지 소비자는 참조 불능이 발생할 수 있다.
|
|
fix: validate_packaged_artifact_references_v1.py를 P0 게이트로 승격한다.
|
|
- gap: package.json 스크립트가 202개로 orchestration entropy가 높다.
|
|
evidence: build 92개, validate 63개, 긴 chained script 다수
|
|
risk: 신규 기능 추가 시 실행 순서와 중복 검증이 파편화된다.
|
|
fix: release_dag.yaml 중심으로 스크립트를 8~12개 top-level entrypoint로 축소한다.
|
|
- gap: tools와 src/quant_engine 간 동일 basename Python 파일이 21개 존재한다.
|
|
evidence:
|
|
- __init__.py
|
|
- apply_engine_upgrade_v4.py
|
|
- apply_engine_upgrade_v7.py
|
|
- compile_formula_registry_v1.py
|
|
- compute_formula_outputs.py
|
|
- convert_xlsx_to_json.py
|
|
- generate_models_from_schema.py
|
|
- import_etf_nav_manual.py
|
|
- inject_computed_harness.py
|
|
- lib_trading_calendar.py
|
|
risk: canonical logic이 wrapper와 runtime 사이에서 갈라질 수 있다.
|
|
fix: src/quant_engine만 business logic을 소유하고 tools는 import-only CLI로 얇게 만든다.
|
|
- gap: formula registry가 153KB 단일 파일에 149개 공식으로 비대하다.
|
|
evidence: spec/13_formula_registry.yaml
|
|
risk: 저성능 LLM과 사람이 모두 충돌/중복/권위 경로를 추적하기 어렵다.
|
|
fix: domain shard를 원본으로 두고 normalized registry는 생성물로 전환한다.
|
|
- gap: 성과 활성화 조건은 아직 미달이다.
|
|
evidence: *id002
|
|
risk: 실전 활성화 전환이 서사에 의해 앞당겨질 수 있다.
|
|
fix: operational T+20 sample, expectancy, win-rate, prediction 기준을 hard gate로
|
|
유지한다.
|
|
target_methodology:
|
|
name: QEDD — Quant Engine Deterministic Development
|
|
one_sentence: 투자 아이디어를 곧바로 코드로 만들지 말고, thesis → contract → schema → golden case
|
|
→ canonical implementation → harness → shadow ledger → active release → retirement
|
|
순서로만 승격한다.
|
|
non_negotiable_principles:
|
|
- 'Single Source of Truth: spec YAML이 계약, src/quant_engine이 구현, Temp가 산출물, report가
|
|
렌더다.'
|
|
- 'Formula First, Narrative Last: 수치 판단은 등록 공식과 하네스가 만들고 LLM은 복사/정리만 한다.'
|
|
- 'No Silent Override: 수동 보정, 미등록 공식, 추정값은 모두 차단한다.'
|
|
- 'Shadow Before Active: 새 팩터/게이트는 최소 표본과 성과 조건을 만족하기 전까지 주문 판단에 반영하지 않는다.'
|
|
- 'One Owner Per Output Field: 모든 출력 필드는 owner formula와 source path가 하나여야 한다.'
|
|
- 'Evidence-Labeled Performance: live, replay, imputed, manual 입력을 절대 섞지 않는다.'
|
|
- 'Repository Entropy Budget: 파일/문서/스크립트/버전 산출물은 예산을 초과하면 기능 추가를 중단하고 정리한다.'
|
|
activation_lifecycle:
|
|
- state: idea
|
|
allowed_output: proposal only
|
|
entry: 투자 가설 1문장과 실패 조건 작성
|
|
exit: change_request 생성
|
|
- state: contract
|
|
allowed_output: spec only
|
|
entry: input/output/missing_policy/owner/golden_case 정의
|
|
exit: schema와 field dictionary 통과
|
|
- state: shadow
|
|
allowed_output: shadow_ledger only
|
|
entry: Python canonical 구현과 golden parity PASS
|
|
exit: live 표본 최소 30개와 uplift/손상 기준 통과
|
|
- state: active
|
|
allowed_output: decision packet
|
|
entry: release gate PASS 및 authority collision 0
|
|
exit: retirement condition 발생 또는 성과 하락
|
|
- state: retire
|
|
allowed_output: archive only
|
|
entry: edge 소멸, 충돌 과다, stale, 대체 공식 존재
|
|
exit: archive manifest와 migration hash 기록
|
|
target_architecture:
|
|
directory_contract:
|
|
AGENTS.md: 운영 헌법과 읽기 순서만 보유한다. 200라인 이하 유지.
|
|
spec/: 모든 공식, 데이터 계약, decision flow, risk policy, factor taxonomy의 유일한 권위.
|
|
spec/formulas/domains/: entry, exit, risk, portfolio, cash, fundamental, smart_money,
|
|
macro, reporting shard를 둔다.
|
|
src/quant_engine/: canonical Python package. business logic은 여기만 허용한다.
|
|
tools/: CLI wrapper. argparse, file I/O, src import 호출만 허용한다.
|
|
gas_*.gs: Google Sheet/Apps Script thin adapter. 계산 로직 금지.
|
|
schemas/: JSON/YAML schema와 생성 모델의 권위.
|
|
tests/golden/: 공식별 golden input/output. 새 공식의 필수 통과 조건.
|
|
tests/parity/: Python-GAS, schema-model parity, renderer-packet sync.
|
|
runtime/: active manifest, baseline manifest, lineage ledger.
|
|
Temp/: 실행 산출물. 직접 편집 금지, 패키징 전 참조 존재성 검증 필수.
|
|
artifacts/canonical/: 현재 active canonical snapshot만 둔다.
|
|
artifacts/archive/: retired/stale/versioned artifact만 둔다.
|
|
docs/: ADR, doctrine, runbook만 유지. 중복 설명 금지.
|
|
prompts/: renderer prompt와 audit prompt만 보유. 계산 지시 금지.
|
|
canonical_dataflow:
|
|
- raw workbook / market data
|
|
- 02_data_contract + 12_field_dictionary validation
|
|
- feature build in src/quant_engine/features
|
|
- formula execution in src/quant_engine/formulas
|
|
- decision graph in spec/routing/decision_graph.yaml
|
|
- risk/execution gates
|
|
- final_decision_packet_active.json
|
|
- final_context_for_llm.yaml
|
|
- operational_report.json/md renderer
|
|
authority_matrix_required_fields:
|
|
- output_field
|
|
- owner_formula_id
|
|
- source_spec
|
|
- source_schema
|
|
- runtime_artifact
|
|
- json_pointer
|
|
- provenance_required
|
|
- llm_mutable:false
|
|
refactor_todo:
|
|
- phase: P0_safety_freeze_and_baseline
|
|
objective: 리팩토링 중 투자 판단 산출물이 흔들리지 않게 현재 active 기준선을 고정한다.
|
|
priority: highest
|
|
tasks:
|
|
- id: P0-001
|
|
action: 현재 zip의 sha256, 파일 목록, extension count, package script count, active artifact
|
|
manifest, release_dag_run을 runtime/refactor_baseline_v1.yaml로 기록한다.
|
|
method: python tools/audit_repository_entropy_v2.py --out runtime/refactor_baseline_v1.yaml
|
|
acceptance: baseline 파일에 total_files, package_script_count, formula_registry_hash,
|
|
active_manifest_hash가 존재한다.
|
|
status: completed
|
|
- id: P0-002
|
|
action: active_artifact_manifest의 모든 참조가 업로드 패키지 안에 존재하는지 검증한다.
|
|
method: '새 validator: tools/validate_packaged_artifact_references_v1.py --manifest
|
|
runtime/active_artifact_manifest.yaml --root . --strict'
|
|
acceptance: missing_ref_count == 0. 현재 관측 missing refs는 Temp/canonical_artifact_resolver_v1.json,
|
|
Temp/final_execution_decision_v2.json, Temp/prediction_accuracy_harness_v2.json,
|
|
Temp/single_truth_ledger_v2.json, Temp/smart_cash_recovery_v7.json 이므로 반드시 해소한다.
|
|
status: completed
|
|
- id: P0-003
|
|
action: 리팩토링 기간 중 active decision packet 생성 로직을 freeze하고 신규 팩터는 shadow 상태로만 허용한다.
|
|
method: governance/change_requests/0002-refactor-freeze.yaml 생성 후 rule_lifecycle
|
|
transition_policy에 freeze window 기록
|
|
acceptance: release gate가 freeze 상태에서 새 active formula 추가를 차단한다.
|
|
status: completed
|
|
- id: P0-004
|
|
action: 보고서 렌더러 계산 0 원칙을 재검증한다.
|
|
method: python tools/validate_renderer_no_calculation_v1.py && python tools/validate_number_provenance_strict_v3.py
|
|
--ledger Temp/number_provenance_ledger_v4.json --report Temp/operational_report.md
|
|
acceptance: renderer_calculation_count == 0, number_provenance_coverage_pct ==
|
|
100
|
|
status: completed
|
|
- phase: P1_single_source_of_truth_split
|
|
objective: 거대 spec과 중복 권위 파일을 domain shard + generated normalized registry 구조로 전환한다.
|
|
tasks:
|
|
- id: P1-001
|
|
action: spec/13_formula_registry.yaml를 직접 편집 금지 generated file로 강등하고, 원본 shard를
|
|
spec/formulas/domains/*.yaml로 분리한다.
|
|
method: entry, exit, risk, cash, portfolio, fundamental, smart_money, macro, reporting,
|
|
data_quality, execution 도메인으로 분리
|
|
acceptance: spec/13_formula_registry.yaml 상단에 generated_from 목록과 source_hashes가
|
|
기록된다.
|
|
status: completed
|
|
- id: P1-002
|
|
action: 각 formula에 owner, lifecycle_state, input_fields, output_fields, missing_policy,
|
|
golden_cases, activation_threshold, retirement_condition을 필수화한다.
|
|
method: schemas/formula_contract.schema.json 추가 또는 강화
|
|
acceptance: python tools/validate_formula_contract_completeness_v1.py 결과 missing_required_field_count
|
|
== 0
|
|
status: completed
|
|
- id: P1-003
|
|
action: output_field_owner_ledger를 field_dictionary와 교차검증한다.
|
|
method: python tools/validate_output_owner_uniqueness_v1.py --ledger spec/03_formulas/output_field_owner_ledger.yaml
|
|
--fields spec/12_field_dictionary.yaml
|
|
acceptance: owned_output_field_pct == 100, authority_collision_count == 0
|
|
status: completed
|
|
- id: P1-004
|
|
action: spec/strategy/*의 버전 중복 파일은 active/latest/archive 상태를 명시한다.
|
|
method: governance/rule_lifecycle.yaml과 artifacts/canonical_manifest.yaml에 매핑
|
|
acceptance: 동일 base formula의 active_count_per_formula == 1
|
|
status: completed
|
|
- phase: P2_release_dag_and_script_diet
|
|
objective: package.json을 명령 저장소가 아니라 최소 엔트리포인트로 축소한다.
|
|
tasks:
|
|
- id: P2-001
|
|
action: package.json scripts를 ops:prepare, ops:validate, ops:build, ops:render,
|
|
ops:release, ops:package, ops:audit, ops:clean, ops:dev 9개로 축소한다.
|
|
method: 모든 세부 단계는 spec/41_release_dag.yaml과 tools/run_release_dag_v2.py에서 읽는다.
|
|
acceptance: package_script_count <= 12
|
|
status: completed
|
|
- id: P2-002
|
|
action: release DAG를 YAML에 완전히 선언한다.
|
|
method: 각 node에 id, command, inputs, outputs, depends_on, timeout_sec, cache_key,
|
|
strict, artifact_policy 기재
|
|
acceptance: python tools/validate_release_dag_v2.py --dag spec/41_release_dag.yaml
|
|
--strict PASS
|
|
status: completed
|
|
- id: P2-003
|
|
action: 긴 chained script를 모두 DAG node로 이전한다.
|
|
method: render-report-json처럼 18단계 이상 연결된 script 금지
|
|
acceptance: package.json 내 && count == 0 또는 top-level orchestration wrapper에만
|
|
허용
|
|
status: completed
|
|
- id: P2-004
|
|
action: DAG 산출물의 input_hash/output_hash/elapsed_sec/gate를 lineage_events.jsonl에
|
|
기록한다.
|
|
method: tools/run_release_dag_v2.py가 공통 기록 담당
|
|
acceptance: 각 node 실행 후 runtime/lineage_events.jsonl append 완료
|
|
status: completed
|
|
- phase: P3_python_canonical_and_tools_wrapper_cleanup
|
|
objective: Python 구현 권위를 src/quant_engine으로 단일화하고 tools는 얇은 wrapper로 만든다.
|
|
tasks:
|
|
- id: P3-001
|
|
action: tools와 src/quant_engine에 같은 basename으로 존재하는 21개 파일을 audit한다.
|
|
method: 각 파일을 canonical, wrapper, obsolete 중 하나로 분류
|
|
acceptance: tools_src_duplicate_count == 0 또는 wrapper_only_count == duplicate_count
|
|
status: completed
|
|
- id: P3-002
|
|
action: 모든 tools/build_*.py와 tools/validate_*.py에서 business logic을 src/quant_engine/*로
|
|
이전한다.
|
|
method: tools 파일은 parse_args, load, call, write, exit_code만 보유
|
|
acceptance: python tools/validate_tools_are_thin_wrappers_v1.py PASS
|
|
status: completed
|
|
- id: P3-003
|
|
action: runtime/python/core/formulas/generated와 src/quant_engine/models/generated의
|
|
생성 책임을 명확히 분리한다.
|
|
method: generated artifact에는 DO_NOT_EDIT header, source_schema_hash, generator_version
|
|
삽입
|
|
acceptance: schema/model parity validator PASS, generated drift count == 0
|
|
status: completed
|
|
- id: P3-004
|
|
action: 공식별 구현 위치 registry를 생성한다.
|
|
method: Temp/formula_runtime_registry_v2.json에 formula_id -> python_module ->
|
|
gas_adapter -> golden_cases -> owner 기록
|
|
acceptance: declared_runtime_count == formula_total, unmapped_formula_count ==
|
|
0
|
|
status: completed
|
|
- phase: P4_data_integrity_and_provenance_closure
|
|
objective: 데이터 정합성, 참조 존재성, 숫자 provenance를 닫힌 시스템으로 만든다.
|
|
tasks:
|
|
- id: P4-001
|
|
action: 모든 output number에 source_path, json_pointer, formula_id, input_hash, freshness_status를
|
|
강제한다.
|
|
method: schemas/number_provenance.schema.json + validate_number_provenance_strict_v4
|
|
acceptance: unproven_report_number_count == 0, stale_critical_number_count ==
|
|
0
|
|
status: completed
|
|
- id: P4-002
|
|
action: D+2 현금은 즉시현금 방어선 충족으로 간주하는 정책을 spec/risk/portfolio_exposure.yaml와 cash
|
|
formula shard에 명시한다.
|
|
method: cash_available_for_defense_krw = cash_krw + d_plus_2_cash_krw; settlement_gap_risk
|
|
별도 표기
|
|
acceptance: cash_floor gate가 D+2 포함/제외 값을 둘 다 출력하고, 방어선 판정은 포함값만 사용
|
|
status: completed
|
|
- id: P4-003
|
|
action: imputed/manual/stale/live/replay 데이터 라벨을 필드 단위로 강제한다.
|
|
method: spec/02_data_contract.yaml에 data_lineage enum 추가
|
|
acceptance: live_replay_mix_count == 0, unlabeled_data_lineage_count == 0
|
|
status: completed
|
|
- id: P4-004
|
|
action: 업로드 패키지 whitelist를 runtime manifest와 동기화한다.
|
|
method: tools/prepare_upload_zip.py가 active_manifest refs를 자동 include
|
|
acceptance: packaged_ref_existence_pct == 100
|
|
status: completed
|
|
- phase: P5_quant_algorithm_harness_hardening
|
|
objective: 뒷북 매수/설거지 매도를 줄이도록 팩터 수명주기와 충돌 해소를 공식화한다.
|
|
tasks:
|
|
- id: P5-001
|
|
action: '팩터는 horizon별로 분리한다: scalping, short, mid, long. 서로 다른 horizon 신호를 하나의
|
|
점수로 무리하게 합산하지 않는다.'
|
|
method: spec/43_quant_factor_taxonomy.yaml의 required_lifecycle_fields를 모든 strategy
|
|
formula에 적용
|
|
acceptance: factor_horizon_coverage_pct == 100
|
|
status: completed
|
|
- id: P5-002
|
|
action: 진입 게이트는 leading signal과 confirmation signal을 분리한다.
|
|
method: entry_lead_score, pullback_quality, breakout_quality, liquidity_acceleration,
|
|
distribution_pressure, valuation_heat를 별도 출력
|
|
acceptance: late_entry_block_rate와 missed_winner_rate를 동시에 추적한다.
|
|
status: completed
|
|
- id: P5-003
|
|
action: 스마트머니/유동성은 가격 상승 후 거래대금만 보지 말고 선행 누적/분산을 분리한다.
|
|
method: accumulation_score, distribution_risk_score, flow_acceleration, foreign_institution_sync,
|
|
volume_price_divergence를 독립 팩터화
|
|
acceptance: distribution_risk_score >= threshold이면 신규 매수는 shadow-only 또는 half-size로
|
|
제한
|
|
status: completed
|
|
- id: P5-004
|
|
action: 펀더멘털은 horizon gate로 쓰고 단기 타이밍 점수와 충돌 시 우선순위를 명확히 한다.
|
|
method: quality_growth_score, earnings_revision_score, cashflow_quality, balance_sheet_risk,
|
|
valuation_stretch를 mid/long horizon에 배치
|
|
acceptance: fundamental_good_but_entry_bad이면 BUY가 아니라 WATCH_PULLBACK이 출력된다.
|
|
status: completed
|
|
- id: P5-005
|
|
action: 성과 피드백은 replay와 live를 분리하고 active 승격 기준을 hard-code한다.
|
|
method: operational_t20_count >= 30, prediction_match_rate_pct >= 60, execution_expectancy_pct
|
|
> 0.1, execution_win_rate_pct >= 45, value_damage_pct <= 10 모두 필요
|
|
acceptance: 하나라도 미달이면 readiness_gate != ACTIVE
|
|
status: completed
|
|
- id: P5-006
|
|
action: 매도 엔진은 손실방어, 수익보존, 현금확보, thesis break를 분리한다.
|
|
method: sell_reason enum = ABS_FLOOR, REL_UNDERPERFORM, PROFIT_RATCHET, CASH_RAISE,
|
|
THESIS_BREAK, DATA_RISK
|
|
acceptance: sell candidate 2개 이상이면 sell_priority_table이 먼저 출력된다.
|
|
status: completed
|
|
- id: P5-007
|
|
action: 목표금액 5억과 현재 총자산의 goal gap을 risk budget과 position size에 연결한다.
|
|
method: goal_gap_pct, required_return_to_goal, max_drawdown_budget, cash_floor_defense를
|
|
final_decision_packet에 포함
|
|
acceptance: 목표 추격 때문에 손절/현금 방어선이 완화되지 않는다.
|
|
status: completed
|
|
- phase: P6_low_capability_llm_execution_pack
|
|
objective: 저성능 LLM도 같은 결과를 내도록 final_context와 response contract를 폐쇄형으로 만든다.
|
|
tasks:
|
|
- id: P6-001
|
|
action: final_context_for_llm.yaml을 report 생성의 유일 입력으로 만든다.
|
|
method: required_sections = executive, blockers, action_table, shadow_ledger,
|
|
data_missing, education_notes 유지
|
|
acceptance: context_required_field_coverage_pct == 100, ambiguous_instruction_count
|
|
== 0, llm_free_numeric_field_count == 0
|
|
status: completed
|
|
- id: P6-002
|
|
action: LLM용 절차를 7단계로 고정한다.
|
|
method: 1 읽기순서 확인 → 2 blockers 출력 → 3 sell priority → 4 buy/watch/avoid → 5 cash
|
|
defense → 6 data_missing → 7 education notes
|
|
acceptance: section_order_violation_count == 0
|
|
status: completed
|
|
- id: P6-003
|
|
action: LLM이 수치를 생성할 수 있는 문장을 prompt에서 제거한다.
|
|
method: '금지어: 계산해라, 추정해라, 적정가를 산출해라, 임의 보정해라. 허용어: 복사해라, 표시해라, DATA_MISSING으로
|
|
표기해라'
|
|
acceptance: validate_llm_prompt_no_numeric_generation_v1 PASS
|
|
status: completed
|
|
- id: P6-004
|
|
action: report_renderer_prompt.md를 compact renderer와 audit renderer로 분리한다.
|
|
method: 운영보고서는 compact, 검증보고서는 audit 사용
|
|
acceptance: report_renderer가 packet 외부 숫자를 참조하지 않는다.
|
|
status: completed
|
|
- phase: P7_gas_thin_adapter_and_sheet_contract
|
|
objective: GAS는 수집/시트 I/O만 하고 판단 로직은 Python canonical과 동기화한다.
|
|
tasks:
|
|
- id: P7-001
|
|
action: gas_*.gs에서 공식 계산 로직을 탐지해 제거한다.
|
|
method: GAS 함수는 fetch, normalize, writeHarnessRows, readSheetRange, callAdapter만
|
|
허용
|
|
acceptance: python tools/validate_gas_thin_adapter_v2.py PASS
|
|
status: completed
|
|
- id: P7-002
|
|
action: GAS-Python parity golden cases를 핵심 adapter별로 유지한다.
|
|
method: tests/parity/gas_python/*.yaml 생성
|
|
acceptance: node tools/run_gas_golden_parity.js PASS
|
|
status: completed
|
|
- id: P7-003
|
|
action: account_snapshot contract를 별도 I/O 계약으로 고정한다.
|
|
method: spec/15_account_snapshot_contract.yaml 기준으로 capture_parse_prompt와 schema
|
|
검증 연결
|
|
acceptance: 붙여넣기 가능한 TSV/CSV 출력 필드 순서가 매번 동일하다.
|
|
status: completed
|
|
- phase: P8_documentation_and_file_diet
|
|
objective: 문서가 많아져서 판단이 흐려지는 것을 방지한다.
|
|
tasks:
|
|
- id: P8-001
|
|
action: 문서는 AGENTS.md, doctrine.md, runbook.md, ADR, spec만 남기고 중복 설명은 제거한다.
|
|
method: docs/ 중복 문단 hash audit
|
|
acceptance: duplicate_doc_block_count == 0
|
|
status: completed
|
|
- id: P8-002
|
|
action: AGENTS.md는 운영 인덱스만 유지하고 상세 규칙은 governance/rules 및 spec로 이동한다.
|
|
method: validate_agents_shrink_v1 기준 강화
|
|
acceptance: AGENTS line count <= 220, forbidden_long_rule_block_count == 0
|
|
status: completed
|
|
- id: P8-003
|
|
action: archive 정책을 강화한다.
|
|
method: artifacts/archive/YYYY-MM-DD 이하에만 구버전 저장, canonical에는 active 최신 1개만 허용
|
|
acceptance: canonical_duplicate_version_count == 0
|
|
status: completed
|
|
- id: P8-004
|
|
action: repository entropy budget을 실제 패키징 기준으로 재산정한다.
|
|
method: spec/release/repository_entropy_budget.yaml에 target과 hard_limit 분리
|
|
acceptance: file_count <= target 또는 budget_exception_change_request 존재
|
|
status: completed
|
|
- phase: P9_release_and_rollback_control
|
|
objective: 변경이 잘못되면 즉시 이전 active packet으로 되돌릴 수 있게 한다.
|
|
tasks:
|
|
- id: P9-001
|
|
action: release train을 daily, weekly, emergency 세 가지로 분리한다.
|
|
method: spec/release/release_train.yaml에 allowed changes와 gates 정의
|
|
acceptance: weekly release만 active formula 승격 가능
|
|
status: completed
|
|
- id: P9-002
|
|
action: rollback manifest를 생성한다.
|
|
method: runtime/rollback_manifest_v1.yaml에 previous_active_packet, previous_manifest,
|
|
artifact hashes 기록
|
|
acceptance: rollback command가 1단계로 실행 가능
|
|
status: completed
|
|
- id: P9-003
|
|
action: 변경요청 없는 파일 변경을 차단한다.
|
|
method: tools/validate_change_request_coverage_v2.py --changed-files runtime/changed_files.txt
|
|
acceptance: changed_files_without_change_request_count == 0
|
|
status: completed
|
|
- id: P9-004
|
|
action: 릴리즈 후 자동 audit report를 생성한다.
|
|
method: Temp/refactor_release_audit_v1.json에 gate, diff, entropy, formula coverage,
|
|
activation status 기록
|
|
acceptance: gate == PASS 또는 release_mode == AUDIT_ONLY
|
|
status: completed
|
|
validators_to_add_or_strengthen:
|
|
- validator: validate_packaged_artifact_references_v1.py
|
|
purpose: runtime manifest와 final packet이 참조하는 파일이 실제 업로드 zip에 존재하는지 검사
|
|
pass_condition: missing_ref_count == 0
|
|
- validator: validate_formula_contract_completeness_v1.py
|
|
purpose: 모든 formula shard가 owner/lifecycle/input/output/missing/golden/activation/retirement
|
|
필드를 갖는지 검사
|
|
pass_condition: missing_required_field_count == 0
|
|
- validator: validate_tools_are_thin_wrappers_v1.py
|
|
purpose: tools/*.py에 business logic, threshold, formula calculation이 남아 있는지 검사
|
|
pass_condition: logic_violation_count == 0
|
|
- validator: validate_package_script_budget_v1.py
|
|
purpose: package.json script count와 chained command를 예산화
|
|
pass_condition: script_count <= 12 and chained_script_count == 0
|
|
- validator: validate_factor_lifecycle_coverage_v1.py
|
|
purpose: 모든 팩터가 horizon, decay, conflict, activation, retirement를 갖는지 검사
|
|
pass_condition: factor_lifecycle_coverage_pct == 100
|
|
- validator: validate_performance_activation_gate_v1.py
|
|
purpose: 성과 미달 팩터가 active로 승격되는 것을 차단
|
|
pass_condition: active_factor_with_failed_performance_count == 0
|
|
- validator: validate_low_capability_context_closure_v2.py
|
|
purpose: 저성능 LLM context가 외부 숫자 생성 없이 보고서 작성 가능한지 검사
|
|
pass_condition: llm_free_numeric_field_count == 0 and missing_required_section_count
|
|
== 0
|
|
- validator: validate_doc_entropy_v1.py
|
|
purpose: 문서 중복, AGENTS 비대화, stale ADR를 검사
|
|
pass_condition: duplicate_doc_block_count == 0 and agents_line_count <= 220
|
|
- validator: validate_active_artifact_presence_in_canonical_v1.py
|
|
purpose: active artifact가 canonical/artifacts 또는 Temp final packet과 일치하는지 검사
|
|
pass_condition: active_artifact_match_pct == 100
|
|
low_capability_llm_operating_procedure:
|
|
role: renderer_only
|
|
forbidden:
|
|
- 숫자 계산
|
|
- 가격 추정
|
|
- 수량 추정
|
|
- 하네스 verdict 번복
|
|
- missing data 보정
|
|
- 외부 시장 데이터로 harness 교체
|
|
allowed:
|
|
- final_context_for_llm.yaml 값 복사
|
|
- DATA_MISSING 표기
|
|
- blocker 설명
|
|
- action_table를 사람이 읽게 정리
|
|
- 교육용 설명
|
|
fixed_steps:
|
|
- step: 1
|
|
name: read_required_files
|
|
instruction: AGENTS.md 읽기 순서를 따른다. 파일이 없으면 DATA_MISSING으로 쓰고 추정하지 않는다.
|
|
- step: 2
|
|
name: print_executive_gate
|
|
instruction: engine_gate, blockers, readiness_gate를 먼저 출력한다.
|
|
- step: 3
|
|
name: print_sell_priority
|
|
instruction: sell candidate가 2개 이상이면 sell priority table을 action table보다 먼저 출력한다.
|
|
- step: 4
|
|
name: print_actions
|
|
instruction: BUY/SELL/HOLD/WATCH/AVOID는 packet의 action만 사용한다.
|
|
- step: 5
|
|
name: print_cash_defense
|
|
instruction: D+2 현금을 즉시현금 방어선 충족으로 포함하되 결제갭 리스크는 별도 표시한다.
|
|
- step: 6
|
|
name: print_shadow_ledger
|
|
instruction: blocked/limited 항목의 산출값을 숨기지 않는다.
|
|
- step: 7
|
|
name: print_data_missing
|
|
instruction: 하네스 결측은 DATA_MISSING — 하네스 업데이트 필요 문구로만 표기한다.
|
|
response_quality_checklist:
|
|
- 모든 숫자에 provenance가 있거나 packet에서 온 값이다.
|
|
- 매수/매도 가격과 수량을 LLM이 생성하지 않았다.
|
|
- live와 replay 성과를 섞지 않았다.
|
|
- 하네스 차단 신호를 문장으로 완화하지 않았다.
|
|
- 보고서 섹션 순서가 계약과 일치한다.
|
|
quant_decision_policy_to_lock:
|
|
entry_policy:
|
|
- 신규 매수는 macro/risk/cash/data/integrity gate가 모두 통과해야 한다.
|
|
- 상승률 후행 추격 신호만 존재하면 BUY가 아니라 WATCH_PULLBACK 또는 AVOID_CHASE로 둔다.
|
|
- fundamental 우수 + 단기 과열이면 분할진입 또는 대기이며 전량 BUY 금지.
|
|
- distribution risk가 높으면 breakout score가 좋아도 size cap 또는 block.
|
|
exit_policy:
|
|
- ABS_FLOOR는 다른 서사보다 우선한다.
|
|
- 수익 보유 종목은 trailing/profit ratchet으로 수익금 방어를 먼저 한다.
|
|
- 현금 부족은 가치 훼손 최소화 optimizer로 해결하고, 임의 매도 금지.
|
|
- sell priority table 없이 복수 매도 후보를 나열하지 않는다.
|
|
activation_policy:
|
|
- operational_t20_count < 30이면 live 성과 기반 active 승격 금지.
|
|
- prediction_match_rate_pct < 60이면 alpha confidence를 확대하지 않는다.
|
|
- cash_recovery_value_damage_pct > 10이면 현금확보 알고리즘을 active 확대하지 않는다.
|
|
- algorithm_guidance_proof < 80이면 guidance wording을 강화하고 shadow ledger를 확대한다.
|
|
target_metrics_after_refactor:
|
|
hard_gates:
|
|
authority_collision_count: 0
|
|
single_truth_conflict_count: 0
|
|
missing_packaged_artifact_refs: 0
|
|
unproven_report_number_count: 0
|
|
renderer_calculation_count: 0
|
|
llm_free_numeric_field_count: 0
|
|
changed_files_without_change_request_count: 0
|
|
active_formula_without_golden_case_count: 0
|
|
replay_used_as_live_count: 0
|
|
repository_entropy_targets:
|
|
package_script_count_target: 12
|
|
tools_business_logic_violation_count: 0
|
|
agents_md_line_count_max: 220
|
|
formula_registry_direct_edit_allowed: false
|
|
canonical_active_artifact_per_formula: 1
|
|
performance_targets_for_active_trading_upgrade:
|
|
operational_t20_sample_min: 30
|
|
prediction_match_rate_pct_min: 60
|
|
execution_expectancy_pct_min: 0.1
|
|
execution_win_rate_pct_min: 45
|
|
cash_recovery_value_damage_pct_max: 10
|
|
overall_hardening_score_min: 80
|
|
algorithm_guidance_proof_min: 80
|
|
recommended_file_changes:
|
|
create:
|
|
- runtime/refactor_baseline_v1.yaml
|
|
- tools/validate_packaged_artifact_references_v1.py
|
|
- tools/validate_package_script_budget_v1.py
|
|
- tools/validate_tools_are_thin_wrappers_v1.py
|
|
- tools/validate_formula_contract_completeness_v1.py
|
|
- tools/run_release_dag_v2.py
|
|
- schemas/formula_contract.schema.json
|
|
- schemas/release_dag.schema.json
|
|
- spec/formulas/domains/entry.yaml
|
|
- spec/formulas/domains/exit.yaml
|
|
- spec/formulas/domains/risk.yaml
|
|
- spec/formulas/domains/cash.yaml
|
|
- spec/formulas/domains/portfolio.yaml
|
|
- spec/formulas/domains/fundamental.yaml
|
|
- spec/formulas/domains/smart_money.yaml
|
|
- spec/formulas/domains/macro.yaml
|
|
- spec/formulas/domains/reporting.yaml
|
|
- runtime/rollback_manifest_v1.yaml
|
|
modify:
|
|
- AGENTS.md
|
|
- package.json
|
|
- spec/13_formula_registry.yaml
|
|
- spec/41_release_dag.yaml
|
|
- spec/43_quant_factor_taxonomy.yaml
|
|
- spec/46_low_capability_execution_pack.yaml
|
|
- spec/release/repository_entropy_budget.yaml
|
|
- runtime/active_artifact_manifest.yaml
|
|
- tools/prepare_upload_zip.py
|
|
archive_or_generate_only:
|
|
- 구버전 Temp 산출물 참조
|
|
- artifacts/canonical 내 중복 active 버전
|
|
- tools와 src에 동시에 존재하는 business logic 파일
|
|
- 직접 편집되는 generated schema/model/formula 파일
|
|
implementation_sequence_for_a_low_capability_agent:
|
|
- 1. 절대 투자 공식부터 수정하지 말고 P0 validator를 먼저 만든다.
|
|
- 2. validate_packaged_artifact_references_v1.py를 실행해 missing refs를 0으로 만든다.
|
|
- 3. package.json script count를 줄이기 전 현재 scripts를 release_dag.yaml로 그대로 옮긴다.
|
|
- 4. DAG가 기존 full-gate와 동일한 결과를 낸 뒤 package.json을 축소한다.
|
|
- 5. formula registry를 domain shard로 복사 분할하되, normalized 13_formula_registry는 generator로
|
|
재생성한다.
|
|
- 6. tools/src 중복 파일을 하나씩 wrapper화하고 매번 golden/parity/release gate를 실행한다.
|
|
- 7. 저성능 LLM final_context를 먼저 닫고, 보고서 prompt는 context 외부 숫자 접근을 금지한다.
|
|
- 8. 성과 개선 알고리즘은 전부 shadow로 추가하고 operational sample 조건 충족 전 active 승격하지 않는다.
|
|
- 9. 모든 변경은 change_request yaml에 rationale, touched_files, expected_metric, rollback_plan을
|
|
적는다.
|
|
- 10. 마지막에 release_dag_run_v2.json, refactor_release_audit_v1.json, rollback_manifest_v1.yaml을
|
|
생성한다.
|
|
definition_of_done:
|
|
- 업로드 zip만 받아도 active manifest의 모든 참조를 열 수 있다.
|
|
- package.json은 12개 이하의 top-level command만 가진다.
|
|
- spec domain shard가 원본이고 normalized registry는 생성물이다.
|
|
- tools는 얇은 CLI wrapper이며 계산 로직은 src/quant_engine에만 있다.
|
|
- 새 공식은 contract/schema/golden/owner/activation/retirement 없이는 merge되지 않는다.
|
|
- 저성능 LLM은 final_context_for_llm.yaml만 보고도 동일한 action table을 출력한다.
|
|
- 리포트의 모든 숫자는 provenance 100%를 유지한다.
|
|
- live/replay/imputed/manual 데이터가 분리되어 표시된다.
|
|
- 투자 활성화는 성과 게이트 미달 시 항상 WATCH/AUDIT_ONLY로 남는다.
|
|
- rollback이 단일 명령 또는 단일 manifest 교체로 가능하다.
|