diff --git a/packages/shared/src/usageLimits.test.ts b/packages/shared/src/usageLimits.test.ts index 72a17323386c8..c60f70f93b5eb 100644 --- a/packages/shared/src/usageLimits.test.ts +++ b/packages/shared/src/usageLimits.test.ts @@ -132,6 +132,10 @@ describe("new thread model fallback", () => { ["antigravity", ["gemini-weekly"], "antigravity-default", true], ["opencode", ["go_weekly"], "opencode/big-pickle", false], ["opencode", ["go_weekly"], "opencode-go/big-pickle", true], + ["claudeAgent", ["seven_day_fable"], "claude-opus-5-5", false], + ["claudeAgent", ["seven_day_fable"], "claude-fable-5-1", true], + ["claudeAgent", ["seven_day", "seven_day_fable"], "claude-opus-5-5", true], + ["claudeAgent", ["five_hour"], "claude-opus-5-5", true], ] as const)("matches %s pools %s to %s", (driver, ids, model, usesFallback) => { const defaultSelection = { ...selection, model }; expect( diff --git a/packages/shared/src/usageLimits.ts b/packages/shared/src/usageLimits.ts index 869f676acae69..234db00baaa39 100644 --- a/packages/shared/src/usageLimits.ts +++ b/packages/shared/src/usageLimits.ts @@ -57,6 +57,14 @@ export function exhaustedUsageWindow( return exhausted.find( (window) => !window.id.startsWith("go_") || model.startsWith("opencode-go/"), ); + case "claudeAgent": { + // Model-scoped weekly buckets (`seven_day_`, e.g. Fable) only cap that model. + const slug = model.toLowerCase().replace(/[^a-z0-9]+/g, "_"); + return exhausted.find((window) => { + const scope = window.id.match(/^seven_day_(.+)$/)?.[1]; + return scope === undefined || slug.includes(scope); + }); + } default: return exhausted[0]; }