Repository navigation
fix(quota): drop generic quota cache on upstream 429 - #12325
Merged
diegosouzapw merged 11 commits intoSep 3, 2026
Merged
diegosouzapw merged 11 commits into
diegosouzapw merged 11 commits into
Conversation
diegosouzapw
added a commit
to HouMinXi/OmniRoute
that referenced
this pull request
Sep 1, 2026
HouMinXi
force-pushed
the
fix/generic-quota-429-invalidate
branch
from
September 2, 2026 06:20
255ac98 to
eeba996
Compare
Contributor
Author
|
Rebased onto current
No production-logic change beyond the unused-binding lint fix. |
HouMinXi
force-pushed
the
fix/generic-quota-429-invalidate
branch
from
September 2, 2026 08:36
1e4d94b to
e8b25b8
Compare
### Summary Codex already invalidates its quota cache on a 429 (`invalidateCodexQuotaCache` in `chatCore`). The generic fetcher used by agy / Antigravity / Claude OAuth had `invalidateGenericQuotaCache` but nothing called it. After a 429, reset-aware scoring could keep using a 60s stale snapshot while `accountFallback` cooled the connection. A second layer made a naive cache-delete insufficient: agy `retrieveUserQuota` and weekly summary caches are 60s–5min. Dropping only the wrapper recaches the same inner snapshot. Invalidation now also force-refreshes the next usage fetch. Probe-origin 429s are ignored (`diegosouzapw#9817`). Codex keeps its own path. ### Tests - 60s cache hit still one upstream usage call - `invalidateGenericQuotaCache` recaches with `forceRefresh: true` - `invalidateGenericQuotaCacheOnStatus`: 200 no-op, 429 drops, probe 429 no-op, missing id no throw - chatCore wires `invalidateGenericQuotaCacheOnStatus` on non-Codex 429 - sibling agy 429 cooldown + universal quota-aware routing suites pass (58/58) - `npm run typecheck:core` clean ### Not in this PR - Exposing generic cache TTL in the dashboard (already rejected: the existing Reset-aware quota cache knob is the outer layer, default 0) - Changing Codex 429 handling - Invalidating agy subscription / credit-probe caches beyond `forceRefresh` on the usage path Signed-off-by: Minxi Hou <houminxi@gmail.com>
The 429 invalidation flag used an insertion-order Set cap that dropped the oldest key under churn. Stamp each flag and drop it after the inner agy/Claude usage caches (60s–5min) expire. Keep the flag across convert-null so the next fetch still bypasses those caches. Signed-off-by: Minxi Hou <houminxi@gmail.com>
Keep the 429 force-refresh flag across convert-null so agy inner caches are still bypassed, but skip the next fetch for 60s. Sweep pending flags every minute instead of every five. Log a QUOTA debug line when a non- Codex 429 drops the generic cache. Signed-off-by: Minxi Hou <houminxi@gmail.com>
Expiry is lazy on read. The interval only reaps keys nobody fetches after the 5min TTL, matching codexQuotaFetcher. Signed-off-by: Minxi Hou <houminxi@gmail.com>
fetchGenericQuota and invalidateGenericQuotaCacheOnStatus now share one trimmed key. OnStatus returns whether it actually dropped so the QUOTA debug line cannot fire on a no-op. Signed-off-by: Minxi Hou <houminxi@gmail.com>
TTL must start when the entry is stored, not when the request began. A slow usage call was shrinking the 60s window by the round-trip. Signed-off-by: Minxi Hou <houminxi@gmail.com>
CI eslint no-unused-vars failed on the 60s hammer guard: the call must run, the return is unused. Signed-off-by: Minxi Hou <houminxi@gmail.com>
A 429 that lands while fetchUsage is in flight used to be wiped when the stale snapshot wrote the cache and deleted pendingForceRefresh. Capture the stamp before await and skip the recache when it changed. Signed-off-by: Minxi Hou <houminxi@gmail.com>
Concurrent 429 still blocks the pre-429 snapshot. A vanished or 5min- expired stamp is not a 429, so the wrapper cache is written. Signed-off-by: Minxi Hou <houminxi@gmail.com>
Extract cache-hit / miss-cooling / concurrent-stamp helpers so the fetcher stays at 15. chatCore 429 wiring is +9 at the Codex sibling site; file-size-baseline records that own growth. Signed-off-by: Minxi Hou <houminxi@gmail.com>
check-file-size.mjs counts split("\n").length, so merged chatCore.ts
is 5985 not wc -l 5984. Add the changelog fragment.
Signed-off-by: Minxi Hou <houminxi@gmail.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
HouMinXi
force-pushed
the
fix/generic-quota-429-invalidate
branch
from
September 3, 2026 12:38
027c927 to
17ee1e1
Compare
Contributor
Author
|
Rebased onto File-size conflict on |
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…12312) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
merged commit Sep 3, 2026
52456a1
into
diegosouzapw:release/v3.8.51
15 of 16 checks passed
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…12504) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…12488) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
#12566) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
diegosouzapw
pushed a commit
that referenced
this pull request
Sep 3, 2026
…odes (#12590) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…iegosouzapw#12312) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…#12495) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…iegosouzapw#12504) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…apw#12487) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…iegosouzapw#12488) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
diegosouzapw#12566) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…ouzapw#12557) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…odes (diegosouzapw#12590) Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca. O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do diegosouzapw#12504 + busca do diegosouzapw#12495 no mesmo painel), `accountFallback.ts` +6 (o diegosouzapw#12566 sobre o rebaseline que o diegosouzapw#12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do diegosouzapw#12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fix(quota): drop generic quota cache on upstream 429
Summary
Codex already invalidates its quota cache on a 429 (
invalidateCodexQuotaCacheinchatCore). The generic fetcher used by agy / Antigravity / Claude OAuth hadinvalidateGenericQuotaCachebut nothing called it. After a 429, reset-aware scoring could keep using a 60s stale snapshot whileaccountFallbackcooled the connection.A second layer made a naive cache-delete insufficient: agy
retrieveUserQuotaand weekly summary caches are 60s–5min. Dropping only the wrapper recaches the same inner snapshot. Invalidation now also force-refreshes the next usage fetch.Probe-origin 429s are ignored (
#9817). Codex keeps its own path.Tests
invalidateGenericQuotaCacherecaches withforceRefresh: trueinvalidateGenericQuotaCacheOnStatus: 200 no-op, 429 drops, probe 429 no-op, missing id no throwinvalidateGenericQuotaCacheOnStatuson non-Codex 429npm run typecheck:corecleanNot in this PR
forceRefreshon the usage path