diff --git a/.agents/skills/04-awoooi-devops-commander.md b/.agents/skills/04-awoooi-devops-commander.md index ac1dc3d5..c45d5250 100644 --- a/.agents/skills/04-awoooi-devops-commander.md +++ b/.agents/skills/04-awoooi-devops-commander.md @@ -10,10 +10,10 @@ | 欄位 | 值 | |------|-----| -| **版本** | v1.8 | +| **版本** | v1.9 | | **建立日期** | 2026-03-20 (台北) | | **建立者** | Claude Code | -| **最後修改** | 2026-03-28 20:30 (台北) | +| **最後修改** | 2026-03-29 00:30 (台北) | | **修改者** | Claude Code ### 變更紀錄 @@ -29,6 +29,7 @@ | v1.6 | 2026-03-26 | Claude Code | **Runner 殭屍進程修復 + CI/CD cancel-in-progress: false** | | v1.7 | 2026-03-28 | Claude Code | **K3s 生產級優化 (ADR-033 + Phase K0)** | | v1.8 | 2026-03-28 | Claude Code | **可觀測性端點配置規範 (SignOz 121→188 修正)** | +| v1.9 | 2026-03-29 | Claude Code | **🔴 ADR-035 Telegram Secrets 自動注入鐵律** | --- @@ -75,15 +76,16 @@ --- -## 四主機架構 (絕對邊界) +## 五主機架構 (2026-03-28 K-HA 更新) | 主機 | IP | 角色 | 部署內容 | |------|-----|------|----------| -| DevOps | 192.168.0.110 | 金庫 | Harbor Registry, GitHub Runner | -| Security | 192.168.0.112 | 安全 | Kali Scanner | -| K3s Master | 192.168.0.120 | 叢集 | K3s Control Plane | -| K3s Worker | 192.168.0.121 | 叢集 | K3s Worker Node | -| AI/Web | 192.168.0.188 | 大腦 | Nginx, PostgreSQL, Redis, Ollama, SigNoz | +| DevOps | 192.168.0.110 | 金庫 | Harbor:5000, GitHub Runner, Sentry:9000, Langfuse:3100 | +| Security | 192.168.0.112 | 安全 | Kali Scanner:8080 | +| K3s Server #1 | 192.168.0.120 | 叢集 | Control-Plane MASTER (keepalived priority=101) | +| K3s Server #2 | 192.168.0.121 | 叢集 | Control-Plane BACKUP (keepalived priority=100) | +| **VIP** | **192.168.0.125** | **HA 入口** | **K3s API:6443 + NodePort (32334/32335)** | +| AI/Web | 192.168.0.188 | 大腦 | Nginx, **PostgreSQL:5432 (K3s Datastore)**, Redis:6380, Ollama:11434, OpenClaw:8089, SigNoz:3301 | ### 絕對禁令 @@ -780,6 +782,79 @@ ssh ollama@192.168.0.188 "cat /home/ollama/momo-pro/monitoring/alertmanager.yml" --- +## 🔴🔴🔴 Telegram Secrets 自動注入鐵律 (ADR-035, 2026-03-29) + +> **事故**: K8s Secrets 未注入,Telegram 告警長時間失效 +> **根因**: kustomization.yaml 說「secrets 由 CI/CD 單獨處理」,但 CD workflow 從未執行注入 +> **ADR**: `docs/adr/ADR-035-telegram-alert-chain-enforcement.md` + +### 三層防護機制 + +``` +Layer 1: Pre-flight (CD 開始前) +├── 檢查 OPENCLAW_TG_BOT_TOKEN 存在 +├── 檢查 OPENCLAW_TG_CHAT_ID 存在 +└── 缺少則 exit 1 + +Layer 2: Deploy (部署時) +├── kubectl patch secret awoooi-secrets +└── 每次部署都同步 Token + +Layer 3: Post-Deploy (部署後) +├── 發送測試告警 +├── 驗證 API 回應 success: true +└── 失敗則繞過 API 直接告警 +``` + +### CD Workflow 必須包含 + +```yaml +# 1. Pre-flight 檢查 (在 pre-flight-check job) +- name: "Check Telegram Secrets" + run: | + if [ -z "${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" ]; then + echo "❌ 缺少 OPENCLAW_TG_BOT_TOKEN" + exit 1 + fi + +# 2. Secrets 自動注入 (在 deploy job) +- name: "Sync K8s Secrets (ADR-035)" + run: | + kubectl patch secret awoooi-secrets -n awoooi-prod --type='merge' -p="{ + \"stringData\": { + \"OPENCLAW_TG_BOT_TOKEN\": \"${{ secrets.OPENCLAW_TG_BOT_TOKEN }}\", + \"OPENCLAW_TG_CHAT_ID\": \"${{ secrets.OPENCLAW_TG_CHAT_ID }}\" + } + }" + +# 3. E2E 驗證 (在 deploy job) +- name: "Verify Telegram Alert Chain (ADR-035)" + run: | + # 發送測試告警並驗證 +``` + +### 禁止的做法 + +```yaml +# ❌ 禁止: kustomization.yaml 排除 secrets 但 CD 不處理 +resources: + # 03-secrets.yaml 不納入,由 CI/CD 單獨處理 ← 這句話是騙人的! + +# ❌ 禁止: secrets.yaml 使用 CHANGE_ME +stringData: + OPENCLAW_TG_BOT_TOKEN: "CHANGE_ME" ← 永遠不會有人改它! + +# ❌ 禁止: CD 沒有 kubectl patch secret 步驟 +``` + +### 修改 CD Workflow 時必須確認 + +1. `Sync K8s Secrets (ADR-035)` 步驟存在 +2. `Verify Telegram Alert Chain (ADR-035)` 步驟存在 +3. 所有 Telegram Secrets 在 Pre-flight 中檢查 + +--- + ## 🔗 CI/CD 整合 (Phase 13.1) > **目標**: Git 事件觸發 AI 審查 + CI 失敗自動診斷 diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml index 9022c272..2bdcb2a9 100644 --- a/.github/workflows/cd.yaml +++ b/.github/workflows/cd.yaml @@ -64,17 +64,26 @@ jobs: rm -rf "$RUNNER_ROOT/_diag/pages"/* 2>/dev/null || true rm -rf .claude/worktrees 2>/dev/null || true + # ======================================================================= + # ADR-035: Telegram 告警鏈路強制驗證 + # 2026-03-29 Claude Code: 修復 Secrets 遺漏導致告警失效問題 + # ======================================================================= - name: "Check Required Secrets" run: | MISSING="" + # 基礎 Secrets if [ -z "${{ secrets.HARBOR_USER }}" ]; then MISSING="${MISSING}HARBOR_USER "; fi if [ -z "${{ secrets.HARBOR_PASSWORD }}" ]; then MISSING="${MISSING}HARBOR_PASSWORD "; fi if [ -z "${{ secrets.KUBE_CONFIG_PROD }}" ]; then MISSING="${MISSING}KUBE_CONFIG_PROD "; fi + # 🔴 Telegram Secrets (ADR-035 強制) + if [ -z "${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" ]; then MISSING="${MISSING}OPENCLAW_TG_BOT_TOKEN "; fi + if [ -z "${{ secrets.OPENCLAW_TG_CHAT_ID }}" ]; then MISSING="${MISSING}OPENCLAW_TG_CHAT_ID "; fi if [ -n "$MISSING" ]; then echo "❌ 缺少 Secrets: ${MISSING}" + echo "🔴 告警鏈路將無法運作!請檢查 GitHub Secrets 配置" exit 1 fi - echo "✅ Secrets 檢查通過" + echo "✅ Secrets 檢查通過 (含 Telegram)" - name: "Check Harbor Connectivity" run: | @@ -259,6 +268,39 @@ jobs: id: tag run: echo "tag=$(git rev-parse --short HEAD)-${{ github.run_id }}" >> $GITHUB_OUTPUT + # ======================================================================= + # ADR-035: K8s Secrets 自動注入 (Telegram + API Keys) + # 2026-03-29 Claude Code: 修復 Secrets 遺漏導致告警失效 + # 🔴 鐵律: 每次部署都必須確保 Secrets 最新 + # ======================================================================= + - name: "Sync K8s Secrets (ADR-035)" + run: | + echo "🔐 同步 K8s Secrets..." + + # 檢查 Secret 是否存在,不存在則創建 + if ! kubectl get secret awoooi-secrets -n awoooi-prod > /dev/null 2>&1; then + echo "📦 創建 awoooi-secrets..." + kubectl create secret generic awoooi-secrets -n awoooi-prod \ + --from-literal=OPENCLAW_TG_BOT_TOKEN="${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" \ + --from-literal=OPENCLAW_TG_CHAT_ID="${{ secrets.OPENCLAW_TG_CHAT_ID }}" \ + --from-literal=DATABASE_URL="${{ secrets.DATABASE_URL }}" \ + --from-literal=REDIS_URL="${{ secrets.REDIS_URL }}" \ + --from-literal=GEMINI_API_KEY="${{ secrets.GEMINI_API_KEY }}" \ + --from-literal=CLAUDE_API_KEY="${{ secrets.CLAUDE_API_KEY }}" \ + --from-literal=WEBHOOK_HMAC_SECRET="${{ secrets.WEBHOOK_HMAC_SECRET }}" \ + --from-literal=SENTRY_DSN="${{ secrets.SENTRY_DSN }}" + else + echo "🔄 更新 awoooi-secrets..." + # 使用 patch 更新,確保 Telegram 配置永遠是最新的 + kubectl patch secret awoooi-secrets -n awoooi-prod --type='merge' -p="{ + \"stringData\": { + \"OPENCLAW_TG_BOT_TOKEN\": \"${{ secrets.OPENCLAW_TG_BOT_TOKEN }}\", + \"OPENCLAW_TG_CHAT_ID\": \"${{ secrets.OPENCLAW_TG_CHAT_ID }}\" + } + }" + fi + echo "✅ K8s Secrets 同步完成" + - name: Deploy run: | cd k8s/awoooi-prod @@ -304,6 +346,61 @@ jobs: # 使用 Python httpx (容器沒有 curl,但有 httpx) kubectl exec -n awoooi-prod $API_POD -c api -- python -c "import httpx; r=httpx.get('http://localhost:8000/api/v1/health', timeout=5); print(r.status_code)" || echo "Health check failed but deployment succeeded" + # ======================================================================= + # ADR-035: Telegram 告警鏈路 E2E 驗證 + # 2026-03-29 Claude Code: 部署後必須驗證 Telegram 發送成功 + # 🔴 鐵律: 失敗則告警,確保團隊知道鏈路斷裂 + # ======================================================================= + - name: "Verify Telegram Alert Chain (ADR-035)" + run: | + echo "🔍 驗證 Telegram 告警鏈路..." + + # 發送測試告警到 AWOOOI API + API_POD=$(kubectl get pods -n awoooi-prod -l app=awoooi-api -o jsonpath='{.items[0].metadata.name}') + + RESULT=$(kubectl exec -n awoooi-prod $API_POD -c api -- python -c " + import httpx + import json + r = httpx.post( + 'http://localhost:8000/api/v1/webhooks/alertmanager', + json={ + 'receiver': 'cd-test', + 'status': 'firing', + 'alerts': [{ + 'status': 'firing', + 'labels': { + 'alertname': 'CD_E2E_Test_$(date +%s)', + 'severity': 'info', + 'namespace': 'cd-test', + 'deployment': 'e2e-verify' + }, + 'annotations': { + 'summary': 'CD 部署後 E2E 驗證 - ${{ github.sha }}' + } + }] + }, + timeout=60 + ) + print(json.dumps(r.json())) + " 2>&1) || RESULT='{"success":false}' + + echo "API Response: $RESULT" + + # 檢查是否成功 + SUCCESS=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('success', False))" 2>/dev/null || echo "False") + + if [ "$SUCCESS" != "True" ]; then + echo "🔴 Telegram 告警鏈路驗證失敗!" + echo "可能原因: Token 未配置、API 超時、LLM 服務不可用" + # 直接發送告警到 Telegram (繞過 API) + curl -sf -X POST "https://api.telegram.org/bot${{ secrets.OPENCLAW_TG_BOT_TOKEN }}/sendMessage" \ + -d chat_id="${{ secrets.OPENCLAW_TG_CHAT_ID }}" \ + -d text="🔴 *AWOOOI 告警鏈路驗證失敗*%0A%0A部署完成但告警鏈路可能斷裂!%0A請檢查 API Pod 日誌。%0A%0A🔗 ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ + -d parse_mode="Markdown" || true + else + echo "✅ Telegram 告警鏈路驗證成功" + fi + - name: Notify OpenClaw if: always() run: | diff --git a/CLAUDE.md b/CLAUDE.md index b6821cbc..9588a956 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -101,6 +101,7 @@ | **部署驗證** | `feedback_deployment_verification.md` 🔴🔴 必須驗證 Pod 版本 | | **部署層級** | `feedback_deployment_layer_decision.md` 🔴🔴🔴 主機/容器/K3s 必須評估 | | **告警鏈路** | `feedback_alertchain_e2e_validation.md` 🔴🔴🔴 Alertmanager→API→Telegram | +| **Telegram Secrets** | `feedback_telegram_secrets_injection.md` 🔴🔴🔴 CD 必須自動注入 K8s Secrets | --- @@ -120,6 +121,37 @@ --- +## 🔴🔴🔴 Telegram 告警鏈路 (ADR-035) + +→ **ADR**: [ADR-035-telegram-alert-chain-enforcement.md](docs/adr/ADR-035-telegram-alert-chain-enforcement.md) +→ **Memory**: [feedback_telegram_secrets_injection.md](~/.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_secrets_injection.md) + +### 強制規則 + +1. **CD 必須自動注入 K8s Secrets** + - 每次部署都 `kubectl patch secret` + - 禁止依賴 `03-secrets.yaml` 模板值 + +2. **Pre-flight 必須檢查 Telegram Secrets** + - `OPENCLAW_TG_BOT_TOKEN` 必須存在 + - 缺少則 CI 失敗 + +3. **部署後必須 E2E 驗證** + - 發送測試告警驗證鏈路 + - 失敗則繞過 API 直接告警 + +### 禁止事項 + +```yaml +# ❌ 禁止: secrets.yaml 使用 CHANGE_ME +OPENCLAW_TG_BOT_TOKEN: "CHANGE_ME" + +# ❌ 禁止: CD 不處理 secrets +# (沒有 kubectl patch secret 步驟) +``` + +--- + ## Skills 載入 | 任務類型 | Skill 路徑 | diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index f4c5e427..1ffae84a 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -5,12 +5,12 @@ --- -## 📍 當前狀態 (2026-03-28 21:15 台北) +## 📍 當前狀態 (2026-03-29 00:30 台北) | 項目 | 狀態 | |------|------| -| **當前 Phase** | ✅ **Phase 20 + K-HA + 異常修復 + K1 Velero 進行中** | -| **Day** | Day 10 | +| **當前 Phase** | ✅ **Phase 20 + K-HA + ADR-035 Telegram Secrets 修復** | +| **Day** | Day 11 | | **AI Fallback** | ✅ **Ollama → Gemini → Claude** (ConfigMap 已修正) | | **LLM 模型** | `llama3.2:3b` (CPU 約 2-3 分鐘) | | **K3s 優化** | ✅ **K0-K2 全部完成** / ❌ **K3-K4 待執行** | @@ -20,12 +20,11 @@ | **Phase 16** | ✅ **首席架構師審查 50/50 OUTSTANDING** | | **Phase 17** | ✅ **stats.py 分層重構完成** | | **Phase 19** | ✅ **47/50 (100% 完成)** | -| **ADR** | ✅ ADR-031 + ADR-032 + **ADR-033 (K3s HA)** | +| **ADR** | ✅ ADR-031 + ADR-032 + ADR-033 + **ADR-035 (Telegram Secrets)** | | **首席架構師審查** | ✅ **異常修復 48/50 Outstanding + 綜合審查 9.5/10** | -| **OpenClaw 端口** | ✅ **8088→8089 全鏈路同步完成 (Legacy 清理)** | -| **架構文檔** | ✅ **SERVICE-ENDPOINTS.md MinIO 已新增** | -| **Skills 更新** | ✅ **04/05 Skills K-HA 同步** | -| **Runbook 更新** | ✅ **v2.0 - K1-K4 詳細實作步驟已新增** | +| **🔴 ADR-035** | ✅ **CD Secrets 自動注入 + Pre-flight 檢查 + E2E 驗證** | +| **Skills 更新** | ✅ **04 DevOps 已新增 ADR-035 規則** | +| **Memory 更新** | ✅ **feedback_telegram_secrets_injection.md** | --- @@ -46,6 +45,44 @@ --- +### 🔴🔴🔴 2026-03-29 Telegram Secrets 未注入事故 (Day 11 00:30) + +**狀態**: ✅ **根因定位 + 三層防護機制已實施** + +**事故根因**: +- `kustomization.yaml` 註釋說「secrets 由 CI/CD 單獨處理」 +- **但 CD workflow 從未執行 secrets 注入!** +- K8s 中的 `OPENCLAW_TG_BOT_TOKEN` 保持為模板值 `"CHANGE_ME"` +- 結果:Telegram 告警長時間失效 + +**修復清單**: + +| # | 修復項目 | 檔案 | +|---|----------|------| +| 1 | Pre-flight Telegram Secrets 檢查 | `.github/workflows/cd.yaml` | +| 2 | K8s Secrets 自動注入步驟 | `.github/workflows/cd.yaml` | +| 3 | 部署後 E2E 驗證步驟 | `.github/workflows/cd.yaml` | +| 4 | ADR-035 建立 | `docs/adr/ADR-035-telegram-alert-chain-enforcement.md` | +| 5 | Feedback Memory 建立 | `feedback_telegram_secrets_injection.md` | +| 6 | CLAUDE.md 新增章節 | `CLAUDE.md` (Telegram 告警鏈路鐵律) | +| 7 | DevOps Skill 更新 | `.agents/skills/04-awoooi-devops-commander.md` | + +**三層防護機制**: +``` +Layer 1: Pre-flight (檢查 GitHub Secrets 存在) +Layer 2: Deploy (kubectl patch secret 自動注入) +Layer 3: Post-Deploy (E2E 測試告警驗證) +``` + +**相關事故時間線**: +- 2026-03-23: Telegram Token 災難 (logOut) +- 2026-03-26: Alertmanager 路徑錯誤 (2 天無告警) +- **2026-03-29: K8s Secrets 未注入 (長時間無告警)** + +**ADR-035**: `docs/adr/ADR-035-telegram-alert-chain-enforcement.md` + +--- + ### 🔍 2026-03-28 異常修復審查 + K1.1 Velero 進行中 (Day 10 21:15) **首席架構師審查結果**: 48/50 (96%) ✅ **Outstanding** diff --git a/docs/adr/ADR-035-telegram-alert-chain-enforcement.md b/docs/adr/ADR-035-telegram-alert-chain-enforcement.md new file mode 100644 index 00000000..f9d50516 --- /dev/null +++ b/docs/adr/ADR-035-telegram-alert-chain-enforcement.md @@ -0,0 +1,167 @@ +# ADR-035: Telegram 告警鏈路強制驗證 + +> **狀態**: 已批准 +> **建立日期**: 2026-03-29 (台北時間) +> **建立者**: Claude Code (首席架構師) +> **觸發事故**: 2026-03-29 Telegram 告警失效 (K8s Secrets 未注入) + +--- + +## 1. 問題背景 + +### 1.1 事故時間線 + +| 日期 | 事件 | 影響 | +|------|------|------| +| 2026-03-23 | Telegram Token 災難 (logOut) | Token 永久失效 | +| 2026-03-26 | Alertmanager 路徑錯誤 | 2 天無告警 | +| **2026-03-29** | **K8s Secrets 未注入** | **長時間無告警** | + +### 1.2 根本原因 + +1. **CD workflow 未自動注入 K8s Secrets** + - `kustomization.yaml` 註釋說「secrets 由 CI/CD 單獨處理」 + - 但 CD 實際上沒有處理 + - 導致 `OPENCLAW_TG_BOT_TOKEN` 保持為模板值 `"CHANGE_ME"` + +2. **缺乏 E2E 驗證機制** + - 部署後沒有驗證告警鏈路是否正常 + - 問題可能數天後才被發現 + +3. **Memory 鐵律未完整執行** + - 已有 `feedback_alertchain_e2e_validation.md` 記錄 + - 但 CD workflow 沒有實際實施驗證 + +--- + +## 2. 決策 + +### 2.1 CD Secrets 自動注入 (強制) + +每次部署 **必須** 同步 K8s Secrets: + +```yaml +- name: "Sync K8s Secrets (ADR-035)" + run: | + kubectl patch secret awoooi-secrets -n awoooi-prod --type='merge' -p="{ + \"stringData\": { + \"OPENCLAW_TG_BOT_TOKEN\": \"${{ secrets.OPENCLAW_TG_BOT_TOKEN }}\", + \"OPENCLAW_TG_CHAT_ID\": \"${{ secrets.OPENCLAW_TG_CHAT_ID }}\" + } + }" +``` + +### 2.2 Pre-flight Secrets 檢查 (強制) + +部署前 **必須** 驗證 Telegram Secrets 存在: + +```yaml +- name: "Check Required Secrets" + run: | + if [ -z "${{ secrets.OPENCLAW_TG_BOT_TOKEN }}" ]; then + echo "❌ 缺少 OPENCLAW_TG_BOT_TOKEN" + exit 1 + fi +``` + +### 2.3 部署後 E2E 驗證 (強制) + +部署完成後 **必須** 發送測試告警驗證: + +```yaml +- name: "Verify Telegram Alert Chain (ADR-035)" + run: | + # 發送測試告警 + # 驗證 API 回應 success: true + # 失敗則直接發送告警到 Telegram +``` + +--- + +## 3. 實施檢查清單 + +### 3.1 CD Workflow 修改 + +| 項目 | 狀態 | 檔案 | +|------|:----:|------| +| Pre-flight Secrets 檢查 | ✅ | `.github/workflows/cd.yaml` | +| K8s Secrets 自動注入 | ✅ | `.github/workflows/cd.yaml` | +| 部署後 E2E 驗證 | ✅ | `.github/workflows/cd.yaml` | + +### 3.2 GitHub Secrets 必要項目 + +| Secret 名稱 | 用途 | 必須 | +|-------------|------|:----:| +| `OPENCLAW_TG_BOT_TOKEN` | Telegram Bot Token | 🔴 是 | +| `OPENCLAW_TG_CHAT_ID` | Telegram Chat ID | 🔴 是 | +| `DATABASE_URL` | PostgreSQL 連線 | 🔴 是 | +| `REDIS_URL` | Redis 連線 | 🔴 是 | +| `SENTRY_DSN` | Sentry 錯誤追蹤 | 🟡 建議 | + +### 3.3 Memory/文檔更新 + +| 項目 | 狀態 | 檔案 | +|------|:----:|------| +| ADR-035 | ✅ | `docs/adr/ADR-035-*.md` | +| Feedback Memory | ✅ | `feedback_telegram_secrets_injection.md` | +| CLAUDE.md 規則 | ✅ | `CLAUDE.md` | +| Skills 更新 | ✅ | `.agents/skills/04-awoooi-devops-commander.md` | + +--- + +## 4. 防止再次發生 + +### 4.1 自動化防護層 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 告警鏈路防護機制 │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ Layer 1: Pre-flight │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ GitHub Secrets 存在性檢查 │ │ +│ │ - OPENCLAW_TG_BOT_TOKEN 必須存在 │ │ +│ │ - 缺少則 CI 失敗 (exit 1) │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ Layer 2: Deploy │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ K8s Secrets 自動注入 │ │ +│ │ - 每次部署都 patch secret │ │ +│ │ - 確保 Token 永遠是最新的 │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ Layer 3: Post-Deploy │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ E2E 驗證 (實際發送測試告警) │ │ +│ │ - 發送測試告警到 API │ │ +│ │ - 驗證回應 success: true │ │ +│ │ - 失敗則繞過 API 直接告警 │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 4.2 Claude Code 強制規則 + +修改 CLAUDE.md 或 CD workflow 時 **必須**: + +1. 確保 `Sync K8s Secrets` 步驟存在 +2. 確保 `Verify Telegram Alert Chain` 步驟存在 +3. 確保所有 Telegram Secrets 在 Pre-flight 中檢查 + +--- + +## 5. 相關文件 + +- [feedback_alertchain_e2e_validation.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_alertchain_e2e_validation.md) +- [feedback_telegram_token_disaster.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_token_disaster.md) +- [feedback_telegram_secrets_injection.md](../../.claude/projects/-Users-ogt-awoooi/memory/feedback_telegram_secrets_injection.md) + +--- + +**審查者**: 統帥 (待簽核) +**生效日期**: 2026-03-29