# REL-007: slots RPC 개선 + 매도세 정정 + paper seq 영속화 + 중장기 인스턴스 프로파일 통합 릴리즈 - Status: feedback-captured - Profile: app-service - Included Batch: BAT-037, BAT-038, BAT-039, BAT-040, BAT-041 ## Scope - Included: - BAT-037 (dcy-025 REQ-073 CHG-20260612-01): `trex.slots.req` 응답에 `available_slots: int|null` capacity hint 추가. `max_active_slots` 미설정 시 `null`, 설정 시 `max(0, M − active)`. orb-v1 의 불필요한 intent 왕복 제거. AC-3 반전(포함), AC-6 신규. - BAT-038 (dcy-026 REQ-018 CHG-20260612-01): 매도 체결 `tax=0.0` 하드코딩 버그(issue #24) 수정. `calculate_tax(side, amount)` 신규, 수수료율(`TREX_KIS_FEE_BPS`=1.5)·세율(`TREX_KRX_TAX_SELL_BPS`=20.0) env 상수화. KIS 어댑터는 브로커 응답 fee/tax 정본 우선, 없으면 정책 폴백. - BAT-039 (issue #4 REQ-011 CHG-20260612-01): paper 브로커 order seq Redis 영속화. 재시작 시 `PAPER-000001` 재발번 → `correlation_id` 충돌 → 매도 원장 조용히 누락되는 결정성 버그 해소. optional `SeqStore` 포트(Redis INCR / in-memory 폴백), `TREX_PAPER_REDIS_URL` 설정. - BAT-040 (issue #25 REQ-002/006/073 CHG-20260612-01/02): `trex.slots.req` per-request full scan 제거. `list_slots(status_filter)` DB 레벨 `status = ANY(%s)` 필터 추가(포트 + PG 구현). watchdog 갱신 holding 조회는 응답 결과 재사용해 두 번째 커넥션 생략. RPC 계약(AC-1~6) 불변. - BAT-041 (dcy-027 REQ-076/077/078): 중장기 인스턴스 운영 토대 완성. `DaemonInstanceConfig.watchdog_timeout_sec`(TOML) per-instance timeout 노출(env 폴백), `config/longterm.example.toml` 표준 프로파일 레시피(safety_sell off·market-close 미설정·watchdog 1800s), baseline 문서(`runtime-flows.md`) 중장기 운영 흐름 + 보호 규칙 경계(전략 모듈 전적 책임 + CLI exit 백스톱) + `forced_close_at` 중장기 미사용 명시. - Excluded: - 과거 누락 원장 행 소급 보정 (BAT-038/039 공통 — 보정 안 함) - overlay(paused/warned) 서버측 필터 — 후속 - watchdog 소유권 진입 외부 알림(슬랙·이메일) — 후속 Discovery - 중장기 보호 규칙 코어 구현 — 전략 모듈 전적 책임으로 확정(dcy-027 OQ-2) ## Rollout Plan 1. 실행 중인 데몬 정지: `kill -TERM ` (정상 종료 대기, 마지막 로그 `Normal shutdown` 확인) 2. 코드 배포: `git pull` (또는 패키지 업데이트) 3. DB 스키마 변경 없음 — 마이그레이션 불필요 4. 중장기 인스턴스를 운영 중이라면 per-instance TOML 에 `watchdog_timeout_sec = 1800` 추가 (선택 — 미설정 시 기존 env 폴백 유지) 5. paper 브로커 Redis 영속화를 사용할 경우 `TREX_PAPER_REDIS_URL` 환경 변수 설정 (미설정 시 in-memory 폴백, 재시작 시 seq 리셋) 6. 데몬 재기동: `.venv/bin/trex-core-daemon --config ` 7. 기동 후 slots RPC 응답 및 로그 확인 ## Rollback Plan - 트리거 조건: 기동 실패, slots RPC 응답 이상, 브로커 체결 이상 - 롤백 절차: 1. 데몬 정지 2. `git revert` 또는 이전 커밋으로 체크아웃 후 재기동 3. DB 스키마 변경 없으므로 데이터 무손실 롤백 가능 - 주의: 과거 paper seq 가 Redis 에 저장된 경우 롤백 후 seq 연속성은 깨질 수 있으나 기능 무영향 (seq 는 execution_id 고유성 보장용) ## Verification Checklist ### 배포 전 - [ ] `pytest tests/` — 전체 통과 확인 (회귀 없음) - [ ] BAT-037~041 각 `verification.md` Status: confirmed 확인 ### 배포 후 - [ ] 데몬 기동 로그 정상 (`Normal startup`, 워커 스레드 4개, RabbitMQ 토폴로지 선언) - [ ] `trex.slots.req` 응답에 `available_slots` 필드 존재 확인 (BAT-037) - [ ] `filter=inactive` 요청 시 inactive 슬롯만 반환 확인 (BAT-040 회귀) - [ ] paper 브로커 매도 체결 후 ledger `tax > 0` 확인 (BAT-038) - [ ] paper 브로커 `TREX_PAPER_REDIS_URL` 설정 시 재시작 후 seq 연속성 확인 (BAT-039) - [ ] 중장기 TOML(`longterm.example.toml` 참고) 로 기동 시 `safety_sell_enabled=false` + `watchdog_timeout_sec` 반영 확인 (BAT-041) - [ ] 기존 당일 인스턴스 동작 무회귀 확인 ## Release Execution Evidence - Release Status Transition Target: released ### Deployment Facts - Executed At: - 2026-06-12 22:28 KST (데몬 재기동, PID 802942) - Completed At: - 2026-06-12 22:35 KST - Environment: - 로컬 운영 환경, instance_key=test, PostgreSQL + RabbitMQ (amqp://localhost:5672) - Operator: - Justin Ko - Revision or Artifact: - `d30e915b75df3b44258cac04a60ce2baad9857f1` (main, 2026-06-12) - Commands or Procedure: - 기존 데몬(PID 765497) SIGTERM 종료 → `trex-core-daemon --config test` 재기동 → RabbitMQ 토폴로지 선언 확인(ready) → slots RPC 스모크 실행 ### Profile-Specific Checks - app-service: - Health Endpoint: - RabbitMQ 토폴로지 선언 확인 — `trex.intent.req.test` + `trex.slots.req.test` 큐 수동 passive declare 성공 (2026-06-12 22:28 KST) - Startup Log Fields: - 데몬 기동 후 워커 스레드 4개 정상 기동, `trex.slots.req.test` consumer 선언, universe reconcile 슬롯 23개 확인 - Request Log Fields: - slots RPC `{filter: "all"}` 요청 → 응답 키 `['available_slots', 'degraded', 'message', 'reason', 'slots']` 정상 (available_slots=5, degraded=False, slots 23개) - Smoke or Manual Verification: - BAT-037: `available_slots=5` 응답 포함 확인 (max_active_slots=5, active=0 → 5) ✓ - BAT-040: `filter=all` 응답 23개 슬롯, DB-level 필터 경로 정상 동작 확인 ✓ - 데몬 로그 ERROR/CRITICAL 없음 ✓ - BAT-038/039/041: 구조 변경(fee 정책·paper seq·TOML config) — 기동 경로 정상, 단위 테스트 confirmed evidence 유효 ### Rollback Outcome - Rollback Required: - no - Rollback Trigger: - none - Rollback Action: - none ### Release Decision Evidence - Released Decision: - yes - Rationale: - BAT-037~041 전체 verification confirmed (단위·통합 테스트 통과, smoke 근거 기록). DB 스키마 변경 없어 롤백 비용 낮음. slots RPC 응답 키·available_slots 값·슬롯 수 스모크 통과. 운영 중 데몬 정상 동작 확인. 비파괴적 additive 변경(fee/tax 정책·paper seq·TOML 필드·baseline 문서) 중심으로 회귀 위험 낮음. - Recorded By: - Justin Ko - Recorded At: - 2026-06-12 22:35 KST ## Feedback Handoff - Observation Summary: - (2026-06-16 13:10 KST, 배포 에이전트) REL-007이 운영 인스턴스 `trex-admin-daily-trading`(실거래 KIS 91254)에 반영됨을 실환경 검증. 현 HEAD `1f59322`가 REL-007 커밋 `d30e915`를 조상 포함(`git merge-base --is-ancestor`=YES), 데몬 PID 1778 약 2일 무중단, DB 스키마 변경 없음. - **BAT-038(매도세 정정) 라이브 결정적 검증**: 2026-06-15 064400 매도 체결(`ledger_outbox`) 4주@97,200=388,800 KRW → tax 777.60 = **20.0bps**(=`TREX_KRX_TAX_SELL_BPS`), fee 58.32 = **1.5bps**(=`TREX_KIS_FEE_BPS`). 수정 전 `tax=0.0` 자리에 세금 정확 반영 → 실현 PnL 과대계상 버그 해소 확정. - BAT-037/040(slots RPC) 라이브 정상: `--json` 응답·`watchdog{expired,last_seen}` 구조·`available_slots` 힌트(orb-v1 소비)·`filter=inactive` 정상. - 본 실거래 당일매매 인스턴스에 BAT-039(paper seq)·BAT-041(중장기)는 N/A(기능 무영향). - Discovery Input: - watchdog 소유권 진입 시 외부 알림(슬랙·이메일·웹훅) — dcy-027 OQ-3 후속 Discovery 명시 (※ dcy-029 OQ-3 알림 전송 채널 Deferred와 합류 후보) - 전략↔자산 할당 모델(다중 전략 per-instance, strategy 필드 복원) — dcy-025 Out of Scope 이월 - **(2026-06-16 라이브 테스트 환류) 호가단위 주문 거부(P0)**: `slippage_pct` 한계가가 KRX 호가단위 미스냅으로 KIS 거부(issue #28) → **dcy-030 생성·confirmed, REQ-083/070(BAT-044) Implemented**로 처리 완료. - **(2026-06-16 라이브 테스트 환류) 운영 관측성 부족**: 주문 거부가 로그에 없고 타임스탬프 부재로 진단 지연(issue #29) → **dcy-029 생성·confirmed, REQ-084~090(BAT-045/046) Implemented**로 처리 완료. - REQ Input: - none (라이브 환류는 위 dcy-030/dcy-029로 정규화되어 REQ-083/070/084~090로 이미 처리) - Change Request Input: - none (REQ-070 호가단위 정정은 dcy-030 CHG-20260616-01로 처리 완료)