diff --git a/apps/api/src/services/auto_repair_service.py b/apps/api/src/services/auto_repair_service.py index 4e3cce8f8..771e2bfbb 100644 --- a/apps/api/src/services/auto_repair_service.py +++ b/apps/api/src/services/auto_repair_service.py @@ -134,15 +134,13 @@ class AutoRepairService: """ # === 安全邊界常數 === - MAX_AUTO_REPAIR_RISK = RiskLevel.MEDIUM # 最高允許自動修復的風險等級 - MAX_AUTO_REPAIR_SEVERITY = Severity.P2 # 最高允許自動修復的嚴重度 - MIN_SIMILARITY_SCORE = 0.7 # 最低相似度門檻 - - # 2026-04-07 Claude Code: 首次信任機制 — 打破冷啟動雞生蛋問題 - # 條件: APPROVED + 全部步驟 risk=LOW + 執行次數 < 3 - # 每日最多 5 次首次信任自動修復,防止失控 - COLD_START_TRUST_MAX_EXECUTIONS = 3 # 累積幾次後回歸正常門檻 - COLD_START_TRUST_DAILY_LIMIT = 5 # 每日首次信任上限 + # 2026-04-07 Claude Code: 統帥指令「直接全部跳成自動修復」 + # 移除相似度/品質/風險門檻,只保留 P0/P1 嚴重度阻擋 + MAX_AUTO_REPAIR_RISK = RiskLevel.MEDIUM # 保留供日後參考,不再用於阻擋 + MAX_AUTO_REPAIR_SEVERITY = Severity.P2 # P0/P1 仍需人工審核 + MIN_SIMILARITY_SCORE = 0.0 # 🔴 已取消門檻 + COLD_START_TRUST_MAX_EXECUTIONS = 3 # 保留供參考 + COLD_START_TRUST_DAILY_LIMIT = 5 # 保留供參考 def __init__( self, @@ -255,69 +253,22 @@ class AutoRepairService: # 4. 檢查最佳匹配 best_match = recommendations[0] - # 相似度檢查 - if best_match.similarity_score < self.MIN_SIMILARITY_SCORE: - return AutoRepairDecision( - can_auto_repair=False, - playbook=best_match.playbook, - reason=f"相似度 {best_match.similarity_score:.0%} 低於門檻 {self.MIN_SIMILARITY_SCORE:.0%}", - blocked_by="LOW_SIMILARITY", - ) - - # 高品質檢查 + 首次信任機制 - # 2026-04-07 Claude Code: 方案 C — 打破冷啟動雞生蛋問題 + # 2026-04-07 Claude Code: 統帥指令「直接全部跳成自動修復」 + # 移除: 相似度門檻、is_high_quality 門檻、冷啟動機制、風險等級門檻 + # 只要有匹配 Playbook 且 APPROVED,直接執行 max_risk = self._get_max_risk_level(best_match.playbook) - _is_cold_start = False # Sprint 4 B2: 預設非冷啟動 + _is_cold_start = False - if not best_match.playbook.is_high_quality: - # 首次信任: APPROVED + 全步驟 LOW risk + 執行次數 < N - cold_start_eligible = ( - best_match.playbook.status == PlaybookStatus.APPROVED - and max_risk == RiskLevel.LOW - and best_match.playbook.total_executions < self.COLD_START_TRUST_MAX_EXECUTIONS - ) - - if cold_start_eligible: - # 檢查每日首次信任上限 - daily_ok = await self._check_cold_start_daily_limit() - if daily_ok: - logger.info( - "auto_repair_cold_start_trust", - incident_id=incident.incident_id, - playbook_id=best_match.playbook.playbook_id, - playbook_name=best_match.playbook.name, - total_executions=best_match.playbook.total_executions, - max_risk=max_risk.value, - ) - _is_cold_start = True # Sprint 4 B2: 標記冷啟動 - # 跳過 is_high_quality 門檻,直接進入風險檢查 - else: - return AutoRepairDecision( - can_auto_repair=False, - playbook=best_match.playbook, - reason=f"首次信任每日上限已達 {self.COLD_START_TRUST_DAILY_LIMIT} 次", - blocked_by="COLD_START_DAILY_LIMIT", - ) - else: - return AutoRepairDecision( - can_auto_repair=False, - playbook=best_match.playbook, - reason=f"Playbook 尚未達到高品質標準 (成功率: {best_match.playbook.success_rate:.0%}, 執行次數: {best_match.playbook.total_executions})", - blocked_by="NOT_HIGH_QUALITY", - ) - - # 5. 檢查動作風險等級 - - if self._risk_exceeds_threshold(max_risk): + # 只保留: Playbook 必須是 APPROVED 狀態 + if best_match.playbook.status != PlaybookStatus.APPROVED: return AutoRepairDecision( can_auto_repair=False, playbook=best_match.playbook, - reason=f"Playbook 包含 {max_risk.value} 風險動作,需要人工審核", - risk_level=max_risk, - blocked_by="HIGH_RISK", + reason=f"Playbook 狀態為 {best_match.playbook.status.value},必須是 APPROVED", + blocked_by="NOT_APPROVED", ) - # 6. 可以自動修復 + # 5. 可以自動修復 logger.info( "auto_repair_approved", incident_id=incident.incident_id, @@ -367,14 +318,8 @@ class AutoRepairService: try: # 執行每個步驟 for step in playbook.repair_steps: - # 安全檢查: 跳過高風險步驟 - if self._risk_exceeds_threshold(step.risk_level): - logger.warning( - "auto_repair_skip_high_risk_step", - step_number=step.step_number, - risk_level=step.risk_level.value, - ) - continue + # 2026-04-07 Claude Code: 統帥指令「直接全部跳成自動修復」 + # 移除 step-level 風險門檻,所有步驟直接執行 # 執行步驟 step_result = await self._execute_step(incident, step)