- ADR-079 Sprint 5.0-5.4 全數完成,狀態改 Completed - LOGBOOK 新增午夜條目記錄 Phase 5 落地 本日 26 commits 總覽:cc42aa0aae7c1243c9689dedd7c2dd0a7780f48a50b8b124c8de807cf54dea46cac50710b74afaa4e5758b7e9cb914c7e7ca862c510e304372dd0c53f8d0872a37d1c094aa952e2f5a136754a8581b244208c28ede8bbd8a92562d涵蓋: - GAP-A1/A2/A3/A4 (4 個 gap + Phase 2) - GAP-B1/B4 (timeout fix) - GAP-C1/C2/C3 (BP-1 + retry + SSH KM) - GAP-D1/D5 (信任度 + 日報 + Postmortem) - Phase 5 全 Sprint (分類按鈕完整化) - 4 BLOCKER 修復 + Bug A 診斷 + Bug B 真修 - 下架死按鈕 + 重啟新按鈕(從 registry 動態產生) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
3.5 KiB
3.5 KiB
ADR-079: Telegram 分類按鈕下架 + Phase 5 完整化計畫
日期: 2026-04-14(台北深夜) 狀態: ✅ Completed(Sprint 5.0-5.4 全數完成,2026-04-14 深夜) 作者: Claude Sonnet 4.6(首席架構師)+ 統帥 audit 相關: ADR-071 通知類型、ADR-075 Telegram 標準、feedback_no_ghost_buttons.md
背景
統帥 2026-04-14 20:00 完整 audit 發現 telegram_gateway._CATEGORY_BUTTONS 定義的 28 個分類按鈕全部是鬼魂:
| 檢查 | 結果 |
|---|---|
| callback_data 格式 | ❌ 3-part action:xxx:id,parser 只認 4-part nonce / 2-part info |
| 後端 dispatch handler | ❌ grep apps/api/src 無任何 elif action == "restart_service": 等分支 |
| MCP 底層能力 | ✅ K8s 6 工具 + SSH 15 工具都在(能做就是沒接線) |
從 2026-04-11 commit 325b3851 起死了 3 天。統帥今天真的點了「查程序」結果完全沒反應 → 信任破壞。
決策
立刻執行(A 下架)
臨時對策:_CATEGORY_BUTTONS: dict = {} 改空 dict → fallback 通用按鈕(approve/reject/silence/detail/history/reanalyze)。
影響:
- 所有 TYPE-3 審核卡只顯示 6 個通用按鈕(已驗證全部 ✅)
- 零破壞:approve/reject 通道正常工作
- 信任修復:用戶不會再點到無反應的鬼魂按鈕
後續計畫(B Phase 5)
**Phase 5「分類按鈕完整化」**納入 MASTER 藍圖,估 3-5 天。
Phase 5 工作分解
| Sprint | 內容 | 估時 |
|---|---|---|
| 5.1 | 設計 action → MCP method 對應表(每個按鈕寫規格) |
0.5 天 |
| 5.2 | 查類按鈕實作(無副作用):check_process/check_port/check_log/check_health/open_signoz/open_flywheel |
1 天 |
| 5.3 | 寫類按鈕實作(有副作用):restart/scale_up/scale_down/rollback/restart_service/clear_log/reload_nginx/renew_cert |
2 天 |
| 5.4 | 資安按鈕(secops_isolate/block_ip/evict/authorize) | 0.5 天 |
| 5.5 | E2E 測試:click → action → MCP → result reply 完整鏈 | 1 天 |
總計:3-5 天(依資源)
每個按鈕的 checklist
每個分類按鈕上線前必須:
- callback_data 格式通過
_security.parse_callback_data()驗證 - dispatch handler 新增
elif action == "xxx":分支 - 呼叫的 MCP method 存在且可用
- 寫類按鈕有 nonce + audit log
- E2E 測試涵蓋 click → action → result reply 完整鏈
設計原則(永久)
寧可沒按鈕,不可有死按鈕。
- 沒按鈕 → 用戶知道要手動處理,正確預期
- 死按鈕 → 用戶以為能自動處理,點了沒反應 → 信任毀掉
結果
- ✅ Commit
XXXXX:_CATEGORY_BUTTONS = {}下架 28 個鬼魂 - ✅ Memory
feedback_no_ghost_buttons.md建立(鐵律文件化) - ⏳ Phase 5 排入 MASTER 藍圖,待資源分配
教訓
- PR Review 漏網:ADR-075 commit 只加了按鈕定義,沒 Review callback_data 格式 vs parser 規則
- 缺少 E2E 測試:單元測試只驗「按鈕產生」,沒驗「點擊後完整流程」
- ADR 規格不完整:ADR-075 只說「新增 _CATEGORY_BUTTONS」,沒規格化「每個按鈕對應的 action handler + MCP method」
- 信任成本:任何面向用戶的 UI 元素,功能與可見性必須一致 — 這是 SRE 產品化的核心
Accepted by 統帥 @ 2026-04-14 台北深夜