# AWOOOI 最終執行主排程 # Master Execution Schedule — 統帥審核版 > **文件類型**: 最終執行授權書 > **建立**: 2026-03-29 14:05 (台北) > **狀態**: 🟢 執行中 (Wave 1 已完成,進入 Wave 2) > **本文件為所有 RunBook 和 ADR 的執行定序總綱** --- ## 第一章:最終確認的缺口清單(代碼確認級別) ### 1.1 已確認真實存在的問題(共 16 項) | # | 問題 | 代碼位置 | 嚴重度 | 波次 | |---|------|---------|--------|------| | 1 | Worker stop() timeout 只有 5 秒 | `signal_worker.py:147` | 🔴 P0 | Wave 1 | | 2 | XCLAIM / Active Sweeper 完全缺失 | `signal_worker.py` 全文 | 🔴 P0 | Wave 1 | | 3 | StatefulSet 自動修復無硬阻斷 | `auto_repair_service.py:159` | 🔴 P0 | Wave 1 | | 4 | AnomalyCounter Redis 無 try/except | `anomaly_counter.py:147` | 🔴 P0 | Wave 1 | | 5 | OpenClaw 無 Circuit Breaker | `sentry_webhook.py:289` | 🔴 P0 | Wave 1 | | 6 | OpenClaw 無 Concurrency Semaphore | `sentry_webhook.py` | 🔴 P0 | Wave 1 | | 7 | Global Incident Debounce 缺失 | `incident_service.py` | 🔴 P0 | Wave 1 | | 8 | Global Auto-Repair Cooldown 缺失 | `auto_repair_service.py` | 🔴 P0 | Wave 1 | | 9 | terminationGracePeriodSeconds 未設定 | `08-deployment-worker.yaml` | 🔴 P0 | Wave 2 | | 10 | ESLint i18n Plugin 只有 TODO | `.eslintrc.js:20-22` | 🟠 P1 | Wave 3 | | 11 | i18n 40+ 違規 | `TECHNICAL_DEBT_PHASE2.md` | 🟠 P1 | Wave 3 | | 12 | Playwright ignoreHTTPSErrors 未設定 | `playwright.config.ts` | 🟠 P1 | Wave 4 | | 13 | Visual Baseline 無 Docker 規範 | (設計空白) | 🟠 P1 | Wave 4 | | 14 | E2E 無 Auth Bypass(global.setup.ts 缺失)| `tests/e2e/` | 🟠 P1 | Wave 4 | | 15 | SSE Event Sourcing 尚未實作 | `terminal.py` | 🟡 P2 | Wave 7 | | 16 | Redis AOF/eviction 未確認 | `.188 主機` | 🔴 P0 | Wave 0 | ### 1.2 已確認不存在(稽核報告誤判) | 項目 | 誤判內容 | 真實現況 | |------|---------|---------| | Worker SIGTERM 缺失 | 報告說「需要實作」| ✅ 已實作(line 450-455)| | ADR-035 備援路徑 | 說「可觀測循環依賴」| ✅ Layer 3 繞過 AWOOOI 直接打 Telegram | | Sentry Comment 缺失 | 說「尚未整合」| ✅ LOGBOOK 確認 Wave A.4 已整合 | | CD Secret 注入 | 說「缺失」| ✅ ADR-035 確認 CD 已有自動注入 | --- ## 第二章:ADR 評估 ### 2.1 本次新建 ADR(已建立) | ADR | 標題 | 說明 | |-----|------|------| | [ADR-038](file:///Users/ogt/awoooi/docs/adr/ADR-038-openclaw-concurrency-governance.md) | OpenClaw 推理引擎併發治理 | Semaphore + Circuit Breaker 雙層保護 | | [ADR-039](file:///Users/ogt/awoooi/docs/adr/ADR-039-global-autorepair-governance.md) | 全域自動修復熔斷機制 | Global Cooldown + StatefulSet 黑名單 | ### 2.2 現有 ADR 需更新(次要) | ADR | 需追加內容 | 優先度 | |-----|---------|--------| | ADR-020 E2E Verification | 加入 global.setup.ts 和 Auth Bypass 規範 | 🟡 Wave 4 前 | | ADR-028 Failure Auto-Repair | 加入對 ADR-039 的引用說明 | 🟡 Wave 1 後 | ### 2.3 不需要新建 ADR 的項目 | 項目 | 理由 | |------|------| | XCLAIM / Active Sweeper | 屬於 ADR-037 Signal Worker 實作細節 | | terminationGracePeriodSeconds | 屬於 K8s 操作規範,不是架構決策 | | ESLint i18n | 屬於 ADR-002 設計系統的工具鏈細節 | --- ## 第三章:Skills 更新評估 ### 3.1 必須更新的 Skills #### Skill 02: leWOOOgo Backend Core(新增章節) ```markdown ## 🛡️ OpenClaw 推理保護模式 (ADR-038, 2026-03-29) ### 鐵律:所有 OpenClaw 呼叫必須雙層保護 from src.core.circuit_breaker import get_openclaw_guard async def call_openclaw_analyzer(...): guard = get_openclaw_guard() if guard.is_circuit_open(): # Layer 1: 斷路 return None async with guard.semaphore: # Layer 2: 限流(最多 3 並發) # ... httpx 請求 ... ## 🔴 全域修復冷卻 (ADR-039, 2026-03-29) ### 鐵律:任何自動修復前必須呼叫 check_global_repair_cooldown() 可以修復的服務: 僅無狀態服務(awoooi-api, awoooi-web, awoooi-worker) 絕對禁止修復: postgres, redis, clickhouse, minio, etcd ``` #### Skill 05: AWOOOI SRE & QA(新增章節) ```markdown ## 🎭 E2E Auth Bypass 鐵律 (2026-03-29) ### 必須在 tests/e2e/global.setup.ts 實作登入態 // global.setup.ts async function setup() { const { chromium } = require('@playwright/test'); const browser = await chromium.launch(); const page = await browser.newPage(); await page.request.post('/api/v1/auth/login', { data: { username: 'demo', password: process.env.E2E_PASSWORD } }); await page.context().storageState({ path: 'e2e-auth-state.json' }); } ### 絕對禁止在 Mac 本機產生 Visual Baseline 使用: pnpm test:visual:update(Docker 環境) 禁止: pnpm exec playwright test --update-snapshots(本機) ``` > **注意**:Skills 更新將在 Wave 1 代碼合併後,由後續 Session 執行。本次記錄評估結論即可。 --- ## 第四章:模組化合規驗證 ### 4.1 Wave 1 新代碼的合規性 | 新代碼 | 層次 | 依賴 | 介面 | 合規狀態 | |--------|------|------|------|---------| | `core/circuit_breaker.py` | core 基礎設施 | stdio + structlog | 直接類(無需 Protocol)| ✅ 合規 | | `services/global_repair_cooldown.py` | Service 層 | Redis(透過 get_redis())| 函數式 API | ✅ 合規 | | `signal_worker.py` XCLAIM 補充 | Worker(現有)| Redis Stream | 無新依賴 | ✅ 合規 | | `anomaly_counter.py` Degradation | Service 層 | 無新依賴 | 現有 Protocol | ✅ 合規 | ### 4.2 違規預防 | 規則 | 驗證方式 | |------|---------| | Router 不直接存取 Redis | Code Review:所有 Webhook router 只呼叫 Service | | Semaphore 在 core/ | `circuit_breaker.py` 放在 `src/core/`,非 `src/services/` | | Singleton 透過工廠函數 | `get_openclaw_guard()`、`get_global_repair_cooldown()` | --- ## 第五章:整合工作衝突分析 ### 5.1 必須串行的依賴關係 ``` XCLAIM 代碼合併 → 才能部署 Worker HPA i18n 清零完成 → 才能啟用 ESLint i18n Plugin(error 模式) release/v1.x 建立 → 才能宣佈 Frontend Feature Freeze global.setup.ts 實作 → 才能有效執行 E2E Visual 測試 Redis AOF 確認 → 才能實作 SSE Event Sourcing(依賴 Redis 持久化) ``` ### 5.2 可以並行的工作 ``` Wave 1 後端代碼修改(5 項)可以並行開發,捆綁一個 PR Sentry Token 配置 與 SignOz 告警規則部署 可以並行 Storybook 建置 與 Omni-Terminal SSE Event Sourcing 可以並行(不同分支) ``` ### 5.3 確認無衝突的部分 | 項目 | 衝突評估 | 結論 | |------|---------|------| | terminationGracePeriodSeconds | 需與 XCLAIM 同一 PR(相互依賴)| ✅ Wave 1 捆綁 | | Global Cooldown + Global Debounce | 同為 Wave 1,無衝突 | ✅ 同一 PR | | ADR-038 + ADR-039 同時生效 | 需確保 auto_repair_service 引用兩者 | ✅ 已在 ADR 中指定 | --- ## 第六章:詳細實施步驟 ### Wave 0: 即時止血(統帥手動確認,當天) ```bash # 0.1 確認 Redis AOF 狀態(5 分鐘) ssh root@192.168.0.188 \ 'docker exec awoooi-redis redis-cli CONFIG GET appendonly; \ docker exec awoooi-redis redis-cli CONFIG GET maxmemory-policy' # 預期:appendonly=yes, policy=volatile-ttl 或 noeviction # 若非 yes 則立即啟用:docker exec awoooi-redis redis-cli CONFIG SET appendonly yes # 0.2 確認 Alertmanager 備援 Telegram(10 分鐘) ssh root@192.168.0.188 'docker exec alertmanager cat /etc/alertmanager/alertmanager.yml' | grep -A 5 receiver # 0.3 建立 release/v1.x 穩定分支(5 分鐘) git checkout main && git pull git checkout -b release/v1.x && git push origin release/v1.x # 在 GitHub 設定 Protected Branch # 0.4 確認 SENTRY_AUTH_TOKEN(3 分鐘) kubectl get secret awoooi-secrets -n awoooi-prod \ -o jsonpath='{.data.SENTRY_AUTH_TOKEN}' | base64 -d | wc -c # > 0 = Phase D 已完成;= 0 = 需執行 RunBook Phase D ``` ### Wave 1: 底層安全網(代碼 PR,7.5h,原子性) > **所有以下修改必須在同一個 PR 中,不可拆分!** ``` PR 標題: feat(safety): Wave 1 底層安全網(ADR-038 + ADR-039) 檔案清單(9 個): 新建: apps/api/src/core/circuit_breaker.py (ADR-038) apps/api/src/services/global_repair_cooldown.py (ADR-039) 修改: apps/api/src/services/anomaly_counter.py → record_anomaly() 加 try/except + graceful degrade → 提取 _record_anomaly_impl() apps/api/src/workers/signal_worker.py → start() 加 _reclaim_task = asyncio.create_task(_reclaim_loop()) → 新增 _claim_orphaned_tasks()(XCLAIM 實作) → 新增 _reclaim_loop()(Active Sweeper,每 5 分鐘) → stop() timeout 從 5s 改為 75s,同步取消 _reclaim_task apps/api/src/services/auto_repair_service.py → evaluate_auto_repair() 開頭加 check_global_repair_cooldown() → execute_auto_repair() 成功後加 record_global_repair_action() → 常數區加 STATEFUL_SERVICE_BLACKLIST apps/api/src/api/v1/sentry_webhook.py → call_openclaw_analyzer() 加雙層保護(Circuit Breaker + Semaphore) apps/api/src/api/v1/signoz_webhook.py → 同上 apps/api/src/services/incident_service.py → process_signal() 前加 _check_global_incident_storm() k8s/awoooi-prod/08-deployment-worker.yaml → 加入 terminationGracePeriodSeconds: 90 → 加入 preStop: sleep 5 ``` **Wave 1 PR 審核要點**: - `circuit_breaker.py` 在 `src/core/`(非 services) - `global_repair_cooldown.py` 在 `src/services/`(非 core) - 所有新代碼有 Google Style Docstring - 所有 Singleton 透過工廠函數暴露 **Wave 1 驗收指令**: ```bash # 部署後驗證 terminationGracePeriodSeconds kubectl get deployment awoooi-worker -n awoooi-prod \ -o jsonpath='{.spec.template.spec.terminationGracePeriodSeconds}' # 預期:90 # 驗證 Circuit Breaker + Semaphore(Alpha 測試) curl -X POST http://192.168.0.125:32334/api/v1/webhooks/alertmanager \ -d '{"alerts": [{"labels": {"alertname": "TestAlert"}}]}' # 觀察 API log:openclaw_semaphore_acquired / openclaw_circuit_open_skip ``` ### Wave 2: Worker 擴縮容部署(30 分鐘,Wave 1 完成後) ```bash # 部署 Worker HPA kubectl apply -f k8s/awoooi-prod/12-hpa.yaml # 驗證 HPA 建立 kubectl get hpa awoooi-worker-hpa -n awoooi-prod # 預期:TARGETS 顯示實際 CPU%,MINPODS=1, MAXPODS=3 ``` ### Wave 3: 前端主幹手術(4 天窗口,Week 1) ```bash # Day 1 準備:宣佈 Feature Freeze # Day 1-3:i18n 閃電清零(依 TECHNICAL_DEBT_PHASE2.md 清單) cd apps/web git checkout -b fix/i18n-zero-violation # 執行清零(依序修復 9 個違規組) # 完成後驗證: pnpm exec tsc --noEmit # 安裝 ESLint Plugin(先 Warn 模式) pnpm add -D eslint-plugin-i18next # 修改 .eslintrc.js(markupOnly: true,先 warn) # Day 4:PR 合併 → 解除 Freeze git push origin fix/i18n-zero-violation # PR 審核後合併到 main # ESLint 切換為 error 模式 ``` ### Wave 4: CI 基礎設施(1 天,Wave 3 後) ```bash # 修改 playwright.config.ts # 加入 ignoreHTTPSErrors: true + deviceScaleFactor: 1 + threshold: 0.05 # 建立 tests/e2e/global.setup.ts(E2E Auth Bypass) # 建立初始 Docker Visual Baseline cd apps/web pnpm test:visual:update # Docker 環境 # 部署 Weekly E2E Workflow git add .github/workflows/e2e-weekly.yaml git commit -m "feat(ci): weekly E2E + visual regression + Docker baseline" ``` ### Wave 5: 告警後端完整化(2 小時,Wave 1 後即可) ```bash # 部署 SENTRY_AUTH_TOKEN(若 Wave 0.4 確認缺失) kubectl patch secret awoooi-secrets -n awoooi-prod \ --type=merge -p='{"stringData": {"SENTRY_AUTH_TOKEN": "YOUR_TOKEN"}}' # 部署 SignOz 告警規則到 .188 ssh root@192.168.0.188 'cat > /tmp/signoz-rules.yaml' < ops/signoz/alerting/rules.yaml # 透過 SignOz API 套用 # 驗證告警鏈路 python ops/scripts/alert_chain_smoke_test.py ``` > **Wave 6-12**: 中長期工作,依 INTEGRATION_ARCHITECTURE_MASTER.md 執行。 --- ## 第七章:最終工作排程(供統帥審核) ``` 📅 2026-03-29(今天)- Wave 0 □ 0.1 Redis AOF + eviction policy 確認(hand-on,5 min) □ 0.2 Alertmanager 備援路徑確認(hand-on,10 min) □ 0.3 release/v1.x 分支建立 + GitHub 設為 Protected(hand-on,5 min) □ 0.4 SENTRY_AUTH_TOKEN 存在確認(hand-on,3 min) 📅 2026-03-30 (已完成) - Wave 1 ✅ □ core/circuit_breaker.py 開發(2h) □ services/global_repair_cooldown.py 開發(1h) □ anomaly_counter.py Graceful Degrade(1h) □ signal_worker.py XCLAIM + Active Sweeper(2h) □ auto_repair_service.py Guardrail 整合(1h) □ sentry_webhook.py + signoz_webhook.py 雙層保護(0.5h) □ incident_service.py Global Debounce(1.5h) □ 08-deployment-worker.yaml terminationGracePeriodSeconds(0.5h) □ Wave 1 PR 提交 → 審核 → 合併 → CD 部署 → 驗收 📅 2026-04-01(Wave 1 完成後)- Wave 2 □ Worker HPA YAML 部署(30 min) 📅 2026-04-02~04-05(4 天)- Wave 3(Feature Freeze) □ Frontend Feature Freeze 宣佈 □ i18n 閃電清零(40+ 違規,4h 工時) □ ESLint i18n Plugin 安裝(Warn 模式) □ PR 合併 → Feature Unfreeze □ ESLint 切換為 Error 模式 📅 2026-04-06(1 天)- Wave 4 / Wave 5 □ playwright.config.ts 修改(ignoreHTTPSErrors + threshold) □ global.setup.ts E2E Auth Bypass 建立 □ Docker Visual Baseline 初始建立 □ E2E Weekly Workflow 部署 □ SignOz 告警規則部署到 .188 📅 2026-04 Week 3 - Wave 5 + 6(可視 Wave 1-4 完成情況調整) □ Prometheus Federation(.110 → .188) □ Redis AOF + Sentinel 評估 □ AI Autonomy Index Metrics 建立 📅 2026-04 Week 4+ - Wave 7-9(Month 2) □ Storybook 10 核心組件 □ Omni-Terminal SSE Event Sourcing □ 監控 GenUI 卡片(7 張) □ Nexus AI 自治率 UI 📅 Q2 - Wave 10-12(長期) □ CloudNativePG HA 評估 □ Kali SecurityAgent(MCP Tool 化) □ Phase 4 視覺靈魂注入 □ CI 硬阻擋正式啟用(Warn → Block) ``` --- ## 第八章:統帥審核要點 請特別審核以下決策點: | # | 決策內容 | 選項 | 推薦 | |---|---------|------|------| | D1 | Wave 1 PR 是否原子性(9 個文件一次)| A. 原子 / B. 分批 | A(必須原子,互相依賴)| | D2 | Feature Freeze 時長 | A. 3天 / B. 5天 | B(40+ 違規需要謹慎)| | D3 | ESLint 啟用時機 | A. i18n清零後立即 / B. 一週緩衝期 | A(清零後立即,防新債)| | D4 | Semaphore max_concurrent | A. 2 / B. 3 / C. 5 | B(3 = 60% .188 CPU)| | D5 | Global Cooldown Threshold | A. 3次/15分鐘 / B. 5次/15分鐘 | B(3 次太嚴,5 次合理)| | D6 | Redis HA 策略 | A. Sentinel / B. AOF+手動 / C. 暫緩 | C(暫緩,Month 2 評估)| --- *此排程基於 2026-03-29 的完整代碼審計與 16 輪沙盤推演,已閉合所有已知漏洞。* 🦞