Files
ewoooc/docs/refactor/callback_prefix_proposal.md
ogt fcac03379d [V10.4-A] 加強 commit-quality Hook + P9 文件歸檔
新增 Edit/Write/MultiEdit 事件攔截(原僅攔截 git commit Bash 指令),
補齊 getenv fallback 模式偵測,防止 hardcoded Token 透過工具直寫入檔案。

- .claude/hooks/commit-quality.js: 改寫為 PreToolUse JSON 格式,覆蓋 Edit/Write/MultiEdit
- .claude/settings.json: 新增 Edit|Write|MultiEdit|Bash matcher 註冊
- .claude/hooks/__test__/commit-quality.test.sh: 4 case 自動化測試
- docs/guides/DISK_EXPANSION_GUIDE.md: 磁碟擴充 SOP 歸檔
- docs/p9_completion_report_*.md: P9-1 + P9-2 Sprint 完成報告
- docs/refactor/callback_prefix_proposal.md: 308 按鈕回呼前綴分析(Method C)
- docs/refactor/openclaw_bot_routes_split_plan.md: 5999 行神檔拆分計畫

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 01:42:40 +08:00

6.1 KiB
Raw Blame History

Callback Prefix 統一評估報告read-only

產出日期2026-04-24狀態評估中未動程式碼 範圍:routes/openclaw_bot_routes.py + services/telegram_bot_service.py + services/telegram_templates.py

1. 範圍統計(實測)

類別 數量 說明
總 callback_data 字面值 308 含 f-string含靜態字串
已有 momo: prefix 5 全在 telegram_templates.pypa/pr/bpa/bpr/eig telegram_bot_service.pymomo:ops:
冒號分隔但無 prefix 272 cmd:*menu:*await:*
底線分隔(舊 TrendBot 31 menu_main/menu_trend/menu_search/menu_copy/menu_keywords/menu_daily/menu_settingssettings_*trend_*keywords_*

按檔案分布:

  • routes/openclaw_bot_routes.py171 筆(全冒號,僅 1-2 個已是 momo:
  • services/telegram_bot_service.py39 筆(混用 — 30 底線 + 9 冒號)
  • services/telegram_templates.py5 筆(全 momo:已合規,免改)

原始口述「80+」低估。實際 待修 303 筆272 + 31

2. 修改點列表(按檔案精簡,完整 diff 見附錄 A

2-a. routes/openclaw_bot_routes.py171 筆,抽樣)

  • L2896-2897cmd:import_confirm / cmd:import_cancelmomo:cmd:*
  • L2996-2999、3098-3101、3244-3247、3419-3429、3444-3450、3462-3482、3501-3517、3524-3590主選單+子選單 blocks
  • L3267-3268、3474-3482promo/competitor
  • L3392 _BACK 常數:menu:mainmomo:menu:main
  • L3635-3645 sales_quick_kb
  • L4537-4538、4712-4719、4787-4790、4814-4816
  • L5047-5257搜尋/比價/類別鑽取回傳)
  • L5414-5418、5536-5539、5658、5748、5810、5846、5859、5891、5902

2-b. services/telegram_bot_service.py39 筆)

  • L141-156主選單 8 顆)
  • L174、472、483返回按鈕
  • L1059-1144trend/keywords/daily 返回群 — 原為底線 menu_main/menu_trend/menu_keywords/menu_daily
  • L1208-1212、1265-1266settings 面板)
  • L1436、1445、1515-1516、1558-1559取消/繼續)

2-c. services/telegram_templates.py

免改(已全 momo: 前綴)。

3. Handlerdispatcher衝擊

routes/openclaw_bot_routes.py 入口 L5610-5663

data.startswith('menu:')  → 切 5 字 → _SUBMENUS[key]
data.startswith('await:') → 切 6 字 → _AWAIT_PROMPTS[action]
data.startswith('cmd:')   → 切 4 字 → handle_cmd(parts[0], parts[1])

必須在最外層先 strip momo:,否則 momo:menu:sales 會落到無人接的分支。

services/telegram_bot_service.py::handle_callback L426-540

data == "menu_main" or "menu:main"
data.startswith("menu:")
data == "menu_trend" / "menu_search" / "menu_copy" / "menu_keywords" / "menu_daily" / "menu_settings"
data.startswith("trend_") / "keywords_" / "settings_")
data.startswith("momo:pa:" / "momo:pr:" / "momo:ops:" / "momo:bpa:" / "momo:bpr:" / "momo:eig:")
data.startswith("cmd:")

→ 同樣需要 prefix strip底線家族menu_*trend_*keywords_*settings_*)建議一併轉冒號並加 prefix永久消滅舊 TrendBot 命名痕跡。

4. 推薦方案

方案 實作成本 安全性 歷史訊息相容 推薦
A 雙路徑(新發 momo:handler 同收新舊3 個月後砍舊) 308 行 + 2 dispatcher 都改) 最高 完整 備選
B 破壞式升級(只收 momo: 中(僅改 dispatch 分支) 低,歷史鈕變磚 否決
C Dispatcher 入口 strip momo:(發送端漸進升級) 最低(僅 2 個 dispatcher 頂端加 3 行) 中高 完整 首推

方案 C 核心 patch示意非 apply

# routes/openclaw_bot_routes.py 在 L5627 後、L5630 前
if data.startswith('momo:'):
    data = data[5:]

# services/telegram_bot_service.py handle_callback L443 後
if data.startswith('momo:') and not data.startswith(('momo:pa:','momo:pr:','momo:ops:','momo:bpa:','momo:bpr:','momo:eig:')):
    data = data[5:]  # 保留 ADR-012 L2 短碼分支原樣

即時達成跨專案隔離OpenClaw/AWOOOI 送來的非 momo: callback 不會被 momo-pro 誤接momo-pro 日後新發按鈕統一加 prefix舊按鈕仍可被處理。

發送端308 行)可在方案 C 上線後,分批以 sed 腳本加 momo: prefix純文字替換風險低

5. 風險與成本

風險/成本 等級 說明
歷史未點擊按鈕失效 低(方案 C 下) dispatcher 入口 strip 即可相容
誤觸他專案按鈕(當前實況) 272 筆無 prefix callback 會讓 OpenClaw/AWOOOI 同名按鈕走到 momo-pro handler
底線家族語意改變(menu_mainmomo:menu:main 需同步處理 settings_notify_on 等 4 組 startswith
ADR-012 短碼分支(momo:pa: 等)被誤剝 方案 C patch 要加白名單,不可對這 6 個前綴 strip
預估工時 方案 C 純 dispatcher0.5 小時 + critic 0.5 小時;全量加 prefix3-4 小時 + 測試 2 小時
測試 dispatcher 變更須在 staging 跑 smoke主選單 6 條主幹 + ADR-012 confirm/reject 按鈕 + L2 ops 按鈕)

6. 等統帥決策

  1. 是否啟動? 建議「是」——當前 272 筆跨專案外漏是真實資安/功能風險(三 bot 共用 Token
  2. 採方案? 首推 C(入口 strip + 分批 prefix若統帥要求一次到位選 A
  3. 派誰執行?
    • 方案 C dispatcher 改動:fullstack-engineer + critic0.5h
    • 308 行 prefix 批量加:refactor-specialistP9 子任務3-4h
    • 底線家族轉冒號:同上,獨立 commit
  4. 驗收staging smoke主選單點擊 → ADR-012 按鈕 → L2 ops 按鈕 → 歷史按鈕仍可觸發)+ critic 審查無 regression。

附錄 A完整修改點行號索引

(需全量 diff 時再展開;檔案/行號已於第 2 節列出,可用以下指令重生)

grep -n "callback_data" routes/openclaw_bot_routes.py \
    services/telegram_bot_service.py | grep -v "momo:"