Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
297 commits
Select commit Hold shift + click to select a range
fe7ada1
fix: keep tool_use and tool_result adjacent when converting mid-conve…
mateo-berri Aug 20, 2026
d643136
fix(realtime): resolve the vertex token resolver at call time
Aug 20, 2026
fc98bab
Merge branch 'litellm_internal_staging' of https://github.com/BerriAI…
mateo-berri Aug 20, 2026
4ca1f31
fix(cli): finish a refused token file rewrite in place
mateo-berri Aug 20, 2026
b142d1d
fix(cli): stop whoami calling an unreadable credential authenticated
mateo-berri Aug 20, 2026
155ef8c
test(e2e): require consecutive cache reads before the reminder turn
mateo-berri Aug 20, 2026
2604f88
fix(router): let the routed deployment's own litellm_params beat forw…
mateo-berri Aug 20, 2026
8b7c801
test(e2e): pin openai_passthrough routing, cost logging, and file lis…
mateo-berri Aug 20, 2026
952c6d5
Merge pull request #37517 from BerriAI/devin_ai_bedrock_grok_4_6_cost…
mateo-berri Aug 20, 2026
4f04e59
fix: harden vertex live passthrough against client model forms and di…
mateo-berri Aug 20, 2026
aa8e727
test(e2e): drop the passthrough streaming-cost test, it needs a confi…
mateo-berri Aug 20, 2026
e11399f
test(e2e): pin the unflagged Vertex cache test to us-east5
mateo-berri Aug 20, 2026
7683aff
fix(router): carry forwarded auto_router marker params per request an…
mateo-berri Aug 20, 2026
69278ae
docs(e2e): correct the passthrough-stream registry row's uncovered re…
mateo-berri Aug 20, 2026
fe11202
fix(cli): write the logout note again when the file holding it had to go
mateo-berri Aug 20, 2026
6d47468
Merge pull request #36968 from oneKn8/fix-anthropic-mid-conversation-…
mateo-berri Aug 20, 2026
a2928ef
test(cli): cover the keyless token record and keep keyring to the cli…
Aug 20, 2026
cc2013e
fix(anthropic): map metadata.user_id to prompt_cache_key on the /v1/m…
mateo-berri Aug 20, 2026
2c691d3
feat(proxy): native CLI login with OAuth authorization code + PKCE
mateo-berri Aug 20, 2026
975a680
test(e2e): request reasoning explicitly on the reasoning-cost assertions
mateo-berri Aug 20, 2026
5099379
fix(cli): stop asking a keychain that already stopped answering
Aug 20, 2026
5f6d22e
Map cache_control_injection_points to OpenAI prompt_cache_breakpoint …
mateo-berri Aug 20, 2026
9122068
fix(cli): pin PKCE discovery to the typed proxy and ignore foreign si…
mateo-berri Aug 20, 2026
71a5833
fix(cli): pick the credential by the sign-in it came from
mateo-berri Aug 20, 2026
b9ce630
docs(cli): say why a refused scrub does not roll the keychain back
mateo-berri Aug 20, 2026
8e1c8c1
fix(anthropic): skip the derived prompt_cache_key for litellm_proxy d…
mateo-berri Aug 20, 2026
fb123b3
fix(cli): bind the sibling refresh fallback to the same user and team
mateo-berri Aug 20, 2026
a329dfb
fix(cli): keep each sign-in stamped past the one it replaces
Aug 20, 2026
8a8e8dc
docs(deps): say that the cli extra pulls cryptography on linux
Aug 20, 2026
fb69fcf
fix(cli): stamp each sign-in past the keychain as well as the file
mateo-berri Aug 20, 2026
52c9432
fix(cli): renew a --pkce key wherever lite checks freshness and show …
mateo-berri Aug 20, 2026
d9aaa95
Gate OpenAI prompt cache breakpoints on the real target and carry the…
mateo-berri Aug 20, 2026
c011b4b
fix(cli): tell whoami's expired PKCE key to sign in again instead of …
mateo-berri Aug 20, 2026
1f2baf5
test(cli): model keyring's null backend in the vault test double
mateo-berri Aug 20, 2026
17455f4
fix(proxy): refuse a teamless native-client grant for a user who has …
mateo-berri Aug 20, 2026
e16cf5e
Fall back to the GPT version rule when the cost map carries no breakp…
mateo-berri Aug 20, 2026
218a3ec
fix(cli): never follow a redirect when posting to the proxy's OAuth e…
mateo-berri Aug 20, 2026
1fe06a1
test(cli): pin the shared stamp's effect on the freshness shortcut
mateo-berri Aug 20, 2026
39bdacb
fix(cli): revoke the previous login's refresh token when lite login r…
mateo-berri Aug 20, 2026
44d3fc7
fix(cli): name lite login --pkce and the refresh failure when a key c…
mateo-berri Aug 20, 2026
36e9e81
fix(cli): renew the key once per lite auth print-token run
mateo-berri Aug 20, 2026
a20cfc5
fix(cli): let lite up trust the key the group already renewed
mateo-berri Aug 20, 2026
238609e
fix(mcp): answer 503 when a refresh-token burn cannot be recorded
mateo-berri Aug 20, 2026
64e7ab1
fix(cli): keep the login record when the proxy cannot record a logout…
mateo-berri Aug 20, 2026
fad8116
Merge pull request #37615 from BerriAI/litellm_autorouter_marker_regi…
mateo-berri Aug 20, 2026
68deda3
refactor(ci): fold the nine thin unit-shard callers into one matrix (…
yuneng-berri Aug 20, 2026
5b1a956
chore(ci): close the test-census blind spots and move scripts out of …
yuneng-berri Aug 20, 2026
7de8f45
test: retire tests/old_proxy_tests, which holds no tests (#37605)
yuneng-berri Aug 20, 2026
ffab5a3
feat(ci): ratchet the test suite's zero-assert, mock-echo and global-…
yuneng-berri Aug 20, 2026
ec81069
Merge pull request #37626 from BerriAI/litellm_lit5874_native_cli_oau…
mateo-berri Aug 20, 2026
e51addb
Merge pull request #37628 from BerriAI/litellm_lit5876_openai_prompt_…
mateo-berri Aug 20, 2026
5bee64c
Merge pull request #37604 from BerriAI/litellm_lit5867_realtime_silen…
mateo-berri Aug 20, 2026
80d878f
Merge pull request #37623 from BerriAI/litellm_lit_5875_anthropic_pro…
mateo-berri Aug 20, 2026
0904d58
Merge pull request #37602 from BerriAI/litellm_vertex_live_db_credent…
mateo-berri Aug 20, 2026
b091158
Merge pull request #37575 from BerriAI/litellm_fix_prompt_hooks_witho…
mateo-berri Aug 20, 2026
76aa13c
test: remove the five test functions a later definition shadows (#37591)
yuneng-berri Aug 20, 2026
d7e4b1b
feat(ci): guard shard assignment across every sharded test tree (#37593)
yuneng-berri Aug 20, 2026
d2d158f
feat(ui): multi-key shadow eval picker and per-key breakdown (#37389)
tin-berri Aug 20, 2026
4fac887
fix(mistral): correct zai-glm-5-2 limits, add cached-input price and …
mateo-berri Aug 20, 2026
5f7c0e1
Merge origin/litellm_internal_staging into litellm_cli_refresh_tokens
mateo-berri Aug 20, 2026
e12833e
fix(ui): make dark-mode form controls visible (#37648)
yuneng-berri Aug 20, 2026
c794dcb
fix(ui): give status colours a readable foreground and drop the muted…
yuneng-berri Aug 20, 2026
5cd6347
fix(ui): make inline styles and code blocks follow the theme (#37651)
yuneng-berri Aug 20, 2026
0e7e640
fix(ui): move the policy flow builder onto theme tokens (#37654)
yuneng-berri Aug 20, 2026
9b00fd9
test: settle three allowlist entries that were open questions (#37598)
yuneng-berri Aug 20, 2026
569dcf4
feat(ci): ratchet tests that skip themselves when a credential is abs…
yuneng-berri Aug 20, 2026
a48baef
feat(ci): catch files a -k expression deselects from every job (#37601)
yuneng-berri Aug 20, 2026
3357ec8
test: run the 30 test files stranded in the second mirror (#37595)
yuneng-berri Aug 20, 2026
10829ff
Merge remote-tracking branch 'origin/litellm_internal_staging' into p…
mateo-berri Aug 20, 2026
7ac95b1
fix(ui): make hardcoded palette surfaces theme-aware (#37650)
yuneng-berri Aug 20, 2026
8672cd4
Merge pull request #37566 from BerriAI/litellm_cli_refresh_tokens
mateo-berri Aug 20, 2026
b7017a7
fix(model_prices): consolidate nine open registry audits into one cha…
devin-ai-integration[bot] Aug 20, 2026
c164944
fix(ui): draw one Per Day savings bar per date on Cost Optimization (…
tin-berri Aug 20, 2026
5d45d20
Merge pull request #37110 from mubashir1osmani/litellm_add_zai_glm_5_…
mateo-berri Aug 20, 2026
059aec8
Merge remote-tracking branch 'origin/litellm_internal_staging' into p…
Aug 20, 2026
282bcda
feat(complexity_router): add business classification rubric preset (#…
devin-ai-integration[bot] Aug 20, 2026
e1ff8b2
test: satisfy test-quality gate in consolidated registry tests
devin-ai-integration[bot] Aug 20, 2026
edbb342
feat(ui): serve a dark-mode variant of the LiteLLM logo (#37656)
yuneng-berri Aug 20, 2026
b469294
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
devin-ai-integration[bot] Aug 20, 2026
a95a1d0
fix(model_prices): drop duplicate zai-glm-5-2 entry superseded by sta…
devin-ai-integration[bot] Aug 20, 2026
d542c82
fix(otel): route Phoenix traces to per-key/team projects under otel v…
mubashir1osmani Aug 20, 2026
0f1e09b
fix(cli): keep the refresh token in the OS keychain, not in token.json
mateo-berri Aug 20, 2026
4873567
test: replace blind sleeps with deadline waits in callback and cachin…
ryan-crabbe-berri Aug 20, 2026
5c21312
feat(proxy): authenticate to Azure Postgres with Microsoft Entra ID t…
mateo-berri Aug 20, 2026
50bf99a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 20, 2026
46d783b
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
devin-ai-integration[bot] Aug 20, 2026
bdd4c8e
fix(model_prices): add Gemini live-translate, Voyage 4 series, Perple…
devin-ai-integration[bot] Aug 20, 2026
ba4a355
fix(model_prices): add tpm/rpm to gemini live-translate preview entry
devin-ai-integration[bot] Aug 20, 2026
d491a3d
Merge pull request #37665 from BerriAI/litellm_cli_keychain_refresh_t…
mateo-berri Aug 20, 2026
79cac36
fix(ui): keep keyword tier rules that target operator-defined tiers w…
tin-berri Aug 20, 2026
135f234
feat(proxy): add POST /auto_router/validate_complexity_router_config …
tin-berri Aug 20, 2026
0bdaa98
fix(perplexity): correct glm-5.2 cache read rate to the published cat…
Aug 20, 2026
88ef473
fix(utils): resolve model ids that repeat the litellm provider prefix
Aug 20, 2026
122675c
feat(ui): let admins supply a dark-mode variant of their custom logo …
yuneng-berri Aug 20, 2026
3a31331
fix(proxy): run pre-call guardrails on batch input file uploads (#37519)
yucheng-berri Aug 20, 2026
933e28d
feat(ui): add a light/dark/system theme toggle to the top bar (#37669)
ryan-crabbe-berri Aug 20, 2026
80cb655
test(e2e): pin query params and multipart form fields as replay match…
mubashir1osmani Aug 20, 2026
4eb7bf3
fix(proxy): keep token-auth URLs, toggles, and refresh sleeps safe
mateo-berri Aug 20, 2026
a369cb0
fix(bridge): keep the provider's own model prefix on chat-to-response…
Aug 20, 2026
e07a712
feat(proxy): redact or drop individual batch records instead of rejec…
yucheng-berri Aug 20, 2026
787edb1
refactor(ui): mark dark as beta in the theme menu, not the toolbar (#…
ryan-crabbe-berri Aug 20, 2026
4af59d7
ci: lint the test tree for undefined names and fix all 30 (#37671)
ryan-crabbe-berri Aug 20, 2026
6bd21fa
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
web-flow Aug 20, 2026
fc042a2
fix(azure): prefer workload identity over managed identity
web-flow Aug 20, 2026
fc3b160
Merge pull request #37565 from BerriAI/litellm_lit_5745_provider_edge…
mateo-berri Aug 20, 2026
affe2b4
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 20, 2026
abc6ebf
fix(responses_bridge): map incomplete responses to finish_reason leng…
mateo-berri Aug 20, 2026
50a346d
fix(model_prices): restore supports_vision on Mistral Small 4.0 entries
mateo-berri Aug 20, 2026
c551a5c
fix(proxy): treat explicit zero non-token prices as priced
mateo-berri Aug 20, 2026
9c29e11
Merge branch 'litellm_block_unpriced_models' of https://git-manager.d…
mateo-berri Aug 20, 2026
f3639a6
fix(mcp): let a salt-key-orphaned OAuth credential be replaced by re-…
yassin-berriai Aug 20, 2026
2f23cf5
fix(mcp): normalize auth schemes so MCP egress emits exactly one pref…
yassin-berriai Aug 20, 2026
21e9632
test: add six ruff rules that catch tests which cannot fail (#37709)
ryan-crabbe-berri Aug 20, 2026
1c1b3c5
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 20, 2026
861140b
perf(ci): measure unit-shard coverage with the sys.monitoring core (#…
yuneng-berri Aug 20, 2026
8a18e24
test: merge three stranded twins into the files that shadow them (#37…
yuneng-berri Aug 20, 2026
cde1344
test(ci): reject coverage-allowlist entries that no longer match a fi…
yuneng-berri Aug 20, 2026
21891b4
fix(proxy): count explicit zero prices on any billed metric as config…
mateo-berri Aug 20, 2026
2996a18
fix(model_prices): document 262k input limit on fireworks qwen3p8-max
mateo-berri Aug 20, 2026
648c6e7
feat(ci): assert .github/workflows holds only workflows, correctly na…
yuneng-berri Aug 20, 2026
7f539e3
Merge branch 'litellm_block_unpriced_models' of https://github.com/Be…
mateo-berri Aug 20, 2026
4af6665
feat(ci): freeze the conftest save/restore inventory so it can only s…
yuneng-berri Aug 20, 2026
996693f
fix(a2a): accept the whole JSON-RPC id union the spec defines (#37704)
yassin-berriai Aug 20, 2026
5301872
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 20, 2026
abdde94
fix(ptu): refuse an incomplete config.yaml reservation the way the en…
yucheng-berri Aug 20, 2026
6bb677d
fix(model-costs): correct gpt-5.6 input token cap
mateo-berri Aug 20, 2026
9432f40
bump: litellm-enterprise 0.1.57 -> 0.1.58, litellm-proxy-extras 0.4.8…
yuneng-berri Aug 20, 2026
d556fac
Merge pull request #37112 from mubashir1osmani/litellm_add_perplexity…
mateo-berri Aug 20, 2026
ab79b8d
fix: count tiered_pricing as a cost mapping when blocking unpriced mo…
mateo-berri Aug 20, 2026
60e03be
fix(ui): surface the paginated fallback on Cost Optimization (#37659)
tin-berri Aug 20, 2026
2dcd453
feat(shadow_eval)!: gate the per-key budget on dollar spend instead o…
tin-berri Aug 20, 2026
eb8d402
test(proxy): cover a registry model priced only via tiered_pricing
mateo-berri Aug 20, 2026
cb4eb82
feat(ui): per-model reasoning effort in the complexity tier editor (#…
tin-berri Aug 20, 2026
5c89490
Merge litellm_internal_staging into litellm_fix_responses_bridge_inco…
mateo-berri Aug 20, 2026
60706d5
feat(fal_ai): add gpt-image-2 image generation support
devin-ai-integration[bot] Aug 20, 2026
f3896c0
test(fal_ai): use monkeypatch for the gpt-image-2 cost map fixture
devin-ai-integration[bot] Aug 20, 2026
1d7f675
Merge pull request #37663 from BerriAI/litellm_azure_postgres_entra_auth
mateo-berri Aug 20, 2026
2b2d6d7
fix(proxy): apply DB-persisted safe litellm settings on every worker'…
mateo-berri Aug 20, 2026
3672fa9
fix(proxy): log block_requests_for_models_without_pricing updates lazily
mateo-berri Aug 20, 2026
a3b6762
fix(streaming): price partial-stream spend rows at the real model and…
mateo-berri Aug 20, 2026
cba4fa4
fix(redis): keep Azure AD and GCP IAM auth on URL and pool clients
mateo-berri Aug 20, 2026
bfe54eb
docs(redis): say why async paths cannot reuse redis_connect_func
mateo-berri Aug 20, 2026
3c44f8d
fix(ui): surface toggle failures on the block-unpriced-models setting
mateo-berri Aug 20, 2026
307ca1b
fix(redis): say when an async client drops an unusable connect func
mateo-berri Aug 20, 2026
df00c33
fix(proxy): reload the unpriced-model toggle regardless of supported_…
mateo-berri Aug 20, 2026
387a948
fix(scim): keep the matched user_id on POST /Users email match (#37701)
devin-ai-integration[bot] Aug 20, 2026
a030b33
fix(scim): fail group sync when a member add or user creation fails (…
devin-ai-integration[bot] Aug 20, 2026
3ea1c16
fix(auth): cache team member default budget as a typed model (#37695)
devin-ai-integration[bot] Aug 20, 2026
22e8b45
feat(proxy): add maximum_health_check_retention_period to bound the h…
devin-ai-integration[bot] Aug 20, 2026
d8a57a1
fix(reset_budget_job): reconnect and retry on transient DB transport …
devin-ai-integration[bot] Aug 20, 2026
bc52dd5
fix(proxy): split agent inference and management routes so admin node…
ryan-crabbe-berri Aug 20, 2026
a07b2c3
feat(helm): compose DATABASE_URL_READ_REPLICA from a reader host secr…
devin-ai-integration[bot] Aug 20, 2026
cacfc95
fix(datadog): normalize alias and request tag values before submissio…
devin-ai-integration[bot] Aug 20, 2026
18242ae
fix(router): isolate deployment model info (#37687)
devin-ai-integration[bot] Aug 20, 2026
618d907
fix(fal_ai): price gpt-image-2 unprefixed alias and edit endpoint
devin-ai-integration[bot] Aug 20, 2026
7bcdc6c
fix(logging): bound the shared logging executor backlog (#37694)
devin-ai-integration[bot] Aug 20, 2026
035a322
fix(proxy): capture requester IP in 401 and auth-time 429 failure log…
devin-ai-integration[bot] Aug 20, 2026
a974464
fix(logging): bound oversized error payloads written to stdout (#37684)
devin-ai-integration[bot] Aug 20, 2026
ebdbb31
perf(budget_reservation): tokenize each request once, off the event l…
devin-ai-integration[bot] Aug 20, 2026
3d39460
perf(prometheus): render /metrics off the event loop and coalesce con…
devin-ai-integration[bot] Aug 20, 2026
8c42d8b
fix(token_counter): stop large token counts from blocking the proxy e…
devin-ai-integration[bot] Aug 20, 2026
4773130
fix(caching): bound the semantic cache embedding lookup
mateo-berri Aug 20, 2026
33bafd0
fix(router): make prompt caching affinity aware of auto-injected cach…
devin-ai-integration[bot] Aug 20, 2026
14faec9
fix(redis): keep a coroutine redis_connect_func on async clients
mateo-berri Aug 20, 2026
8f68bc6
Merge pull request #37607 from BerriAI/litellm_lit_5869_cost_e2e_pins
mateo-berri Aug 20, 2026
bf59b7e
feat(rust): route /chat/completions through the Rust core for anthrop…
yassin-berriai Aug 20, 2026
d40aea8
Merge pull request #37679 from mubashir1osmani/litellm_lit5890_replay…
mateo-berri Aug 20, 2026
7003525
test: cover the qdrant semantic cache embedding deadline
mateo-berri Aug 20, 2026
3207014
fix(a2a): return SSE (text/event-stream) for message/stream instead o…
devin-ai-integration[bot] Aug 20, 2026
7b20828
fix(proxy): fail the standalone prisma migration entrypoint on migrat…
devin-ai-integration[bot] Aug 20, 2026
5c9ed89
fix: mark daybreak-blue-latest and gpt-5.6-sol as supporting computer…
mateo-berri Aug 20, 2026
bcf9e53
feat(sso): source generic OIDC user claims from ID/access token when …
devin-ai-integration[bot] Aug 20, 2026
b2aff8b
fix(proxy): claim batch cost rows atomically so multi-pod polling can…
devin-ai-integration[bot] Aug 20, 2026
2417613
refactor(redis): build the async auth kwargs instead of mutating them…
mateo-berri Aug 20, 2026
756a5fa
test(responses_bridge): type the incomplete-response test helpers
mateo-berri Aug 20, 2026
308c906
fix(redis): drop a connect func the async cluster client cannot accept
mateo-berri Aug 20, 2026
c73480c
fix(proxy): block every unpriced model a request names
mateo-berri Aug 20, 2026
52403d7
fix(jwt): retry JWKS fetches, serve stale keys, and return 503 when t…
devin-ai-integration[bot] Aug 20, 2026
cb89c7a
fix(ui): stop the Add Model mapping table from looping the page (#37741)
yuneng-berri Aug 20, 2026
09b391d
fix(redis): keep the credential provider off the Sentinel monitors
mateo-berri Aug 20, 2026
2a863f8
fix(containers): surface provider errors from container file content …
yuneng-berri Aug 20, 2026
c09643a
fix(redis): never hand a data-node credential provider to the Sentine…
mateo-berri Aug 20, 2026
0c2e404
test(ci): serve /moderations from the canned OpenAI mock (#37739)
yuneng-berri Aug 20, 2026
7d23d41
Merge branch 'litellm_internal_staging' of https://github.com/BerriAI…
mateo-berri Aug 20, 2026
6d66567
fix(fal_ai): stop advertising /v1/images/edits for gpt-image-2 edit
mateo-berri Aug 21, 2026
cc812cd
test: point the live web search, groq and vertex image suites at mode…
yuneng-berri Aug 21, 2026
e003017
feat(cognition): give Cognition its own provider identity
mateo-berri Aug 21, 2026
7b25ee1
fold the two reasoning-item casts into one shared helper
mateo-berri Aug 21, 2026
fb3dd0f
Merge pull request #37722 from BerriAI/litellm_gpt56_max_input_tokens
mateo-berri Aug 21, 2026
43995bc
fix(db): apply the configured connection params to the read replica U…
devin-ai-integration[bot] Aug 21, 2026
286c75f
Merge pull request #37729 from BerriAI/devin_ai_fal_gpt_image_2
mateo-berri Aug 21, 2026
c008d5e
fix(scim): propagate team roster write failures on group and user wri…
devin-ai-integration[bot] Aug 21, 2026
987478a
Merge pull request #37740 from BerriAI/litellm_redis_url_pool_credent…
mateo-berri Aug 21, 2026
e98b9fd
test: assert the prefixed model the responses bridge now hands back (…
yuneng-berri Aug 21, 2026
66a89f5
perf(reset_budget_job): elect one sweeper per tick and bound the wind…
yassin-berriai Aug 21, 2026
02e67cd
Merge pull request #35181 from BerriAI/litellm_block_unpriced_models
mateo-berri Aug 21, 2026
94239d2
test(e2e): name the pinned GitHub issue in each passthrough test docs…
mateo-berri Aug 21, 2026
d924226
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 21, 2026
332a0f1
fix(cognition): price swe-1.7 from the published standard tier
mateo-berri Aug 21, 2026
16bba15
require an incomplete reason before overriding finish_reason
mateo-berri Aug 21, 2026
211b399
Merge pull request #37658 from BerriAI/litellm_model_registry_consoli…
mateo-berri Aug 21, 2026
1a9e995
fix(cognition): restore Lightning SWE pricing and declare responses s…
mateo-berri Aug 21, 2026
de7dcbb
Carry real cache counts up instead of zeroing them on partial rows
mateo-berri Aug 21, 2026
c74e9e7
feat(ui): support project input and output TPM limits (#37676)
devin-ai-integration[bot] Aug 21, 2026
6eacdbf
Merge pull request #37541 from ljogeiger/litellm_vertex_parallel_fc_t…
mateo-berri Aug 21, 2026
27c3f87
fix(fal_ai): price gpt-image-2 per size and quality from request params
mateo-berri Aug 21, 2026
6742637
docs(cognition): tick the responses column in the provider table
mateo-berri Aug 21, 2026
680bcfd
test(lint): ban blind pytest.raises(Exception) with ruff B017 (#37731)
ryan-crabbe-berri Aug 21, 2026
dad4c1a
Merge pull request #37710 from BerriAI/litellm_fix_responses_bridge_i…
mateo-berri Aug 21, 2026
d57715b
chore(constants): drop the redundant comment on the semantic cache de…
mateo-berri Aug 21, 2026
12ed364
Merge branch 'litellm_internal_staging' into litellm_fix_messages_str…
mateo-berri Aug 21, 2026
2471e85
chore(lint): note why the streamed cost fallback swallows pricing errors
mateo-berri Aug 21, 2026
d5e6a0c
fix(fal_ai): strip provider prefix before keyed cost lookup
github-actions[bot] Aug 21, 2026
66a6a09
Merge pull request #37743 from BerriAI/litellm_cognition_provider_ide…
mateo-berri Aug 21, 2026
03a253a
Keep the model Azure Model Router recovered from later chunks
mateo-berri Aug 21, 2026
101ef7e
test(cost): cover the chat.completion.chunk and raising-pricer branches
mateo-berri Aug 21, 2026
4e02e7e
Merge pull request #37742 from BerriAI/litellm_lit5879_semantic_cache…
mateo-berri Aug 21, 2026
60225ab
test: assert the prefixed model the azure responses bridge now hands …
yuneng-berri Aug 21, 2026
35416c7
test: point the live together_ai suites at a model together still ser…
yuneng-berri Aug 21, 2026
655d107
fix(cost): keep mid-stream pricing from leaking a breakdown into the …
mateo-berri Aug 21, 2026
c010bd6
Only keep the builder's model when the client did not ask for it
mateo-berri Aug 21, 2026
65b4ac0
Merge pull request #37618 from BerriAI/litellm_lit_5870_passthrough_e…
mateo-berri Aug 21, 2026
0801493
Match the client-name check to the name the proxy actually stamps
mateo-berri Aug 21, 2026
f1c4145
fix(scim): resolve group members by SSO identity or email before crea…
devin-ai-integration[bot] Aug 21, 2026
a4dd1be
Merge pull request #35114 from BerriAI/litellm_fix_messages_stream_co…
mateo-berri Aug 21, 2026
a112ba5
test: enforce PT012 so a pytest.raises block cannot hide dead asserti…
ryan-crabbe-berri Aug 21, 2026
7d999a1
fix(cognition): price swe-1.7 at the standard tier, add swe-1.7-light…
mateo-berri Aug 21, 2026
16cd080
fix: populate team member emails missing from the roster snapshot
ryan-crabbe-berri Aug 21, 2026
722c650
test: cover generic HTTP streaming provider header forwarding
mateo-berri Aug 21, 2026
a66a10b
Merge pull request #37734 from BerriAI/litellm_fix_partial_stream_spe…
mateo-berri Aug 21, 2026
8a40aff
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
devin-ai-integration[bot] Aug 21, 2026
58c4fa6
chore: merge litellm_internal_staging into litellm_forward_bedrock_re…
devin-ai-integration[bot] Aug 21, 2026
354f497
Merge pull request #37751 from BerriAI/litellm_fal_gpt_image_2_keyed_…
mateo-berri Aug 21, 2026
2ea633d
fix(sagemaker_chat): send the inference component header and honor hf…
mateo-berri Aug 21, 2026
b76def0
test: require a `match=` on broad pytest.raises, and drop duplicate p…
ryan-crabbe-berri Aug 21, 2026
b64f180
Merge pull request #37759 from BerriAI/litellm_team_info_member_email
ryan-crabbe-berri Aug 21, 2026
4b29702
Merge pull request #37003 from BerriAI/litellm_forward_bedrock_respon…
mateo-berri Aug 21, 2026
ecd18c5
Merge pull request #37763 from BerriAI/litellm_fix_cognition_swe_1_7_…
mateo-berri Aug 21, 2026
e17988f
Merge pull request #37766 from BerriAI/litellm_sagemaker_chat_inferen…
mateo-berri Aug 21, 2026
6d16963
chore: sync upstream 2026-08-21
claude Aug 21, 2026
beb2e4d
fix: restore UsageTab.test.tsx to upstream (drop dead QueryClientProv…
claude Aug 21, 2026
9152739
fix: restore default_control threading in _apply_message_injections
claude Aug 21, 2026
5c7ae49
fix(tests): narrow pytest.raises(ValueError) in test_pinned_provider_…
claude Aug 21, 2026
b0ba9c8
chore: bump LIT001/LIT011 type-discipline ceilings for 2026-08-21 sync
claude Aug 21, 2026
535ac55
chore: bump TQ005 test-quality ceiling for 2026-08-21 sync
claude Aug 21, 2026
4275616
fix: remove duplicate batch-cost claim layer that silenced all billing
claude Aug 21, 2026
aeac483
fix: skip redundant runtime prisma generate under non-root uid
claude Aug 21, 2026
c7828f5
docs: document LITELLM_PRISMA_CLIENT_PREBAKED in fork-patches.txt
claude Aug 21, 2026
07ab706
fix: remove duplicated ui-builder stage in Dockerfile
claude Aug 21, 2026
b01afc5
fix(batches): claim batch-cost rows after the results fetch, not before
shudonglin Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,7 @@ jobs:
name: Run tests
command: |
mkdir -p test-results
TEST_FILES=$(circleci tests glob "tests/agent_tests/**/test_*.py" | grep -v "^tests/agent_tests/local_only_agent_tests/")
TEST_FILES=$(circleci tests glob "tests/agent_tests/test_*.py")
echo "$TEST_FILES" | circleci tests run \
--verbose \
--command="tr ' ' '\\n' | awk '/\\.py/ {print; next} {sub(/\\.[A-Z][^.]*$/, \"\"); gsub(/\\./, \"/\"); print \$0 \".py\"}' | xargs uv run --no-sync python -m pytest \
Expand Down
117 changes: 48 additions & 69 deletions .github/ci-coverage-allowlist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,25 @@ description: >-
by a job nor listed here, so every entry below is a decision on the record.

test_paths:
- reason: >-
The caching suite in tests/local_testing, which runs nowhere. Every job that globs that
directory either deselects it (local_testing_part1 and part2 carry `-k "... and not caching
and not cache"`) or keeps only another keyword (langfuse, router, assistants), and no job
names these files the way redis_caching_unit_tests names test_dual_cache.py. Measured
2026-08-20 by collecting the directory under each job's own selector: 118 tests across
these eight files are selected by none of them. Listed so the gap is a decision rather
than an accident, and so the --slices guard has a baseline to ratchet down from. Revisit
when tests/local_testing is ported off CircleCI, where the keyless part of this suite
belongs in a real job
paths:
- tests/local_testing/test_cache_preset_key.py
- tests/local_testing/test_caching.py
- tests/local_testing/test_caching_handler.py
- tests/local_testing/test_disk_cache_unit_tests.py
- tests/local_testing/test_gcs_cache_unit_tests.py
- tests/local_testing/test_prompt_caching.py
- tests/local_testing/test_responses_stream_cache_keys.py
- tests/local_testing/test_unit_test_caching.py
- reason: >-
The end-to-end suite runs against a deployed proxy from its own in-cluster rig rather than
from a pull request; it needs a live gateway and provider credentials no PR job holds
Expand All @@ -21,72 +40,24 @@ test_paths:
- tests/documentation_tests/test_requests_lib_usage.py
- tests/documentation_tests/test_standard_logging_payload.py
- reason: >-
Sibling files here are executed by name from the code-quality workflow; this one is referenced
by no job
Named like a test but shaped like a benchmark: it fetches live image URLs, times aiohttp
against httpx, prints the ratio, and asserts nothing, so pytest cannot collect it (its
functions take arguments, not fixtures) and running it beside its siblings in the
code-quality workflow would add a network dependency for a number nothing reads. Exempt
as a script rather than as an unresolved gap; revisit by deleting it once the aiohttp
choice it informed is settled
paths:
- tests/code_coverage_tests/test_aio_http_image_conversion.py
- reason: >-
A second mirror of the package tree living beside tests/test_litellm, which is the mirror the
repo convention names; only test_no_hardcoded_secrets.py is invoked, from the linting
workflow, and whether this directory should exist at all is unresolved
The last file of a second mirror that sat beside tests/test_litellm and ran nowhere. Its
other 33 files landed in the real mirror during August 2026, 30 as moves and 3 by merging
their bodies into the live file of the same name. This one cannot follow either route yet:
its live twin was rewritten from 1268 lines to 9434, and of the 19 tests here 5 have no
counterpart while 25 assertions fail against today's code, so what survives that rewrite
is a judgement about the endpoints, not a merge. Revisit by deciding which of the five
behaviours still hold
paths:
- tests/litellm/a2a_protocol/providers/pydantic_ai_agents/test_pydantic_ai_agent_headers.py
- tests/litellm/a2a_protocol/providers/pydantic_ai_agents/test_pydantic_ai_agent_transformation.py
- tests/litellm/integrations/helicone/test_helicone_gemini.py
- tests/litellm/litellm_core_utils/test_json_schema_validation.py
- tests/litellm/llms/anthropic/test_anthropic_reasoning_effort.py
- tests/litellm/llms/anthropic/test_anthropic_schema_filter.py
- tests/litellm/llms/azure/test_azure_embedding.py
- tests/litellm/llms/bedrock/embed/test_embedding.py
- tests/litellm/llms/bedrock/test_nova_imported_models.py
- tests/litellm/llms/deepseek/chat/test_deepseek_chat_transformation.py
- tests/litellm/llms/gradient_ai/chat/test_gradient_ai_chat_transformation.py
- tests/litellm/llms/oci/chat/test_oci_chat_transformation.py
- tests/litellm/llms/openai_like/test_abliteration_provider.py
- tests/litellm/llms/openai_like/test_assemblyai_provider.py
- tests/litellm/llms/openai_like/test_empiriolabs_provider.py
- tests/litellm/llms/vertex_ai/agent_engine/test_transformation.py
- tests/litellm/llms/vertex_ai/gemini/test_transformation.py
- tests/litellm/llms/vertex_ai/text_to_speech/test_transformation.py
- tests/litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py
- tests/litellm/proxy/agent_endpoints/test_agent_rbac.py
- tests/litellm/proxy/common_utils/test_rbac_utils.py
- tests/litellm/proxy/management_endpoints/test_common_utils.py
- tests/litellm/proxy/management_endpoints/test_cost_estimate_endpoint.py
- tests/litellm/proxy/test_claude_code_marketplace.py
- tests/litellm/proxy/test_init_litellm_callbacks.py
- tests/litellm/proxy/test_prisma_engine_watchdog.py
- tests/litellm/proxy/vector_store_endpoints/test_vector_store_rbac.py
- tests/litellm/test_bedrock_extended_beta_models.py
- tests/litellm/test_bedrock_nemotron_super.py
- tests/litellm/test_proxy_auth.py
- tests/litellm/test_router_retry_backoff_headers.py
- tests/litellm/test_sambanova_model_metadata.py
- tests/litellm/test_stream_chunk_builder_images.py
- reason: >-
Legacy proxy suite superseded by the proxy shards; no job invokes it and whether it still
describes supported behaviour is unresolved
paths:
- tests/old_proxy_tests/tests/test_anthropic_context_caching.py
- tests/old_proxy_tests/tests/test_anthropic_sdk.py
- tests/old_proxy_tests/tests/test_async.py
- tests/old_proxy_tests/tests/test_gemini_context_caching.py
- tests/old_proxy_tests/tests/test_langchain_embedding.py
- tests/old_proxy_tests/tests/test_langchain_request.py
- tests/old_proxy_tests/tests/test_llamaindex.py
- tests/old_proxy_tests/tests/test_mistral_sdk.py
- tests/old_proxy_tests/tests/test_openai_embedding.py
- tests/old_proxy_tests/tests/test_openai_exception_request.py
- tests/old_proxy_tests/tests/test_openai_request.py
- tests/old_proxy_tests/tests/test_openai_request_with_traceparent.py
- tests/old_proxy_tests/tests/test_openai_simple_embedding.py
- tests/old_proxy_tests/tests/test_openai_tts_request.py
- tests/old_proxy_tests/tests/test_pass_through_langfuse.py
- tests/old_proxy_tests/tests/test_q.py
- tests/old_proxy_tests/tests/test_simple_traceparent_openai.py
- tests/old_proxy_tests/tests/test_vertex_sdk_forward_headers.py
- tests/old_proxy_tests/tests/test_vtx_embedding.py
- tests/old_proxy_tests/tests/test_vtx_sdk_embedding.py
- reason: >-
No job invokes this suite and its files mix pure transformation tests with ones driving live
vendor vector stores, so assigning them needs a per-file decision
Expand Down Expand Up @@ -116,6 +87,14 @@ test_paths:
- tests/load_tests/test_otel_load_test.py
- tests/load_tests/test_vertex_embeddings_load_test.py
- tests/load_tests/test_vertex_load_tests.py
- reason: >-
A local-only agent rig: test_a2a_completion_bridge.py needs a LangGraph server on
localhost:2024 and test_a2a.py drives a live A2A endpoint, so neither can run in a
pull request job. Until 2026-08-20 the CircleCI agent job hid them behind a grep -v
that this census could not see; the glob now excludes them structurally and this entry
is the decision on the record. Revisit when the A2A bridge gets a recorded-wire fixture
paths:
- tests/agent_tests/local_only_agent_tests
- reason: >-
Third-party integration tests that skip themselves without OCI configuration or sandbox
credentials, neither of which a pull request job holds
Expand All @@ -124,14 +103,14 @@ test_paths:
- tests/integration/test_oci_integration.py
- tests/integration/test_oci_proxy_integration.py
- reason: >-
Two prompt-factory tests sitting at the top level of tests/ instead of under the
tests/test_litellm mirror the shards enumerate; they need moving rather than a shard entry
paths:
- tests/litellm_core_utils/test_anthropic_dedup_factory.py
- tests/litellm_core_utils/test_bedrock_converse_dedup_factory.py
- reason: >-
A unit test for the proxy-extras package that no job invokes, while the package's other tests
live under tests/proxy_migration_tests
A unit test for the proxy-extras package that no job invokes, while the package's other
tests live under tests/proxy_migration_tests. Measured 2026-08-20: 24 of its 28 tests pass
and the 4 in TestMigrationSQLIdempotency fail, because 13 migrations from 2026-03 onward use
bare CREATE TABLE, ADD COLUMN, CREATE INDEX and ADD CONSTRAINT rather than the guarded forms
this file requires. It also matches those keywords inside SQL comments, so two further
migrations are reported that are in fact fine. Wiring it up means deciding what to do about
the 13 first, and they cannot simply be edited: Prisma checksums an applied migration, so a
changed one breaks migrate deploy for existing installs
paths:
- tests/litellm-proxy-extras/test_litellm_proxy_extras_utils.py

Expand Down
5 changes: 5 additions & 0 deletions .github/fork-patches.txt
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,8 @@ ui/litellm-dashboard/src/components/Settings/AdminSettings/PluginSettings/schema
litellm/llms/bedrock/chat/invoke_handler.py | self.accumulated_reasoning_content: str = "" | 2026-08-20 sync merge corruption: AWSEventStreamDecoder.__init__ dropped the fork-only accumulated_reasoning_content init while a sibling `self.accumulated_reasoning_content += reasoning_content` accumulation line (added earlier, untouched by upstream's nearby edits) survived, raising AttributeError on every Converse streaming reasoning delta (7 test failures: test_converse_streaming_usage_accounts_for_streamed_reasoning, the Nova 2 streaming suite). Also restored the call site's dropped `reasoning_content=(self.accumulated_reasoning_content or None)` argument to converse_config.transform_usage, which the merge silently replaced with only the new upstream `thinking_ran` argument. Same drop-only-the-declaration/drop-only-the-argument class as the anthropic legacy-thinking translation and litellm_pre_call_utils import entries above. REMOVAL CONDITION: remove once upstream threads its own equivalent reasoning-content accumulator through AWSEventStreamDecoder.
litellm/llms/bedrock/chat/converse_transformation.py | reasoning_tokens: Final = min(estimated_reasoning_tokens, output_tokens) | 2026-08-20 sync merge reverted transform_usage's fork-only reasoning-token clamp: our tokenizer re-estimates Converse's un-reported reasoning token count from raw text, and an overestimate must not drive completion_tokens_details.text_tokens negative. Upstream's version (which also added the new `thinking_ran` parameter, preserved here) has no clamp at all. Verified present and passing on the prior day's merged commit (5049a8f7d) before being silently dropped; broke test_transform_usage_clamps_reasoning_estimate_to_output_tokens (assert 11 == 1, text_tokens=-10). REMOVAL CONDITION: remove once upstream ships an equivalent reasoning-token clamp itself.
basedpyright-code-budget.json | "reportPrivateUsage": {\n "limit": 1833 | reportPrivateUsage 1823->1833 during the 2026-08-20 upstream sync: `type_check_gate.py --update` ratcheted 1148 errors down across 48 other rules (including reportOperatorIssue, fully resolved) but cannot raise an over-budget rule, so this one was bumped by hand to the exact verified current total, same class as the ruff-strict-budget.json/type-discipline-budget.json resets above. REMOVAL CONDITION: lower back toward 1823 via a dedicated cleanup pass, or accept future syncs nudging it further if upstream's own counts keep growing.
enterprise/litellm_enterprise/proxy/common_utils/check_batch_cost.py | attribution = self._get_job_attribution(job) | 2026-08-21 sync merge corruption, round 3 (same recurring class as the 2026-08-09/2026-08-14/2026-08-15 entries above): upstream independently grew its own second job-claim layer this cycle (_claim_job_for_costing / _release_job_claim, called from inside _track_completed_batch_cost right before the spend-log write) alongside the fork's pre-existing layer (_claim_job / _release_job_claim / _finalize_job, called from check_batch_cost before _track_completed_batch_cost even runs). Both additions land in disjoint hunks, so the merge auto-applied both with no conflict, silently producing two claim layers stacked on the same row: the outer _claim_job flips batch_processed=True before the inner _claim_job_for_costing runs, so the inner claim's own compare-and-swap (where batch_processed=False) always finds 0 rows and _track_completed_batch_cost always returns None without ever calling async_success_handler -- batches stop being billed at all, and the row is left oscillating between claim and release every poll cycle. Also silently shadowed: Python keeps only the LAST definition of a duplicate method name, so the fork's fenced _release_job_claim(status="pricing") was shadowed by upstream's simpler unfenced one, meaning the release path stopped restoring status to "validating" too. Fixed by deleting upstream's newly-added _claim_job_for_costing method, its duplicate _release_job_claim definition, and the wrapping claim-check/try-release-on-exception it added around the async_success_handler call in _track_completed_batch_cost, restoring this file to byte-identical with the pre-sync commit for this whole region. REMOVAL CONDITION: none; regression fix. Separately, NOT fixed by this patch: upstream's new claim timing (claim right before the spend-log write, after the results fetch) exists specifically because claiming earlier -- which is what the fork's _claim_job still does, unchanged since before this sync -- flips batch_processed=True before the output file has been read, and the managed-files deletion guard treats batch_processed=True as "safe to delete," so a concurrent delete can remove the very output file an in-flight costing run is reading. This is a real, pre-existing gap in the fork's design (not introduced by this sync) that tests/proxy_unit_tests/test_check_batch_cost.py::TestMultiPodBatchCostClaim (upstream's brand-new test class this cycle) catches; closing it requires moving the fork's claim point later while preserving its status="pricing" fencing, _reclaim_abandoned_pricing_claims sweep, and spend-already-recorded dedup marker, none of which upstream's simpler single-flag claim provides, so it is a deliberate follow-up, not part of this merge-corruption fix. REMOVAL CONDITION: track upstream's job-claim/locking layer maturity as in the 2026-08-09 entry above; additionally, reconcile the claim-timing gap once a deliberate redesign of the fork's claim point is scoped and reviewed.
litellm/proxy/prisma_migration.py | LITELLM_PRISMA_CLIENT_PREBAKED | Skips the standalone entrypoint's own runtime `prisma generate` when set. Genuine upstream breakage, confirmed present on a clean upstream checkout (Dockerfile, docker/Dockerfile.non_root, and prisma_migration.py are all byte-identical to upstream/litellm_internal_staging): upstream's own PR #37692 (merged into this fork by the 2026-08-21 sync) made the entrypoint return prisma generate's exit code by default instead of only logging it, turning a previously-silent failure into a hard one. prisma-python's generator.generate() unconditionally re-copies schema.prisma into the installed package and chmod's the copy even when the content already matches (prisma/generator/generator.py compares paths, not bytes), and shutil.copy's chmod step (copymode) requires owning the destination file -- something no arbitrary non-root runtime uid does for a file baked into the image at build time, no matter how the image's permissions are set up. The runtime images already bake the generated client from this same schema.prisma at build time, so re-running generate at container start is pure redundant work; skipping it removes the only place that redundant call is made (migrations/run.py's ProxyExtrasDBManager never calls it). REMOVAL CONDITION: remove once upstream either stops re-running `prisma generate` in this entrypoint for prebaked images, or prisma-python skips schema.prisma re-copy/chmod when the destination already matches.
Dockerfile | LITELLM_PRISMA_CLIENT_PREBAKED=true | Sets the runtime-stage env var read by litellm/proxy/prisma_migration.py's LITELLM_PRISMA_CLIENT_PREBAKED skip (see that file's fork-patches.txt entry for the full root cause). REMOVAL CONDITION: same as litellm/proxy/prisma_migration.py's entry.
docker/Dockerfile.non_root | LITELLM_PRISMA_CLIENT_PREBAKED=true | Sets the runtime-stage env var read by litellm/proxy/prisma_migration.py's LITELLM_PRISMA_CLIENT_PREBAKED skip (see that file's fork-patches.txt entry for the full root cause); this Dockerfile's existing chown/chgrp of the venv's prisma package dir for GID 0 is necessary but not sufficient, since it cannot satisfy generate()'s chmod-requires-ownership check for an arbitrary uid either. REMOVAL CONDITION: same as litellm/proxy/prisma_migration.py's entry.
enterprise/litellm_enterprise/proxy/common_utils/check_batch_cost.py | _claim_job called from _track_completed_batch_cost | 2026-08-22 resolution of the claim-timing gap left open by the 2026-08-21 entry above. The fork claimed a row before fetching its results, which flipped batch_processed=True while the output file was still being read. Two consequences, both real: the managed-files deletion guard (_get_batches_referencing_file filters batch_processed=False) stopped holding the output file, so a concurrent delete could remove the very file the in-flight costing was reading; and a worker killed mid-fetch left the batch marked processed, unbillable by any other pod until _reclaim_abandoned_pricing_claims swept it hours later. Moved the claim to where upstream's own claim sits, inside _track_completed_batch_cost immediately before logging_obj.async_success_handler, WITHOUT adopting upstream's simpler single-flag claim: the fork's status="pricing" fencing, _reclaim_abandoned_pricing_claims sweep, _mark_spend_recorded dedup marker and fenced _finalize_job are all retained, so the crash-re-billing and disable_spend_logs protections they provide are unchanged. Losing the compare-and-swap now costs only a duplicated results fetch (the winner bills exactly once) and is signalled to the caller by the CLAIM_LOST sentinel, distinct from the unroutable-row None. Callers that previously released a claim they held across the fetch no longer do so: a failed fetch never took a claim and leaves the row untouched outright, while a failed spend-log write releases inside _track_completed_batch_cost. tests/proxy_unit_tests/test_check_batch_cost.py::TestMultiPodBatchCostClaim (upstream's class) now passes; its journal and claim-call assertions were adapted to the fork's write shape (claim carries status="pricing"; the marker and fenced finalize are separate writes) while every behavioural assertion upstream makes is kept. REMOVAL CONDITION: track upstream's job-claim/locking layer maturity as in the 2026-08-09 entry above; the claim-timing divergence itself is now closed, so only the extra fencing/sweep/marker remain fork-only.
Loading
Loading