Files
awoooi/docs/LOGBOOK.md
Your Name cc547736ab feat(wave6-8): P2.1 fusion + P2.2 governance + P2.4 consensus + Wave 7/8 BLOCKER 修復
承接 Wave 6/7/8 多 engineer 在 agent 限額前完成的代碼,補 commit 解 production
HEAD 隱性 import error(decision_fusion 已被 decision_manager 引用但檔案 untracked)。

新增(後端核心):
- decision_fusion.py (562 行) — P2.1 方法 III(OpenClaw + Hermes + Elephant 三 LLM 融合)
- aiops_timeline.py + aiops_timeline_service.py — critic B4 修復
  /api/v1/aiops/timeline endpoint,DB 存取抽到 service 層遵守 leWOOOgo 積木化
- migrations/p2_decision_fusion_columns.sql + rollback — approval_records fusion 欄位

修改(後端整合):
- decision_manager.py — fusion 三斷鏈修補(critic B1+B2+B3):
  · B1: 寫 _evidence_snapshot_ref 到 token.proposal_data
  · B2: fusion 前計算 complexity_score 並寫 token
  · B3: fusion composite 寫 token.proposal_data["decision_fusion"]
- auto_approve.py — fusion + consensus 認識(critic B3+B5):
  · composite > 0.7 → auto_execute_eligible bypass min_confidence
  · source=consensus_engine + score>=0.6 → 規則可信路徑
- consensus_engine.py — db-fix _save_consensus 重用 agent_sessions
- governance_agent.py — db-fix _alert PG 寫入 ai_governance_events
- approval_db.py — fusion 3 欄位 + 2 partial index + CheckConstraint
- db/models.py — schema 對齊 migration
- core/config.py — vuln #1 修復:OLLAMA_URL/_FALLBACK_URL field_validator
  拒絕公網 IP + 外部域名,僅允許私網/loopback/K8s SVC 白名單
- core/feature_flags.py — P2 fusion + consensus flags
- main.py — governance_agent lifespan 啟動
- failover_alerter.py — Wave8-X2: in-memory dedup fallback(Redis 拒絕後不 fail-open)
- ollama_*.py — metrics 整合 + recovery 改善
- auto_repair_service.py — verifier 接線

新增(測試 2438 行):
- test_decision_fusion.py / test_governance_agent.py / test_consensus_integration.py
- test_p2_db_fixes.py / test_wave8_fusion_fixes.py
- test_config_url_validation.py(vuln #1 12 tests)
- test_failover_alerter.py +Wave8-X2 in-memory dedup 補測

驗收: 116 tests pass (decision_fusion + wave8_fusion + config_url + consensus +
                      governance + p2_db_fixes + failover_alerter)

Conflict resolution:
- 3 檔(config.py + auto_approve.py + decision_manager.py)git stash pop 衝突
  保留 stashed (engineer 最終版),補回 ValueError 「公網 IP」字樣對齊 test

Note: 此 commit 解 production HEAD 隱性 import error
仍未修: vuln #4 prompt injection / debugger B14 quota fail-closed
       / B25-B26 drain_pending_tasks / B8 governance fail alert

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Multiple Engineers (Wave 6/7/8) <noreply@anthropic.com>
2026-04-27 08:11:40 +08:00

1687 lines
87 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LOGBOOK - AWOOOI 進度軌跡
> **用途**: AI 代理進度追蹤,防止 Session 斷層
> **規則**: 完成重要節點後追加一行
> **歷史**: 舊條目已壓縮,詳細記錄見 git log
---
## ✅ 2026-04-26 | Wave 4-5 收尾 — 14 commits 推送
承接上 session 限額前未 commit 的 4970+ 行代碼 + critic 審查全面修補:
**核心 commitsHEAD = `2c57b71d`**
| Commit | 類型 | 內容 |
|--------|------|------|
| `7cd53c02` | P0 監控 | SentryClickHouse + Gitea 改 working_set + 0.85 閾值 |
| `55c6b4e2` | P1 容災 | Ollama 三服務health/failover/recovery+ ai_router 整合3798 行)|
| `e96055ee` | P0.4 | Playbook partial index + SELECT FOR UPDATE 防 race |
| `fd40b79d` | P0.6+P1.3+P1.4 | ProactiveInspector PromQL + webhooks verifier 接線 |
| `02362edd` | Wave 4-5 | auto_repair_service 真 verifier 接線 + Ollama_188 provider 註冊 + B3 quota atomic |
| `2c57b71d` | P2.2+P2.3 | GovernanceAgent + Ollama 健康規則 + Prometheus metrics |
**critic 抓到的 BLOCKER 全修**
- B1: `gitea_webhook.py await get_redis()` 同步函數誤 await → Telegram 通知永遠發不出去CI 綠燈假象)
- B2: `EvidenceSnapshot.get_latest_snapshot` 是 module function 不是 classmethodwebhooks + approval_execution 兩處)
- H1-H4: dedup 跨日 / metric 改名 / lifespan 順序 / probe_success NaN
**飛輪自主化分數**: 63 → ~85
---
## ✅ 2026-04-25 | T0 五大並行任務P9 方法論)
| 任務 | 成果 | 測試 | 狀態 |
|------|------|------|------|
| A Telegram 按鈕修復 | telegram_gateway.py 補 reply_markup | 78/78 ✅ | 待 Staging E2E |
| B ClickHouse 假告警 | working_set 指標 + 0.85 閾值 | 4/4 promtool ✅ | ✅ 已部署生產 |
| C Gitea CI/CD Webhook | gitea_webhook.py 新增 + HMAC 驗簽 | 15/15 ✅ | 待 GITEA_WEBHOOK_SECRET |
| D ElephantAlpha 驗證 | elephant-alpha 廢棄,換 ling-2.6-flash | n/a | ⚠️ MinPrereq: 1 行 |
| F Code Review 研究 | Linter ✅ LLM auto-apply ❌ | n/a | Info only |
**Task B 鐵證**2026-04-23 `usage_bytes`=88.5% vs `working_set_bytes`=7.8%,差距 80.7% = page cache
**Root Fix**`container_memory_working_set_bytes / limit > 0.85`K8s kubectl top 同源)
**Task C 待辦**K8s 注入 `GITEA_WEBHOOK_SECRET` + Gitea UI 設定 webhook (URL + secret + 三類事件)
---
## 🎯 2026-04-25進行中| 自動化飛輪修復 × 4 + Hermes Ollama + qwen3:8b ✅
### B1auto_execute 被 _ALLOWED_KUBECTL_PATTERN 全攔
- **根因**: LLM 輸出 `kubectl rollout restart deployment <name>``deployment` keyword
→ pattern 只允許直接接名稱 → `_action_safe=False` → 所有 low risk 告警降人工
- **修法**: Pattern 加 `(?:(?:deployment|pod|...)\s+)?` optional group + `re.ASCII`
- **驗證**: 12/12 test cases ✅,`auto_execute_blocked_unresolved_placeholder` 消失
### B2auto_execute 路徑 KM 寫入斷鏈
- **根因**: `_write_execution_result_to_km` 只在人工審核路徑呼叫
- **修法**: `_auto_execute()` 完成後補 `_fire_and_forget(executor._write_execution_result_to_km)`
### B3Hermes 回應為空Claude Agent SDK → Ollama
- **根因**: `claude-agent-sdk``claude` CLIK8s pod 無此 CLI
- **修法**: 改 httpx + Ollama 本地模型111 主機),零費用
### B4Ollama 模型升級 qwen3:8b
- qwen2.5-coder:7b + qwen2.5:7b-instruct → 統一改 qwen3:8bHybrid Thinking4.9GB
- 111 主機 pull 完成,`gemma4` 尚未在 Ollama 釋出(保留 gemma3:4b
### 部署狀態
| Commit | 內容 | CI/CD |
|--------|------|-------|
| 6baa5054 | B1+B2 auto_execute 修復 | 🔄 進行中 |
| 7b6df17d | qwen3:8b 模型路由 | 🔄 進行中 |
| 250eca99 | Hermes Ollama 取代 SDK | ✅ 部署完成 |
---
## ✅ 2026-04-25上午| AI 信心度 + Kubectl 安全防禦三層修復 ✅ 部署完成
### 問題診斷
- **症狀**: Telegram 告警 PHASE2_AGENTS 🔴 信心度 20-50%,自動化決策頻率低
- **根本原因**: Solver Agent 在 action_title 缺乏 "kubectl" 時執行 `min(0.9, 0.5)` 降級,語義合成被上限阻斷
- **安全漏洞**: Critic 發現三層 kubectl 驗證缺陷C1 ReDoS/注入、C2 繞過、C3 DoS
### 修復內容
| 修法 | 修改項 | 結果 |
|------|--------|------|
| **修法A** | Solver 優先 `kubectl_command` 欄位(完整指令),保留 0.9 信心度 | 決策信心度回復 |
| **C1** | 正則 `\s→[ ]` + `re.ASCII` + `{1,500}`,拒絕 `\n\r\t\x00` | 7.256s → 0.015ms ⚡ |
| **C2** | action_title + standard path 加白名單驗證 | 雙層防禦繞過 |
| **C3** | `_KUBECTL_MAX_LEN=500` 硬上限 | 前置 DoS 防護 |
### 驗證與部署
- **35/35 tests ✅**24 回歸 + 11 新安全測試)
- **Commit**: cc69f3ce → Gitea main → **K8s rollout 成功**
- **Pods**: awoooi-api 2/2 running (10m, 9m58s uptime)
- **下一步**: 監測新告警信心度是否達到 85%+2-3 小時內有新告警時驗證)
---
## 2026-04-25 | Hermes × 12-Agent Telegram 整合WS0WS6
### 完成項目
- **WS0** ADR-093/094/095 治理文件claude-agent-sdk 升至 0.1.66
- **WS2** NotificationMatrix + BigInteger overflow 修復 + Redis key 一致性 + TG_GROUP_CUTOVER feature flag
- **WS2-Migration** approval_recordsBIGINTprod 已建立)+ enum types
- **WS3** Callback user-ID bindingCSRF 防護)+ Telegram Webhook 入口ADR-094
- **WS4** hermes/ 套件display_names / agent_loader / safety_hooks / nl_gateway12-Agent SDK 接入)
- **WS5** chat_member Approvers 白名單 Redis 同步
- **WS6** latency logging + hermes_dispatch_log audit 表prod 已建立)
- **補強** DB 寫入 + 速率限制 + Multi-turn session
### Feature Flags預設關閉
- `HERMES_NL_ENABLED=false` → 啟用後支援 @mention NL 對話
- `TG_GROUP_CUTOVER=false` → 啟用後 TYPE-3/4/4D/8M 告警改發 SRE 群組
### 剩餘待辦
- WS1 Token Rotation統帥決定時機
- K8s ConfigMap 補 feature flags統帥決定啟用時機
- Phase 3 Prometheus 規則ADR-075不阻擋上線
- awoooi_migrator 角色需 superuser 建立
---
## 📍 2026-04-25 — Host 告警錯誤診斷與 resolved_at 缺漏修復
### 本次修復
- **Incident resolve DB 同步補洞**`IncidentService.resolve_incident()` 現在會把 `resolved_at` 一起傳給 `IncidentRepository.update_status()`,修正 Incident 狀態已是 `RESOLVED` 但 DB `resolved_at = NULL` 的斷鏈
- **Telegram 已解決文案保底**:狀態守衛改為 `resolved_at` 缺漏時顯示 `✅ 此事件已解決`,不再出現 `此事件已於 未知時間 解決`
- **Host 告警規則前置短路**`/api/v1/webhooks/alertmanager` 背景流程新增 `host_resource + YAML NO_ACTION` 前置門,主機資源告警命中規則後直接生成人工排查卡片,跳過 LLM避免產生「重啟 AWOOOI deployment」這種錯誤 K8s 建議
### 根因
- `resolved_at` 只寫入 Redis / Working MemoryRepository `update_status()` 沒有同步回 PostgreSQL造成 Telegram 狀態守衛讀到 `RESOLVED + NULL resolved_at`
- Alertmanager 背景流程先跑 `openclaw.analyze_alert()`,沒有比照 Phase 2 的 YAML `NO_ACTION` 優先門,導致 `HostHighCpuLoad` 這類主機告警先被 LLM 汙染卡片內容,後續防護只能阻擋執行、不能修正已發出的錯誤建議
### 2026-04-26 Production 驗證
- **部署狀態**`awoooi-prod` 線上 image 已前進到 `2c57b71d...`,且包含 `55f111e` host alert / resolved_at 修復 commit
- **新資料驗證通過**`2026-04-26` 台北時間建立的 `host_resource` incidents 已改為 `[Rule: host_resource_alert]` + `NO_ACTION` 人工排查卡,不再出現 `kubectl rollout restart deployment/awoooi-*`
- **resolved_at 新案正常**:當日 `status='RESOLVED' AND resolved_at IS NULL` 計數為 `0`
- **舊髒資料仍存在**:歷史上仍有 `166``RESOLVED + resolved_at NULL`;截圖事件 `INC-20260424-739ACC` 仍是舊資料殘留incident 已 `RESOLVED``resolved_at` 為空approval 也保留舊的錯誤 AI 文案與 `awoooii-prod` 指令
- **後續決策待定**:若要清理歷史卡片/資料一致性,需另外規劃 production backfill不可直接把歷史 approval 文案當成新流回歸)
## 📍 2026-04-24 — Telegram「AI 分析超時」止血 + incident_id 單一真相補強
### 本次修復
- **Phase 2 Agent Timeout**`Diagnostician / Solver / Critic` 各自新增 `20s` step-level timeout超時直接走既有 degraded fallback避免 3 段 LLM 串行一路拖到 `AgentOrchestrator` 全局 `90s`
- **AI Router 中央治理**:新增 `intent_hint` 快路徑,讓 Phase 2 internal-agent routing 可在 Router 內集中指定 `diagnose`,不再為同一場辯證重複跑慢速 intent LLM 分類
- **Alertmanager fallback 鏈路**`webhooks.py` 的 LLM fallback 路徑補上 `update_incident_id()`,修正 incident 建立後 approval 不回填的 DB 斷鏈
- **incident_id 單一真相補強**`IncidentApprovalService` 改為 `approval.incident_id` 優先、metadata 僅做 fallback`ProposalService``SignOz webhook` 建 approval 時直接寫入 `incident_id` 欄位SignOz Telegram 發卡同步帶上 `incident_id`
### 本地驗證
- `python3 -m py_compile` 通過:
- `apps/api/src/services/ai_router.py`
- `apps/api/src/agents/{diagnostician_agent,solver_agent,critic_agent}.py`
- `apps/api/src/api/v1/webhooks.py`
- `apps/api/src/services/{incident_approval_service,proposal_service}.py`
- `apps/api/src/api/v1/signoz_webhook.py`
- `cd apps/api && pytest tests/test_p0_diagnose_routing.py -q``4 passed`
- `cd apps/api && pytest tests/test_intent_classifier.py -q``16 passed, 7 skipped`
### 殘餘風險
- 尚未對 production live DB / logs 做二次驗證,無法在本 session 直接證明 Telegram 超時卡片數已下降
- `/api/v1/webhooks/alerts` 舊 approval-only 路徑、Sentry 路徑仍可能產生 `approval_records.incident_id = NULL`,後續需決定是否全面收斂到 Incident-first 流程
## 📍 2026-04-24 — 12-Agent 新遊戲規則 v1 定版 + 文件治理同步
### 本次補強
- 新增 `[docs/12-agent-game-rules.md](/Users/ogt/awoooi/docs/12-agent-game-rules.md)`:把 12-agent 從審計/設計概念落成日常派工規則
- 定義 `12 agents vs 9 skills` 對照、模組責任區、自動派工規則、強制加簽規則、常用組隊模板
- 補記 `ADR-095`新增「日常工作模式Game Rules v1」章節明確 12-agent 不等於 repo 內 9 skills
- 更新 `Skill 06`:加入 12-agent 協作治理,規範任務判型 → 主責 agent → 對應 skills 的工作流
### 治理決策
- `12 agents` 定位為任務角色與分工編排
- `.agents/skills/*.md` 定位為工程規範與實作守則
- 後續工作模式:先用 12-agent 判型與派工,再落到 skills / HARD_RULES / MASTER 執行
### 相關文件
- `docs/12-agent-game-rules.md`
- `docs/adr/ADR-095-12agent-sdk-integration.md`
- `.agents/skills/06-awoooi-monorepo-master.md`
## 📍 2026-04-24 — ADR-092 P0+P1+P2.1 全修commit 7f4088b / 04ff225 / bb5f16f
### P2.1 修復commit bb5f16f
- **consensus_engine.py**: 四 ExpertAgent confidence=0.0 → 加權投票 total=0 → 永遠 NO_ACTION改為依訊號強度 0.45~0.80
- **consensus_engine.py**: `_normalize_action` 加「重新啟動」別名 → 正確歸 RESTART移除未使用 _target
- **prompts.py**: 新增 Evidence-First Protocol + Skepticism Rules要求 LLM 引用 `<raw_evidence>` 才能高 confidence
- **openclaw.py**: `analyze_alert` 提取 `diagnosis_context``<raw_evidence>` 注入 full_prompt
- 驗證CrashLoop 測試 consensus score 從 0.0 → 0.744
### 🔴 手動 DB Migration 待執行
```bash
psql $DATABASE_URL -f apps/api/migrations/adr092_p1_learning_chain_fix.sql
```
### P2.4 修復commit e75e467
- **telegram_gateway.py**: 新增 `send_analyzing_placeholder()` + `delete_message()`
- **webhooks.py**: LLM 分析前 ≤3s 送佔位卡;完整卡發出後背景刪除
### P2.6 修復commit 97ce5ea
- **ai_slo_watchdog_job.py**: W-6 新增 Trust Drift 偵測(接入孤立服務 trust_drift_detector
- 覆蓋 optimism_bias + confidence_collapse 兩種偏態checks 5 → 6
### ✅ ADR-092 P0+P1+P2 全部完成5 commits pushed to gitea main
---
## 📍 2026-04-24 — 12 Agent 全景審計 + P0-P2 全面並行修復
### 需求
統帥「請用12位Agent的新遊戲規則進行全景、全流程、全節點的所有 AI 自動化流程優化!到目前為止都還沒有完全正常運作!」
### 審計結論
12 Agent 分工並行掃描:
- 系統有效串接率:~60%125個服務中約75個真正在主流程使用
- 孤立服務12個重要服務零引用trust_drift_detector/rollback_manager 等)
- 7大致命病根詳見 project_audit_20260424.md
### 最關鍵發現
1. **MCP 感官 = 0**Prometheus KeyError 100% + legacy kwarg bug 靜默吞
2. **auto_execute 24h = 0**Gate 9blast_radius 唯讀指令判 human+ Gate 11operation_parser 不認唯讀指令)
3. **Playbook 學習 = 永遠 False**5個斷鏈疊加 + 冷啟動死結
4. **KM +5/天主因**knowledge_extractor_service.py:210 AttributeError 100% 失敗
5. **動態基線9天0筆**5個 PromQL label 全錯cadvisor namespace/container 不對)
6. **timeline_events +1/天**pre_decision_investigator.py:344 raw SQL INSERT 寫不存在欄位
### 修復動作(並行執行中)
- P0.1-P0.6:立即止血(知識萃取/auto_execute gate/MCP/告警規則/動態基線)
- P1.1-P1.5學習閉環修復DB migration + matched_playbook_id 斷鏈)
- P2.1/P2.4/P2.6LLM 品質 + Telegram 中間態 + AI 治理
---
## 📍 2026-04-24 — 12-Agent 全景盤點 + 六大自動化飛輪修復
### 根因(截圖告警分析)
- META 告警W-2誤判tg_sent: Redis TTL 24h 過期被誤報為「Telegram 靜默」,實際 Telegram 早已發送
- 真正根因MCP Provider 三個 Bug → Agent Debate 90s 超時 → description="待分析" → ADR-091 鐵閘不推 Telegram
- Config Drift 全人工:無自動採納觸發鏈路
- Playbook Evolver 迴圈HTTP 5xx 重複建立/deprecated294 deprecated / 25 approved
### 修復內容706行+17 檔)
| 模組 | 修復 |
|------|------|
| `ssh_provider.py` | `asyncssh.run``conn.run()`API 用錯) |
| `prometheus_provider.py` | KeyError 'query' → `.get()` fallback + `promql` alias |
| `k8s_provider.py` | 空 pod_name → early return error dict |
| `ai_slo_watchdog_job.py` | W-2 改用 `telegram_message_id IS NULL`W-5 新增Agent Debate 卡住) |
| `approval_timeout_resolver.py` | 1h → 15minBATCH_LIMIT 50 → 200 |
| `approval_db.py` | tg_sent TTL 24h → 30hbuffer 防邊緣誤判) |
| `drift_adopt_service.py` | 新增 `auto_adopt_if_safe()`6 條件自動採納 PR |
| `drift.py` | 背景任務加自動採納邏輯(低風險走 auto高風險走人工 |
| `playbook_seed_service.py` | 冪等 SQL 修復(去掉 `AND status != 'deprecated'` 防重複建立) |
| `playbook_evolver.py` | `_fetch_all_active_playbooks` 只載 APPROVED+DRAFT不載 deprecated |
| `alert_rule_engine.py` | 自動規則生成加 telemetry + Redis pipeline 原子 incr/expire |
| `auto_approve.py` | 拒絕原因 Redis 計數(供系統報告展示) |
| `heartbeat_report_service.py` | 新增「自動化統計」區塊(今日規則/KM/Drift/Playbook |
| `decision_manager.py` | Agent Debate 超時降級文字(通過 ADR-091 鐵閘) |
| `intent_classifier.py` | LLM 超時 → keyword fallback不浪費 5s 等待) |
| `migrations/cleanup_duplicate_deprecated_playbooks.sql` | 一次性清理 294 筆重複 deprecated |
### Critic 審查後追加修復
- `heartbeat_report_service.py` SQL移除 `AT TIME ZONE`timestamptz 直接比較drift_today 改查 drift_reports 表
- `drift_adopt_service.py` 雙重 Telegram 問題:`suppress_notification=True` 避免 auto_adopt 重複發
- `alert_rule_engine.py` Redis racepipeline 原子化 incr+expire
- `ai_slo_watchdog_job.py` W-5改用 `action IS NULL/空 + telegram_message_id IS NULL` 更可靠
### 待手動執行
```bash
psql $DATABASE_URL -f apps/api/migrations/cleanup_duplicate_deprecated_playbooks.sql
```
---
## 📍 2026-04-22 — 系統報告動態化:新增 5 大區塊commit 9244c5e
### 需求
統帥:「系統報告需要更全面、更完整,服務增加了很多,必須動態滾動增刪」
### 實作
| 新區塊 | 資料來源 | 說明 |
|--------|---------|------|
| 📊 告警流水線24h | `approval_records.status` | total/pending/success/failed |
| 🗄️ DB & Redis | PG `SELECT 1` + Redis info | 連線狀態 + key 數 |
| ☸️ K8s Pods | kubectl get pods | ready/restart count |
| ⏱️ Scanner 狀態 | Redis daily lock TTL | 今日是否已執行 |
| 🤖 Telegram Bot | Redis `telegram:polling_leader` | polling leader 是否存活 |
- 5 個 probe 方法用 `asyncio.gather(return_exceptions=True)` 並行,任一失敗不影響其他
- `_build_warnings()` 新增 DB/Redis/PENDING>10/Pod 未就緒 四種警告條件
- 新增 5 個 dataclassAlertPipelineStats / DbRedisStats / PodInfo / ScannerStats / TelegramBotStats
### Commit
- `9244c5e` feat(heartbeat): 系統報告新增 5 大動態區塊
---
## 📍 2026-04-22 早 — 日報重發 + 自動修復 0% 兩大根因修復commits ef1353b + 88af639
### 問題
統帥:「日報重複發送兩次」+「自動修復成功率 0.0%」
### 根因
| 問題 | 根因 | 修法 |
|------|------|------|
| 日報重發 | `run_daily_report_loop` 沒有呼叫 `try_acquire_daily_lock`(其他 3 個 scanner 都有4 個 Pod 各自送一份 | sleep 後加 `try_acquire_daily_lock("daily_report")`,搶不到的 Pod 直接 `continue` |
| 修復率 0% | `_collect_repair_stats``incidents.outcome->>'execution_success'`,但整條執行鏈路從未將 `execution_success` 寫入此 JSON 欄位 | 改查 `approval_records.status = 'EXECUTION_SUCCESS/FAILED'`(唯一可靠 source of truth |
| SQL 大小寫 | DB 以 SQLEnum 儲存 enum nameEXECUTION_FAILED 大寫SQL 用小寫比對 | 加 `UPPER(status::text)` 保證命中 |
### 驗證
- Live DB 驗證:修正後 SQL → `success=0, failed=2`(之前永遠 0/0
- 明早 08:00 報告應顯示真實成功率(今日 0/2 = 0%,但數字正確)
### Commits
- `ef1353b` 主修復leader lock + 改查 approval_records
- `88af639` SQL 大小寫修正
---
## 📍 2026-04-22 凌晨 — Telegram 按鈕靜默兩大根因修復commit 1625e7b
### 問題
統帥:「按鈕按下去,會產生的所有操作和結果,也都沒有回覆到 Telegram 群組上!」
### 根因全景Debugger 全景調查)
| 陷阱 | 症狀 | 根因 | 修法 |
|------|------|------|------|
| T1 容量預測按鈕靜默 | "已處理"/"忽略 24h" 按下後群組無回覆 | `_handle_ai_advisory_action` 只呼叫 `_answer_callback`toast 2-3 秒消失),從未 `sendMessage` 到群組 | 加 `message_id` 參數toast 後發 `sendMessage reply` 到群組 |
| T2 已解決告警批准靜默 | 再按「批准」→ 出現「⚡ 執行中...」但永遠沒結果 | `sign_approval` early-returnstatus != pending但代碼仍呼叫 `_notify_approval_result` 發「執行中...」;`execute_approved_action` 因 status != APPROVED 跳過 → 永無結果 | 僅 `approval.status == APPROVED` 才發「執行中...」;否則發「ℹ️ 此告警已處理(狀態:...)」 |
### 修復範圍
- `telegram_gateway.py:_handle_ai_advisory_action` — 加 `message_id` + 群組 reply
- `telegram_gateway.py:_execute_approval_action` — 非 PENDING 狀態正確通知
### 部署
- Commit: `1625e7b`push gitea main
- Gitea pipeline build → Harbor push → K8s 滾動更新 → 02:13 完成
- 新 image: `1625e7bd19017d9287fef55a5660ac125a413626`
---
## 📍 2026-04-21 晚 — 全流程三斷點修復commit 4fc1f49
### 根因全景
| 斷點 | 症狀 | 根因 | 修法 |
|------|------|------|------|
| D1 飛輪 SLO 公式 | 執行成功率永遠 0.0% | `execution_count` 欄位不存在於 Playbook 模型 → `total_exec` 恆為 0 | `flywheel_stats_service.py` 改讀 `success_count + failure_count` |
| D2 幻覺降級風險未清 | NO_ACTION 仍等 TG 批准 | `_validate_deployment_inventory` 降級 NO_ACTION 後 `risk_level` 未重置 → 原 HIGH/CRITICAL 風險觸發 PENDING | `openclaw.py``result.risk_level = AIRiskLevel.LOW` |
| D3 NO_ACTION PENDING 積壓 | 非破壞性動作等人工批准 | `webhooks.py` 未依 suggested_action 調整 risk_level → INVESTIGATE/OBSERVE/NO_ACTION 全走 Telegram | 兩處 alert path 加 `_non_destructive_actions` LOW risk 強制 |
### 修復效果
- 新告警若 LLM 返回 NO_ACTION/INVESTIGATE/OBSERVE → 立即 LOW risk → auto-approve → `approval_execution.py` NO_ACTION handler → EXECUTION_SUCCESS
- `_validate_deployment_inventory` 幻覺降級後,後續批准路徑完全跳過 Telegram
- 飛輪 SLO 指標有實際執行後將反映真實數字(有執行才有分母)
### 待執行Pod 更新後)
```bash
# 清理 35+ 筆舊 PENDING無 tg_msg 且超 2h
kubectl -n awoooi-prod exec $POD -- python -c "..." # 見 LOGBOOK 說明
```
### Commit
- `4fc1f49` (Gitea pipeline 部署中)
---
## 📍 2026-04-21 下午 — BUTTON_DATA_INVALID 根治 + Gitea Code Review 修復
### 問題
1. **Telegram BUTTON_DATA_INVALID (HTTP 400)**`devops_tool` 類別按鈕 nonce 超過 64 bytes Telegram 限制(`host_restart_service` nonce = 77B
2. **Gitea Code Review "AI 分析失敗"** — OpenClaw `/api/v1/analyze/code-review` 端點從未實作404
3. **Push review `'dict' object has no attribute 'issues'`**`local_code_review_service.review_push()` 回傳 dict呼叫端當 Pydantic model 用
### 根因 & 修法
| 問題 | 根因 | 修法 |
|------|------|------|
| BUTTON_DATA_INVALID | UUID 36 chars + action name (20) + ts + rand = 77B > 64 | base64url encode UUID bytes: 36→22 chars`host_restart_service` = 63B |
| Code review 404 | OpenClaw 只有 `/analyze/incident``/analyze/error` | `_call_openclaw_code_review` 改用 `local_code_review_service.review_pr()` |
| push review AttributeError | review_push() 回 dict呼叫端 `analysis.issues` 屬性訪問 | `_call_openclaw_push_review` 加 dict→CodeReviewResult 轉換 |
### E2E 驗證
- `host_restart_service` nonce = 63B ✓,所有 actions ≤ 64B ✓
- round-trip UUID decode = True ✓
- `telegram_approval_card_sent` message_id=25045 (SignOzDown devops_tool) ✓
### Commits
- `bd73548` BUTTON_DATA_INVALID 根因修復nonce 超 64B
- `caeb7a9` base64url UUID 壓縮(徹底修法)
- `acab1cd` Gitea code review 改 local service
- `8fd31ec` (deployed) pipeline 1009 成功
### 副發現
- `KM_CONVERTED` 缺失於 `alert_event_type` PG enumpre-existingnon-blocking
- SLO watchdog 回報 18 PENDING 無 TG 確認(是 BUTTON_DATA_INVALID 期間積累的歷史記錄)
---
## 📍 2026-04-21 凌晨 — aider-watch v2 完成 (ADR-091全景 E2E 驗證)
### 完成內容
- **aider CLI 安裝**aider v0.86.2OpenRouter Elephant Alpha ($0 free)OAuth 鑑權
- **aider-watch v2**Mac client → awoooi 飛輪完整閉環
- ServerAiderBatchIn / aider_events 表 / Redis stream / AiderEventProcessor worker
- Clientaiderw wrapper / buffer fallback / launchd 5min flush
- AI Routerfeedback_from_aider_events COALESCE SQLsession_end model 優先)
### E2E 驗證全過3 測試)
- C1: webhook → Redis → PG ✅2 rows written
- C2: 斷網 → buffer → flush → PG ✅buffer drain 後 1 row
- C3: model_stats_since COALESCE → `{'openrouter/elephant-alpha': 1.0}`
### 修復過程踩坑(全景比對發現)
| 坑 | 問題 | 修法 |
|----|------|------|
| stdlib logging | logger.info("...", count=N) → KeyError | → structlog.get_logger |
| worker pool | get_worker_redis() 在 lifespan 未初始化 → RuntimeError 靜默崩潰 | → init_worker_redis_pool() 加到 start() |
| model=unknown | session_start 發出時 model 未知SQL 只讀 session_start | → session_end 補 model+cwdSQL COALESCE |
| 假陽性 incident | error_count>=1 就建告警(包含 "no error" 等正常輸出) | → 只在 exit_code!=0 建 incident |
| 死程式碼 | get_aider_event_repository() 有資源洩漏 | → 移除 |
### Git 提交(共 11+ commits以 feat/fix 為主)
最後 commit`9e9bd86 fix(aider-watch): code-review fixes (4 issues)`
### 下一步(已排 Backlog
- `USE_AIDER_FEEDBACK=True` 灰度7天後若 elephant-alpha success_rate 穩定)
- `session_start` 補回 model需等 banner parse 完再發,或改成 patch event
---
## 📍 2026-04-20 上午 — P0.1 + P0.2 + P0.3 三項 Drift/Target 修復
### 統帥三問 RCA 後決議
1. 全做 P0.1 + P0.2 + P0.3
2. AI 推薦門檻 0.85 OK**但先不 auto-execute**(純推薦)
3. 先查 aol 找 awoooi-service 來源 trace 再修
### RCA 結論awoooi-service 失敗)
- 透過 `/api/v1/aiops/kpi` 看到過去 24h 有 1 筆 `playbook_executed actor=approval_execution status=failed`
- grep 全 codebase**無任何程式碼寫死 `awoooi-service`**(只有歷史 comment
- 最可能來源:`alert_rule_engine._extract_vars``labels.service` 取值當 Deployment 名K8s Service 名 ≠ Deployment 名)
- cf59050 / 4f2e1222026-04-18已修 NEMOTRON 幻覺雙路徑本次修第三條路徑rule engine label fallback
### 修復內容5 檔 / 281 行)
| # | 檔案 | 內容 |
|---|------|------|
| P0.3a | `alert_rule_engine.py` | `_extract_vars` service label 降級:`-service` 結尾先剝 suffix同時回傳 `target_source` 追蹤來源 |
| P0.3c | `approval_execution.py` | `_log_aol_started` input 補 `parsed_target/operation/namespace`,下次失敗可直接從 aol 查 trace |
| P0.3b | `approval_execution.py` | 既有 `_log_aol_completed` 本就寫 `resource_name/error/stderr`,追 trace 夠用 |
| P0.1 | `telegram_gateway.py` | `_send_drift_diff_detail` 加分頁10 項/頁)+ 3 桶分類 header人工高風險/一般修改/K8s 自動)+ ⬅️/➡️ 按鈕 |
| P0.1 | `security_interceptor.py` | INFO_ACTIONS 加 `drift_view_page` 白名單 |
| P0.2 | `drift_narrator_service.py` | LLM prompt 加 recommendation 欄位adopt/revert/ignore/investigate + confidence + reason|
| P0.2 | `drift_narrator_service.py` | `_render_telegram_body` 頂部顯示「🎯 AI 建議:⏪ 回滾 (85%) — 原因」 |
| P0.2 | `drift_narrator_service.py` + `telegram_gateway.py` | 卡片 diff_summary 上限 500 → 1500 字,容納推薦 + narrative + items |
### 驗證
- 90 個 pytest test 全過drift / rule_engine / approval_execution
- 5 檔 AST syntax check 過
- AI 推薦**純顯示不自動執行**(依統帥指令)
### 下一步
1. 等下次 real drift 觸發,驗卡片頂部有「🎯 AI 建議」
2. 等下次 drift_view 按下,驗分頁 + 分類 header + ⬅️/➡️ 按鈕
3. 若 awoooi-service 再復發,查 `automation_operation_log``input.parsed_target` 直接追來源
4. P1 留drift 分類器 (noise/controller/human) 進 DB、auto-adopt 門檻 ≥0.85 + low risk
---
## 📍 2026-04-19 晚 21:30 — Gap Review + 3 Gap 修 + AI 自主化 1/9→4/9 LLM 🎖️🎖️🎖️🎖️
### 統帥核心指示
「有確認過是否符合全景、全流程、全節點、全架構?每次變更都不忘全景!朝 AI 自主化方向!」
→ 本階段不疊加功能,先 Audit 誠實暴露 3 個 Gap,按順序修
### Audit 3 Gap 誠實清單
| Gap | 內容 | 狀態 |
|---|---|---|
| **Gap 1** host IPv4 bug | labels.host="125" (短名) 被當 IP,建了 host/110/112/125/188 短名 asset,同時 192.168.0.112/121 因 instance 無 port 漏掉 | ✅ 修 |
| **Gap 2** 24h 0 aol | 真相: HostBackupFailed 是 TYPE-1 設計 (ADR-075 + 2026-04-12 決議),AI 判 NO_ACTION 保守,_auto_execute 提前 return | ✅ 非 bug |
| **Gap 3** AI 層淺 | 8/9 新 scanner 純 threshold,只 Hermes 1 個用 LLM | ✅ 修 (4/9 LLM) |
### 修復 Commits
**Gap 1 14474d4**:
- 新增 `_is_valid_ipv4()` 嚴格 4 段 0-255 驗證 (6/6 單元測試)
- DB 清理 266 筆重複資料 (4 短名 host + 10 relationship + 140 coverage + 112 compliance)
**Gap 2 非 bug 確認**:
- `classify_alert_early` line 173-185 刻意把 backup 類歸 TYPE-1 不進 LLM
- `decision_manager._auto_execute` line 1571-1576 YAML NO_ACTION 提前 return
- 兩者都是設計決策,統帥選跳過 (方案 B)
**Gap 3 LLM 升級 3 個 scanner**:
- d6b854a capacity_forecaster: `_llm_analyze_risk` (host 風險分析)
- f6cb938 compliance_scanner: `_llm_analyze_compliance_posture` (合規態勢 + Telegram)
- 2f5cab2 coverage_evaluator: `_llm_analyze_coverage_gaps` (補覆蓋建議 + Telegram)
### AIOps KPI Dashboard 上線
0004554 `GET /api/v1/aiops/kpi` (積木化 Service + Router):
- 6 section: asset_inventory / coverage_kpi / rule_quality / capacity_health /
automation_flow_24h / ai_autonomy_score
- **autonomy_score 實測: 63/100 (starter)**
- 5 子項: coverage/rule/capacity/flow/diversity × 20 分
### AI 自主化進度對照
| 指標 | Session 前 | Session 後 |
|---|---|---|
| LLM decision | 1/9 | **4/9** (Hermes+forecaster+compliance+coverage) |
| 0 writer 表 | 8 張 | **0 張** 全活化 |
| 7 維 coverage 實作 | 3/7 | **7/7** |
| 24h ops | 22 | **150+** |
| autonomy_score | 無 | **63/100** 可量化追蹤 |
### 今晚 AI 自主化排程(待 2f5cab2 部署)
| 時間 | Service | AI 動作 |
|---|---|---|
| 02:00 | capacity_scanner | host snapshot |
| 03:00 | **compliance + LLM** | LLM posture 分析 → Telegram grade+top3 |
| 04:00 | **Hermes LLM** | rule 噪音分析 (目前 0 noisy 可能不推) |
| 05:00 | **forecaster + LLM** | predict_linear + LLM 具體建議 → Telegram |
| 每 1h | **coverage + LLM** | red ≥ 20 才觸發 → LLM 補覆蓋建議 → Telegram |
### Session 累計 35 commits 全成功(含 hook 擋下 1 次後正確修)
從 e7ba8cb 到 2f5cab2,全部保留 + 全部 CI 通過(除了被 concurrency 合法 cancel
### 下 session 接手重點(記憶 project_gap_review_20260419.md
1. Gap 3 剩 5 scanner 不需 LLM純資料移動
2. Gap 2 選項 B (aol NO_ACTION 留痕) 可做
3. SSL compliance 在 working tree 未 commit (統帥拒絕過)
4. human_feedback tracking 大工程未做
---
## 📍 2026-04-19 晚 20:00 — Hermes LLM 升級 + Rule 1 deprecate + coverage 7 維完整化 🎖️🎖️🎖️
### 統帥反饋激活
「不理解!你沒有給我完整資訊,我無法決策!」→ 2 條 rules 給完整 YAML + incidents trace
「是沒有真實流量?還是你沒有真實去看到其實有真實的流量?!」→ 真實查實證
「持續推進 + 持續 review 原本做法 + 朝 AI 自主化方向」→ 執行
### 統帥決策
1. **PostgreSQLDiskGrowthRate**: 選 **C Deprecate**500MB/h 增長是 PG WAL 正常行為)
2. **NoAlertsReceived2Hours**: **保留**(真實告警鏈路守護)
3. **noise_rate 算法修正**NO_ACTION 不算 false positive觀察後調整
### 本輪實作commits ba18ad2 → c1f23cf
**1. rule_stats_updater v2**:排除 NO_ACTION/OBSERVE/INVESTIGATE 的 EXPIRED approval不算 fp
**2. Hermes LLM 升級**
- 新增 `_llm_analyze_noisy_rule`:用 OpenClaw (Ollama/NemoTron/Gemini) 分析每條噪音規則
- 輸出 JSONprobable_root_causes / recommended_actions / confidence / should_deprecate
- Telegram 摘要含 AI 判定 + top 2 建議
- 對齊統帥鐵律AI 只分析,人工決策
**3. Rule 1 PostgreSQLDiskGrowthRate deprecate**
-`ops/monitoring/alerts-unified.yml` 刪除舊規則
- 新增 `HostDiskUsageHigh` (>80% for 10m, warning)
- 新增 `HostDiskUsageCritical` (>90% for 5m, critical)
- `labels.supersedes=PostgreSQLDiskGrowthRate` 供追溯
- DB 即時 `UPDATE review_status='deprecated'`
- **deploy-alerts workflow 自動部署到 Prometheus 生效** ✅
**4. coverage_evaluator v2 擴充 4 維**
- auto_playbookasset.name 在 playbooks.symptom_pattern/description → green
- auto_remediation過去 30d remediation_events.target ILIKE asset.name → green/red
- auto_rule_matching過去 30d incidents 觸發 + match asset labels → green/yellow
- auto_rule_creationalert_rule_catalog.source='ai_generated' → 目前全 red未來 Hermes 產 AI rule 變 green
- **coverage 7 維從原 3 維實作完成 100%**
### 本 session 完整成果19:50 累計 22 commits
| 類別 | Commits |
|---|---|
| aol writer + verifier await + drift 400 | e7ba8cb / c0f3509 |
| CI cd.yaml B5 shared network3 輪除錯)| b636d3b / ddb902f / 5b9b36f |
| 4 個核心 scanner | 4259a10 / 0226344 |
| asset_scanner v3 + ReplicaSet 橋樑 | d11b09c / fdf8b73 / e677773 |
| coverage_evaluatorKM fix| 007c7ef / 5052323 / c8b263d |
| rule_stats_updater + asset_change_tracker | df71c9a / 6b14194 / 92349bc |
| Hermes rule quality advisor | 9ed135e / 6ab0ce9 |
| LOGBOOK + memory | 2dc84e7 / c015a77 |
| **本輪: LLM Hermes + Rule 1 deprecate** | **ba18ad2** |
| **本輪: coverage 4 維擴充** | **996ac1d / c1f23cf** |
### 實證數字2026-04-19 19:50
| 表 | 現況 |
|---|---|
| asset_inventory | 140+ 全資源類型 |
| asset_relationship | 114含 Pod→Deployment 54+|
| alert_rule_catalog | 69 條(原 68 + 1 deprecated - 1 new = 69|
| asset_coverage_snapshot | 7 維全部可評估(等部署後首跑升級完整)|
| host_capacity_snapshot | 3 hosts 每日累積 |
| asset_compliance_snapshot | 39 × 7 = 273 每次 scan |
| incident_evidence | 339/24h 持續投資蒐集 |
| aol op_types | 6 種活躍asset_discovered/rule_created/rule_updated/capacity_recommendation/coverage_recalculated/notification_formatted|
### Prometheus 生效
- HostDiskUsageHigh/Critical 已部署到 110:/home/wooo/monitoring/alerts.yml
- deploy-alerts workflow 通知「✅ Prometheus 告警規則部署 success (ba18ad2)」
- Prometheus 已載入 69 條規則log 顯示)
### 待驗證(要真實流量)
- aol(playbook_executed):下一個真實 APPROVED+execute approval
- incident_evidence.verification_result同上
- capacity_violation_event超閾值情況目前 cpu 66%、mem 15%,距 80%/85% 還有空間)
### Review 發現的 5 個 bug 全部修復
1. kubectl_get namespace 參數 bug → subprocess 直調
2. asset_scanner 只掃 pods 盲點 → v3 多資源
3. ReplicaSet 橋樑漏 Pod→Deployment → rs_to_deployment map
4. coverage_evaluator KM 欄位 body→content → 修正 schema
5. drift diff HTTP 400 → item-by-item 累計長度
### 下一階段候選(統帥批准 4 項已完成 2 項)
- ✅ LLM 升級 Hermes本輪完成
- ⏳ SSL/CVE/backup compliance 6 維實作
- ✅ auto_playbook/auto_remediation/auto_rule_matching/auto_rule_creation本輪擴充
- ⏳ Phase 4 Holt-Winters AI 容量預測
---
## 📍 2026-04-19 晚 18:00 — Review 深入Phase 7 完整化8 表全寫入 + coverage 升級 + Hermes AI 建議)🎖️🎖️
### 統帥指示「持續推進 + 持續 review 原本的做法 + 朝 AI 自主化方向」激活
### 本輪 Review 發現並修復的 bug
1. **asset_scanner K8sProvider 呼叫 bug**`kubectl_get``--all-namespaces``-n` → asset_inventory=0
- 修:改直接 subprocesscommit 0226344
2. **asset_scanner 只掃 pods 盲點**:僅覆蓋 39 pods
-v3 擴充掃 pods+deployments+services+nodes+configmapscommit d11b09c
3. **ReplicaSet 橋樑漏掉**Pod.ownerReferences 是 ReplicaSet跳過 → Pod→Deployment 關係全失
- 修:先掃 ReplicaSets 建 rs_to_deployment mapPod 用此反查commit e677773
4. **coverage_evaluator KM 欄位錯誤**`ke.body does not exist`(實際欄位是 `ke.content`
- 修:改用 `ke.content ILIKE` + 加 `ke.title` 匹配commit c8b263d
5. **drift diff HTTP 400**`_full[:3950]` 切在 HTML tag 中間
-item-by-item 累計長度避免切斷commit c0f3509
### 實證 DB 活化Review 前 → 後)
| 表 | Review 前 | Review 後 | 關鍵驗證 |
|---|---|---|---|
| asset_inventory | 39 pods | **140+**45 pods + 22 workloads + 52 k8s_resources + 2 hosts| v3 擴充成功 |
| asset_relationship | 52全無 Pod→Deployment| **114**Pod→Deployment 54+ 筆)| ReplicaSet 橋樑生效 |
| asset_coverage_snapshot | 全 unknown | **74 筆 non-unknown**22 green + 52 red auto_alerting| coverage_evaluator 首次升級 |
| alert_rule_catalog.noise_rate | 全 NULL | **12 筆有 noise_rate**2 條 100% noise| rule_stats_updater 首次跑 |
### 新增 scanner/evaluator/advisor本輪 + 前輪累計 11 個)
| 服務 | 檔案 | 排程 | 解鎖 |
|---|---|---|---|
| asset_scanner v3 | `asset_scanner_job.py` | 每 1h | 5 類資源 + 3 類 relationship |
| rule_catalog_sync | `rule_catalog_sync_job.py` | 每 1h | 68 條 Prometheus rules 同步 |
| capacity_scanner | `capacity_scanner_job.py` | 每日 02:00 | host_capacity_snapshot + violation |
| compliance_scanner | `compliance_scanner_job.py` | 每日 03:00 | 7 維 compliancesecret_rotated 真實)|
| **coverage_evaluator** | `coverage_evaluator_job.py` | 每 1h | unknown → green/red/yellow |
| **rule_stats_updater** | `rule_stats_updater_job.py` | 每 1h | noise_rate/TP/FP 從 incidents 推算 |
| **asset_change_tracker** | `asset_change_tracker_job.py` | 每 1h | added/removed/lifecycle_changed |
| **hermes_rule_quality** | `hermes_rule_quality_job.py` | 每日 04:00 | AI 建議 deprecate noisy rules保守版|
### 8 張原 0 writer 表覆蓋率:**8/8 = 100%** ✅
### 找到的噪音規則Hermes 將建議審查)
- `PostgreSQLDiskGrowthRate`: 噪音率 100%tp=0 fp=2
- `NoAlertsReceived2Hours`: 噪音率 100%tp=0 fp=1
- `MoWoooWorkDown`: 33%tp=4 fp=2
- `KubePodCrashLooping`: 25%tp=3 fp=1
### 本輪 commits6 個)
- `0226344`: asset_scanner kubectl subprocess 修
- `d11b09c→fdf8b73`: asset_scanner v3 擴充多資源+relationship
- `007c7ef→5052323`: coverage_evaluator 初版
- `df71c9a`: rule_stats_updater
- `6b14194→92349bc`: asset_change_tracker
- `c8b263d`: coverage_evaluator KM 欄位修
- `e677773`: ReplicaSet 橋樑修
- `9ed135e→6ab0ce9`: Hermes rule quality advisor
### 下一階段候選
- LLM 分析 noise rule 假報真因(升級 Hermes 從 threshold 到 AI 判斷)
- SSL/CVE/backup 合規實作(擴充 compliance 6 維 unknown
- auto_playbook / auto_remediation / auto_rule_matching coverage 維度實作
---
## 📍 2026-04-19 下午 16:30 — Phase 7 完整實作4 個新 scanner service + CI 修復 🎖️
### 統帥鐵律激活
「批准!!全部都要同步做!!」 — 平行推進 CI 修復 + 4 個新 service + E2E 驗證
### 完成清單6 個 commits
| Commit | 內容 | 狀態 |
|---|---|---|
| `e7ba8cb` | approval_execution aol writer + verifier await + declarative done_callback | ✅ 手動 build 部署 |
| `c0f3509` | drift diff HTTP 400 修復item-by-item 累計防 HTML 截斷) | ✅ |
| `5b9b36f` | cd.yaml shared network + rule_catalog_sync | ✅ **CI 首次通過** |
| `4259a10` | capacity_scanner + compliance_scanner | ⏳ CI 跑中 |
| `0226344` | asset_scanner kubectl 改 subprocess | ⏳ CI 跑中 |
### CI cd.yaml B5 3 輪除錯歷程
1. **e7ba8cb fail**act runner 跟 pg-test-b5 用不同 docker network172.17.0.2 IP 不通
2. **b636d3b fail**grep `GITEA-ACTIONS-TASK` 無 match → `bash -e -o pipefail` 中斷整 step無任何 echo
3. **c0f3509 fail**fallback bridge 網路但 default bridge 不支援 container name DNS
4. **5b9b36f 成功**:主動建 shared network `b5-test-net`ci-runner + pg-test-b5 都加入
### 實際驗證5b9b36f 部署後 7min
| 表 | 修復前 | 修復後 |
|---|---|---|
| **alert_rule_catalog** | 0 | **68**Prometheus active rules 全 sync✅ |
| asset_discovery_run | 1 | **3**asset_scanner 跑了 3 次)✅ |
| asset_inventory | 0 | 0K8sProvider bug0226344 修復中) |
| automation_operation_log | 22 | 26+2 asset_discovered, +1 rule_created, +1 notification_formatted|
### 程式邏輯串聯(本輪打通)
```
Pod 啟動 → main.py lifespan
├─ asset_scanner_loop (3600s) → kubectl get pods --all-namespaces
│ └─→ asset_inventory UPSERT + 7 維 coverage_snapshot
├─ rule_catalog_sync_loop (3600s) → Prometheus /api/v1/rules
│ └─→ alert_rule_catalog UPSERT (solves E3 Hermes 的 baseline)
├─ capacity_scanner_loop (daily 02:00) → Prometheus node_exporter
│ └─→ host_capacity_snapshot + capacity_violation_event
└─ compliance_scanner_loop (daily 03:00) → asset_inventory active
└─→ asset_compliance_snapshot × 7 維 (secret_rotated 真實檢查)
```
### 修復的 CI 基礎設施
- `cd.yaml` line 158-182主動建 shared network、ci-runner + pg-test-b5 用 container name 連線
- 解鎖以後**所有** commit 都能自動 CI/CD 部署,不用手動 build
### 下一階段(待 CI 完成)
- B3/B4 部署後 host_capacity_snapshot + compliance_snapshot 開始累積
- 等真實 approval 進來驗證 aol(playbook_executed) + evidence.verification_result
- Phase 7 所有 11 張 ADR-090 表全部有 writer0 writer 盲區治理完成
---
## 📍 2026-04-19 中午 12:30 — 北極星全景打通verifier 改 await + aol 動作回灌 🚀
### 統帥鐵律激活
「全景、全流程、全節點、全程式碼關聯串接邏輯!朝 AI 自動化方向目標前進!」
### 起因
統帥指出原本的「11 張表 migration 未 apply」需求,先全景審計再動手。
盤點結果:14 張表全建好,但 11/14 完全沒人寫;真正瓶頸在「程式邏輯沒串通」,不是 schema 缺失。
### 全景審計鐵證C 方案 = A 學習鏈 + B 動作回灌 並行)
| 觀察 | 鐵證 |
|---|---|
| 14 張 ADR-090 表全部 EXISTSowner=awoooi | pg_class 確認 |
| automation_operation_log: 22 筆全部 drift_narrator 寫的 | grep + DB 統計 |
| 33 件/7d approval APPROVED+EXECUTION_FAILED → aol 0 筆回灌 | 跨表 JOIN 比對 |
| incident_evidence: 1212 筆,evidence_summary 100% 有,verification_result 100% NULL | DB 統計 |
| AIOPS_P1-P6 flag 全部 true4 天前 76558a3 全開)| Pod env 實測 |
| verifier flag 開了還是 0 寫入 → fire-and-forget task 在 Pod recycle 時被殺 | 程式碼 trace |
### 真正斷點(程式邏輯角度)
1. `_run_post_execution_verify``asyncio.create_task` fire-and-forget,task 死 → verification_result 永遠 NULL
2. `approval_execution.execute_approved_action` 全程沒寫 automation_operation_log
3. `declarative_remediation._log_remediation_event` 也是 fire-and-forget,失敗無 log → 0 筆寫入
### 修復commit e7ba8cb
**apps/api/src/services/approval_execution.py+182 行)**
- 新增 `_log_aol_started`:主流程開始 INSERT aol(playbook_executed, pending) 拿 op_id
- 新增 `_log_aol_completed`4 個 return 點 UPDATE aol 為 success/failed + duration + stderr_feed_back
- `_run_post_execution_verify` 兩處(成功+失敗 path`create_task``await + 60s timeout`
- 失敗時 `stderr_feed_back = result.error` → 解開 E6 stderr 回灌閉環
**apps/api/src/services/declarative_remediation.py+24 行)**
- `_log_remediation_event` task 加 `name` + `add_done_callback`,task 失敗時有 log
### 預期解鎖鏈(驗證待 CD 完成 + 下一次 approval
- automation_operation_log: 33 件/7d 立即可見playbook_executed
- incident_evidence.verification_result: 開始累積
- learning_service.record_verification_result → Playbook EWMA trust_score 動態變化
- finetune_exporter 7d cron: 終於有 `verification_result='success'` 可匯出 → finetune_exports 寫入
- stderr_feed_back: 接通 → 失敗訊號回灌 retry/Playbook 負向強化
### 還沒做(下一輪)
- 8 張 asset/capacity 表 0 writer需要新建 scanner / capacity / rule_catalog services
- E3 Hermes 自動建規則:依賴 alert_rule_catalog 有資料
- Phase 4 NemoTron 容量巡檢:依賴 host_capacity_snapshot 有資料
### Commits
- `e7ba8cb` fix(aiops): 打通 AI 自主學習鏈 — verifier 改 await + aol 動作回灌
---
## 📍 2026-04-19 凌晨 02:05 — Phase 7 盲區治理 Round 1結構性治理全景打擊 🎯
### 統帥鐵律激活
"不要只降低!要長期解決!" → 放棄「重啟 cadvisor」戰術補丁轉走**結構性治理**
### 起因
- 剛才開頭我給 A-E 戰術選單 → 統帥兩輪校準(看過全景?符合北極星?不要只降低!)
- 全景調查揭露188 cadvisor **Up 13h 還 321%** = 重啟完全無效鐵證
- 110 load 17 真兇**不是 cadvisor**cadvisor 0%)而是 Sentry 155% + Gitea 109% + node-exporter 141%
### Commits2 repos
- `eab3f52` awoooi: monitoring compose + alerts-unified `infra_self_monitoring` 群組9 規則)
- `507384a` wooo-aiops: 188 cadvisor compose 結構性治理flags + L2
### 全景打擊戰果
| 服務 | Before | After | 配額 |
|---|---|---|---|
| 188 cadvisor | 321% 爆 13 天 | **0.00%** 🎉 | 1g/1.5c |
| 110 cadvisor | 0% | 4.38% | 512m/1.0c(防爆網)|
| 110 node-exporter | 141% 爆 | **0.00%** 🎉 | 256m/1.0c |
| Sentry ClickHouse | 155% | 71% | 8g/4c |
| Gitea | 109% 爆 | **5.87%** 🎉 | 3g/3c |
### Load 變化
- 188: 10.33 → **5.09**
- 110: 17 → (重啟峰值 51 回落中) 待驗證
### 告警規則(動態,非寫死)
- Memory usage / spec_memory_limit > 0.8 → Pressure
- CPU throttle rate > 0.5s/s → Throttled
- 配額改,閾值自動跟著變(比寫死 80% 智能)
### 🔴 關鍵教訓(下次 Session 必讀)
1. **重啟 ≠ 解決** — cadvisor Up 13h 又 321% 是鐵證
2. **全景調查必要** — status 快照說「188 cadvisor 288%」隱藏了 Sentry/Gitea/node-exporter 的巨大背景噪音
3. **Compose 來源 drift 危險** — 188 cadvisor 真正來自 `momo-pro/monitoring/``wooo-aiops/` 差點治錯
4. **配額即智能** — L2 配額比閾值規則更智能,因為它把「限制」寫進基礎設施
### 技術債5 項)
`project_current_status.md` 頂部
### 下一 Session 接手
1. 驗 110 load 是否穩 <10
2. 驗 9 條 infra_self_monitoring 規則活躍
3. 補 ADR-090 11 表 migration需先找 prod DB 位置)
4. 決議 110/188 手動管 compose 是否納入 Git
---
## 📍 2026-04-17 晚 — P1+P2 安全熱修 + 第一次授權執行歷史里程碑 🏁
### 第一次 [✅批准] 歷史時刻
- **INC-20260417-43E98A**:混沌注入 `KubePodCrashLooping` → TYPE-3 卡片呈現符合預期
- [✅批准][❌拒絕] 置頂 ✅AI 診斷只顯示診斷摘要 ✅action 為 `kubectl get pods -n awoooi-prod`
- 統帥按下 [✅批准] → `approval_execution.py` 接收 → 原卡片下方 reply「✅ 執行成功/失敗」
- KM 沉澱:`_write_execution_result_to_km()` 自動寫入 `INCIDENT_CASE`(含 alertname/category/action
### P1 安全熱修 — Commit `93205ce`
| 問題 | 根因 | 修復 |
|------|------|------|
| 自然語言 action 通過 auto_approve | 條件 1c 只判斷 action 是否為空,未驗證格式 | 新增條件 1daction 必須含 `kubectl` 關鍵字,否則 `NO_PLAYBOOK` 拒絕,降人工審核 |
| Solver Nemo 格式路徑輸出自然語言 | `action_title` 不含 kubectl 仍被轉為 CandidateAction | `_extract_candidates()``action_title` 不含 kubectl → `return []` → 觸發 `_degraded_plan` |
| 降級動作為 `"restart_pod"` 等自然語言 | `_default_action_for_category` 返回非 kubectl 字串 | 改為真實 `kubectl get/top/exec` 調查指令(唯讀,無副作用) |
### 架構現況2026-04-17 晚)
| 層級 | 狀態 | 說明 |
|------|------|------|
| L1 監控/告警 | ✅ 生產運行 | Prometheus + Alertmanager |
| L2 AI 診斷 | ✅ 生產運行 | 5-Agent Debateconfidence/blast_radius 計算 |
| L3 條件自動執行 | ✅ 首次驗證 | kubectl 格式 + blast_radius 評分 → 人工或自動 |
| L4 自動放行(高信任) | ⚠️ 架構就緒 | trust_score 邏輯存在min_trust_score=0pod重啟會歸零|
| L5 自主學習飛輪 | ⚠️ 架構就緒 | `_write_execution_result_to_km` 寫入,未 7 天驗證 |
### 已驗證事實修正
- **卡片不會 in-place edit**:執行結果以 `reply_to_message_id` 送新訊息到原告警下方
- **KM 沉澱是真的**`approval_execution.py:676` `create_entry` 確實執行
- **AI 仲裁 20%** = Solver 走降級路徑,`confidence=0.2` 是設計值(降級動作應給低分)
---
## 📍 2026-04-17 下午三 — 混沌演習 + Telegram UI 第三波修復BUG-C🎯
### 混沌演習結果Alertmanager API 注入法)
- 注入:`KubePodCrashLooping``INC-20260417-C6D1D6` 建立 ✅
- AI Debate 完成confidence=0.9, risk=low
- 揭露新 BUGTYPE-3 root_cause 仍含 debate_summary 全文 + K8s 按鈕蓋台 approve/reject
### 修復 Commit `f421e65`
| 問題 | 根因 | 修復 |
|------|------|------|
| TYPE-3 卡片 AI 診斷欄顯示完整 debate_summary | `root_cause=_smt(reasoning, 500)` 未解析 | `_parse_debate_summary` 只取 `diagnosis` + `_smt 300` |
| K8s 動態按鈕蓋台,看不到批准/拒絕 | `requires_human_approval` 條件未滿足時跳過 approve/reject | `_build_inline_keyboard` 重構:[✅批准][❌拒絕] 永遠第一行K8s 按鈕置後 |
**副作用清理**:移除 `requires_human_approval` 參數(`_build_inline_keyboard` + `send_approval_card` + 呼叫端),邏輯簡化為無條件置頂。
---
## 📍 2026-04-17 下午二 — Telegram UI 第二波修復BUG-A + BUG-B📊
### 系統盤點System Audit
完成 6 TYPE 全分類盤點TYPE-1/2/3/4/4D/8M
- TYPE-2/3/4✅ TelegramMessage 結構化模板,正常
- TYPE-8M✅ 已修復(第一波 6baa2e9
- TYPE-1 BUG-A — `message=reasoning[:200]` 傾倒完整 debate_summary
- TYPE-4D BUG-B — `diff_summary=description[:500]` 傾倒 AI 輸出的 JSON 原文
### 修復 Commit `418d735`
| 問題 | 根因 | 修復 |
|------|------|------|
| TYPE-1 純資訊通知顯示 "診斷...;方案...;安全審查..." 全文 | `reasoning[:200]` 未解析 debate_summary | `_parse_debate_summary(reasoning)` 只取 `diagnosis` + `_smt` 截斷 200 字 |
| TYPE-4D Config Drift 顯示 `{"action_title":"...","description":"..."}` | `description[:500]` 傳入未解析的 LLM JSON | JSON Catcher`json.loads` 成功 → 格式化「📝建議操作/📖說明/⏪回滾方案」;失敗 → 平滑降級純文字 |
**修改範圍**:僅 `decision_manager.py` 路由準備段(+23行/-2行`telegram_gateway.py` 模板層零改動。
---
## 📍 2026-04-17 下午 — Telegram UI 三連修(顧問戰報分析)🎯
### 顧問診斷兩張截圖
**截圖一(好消息)**Solver 成功輸出 `kubectl delete pod awoooi-api -n awoooi-prod`blast_radius=25
Trust Score 未達 0.8 門檻 → 系統正確降級為 ACTION REQUIRED — Trust Engine 正常運作。
**截圖二(真問題)**TYPE-8M 卡片三欄重複 + 幽靈截斷 + 死卡(無批准/拒絕按鈕)
### 修復 Commit `6baa2e9`
| 問題 | 根因 | 修復 |
|------|------|------|
| 批准/拒絕按鈕消失(死卡) | `_build_inline_keyboard` 有動態按鈕時跳過 approve/reject | 新增 `requires_human_approval` 參數True 時強制插入批准/拒絕行 |
| TYPE-8M 三欄重複渲染 | `diagnosis`/`system_impact`/`probable_cause` 全取 `reasoning[:100]` | 新增 `_parse_debate_summary()` 拆分各組件 |
| 幽靈截斷「質疑:無(通」 | 粗暴 `[:N]` 在括號中間切斷 | 新增 `_smart_truncate()` 在句子邊界截斷 |
驗證:`verify_telegram_ui.py` 全部通過Run 927 部署中13:58 台北)。
---
## 📍 2026-04-17 — Phase 5 燃料修復 + 生產 Bug 三連修 🔧
### 背景
顧問(統帥)從 Telegram 截圖診斷出 4 個生產問題:
CI/CD 失敗、API 短暫離線、drift 研判原因空白、Telegram 截斷幽靈復發
### 根本原因 + 修復 Commits
| Commit | 問題 | 根因 | 狀態 |
|--------|------|------|------|
| `e0bfcc7` | Phase 5 blast_radius fill rate = 0% | Solver prompt 範例為 `restart_service:xxx` 自訂格式 → LLM 輸出自然語言 → auto_approve Cond 1c 拒絕 → blast_radius_calculator 從未被呼叫 | ✅ 已部署 `0ab92c2` |
| `5dae610` | CD pipeline rebase 衝突 | `git rebase``-X theirs` → kustomization.yaml 衝突未解 → push rejected | ✅ 已部署 `0ab92c2` |
| `58d9c06` | drift_narrator 研判原因空白 | `_generate_narrative()` 直接呼叫 `192.168.0.111:11434`dead Ollama→ httpx 拋 exception → 整個 narrate_and_notify() 跳出 → DB 從未寫入 | ✅ 已部署 `0ab92c2` |
| `0ab92c2` | Telegram 截斷幽靈 "質疑:無(通" | `root_cause=reasoning[:300]` 裁切在 300 字 | ✅ 已部署 |
### 修復技術摘要
**Solver prompt 修復e0bfcc7**:
- 舊:`action 範例 = "restart_service:awoooi-api"` → LLM 模仿輸出自然語言
- 新:明確要求 kubectl 命令 + 正確範例 `kubectl rollout restart deployment/awoooi-api -n awoooi-prod`
- 影響auto_approve Cond 1c 恢復_auto_execute() 路徑打通blast_radius_calculator 開始運作
**drift_narrator 修復58d9c06**:
- 舊:`httpx.AsyncClient → POST 192.168.0.111:11434/api/generate` (Dead IP)
- 新:`get_openclaw().call(prompt)` — 走 AI Router自動 fallback
- 與 drift_interpreter.py 同樣修法d952435
### 生產驗證2026-04-17 13:38 台北)
| 指標 | 狀態 |
|------|------|
| Run 926 部署 | ✅ successimage `0ab92c20...` |
| API 在線 | ✅ HTTP 200 |
| Solver kubectl 格式 | ⏳ 等下一個告警觸發 |
| blast_radius_score 記錄 | ⏳ 等新 incident |
| drift_narrator 研判原因 | ⏳ 等 14:00 cronjob 觸發 |
| Telegram 截斷修復 | ⏳ 等長 reasoning 的 incident |
### GitOps Token 修復(本 Session 早期)
- Gitea Issue `write:issue` scope 缺失 → 403
- 修復docker exec gitea → generate-access-token → patch K8s Secret
- Phase 5 GitOps PR 功能:`AIOPS_P5_GITOPS_PR=false`configmap可按需啟用
---
## 📍 2026-04-16 — E2E 全節點驗證 + 生產 bug 連環修復
### 問題背景
Sweeper 首次啟動把 117 個歷史 incident最舊 7 天)全部洗版到 Telegram
用戶反映「所有告警訊息都長得好像」(全部降級 confidence=20%
### 根本原因鏈
1. **Sweeper key bug**: 檢查 `decision:INC-*`(不存在),沒有設置 done marker → 每輪都認為未分析
2. **CAST SQL bug**: `decision_chain = :dc::json` → asyncpg 語法錯誤 → 學習記錄無法寫入 DB
3. **Age filter 缺失**: 啟動時一次觸發所有歷史 incident → Telegram 洪水
4. **shadow_mode 卡住**: ConfigMap 已改 false但 Pod 在更新前創建 → 載入舊值 true
5. **flywheel stats bug**: `incidents.outcomes` 欄位不存在(應為 `outcome` → stats/summary API 500
6. **Telegram method bug**: `_make_request` 不存在(正確方法名 `_send_request` → 分析完後推送失敗
### 修復 Commits
| Commit | 修復 | 狀態 |
|--------|------|------|
| `20b3fef` | sweeper key format: `sweeper_done:INC-*` marker | ✅ 已部署 |
| `0760315` | CAST SQL + shadow_mode=false | ✅ 已部署 |
| `9bfa6fc` | sweeper 48h 舊案過濾 | ✅ 已部署 |
| `1e86cc2` | flywheel `outcome` 欄位 | ✅ 已部署 `f5e33da2` |
| `f5e33da` | telegram `_send_request` 方法名稱 | ✅ 已部署 `f5e33da2` |
| `381be78` | chore(cd): deploy f5e33da | ✅ CD 完成 |
### E2E 驗證結果(最終確認 `f5e33da2`2026-04-16 02:17 台北)
全 12 節點驗證通過E2E 鏈路完全打通:
```
告警接收 → Incident 建立 → Sweeper 觸發分析
→ decision_analyzing → evidence_snapshot_saved → investigator_done
→ agent_debate_start → agent_debate_done → agent_session_recorded
→ telegram_decision_pushed
```
36 個 incident 均完整走過 7 節點流程。零 `AttributeError`,零 sweeper 洪水。
### 其他改善
- KM 16 筆缺漏 embedding → 補齊867/867 全有向量)
- AIOPS_P4_SHADOW_MODE=false 生效rollout restart + 新 pod 確認)
- proactive_inspector: shadow_mode=falseanomalies=0系統健康
---
## 📍 2026-04-15 深夜 — AI 自主化飛輪 Phase 4-6 全完成 + 生產全開 🎉
### Phase 4 異常偵測升級commit 14a0226ADR-084
| 成品 | 路徑 |
|------|------|
| TrendPredictor | `services/trend_predictor.py` — statsmodels ARIMA 趨勢預測 |
| ProactiveInspector | `services/proactive_inspector.py` — 主動巡檢L1-L4 四層) |
| 8D 感官升級 | `services/pre_decision_investigator.py` — anomaly_context 增強 |
### Phase 5 修復抽象化commit 655d1a5ADR-086
| 成品 | 路徑 |
|------|------|
| BlastRadiusCalculator | `services/blast_radius_calculator.py` — CRITICAL/HIGH/MEDIUM/LOW 分控 |
| DeclarativeRemediation | `services/declarative_remediation.py` — dry-run → apply 分階段 rollout |
| GitOpsPRService | `services/gitops_pr_service.py` — 自動 PR 生成 IaC 修復 |
| RollbackManager | `services/rollback_manager.py` — 自動回滾策略 |
| DecisionManager 接線 | `AIOPS_P5_BLAST_RADIUS_CHECK` gate 守衛 |
### Phase 6 自我治理閉環commit 05b7743 + 77a92eb
| 成品 | 路徑 |
|------|------|
| AiSloCalculator | `services/ai_slo_calculator.py` — SLO 計算器 |
| TrustDriftDetector | `services/trust_drift_detector.py` — 信任度漂移偵測 |
| KbRotCleaner | `jobs/kb_rot_cleaner.py` — 知識庫腐爛清理 Job |
| 自我降級引擎 | `services/decision_manager.py` 接線 |
| SLO REST API | `api/v1/ai_slo.py` — GET /api/v1/ai/slo |
| OfflineReplayService | `services/offline_replay_service.py` — 離線回放驗證 |
| ModelRollbackService | `services/model_rollback_service.py` — 模型回滾機制 |
| DB 表 | `db/models.py` AiGovernanceEvent + 3 index |
### P1-P6 全開commit 76558a3
```
AIOPS_P1_ENABLED=True ... AIOPS_P6_ENABLED=True全部
Nemotron 接線 + offline replay loop 啟動
```
### 生產修補全開後2026-04-15 深夜)
| Commit | 修復內容 |
|--------|---------|
| `85c4e3b` | KM 寫入全為 unknown 根因alertname/affected_services/category 三節點) |
| `ecfb714` | YAML 規則引擎與自動執行路徑核心斷點接通 |
| `3696fb5` | host_resource 誤發 K8s kubectl + 自動執行重複風暴 |
| `67f4370` | 四個生產致命 bugoutcome 寫入/OpenClaw/Telegram/LLM 規則顯示) |
| `256a24e` | drain3/statsmodels 依賴補入 + warmup skip 舊資料 |
| `c05bac6` | Playbook seed tuple unpack + text[]→jsonb migration |
| `da871fc` | AIOps P1/P2/P6 migration SQL 補齊(已 prod 套用) |
### 技術債(下次 Sprint
- `send_notification()` 未私有化raw text bypass 可能)
- `approval_repository.py:find_by_fingerprint()` 無 TTL
---
## 📍 2026-04-15 — AI 自主化飛輪 Phase 0 防護欄建立
### 完成項目
| 成品 | 路徑 | 說明 |
|------|------|------|
| MASTER v2 藍圖 | `docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md` | §0-§8 全填完1456 行7 Phase 完整規劃 |
| ADR-080 | `docs/adr/ADR-080-ai-autonomy-flywheel-overview.md` | 7 Phase + 4 北極星 + 7 架構師 Review Gates |
| Feature Flags | `apps/api/src/core/feature_flags.py` | P1~P6 全 False + 15 細粒度子開關 |
| Jobs 模組 | `apps/api/src/jobs/__init__.py` | Jobs 目錄初始化 |
| 基線快照 Job | `apps/api/src/jobs/baseline_snapshot.py` | 拍攝飛輪啟動前 6 大指標現況 |
| HARD_RULES v1.9 | `docs/HARD_RULES.md` | 新增 Phase 退出條件鐵律 |
### Phase 0 基線數值(待 baseline_snapshot 執行後填入)
| 指標 | 現況(預估) | Phase 6 目標 |
|------|------------|------------|
| MCP 呼叫/24h | 0 | > 0 |
| Playbook avg_confidence | ~0.3(靜態) | 動態 EWMA |
| 學習閉環觸發率 | 0% | ≥ 99% |
| general 告警比例 | ~41% | < 10% |
| RESTART 修復比例 | ~68% | < 40% |
| 自動執行成功/24h | 0 | > 0 |
### 下一步
- 統帥 review ADR-080 + MASTER v2 → 批准後 Phase 1 開工
- Phase 1: PreDecisionInvestigator + MCP ToolRegistry + EvidenceSnapshot + PostExecutionVerifier
- 執行 `python -m src.jobs.baseline_snapshot` 拍攝真實基線數字
---
## 📍 2026-04-15 — AI 自主化飛輪 Phase 1 感官縱深建立
### 成品ADR-081
| 成品 | 路徑 | 說明 |
|------|------|------|
| DB Model | `apps/api/src/db/models.py` | IncidentEvidence 表8D 感官 + 執行前後狀態 + 驗證結果) |
| EvidenceSnapshot | `apps/api/src/services/evidence_snapshot.py` | 不可變快照build_summary() 組裝 LLM 上下文 |
| SanitizationService | `apps/api/src/services/sanitization_service.py` | Prompt Injection 0-tolerance12 pattern+ 敏感詞遮罩 |
| MCPToolRegistry | `apps/api/src/services/mcp_tool_registry.py` | 動態工具登記冊suggest_tools() 不寫死告警類型 |
| PreDecisionInvestigator | `apps/api/src/services/pre_decision_investigator.py` | 8D 並行感官蒐集P99 < 8sRedis 30s 快取 |
| PostExecutionVerifier | `apps/api/src/services/post_execution_verifier.py` | 執行後 K8s 收斂等待 + 三態評估success/degraded/failed |
| decision_manager 接線 | `apps/api/src/services/decision_manager.py` | AIOPS_P1_PRE_DECISION_INVESTIGATOR flag 守衛 |
| approval_execution 接線 | `apps/api/src/services/approval_execution.py` | AIOPS_P1_POST_EXECUTION_VERIFIER fire-and-forget |
### 測試覆蓋
| 測試檔 | 數量 |
|--------|------|
| test_sanitization_service.py | 28 |
| test_mcp_tool_registry.py | 33 |
| test_pre_decision_investigator.py | 28 |
| test_post_execution_verifier.py | 22 |
| **總計** | **111 新增Phase 1130 全數通過** |
### Gate 1 修復4 項)
1. `evidence_snapshot.py`: rowcount < 1 → warning log靜默零行更新
2. `post_execution_verifier.py`: 移除裸 `"error"` failure signal防 error_rate key 誤判)
3. `pre_decision_investigator.py`: D4/D5/D7/D8 補 sanitize_dict_valuesPrompt Injection 0-tolerance
4. `feature_flags.py`: 補充 Pod 重啟才能 hot-reload flags 說明
### 下一步
- ~~Phase 2: 5 Agent 骨架 + Orchestrator + AgentSession DB~~ → **✅ 完成commit d316221**
---
## 📍 2026-04-15 深夜 — AI 自主化飛輪 Phase 3 學習閉環重建完成
### 成品ADR-083commit 7da64ea → Gitea
| 成品 | 路徑 | 說明 |
|------|------|------|
| fire-and-forget 修復 | `services/approval_execution.py` | `create_task``await asyncio.wait_for(timeout=30)` × 2 處(成功 + 失敗路徑) |
| matched_playbook_id 欄位 | `models/approval.py` | `ApprovalRequestBase` 新增auto_execute 路徑填充 |
| _auto_execute 傳遞 | `services/decision_manager.py` | `token.proposal_data.get("playbook_id")``ApprovalRequest.matched_playbook_id` |
| 雙路徑查找 | `services/learning_service.py` | `matched_playbook_id` + `metadata` fallback |
| trust_score 欄位 | `models/playbook.py` | 新增 `trust_score: float = 0.3`EWMA 動態信任度) |
| 2x EWMA 更新 | `repositories/playbook_repository.py` | 成功 α=0.1、失敗 α=0.2trust < 0.1 → 警告 |
| Evolver Agent | `services/playbook_evolver.py` | 低信任封存 + 休眠封存 + Jaccard 相似合併(新建) |
| ADR-083 | `docs/adr/ADR-083-learning-loop-reconstruction.md` | 學習閉環重建決策紀錄 |
| MASTER §8 | `docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md` | Phase 3 完工追加 |
### 根因修復對照
| 根因 | 修復前 | 修復後 |
|------|--------|--------|
| 學習觸發率 | 0%GC 隨時取消) | ≈100%await + 30s 熔斷) |
| Playbook EWMA | 永遠停在 0.3 | 每次執行後動態更新 |
| 負向懲罰 | 無 | 失敗 2x 衰減(α=0.2 |
| 知識庫管理 | 無退場機制 | Evolver 自動封存低信任 |
### 架構狀態
```
AIOPS_P3_ENABLED=False預設— 骨架就位,等統帥批准後開啟
AIOPS_P3_EVOLVER_ENABLED=False — Evolver 定時 job 等統帥批准
學習路徑ApprovalRequest.matched_playbook_id → learning_service → playbook_repository.update_stats(EWMA)
```
### 下一步
- Gate 3 架構審查(首席架構師 Review Phase 3
- 開啟 `AIOPS_P3_ENABLED=True` 後 E2E 驗證
- Phase 4 異常偵測升級(依賴 Phase 3 穩定)
---
## 📍 2026-04-15 深夜 — AI 自主化飛輪 Phase 2 多 Agent 協作骨架上線
### 成品ADR-082commit d316221
| 成品 | 路徑 | 說明 |
|------|------|------|
| Protocol 型別系統 | `apps/api/src/agents/protocol.py` | 5 Agent 共用資料契約dataclass不可變 |
| DiagnosticianAgent | `apps/api/src/agents/diagnostician_agent.py` | RCA 偵探confidence < 0.4 → ABSTAIN |
| SolverAgent | `apps/api/src/agents/solver_agent.py` | 修復軍師blast_radius 評分 + 降級 mock |
| ReviewerAgent | `apps/api/src/agents/reviewer_agent.py` | 安全審查HARD_RULES 靜態 regex + blast_radius 閾值 |
| CriticAgent | `apps/api/src/agents/critic_agent.py` | 刻意唱反調,強制 3 問批判critical → REJECT |
| CoordinatorAgent | `apps/api/src/agents/coordinator_agent.py` | 純規則聚合(無 LLM6 級決策閘 |
| AgentOrchestrator | `apps/api/src/services/agent_orchestrator.py` | 30s 全局超時Reviewer‖Critic 並行DB + Redis Streams |
| DecisionManager 接線 | `apps/api/src/services/decision_manager.py` | `is_phase_enabled(2)` gate + `_package_to_proposal_data` 橋接 |
| AgentSession DB 表 | `apps/api/src/db/models.py` | Immutable Event Sourcing4 複合 index |
| ADR-082 | `docs/adr/ADR-082-multi-agent-collaboration.md` | 架構決策紀錄 |
### Gate 2 修復7 項)
| 嚴重度 | 問題 | 修復位置 |
|--------|------|---------|
| CRITICAL | DELETE FROM regex lookahead 位置錯誤,攔到安全語句、放行危險語句 | reviewer_agent.py:58 |
| CRITICAL | REQUEST_REVISION 可抵達 auto-executeSolver 未修訂不可執行) | coordinator_agent.py |
| IMPORTANT | `_extract_json` flat regex 不支援巢狀 JSON所有 Agent LLM 解析靜默失敗 | base.py:167 |
| IMPORTANT | `all_degraded` 遺漏 `verdict.degraded`Reviewer 熔斷不被感知 | coordinator_agent.py |
| IMPORTANT | Solver ABSTAIN guard 放行降級假設confidence=0.2 觸發 LLM | solver_agent.py:72 |
| IMPORTANT | `dataclasses.asdict()` 保留 Enum 實例,所有 DB 審計寫入靜默失敗 | agent_orchestrator.py |
| IMPORTANT | P2 gate 直讀屬性繞過父 Phase 守衛(應用 `is_phase_enabled(2)` | decision_manager.py |
### 架構狀態
```
AIOPS_P2_ENABLED=False預設— 骨架就位,等統帥批准後開啟
執行路徑EvidenceSnapshot → Diagnostician → Solver → (Reviewer‖Critic) → Coordinator → DecisionPackage
全局超時30s單 Agent5s降級後繼續不阻塞 Coordinator
```
### 下一步
- Phase 2 測試:`test_agent_protocol.py` / `test_agent_orchestrator.py` / 各 Agent 單元測試
- 或 統帥指示進入 Phase 3學習閉環重建
---
## 📍 2026-04-14 午夜 — Phase 5 分類按鈕完整化全數上線
**Sprint 5.0 → 5.4 全數完成**26 個 commits 推版:
| Sprint | 產出 | Commit |
|--------|------|--------|
| 5.0 規格 | callback_action_spec.yaml (24 actions) | `2e2f5a1` |
| 5.1 Dispatch 框架 | TelegramGateway._dispatch_category_action | `581b244` |
| 5.2 MCP 接入 | dispatcher 真實 MCP registry + internal + graceful | `208c28e` |
| 5.3 寫類 + audit | Step 1.9 nonce 路由 + Multi-Sig 守衛 | `de8bbd8` |
| 5.4 動態按鈕 | `_build_inline_keyboard` 從 registry 生成 | `a92562d` |
**Bug A/B 深查**
- Bug B LLM timeout 硬編 120s/130s 真修 `36754a8`openclaw.py 改用 OPENCLAW_TIMEOUT=30s
- Bug A approval.incident_id NULL 加診斷 log等 live-fire 抓真因)
**按鈕從死變活**
- 原 28 死按鈕callback 格式錯 + 0 handler已下架
- 新動態按鈕:從 yaml 生成spec 決定格式nonce/infoMCP dispatcher 真執行
- 完整 audit log + reply_to 原卡片
---
## 📍 2026-04-14 深夜收官 — GAP-A4 解開 8.3h 飛輪沉默 + 技術債處理
**真兇逮到**GAP-A4 規則模板 placeholder 解析缺漏
- Log 顯示大量 `auto_execute_blocked_unresolved_placeholder`
- target 退回 alertname / unknown / IP:port → 垃圾 kubectl 指令
- GAP-A1 防注入閘盡責攔下 → 自動修復路徑卡死 → 飛輪沉默
**修復 `10b74af`**(三層防護):
1. `_strip_pod_suffix()` — Deployment/StatefulSet/Legacy pod 三種格式
2. `_is_bad_target()` — 垃圾識別(空/unknown/alertname/IP:port/含空白)
3. `_extract_vars()` 多層 label 查找deployment > app > statefulset > pod > container
4. `match_rule()` 後置雙驗證bad target + 殘留 placeholder
**測試**33 個新 GAP-A4 測試 + 214/214 回歸全綠
**技術債處理**:
- ✅ report_generation 重試機制3 次指數退避 + 失敗降級通知)`下一 commit`
- 🟡 DEFER: QueryBuilder 抽象YAGNI僅 1 處用 JSON path query
- ✅ E2E 測試GAP-A4 TestMatchRuleRejection 全流程覆蓋 + Mission C prod 實測)
---
## 📍 2026-04-14 深夜 — MASTER 藍圖 11/11 Task 全部完成 🏆
**結案文件**
- [docs/reports/2026-04-14-MASTER-BLUEPRINT-CLOSURE.md](reports/2026-04-14-MASTER-BLUEPRINT-CLOSURE.md)
- [docs/adr/ADR-077-master-blueprint-completion.md](adr/ADR-077-master-blueprint-completion.md)
**本日 9 commits 完整清單**
`cc42aa0 → aae7c12 → 43c9689 → dedd7c2 → dd0a778 → 0f48a50 → b8b124c → 8de807c → f54dea4`
**Phase 4自動報告系統完成**
- Task 4.1 日度巡檢報告:`run_daily_report_loop` 已啟動(`daily_report_next_in: 48993s`,明早 08:00 台北)
- Task 4.2 Postmortem 自動組裝:`incident_service.resolve_incident` hook `8de807c`
- f54dea4 修復 DB 欄位 bugApprovalRequestRecord/PlaybookRecord → 實際 IncidentRecord.outcome + Redis playbook_service
**架構審查**CONDITIONAL PASSdecision_manager Tier 3 審查紀錄入 ADR-077
**通訊渠道**:全走 TelegramSMTP 不需要
---
## 📍 2026-04-14 傍晚 — MASTER 藍圖 P0+P1 全綠 + E2E 實彈驗證
**本日新增 6 commitscc42aa0 → dd0a778 → 0f48a50 CD**
- `cc42aa0` — GAP-A23 告警規則 gitea/ssl/external_site+ GAP-A1validate_kubectl_command + 34 測試)
- `aae7c12` — GAP-C3SSH 修復 KM 萃取 + 18 測試)
- `43c9689` — 4 份治理文件Alert Taxonomy / AI Model Cards / Postmortem Template / On-Call Handbook
- `dedd7c2` — BP-1 B.1 KM 萃取品質精修(`_write_execution_result_to_km` 區分自動/人工 + 富化元資料)
- `dd0a778` — GAP-B4 LLM 超時降級扶梯(內層 25s + NemoClaw 3s🔴 Tier 3 紅區
- `0f48a50` — CD deploy dd0a778
**MASTER 藍圖 P0+P1 全部完成**含驗證已實作GAP-C2 retry, GAP-D1 trust feedback, GAP-A3 alert grouping
**E2E 實彈射擊Mission C**
- `KubePodCrashLooping` via `/webhooks/alertmanager` → LLM(ollama, 1582t) → Playbook `high-cpu-restart` 相似度 39% → `incident_resolved_after_auto_repair` → Telegram msg 20723 → KM 1 筆(`km_conversion_service` 路徑寫入)
- **發現 KM 雙路徑設計** → 建立 [feedback_km_dual_path_design.md](memory/feedback_km_dual_path_design.md)
**測試全綠**152/152 tests passed
**剩餘 Backlog**(明日推進):
- GAP-D5 自動報告生成(需 APScheduler
- project_current_status.md 小型 BacklogWebSocket 重連、Blackbox E2E、flywheel-alerts.yaml Docker 方式)
---
## 📍 當前狀態 (2026-04-14 早上 — aae7c12 ✅)
**本次 session 完成Task 3.3**
- `approval_execution.py``_trigger_playbook_extraction`: 寫入 `approval.action → outcome.learning_notes`
- `playbook_service.py``_parse_ssh_command()` + `_extract_repair_steps()` SSH 路徑 + `[SSH]` name prefix + ssh/host_layer tags
- `test_playbook_ssh_extraction.py` — 18 新測試794 通過0 失敗)
**飛輪雙手對齊**
- kubectl 路徑:`decision_chain.reasoning_steps → KM` ✅(既有)
- SSH 路徑:`approval.action → learning_notes → SSH RepairStep → KM`Task 3.3 新增)
**剩餘(純文件)**
| 文件 | 路徑 | 狀態 |
|------|------|------|
| 告警分類目錄16 類) | docs/reference/ALERT-TAXONOMY-CATALOG.md | 待辦 |
| AI Model Card5 模型)| docs/ai/AI-MODEL-CARDS.md | 待辦 |
| Postmortem 模板 | docs/templates/POSTMORTEM-TEMPLATE.md | 待辦 |
| On-call Handbook | docs/operations/ON-CALL-HANDBOOK.md | 待辦 |
---
## 📍 前次狀態 (2026-04-14 — Task 2.2+2.3 完成cc42aa0 ✅)
**本次 session 新增Task 2.2 + Task 2.3**
- `alert_rules.yaml` — 新增 3 類規則gitea_down/ssl_cert_expiring/external_site_down共 24 條
- `alert_rule_engine.py``validate_kubectl_command()` 阻擋 delete pvc/namespace/drain/replicas=0/rm-rf/DROP TABLE/$() 注入,整合進 `match_rule()`
- `test_alert_rule_engine_validation.py` — 34 新測試776 通過0 失敗)
**待完成(剩餘工作清單)**
| 項目 | 類型 | 狀態 |
|------|------|------|
| Task 3.3: SSH 修復 KM 萃取playbook_service.py| 代碼 | 待辦 |
| `docs/reference/ALERT-TAXONOMY-CATALOG.md` | 文件 | 待辦 |
| `docs/ai/AI-MODEL-CARDS.md` | 文件 | 待辦 |
| `docs/templates/POSTMORTEM-TEMPLATE.md` | 文件 | 待辦 |
| `docs/operations/ON-CALL-HANDBOOK.md` | 文件 | 待辦 |
| CD 部署 cc42aa0 驗證 | E2E | 觀察中 |
| 首次日度報告08:00 台北)| E2E | 等待中 |
---
## 📍 前次狀態 (2026-04-14 — P0 文件補建完成,護城河已部署 e778e4d ✅)
**本次 session 新增2 份 P0 業界標準文件)**
- `docs/slo/SLO-SLI-DEFINITION.md` — 5 個 SLI + SLO 目標值表 + Error Budget 規則 + 里程碑
- `docs/operations/HUMAN-IN-THE-LOOP.md` — 9 種觸發條件 + Kill Switch + Fail-safe 逾時行為 + SOP
**護城河狀態**量尺SLO+ 煞車HITL均已就位配合 684d6cf 的聚合/重試/報告代碼
**觀察中**:等明日 08:00 台北時間日度報告推送,驗證 684d6cf E2E
**下一步**(優先級順序):
1. 等 CD 部署並觀察 E2E
2. Task 2.2alert_rules.yaml 補 3 類規則storage/devops_tool/external_site
3. Task 2.3alert_rule_engine.py kubectl 注入防護
4. Task 3.3SSH 修復 KM 萃取
---
## 📍 前次狀態 (2026-04-14 — 戰術 B 四大 Task 全部完成675 tests ✅)
**本次 session 新增4 Task6 檔案75 新測試)**
- `feat(adr-076): Task 2``alert_grouping_service.py` — 5分鐘滑動視窗告警聚合引擎 + 16 tests
- `feat(adr-076): Task 3``approval_execution.py` — 執行失敗重試MAX_RETRY=2, 30s, 瞬態/永久分類)+ 29 tests
- `feat(adr-076): Task 4``report_generation_service.py` — 日度巡檢報告(08:00台北) + Postmortem + 30 tests
- `webhooks.py` — ADR-076 聚合邏輯整合(指紋後/LLM前
- `main.py` — 日度報告迴圈掛進 lifespan
**測試**: 600 → 675 通過(+7510 skipped0 failed
**下一步**git push gitea main → Pod 部署驗證 → 觀察 E2E
---
## 📍 前次狀態 (2026-04-14 — MASTER AIOps Blueprint 完成,等待統帥批准)
**本次 session 新增(無 commit純文件工作**
- `docs/superpowers/plans/2026-04-14-MASTER-aiops-full-automation-blueprint.md` — 整合4份計畫文件的主計畫書 v1.0
- Memory: `aiops_current_architecture_diagnosis.md` — 完整架構診斷報告
**飛輪現況**: Pod 38ff2bb飛輪 83% 完整4 Phase 等待批准後實作
**業界標準文件缺口**已識別尚未建立SLO/SLI、AI Model Card、Human-in-Loop Spec、Alert Taxonomy Catalog、Configuration Reference
**下一步**:等統帥批准 MASTER 計畫書後,開始 Phase 1 實作
---
## 📍 前次狀態 (2026-04-14 — 飛輪 Bug 修補完成,全面部署 38ff2bb ✅)
**本次 session 修補6 commits全已部署Pod 跑 38ff2bb**
- `38ff2bb` heartbeat → ADR-075 TYPE-1 格式INFO 樹狀結構)
- `f1face4` HostHighCpuLoad 獨立規則 → NO_ACTION停止 kubectl scale unknown
- `1a4b52e` fingerprint 加 alertname 防跨告警指紋衝突 + 心跳分類補入
- `b17a677` gitea webhook analysis.model_dump() dict bug
- `0c88f67` DIAGNOSE 強制 deepseek-r1:14b不用 gemma3:4b
- `09134f5` incident.title bug + DIAGNOSE→NEMOTRON confidence=0.0 修復
**飛輪狀態**規格書層次一二三四全完成ADR-075 全完成,本次額外修補已補齊
**下一步**:觀察自動修復 E2E或繼續 ADR-075 Phase 3Prometheus 規則)
---
## 📍 前次狀態 (2026-04-12 深夜 — ADR-075 Phase 1+2+CR 全完成git push gitea main ✅)
**ADR-075 全部完成**3 commits: 2cef209 → 561c1d8 → 1cb654c
Phase 14 斷點修復):
- ✅ 斷點 A: decision_manager 提取 alert_category → send_approval_card
- ✅ 斷點 B: send_approval_card 新增參數 → _build_inline_keyboard
- ✅ 斷點 C: 互動型通知(TYPE-3/4/4D/8M)禁止發 SRE 群組
- ✅ 斷點 D: k8s_workload → kubernetes + 6 新類按鈕組
- ✅ classify_alert_early: 13 條規則7 新分類52 tests
Phase 2TYPE-8M
- ✅ send_meta_alert() ⚙️ META SYSTEM 卡片
- ✅ decision_manager TYPE-8M elif 分支
CR 修補:
- ✅ P0-2: NotificationType.TYPE_8M 加入 enum + classify_notification 早期回傳
- ✅ P1-1: 移除 _CATEGORY_BUTTONS 死碼
- ✅ P1-4: 測試 docstring 更新 13 條規則
- 664 tests all pass
**下一步**ADR-075 Phase 3Prometheus 規則),或評估下一個 ADR
---
## 📍 前次狀態 (2026-04-12 — 層次三+四全部完成CD 推送中)
**系統狀態**: ADR-073 Phase 1-4 ✅ | ADR-074 M1-M5 ✅ | ADR-073-C C1-C4 ✅ | git push gitea main ✅
**Phase 1 完成清單**:
- ✅ 1-1~1-3: Harbor 確認 + kustomization→105998d + ArgoCD sync
- ✅ 1-4: Pod image 105998d 已驗證
- ✅ 1-5: `_collect_mcp_context` 存在 Pod
- ✅ 1-6: debounce 5→30 min
- ✅ 1-7: alertname NULL 根因修復signals JSONB alias
- ✅ 1-8: cold_start_playbooks.py — Playbooks 0→15
- ✅ 1-9: batch_vectorize_km.py — 711/713 KM 向量化
**架構修復**:
- ArgoCD ignoreDifferences 移除image 更新路徑修通)
- B5 CI break-glassTODO 2026-04-13 恢復)
**Phase 2 完成清單**:
- ✅ 2-1: DB Migration — alertname column 新增 (已在 Pod 執行)
- ✅ 2-2: classify_alert_early() — 6 條規則 config_drift/info/backup/infra/k8s/db/general
- ✅ 2-3: _try_auto_repair_background() outcome 寫入點
- ✅ 2-4: create_incident_for_approval() notification_type/alert_category 寫入
- ✅ 2-5: 134 筆 alertname NULL → 0 回填完成
**下一步**: Phase 3Tier 3 — 首席架構師授權後執行)
---
## 里程碑摘要(壓縮版)
| 日期 | 里程碑 | commit |
|------|--------|--------|
| 2026-04-08 | Sprint 5.1 資料安全護欄完成Guardrail BLOCK/HITL/MultiSig| 88696db/0f5fecf |
| 2026-04-10 | ADR-068 飛輪閉環 E2E 驗收HostHighCpuLoad→PB-20260406| — |
| 2026-04-10 | ADR-067 五大 Ollama 應用全完成Phase 30-34| — |
| 2026-04-10 | B5 CI 整合測試 640 通過 | — |
| 2026-04-11 | ADR-070 全自動 AIOps 閉環MCP 10 providers| a2cc985 |
| 2026-04-11 | ADR-071 A-J Telegram 通知卡片 10 種 | 1ec1965 |
| 2026-04-11 | ADR-072 Bug 修復 P0-P2 全完成 | f34fe19 |
| 2026-04-11 | MCP Security Code Review P0/P1/P2 全修補 | f323633 |
| 2026-04-11 | ADR-069 基礎設施重建 Sprint A/B/C 全完成 | — |
| 2026-04-11 | D1 models.json v1.3.09 purpose keys| f2c18c4 |
| 2026-04-11 | M3 alertname_to_type 抽至 constants | 1ede9f9 |
| 2026-04-11 | I1 ADR-064 Rule Engine get_incident_type() 整合 | 615822d |
| 2026-04-11 | ArgoCD MCP 連線修復IP 120:30443| f23176c |
| 2026-04-11 | 首席架構師 CR Round 1 — get_incident_type rule.id bug + 11 tests | d77b2ad |
| 2026-04-11 | ADR-070 全自動化三大修復auto_approve/MCP context/target| c439277 |
| 2026-04-11 | 首席架構師 CR Round 2 — Tier 3 ternary/timeout/DESTRUCTIVE_PATTERNS + 25 tests | 8be87b0 |
| 2026-04-12 | SSH MCP 188/110 連通驗證authorized_keys 確認 | 796517f |
| 2026-04-12 | fix(test): integration 測試排除pytest addopts618 單元測試全通過 | 6e0ee8b |
| 2026-04-12 | refactor: I2 DI 化 MCP Providers + config list bug + model_regression integration | 184b37a/a67a27f |
| 2026-04-12 | docs(spec): AIOps 飛輪全面修復整合規格書 v1.0(四層方案+監控缺口+ADR-074| 77771c1 |
| 2026-04-12 | docs(adr): ADR-073 補充 ADR-071 整合工作序 + ADR-074 Sprint | f2b427d |
| 2026-04-12 | docs(spec): v2.2 §15 Subsystem 1 四階段路線圖(截圖定案)| d3ddaaf |
| 2026-04-12 | docs(spec): 規格書 v2.0 — 四階段細化實施步驟 + 防偏差守則(等待批准)| — |
| 2026-04-12 | fix(flywheel): Phase 1 — kustomization→8be87b0 + debounce 30min + alertname NULL | 7c4b36c |
| 2026-04-12 | fix(ci): Break-Glass — B5 flaky PG test bypass解封 P0 飛輪部署 | 105998d |
| 2026-04-12 | fix(argocd): 移除 ignoreDifferences image修復 GitOps image 更新斷路 | — |
| 2026-04-12 | feat(flywheel): Phase 1 完成 — 15 Playbooks 冷啟動 ✅ | 711/713 KM 向量化 ✅ |
| 2026-04-12 | feat(flywheel): Phase 2 完成 — classify_alert_early + outcome寫入 + 134筆回填 | 54efa30/97fc49a |
| 2026-04-12 | feat(flywheel): Phase 3 完成 — Tier 3 七大修復 (首席架構師授權) | dbc77c5 |
| 2026-04-12 | feat(flywheel): Phase 4 完成 — KM conversion hook + daily vectorize cron | f2fc471 |
| 2026-04-12 | feat(adr-074): M1 飛輪 Prometheus Exporter + M2 主機網路監控 | 16d6823 |
| 2026-04-12 | fix(cr): ADR-073 CR P0/P1/P2 全修補 + B5 CI 0收集修復 | e770813/c09521a |
| 2026-04-12 | feat(m3-m5): ADR-074 M3 CI Webhook + M4 備份驗證 + M5 詳細告警 | 3489e05~ec6a341 |
| 2026-04-12 | feat(c2-c4): ADR-073-C 前端飛輪 KPI+WebSocket+介入路徑視覺化 | 4b51f9b~9b1812c |
---
## ADR-073 飛輪完整盤點2026-04-12
| 項目 | 發現 |
|------|------|
| Playbooks | **0** — 飛輪從未冷啟動 |
| EXECUTION_SUCCESS | **2/3800.5%** — 自動修復幾乎從未成功 |
| KM vectorized | **全部 False699 筆)** — RAG 無法查詢歷史案例 |
| alertname in DB | **全部 NULL** — signals JSONB 結構問題 |
| debounce window | **5 分鐘**(應 30 分鐘)— 同一問題反覆重建 Incident |
| 8be87b0 部署 | ❌ CD 失敗未上線 — 三大修復未生效 |
| ADR-073 | 已寫入 `docs/adr/ADR-073-flywheel-full-audit.md`,等待統帥批准後實作 |
---
## 2026-04-15 深夜 — P0 告警靜默根治 + Phase 6 自我治理閉環收官
### P0 告警靜默 RCA
| 根因 | 影響 | commit |
|------|------|--------|
| `approval_db.py` PENDING 無 TTL殭屍記錄 hit_count=77/30/17 | Telegram 完全靜默 | fab65e7 |
| `create_approval_with_fingerprint()` expires_at=NULL | 自動過期邏輯形同虛設 | f31b4e3 |
| `openclaw.py:897` DIAGNOSE require_local=Truev4.3 未同步)| 所有 DIAGNOSE privacy_skip 無聲失敗 | 3ce5025 |
緊急處置kubectl 直接過期 7 筆殭屍 ApprovalRecord
### P2 飛輪斷鏈 + asyncpg CrashLoop 修復
| 修復 | commit |
|------|--------|
| `approval_timeout_resolver.py` 新建:逾期 PENDING → EXPIRED + resolve_incident | f045506 |
| `anomaly_counter.py` + `incident_service.py`timeout_ignored disposition | f045506 |
| `db/base.py` asyncpg 多指令 CREATE INDEX 拆分 | f9ba200 |
### Phase 6 自我治理閉環 — 全部完成
| 元件 | 檔案 |
|------|------|
| AI SLO 計算器 | `services/ai_slo_calculator.py` |
| Trust Drift 偵測器 | `services/trust_drift_detector.py` |
| KB Rot 清理 Job | `jobs/kb_rot_cleaner.py` |
| 自我降級引擎 | `services/decision_manager.py` |
| SLO REST API | `api/v1/ai_slo.py`GET /api/v1/ai/slo |
| DB 表 + Migration | `db/models.py` AiGovernanceEvent + 3 index |
附帶修復心跳停用已轉發另一群組、ai_router.py 通知改 ADR-075 格式
**下一步:** `send_notification` 私有化(封死 raw text bypass
---
## 已知技術債(下 Sprint 評估)
| 項目 | 說明 |
|------|------|
| NetworkPolicy ClusterIP 10.43.16.201/32 | ArgoCD 重裝需更新 |
| `_collect_mcp_context` Provider 直接實例化 | ✅ 已 DI 化I2184b37a |
| B3 Phase 15.5 Trace Context UI | 統帥裁示暫緩 |
| A-3 bitan Docker 化 | P3 低優先 |
| `approval_repository.py:find_by_fingerprint()` 無 TTL | 非熱路徑latent bug下次重構修 |
| `send_notification()` 未私有化 | 任何 caller 可 bypass 格式 — 下次 PR |
---
## 2026-04-15 深夜(台北)— Phase 3 學習閉環全部落地
### Phase 3 Root Cause 修復完成
| 修復 | commit |
|------|--------|
| Root cause 3驗證結果→學習 + 診斷 feedback + 知識遺忘 + Fine-tune 管線 | fb1bbd0 |
| AgentSession 學習接線record_agent_session() + orchestrator 辯證訊號 | 66c4eda |
| Evolver loop 排程 + POST /api/v1/learning/evolver/run 演練端點 | 4718c76 |
| Evolver force=True bypass flag + import 清理 | 01fb531 e5e94f5 |
### Phase 3 全部新增元件
| 元件 | 檔案 |
|------|------|
| Root cause 3 接線 | `services/approval_execution.py``record_verification_result()` |
| 驗證/診斷/AgentSession 學習 | `services/learning_service.py` 三個新方法 |
| 知識遺忘 Job | `jobs/knowledge_decay_job.py`(每日 30d 清除) |
| Fine-tune 管線 | `services/finetune_exporter.py`(每週 Alpaca JSONL |
| Evolver 每日 Loop | `services/playbook_evolver.py:run_evolver_loop()` |
| Evolver 演練端點 | `api/v1/learning.py:POST /learning/evolver/run` |
### Phase 3 退出條件
- [x] Root cause 1/2/3 全部修復
- [x] 2x EWMA + Evolver + 診斷 feedback
- [x] AgentSession 學習接線
- [x] 知識遺忘 + Fine-tune 管線
- [x] Evolver 演練端點部署完成
- [x] Evolver 演練 1 次成功HTTP 200 errors:[] ✅ 2026-04-15 21:20 台北)
- [ ] 生產 7 天監控trust_score 更新、JSONL 累積、null 率)
**下一步:** 7 天生產觀察 Phase 3 退出條件2026-04-22 檢查點)
---
## 2026-04-20 晚(台北)— C1-C4 全流程串接 — Playbook 自動修復鏈路保護
**觸發**:統帥要求全景盤查所有 AI 自動化節點後,發現 Playbook 鏈路有 3 個結構性斷點。
### 斷點清單 → 修復
| # | 斷點 | 根因 | 檔案 | 修復 |
|---|------|------|------|------|
| C1 | evolver 封存 yaml_rule playbooks → 自動修復鏈路斷 | `_archive_low_trust` / `_archive_dormant``YAML_RULE` guard | `playbook_evolver.py` | `if pb.source == PlaybookSource.YAML_RULE: continue` |
| C2 | seeder 不復活已封存 yaml_rule | idempotency SQL 包含 DEPRECATED 記錄 | `playbook_seed_service.py` | SQL 加 `AND status != 'deprecated'` |
| C3 | AI 新規則不即時建立 Playbook等重啟 | `_append_rule_to_yaml` 成功後無 seeder 呼叫 | `alert_rule_engine.py` | 加 `create_task(seed_playbooks_from_rules())` |
| C4 | watchdog 不偵測鏈路斷裂 | W-4 缺失 | `ai_slo_watchdog_job.py` | 加 `_count_approved_playbooks()` W-40 → TYPE-8M |
### Commits
| commit | 說明 |
|--------|------|
| `80aea20` | C1-C4 全流程串接(本機) |
| `de2d34d` | push to Gitearebase 含 ADR-092 四修 `156a52f`|
### 下一步驗收
1. evolver 週期後 → yaml_rule playbooks 仍 APPROVEDC1 保護)
2. 重啟後 → 被封存 yaml_rule playbooks 復活C2 seeder 修復)
3. AI 自動生成新規則 → 立即出現對應 APPROVED PlaybookC3 接線)
4. Watchdog W-4 → APPROVED 數量為 0 時 TYPE-8M 告警C4 感知)
---
## 2026-04-24台北— Playbook 重複建立/封存迴圈根治
**觸發**DB 查詢顯示 `HTTP 5xx 錯誤率過高` Playbook 建立 7 次以上294 筆 deprecated / 25 筆 approved。
### 根因
C1evolver 加 YAML_RULE guard+ C2seeder SQL `AND status != 'deprecated'`)邏輯衝突:
- C1 已讓 evolver 不再封存 YAML_RULE → deprecated 記錄只剩 C1 上線前的歷史垃圾
- C2 讓 seeder「看到 deprecated 就重建」→ 歷史垃圾永遠在 DB → 每次重啟建一筆新 Playbook
- C1 保護新建的 Playbook 不被封存,但 deprecated 歷史記錄不清除 → 無限重建
### 修復
| 檔案 | 修改 |
|------|------|
| `playbook_seed_service.py` | 移除 `AND status != 'deprecated'`,同名 yaml_rule 任何 status 都視為已存在 |
| `playbook_evolver.py` | `_fetch_all_active_playbooks` 改分兩次 status 查詢DRAFT + APPROVED不載入 deprecated |
| `migrations/cleanup_duplicate_deprecated_playbooks.sql` | 每個 name 保留最新一筆 deprecated刪除其餘需手動套用一次 |
### 待手動執行
```bash
psql $DATABASE_URL -f apps/api/migrations/cleanup_duplicate_deprecated_playbooks.sql
```