diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index dd848453..be11f835 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,40 @@ +## 2026-05-17 | T37 Telegram Approval Callback 補上 executor handoff + +**背景**:T36 後接著查 Telegram 截圖中的「批准後仍 blocked/manual_required、歷史統計 400、無法判斷是否真的 AI 自動化處理」。Live API 顯示 `INC-20260513-79ED5E` 仍是 `status=investigating`、`resolved_at=null`,且有 approval id;Run List 只有 legacy Telegram/Webhook evidence rows,remediation summary 為 `no_evidence`。這代表至少有一條 callback 路徑可能只完成 Telegram/approval 視覺蓋章,沒有把 executor / incident writeback 拉起來。 + +**修正**: +- `/api/v1/telegram/webhook` fallback 路徑: + - Telegram approve 成功且 `execution_triggered=true` 時,排程 `ApprovalExecutionService.execute_approved_action()`。 + - response 加上 `execution_scheduled`,避免只知道 approved、不知道是否交給 executor。 + - Telegram reject 成功後呼叫 `IncidentApprovalService.on_approval_status_change(..., rejected)`,讓 Incident 不再停在 investigating。 +- Active long-polling 路徑: + - 原本 approve 已有 `exec:{approval.id}` Redis lock 與 executor scheduling;本輪補上 reject 後的 Incident 狀態同步。 + - 新增 `telegram_rejection_incident_synced_via_polling` / `telegram_rejection_incident_sync_failed_via_polling` 結構化 log,後續可直接用 SigNoz / logs 查 closure。 +- 驗證時確認 `polling_active=false` 是 AWOOOI API pod 設計:`main.py` 註明 API 不做 Long Polling,OpenClaw/188 是唯一 polling 實例。這不是 production API health 紅燈,但仍要在後續盤點 188 polling runtime。 + +**本地驗證**: +- `python -m py_compile apps/api/src/api/v1/telegram.py apps/api/src/services/telegram_gateway.py apps/api/tests/test_telegram_webhook_execution_handoff.py apps/api/tests/test_telegram_gateway_polling_handoff.py`:pass。 +- `ruff check --select F,E9 src/api/v1/telegram.py src/services/telegram_gateway.py tests/test_telegram_webhook_execution_handoff.py tests/test_telegram_gateway_polling_handoff.py`:pass。 +- `DATABASE_URL=postgresql+asyncpg://test:test@localhost:5432/test pytest tests/test_telegram_webhook_execution_handoff.py tests/test_telegram_gateway_polling_handoff.py tests/test_telegram_message_templates.py tests/test_telegram_adr050.py tests/test_approval_execution_no_action.py -q`:74 passed。 +- `git diff --check`:pass。 + +**推版與 production 驗證**: +- `913e1abc fix(telegram): execute approved callbacks` 已推 Gitea main;Code Review run `2231` success;CD run `2230` tests / build-and-deploy / post-deploy-checks success;deploy marker `06f64c6d chore(cd): deploy 913e1ab [skip ci]`。 +- `9e1b15da fix(telegram): sync rejected polling callbacks` 已推 Gitea main;Code Review run `2236` success;CD run `2235` tests / build-and-deploy / post-deploy-checks success;deploy marker `68b20be2 chore(cd): deploy 9e1b15d [skip ci]`。 +- Production image:`awoooi-api` 與 `awoooi-worker` 均為 `192.168.0.110:5000/awoooi/api:9e1b15dabf80db952a1faa5b00525f0475b93fd8`,replicas ready。 +- `https://awoooi.wooo.work/api/v1/health`:200 healthy,PostgreSQL / Redis / Ollama / OpenClaw / SigNoz all up。 +- `https://awoooi.wooo.work/api/v1/telegram/health`:200 configured,bot token / SRE group / whitelist 已設定;API pod `polling_active=false` 符合目前「API 不做 Long Polling」設計。 +- 本輪未主動送 Telegram approval/reject live-fire,避免對真實群組製造新告警或誤觸執行;以 unit/route tests、Gitea CD、production image/health 驗證部署。 + +**目前整體進度**: +- Alertmanager 低風險自動修復主線:約 98%。 +- 完整 AI 自動化管理產品化:約 99%。 +- 告警詳情/歷史/主卡/前端 deep-link 可追溯:約 99%。 +- Telegram approval / reject callback 閉環:約 92%。 +- Telegram 首屏與追查訊息流程可判讀:約 96%。 +- 前端 AI 自動化管理介面同步:約 98%。 +- T37 補上 Telegram callback 到 executor / incident sync 的關鍵斷點。下一段應做「188 OpenClaw polling runtime + callback logs + stuck incident reconciliation」盤點,確認 active polling 實例真的載到新程式,並處理 `INC-20260513-79ED5E` 這類既有 stuck incident 是否需要人工安全 reconciliation。 + ## 2026-05-17 | T36 Incident Evidence Header 同步到詳情與工作台 **背景**:T34/T35 已讓 Telegram 與 Run List 可用 Incident ID 導到同一組 remediation evidence,但 Run Detail、Approval Detail、Work Items 仍各自呈現資料。Operator 從告警點進不同頁面時,還是要自行判斷「這個頁面和同一個 Incident/Run/Approval/Work Item 是否同一條鏈」。此外 Omni Terminal 浮動按鈕仍可能遮住右下角表格資訊。