Files
awoooi/docs/LOGBOOK.md
Your Name bc295eaec2
Some checks failed
Code Review / ai-code-review (push) Has been cancelled
fix(ci): allow user service for gitea host runner
2026-05-01 16:24:45 +08:00

2087 lines
122 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-05-01 | Gitea host runner graceful shutdown guard
承接 `b0da6da1` production deployArgoCD 已 `Synced Healthy` 到 deploy commit `f72419dd`API/worker/web 也都跑新 image但 Gitea commit status 將 `build-and-deploy` 標成 failure、`post-deploy-checks` 卡 pending。Live runner log 顯示 host `act_runner` 在 job 收尾前收到 shutdown且使用預設 `shutdown_timeout=0s`,造成部署已完成但狀態回寫失真。
### 完成
- 新增 `ops/runner/gitea-act-runner-host.service`,讓 110 host-level `act_runner` 由 systemd 管理,不再依賴裸 `nohup` 程序。
- 新增 `ops/runner/gitea-act-runner-host.user.service`,讓沒有 sudo 的維運路徑也能落到 user-level systemd。
- 新增 `ops/runner/install-gitea-host-runner-service.sh`,會把 `/home/wooo/act-runner/config.yaml` 正規化為 `shutdown_timeout: 1h`、安裝 system/user systemd service、停用 Docker-wrapped `gitea-runner` restart policy且在 `GITEA-ACTIONS-TASK-*` 正在跑時拒絕重啟。
- `scripts/reboot-recovery/awoooi-startup-110.sh` 改為優先啟動 `gitea-act-runner-host.service`,並在 reboot recovery 時補上 `shutdown_timeout: 1h`
- `ops/runner/README.md` 補第三層 runner 修復graceful shutdown service 與 status mismatch 根因。
### 驗證
- Live root cause`act_runner generate-config` 顯示預設 `runner.shutdown_timeout: 0s`110 config 當時未覆寫。
- Live deploy stateArgoCD `Synced Healthy f72419dd``awoooi-api`/`awoooi-worker`/`awoooi-web` 均已使用 `b0da6da1` image。
- Live hotfix110 `/home/wooo/act-runner/config.yaml` 已套 `shutdown_timeout: 1h`host runner 重新宣告 labels 成功。
## 2026-05-01 | Agent Loop shadow structured metadata guard
承接 P1 canary 上線後的 production 觀測:`ENABLE_OPENCLAW_AGENT_LOOP_SHADOW=True`、max iteration 2 已在 API pod 生效;`mcp_audit_log` 已有 MCP 呼叫,但尚未看到新的 `openclaw_agent_loop_shadow` production incident log。下一步先讓 shadow 一旦觸發就留下可評估、可治理的結構化結果,而不是直接改主決策。
### 完成
- `OpenClawService._maybe_run_openclaw_agent_loop_shadow()` 會把 Agent Loop raw JSON 正規化到 `agent_loop_shadow.structured`,包含 `root_cause_check``evidence_used``confidence_delta``missing_evidence``human_or_ai_next_step``parse_status`
- shadow metadata 固定 `decision_impact=none`,不覆蓋 `action``risk_level``confidence` 或 Nemotron result。
- canary `confidence_delta` 初期只可落在 `[-0.15, 0.0]`LLM 若回正值會歸零,避免 shadow 被誤用成加信心捷徑。
- ADR-105 與 Tool Integration skill 同步新增 structured shadow guard。
### 驗證
- Production 觀測API pod 內 `agent_loop_shadow True max_iter 2`
- Production 觀測:`mcp_audit_log` 目前 198 筆;最近 sample 仍是既有 sense/govern MCP 路徑,尚無 Agent Loop shadow incident 可評分。
## 2026-05-01 | Agent Loop P1 canary + CD Argo revision gate + SSH MCP 四節點閉環
承接 ADR-105 地基與 production 驗證後的待辦CD 會在 push deploy commit 後誤判上一個 Argo revision 已 Synced/HealthySSH MCP key 尚未授權 120/121Agent Loop 仍只停在 provider capability尚未有 production canary。
### 完成
- Gitea CD `Deploy to K8s (ArgoCD GitOps)` 在 push `chore(cd): deploy ... [skip ci]` 後,會記錄 `DEPLOY_REVISION`,先 annotate `argocd.argoproj.io/refresh=hard`,再等待 `.status.sync.revision == DEPLOY_REVISION` 且 Synced/Healthy超時直接 fail不再讓舊 revision rollout 假成功。
- `ssh-mcp-key` public key 已以一次性 privileged pod 追加到 `mon(192.168.0.120)``mon1(192.168.0.121)``wooo/.ssh/authorized_keys`;臨時 pod 已刪除。
- API pod 內使用 `/run/secrets/ssh_mcp_key` + `/etc/ssh-mcp/known_hosts` 驗證 `wooo@192.168.0.120``wooo@192.168.0.121` 均回 `OK`
- 新增 `ENABLE_OPENCLAW_AGENT_LOOP_SHADOW` / `OPENCLAW_AGENT_LOOP_MAX_ITERATIONS`production configmap 開啟 read-only canary最多 2 輪,本地 Ollama tool_use不改主決策。
- `OpenClawService.generate_incident_proposal_with_tools()` 在原 proposal 成功後執行 read-only Agent Loop shadow investigation只給 Kubernetes/Prometheus/SignOz/Database/RAG/Grafana 的 read-only MCP tools結果附加 `agent_loop_shadow` metadata。
- Agent Loop shadow 失敗只 log warning不阻塞原本 PreDecision/Nemotron/Playbook 路徑。
### 驗證
- `python3 -m py_compile apps/api/src/core/config.py apps/api/src/services/openclaw.py apps/api/src/services/ai_providers/permissions.py` 通過。
- `cd apps/api && pytest tests/test_agent_loop_foundation.py tests/test_openclaw_cache_key.py -q` → 8 passed。
- Production 前置檢查:最新 image `b6cf6167` 健康ArgoCD `Synced Healthy 33a71489`;四節點 SSH MCP key 驗證完成。
## 2026-05-01 | LLM 鬼循環治理 — in-flight lock + stable cache + no-retry 2xx
Claude Code 成本評估指出真正瓶頸不是外部 AI 費用,而是同一告警 0 秒重入、20 秒週期反覆呼叫 LLM、以及 HTTP 500 讓 Alertmanager 立即重試。結論:先修飛輪,再談 Gemini/Groq/Claude 訂閱;健康狀態下外部 provider 只應作為 capped fallback。
### 完成
- Alertmanager 同指紋新告警在排入背景 LLM 前先拿 Redis in-flight lockTTL 10 分鐘;同秒或短時間重複 delivery 不再各自 spawn LLM task。
- Alertmanager grouping 失敗改 fail-open 並留 log不再因聚合服務小故障回 500 造成 Alertmanager retry storm。
- Alertmanager 內部處理例外改成已接收的降級 2xx 回應,避免外部 retry 把同一事件打成 LLM 風暴;安全拒絕如外網來源仍維持 403。
- OpenClaw cache key 改成 `prompt_family + alertname/category/namespace/target/severity/fingerprint`annotations、message、SignOz 即時數值變動不再讓同一告警每次 miss cache。
- 補 LLM cache / Alertmanager in-flight lock 單元測試,鎖住重複告警不得打穿 cache 的行為。
### 驗證
- `python3 -m py_compile apps/api/src/api/v1/webhooks.py apps/api/src/services/openclaw.py` 通過。
- `cd apps/api && pytest tests/test_alertmanager_rule_bypass.py tests/test_openclaw_cache_key.py tests/test_callback_dispatcher.py tests/test_telegram_button_consistency.py -q` → 60 passed。
## 2026-05-01 | MCP Agent Loop 地基 — audit + 權限矩陣
承接 Claude Code MCP/Agent Loop 盤點。Repo 實際已有 K8s/SSH/Prometheus/Database/Grafana/RAG/Filesystem/ArgoCD/Sentry MCP provider 與 PreDecisionInvestigator缺口是統一 audit、Agent tool_use loop、角色權限邊界而不是從零安裝 Kubernetes MCP。
### 完成
- 新增 ADR-105定義 OpenClaw/NemoTron/Hermes/ElephantAlpha 的 MCP 工具權限與 Agent Loop 漸進接線策略。
- 新增 `mcp_audit_log``mcp_daily_stats``k8s_state_snapshots``prometheus_snapshots` additive migration`incident_id``VARCHAR(64)` 對齊現有 `INC-*` ID。
- MCP provider registry 與 PreDecisionInvestigator tool registry 皆包上 audited providerMCP tool call 會寫 server/tool/latency/success/error/incident/session/agent_role。
- 新增 `AIProvider.analyze_with_tools()` 介面、`ToolCallResult`、四 Agent 權限矩陣、Anthropic/OpenAI/Ollama tool schema 轉換、`AgentToolExecutor`
- ClaudeProvider 實作 Anthropic tool_use loopOllamaProvider 實作 `/api/chat` tools loop。現階段先作 capability foundationDecisionManager 主路徑仍維持 pre-gathering fallback。
- `MCPToolRegistry._build_providers()` 從 K8s/SSH/Prometheus 擴為現有 10 個 provider使 PDI 能真正看見 DB/RAG/Grafana/Filesystem/SignOz/ArgoCD/Sentry。
- 內部 MCP RAG 評估:不另建獨立 DB沿用 PostgreSQL + pgvector + Redis hot cache只有量級/隔離需求逼近瓶頸時再拆專用 vector DB。
### 驗證
- `python3 -m py_compile` 針對 MCP registry/audit、AI provider interface、Agent Loop、Claude/Ollama provider、DB models 通過。
- `cd apps/api && pytest tests/test_agent_loop_foundation.py tests/test_mcp_tool_registry.py tests/test_callback_dispatcher.py tests/test_openclaw_cache_key.py -q` → 64 passed。
- `cd apps/api && pytest tests/test_agent_loop_foundation.py tests/test_mcp_tool_registry.py tests/test_pre_decision_investigator.py tests/test_callback_dispatcher.py tests/test_openclaw_cache_key.py tests/test_alertmanager_rule_bypass.py -q` → 103 passed。
- Prod 手動套用 `adr105_mcp_audit_snapshots.sql` 通過,確認四表存在,且 `mcp_audit_log``agent_role` 欄位。
- 修復 Gitea migration workflow`postgresql+asyncpg://` 轉成 `postgresql://` 再交給 `psql`,避免 migration CI 退成 local socket。
## 2026-05-01 | HostBackupFailed rule-first e2e 補洞
Live e2e 用 `HostBackupFailed` 打 Alertmanager 後發現 aged backup 告警會被分類成 `backup_failure`,未命中原本只允許 `host_resource` 的 rule-first gate導致又進 OpenClaw LLM。
### 完成
- `_should_use_alertmanager_rule_first()` / `_should_bypass_alertmanager_llm()` 納入 `backup_failure`,備份失敗 YAML `SSH_DIAGNOSE` 不再被 LLM 覆蓋成 K8s 動作。
- `DecisionManager` SSH route 與 `AutoRepairService` 分類對齊:`backup_failure` 非 kubectl action 先走 SSH MCP不再落入 `parse_kubectl_action()` 後被 `forbidden_shell_metachar` 擋下。
- `DecisionManager` host/backup K8s block 納入 `backup_failure`,若 LLM 或 Playbook 產生 kubectl 動作,直接走 emergency escalation而不是對備份告警誤做 K8s 修復。
- `AutoRepairService` 追加 host/backup Playbook guard主機/備份 incident 若匹配到 K8s rollout 類 Playbook阻擋為 `HOST_BACKUP_K8S_PLAYBOOK`,改走緊急介入。
- `AutoRepairService` post-verification rollback guardhost/backup 或非 K8s Playbook 驗證失敗時,不再合成 `kubectl rollout restart deployment/{target}`,改走 emergency escalation且不自動 resolve incident。
- `EmergencyEscalationService` 沿用既有 `APPROVAL_ESCALATED` DB enum 寫 AOL避免緊急通道因新 enum 未 migration 而留痕失敗。
-`phase25_knowledge_enum_names.sql`,讓 `AUTO_RUNBOOK` / `ANTI_PATTERN` enum name 可寫入 PG修復 auto runbook KM 沉澱失敗。
- `NodeExporterDown` Prometheus rule `auto_repair` 改為 `true`,與 YAML rule catalog 的 exporter restart 策略一致。
- `awoooi-executor` RBAC 補 backup/DR 診斷權限PVC、Jobs/CronJobs、Velero resources read-only以及 StatefulSet/DaemonSet safe rollout patch。
- NetworkPolicy 補 K3s master/worker `22/tcp` egress讓 SSH MCP 可以覆蓋 120/121不只 110/188。
- Telegram category buttons 補 provider alias 正規化:`k8s``kubernetes``ssh``ssh_host`,避免按鈕畫出來後 dispatcher 找不到 MCP provider。
- `backup_failure` 補三個 read-only 診斷按鈕:查主機磁碟、查備份 Job、查 Velero備份告警不再只有通用批准/拒絕/詳情。
-`backup_failure` NO_ACTION / SSH_DIAGNOSE 單元測試。
### 驗證
- `python3 -m py_compile apps/api/src/api/v1/webhooks.py` 通過。
- `python3 -m py_compile apps/api/src/services/decision_manager.py apps/api/src/services/callback_dispatcher.py` 通過。
- `cd apps/api && pytest tests/test_alertmanager_rule_bypass.py tests/test_telegram_ai_automation_block.py tests/test_ai_router_diagnose_fallback.py -q` → 24 passed。
- `cd apps/api && pytest tests/test_auto_repair_service.py tests/test_alertmanager_rule_bypass.py -q` → 27 passed。
- `cd apps/api && pytest tests/test_auto_repair_service.py tests/test_alertmanager_rule_bypass.py -q` → 29 passed。
- `cd apps/api && pytest tests/test_alertmanager_rule_bypass.py tests/test_callback_dispatcher.py tests/test_telegram_button_consistency.py -q` → 56 passed。
- YAML parse `ops/monitoring/alerts-unified.yml``apps/api/alert_rules.yaml` 通過。
- YAML parse `callback_action_spec.yaml``07-rbac.yaml``02-network-policy.yaml` 通過。
- Live Secret/mount 檢查:`ssh-mcp-key``awoooi-repair-ssh-key``awoooi-repair-known-hosts` 存在且掛載可讀。
- Live SSH MCP key 檢查:`wooo@192.168.0.110``ollama@192.168.0.188` OK`wooo@192.168.0.120/121` 已通過 host key但 remote `authorized_keys` 尚未納入該公鑰,回 `Permission denied (publickey,password)`
- Live RBAC apply 被 Argo 依 Git 狀態拉回;`07-rbac.yaml` 需推上 Gitea 由 Argo 同步後再驗 `can-i`
## 2026-04-30 | ADR-104 Playbook 版本化 lineage
承接「自動建立 Playbook」第二段讓 LLM 生成的改良 Playbook 不覆蓋舊知識,而是形成可審核、可追溯、可替換的版本鏈。
### 完成
- 新增 Playbook lineage 欄位:`version``parent_playbook_id``supersedes_playbook_id``version_reason`
- 新增 migration `adr104_playbook_versioning.sql`,既有 Playbook 回填 root lineage並加 lineage / supersedes index。
- `LLMPlaybookGenerator` 生成成功後會先查相似 approved Playbook相似度足夠時建立 v2而不是直接新增孤立 Playbook。
- Governance job 在 REVIEW→APPROVED 後,會將被取代的舊版本標記為 `DEPRECATED`,保留版本證據鏈。
- shared-types schema/types 已同步,避免後端模型新增欄位後 Type Sync 失敗。
- 修復 Gitea migration workflow移除缺 node/curl 的 `postgres:15-alpine` job container改由 runner 環境安裝/檢查 `psql``jq``curl`
### 驗證
- `python3 -m py_compile` 針對 Playbook model/db/repository/service/generator/governance 通過。
- `pytest apps/api/tests/test_playbook_generator.py apps/api/tests/test_playbook_service.py apps/api/tests/test_action_parser_safety.py -q` → 46 passed。
- Prod DB 已手動套用 additive migration確認 `playbooks` 欄位與 `ix_playbook_lineage` / `ix_playbook_supersedes` index 存在。
## 2026-04-30 | Auto Repair 緊急介入補洞 — rule-first + host SSH
統帥批准繼續推進「所有異常要自動修復無法自修復要有緊急通道」。Live 盤查確認 AI 診斷不是全死,而是主機/備份/磁碟告警常在 `auto_repair=false`、Phase2 空動作、或 LLM 產生 K8s 垃圾 target 後,只回到人工卡。
### 完成
- Alertmanager host_resource 命中 YAML 權威規則時改為 rule-first`SSH_DIAGNOSE` / SSH 指令不再被 LLM 覆蓋成 `kubectl get pods``unknown-service`
- `auto_repair=false` 不再靜默等待人工;會寫 `GUARDRAIL_BLOCKED`,並送 TYPE-7E emergency escalation 到 SRE 戰情室。
- DecisionManager 的 auto-approve manual gateno_playbook / no_executable_action / low_trust、host_resource K8s block、action parser block、K8s target missing 全部補 emergency escalation。
- Emergency escalation 追加 `timeline_events` agent warning讓 WarRoom timeline 看得到「AI emergency intervention requested」。
- HostDiskUsageHigh/Critical、HostOutOfMemory、HostOutOfDiskSpace、HostBackupFailed、NodeExporterDown 改進自動修復評估;備份失敗改為 SSH 只讀診斷NodeExporterDown 補入 YAML rule catalog。
- DecisionManager SSH route 支援 host_resource 非 kubectl 動作,並可從 `ssh ... systemctl restart` / `ssh ... docker restart` 包裝指令轉進 SSH MCP tool。
### 驗證
- `python3 -m py_compile apps/api/src/api/v1/webhooks.py apps/api/src/services/decision_manager.py apps/api/src/services/emergency_escalation_service.py` 通過。
- `python3` YAML parse `apps/api/alert_rules.yaml``ops/monitoring/alerts-unified.yml` 通過。
- `cd apps/api && pytest tests/test_alertmanager_rule_bypass.py tests/test_phase2_fallback.py tests/test_telegram_ai_automation_block.py tests/test_ai_router_diagnose_fallback.py tests/test_p0_diagnose_routing.py -q` → 29 passed。
## 2026-04-30 | ADR-104 LLM Playbook Generator 第一段落地
承接統帥 AI 自動化目標中「自動建立 Playbook」最低分缺口先把成功修復後的 learn 階段從 deterministic extraction 擴成 local LLM Playbook generation。
### 完成
- 新增 `LLMPlaybookGenerator`:成功修復且未命中既有 Playbook 時,用本地 provider 順序 `ollama -> ollama_188` 生成 Playbook JSON不新增 Gemini/Claude 雲端成本 fallback。
- 新增 `PlaybookStatus.REVIEW``PlaybookSource.LLM_GENERATED`LLM 產物先進 DRAFT/REVIEW不直接 APPROVED。
- LLM 產出的 kubectl command 必須通過 `action_parser`;危險命令自動降級為 manual review step。
- 新增 `playbook_generation_governance_job`:定期處理 DRAFT 黑洞,安全且高信心度的 LLM Playbook 可 DRAFT→REVIEW→APPROVED。
-`playbook_generation_total{outcome,source}``playbook_status_total{status,source}` emitter。
### 驗證
- `python3 -m py_compile` 針對 generator / governance / model / config / metrics / learning / main 通過。
- `pytest apps/api/tests/test_playbook_generator.py apps/api/tests/test_playbook_service.py apps/api/tests/test_learning_service.py apps/api/tests/test_action_parser_safety.py -q` → 56 passed, 2 skipped。
## 2026-04-30 | Telegram 告警收件人全面切到 SRE 戰情室
統帥指示所有發到 @tsenyangbot 個人通道的告警訊息完整轉移到「AwoooI SRE戰情室」Telegram 群組,個人 DM 不再作為正式告警收件通道。
### 完成
- `TelegramGateway.alert_chat_id` 統一告警目的地:`SRE_GROUP_CHAT_ID` 優先,只有缺群組設定才 fail-soft fallback 到 `OPENCLAW_TG_CHAT_ID`
- `send_approval_card()` 改為單次送 SRE 群組,不再先送 DM 再背景補群組;同時把 `tg_approval:*``tg_msg:*``approval_records.telegram_chat_id` 記到實際群組訊息。
- Drift / Meta / SecOps / Business / Escalation 卡片、執行結果、rollback 提案、auto-repair fallback、AI provider failover、成本警告、容量預測、Hermes 規則品質、合規、Coverage、Gitea/Code Review 通知全部改為群組優先。
- Gitea CD / Code Review / deploy-alerts / E2E health / dev CD workflow 的 Telegram sendMessage 也改用 SRE 群組 ID避免 workflow 通知仍打到個人 DM。
- Ops 旁路補齊docker health monitor、PG backup、DR drill、backup-from-110、migration workflow 的 Telegram fallback 改為 `SRE_GROUP_CHAT_ID` / `TELEGRAM_ALERT_CHAT_ID` 優先。
- 更新 ADR-093、Alert Chain E2E runbook、Human-in-the-loop 文件,避免後續驗收仍檢查 @tsenyangbot 個人 DM。
### 驗證
- `python3 -m py_compile` 針對 Telegram gateway、執行結果、failover/cost/job/webhook 相關檔案通過。
- `cd apps/api && pytest tests/test_failover_alerter.py tests/test_telegram_button_consistency.py tests/test_telegram_ai_automation_block.py -q` → 26 passed。
## 2026-04-30 | Auto Repair 斷點修復 — P2 fallback + 緊急介入
統帥指出 Telegram 卡片仍顯示 `llm_timeout_manual_gate` / `人工調查`,異常沒有落到自動修復或 AI 介入。Live 探針確認 Phase 2 Agent Debate 多次 90s timeoutOllama 111 仍跑 `deepseek-r1:14b` 且 degradedGemini fallback 曾出現 429。
### 完成
- `decision_manager.py` 新增 Phase 2 degraded 判斷:`timeout``failed`、全 Agent 降級、空動作+人審不再直接 return而是繼續走 Playbook RAG → LLM → Expert System fallback。
- `webhooks.py` auto repair 評估被擋或 Playbook 執行失敗時,立刻送 TYPE-7E escalation card 到個人/群組緊急通道,並寫 `EMERGENCY_ESCALATED` AOL避免靜默等待人審。
- `drift.py` config drift 無法 auto-adopt 時,除了原 TYPE-4D 卡片,額外送 emergency escalation標出 high/medium/actionable/intent/confidence/risk讓人工或 AI Agent 可直接接手。
- `failover_alerter.py` 修復 Gemini quota / failover 通知的 MarkdownV2 escaping避免外部付費 fallback 異常通知被 Telegram 400 吃掉。
- `apps/api/models.json``config.py`、prod deployment env 將 RCA/default 從 `deepseek-r1:14b` 對齊到已安裝的 `qwen2.5:7b-instruct`,避免 DIAGNOSE/RCA 長時間 timeout。
- 新增 `tests/test_phase2_fallback.py` 鎖住 P2 timeout 必須 fallback 的退出條件。
### 驗證
- `python -m py_compile apps/api/src/services/decision_manager.py apps/api/src/api/v1/webhooks.py apps/api/src/api/v1/drift.py` 通過。
- `cd apps/api && pytest tests/test_phase2_fallback.py tests/test_telegram_ai_automation_block.py -q` → 5 passed。
- `cd apps/api && pytest tests/test_action_parser_safety.py tests/test_alert_rule_engine_validation.py tests/test_phase2_fallback.py -q` → 64 passed。
- `cd apps/api && pytest tests/test_failover_alerter.py tests/test_phase2_fallback.py tests/test_telegram_ai_automation_block.py -q` → 13 passed。
- `cd apps/api && pytest tests/test_ai_router_diagnose_fallback.py tests/test_p0_diagnose_routing.py tests/test_failover_alerter.py tests/test_phase2_fallback.py tests/test_telegram_ai_automation_block.py -q` → 29 passed。
## 2026-04-30 | SPF-2 action parser 收斂 — 告警自動修復安全閘
承接 Wave A「告警→自動修復」阻塞點將 CS1/CS2/CS3 自動執行路徑從 substring destructive patterns 收斂到 structured kubectl action parser。
### 完成
- `action_parser.py` 擴充安全語法rollout restart、scale 正整數、autoscale 正 min/max、set resources CPU/memory、單一 Pod delete、read-only get/describe/logs/top/version。
- `webhooks.py` CS1 / CS2 / CS3 全部改用 `is_safe_kubectl_action()`,避免 `_DESTRUCTIVE_PATTERNS` 誤殺 `kubectl delete pod <one-pod>`
- `auto_approve.py` kubectl action 先走 parser非 kubectl / SSH 再走 legacy dangerous fragments`delete pod --all``delete deployment``rollout undo``replicas=0`、shell injection 仍阻擋。
- `alert_rule_engine.validate_kubectl_command()` 由巨型 regex 改為 parser-backed gatecompound shell / `kubectl exec` 自動降級人工。
### 驗證
- `PYTHONPATH=apps/api python3 -m pytest apps/api/tests/test_action_parser_safety.py apps/api/tests/test_alert_rule_engine_validation.py apps/api/tests/test_rule_engine_auto_execute.py apps/api/tests/test_cs3_auto_execute.py apps/api/tests/test_cs1_auto_execute.py apps/api/tests/test_destructive_patterns.py -q` → 123 passed。
## 2026-04-30 | CD Runner 拆段 — host build/deploy
承接 `RWLayer ... unexpectedly nil` 持續打斷 Gitea CD 的問題。第一層 `capacity: 1` + Docker lock 可阻止跨 repo 並行,但長時間 Web build 仍會讓 transient act job container 在 build 收尾消失。
### 完成
- 110 停用 Docker-wrapped `gitea-runner` container改保留 host-level `act_runner` daemon。
- `/home/wooo/act-runner/config.yaml` 新增 `awoooi-host:host` label並保留 `ubuntu-latest` Docker label 給測試 job。
- `scripts/ops/docker-health-monitor.sh` 預設排除 `gitea-runner`,避免 Docker 自動修復把已停用 runner container 每 5 分鐘拉起。
- `.gitea/workflows/cd.yaml` 拆為 `tests``build-and-deploy``post-deploy-checks` 三段API/Web Docker build 與 GitOps deploy 改跑 `awoooi-host`,不再在 transient act job container 內長時間 build。
- host deploy step 的 `kustomize` 改安裝到 `${HOME}/.local/bin`,避免 host runner 沒有 root 權限時寫 `/usr/local/bin` 失敗。
- post-deploy Playwright smoke 在 browser cache 命中時也會檢查 OS shared libs`libnspr4.so` 等 Chromium 依賴時自動補 `install-deps`
### 驗證
- 110 act_runner 已宣告 labels: `ubuntu-latest ubuntu-22.04 ubuntu-24.04 awoooi-host`
- Docker-wrapped `gitea-runner` restart policy 已改 `no` 且狀態為 exited。
- 110 `/home/wooo/awoooi-ops/docker-health-monitor.sh` 已同步排除 `gitea-runner` 並熱修生效。
- `.gitea/workflows/cd.yaml` YAML parse 通過,所有 `run:` block `bash -n` 通過。
## 2026-04-30 | 12-Agent 全流程責任矩陣補齊
承接前一輪 Codex 規則入口收斂統帥追問「12 位 Agent 分工是否也整合進來」。本輪補強 `docs/12-agent-game-rules.md`,讓 12-agent 不只是一張角色表,而是可直接驅動 AI 自動化全流程的責任矩陣。
### 完成
- 新增 `Full-Flow Ownership Matrix`:把 `detect -> sense -> reason -> decide -> execute -> verify -> learn -> govern` 每個節點對應 primary 12-agent、required collaborators、AI role focus、必查 evidence。
- 新增 `Seven-Capability Agent Map`:把七大自動化能力(監控/告警/建規則/匹配規則/建 Playbook/修復/KM對應主責 agent、review set、主要 ADR/doc。
- 補上 Codex 語義12 agents 是責任模型與 review lens只有統帥明確要求 delegated/parallel agent work 時,才啟動實際並行 agent。
## 2026-04-30 | CD Runner 並行 Build 修復 — RWLayer nil
AWOOOI CD `Build and Push Web` 在 Gitea act-runner 內失敗:`RWLayer of container ... unexpectedly nil`。Web image 在 110 host 直接 build 成功,排除 Web 程式碼 build error。
### 根因
- 110 `gitea-runner` 實際使用 `/home/wooo/act-runner/config.yaml``runner.capacity: 2`
- AWOOOI Web build 還在跑時runner 於 `2026-04-30T01:26:02Z` 接了另一個 repo task兩個 task 共用同一個 Docker daemon。
- AWOOOI job container 隨後消失BuildKit 回報 `RWLayer ... unexpectedly nil`,後續 notify/post steps 也因 `No such container` 失敗。
### 修法
- `.gitea/workflows/cd.yaml` 新增 host-global Docker build lock以 Docker network `awoooi-cd-docker-build-lock` 序列化 API/Web image build。
- `ops/runner/README.md` 記錄 110 act-runner 必須 `capacity: 1`,並說明 stale lock 清理策略。
## 2026-04-30 | Prod 部署補救 — AI Telegram / Code Review 落地
Gitea CD runner 在 Docker/act job 容器層反覆出現 `RWLayer ... unexpectedly nil`,導致 `639bb64` 功能 commit 未能進 prodTelegram 仍顯示舊 ACTION REQUIRED 卡片。
### 完成
- 清理 110 Gitea runner 孤兒容器並確認 Harbor registry healthy。
-`git archive 639bb64` 在 110 host 直接補建 Web image避開 runner 容器層故障API image 已由 CD build 成功。
- 推送 `awoooi/api``awoooi/web` `639bb64788eab996dd91c9286afea5c6b6e1f314` image並推 `chore(cd): deploy 639bb64 [skip ci]` 更新 GitOps tag。
- ArgoCD hard refresh 後同步到 `9f15f3cf`API/Web/Worker 全部 rollout 到 `639bb64`
### 驗證
- Prod health `/api/v1/health` 回 200PostgreSQL、Redis、Ollama、OpenClaw、SigNoz 全部 up。
- `/zh-TW/code-review` 回 200頁面包含 AWOOOI Code Review 控制面與 Hermes → OpenClaw → Elephant Alpha → NemoTron 流程。
- Prod API pod 內 `telegram_gateway.py` 已包含 `AI 自動化鏈路`,新 Telegram incident 卡片會顯示 AI 自動化鏈路。
## 2026-04-29 | Telegram AI 鏈路 + Code Review 可見化
統帥截圖指出 Telegram ACTION REQUIRED 卡片仍看不到 AI 自動化;另要求把 Code Review 啟動/完成通知機制納入 AWOOOI 推進項目。
### 完成
- Telegram ACTION REQUIRED / Nemotron 卡片固定顯示 `AI 自動化鏈路`,露出 Router、Mode、OpenClaw、NemoTron、Hermes、ElephantAlpha 與 webhook→approval flow。
- Incident timeline 聚合補進 ADR-090 `automation_operation_log`,讓 AI 自動化動作可回掛 incident detail。
- 新增 Gitea Actions `Code Review` workflowpush main 後送「啟動」與「完成」Telegram 卡,完成卡列 CRITICAL/HIGH/MEDIUM/LOW、風險等級、Elephant Alpha 修復建議與 `https://mo.wooo.work/code-review/`
- 新增 deterministic CI reviewer先做 secret / destructive command / `git diff --check` 掃描,輸出 sanitized JSON不把疑似 secret 原文打到 log。
- 新增 `/code-review/` 前端控制面,連到正確 Gitea Actions`http://192.168.0.110:3001/wooo/awoooi/actions`
### 驗證
- `py_compile` Telegram/timeline/reviewer 通過。
- `pytest tests/test_telegram_ai_automation_block.py tests/test_telegram_message_templates.py tests/test_incident_timeline_service.py -q` 通過。
- `pnpm --filter @awoooi/web typecheck` 通過。
- `.gitea/workflows/code-review.yaml` YAML parse + run shell `bash -n` 通過。
## 2026-04-29 | Wave B 事件處理歷程透明化
Codex 接續 AI 自動化 Wave B先把「告警→AI→安全閘→執行→驗證→KM」處理鏈變成可查、可顯示、可發 Telegram 的事件 timeline。
### 完成
- 新增 Incident timeline 聚合 service從 incidents、approvals、EvidenceSnapshot、AutoRepairExecution、timeline_events、AOL、KM entries 組成 11 階段處理歷程。
- 新增 `GET /api/v1/incidents/{incident_id}/timeline`,並讓 `timeline_events` 支援 `incident_id` 關聯查詢。
- Incident 建立、Approval 簽核、executor 狀態寫入時補 incident 關聯,讓後續事件能回掛單一 incident。
- WarRoom IncidentCard 增加「處理歷程」展開區Telegram 處置卡與事件詳情補 ASCII timeline。
### 驗證
- `py_compile` timeline/API/service/Telegram 相關檔案通過。
- `pytest tests/test_incident_timeline_service.py tests/test_action_parser_safety.py -q` 通過。
- `pnpm --filter @awoooi/web typecheck` 通過。
## 2026-04-29 | Codex 規則入口收斂 — AGENTS canonical + CLAUDE bridge
統帥要求把 CLAUDE.md、memory、MD、ADR、Skills 整合成 Codex 官方建議的遊戲規則,避免跨 session 記憶中斷與 token 浪費。
### 完成
- `AGENTS.md` 改為 Codex canonical 短入口97 行保留北極星、安全閘、skill map、memory/source priority、token discipline。
- `CLAUDE.md` 改為 legacy bridge32 行,只指向 `AGENTS.md` 與必要 AI automation 來源,避免 Claude/Codex 雙軌規則分裂。
- `docs/12-agent-game-rules.md` 升級 v2.0:加入 Codex loading contract、token-efficient startup、七大 AI 自動化能力、OpenClaw/NemoTron/Hermes/ElephantAlpha 分工、ADR lookup、memory lookup、12-agent task routing。
- 修正規則來源漂移:原 `~/.Codex/projects/-Users-ogt-awoooi/memory/` 不存在;新規則改列 `~/.claude/.../memory/MEMORY.md``~/.codex/memories/MEMORY.md`,並明確 memory 只能當 recall aid強制規則必須在 checked-in docs。
### 設計決策
- 不把所有 memory/ADR/skill 全量塞入 `AGENTS.md`;入口只保留路由與硬閘,長內容由任務按需讀取。
- `docs/12-agent-game-rules.md` 成為 AWOOOI 的「Codex 任務路由索引」,承接 12-agent 角色、9 skills、ADR、memory 與 AI 飛輪全景。
- 依 Codex memory guidance生成式 Codex memory 不手改;耐久狀態寫入 LOGBOOK / ADR / MASTER 等 checked-in docs。
## 🔴 2026-04-29 | LLM 飛輪復活戰 — 推翻 A2 + CD blocker 連環解
統帥訊息「2 個月在原地打轉」「Claude Code 浪費我兩個月訂閱費」+「主要優先用 111 主機的 Ollama」。
### 真根因debugger SSH 121 揪出)
- LLM 飛輪 100% `llm_failed`4 個 provider 全死
- openclaw_nemo 188:8088 → 500 Internal Server Error
- gemini → 429 Too Many Requests + **API key 在 prod log 明文洩漏**
- claude → 404 Not Foundmodel `claude-3-haiku-20240307` 過期)
- ollama → A2 鐵律下 DIAGNOSE chain **永久排除**(基於 INC-20260425 deepseek-r1:14b CPU 238s 過期事實)
- 配套盲區webhooks alert_context 未注入 `task_type` → Ollama timeout 走 30s 不是 200s
### 推翻 A2ADR-105
- `_intent_provider_overrides[DIAGNOSE]`: OPENCLAW_NEMO → **OLLAMA**
- `_diagnose_fallback_chain`: Ollama 第一順位OLLAMA → NEMO → GEMINI → CLAUDE
- openclaw.py 注入 `task_type="diagnose"`(讓 Ollama 用 200s timeout
- 6 個 regression test 同步更新reflectng new 鐵律)
- 1635 unit tests 全綠
### CD pipeline 連環血淚5 個 commit 全 failure
- 真根因:`tests/integration/setup_test_schema.sql` `knowledge_entries`
`related_approval_id` + `path_type` 欄位M4 ORM 加但 sql 沒同步)
- 修法commit `4115ddde` 補欄位 → 解 #1114-1118 全 backlog
### 已落地(不依賴 CD
- ✅ Prometheus 110 載入 17 條新 rule19 個 group`ai_autonomous_slo` 18 條 + `ollama_health` 4 條)
- ✅ Gemini API key sanitize防新 leakcommit `7b471e7a`
- ⚠️ 舊 log 中 leaked key 仍存(需手動輪換)
### 已 push 待 CD 部署
1. `715dc3cb` P0 觀測層止血 + drift 治理工具
2. `c22e5f33` KMWriter 統一契約 + M4 反查鏈
3. `dc18b0eb` PROMETHEUS_URL drift 修
4. `c5753e1c` KMWriter critic 5 修
5. `6878e62a` W1 PR-P1 + ADR-091 T1
6. `681b5ac9` W1 PR-R1 + PR-K1已部署 ✅)
7. `8d24f151` PR-R1 critic 4 修
8. **`fb0c72db` 推翻 A2 — DIAGNOSE Ollama primary**
9. `3668d49f` W2 三件 + KMWriter critic 修
10. `7b471e7a` Gemini sanitize
11. `c5b18101` cd-blocker修錯地方
12. **`4115ddde` cd-blocker-2真修— setup_test_schema 補欄**
### Memory 更新
- `feedback_ai_autonomous_direction.md` 對齊度提升
- 新增記錄 `project_revert_a2_ollama_primary.md`
- ADR-105 完整記錄推翻 A2 決策
### 已知債(後續 ADR
- ADR-106 `models.json` 對齊 prod 實載 model
- ADR-107 `complexity_map` 4/5 寫死雲端 改動態
- ADR-108 OpenClaw 188 服務 500 根因
- ADR-109 Claude API endpoint 過期升級
---
## ✅ 2026-04-28 | T0 12-Agent 全景驗證
承接前段 session 完成的 wave2commit `143c15f0`+ DB cleanup + Gitea HMAC + ArgoCD/Sentry MCP派四位專家並行驗證critic / db-expert / debugger / tool-expert
**測試**1546 passed, 29 skipped, 41 errorsKM integration 需 live PG預期— 較前段 +27 新測試。
**🔴 High待修**
- B1 `telegram_gateway.py:1654-1661` LLM 動態按鈕 Redis 失敗→鬼魂按鈕風險(違反 `feedback_no_ghost_buttons`
- B2 `decision_manager.py:2203-2208` KM 寫入若 executor 建立前例外則靜默吞掉(違反 `feedback_flywheel_km_write_gap`
**🟠 Medium**
- M1 跨類別存取 `executor._write_execution_result_to_km`(私有方法)
- M2 `test_golden_regression.py` 名實不符commit 三項改動零測試覆蓋
- M3 `_build_fallback_chain` DEPRECATED 只在 docstring建議 `warnings.warn`
- M4 phase26 `related_approval_id` 死欄位schema/code driftapproval↔KM 反查鏈斷裂)
**⚠️ 環境/治理 Gap**
- G1 本機 `~/.kube/config` 只連 mon cluster缺 awoooi prod context已建 `feedback_kubeconfig_context_gap.md`
- G2 `03-secrets.yaml` 全 CHANGE_ME 是 ADR-035 設計,但 `ARGOCD_API_TOKEN` 完全缺欄位
- G3 ArgoCD URL config driftdefault 寫 125實際在 121
**✅ Verified Clean**
- `_build_fallback_chain` 確實無生產呼叫方
- KM 雙路徑 writer schema 一致(人工 + auto_execute 共用 `_write_execution_result_to_km`
- Telegram `USE_LLM_DYNAMIC_BUTTONS=true` 已有 fallback 守門
- Gitea webhook HMAC 驗簽 + prod fail-closed 邏輯正確
詳情見 `project_t0_verification_20260428.md`
---
## ✅ 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
```