# BAT-012 Verification - Status: verified - Batch: BAT-012 ## Acceptance Mapping > 구현 완료. evidence: 신규 단위 26 + PG 게이트(killswitch store 5) + e2e. 파일: test_control_dispatch.py(9), test_killswitch_execution.py(6), test_killswitch_masking_resume.py(6+1), test_killswitch_store.py(in-mem 5 + PG 5). ### REQ-043 (제어 채널 + action dispatch) | AC | Evidence (예정) | |----|---------| | AC-1: pause 회귀 | control dispatch 단위(pause) | | AC-2: resume/list 회귀 | 동일 | | AC-3: kill_switch 라우팅 | 동일 | | AC-4: resume_kill_switch 라우팅 | 동일 | | AC-5: unknown action error | 동일 | | AC-6: 워커 스레드 7 불변 | daemon 구조 검사/test_daemon | ### REQ-044 (day-scoped 제외 store + 마이그레이션) | AC | Evidence (예정) | |----|---------| | AC-1: 테이블 스키마 | 마이그레이션 + PG 게이트 | | AC-2: 마이그레이션 멱등 | 005 IF NOT EXISTS + 재적용 | | AC-3: exclude→list_excluded | store 단위 | | AC-4: day-scoped 자동 제외 | list_excluded(D+1) | | AC-5: 멱등 exclude | store 단위 | | AC-6: clear | store 단위 | | AC-7: 전역 sentinel | store 단위 | ### REQ-045 (kill_switch 실행) | AC | Evidence (예정) | |----|---------| | AC-1: 전역 전체 청산 | killswitch 실행 단위 | | AC-2: portfolio 범위 한정 | 동일 | | AC-3: pending_sell idempotency | 동일 | | AC-4: portfolio_id 누락 error | 동일 | | AC-5: 당일 제외 표시 | 044 store 연동 | | AC-6: 이력 로깅 | 로그 캡처 | | AC-7: dcy-007 독립 | 동일 | | AC-8: 지연 N×100ms+5s | 측정/코드 검사 | ### REQ-046 (masking + 자동복귀 + resume) | AC | Evidence (예정) | |----|---------| | AC-1: portfolio masking | masking 단위 | | AC-2: 전역 masking | 동일 | | AC-3: 추가매수 거부 | buyable masking | | AC-4: 다음 거래일 자동복귀 | 날짜 mock | | AC-5: 재시작 영속 masking | 통합/날짜 mock | | AC-6: resume_kill_switch | resume 단위 | | AC-7: portfolio_id 누락 error | 동일 | | AC-8: 청산 슬롯 비가역 | 상태 불변 확인 | ### REQ-047 (baseline 정합) | AC | Evidence (예정) | |----|---------| | AC-1: interface-contract 제어 채널+action | 문서 diff | | AC-2: interface-contract kill/resume payload | 문서 diff | | AC-3: runtime-flows 4흐름 | 문서 diff | | AC-4: project-structure control consumer + store/sql | 문서 diff | ## Evidence - Test: - 신규 단위 26 + PG 게이트 killswitch store 5 green. (control dispatch 9 / 실행 6 / masking·resume 7 / store in-mem 5 / store PG 5) - 단위 전체 회귀: `262 passed / 28 skipped`(`::test_sandbox_token_and_submit` deselect). - 인프라 게이트(PG trex_core_test + RabbitMQ): `290 passed`(마이그레이션 001~005 적용 + killswitch PG round-trip 포함). - `ruff check trex_core tests` → All passed. - Manual / e2e: - paper 데몬 control RPC e2e: buy 2(pf-A/pf-B) → `{action:kill_switch, scope:global}` → `{status:ok, liquidated:2}` → 양쪽 `holding→pending_sell(emergency_stop)→closed`, `killswitch_exclusion=[('*',2026-06-07)]` → `{action:resume_kill_switch, scope:global}` → exclusion 0. PASS. - Logs: - `262 passed, 28 skipped` / `290 passed ... ~13s` / e2e `RESULT: PASS`. ## Carried-Over / e2e - BAT-010 R-2 선례(실 PG 마이그레이션 round-trip): `005` 인프라 게이트 290 passed 로 확인. - (이월, 비차단) 실 KIS LIVE kill_switch 발동 → 실매도 제출 → 상황별 에러(주말/휴장) 관찰 — safety-sell LIVE e2e 선례와 동일 접근, 차기 거래일 운영 실증. paper/mock + 290 passed 로 release gate 충족. ## Result - Ready for Release: true - Blocking Issues: - 없음. 제어 큐 rename 하위호환(R-1)은 release rollout 결정 항목(REQ-043 Notes), 실 KIS 라이브 발동은 운영 실증 이월 — 둘 다 blocker 아님.