feat: add kill-switch control flow
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
# 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 아님.
|
||||
Reference in New Issue
Block a user