diff --git a/apps/api/src/services/decision_manager.py b/apps/api/src/services/decision_manager.py index c5187065..10a4edc9 100644 --- a/apps/api/src/services/decision_manager.py +++ b/apps/api/src/services/decision_manager.py @@ -679,14 +679,16 @@ class DecisionManager: action = _re.sub(r"<[^>]+>", _target, action) # 安全守衛: 替換後仍含 "unknown" 或未替換的 <...>/{...} → 拒絕執行 - # 主機層告警(HostHighCpuLoad 等)沒有 deployment 名稱,不應盲目執行 - if "unknown" in action or _re.search(r"[<{][^>}]+[>}]", action): + # 另外:若 target 等於 alertname,代表 LLM 把告警名稱填入 deployment_name,也拒絕 + _alertname = incident.signals[0].labels.get("alertname", "") if incident.signals else "" + _target_is_alertname = bool(_alertname and _target == _alertname) + if "unknown" in action or _re.search(r"[<{][^>}]+[>}]", action) or _target_is_alertname: logger.warning( "auto_execute_blocked_unresolved_placeholder", incident_id=incident.incident_id, action=action, target=_target, - reason="action 含未解析的 placeholder 或 unknown,拒絕執行", + reason="action 含未解析的 placeholder、unknown、或 target==alertname,拒絕執行", ) token.state = DecisionState.ERROR token.error = f"Auto-execute blocked: unresolved placeholder in action: {action[:80]}"