# AWOOOI Human-in-the-Loop 規格書

> **文件類型**: 人工介入標準操作程序（Human-in-the-Loop Specification）  
> **版本**: v1.0  
> **建立日期**: 2026-04-14（台北時間）  
> **建立者**: Claude Sonnet 4.6（首席架構師）+ 統帥確認  
> **核心問題**: AI 判斷錯了、超時沒決定、或系統失控時，人類如何接管？

---

## 0. 設計哲學

> **AI 是副駕駛，統帥是機長。**

AWOOOI AIOps 的設計原則：

- AI **永遠可以被人類覆蓋**，任何時候
- **高風險操作**（P0/P1）必須人工確認，不例外
- AI 超時或信心不足時，系統**主動交還控制權**，不沉默失敗
- **Kill Switch** 永遠可用，一鍵讓 AI 停止所有自動操作

---

## 1. 人工介入觸發條件（When）

### 觸發矩陣

| 情況 | 觸發條件 | 系統行為 | 介入方式 |
|------|---------|---------|---------|
| **HITL-1** | 風險等級 P0（CRITICAL） | 強制人工審核 | Telegram 審核卡 |
| **HITL-2** | 風險等級 P1（HIGH） | 強制人工審核 | Telegram 審核卡 |
| **HITL-3** | AI 信心度 < 0.65 | 無法自動執行 | TYPE-4 通知，等人決定 |
| **HITL-4** | LLM 超時（> 25s） | 降級 Expert System | Expert System 決策，低信心 → 人工 |
| **HITL-5** | 破壞性操作檢測 | 強制升級為人工 | TYPE-3 審核卡，含警告標示 |
| **HITL-6** | 審核逾時（> 30 分鐘）| 自動升級通知 | P0 告警發至統帥 + SRE 群組 |
| **HITL-7** | 自動修復連續失敗 2 次 | 停止重試 | TYPE-4 通知，等人接手 |
| **HITL-8** | SLO-1 < 50%（連續 2h） | 飛輪異常 | TYPE-8M 告警，建議暫停自動修復 |
| **HITL-9** | Kill Switch 啟動 | 立即凍結所有自動操作 | 無自動行為，等人工重啟 |

### 破壞性操作關鍵字（HITL-5 觸發清單）

以下任一 kubectl 命令出現 → 強制人工審核，不論信心度：

```
scale ... --replicas=0   ← 縮容至零（服務停止）
delete pod               ← 刪除 Pod（短暫中斷）
delete deployment        ← 刪除部署（資料風險）
delete pvc               ← 刪除持久磁碟（資料永久消失）
delete namespace         ← 刪除命名空間（災難性）
rm -rf                   ← 主機層刪除（絕對禁止）
DROP TABLE               ← 資料庫破壞性操作（絕對禁止）
```

---

## 2. 誰來介入（Who）

### 介入層級

```
Level 1 — 統帥（最終決策者）
  角色: ogt（系統擁有者）
  Telegram: AwoooI SRE戰情室群組（SRE_GROUP_CHAT_ID）
  負責: 所有 P0/P1 審核、Kill Switch、重大策略決定

Level 2 — SRE On-call
  角色: SRE 戰情室成員
  Telegram: SRE 群組（SRE_GROUP_CHAT_ID）
  負責: P2 例行審核、監控告警響應

Level 3 — AI 系統（降級自動處理）
  角色: OpenClaw + Expert System
  負責: P3（低風險）自動執行，無需人工
```

### 當前實際狀態（2026-04-14）

```
統帥 = Level 1 + Level 2（一人承擔所有層級）
AI   = Level 3（P3 自動，P0/1/2 部分自動）
```

---

## 3. 怎麼介入（How）

### 3.1 Telegram 審核卡操作

當系統發送 TYPE-3 審核卡到 AwoooI SRE戰情室群組：

```
╔══════════════════════════════════════╗
║  🔧 需要您的決策                       ║
║                                      ║
║  告警: KubePodCrashLooping           ║
║  目標: awoooi-api @ awoooi-prod      ║
║  風險: 🟡 MEDIUM                     ║
║  AI信心: 82%                         ║
║  建議動作: kubectl rollout restart    ║
║             deployment/awoooi-api    ║
║  影響估計: ~30s 服務中斷              ║
║                                      ║
║  [ ✅ 批准執行 ]  [ ❌ 拒絕 ]         ║
║  [ 🔍 查看詳情 ]  [ 📋 Postmortem ]  ║
╚══════════════════════════════════════╝
```

**批准後**：系統立即執行，並發送執行結果通知  
**拒絕後**：Incident 標記為 `human_rejected`，不再自動重試  
**不操作**：30 分鐘後觸發 HITL-6（逾時升級）

### 3.2 Fail-safe 逾時行為（HITL-6 細節）

```
審核卡發出後：

  0 分鐘:  審核卡發送到 SRE 戰情室群組
  15 分鐘: 提醒訊息（同一個群組）:
           "⚠️ 此審核已等待 15 分鐘，請盡快處理"
  30 分鐘: 升級告警發送到 SRE 戰情室群組:
           "🔴 審核逾時！Incident #XXX 已等待 30 分鐘未處理
            若不處理，系統將在 5 分鐘後自動標記為 ESCALATED"
  35 分鐘: Incident 狀態 → ESCALATED
           記錄到 alert_operation_log（事後可查）
           不執行任何破壞性操作（Fail-safe：寧可不動也不亂動）
```

**重要**：AWOOOI 的 Fail-safe 預設行為是**不執行**，而非自動執行。
若 AI 不確定或人類沒有回應，系統**保持現狀**，不主動改變任何東西。

### 3.3 人工直接操作（繞過 AI）

統帥可以隨時直接操作，AI 不會干預：

```bash
# 直接 kubectl 操作（AI 不知道，但 AWOOOI 不阻擋）
kubectl rollout restart deployment/awoooi-api -n awoooi-prod

# 透過 AWOOOI API 手動觸發（有記錄）
POST /api/v1/approvals/{id}/manual-execute
  Authorization: Bearer {token}
  Body: {"reason": "AI 判斷錯誤，手動修復"}
```

---

## 4. Kill Switch（緊急停止）

### 4.1 Kill Switch 是什麼

Kill Switch = 立即凍結 AWOOOI 所有自動操作的緊急機制。

啟動後：
- ✅ 繼續接收告警（不停止監控）
- ✅ 繼續發送通知（讓統帥知道發生什麼）
- ❌ 停止所有自動執行（kubectl / SSH）
- ❌ 停止所有自動批准（AutoApprovePolicy 凍結）
- ❌ 停止新 DecisionToken 進入執行階段

### 4.2 如何啟動 Kill Switch

**方法 1：Telegram 指令**（推薦，最快）
```
在 SRE 戰情室群組或授權對話輸入：
/kill_switch enable

系統回應：
🛑 KILL SWITCH 已啟動
  - 所有自動執行已凍結
  - 現有 pending 審核不受影響
  - 統帥可手動批准個別操作
  - 輸入 /kill_switch disable 解除
```

**方法 2：API 呼叫**
```bash
curl -X POST https://api.awoooi.internal/api/v1/system/kill-switch \
  -H "Authorization: Bearer {admin_token}" \
  -d '{"enabled": true, "reason": "系統異常，緊急凍結"}'
```

**方法 3：環境變數（重啟後生效）**
```bash
# 在 K8s ConfigMap 設定
AIOPS_AUTO_EXECUTE_ENABLED=false
```

### 4.3 Kill Switch 啟動場景

| 場景 | 建議行動 |
|------|---------|
| AI 連續執行錯誤動作 | 立即啟動，調查根因 |
| 生產環境重大變更前 | 啟動 Kill Switch，變更完成後解除 |
| SLO-1 連續 4h < 30% | 評估啟動（飛輪嚴重異常） |
| 不明告警風暴（10 分鐘 > 50 個） | 啟動 + 調查聚合引擎是否失效 |
| 週末/假日不在線 | 可啟動，讓系統進入純監控模式 |

---

## 5. 人工接管標準流程（SOP）

### 情境 A：收到 TYPE-3 審核卡

```
Step 1: 閱讀審核卡（告警類型、目標、AI 建議動作、風險評估）
Step 2: 若不確定，點擊「查看詳情」查看完整 AI 分析
Step 3: 判斷：
  - AI 建議合理 + 風險可接受 → 批准
  - AI 建議有疑慮 → 拒絕，手動研究後再決定
  - 看不懂 → 拒絕，kubectl describe 自己看
Step 4: 不論批准或拒絕，系統都會記錄到 alert_operation_log
```

### 情境 B：自動修復失敗，AI 交還控制

```
Step 1: 收到 TYPE-4 通知（AI 無法判斷或已重試 2 次）
Step 2: 查看 Incident 詳情（/api/v1/incidents/{id}）
Step 3: 手動分析根因（kubectl logs / describe）
Step 4: 手動執行修復命令
Step 5: 確認服務恢復後，在 AWOOOI UI 標記 Incident 為 RESOLVED
```

### 情境 C：發現 AI 判斷持續錯誤

```
Step 1: 啟動 Kill Switch
Step 2: 查看最近 N 個錯誤 DecisionToken 的 reasoning
Step 3: 識別根因（Prompt 問題？LLM 模型切換？規則配置錯誤？）
Step 4: 修復根因（可能需要更新 alert_rules.yaml 或 Playbook）
Step 5: 在 staging 環境驗證（用 DRY_RUN=true）
Step 6: 解除 Kill Switch，觀察 1 小時
```

---

## 6. 人工介入記錄規範

所有人工介入必須記錄到 `alert_operation_log`，欄位包含：

```python
{
  "event_type": "human_intervention",
  "action": "approved" | "rejected" | "manual_execute" | "kill_switch",
  "actor": "統帥",
  "actor_role": "owner",
  "reason": "string（人工填寫）",
  "approval_id": "uuid（若有）",
  "incident_id": "string（若有）",
  "timestamp": "2026-04-14T08:00:00+08:00",  # 台北時間
}
```

這些記錄用於：
- Postmortem 自動組裝時間軸
- SLO 計算（區分 AI 自動 vs 人工介入）
- 飛輪學習（識別 AI 哪裡判斷錯，更新 Playbook）

---

## 7. 與系統各層的接點

| 系統層 | Human-in-the-Loop 接點 |
|-------|----------------------|
| `webhooks.py` | Kill Switch 檢查（進入決策前） |
| `auto_approve.py` | P0/P1 強制人工路由 |
| `decision_manager.py` | LLM 超時 → Expert System → 信心不足 → TYPE-4 |
| `approval_execution.py` | 重試失敗 → TYPE-4 交還人工 |
| `telegram_gateway.py` | 審核卡 + 逾時提醒 + Kill Switch 指令接收 |
| `incident_service.py` | 人工標記 RESOLVED / ESCALATED |

---

## 8. 未來擴充計畫

| 功能 | 說明 | 時程 |
|------|------|------|
| 審核逾時自動降級（保守） | 超過 60 分鐘 → 自動執行最低風險操作 | Phase 3 後評估 |
| 多人簽核（Multi-Sig） | P0 需要 2 人確認 | 待統帥指示 |
| 行動 App 通知 | iOS 通知支援 | 低優先 |
| SRE On-call 輪值 | 第二個人類接管層 | 未來需求 |

---

*最後更新: 2026-04-14 台北時間 | 建立者: Claude Sonnet 4.6 + 統帥*
