觀察
pacing-guard 的計數已經 per-model 分桶(model_bucket 過濾,hooks/pacing-guard.py:649)——Opus / Sonnet 5 / Sonnet 4.x / Haiku 各數各的、連發互不相剋。但門檻是單一值套用到所有桶:
max_in_window = file_override_int(..., "CLAUDE_HOT_LIMIT_MAX", 3)(pacing-guard.py:553)—— 一個 3 套到每個桶。
_MIN_GAP、_FANOUT_WIDE_MIN 同理,皆單一值。
3 是保守的 burst-pacing 起始值,不是任何 model 的實測 acceleration limit。真實 rate limit 各 model 不同(官方文檔:rate limits are per-model),所以「同一個門檻套所有桶」是簡化。
需求
讓門檻可以按 model 桶分別設定,例如 Opus 桶用一個 MAX、Sonnet 5 桶用另一個。
設計選項(待定)
- per-bucket env:
CLAUDE_HOT_LIMIT_MAX_OPUS_4 / _MAX_SONNET_5 …(bucket key 對齊 model_bucket() 輸出 <family>-<major>)。簡單但 env 名稱爆炸。
- per-bucket 檔案旗標:
<data_dir>/max-override.<bucket>(如 max-override.opus-4),fallback 到 max-override → env → default。與既有 file_override_int 檔案機制一致、mid-session 生效。傾向這個。
- JSON map:
<data_dir>/thresholds.json({"opus-4": {"max": 3}, "sonnet-5": {"max": 6}})。最靈活但要 parse + schema。
三者都必須保留「未指定桶 → fallback 到全域單一值」的向後相容。
⚠️ Gating:先有校準資料再實作
這功能 gated 在觀測校準資料上。 目前跑 MAX=999 觀測模式(~/.claude/settings.json),正是為了量各 model 的真實節流點。per-model 門檻是「知道每個 model 實際上限之後」才填得進去的東西——現在做好機制,也沒有 calibrated 的值可放。而且 burst guard 本質是防「加速度暴衝」,per-model 計數已分開;門檻要不要也分 model、差多少,取決於各 model 真實 acceleration limit 的差異——這恰好是觀測資料要回答的問題。
建議順序:先讓觀測模式收足各 model 桶的撞牆/趨勢資料(trips-raw.jsonl / calibration-log.md / rate-state.jsonl 已按 model 記錄)→ 分析各 model 桶的實際 acceleration 邊界 → 若差異顯著,才用選項 2 實作 per-bucket 門檻並填入 calibrated 值。
相關
觀察
pacing-guard 的計數已經 per-model 分桶(
model_bucket過濾,hooks/pacing-guard.py:649)——Opus / Sonnet 5 / Sonnet 4.x / Haiku 各數各的、連發互不相剋。但門檻是單一值套用到所有桶:max_in_window = file_override_int(..., "CLAUDE_HOT_LIMIT_MAX", 3)(pacing-guard.py:553)—— 一個 3 套到每個桶。_MIN_GAP、_FANOUT_WIDE_MIN同理,皆單一值。3是保守的 burst-pacing 起始值,不是任何 model 的實測 acceleration limit。真實 rate limit 各 model 不同(官方文檔:rate limits are per-model),所以「同一個門檻套所有桶」是簡化。需求
讓門檻可以按 model 桶分別設定,例如 Opus 桶用一個 MAX、Sonnet 5 桶用另一個。
設計選項(待定)
CLAUDE_HOT_LIMIT_MAX_OPUS_4/_MAX_SONNET_5…(bucket key 對齊model_bucket()輸出<family>-<major>)。簡單但 env 名稱爆炸。<data_dir>/max-override.<bucket>(如max-override.opus-4),fallback 到max-override→ env → default。與既有file_override_int檔案機制一致、mid-session 生效。傾向這個。<data_dir>/thresholds.json({"opus-4": {"max": 3}, "sonnet-5": {"max": 6}})。最靈活但要 parse + schema。三者都必須保留「未指定桶 → fallback 到全域單一值」的向後相容。
這功能 gated 在觀測校準資料上。 目前跑
MAX=999觀測模式(~/.claude/settings.json),正是為了量各 model 的真實節流點。per-model 門檻是「知道每個 model 實際上限之後」才填得進去的東西——現在做好機制,也沒有 calibrated 的值可放。而且 burst guard 本質是防「加速度暴衝」,per-model 計數已分開;門檻要不要也分 model、差多少,取決於各 model 真實 acceleration limit 的差異——這恰好是觀測資料要回答的問題。建議順序:先讓觀測模式收足各 model 桶的撞牆/趨勢資料(
trips-raw.jsonl/calibration-log.md/rate-state.jsonl已按 model 記錄)→ 分析各 model 桶的實際 acceleration 邊界 → 若差異顯著,才用選項 2 實作 per-bucket 門檻並填入 calibrated 值。相關
4731298)。model_bucket()家族桶正規化(per-model 分桶用 exact model-id 相等,非 rate-limit bucket 相等(同族變體互不計入) #6)是這個 roadmap 的基礎設施。