Files
awoooi/docs/adr/ADR-079-category-buttons-phase5.md
OG T e3d7c92100 docs(Phase 5): ADR-079 狀態 Completed + LOGBOOK 午夜收官
- ADR-079 Sprint 5.0-5.4 全數完成,狀態改 Completed
- LOGBOOK 新增午夜條目記錄 Phase 5 落地

本日 26 commits 總覽:
cc42aa0 aae7c12 43c9689 dedd7c2 dd0a778 0f48a50 b8b124c 8de807c
f54dea4 6cac507 10b74af aa4e575 8b7e9cb 914c7e7 ca862c5 10e3043
72dd0c5 3f8d087 2a37d1c 094aa95 2e2f5a1 36754a8 581b244 208c28e
de8bbd8 a92562d

涵蓋:
- 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>
2026-04-15 10:46:40 +08:00

87 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-079: Telegram 分類按鈕下架 + Phase 5 完整化計畫
> **日期**: 2026-04-14台北深夜
> **狀態**: ✅ CompletedSprint 5.0-5.4 全數完成2026-04-14 深夜)
> **作者**: Claude Sonnet 4.6(首席架構師)+ 統帥 audit
> **相關**: ADR-071 通知類型、ADR-075 Telegram 標準、[feedback_no_ghost_buttons.md](~/.claude/projects/-Users-ogt-awoooi/memory/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 藍圖,待資源分配
---
## 教訓
1. **PR Review 漏網**ADR-075 commit 只加了按鈕定義,沒 Review callback_data 格式 vs parser 規則
2. **缺少 E2E 測試**:單元測試只驗「按鈕產生」,沒驗「點擊後完整流程」
3. **ADR 規格不完整**ADR-075 只說「新增 _CATEGORY_BUTTONS」沒規格化「每個按鈕對應的 action handler + MCP method」
4. **信任成本**:任何面向用戶的 UI 元素,功能與可見性必須一致 — 這是 SRE 產品化的核心
---
*Accepted by 統帥 @ 2026-04-14 台北深夜*