diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 551a183a..8a6dfbc4 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,42 @@ +## 2026-05-07 | AwoooP Run Detail / Timeline 已上線,補齊 Telegram 狀態對照入口 + +**背景**:Telegram 戰情室訊息已經開始收斂為「主卡 + 更新 + 摘要」,但值班者仍需要一個可回查的 AwoooP Console 入口,把同一個 Run 的 inbound event、outbound message、MCP call、step journal 與 runtime state 放在同一條時間線,避免只靠 Telegram 純文字判斷。 + +**本次修補**: +- `GET /api/v1/platform/runs/{run_id}/detail` 新增 Run detail API,回傳 run summary、step journal、inbound events、outbound messages、MCP gateway audit 與聚合 timeline。 +- `/zh-TW/awooop/runs` 的 run id 改成可點擊連到 detail page。 +- 新增 `/zh-TW/awooop/runs/[run_id]` 前端頁面,提供狀態、trace、trigger、cost、duration、error 與 timeline 檢視。 +- 補 router order regression test,確保 `/runs/{run_id}/detail` 不會被既有 `/runs/{run_id}` 動態路由吃掉。 + +**驗證**: +- `python -m py_compile apps/api/src/services/platform_operator_service.py apps/api/src/api/v1/platform/operator_runs.py apps/api/tests/test_platform_router_order.py` +- `pytest apps/api/tests/test_platform_router_order.py apps/api/tests/test_awooop_operator_auth.py -q` → 7 passed。 +- `pnpm --filter @awoooi/web typecheck` 通過。 +- `NEXT_PUBLIC_API_URL='https://awoooi.wooo.work' pnpm --filter @awoooi/web build` 通過,route list 含 `/[locale]/awooop/runs/[run_id]`。 +- `ruff --select I apps/api/src/services/platform_operator_service.py apps/api/src/api/v1/platform/operator_runs.py apps/api/tests/test_platform_router_order.py` 通過。 +- Gitea Code Review `#1494` success,CD `#1493` success,CD 自動 deploy marker `cd637ef6 chore(cd): deploy 66e22e2 [skip ci]`。 +- K8s `awoooi-api` / `awoooi-web` / `awoooi-worker` 已 rollout 到 image tag `66e22e26...`。 +- Production smoke:`/api/v1/health` 200、`/zh-TW/awooop/runs` 200、`/zh-TW/awooop/runs/018f2d04-4c37-7a18-b764-df0df0cbe111` 200。 +- Detail API 對不存在 run 回傳預期 404 JSON,未出現 500。 + +## 2026-05-07 | AsyncSSH INFO log `%d format` 噪音止血,避免誤判主機診斷失敗 + +**背景**:Run Detail 上線後檢查 production log,仍看到 `TypeError: %d format: a real number is required, not str`。堆疊來自 `asyncssh/channel.py` 的 INFO log `Received exit status %d`,不是 AwoooP detail API,也不是新的 Telegram formatter。這類第三方 logging traceback 會污染 API log,並讓值班者誤以為 SSH 診斷或自動修復又失敗。 + +**本次修補**: +- `SSHProvider` 在成功載入 `asyncssh` 後,將 `logging.getLogger("asyncssh")` 調整為 `WARNING`。 +- 保留 AWOOOI 自己的 structured MCP audit / provider log 作為觀測來源,不再依賴 AsyncSSH 第三方 INFO log。 +- 新增 regression test,鎖定 AsyncSSH logger 會被調整為 WARNING。 + +**驗證**: +- `python -m py_compile apps/api/src/plugins/mcp/providers/ssh_provider.py apps/api/tests/test_ssh_provider_tools.py` +- `pytest apps/api/tests/test_ssh_provider_tools.py apps/api/tests/test_platform_router_order.py apps/api/tests/test_awooop_operator_auth.py -q` → 15 passed。 +- `ruff --select I apps/api/src/plugins/mcp/providers/ssh_provider.py apps/api/tests/test_ssh_provider_tools.py apps/api/src/api/v1/platform/operator_runs.py apps/api/tests/test_platform_router_order.py` 通過。 +- Gitea Code Review `#1496` success,CD `#1495` success,CD 自動 deploy marker `c00c7be9 chore(cd): deploy 336fd76 [skip ci]`。 +- K8s `awoooi-api` / `awoooi-web` / `awoooi-worker` 已 rollout 到 image tag `336fd767745d415c7779a1ee27e5c881ad2fe6ae`。 +- Production smoke:`/api/v1/health` 200、`/zh-TW/awooop/runs` 200、`/zh-TW/awooop/runs/018f2d04-4c37-7a18-b764-df0df0cbe111` 200。 +- 新部署後短窗口 log grep:未再看到 `TypeError: %d format`、`Received exit status`、`Traceback`、`run_detail` 或 `platform_operator` 異常。 + ## 2026-05-06 | Telegram 將 SSH 診斷 lane 與自動修復 lane 分離 **背景**:戰情室截圖中 `ssh_diagnose` 這類只讀主機診斷失敗時,也會出現 `[AUTO] AI 自動修復失敗,已升級人工介入`。這會讓值班者誤以為系統已嘗試修復且修復失敗;實際上它只是「診斷工具失敗」或「診斷已完成但沒有安全修復動作」。