feat(auto-repair): 移除所有阻擋門檻 — 直接全部跳成自動修復
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 1m38s
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 1m38s
統帥指令: 所有 APPROVED Playbook 直接執行,不再檢查: - 相似度門檻 (MIN_SIMILARITY_SCORE 0.7 → 0.0) - is_high_quality 品質門檻 - 冷啟動信任機制 - 動作風險等級門檻 (evaluate + execute 兩層) 保留: P0/P1 嚴重度人工審核、全域冷卻熔斷、APPROVED 狀態檢查 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user