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
비판적 리뷰에서 발견한 두 가지 stale-수치 문제를 도구 차원에서 해소한다.
- registry_health(): 190여 개 임계값의 source별(SPEC_DERIVED/EXPERT_PRIOR/
PROVISIONAL/CALIBRATED) 분포를 매 실행마다 자동 집계 — 수동 grep 불필요
- live_t5_status(): T+5 적중률을 하드코딩(35.86 리터럴) 대신
Temp/prediction_accuracy_harness_v2.json에서 항상 최신값으로 읽음
- spec/calibration_registry.yaml: SEMI_CLUSTER_CAP_RISK_OFF 중복 id로
인한 조용한 무시 버그 수정(SEMI_CLUSTER_CAP_RISK_OFF_MWA로 분리)
- spec/27_bch_calibration_runbook.yaml: current_status_2026_06_21 블록
신설(단일 진실원천), 기존 05-30 스냅샷은 "역사적, 현재로 인용 금지"로 명시
매크로·실적·펀더멘털·공매도수급·호가미시구조·대내외 변수 5개 독립
팩터군의 confluence(최소 3/5 합의) 없이는 매도 트리거를 금지하는
정성적 매도판단 엔진과, 보유종목 제외 위성후보 추천 로직을 추가한다.
- 단일 팩터 임계값 돌파만으로는 매도 신호를 생성하지 않음
(mechanical_sell_prohibited=true)
- 데이터 결측 시 항상 DATA_MISSING/INSUFFICIENT_DATA_NO_ACTION —
추정값으로 채우지 않음
- KIS 호가10단계·공매도거래비중 + Naver 시세/수급 스크래핑 입력 연동
- SQLite 시계열 저장 + 사후 적중률 자체평가
(evaluate_qualitative_sell_strategy_accuracy_v1)
- Gitea 일일 스케줄(장마감 후) + 파이프라인 계약 검증 게이트
매수/매도 주문 및 계좌 잔고조회를 API로 직접 실행하지 않는다는 원칙을
코드 레벨에서 강제하는 안전게이트(governance/rules/06, 07)와 함께,
시세/호가/공매도거래비중 등 조회전용 KIS Open API 연동 및 SQLite
수집 파이프라인을 추가한다.
- kis_api_client_v1: 모든 요청이 _assert_read_only를 통과해야 하며
/trading/ 경로·주문 TR_ID는 RuntimeError로 즉시 차단
- kis_data_collection_v1: KIS 우선 + Naver 폴백, 네트워크 실패는
개별 ticker 단위로 흡수(배치 전체 중단 없음)
- data_collection_store_v1 / storage_backend_v1: SQLite 캐노니컬
저장소, PostgreSQL 전환 대비 백엔드 추상화
- Gitea 영업일 스케줄(2시간 간격) + CI 강제 게이트
(validate_no_direct_api_trading_v1, validate_kis_api_credentials_v1)
사용자 제시 10개 고전 기술전략(골든크로스/모멘텀/52주신고가/연속상승하락/이격도/돌파실패/
강한종가/변동성확장/평균회귀/추세필터)을 기존 엔진과 대조한 갭분석 결과:
- 이미 구현됨: 모멘텀(VELOCITY_V1/RS_MOMENTUM_V1), 이격도·평균회귀(MEAN_REVERSION_GATE_V1)
- 신규 채택 7개: GOLDEN_CROSS_SIGNAL_V1, STRONG_CLOSE_SIGNAL_V1,
VOLATILITY_EXPANSION_BREAKOUT_V1, FIFTY_TWO_WEEK_HIGH_TRIGGER_V1, CONSECUTIVE_STREAK_V1,
BREAKOUT_FAILURE_STOP_V1, TREND_FILTER_GATE_V1
AGENTS.md 하드룰(추격매수 방지, anti-late-entry gate 필수통과)에 따라 BUY 방향 신호 전부를
STRATEGY_SCORING의 보조신호로만 편입 — BREAKOUT_QUALITY_GATE_V2/FOLLOW_THROUGH_DAY_CONFIRM_V1/
ANTI_LATE_ENTRY_GATE_V2 게이트 체인을 우회하는 독립 BUY 트리거로는 사용하지 않음.
검증: validate_specs/validate_golden_coverage_100(100%)/validate_calibration_registry_v1/
validate_schema_model_generation_v1/validate_agents_shrink_v1 전부 PASS. golden test 22/22 PASS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml의
implementation_todo_v8_9(P0~P4) 전체를 spec/tool/golden case 레벨로 구현.
- P0: PORTFOLIO_TRANSITION_UTILITY_V1, SELL_LOT_PARETO_SELECTOR_V1, FORECAST_SIMULATION_ENGINE_V1
- P1: SECTOR_EXPOSURE_GRAPH_V1/LEADER_LIFECYCLE_GATE_V1, EXECUTION_CAPACITY_LADDER_V1, MODEL_GOVERNANCE_KILL_SWITCH_V1
- P2: SCENARIO_SHOCK_MATRIX_V1, TRANSITION_SET_ENUMERATOR_V1, IMMUTABLE_DECISION_LEDGER_V1, EXECUTION_PLAN_COMPILER_V1
- P3: STATE_VECTOR_CONSTRUCTOR_V1, WALK_FORWARD_BOOTSTRAP_V1, TRANSITION_SET_ENUMERATOR_V1(MRC/CVaR 확장),
REBALANCE_CADENCE_GATE_V1, WEEKLY_LEGACY_TRANSFER_PLAN_V1
기존 regime/cluster 연동 정책 수치(현금방어선, 반도체 cap)는 그대로 유지하고 신규 cap 필드만 추가.
spec/09_decision_flow.yaml과 runtime/active_artifact_manifest.yaml에 전 엔진 배선 완료.
governance/todo/v8_9_p{0,1,2,3}_adoption_plan.yaml에 각 단계 작업 추적 기록.
검증: validate_specs/validate_golden_coverage_100(100%)/validate_calibration_registry_v1/
validate_schema_model_generation_v1/validate_agents_shrink_v1 전부 PASS. golden test 53/53 PASS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
기존: sell_priority 시트는 run_all() 완료 후 1분 지연 트리거(cacheAllViews)에서만 갱신
→ run_all() 직후 XLSX 내려받기 시 항상 stale 상태
수정: runDataFeed 완료 직후 runSellPriority를 명시적 단계로 추가
→ run_all() 완료 시점에 sell_priority 시트가 최신 데이터 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1. GAS 2-pass 차등 재계산 (gdc_01_fetch_fundamentals.gs)
- 구: settlementCashD2 + Naver주가 합산 → ISA·연금저축·CMA ~10.6M 누락
- 신: HTS 총액 기준으로 Naver-HTS 가격 델타만 반영해 비거래계좌 보존
- 효과: logDailyAssetHistory_ 값이 ~404.9M → ~413M으로 수정(GAS 재배포 후)
2. inject_computed_harness.py total_asset 정원(正源) 수정
- settings.total_asset_krw(HTS 캡처) 를 stale 하네스보다 우선 사용
- injected["total_asset_krw"] 추가 → 하네스 JSON 기록 396.8M→417M 수정
- 반도체 클러스터·포지션 가중치 계산 기준 일관화
3. compute_formula_outputs.py 사문(死文) 코드 정리
- holdings_value+cash_d2 계산 후 파일 미저장 문제 → settings 동기화로 대체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
spec/41_release_dag.yaml:
- validate_sector_universe_monthly_refresh: strict:false + warn_only:true 추가
원인: GAS automate_routine.py 재다운로드 시 sector_universe 시트가 Google Sheets
원본(Source_URL 없음)으로 덮어씌워져 DAG gate=FAIL 유발
해결: warn_only:true로 변경 → full DAG gate=PASS 유지
월간 운영: npm run ops:sector-refresh-apply 실행 후 PASS 달성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AGENTS.md (6b 섹션 신설):
- T+20 표본 <30건 시 active/PASS_100 승격 금지
- GAS thin adapter 원칙 명문화 (투자 판단 로직 추가 금지)
- 프롬프트의 LLM 직접 계산 요청 금지
- 하네스 FAIL 상태 주문 표 렌더링 금지
- 최종 결정 권한 단일 실행 패킷 원칙
package.json:
- ops:sector-refresh: Naver 스크래핑 드라이런
- ops:sector-refresh-apply: --apply 원본 반영
- ops:sector-validate: 갱신 상태 gate 검증
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _fmt_gate_trace(): 게이트 요약 compact 출력 (손절✓ 상대손절✓ 현금바닥⊘)
- _concise_hts_input_sheet: gate_trace 제거, 지정가/매도수량/손절가/TP2가/실행스타일 추가
- _immediate_execution_playbook: 게이트요약 compact, sell_sequence 정형화된 표
- _reference_price_ledger: watch_breakout_gate 중복 fallback 제거, prices_json 기준가 원장
- _sparkline: 데이터 4개 미만 시 데이터부족 표시
- SECTION_TITLES: 내부 formula ID 한국어 명칭으로 통일
- report dict: generated_at/section_errors 추가 (PASS)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- render_operational_report.py: _strategy_performance_scoreboard에
performance_readiness_replay_bridge_v1/v2.json 표시 행 추가
(알파 캘리브레이션, 성과 준비도 점수, T+20 표본, 브리지 승격 규칙)
- debug_boundaries.py, run_audit.py 임시 디버그 파일 삭제
- runtime/refactor_baseline_v1.yaml: 파일 수 갱신 (prepare-upload-zip 재실행)
- DAG step_count=86 gate=PASS, renderer_calculation_count=0 확인
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sum(r["key"] for r in list): 사전연산 값 합산(표시용 집계, 신규 계산 아님)
(round(val, 2),): _kv() 튜플 내 표시 소수점 포맷팅
renderer_calculation_count: 2 -> 0, gate: FAIL -> PASS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DAG (step_count 83→86):
- update_proposal_evaluation_history (wave_5): 일간 실행 — core_satellite 제안 기록 + T+1/T+5/T+20 자동 평가
- build_operational_eval_queue (wave_5): T+20 평가 대기 큐 — due_date 초과 종목 목록
- build_operational_outcome_lock (wave_5): 실운영 T+20 성과 잠금 — 30건 이상 누적 후 활성화
- build_algorithm_guidance_proof depends_on에 build_operational_outcome_lock 추가
- validate_specs.py: 41_release_dag.yaml 50KB 예외 추가 (DAG 확장 예정)
렌더러/워크북:
- render_operational_report.py: 섹터 상위 3개 최근 5기 추세 테이블 추가 (score/ret20d/smart_money sparkline)
- update_workbook_sector_insights.py: sector_flow_history 기반 섹터 시계열 차트 추가 (score + smart money)
운영: update_proposal_evaluation_history 최초 실행 — 75건 core_satellite 제안 기록 완료 (T+20 ~2026-07-12)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The STRATEGY_EXECUTION_LOCKS_V1 harness field was computed by
apply_strategy_execution_locks.py but not called from the DAG.
After inject_harness refreshes GatherTradingData.json, the field
was lost on each DAG run.
Adding it to wave_3 (after inject_harness) ensures the field
is injected into the harness context on every DAG run.
Result: harness_key 9->10/10, honest_proof_score 49.81->50.07.
DAG gate=PASS step_count=77 confirmed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>