AlarmEmitter(application, best-effort 비차단)+trex.alerts topic exchange 가산·격리+8 CRITICAL code 배선. 608 passed, opus QC PASS, 팀장 e2e(텔레그램 HTTP200) 통과. REQ-098~101 Implemented. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
3.9 KiB
3.9 KiB
BAT-049: 알람 시스템 — 알람 envelope wire 계약 + trex.alerts exchange + core CRITICAL emitter + baseline 정합 (dcy-033)
- Status: release-candidate
- Profile: standard
- Source Discovery: dcy-033
- Included REQ: REQ-098 (Interface), REQ-099 (Integration), REQ-100 (Integration), REQ-101 (Documentation)
- Excluded REQ: 없음
Summary
- dcy-033(제품군 알람 전달 체계) confirmed Discovery에서 확정된 알람 시스템 1단계 구현.
- REQ-098: 알람 envelope 표준 JSON 스키마 wire 계약을
docs/interface-contract.md에 문서화. - REQ-099:
trex.alerts(topic, durable=True) AMQP exchange를declare_topology()에 멱등 선언 추가. - REQ-100: application 레이어
AlarmEmitter+ CRITICAL code 8종 발생 지점 배선. - REQ-101:
docs/runtime-flows.md에 알람 발신 흐름 섹션 추가 + baseline 문서 정합.
Scope
- In Scope:
docs/interface-contract.md—Interface: trex.alerts (알람 채널, dcy-033)신규 섹션 추가(기존 섹션 불변)trex_core/adapters/messaging/topology.py—ALERTS_EXCHANGE상수 추가trex_core/adapters/messaging/rabbitmq.py—declare_topology()에trex.alerts선언,publish_alarm_event()메서드 추가trex_core/adapters/messaging/in_memory.py—publish_alarm_event()stub 추가trex_core/application/messaging.py—MessagingTransport프로토콜에publish_alarm_event()추가trex_core/application/alarm_emitter.py—AlarmEmitter신규 구현trex_core/application/execution.py—fill_price_unresolvable,sell_skipped_no_balance배선trex_core/application/reconciliation.py—core_holding_broker_flat배선trex_core/application/ledger_outbox.py—ledger_delivery_failed배선trex_core/application/killswitch.py—kill_switch_fired배선trex_core/adapters/broker/rabbitmq.py—publish_unavailable_after_reconnect/dlq_publish_failed배선 (콜백 패턴)trex_core/application/portfolio.py/trex_core/application/snapshot_scheduler.py—portfolio_hub_unavailable배선trex_core/runtime/reset.py—schema_verification_failed/migration_failed배선 (transport None 안전)trex_core/runtime/daemon.py—AlarmEmitter생성·주입tests/application/test_alarm_emitter.py— AlarmEmitter 단위 테스트 신규tests/adapters/messaging/test_topology.py또는test_in_memory_transport.py— declare_topology trex.alerts assertion 추가docs/runtime-flows.md— 알람 발신 흐름 섹션 추가
- Out of Scope:
- trex.events / trex.intent.req / trex.slots.req / trex.control.req 변경 — 가산·격리 불변(REQ-099 AC-2)
- 텔레그램 봇 토큰·chat_id 등 외부 알람 시크릿 — trex-notifier 담당
- INFO·WARN code 배선 — CRITICAL 우선(dcy-033 범위 경계)
- 통합/e2e(실 RabbitMQ) 테스트 — 팀장이 실인프라로 수행
Documents
- Planning: planning.md
- Design: design.md
- Implementation: implementation.md
- Verification: verification.md
Notes
- 이 batch는 신규 AMQP exchange(
trex.alerts) 추가이지만 기존 wire 계약(exchange/큐/라우팅)을 변경하지 않는 가산·격리 추가이므로 wire 계약 변경 에스컬레이션 대상이 아님. publish_unavailable_after_reconnect/dlq_publish_failed는 rabbitmq.py 어댑터에서 발생 → 콜백 패턴으로 상위에 전파. 설계 결정 details는 design.md 참조.reset.py는 transport 미연결 가능 →AlarmEmitter가Nonetransport를 안전하게 처리.- R-1(Low): trex.alerts exchange 선언 후 notifier 미연결 시 알람 발행은
mandatory=False로 silent drop — 운영상 무해. - R-2(Low): rabbitmq.py 어댑터 콜백 주입 시 생성 시점 의존성 순환 가능성 → daemon.py에서 생성 순서 주의.