namespace Domain.Entities.Members; /// /// 예측 트랙레코드 배지 등급 (D2 M4 예측 채점+트랙레코드, d2 §③). /// 채점된 표본(Hits+Misses)이 미만이면 무배지(None). /// 그 이상은 적중률(HitRate %) 구간으로 브론즈/실버/골드, 최상위는 황금개미(GoldAnt). /// public enum TrackRecordTier : byte { /// 무배지 — 표본 부족(< 10) 또는 적중률 50% 미만 None = 0, /// 브론즈 — 적중률 50% 이상 Bronze = 1, /// 실버 — 적중률 60% 이상 Silver = 2, /// 골드 — 적중률 70% 이상 Gold = 3, /// 황금개미 — 적중률 80% 이상 + 표본 30 이상 (고신뢰 상위 배지) GoldAnt = 4 } /// /// 트랙레코드 등급 임계값 (d2 §③ — 50/60/70% = 브론즈/실버/골드). /// 황금개미는 d2 가 수치를 열어둔 항목으로, 소표본 어뷰징을 막기 위해 적중률 80% + 표본 30 이상을 채택한다. /// public static class TrackRecordTiers { /// 배지 부여 최소 채점 표본 (Hits+Misses). 미만이면 항상 None (d2 §③ 표본 10+ 게이트). public const int MinSample = 10; /// 브론즈 임계 적중률 (%) public const decimal BronzeHitRate = 50m; /// 실버 임계 적중률 (%) public const decimal SilverHitRate = 60m; /// 골드 임계 적중률 (%) public const decimal GoldHitRate = 70m; /// 황금개미 임계 적중률 (%) public const decimal GoldAntHitRate = 80m; /// 황금개미 임계 표본 (Hits+Misses) — 소표본 고승률 어뷰징 차단 public const int GoldAntMinSample = 30; /// 표본(sample=Hits+Misses)과 적중률(%)로 등급 산정. public static TrackRecordTier Resolve(int sample, decimal hitRate) { if (sample < MinSample) { return TrackRecordTier.None; } if (hitRate >= GoldAntHitRate && sample >= GoldAntMinSample) { return TrackRecordTier.GoldAnt; } if (hitRate >= GoldHitRate) { return TrackRecordTier.Gold; } if (hitRate >= SilverHitRate) { return TrackRecordTier.Silver; } if (hitRate >= BronzeHitRate) { return TrackRecordTier.Bronze; } return TrackRecordTier.None; } }