SPEC-24 — User-Facing Claude Code Timeout — 架構分析報告

Agent: reviewer (reviewer)
Confidence: 60%
Cost: $0.3782
Duration: 1m 7s
Task ID: 0a46220c-5e4c-483d-9de3-6dbefea47640


審查完成。所有改動已驗證,讓我撰寫報告。

SPEC-24 — User-Facing Claude Code Timeout — 架構分析報告

概述

Programmer 的 SPEC-24 改動簡潔精確,符合既有架構模式。兩個檔案共 +17/-1 行,引入 per-model-tier timeout 並在 Sonnet/Opus 路徑加入 timeout 用戶通知。程式碼品質良好,驗收通過

分析詳情

1. MODEL_TIMEOUTS 定義 — ✅ 正確

  • 位置: src/telegram/model-router.ts:10-15
  • Record<ModelTier, number> 類型安全,覆蓋全部三個 tier
  • 數值合理:Haiku 60s、Sonnet 180s、Opus 600s
  • Export 使其可被 message-handler 導入,符合模組分離原則

2. Haiku 路徑 timeout — ✅ 正確

  • 位置: src/telegram/message-handler.ts:322
  • timeout: MODEL_TIMEOUTS[route.tier] — 直接用 tier 查表,不需 fallback(Record<ModelTier, number> 保證所有 key 有值)
  • Haiku 路徑無 progress message,timeout 後走既有 !isOk(result) 錯誤路徑,邏輯正確

3. Sonnet/Opus 路徑 timeout — ✅ 正確

  • 位置: src/telegram/message-handler.ts:383
  • const tierTimeout = MODEL_TIMEOUTS[route.tier] ?? 180_000; — 多了一層 ?? 180_000 fallback
  • 注意:因 route.tier 在此只能是 'sonnet''opus'(haiku 已在上方處理),而 MODEL_TIMEOUTSRecord<ModelTier, number> 覆蓋全 tier,此 fallback 理論上永遠不會觸發
  • 但作為防禦性寫法可接受(如果未來 ModelTier 新增值但忘更新 MAP,不會爆炸)

4. Timeout 用戶通知 — ✅ 正確

  • 位置: src/telegram/message-handler.ts:399-402
  • deleteMessage(L393)清理 progress message,再檢測 timeout → 用戶體驗乾淨
  • result.error.includes('timed out') 精確匹配 claude-code.ts:461 的錯誤訊息格式 "Claude Code timed out after ${timeout}ms"
  • timeout 後 return 阻止進入後續錯誤處理,避免重複回覆

5. 底層 timeout 機制確認 — ✅

  • 位置: src/claude/claude-code.ts:454-463
  • askClaudeCode 已有完整 timeout 支援:opts?.timeout ?? config.CLAUDE_CODE_TIMEOUT
  • 超時後 SIGTERM child process → resolve fail result with "timed out" 字串
  • SPEC-24 的 per-tier timeout 正確覆蓋了全域預設值

風險評估

  • 🟢 低風險:改動範圍小、邏輯清晰、不影響既有非 timeout 路徑
  • 🟢 includes('timed out') 匹配穩定(底層錯誤訊息格式固定在 claude-code.ts 中)
  • 🟢 型別安全(Record<ModelTier, number> 確保 tier 新增時編譯器會要求更新)

驗收結果

驗收項目 結果
Haiku 60s, Sonnet 180s, Opus 600s 映射
Timeout 用戶通知 '⏱ 處理超時...'
Progress message 清理後再通知
非 timeout 回應不受影響
型別安全
tsgo –noEmit 通過 ✅(programmer 確認)
Commit 存在且 diff 一致 a597825

結論:驗收通過 ✅

—HANDOFF—
TO: secretary
INTENT: handoff
ARTIFACT_TYPE: review
SUMMARY: SPEC-24 per-model-tier timeout 審查通過,commit a597825 可合併