On this page

Costs

What does the fleet cost, and what stops autonomy from spending more than you allow? Budgets live in the autonomy policy, the forecast decides when new cloud spend is blocked, and two command groups read the money: stado cost for attributed workload cost, stado billing for what the providers themselves report. Flag-by-flag listings live in cli.

Budgets in the autonomy policy

The policy's budgets block holds five optional limits. Each must be a finite non-negative number; an absent limit does not constrain.

Field What it gates
hourly_usd Hourly spend ceiling. Headroom for new cloud placement is this minus the current hourly burn.
daily_usd Daily spend ceiling. Divided by 24 it also caps the hourly headroom — the tighter of the two wins.
monthly_usd Monthly ceiling. Headroom is this minus the projected end-of-month total.
max_single_action_usd Any single autonomous action estimated above this is denied by policy authorization.
max_commitment_usd Gates the commitment recommendation only. Purchases classified as financial commitments are denied in every mode: they require an operator-approved immutable plan.

Apply budget changes like any policy change — stado optimize policy apply --expect-version (autonomy).

The forecast and what budget_exceeded blocks

Every cycle builds a forecast from the attributed cost allocation, the policy budgets, and the last billing snapshot: current hourly burn, end-of-month projection, hourly/daily/monthly overruns, and — when the billing snapshot carries a credit balance — the credit runway in days. budget_exceeded is true when the hourly or daily overrun is positive, or the end-of-month projection exceeds monthly_usd.

An exceeded budget blocks exactly one thing: new cloud placement. The cycle logs the guard with all three overruns and gives the placement stage zero new-cloud headroom. Existing work keeps running; reconciliation, advice, and reporting continue. Independently of the guard, only enforce-owned mode ever receives a nonzero new-cloud budget — report and enforce-safe place no new cloud spend regardless of headroom.

Reading workload cost: stado cost

Per-job and per-batch cost reporting from observed wall-times:

Command Answers
stado cost report $ spent per target_kind and per model, from completed jobs.
stado cost estimate <BATCH_FILE> Projected total $ for a batch file, using observed per-job cost.
stado cost allocation The attributed provider/owner/workload cost ledger.
stado cost forecast Current burn, month-end projection, budget, credit runway.
stado cost anomalies Active cost and resource anomalies.
stado cost savings Predicted versus realized savings, from measured decision outcomes.

The reports behind these are persisted by the autonomy cycle under state/autonomy/cost/ (prices.json, allocation.json, forecast.json, anomalies.json, savings.json), so they are readable even between cycles.

Reading provider billing: stado billing

Cross-cloud costs, grants, burn, and credit balances, published as the billing snapshot at billing_health/credits.json:

stado billing show
stado billing refresh
stado billing watch --interval 5m

show reads the last snapshot the coordinator published; refresh queries the billing providers now and publishes a fresh one. watch is a foreground watchdog that polls, evaluates the credit balance AND account health, and alerts on transitions — a section with no balance figure at all (no_credentials, error) is a finding, not a gap. It is deliberately runnable outside the cloud it monitors: a collector that dies with its provider cannot warn you about that provider, which is exactly what happened when the collector ran as a Cloud Function inside the project it measured. --once evaluates a single poll and exits.

The historical GCP project

Billing for the historical GCP project (wisent-480400) is detached on purpose and stays detached; it is not a defect. A 403 naming billing — accountDisabled on a GCS or provider API call — means some part of the system still depends on that project, and the GCP dependency is the thing to remove, not the billing to restore. The 2026-07-27 outage this caused, and the local-only containment profile that followed, are recorded in the incident report; the billing service principal now comes from Skarbiec and nowhere else, so no fallback can quietly recreate the cross-cloud coupling.

Source: this website