---
title: "Review model and budget migrations"
description: "Account for reservation, reasoning-effort and quota-charge changes before comparing spend."
canonical_url: "https://docs.oz0.ai/fleet/upgrades/model-and-budget-changes"
---
# Review model and budget migrations

> Account for reservation, reasoning-effort and quota-charge changes before comparing spend.

For: cluster operators.

Account for reservation, reasoning-effort and quota-charge changes before comparing spend.

## Budgets reserve each call's worst case

From this release every model call reserves its worst case against its budgets before it is sent ([Each call reserves its worst case](https://docs.oz0.ai/build/parts/contracts-and-limits/budgets#each-call-reserves-its-worst-case)). What you may notice after the upgrade:

- Budgets refuse earlier, and parallel calls take turns. A call holds its input and its whole output limit while it runs, at the higher of its record's and the list price. An agent that sets no output limit sends the model's largest (Pydantic AI does), so a small budget runs its calls one at a time, and parallel children wait for each other (`oz0_budget_busy`) instead of all starting. Give the agent `limits.max_output_tokens`, or describe the model's `--max-output` in its provider record, or raise the budget.
- A call whose outcome is unknown costs its reservation. A timeout, a stream that broke off, a node lost mid-call or a 502 or 504 between the edge and the model is charged at least what it reserved, and `oz0 usage` counts it as incomplete. Cost reports of failure-heavy days show more than they did. Only a call under a budget has a reservation: one without is marked incomplete and costs what was metered.
- A model nothing prices reserves at a price. A call to a model that neither its provider record nor the list prices (a provider that reports its own cost, a name only the answer resolves) reserves at the record's highest price, or $15 and $75 per million input and output tokens on a record with no prices. Give the model its price on the record to reserve its own.
- A tenant's `reserve: strict` holds for every agent. An agent's definition can choose `strict` where the tenant has not, but no longer `last_call` where the tenant chose `strict`.
- Budgets fail closed. A budgeted call whose budgets cannot be read gets `503 oz0_budget_unavailable`, which agents wait on, where it used to go through; so do a node-local model call and a child's start whose budgets or owner's and team's quotas cannot be read. Calls without a budget are not affected.
- The edge admits child starts too, against the tree's limits and the budget, and a delegation or a flow tool's flow also against the parent's `delegation.max_children` and `max_depth`, as the runtime counts them (an outcome's reviewer and a flow's steps are not delegations). A runtime that follows the protocol never meets it; the runtime of this release also takes each delegation's slot before it waits for anything (patch `oz0-p94-slot`), and histories recorded before replay unchanged.
- Upgrade every edge of a cluster together: an edge of the old release keeps its own in-memory estimate and does not see the others' reservations.

## Reasoning effort beside the model

From this release an agent may ask for a [reasoning effort](https://docs.oz0.ai/spend/models-and-keys/effort-and-cascades#reasoning-effort) with
`model.effort`, and a tenant may set a ceiling. What you may notice:

- Nothing changes until something sets an effort. An agent without `model.effort`, on an alias without effort
defaults, in a tenant without a ceiling, runs at its model's own default as before; no plugin OZ ships sets one yet.
- Jobs that started before the upgrade keep running at their models' defaults, also on replay; jobs that start
after it ask the edge for their efforts when their model resolves (one more model step in the trace of a harness
agent on a built-in model).
- An upgraded runtime on an edge from before is answered without efforts: its jobs run at their models' defaults,
and their traces say so (`effort_adjusted`). Upgrade the edges first.
- A ceiling lowers calls above it at the gateway, also a plugin's server's, a harness session's that sets its own
effort, and those of jobs that started before the ceiling or before the upgrade: they go on at the ceiling, and the
answer's `Oz0-Effort-Lowered` header says so. A model whose own default is above the ceiling is sent the ceiling.
- `harness-claude` 0.1.3 passes the session's effort to the Agent SDK; an older one ignores it, and its sessions
run at Claude Code's own default.
- A Claude Code plugin's subagent with `effort:` now keeps it as its `model.effort` when it is imported or updated,
instead of dropping it with a note.

## Each call's quota charge carries the call's ID

From this release a call's charge to its owner's and team's quota carries the call's ID, so a charge written again
(by another edge, from an edge's disk after a restart, or by the edge's clean-up pass) is applied once
([Budgets and quotas](https://docs.oz0.ai/spend/budgets-and-quotas)). What to know when you upgrade:

- Upgrade management first where edges run apart from management. An upgraded edge sends its charges as a
buffered write that only an upgraded management applies; until then the edge keeps them on its disk, and management
applies them once it runs this release.
- A call charged just before the upgrade may be charged twice, once. A charge the earlier release wrote carries
no ID. If an edge stops for the upgrade after a call's usage was recorded and charged but before its reservation
was settled, the upgraded edge's clean-up pass charges the call again; so does a node that sends a report again
across the upgrade. It touches only calls in flight while an edge stops, and only adds: the quota may refuse a call
a little early until the period ends.
- The IDs are forgotten after 30 days, on SQLite as on PostgreSQL.


## Sitemap

See the full [sitemap](https://docs.oz0.ai/sitemap.md) for all pages.
