Skip to content

Commit 4170fd1

Browse files
authored
Merge pull request #450 from easygap/fix/idle-state-verdict
fix: 승격 대기 상태를 헬스 경보에서 라벨로 강등 — 도달 불가능하던 OK 판정 복구
2 parents de6efe2 + c4da8bf commit 4170fd1

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

core/operator_health.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
알파 없음이 정착 결론인 체제에서는 상시 NO-GO가 정상이므로 전체 verdict에 합산하지
1515
않는다(헤드라인의 게이트 라벨로 보고; 매일 빨강이면 진짜 장애를 못 알아본다):
1616
- BLOCKED : frozen 전략 존재, 또는 바스켓 운영 차단 수준 이상.
17-
- ATTENTION: degraded/blocked_insufficient_evidence 전략, manual freeze, 최근 anomaly,
17+
- ATTENTION: degraded 전략, manual freeze, 최근 anomaly,
1818
바스켓 스냅샷 끊김, 또는 게이트 artifact의 '장애성' 신호(부재/stale/표기 불일치).
19-
- OK : 위 어느 것에도 안 걸림. (게이트 NO-GO 여부와 무관)
19+
- OK : 위 어느 것에도 안 걸림. (게이트 NO-GO 여부와 무관.
20+
blocked_insufficient_evidence도 같은 이유로 라벨만 남기고 합산하지 않는다)
2021
"""
2122

2223
from __future__ import annotations
@@ -28,7 +29,12 @@
2829

2930
# runtime state별 분류
3031
_BLOCKING_STATES = {"frozen"}
31-
_ATTENTION_STATES = {"degraded", "blocked_insufficient_evidence"}
32+
_ATTENTION_STATES = {"degraded"}
33+
# 승격 파이프라인 대기 상태 — 장애가 아니라 '증거 축적 전'이라는 단계 표시다.
34+
# 알파 부재가 정착 결론인 현 체제에서 연구 전략들은 이 상태가 상시 정상이므로,
35+
# verdict를 올리면 헬스가 영원히 ATTENTION이 되어 진짜 장애를 못 알아보게 된다
36+
# (게이트 NO-GO를 라벨로 강등한 것과 같은 원칙). 노트로는 계속 표시한다.
37+
_EXPECTED_IDLE_STATES = {"blocked_insufficient_evidence"}
3238

3339

3440
def _worst(*verdicts: str) -> str:
@@ -62,6 +68,8 @@ def summarize_runtime_state(state: Any) -> dict[str, Any]:
6268
notes.append(f"state={s}")
6369
elif s in _ATTENTION_STATES:
6470
notes.append(f"state={s}")
71+
elif s in _EXPECTED_IDLE_STATES:
72+
notes.append(f"state={s} (승격 대기 — 정상)")
6573
if manual_freeze:
6674
notes.append("manual_freeze")
6775
if anomalies:

tests/test_operator_health.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,23 @@ def test_degraded_is_attention(self):
3434
out = summarize_runtime_state(_state("scoring", "degraded"))
3535
assert out["verdict"] == "ATTENTION"
3636

37-
def test_blocked_insufficient_evidence_is_attention(self):
37+
def test_blocked_insufficient_evidence_is_expected_idle_ok(self):
38+
# 승격 파이프라인 대기 = 단계 표시지 장애가 아니다 — verdict를 올리면 헬스가
39+
# 영원히 ATTENTION이 되어 진짜 장애를 못 알아본다(게이트 NO-GO 강등과 동일 원칙).
3840
out = summarize_runtime_state(_state("rotation", "blocked_insufficient_evidence"))
39-
assert out["verdict"] == "ATTENTION"
41+
assert out["verdict"] == "OK"
42+
assert any("승격 대기" in n for n in out["notes"]) # 라벨로는 계속 표시
43+
44+
def test_idle_state_with_freeze_or_anomaly_still_alarms(self):
45+
# 대기 상태여도 수동 동결·이상 징후는 실제 개입 신호 — 경보 유지
46+
frozen = summarize_runtime_state(
47+
_state("rotation", "blocked_insufficient_evidence", manual_freeze=True)
48+
)
49+
assert frozen["verdict"] == "ATTENTION"
50+
anom = summarize_runtime_state(
51+
_state("rotation", "blocked_insufficient_evidence", anomalies=["x"])
52+
)
53+
assert anom["verdict"] == "ATTENTION"
4054

4155
def test_manual_freeze_on_normal_is_attention(self):
4256
out = summarize_runtime_state(_state("scoring", "normal", manual_freeze=True))

0 commit comments

Comments
 (0)