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:
Your Name
2026-05-02 11:42:48 +08:00
parent 8cf559215c
commit 3156ff1c69
6 changed files with 1472 additions and 5 deletions

View File

@@ -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 keyspatch `awoooi-prod/ssh-mcp-key` Secret 的 `known_hosts` 欄位4548 bytesrollout 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/hr28 分鐘只 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 state110 已使用 user-level `gitea-act-runner-host.service` 接管,狀態 `active (running)``e7991b8e` Code Review 成功。
- Remaining host permission item110 `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`,確立平台產品名為 AwoooPAWOOOI 是 first tenant / first runtime host不是平台邊界。
- 鎖定六份 v1.0 contract baselineProject/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 過期升級
---