feat(Phase 3): 學習閉環重建 — 三根因修復 + 2x EWMA + Evolver Agent
ADR-083 Phase 3 學習閉環重建: **三根因修復** - approval_execution.py: fire-and-forget create_task → await asyncio.wait_for(timeout=30) × 2 (成功路徑 L265 + 失敗路徑 L353,超時記錄 learning_trigger_timeout metric,主流程不 crash) - models/approval.py: ApprovalRequestBase 新增 matched_playbook_id 欄位 - decision_manager.py: _auto_execute 建立 ApprovalRequest 時填充 matched_playbook_id - learning_service.py: 雙路徑查找 _matched_pb_id(matched_playbook_id + metadata fallback) **2x EWMA 負向強化** - models/playbook.py: 新增 trust_score: float = 0.3(EWMA 動態信任度欄位) - repositories/playbook_repository.py: update_stats 加 EWMA 成功: trust = 0.9 × old + 0.1 × 1.0 失敗: trust = 0.8 × old + 0.2 × 0.0(衰減速度 2x) trust < 0.1 → log warning,等 Evolver 封存 **Evolver Agent(新建)** - services/playbook_evolver.py: 三功能全靜態規則 1. 低信任封存: trust < 0.1 → DEPRECATED 2. 休眠封存: 30d 未使用 AND trust < 0.5 → DEPRECATED 3. 相似合併: 症狀 Jaccard > 0.9 → 保留高 trust,封存低 trust AIOPS_P3_EVOLVER_ENABLED=False 預設關閉 **文件** - ADR-083 學習閉環重建 - MASTER §8 Phase 3 完工記錄 AIOPS_P3_ENABLED=False(預設),骨架就位等統帥批准開啟 Co-Authored-By: Claude Sonnet 4.6(亞太)<noreply@anthropic.com>
This commit is contained in:
@@ -261,14 +261,25 @@ class ApprovalExecutionService:
|
||||
self._trigger_playbook_extraction(approval)
|
||||
)
|
||||
|
||||
# ADR-030 Phase 5: 觸發學習服務 (fire-and-forget)
|
||||
asyncio.create_task(
|
||||
self._trigger_learning(
|
||||
approval=approval,
|
||||
success=True,
|
||||
duration_seconds=result.duration_ms / 1000 if result.duration_ms else 0,
|
||||
# ADR-030 Phase 5 / ADR-083 Phase 3: 觸發學習服務
|
||||
# Phase 3 修復:移除 fire-and-forget,改用 await + 30s 熔斷
|
||||
# 超時 → 記錄 metric,主流程繼續(不 crash)
|
||||
# 2026-04-15 ogt + Claude Sonnet 4.6(亞太): Phase 3 fire-and-forget 修復
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
self._trigger_learning(
|
||||
approval=approval,
|
||||
success=True,
|
||||
duration_seconds=result.duration_ms / 1000 if result.duration_ms else 0,
|
||||
),
|
||||
timeout=30.0,
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(
|
||||
"learning_trigger_timeout",
|
||||
approval_id=str(approval.id),
|
||||
timeout_sec=30.0,
|
||||
)
|
||||
)
|
||||
|
||||
# ADR-081 Phase 1: 執行後驗證 (fire-and-forget)
|
||||
# PostExecutionVerifier 等待 K8s 收斂後抓取後狀態,補填 EvidenceSnapshot
|
||||
@@ -349,15 +360,25 @@ class ApprovalExecutionService:
|
||||
)
|
||||
)
|
||||
|
||||
# ADR-030 Phase 5: 觸發學習服務 (失敗案例)
|
||||
asyncio.create_task(
|
||||
self._trigger_learning(
|
||||
approval=approval,
|
||||
success=False,
|
||||
error_message=result.error,
|
||||
duration_seconds=result.duration_ms / 1000 if result.duration_ms else 0,
|
||||
# ADR-030 Phase 5 / ADR-083 Phase 3: 觸發學習服務(失敗案例)
|
||||
# Phase 3 修復:fire-and-forget → await + 30s 熔斷
|
||||
# 2026-04-15 ogt + Claude Sonnet 4.6(亞太): Phase 3 fire-and-forget 修復
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
self._trigger_learning(
|
||||
approval=approval,
|
||||
success=False,
|
||||
error_message=result.error,
|
||||
duration_seconds=result.duration_ms / 1000 if result.duration_ms else 0,
|
||||
),
|
||||
timeout=30.0,
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(
|
||||
"learning_trigger_timeout",
|
||||
approval_id=str(approval.id),
|
||||
timeout_sec=30.0,
|
||||
)
|
||||
)
|
||||
|
||||
async def _push_execution_result_to_alert(
|
||||
self,
|
||||
|
||||
Reference in New Issue
Block a user