[BE-22] 리스크 단계 전환 이력 기록

이 티켓은 BE-25 로 흡수됐습니다 — 스키마는 DB-02, 기록 로직은 BE-25 가 소유합니다. 이 파일은 이력 보존용이며 착수 대상이 아닙니다.

작업 내용 (설계 의도)

변경 사항

PRD FR-38은 “단계 전환 이력을 기록한다”를 요구하는데, 현재 스키마는 auto_trading_policies.tier_changed_at 한 컬럼뿐이라 최종 변경 시각만 남는다(wave 3 리뷰에서 발견). 승급·강등이 반복되면 이전 기록이 덮어써진다.

이력이 필요한 이유는 사다리 자체가 검증 대상이기 때문이다. “T2에서 강등된 뒤 다시 승급했는데 또 강등됐다”는 패턴은 사다리 기준이 잘못됐다는 신호인데, 최종 시각만으로는 그 패턴이 보이지 않는다. 승급 판정이 운영 지표 기반이므로(수익률이 아님) 그 지표가 실제로 좋은 예측자인지 사후에 평가하려면 전환 시점과 그때의 지표가 함께 남아야 한다.

risk_tier_transitions 테이블을 만들고 전환마다 이전 단계·다음 단계·사유·판정 시점 지표를 남긴다.

무중단 배포: 신규 테이블 추가는 기존 코드에 영향이 없다. tier_changed_at제거하지 않는다 — 현재 코드가 읽고 있고, 이력 테이블과 중복이지만 제거는 별도 단계다(expand-contract).

롤백: 역방향 DDL로 테이블 제거. 아무도 읽지 않는 시점에 되돌리기가 안전하다.

의존

  • BE-12 (단계 평가 도메인 서비스)

다이어그램

처리 흐름

sequenceDiagram
    participant Tier as RiskTierPromotionDomainService
    participant Policy as AutoTradingPolicy
    participant Hist as RiskTierTransitionRepository
    Tier->>Policy: demoteTier()
    Tier->>Hist: save(T2 to T1, MAX_DRAWDOWN, 지표)

클래스 의존

flowchart LR
    Tier[RiskTierPromotionDomainService] --> Repo[RiskTierTransitionRepository]
    Repo -.->|implements| Impl[RiskTierTransitionRepositoryImpl]
    Impl --> Table[(risk_tier_transitions)]

테스트 케이스

  • 강등 시 이전 단계·다음 단계·사유가 이력에 남는다.
  • 승급 확정 시에도 이력이 남는다(판정만 한 시점은 남기지 않는다).
  • 판정 시점의 운영 지표가 함께 보존된다.
  • 같은 단계로의 전환(T1에서 MDD 경고)은 이력을 만들지 않는다.
  • 이력 조회가 시간 역순으로 반환된다.
  • 마이그레이션 적용 후 tier_changed_at이 그대로 유지된다(하위 호환, TestContainers MySQL).