Files
QuantEngineByItz/governance/gas_logic_migration_ledger_v1.yaml
T
kjh2064 5166750b53 WBS-7.3/7.4/7.5/7.11: 거버넌스 문서 정합성 정리 + spec-코드 동기화 게이트
2026-06-21 비판적 리뷰에서 spec/governance YAML이 코드 상태와 어긋난
채로 방치되던 3개 구체적 사례를 발견하고 정정했다. 근본 원인(동기화를
보장하는 장치 없음)에 대응하는 신규 CI 게이트도 함께 추가한다.

- spec/aliases.yaml: deprecated alias 17건 제거(활성 참조 0건 확인 후,
  2026-06-30 데드라인 전). role: deprecated_redirect인 spec/03_risk_policy.yaml,
  spec/04_strategy_rules.yaml 2개만 실삭제 — spec/06_exit_policy.yaml은
  role: compatibility_index(영구유지 설계)였음을 재확인해 보존
- governance/gas_logic_migration_ledger_v1.yaml: 존재하지 않는 파일을
  canonical 구현으로 인용하던 오류 2건 발견·정정, parity 테스트 부재로
  GAS 코드 삭제 보류(F12/F13/F14)
- spec/13_formula_registry.yaml: OVERHANG_PRESSURE_V1의 "-500000"
  절대값 폴백을 avg_volume_5d 비례식으로 교체(EXPERT_PRIOR 등록)
- tools/validate_specs.py: validate_spec_code_sync() 신규 — has_code_implementation/
  code_path 필드가 있는 spec만 검사(점진적 롤아웃, 기존 PASS 상태 비파괴),
  12개 파일 1차 태깅
2026-06-21 20:08:48 +09:00

243 lines
11 KiB
YAML

schema_version: gas_logic_migration_ledger.v1
source: governance/gas_logic_migration_ledger_v1.yaml
authored: 2026-06-10
total_findings: 15
classification_summary:
decision_logic: 4
score_logic: 5
price_qty_logic: 4
pure_mapping: 1
display_text: 1
unclassified_findings: 0
# WBS-7.3 재검토 (2026-06-21):
# - F01/F09 (REGISTER_*): DONE으로 정정 — spec/calibration_registry.yaml에 이미
# 등록되어 있었음(P5-T01 wave1). 레저 상태가 stale했을 뿐 실작업 불필요.
# - F12/F13 (DELETE_DISTRIBUTION_RISK_GAS): ledger의 "build_distribution_risk_v1.py"
# 인용은 오류(존재하지 않는 파일) — 실제는 build_distribution_risk_score_v2.py가
# 동일 필드를 산출하나, GAS-Python parity 테스트가 전혀 없어 삭제를 보류.
# - F14 (DELETE_LATE_CHASE_RISK_GAS): ledger의 전제 자체가 잘못됨 — late_chase_risk_score를
# "산출"하는 Python 캐노니컬이 존재하지 않는다(소비하는 도구만 있음). GAS가 유일한
# 산출 경로일 가능성이 높아 삭제 시도하지 않음. migration_action 재검증 필요.
# - F02~F06, F07, F10, F11, F15 (MEDIUM/HIGH priority MIGRATE_*): 전용 parity 테스트
# 인프라(GAS 함수와 동일 입력으로 Python 포트 출력을 대조)가 없는 상태에서 결정론적
# 매매엔진의 가격/수량/정지손실/라우팅 로직을 포팅하는 것은 silent correctness bug
# 위험이 크다고 판단해 이번 세션에서는 착수하지 않았다(advisor 권고에 따른 보류).
# 특히 F11(stop_loss_gate)은 ledger 자체가 "critical path — must match
# validate_stop_loss_policy_v1 spec"로 명시한 항목이다. 후속 전용 스프린트에서
# parity 테스트를 먼저 구축한 뒤 착수해야 한다.
# Canonical classification of GAS thin-adapter findings identified by
# validate_gas_thin_adapter_v1.py. Each finding is classified by what type
# of logic it contains and paired with a migration_action.
findings:
- id: F01
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 186
text: "SP_TAKE_PROFIT: 10, // Profit_Pct >= 10% (익절 후보)"
classification: score_logic
migration_action: REGISTER_SP_TAKE_PROFIT
target_file: formulas/score_thresholds_v1.py
status: DONE
resolved_2026_06_21: "이미 spec/calibration_registry.yaml에 id=SP_TAKE_PROFIT(gs_location=gas_data_feed.gs:186, 'P5-T01 wave1'에서 등록)으로 등록되어 있음을 재확인. 별도 formulas/score_thresholds_v1.py 신규 작성 불필요 — 레저 상태만 stale했음."
- id: F02
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 656
text: "priceBasis = Number.isFinite(tp2Price) ? \"TAKE_PROFIT_TIER2_PRICE\" : \"PRIOR_CLOSE_X_0.998\";"
classification: price_qty_logic
migration_action: MIGRATE_PRICEBASIS_TO_PYTHON
target_file: formulas/price_basis_v1.py
status: TODO
blocking_on: F03 F04 (same function, migrate together)
- id: F03
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 665
text: "priceBasis = Number.isFinite(tp2Price) ? \"TAKE_PROFIT_TIER2_PRICE\" : \"PRIOR_CLOSE_X_0.998\";"
classification: price_qty_logic
migration_action: MIGRATE_PRICEBASIS_TO_PYTHON
target_file: formulas/price_basis_v1.py
status: TODO
blocking_on: F02 F04
- id: F04
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 674
text: "priceBasis = Number.isFinite(tp1Price) ? \"TAKE_PROFIT_TIER1_PRICE\" : \"PRIOR_CLOSE_X_0.998\";"
classification: price_qty_logic
migration_action: MIGRATE_PRICEBASIS_TO_PYTHON
target_file: formulas/price_basis_v1.py
status: TODO
- id: F05
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 678
text: "action = \"TAKE_PROFIT_TIER1\";"
classification: decision_logic
migration_action: MIGRATE_DECISIONS_ROUTING
target_file: formulas/execution_decision_v1.py
status: TODO
- id: F06
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 683
text: "priceBasis = Number.isFinite(tp1Price) ? \"TAKE_PROFIT_TIER1_PRICE\" : \"PRIOR_CLOSE_X_0.998\";"
classification: price_qty_logic
migration_action: MIGRATE_PRICEBASIS_TO_PYTHON
target_file: formulas/price_basis_v1.py
status: TODO
- id: F07
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 1577
text: "score += THRESHOLDS[\"SP_TAKE_PROFIT\"];"
classification: score_logic
migration_action: MIGRATE_SCORE_CALCULATION
target_file: formulas/score_thresholds_v1.py
status: TODO
- id: F08
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 1578
text: "breakdown.push(`take_profit:+${THRESHOLDS[\"SP_TAKE_PROFIT\"]}`)"
classification: display_text
migration_action: DISPLAY_TEXT_PASSTHROUGH
notes: display_text stays in GAS adapter as rendering concern
status: KEEP_IN_GAS
- id: F09
file: src/gas_adapter_parts/gdf_01_price_metrics.gs
line: 2164
text: "TAKE_PROFIT_BASE: 10,"
classification: score_logic
migration_action: REGISTER_TAKE_PROFIT_BASE
target_file: formulas/score_thresholds_v1.py
status: DONE
resolved_2026_06_21: "이미 spec/calibration_registry.yaml에 id=TAKE_PROFIT_BASE(gs_location=gas_data_feed.gs:2164)로 등록되어 있음을 재확인. F01과 동일 사유로 레저 상태만 stale했음."
- id: F10
file: src/gas_adapter_parts/gdf_03_portfolio_gates.gs
line: 1335
text: "return { [\"decisions\"]: routes, traces: traces, lock: true };"
classification: decision_logic
migration_action: MIGRATE_DECISIONS_ROUTING
target_file: formulas/routing_decision_v1.py
status: TODO
- id: F11
file: src/gas_adapter_parts/gdf_03_portfolio_gates.gs
line: 1360
text: "if (holding && holding.stopBreach) return 'STOP_LOSS';"
classification: decision_logic
migration_action: MIGRATE_STOP_BREACH_DECISION
target_file: formulas/stop_loss_gate_v1.py
status: TODO
- id: F12
file: src/gas_adapter_parts/gdf_03_portfolio_gates.gs
line: 2128
text: "[\"distribution_risk_score\"]: Math.min(100, Math.max(0, score)),"
classification: score_logic
migration_action: DELETE_DISTRIBUTION_RISK_GAS
target_file: formulas/distribution_risk_v1.py
status: TODO
notes: Python canonical (build_distribution_risk_v1.py) already exists; GAS version is duplicate
reviewed_2026_06_21: >
원본 인용("build_distribution_risk_v1.py")은 존재하지 않는 파일이다 — 실제로는
tools/build_distribution_risk_score_v2.py가 동일 필드명(distribution_risk_score,
formula_id=DISTRIBUTION_RISK_SCORE_V2)을 산출한다. 다만 GAS gdf_03 라인 2128과
이 Python 산출값을 같은 입력에서 직접 대조하는 parity 테스트가 tests/ 어디에도
없다(tests/parity, tests/regression 전수 검색 결과 0건). "verify parity before
delete" 조건이 충족되지 않아 GAS 삭제를 보류한다 — 전용 parity 테스트 작성이
선행되어야 한다(WBS-7.3 후속 스프린트).
- id: F13
file: src/gas_adapter_parts/gdf_03_portfolio_gates.gs
line: 2132
text: "formula_id: 'DISTRIBUTION_RISK_SCORE_V1'"
classification: pure_mapping
migration_action: DELETE_DISTRIBUTION_RISK_GAS
status: TODO
notes: formula_id tag stays with Python canonical; remove from GAS
reviewed_2026_06_21: "F12와 동일 사유로 보류 — parity 테스트 선행 필요."
- id: F14
file: src/gas_adapter_parts/gdf_03_portfolio_gates.gs
line: 2214
text: "[\"late_chase_risk_score\"]: Math.min(100, Math.max(0, Math.round(lateChaseRisk))),"
classification: score_logic
migration_action: DELETE_LATE_CHASE_RISK_GAS
target_file: formulas/late_chase_risk_v1.py
status: TODO
notes: Python canonical (build_alpha_lead_table_v1.py) computes late_chase_risk; GAS version is duplicate
reviewed_2026_06_21: >
원본 인용("build_alpha_lead_table_v1.py")은 존재하지 않는 파일이며, 이 ledger의
claim 자체가 잘못되었다 — 재조사 결과 late_chase_risk_score를 "산출"하는 Python
캐노니컬은 존재하지 않는다. tools/build_late_chase_attribution_v1.py는 이 필드를
입력에서 "소비"만 할 뿐(r.get("late_chase_risk_score")) 직접 계산하지 않으며,
build_anti_late_chase_v5/v6.py도 별도 산출 로직이다. 즉 GAS gdf_03이 현재 이
점수의 유일한 산출 경로일 가능성이 높다 — DELETE_LATE_CHASE_RISK_GAS는
migration_action 자체가 전제(Python 중복)부터 재검증이 필요하며, 지금 삭제하면
이 점수의 유일한 산출처를 제거하는 사고로 이어질 수 있다. 삭제 금지, 후속 조사 필요.
- id: F15
file: src/gas_adapter_parts/gdf_04_execution_quality.gs
line: 479
text: "if (bqRow.breakout_quality_gate === 'BLOCKED_LATE_CHASE' || alphaRow[\"late_chase_risk_score\"] >= 70)"
classification: decision_logic
migration_action: MIGRATE_LATE_CHASE_GATE
target_file: formulas/late_chase_gate_v1.py
status: TODO
# Migration action summary (9 actions)
migration_actions:
- action_id: REGISTER_SP_TAKE_PROFIT
findings: [F01]
description: Register SP_TAKE_PROFIT threshold (value=10) in Python score_thresholds canonical
priority: LOW
- action_id: REGISTER_TAKE_PROFIT_BASE
findings: [F09]
description: Register TAKE_PROFIT_BASE threshold (value=10) in Python score_thresholds canonical
priority: LOW
- action_id: DELETE_DISTRIBUTION_RISK_GAS
findings: [F12, F13]
description: Remove distribution_risk_score calculation from gdf_03; Python canonical exists
priority: HIGH
blocker: verify build_distribution_risk_v1.py output matches GAS output before delete
- action_id: DELETE_LATE_CHASE_RISK_GAS
findings: [F14]
description: Remove late_chase_risk_score from gdf_03; Python canonical in alpha_lead_table_v1
priority: HIGH
blocker: verify parity before delete
- action_id: MIGRATE_PRICEBASIS_TO_PYTHON
findings: [F02, F03, F04, F06]
description: priceBasis string selection (TIER1/TIER2 or PRIOR_CLOSE_X_0.998) → Python canonical
priority: MEDIUM
- action_id: MIGRATE_SCORE_CALCULATION
findings: [F07]
description: score += THRESHOLDS["SP_TAKE_PROFIT"] pattern → Python canonical scorer
priority: MEDIUM
- action_id: MIGRATE_STOP_BREACH_DECISION
findings: [F11]
description: holding.stopBreach → STOP_LOSS decision → Python canonical stop_loss_gate
priority: HIGH
notes: critical path — must match validate_stop_loss_policy_v1 spec
- action_id: MIGRATE_DECISIONS_ROUTING
findings: [F05, F10]
description: TAKE_PROFIT_TIER1 action assignment and routing lock decision → Python canonical
priority: MEDIUM
- action_id: MIGRATE_LATE_CHASE_GATE
findings: [F15]
description: BLOCKED_LATE_CHASE gate check (threshold 70) → Python canonical gate formula
priority: HIGH
blocker: late_chase_risk_score must come from Python before GAS gate can be removed