diff --git a/docs/batches/index.md b/docs/batches/index.md index b34d470..33dfce5 100644 --- a/docs/batches/index.md +++ b/docs/batches/index.md @@ -54,7 +54,7 @@ | BAT-044 | standard | released | REQ-083, REQ-070 (CHG-20260616-01) | dcy-030 (issue #28) | [bat-044](./bat-044_20260616_slippage-tick-size-snapping/) | | BAT-045 | standard | released | REQ-084, REQ-085, REQ-087 | dcy-029 (issue #29, P0) | [bat-045](./bat-045_20260616_observability-logging-foundation/) | | BAT-046 | standard | released | REQ-086, REQ-088, REQ-089, REQ-090 | dcy-029 (issue #29, P1) | [bat-046](./bat-046_20260616_observability-classification-pnl-runbook/) | -| BAT-047 | standard | release-candidate | REQ-091, REQ-092, REQ-093, REQ-094 | dcy-031 | [bat-047](./bat-047_20260619_event-publisher-connection-reliability/) | -| BAT-048 | standard | in-delivery | REQ-095, REQ-096, REQ-097 | dcy-032 | [bat-048](./bat-048_20260621_fill-price-backfill-guard-logging-alert-spike/) | -| BAT-049 | standard | release-candidate | REQ-098, REQ-099, REQ-100, REQ-101 | dcy-033 | [bat-049](./bat-049_20260621_alarm-system-dcy-033/) | +| BAT-047 | standard | released | REQ-091, REQ-092, REQ-093, REQ-094 | dcy-031 | [bat-047](./bat-047_20260619_event-publisher-connection-reliability/) | +| BAT-048 | standard | released | REQ-095, REQ-096, REQ-097 | dcy-032 | [bat-048](./bat-048_20260621_fill-price-backfill-guard-logging-alert-spike/) | +| BAT-049 | standard | released | REQ-098, REQ-099, REQ-100, REQ-101 | dcy-033 | [bat-049](./bat-049_20260621_alarm-system-dcy-033/) | | BAT-050 | standard | in-delivery | REQ-102, REQ-103, REQ-104, REQ-107, REQ-108 | dcy-034 (core-A) | [bat-050](./bat-050_20260626_reconcile-warning-blocking-gate-core-a/) | diff --git a/docs/releases/index.md b/docs/releases/index.md index ea5241b..73aa141 100644 --- a/docs/releases/index.md +++ b/docs/releases/index.md @@ -16,4 +16,4 @@ | REL-006 | app-service | feedback-captured | BAT-026, BAT-027, BAT-028, BAT-029, BAT-030, BAT-031, BAT-032, BAT-033, BAT-034, BAT-035, BAT-036 | dcy-020 (자산 중심 영구 슬롯 α~δ cutover) + dcy-021 (포지션 사이징/issue #1·#5) + dcy-022 (실행 정책/issue #21) + dcy-023 (allocated_capital 제거/issue #22) + dcy-024 (safety_sell_enabled/issue #15) + dcy-025 (slots.req 교체·REQ-028 Deprecated) + REQ-048·010 CHG (config-dir) + REQ-032 CHG (enter --qty/issue #23) — 통합 릴리즈 | [rel-006](rel-006_20260611_asset-centric-sizing-execution-policy.md) | | REL-007 | app-service | feedback-captured | BAT-037, BAT-038, BAT-039, BAT-040, BAT-041 | dcy-025 (REQ-073 CHG — available_slots hint) + dcy-026/issue #24 (매도세 정정) + issue #4 (paper seq Redis) + issue #25 (slots RPC DB 필터) + dcy-027/issue #20 (중장기 인스턴스 프로파일) — 통합 릴리즈 | [rel-007](rel-007_20260612_slots-rpc-fee-paper-longterm.md) | | REL-008 | app-service | feedback-captured | BAT-042, BAT-043, BAT-044, BAT-045, BAT-046 | dcy-028/issue #26 (slot strategy-state) + issue #27 (sell retryable) + dcy-030/issue #28 (호가단위 스냅, P0 체결 복구) + dcy-029/issue #29 (운영 관측성 — 구조화 로깅·주문결과·거부ERROR·reason+actor·PnL CLI·런북) — 통합 릴리즈 | [rel-008](rel-008_20260616_tick-snap-and-observability.md) | -| REL-009 | app-service | confirmed | BAT-047, BAT-048, BAT-049 | dcy-031/OPS-005 (이벤트 발행 신뢰성 — idle keepalive·재시도·DLQ 경보) + dcy-032 (체결가 0/None 백필 가드·WARN 로깅) + dcy-033 (알람 emitter + trex.alerts exchange 1단계) + dcy-017 후속(무데이터/죽은 종목 위생 런북 docs-only) — M2 통합 릴리즈 | [rel-009](rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md) | +| REL-009 | app-service | feedback-captured | BAT-047, BAT-048, BAT-049 | dcy-031/OPS-005 (이벤트 발행 신뢰성 — idle keepalive·재시도·DLQ 경보) + dcy-032 (체결가 0/None 백필 가드·WARN 로깅) + dcy-033 (알람 emitter + trex.alerts exchange 1단계) + dcy-017 후속(무데이터/죽은 종목 위생 런북 docs-only) — M2 통합 릴리즈. 환류: OPS-005 해소 확인, slot_filled NO_ROUTE/DLQ 신규 발견(M3 Discovery 입력) | [rel-009](rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md) | diff --git a/docs/releases/rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md b/docs/releases/rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md index 4c28ae3..2b06d6b 100644 --- a/docs/releases/rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md +++ b/docs/releases/rel-009_20260625_event-reliability-fill-guard-alarm-runbook.md @@ -115,15 +115,15 @@ ### Deployment Facts - Executed At: - - (배포 예정 — 2026-06-26 또는 사장님 결재 후 지정 윈도우) + - 2026-06-25 - Completed At: - - (미정) + - 2026-06-25 PASS (34700f3 on 5bdd720, PID 849009) - Environment: - 운영 (`/root/release` 또는 해당 경로, instance_key=`trex-admin-daily-trading`, 실거래 KIS 계좌 91254), bare .venv - Operator: - - (배포 담당자) + - 사장님 - Revision or Artifact: - - `9e35467`(REL-008 M1 현재 프로덕션) → **`5bdd720`(REL-009 HEAD)**. + - `9e35467`(REL-008 M1 현재 프로덕션) → **`34700f3` on `5bdd720`(REL-009 배포본)**. - BAT-047: `d182464`, BAT-048: `f1b649c`, BAT-049: `d4c5fcb`, dcy-017 런북: `5bdd720`. - Commands or Procedure: - `git pull` (또는 체크아웃 `5bdd720`) → `pip install -e .` (의존성 변경 시) → `trex-core-daemon` 재시작. @@ -135,42 +135,50 @@ - Health Endpoint: - N/A (데몬은 HTTP 표면 없음). "ready" = 워커 스레드 + RabbitMQ 토폴로지 선언(`trex.alerts` 포함) 완료, 로그 ERROR/Traceback 0. - Startup Log Fields: - - (배포 후 기재) ISO8601(KST)+레벨 prefix, `declare_topology` 완료 로그, `trex.alerts` exchange 선언 확인, ERROR/CRITICAL/Traceback 0. + - PASS. `declare_topology` 완료 로그, `trex.alerts` exchange 선언 확인(AMQP 5연결 정상), ERROR/CRITICAL/Traceback 0. - Request Log Fields: - - (배포 후 기재) 이벤트 발행 `event=slot_entered|slot_filled` 로그, keepalive 틱 정상, OPS-005 ConnectionReset 무재발. + - PASS. `slot_filled` 이벤트 정상 발행 확인. OPS-005 ConnectionReset 무재발 확인. 12:02 sell_filled 집행 정상. - Smoke or Manual Verification: - - (배포 후 기재) idle 60초 후 첫 이벤트 유실 없음 확인, 알람 e2e(CRITICAL → trex-notifier → 텔레그램) 확인, `trex-core report` 정상. + - PASS. idle keepalive 동작, `slot_filled` 이벤트 발행 경로 정상. `trex.alerts` exchange 선언 5연결 확인. ### Rollback Outcome - Rollback Required: - - (배포 후 기재) + - No - Rollback Trigger: - - (배포 후 기재, 없으면 none) + - none - Rollback Action: - - (배포 후 기재, 없으면 none) + - none ### Release Decision Evidence - Released Decision: - - (배포 후 기재) + - released - Rationale: - - (배포 후 기재) + - 2026-06-25 배포 PASS. 2026-06-26 첫 거래일 OPS-005(RabbitMQ ConnectionReset) 무재발(0건) 확인. slot_filled 이벤트 정상 발행. 12:02 sell_filled 집행 정상. AMQP 5연결 정상. 롤백 없음. - Recorded By: - - (배포 후 기재) + - 팀장 - Recorded At: - - (배포 후 기재) + - 2026-06-26 ## Feedback Handoff +### M2 배포 + 첫 거래일 환류 (2026-06-26) + - Observation Summary: - - (배포 후 기재) + - **배포**: 2026-06-25 PASS (34700f3 on 5bdd720, PID 849009). trex.alerts 선언, AMQP 5연결 정상. + - **첫 거래일 검증**: OPS-005(RabbitMQ ConnectionReset) 무재발(0건) — 해소 확인. slot_filled 이벤트 정상 발행. 12:02 sell_filled 집행 정상. + - **신규 발견**: slot_filled 이벤트 NO_ROUTE → DLQ 유입 확인. 라우팅키 `slot_filled_*._.{symbol}`(strategy_id 자리 `_`). 원인: `_emit_event`(execution.py:345/398)가 자산중심 슬롯(dcy-020, portfolio_id 단위, strategy_id 미보유) 기반 발행 → orb/tsl의 `trex.events.strategy.{strategy_id}` 바인딩과 불일치. 체결이벤트 채널(REQ-003) 미전달(전략은 slots RPC 폴링 주력이라 비치명적이나 채널 깨짐+DLQ 누적). + - Discovery Input: + - **★ slot_filled NO_ROUTE / fill→strategy 라우팅 재설계** (trex-core/P1/M3): 자산중심 모델에서 fill 이벤트를 strategy 바인딩으로 전달하는 라우팅 매핑이 없음. `_emit_event`의 라우팅키 생성 로직이 strategy_id를 참조하지 않아 orb/tsl의 `trex.events.strategy.{strategy_id}` 바인딩과 불일치 → NO_ROUTE → DLQ 누적. 자산중심 슬롯(portfolio_id 단위)에서 fill→strategy 라우팅 재설계 필요. 보드 등록됨. **교차 영향 사안**: wire 계약(exchange/라우팅키/바인딩) 변경 — 팀장 검토 후 Discovery 개시 필요. - **이벤트 발행 영속 outbox**: BAT-047 Out of Scope으로 이월됨(M3 후보). at-least-once 중복 이벤트 소비자 멱등성도 함께 추적. - **실 broker 통합 CI**: half-open/idle 60초/broker 재시작 시나리오는 현재 mock unit으로만 검증. `TREX_RABBITMQ_TEST_URL` 포함 통합 환경 구성(M3 후보). - **INFO·WARN 알람 code 배선**: CRITICAL 8종 이후 후속 범위(dcy-033 범위 경계 밖, M3 후보). + - REQ Input: - none + - Change Request Input: - none