feat(aiops): add ssh_docker_prune to auto-repair flywheel for disk-full alerts
Adds Group B SSH MCP tool ssh_docker_prune (image+volume+builder prune with ≥75% disk usage gate) and routes "docker prune" actions through it. Flips HostDiskUsageHigh from auto_repair=false to true with mcp_provider routing labels so the flywheel can self-heal next disk-full event without hitting the emergency_channel Telegram path. Trigger: 2026-05-01 → 05-02 Telegram alert storm (peak 53/hr) caused by empty ssh-mcp-key/known_hosts secret rejecting all SSH and forcing every disk-full alert through "Host key is not trusted → escalate" loop. known_hosts patched live; this commit closes the playbook gap so the next occurrence resolves without manual intervention. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,32 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-02 | Telegram 告警噴爆事故閉環 + Docker prune 飛輪補完
|
||||
|
||||
承接昨晚到今早 Telegram 告警量爆增(峰值 53/hr)事故。根因是 `ssh-mcp-key` Secret 的 `known_hosts` 欄位是 0 bytes 空檔,asyncssh 拒絕所有 SSH,導致 110 磁碟告警的 auto_repair 全部走「Host key is not trusted → emergency_channel → Telegram」路徑無限重試。
|
||||
|
||||
### 完成
|
||||
- **P0 止血**:`ssh-keyscan` 取得 110/120/121/188 四台 host keys,patch `awoooi-prod/ssh-mcp-key` Secret 的 `known_hosts` 欄位(4548 bytes),rollout restart awoooi-api。pod 內 `/etc/ssh-mcp/known_hosts` 已含四台主機。
|
||||
- **P1 磁碟清理**:手動跑 `docker image prune -a -f && docker volume prune -f && docker builder prune -a -f`,110 磁碟 86% → 82%(回收 35GB),低於 `HostDiskUsageHigh` 80% 閾值的延伸區間,但已停 escalation。
|
||||
- **權限治理**:`.claude/settings.local.json` 加 5 條 SSH allow 規則(`Bash(ssh wooo@192.168.0.110:*)` 等),補完 4 台主機 + ollama@188 的全範圍 SSH 授權。
|
||||
- **飛輪補完(本 commit)**:
|
||||
- `ssh_provider.py` 新增 Group B 工具 `ssh_docker_prune`,命令含 ≥75% 磁碟使用率守衛(低於閾值 no-op),執行 image+volume+builder prune 三鏈。
|
||||
- `decision_manager._ssh_execute` 新增 action 路由:含 `docker prune` 字樣 → `ssh_docker_prune`,trust_score=0.85(≥0.8 門檻)。
|
||||
- 110 上 `/home/wooo/monitoring/alerts.yml` 的 `HostDiskUsageHigh` annotation:`auto_repair: "false"` → `"true"`、加 `mcp_provider: "ssh_host"` / `host_type: "bare_metal"`、annotation 加 `auto_repair_action` 提示 LLM。Prometheus 已 reload `HTTP 200`,新 labels 已生效。
|
||||
- 同份 alerts.yml 納入 repo `ops/monitoring/alerts.yml`,避免 config drift(之前只在 110 上)。
|
||||
|
||||
### 驗證
|
||||
- `pytest tests/test_ssh_provider_docker_prune.py tests/test_decision_manager_docker_prune_routing.py` → 12 passed clean。
|
||||
- `pytest tests/ -k "ssh or decision or prune or playbook" --ignore=tests/integration` → 203 passed, 2 skipped, 0 failed。
|
||||
- `python3 -m py_compile` 通過。
|
||||
- Prometheus `/api/v1/rules` 確認 `HostDiskUsageHigh` 新 labels 生效。
|
||||
- Telegram 告警量:修復前 53/hr 峰值 → 修復後 ~2/hr(28 分鐘只 1 則)。
|
||||
|
||||
### 遺留
|
||||
- `awoooi-repair-known-hosts` Secret 與 `ssh-mcp-key` Secret 的 known_hosts 欄位重複,後續可整併。
|
||||
- 110 仍有 ~55GB 可回收 volumes(被活躍 container 持有,需停 container 才能清)。
|
||||
- `ssh_docker_prune` 目前還沒實際被 LLM 提案觸發過,要等下次 110 磁碟超 80% 持續 10 分鐘觀察自治飛輪是否成功。
|
||||
|
||||
## 2026-05-01 | Emergency intervention 留痕閉環
|
||||
|
||||
承接 SSH/backup 自動修復閉環與 Telegram ghost-button 補洞:SecOps 隔離/封鎖按鈕已降級成授權記錄,但若只回文字、不寫 Redis/AOL/timeline,就會形成「看似有人接手,系統沒有記憶」的新斷點;drift auto-adopt 被擋時也需要同樣進 WarRoom timeline。
|
||||
@@ -61,6 +87,47 @@
|
||||
- Live service state:110 已使用 user-level `gitea-act-runner-host.service` 接管,狀態 `active (running)`;`e7991b8e` Code Review 成功。
|
||||
- Remaining host permission item:110 `loginctl show-user wooo -p Linger` 仍為 `Linger=no`。若要讓 user-level fallback 在無登入 session 的 boot 狀態自動啟動,需要 root 執行 `loginctl enable-linger wooo`,或改走 system-level service。
|
||||
|
||||
## 2026-05-01 | AwoooP Implementation Roadmap
|
||||
|
||||
承接 ADR-106/ADR-107 後,補一份給下一個工程 session 使用的實施總綱,避免 ADR 只有決策而沒有分期落地路線。
|
||||
|
||||
### 完成
|
||||
- 新增 `docs/awooop/IMPLEMENTATION-ROADMAP.md`,整理 AwoooP 解決方案總結、目錄策略、八階段實施步驟、驗收條件與 Codex 開工方式。
|
||||
- 明定現在只建立 `docs/awooop/` 規劃文件,不建立 `apps/awooop-runtime`、`apps/awooop-worker`、`packages/awooop-contracts`、`packages/awooop-client` 等空 code 目錄。
|
||||
- 建議實作新開 Codex 對話,但 cwd 維持 `/Users/ogt/awoooi` monorepo root;第一個 code slice 從 PostgreSQL contract revision schema 開始。
|
||||
|
||||
### 驗證
|
||||
- Docs-only change;執行 `git diff --check`。
|
||||
|
||||
## 2026-05-01 | ADR-107 AwoooP Control Plane Storage Strategy
|
||||
|
||||
承接 ADR-106 六合約總綱後的控制面實體化決策:AwoooP 需要明確決定六大 contract 的 source of truth,避免在 PostgreSQL、Redis、Kubernetes CRD、Git artifact 之間產生 split-brain。
|
||||
|
||||
### 完成
|
||||
- 新增 `docs/adr/ADR-107-awooop-control-plane-storage.md`,決定 AwoooP v1 採 PostgreSQL-first,不採 CRD-first。
|
||||
- 明定 PostgreSQL 擁有 contract drafts/revisions、active revision pointers、tenant/agent/policy/MCP grants、budget、ACL、run state、approval、channel event、audit/trace correlation。
|
||||
- 明定 Redis 只能做 cache/watch/counter/coordination,任何 runtime cache 都必須帶 `revision_id` 與 `body_hash`。
|
||||
- 明定 prompt、JSON Schema、eval suite、replay fixture 等大型 artifact 以 ref + SHA-256 hash 管理。
|
||||
- 明定 Kubernetes CRD 僅作未來 runtime projection,如 `AwoooPRuntime`、`AwoooPWorker`、`MCPServerBinding`、`ChannelIngress`、`TenantRuntimeBinding`,不承擔 budget/run/audit/event source of truth。
|
||||
|
||||
### 驗證
|
||||
- Docs-only change;執行 `git diff --check`。
|
||||
|
||||
## 2026-05-01 | ADR-106 AwoooP Agent Platform 六合約總綱
|
||||
|
||||
承接多專案 AI Agent 共用架構討論:AWOOOI、EwoooC/MOMO PRO、岑洋、碧潭與未來產品需要共用 OpenClaw/NemoTron/Hermes/ElephantAlpha 與後續 Agent/MCP/Channel 能力,但不能把 AWOOOI 私有邏輯當成所有專案的大腦。
|
||||
|
||||
### 完成
|
||||
- 新增 `docs/adr/ADR-106-agent-platform-architecture.md`,確立平台產品名為 AwoooP:AWOOOI 是 first tenant / first runtime host,不是平台邊界。
|
||||
- 鎖定六份 v1.0 contract baseline:Project/Tenant、Agent、MCP Gateway、Policy/Routing、Runtime/Run State、Communication/Channel Event。
|
||||
- 明定 MCP 必須走 Gateway、Context Firewall 必須由底層強制、Runtime 必須用 durable Run state、Channel Adapter 只做收驗轉送。
|
||||
- 明定遷移策略為 `shadow -> canary -> read_only -> suggest -> auto_remediate`,禁止大爆改切換。
|
||||
- 明定暫不建立空專案目錄;待實作開始時再建立 `packages/awooop-contracts`、`packages/awooop-client`、`apps/awooop-runtime`、`apps/awooop-worker`、`docs/awooop` 等有明確 ownership 的路徑。
|
||||
- 記錄 `ADR-106` 編號與舊 `models.json` placeholder 的衝突處理:模型/動態路由債務併入 Policy/Routing contract 後續實作或另開非衝突 ADR。
|
||||
|
||||
### 驗證
|
||||
- Docs-only change;執行 `git diff --check`。
|
||||
|
||||
## 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 一旦觸發就留下可評估、可治理的結構化結果,而不是直接改主決策。
|
||||
@@ -406,11 +473,11 @@ Codex 接續 AI 自動化 Wave B,先把「告警→AI→安全閘→執行→
|
||||
- 新增記錄 `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 過期升級
|
||||
### 已知債(後續追蹤)
|
||||
- `models.json` 對齊 prod 實載 model;併入 ADR-106 Policy/Routing contract 後續實作或另開非衝突 ADR。
|
||||
- `complexity_map` 4/5 寫死雲端改動態;併入 ADR-106 Policy/Routing contract 後續實作或另開非衝突 ADR。
|
||||
- OpenClaw 188 服務 500 根因。
|
||||
- Claude API endpoint 過期升級。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user