On this page

What the fleet lacks

stado fleet needs answers one question from evidence: what should be added to the fleet — storage where, cores where, a GPU, a machine of a platform nobody declared. Every sentence it prints carries the numbers it was computed from, and every number comes from something the fleet already wrote. It never measures a host itself and never invents a demand: no record asking for Windows means no Windows need, however plausible one sounds.

stado fleet needs [--days N] [--json]

--days N reads only the last N days of refusals; without it every retained refusal is read. A fleet that wants nothing prints exactly

the fleet reports no unmet need in every recorded refusal

(in the last N days with --days N), and --json gives {"schema_version": 1, "generated_at": …, "window_days": null, "needs": []} ("window_days": N with --days N).

What it reads

  • Capacity publications — every host's capacity/<consumer>.json, stale ones flagged and ignored for present-tense findings: disk_pressure_active and disk_used_percent (the disk-full rule's verdict on the volume the host writes to), free_disk_gb, admission_reason, running_workloads, reserved, and the accelerator holders.
  • The registry — each host's release_platform and gpu_type.
  • The queue — every queued job; a job that no declared host or live GPU could run is demand the fleet is failing to serve the moment it is queued, and its platform_os, gpu_type and gpu_mem_gb say what it wanted.
  • Unmet placement records — state/fleet/unmet/<day>/<id>.json, one per refused placement, written by every refusing path: a reservation refused for room or admission, and a stado workload run no declared host can take. Each carries the kind, the product, who asked, what it required (platform, gpu type, VRAM, RAM, cores), the reason from a closed set — no_eligible_target, capacity_exhausted, reservations_exhausted, disk_pressure (a host at the disk-full threshold, unable to read its volume, or held by a cleanup pass) — and every candidate host with the sentence it was refused with. Records written by earlier releases may carry memory_pressure; nothing writes it now.

The rules

Each need has a kind, a severity, a one-sentence summary, the evidence lines it was computed from (each naming its source: capacity, registry, queue or unmet) and a suggestion in plain words.

storage, per host. The host publishes disk_pressure_active: true: its volume is at or past the 80% disk-full threshold, so its janitor is deleting everything the fleet put there and what remains is the user's. High; the suggestion is to add storage, or to read stado space report for what holds the volume.

cpu, per host. The host publishes admission_reason: reservations_exhausted (its reservations leave no core or no RAM), or any placement read was refused on it as full. Medium; the suggestion is more cores or a second machine beside it.

host, per platform. Refused placements or queued jobs asked for a platform (windows-amd64, linux-amd64, darwin-arm64) that no declared target has. High; the suggestion is to add such a machine and register it with stado registry host add. A gui-automation workload asks for darwin-arm64, so a fleet with no Mac shows this need the first time someone runs one.

gpu, fleet-wide. A queued job or a refused placement wants more VRAM than any host publishes or a gpu_type no target declares; or the only GPU host publishes zero free VRAM while vram_unattributed_gb says the memory is held by something that is not a Stado job. High; the suggestion is a bigger or second GPU host, or freeing the card — stado space report on that host names the process holding it.

Needs are printed highest severity first. Text output is one block per need:

high storage (example-host): example-host is at the 80% disk-full threshold: 93.4% used, 15.2 GiB free
  capacity: example-host published 0s ago: disk_pressure_active true, disk_used_percent 93.4, free_disk_gb 15.2
  suggestion: the janitor on example-host deletes everything the fleet put there; what remains is the user's data — add storage to example-host, or read `stado space report example-host` for what holds it

Memory is not a need: hosts publish memory as readings only, and no host declares a memory threshold for it to be judged against.

What it does not do

It buys nothing, declares nothing and writes nothing. It is a reading. The refusal --days must be at least 1 is the only way it stops; a store or registry it cannot read is reported as the command's own failure.

Stado Desktop

The Fleet screen carries a Needs section that reads stado fleet needs --json through the selected endpoint's POST /api/operator/run and shows the same blocks: severity, kind, subject, summary, evidence and suggestion, with the window selectable. It does not launch a local CLI.

Compare ways to resolve a need

Needs are observations, not a purchasing recommendation or a cash return. Expansion and payback compares complete buy, upgrade, rent, reclaim and relocate bundles against these needs under an expenditure budget. Each bundle supplies dated cost and benefit assumptions; the planner reports missing evidence, exclusions and the selected portfolio's payback. stado fleet expansion plan --budget-usd 10000 --horizon-months 24 --json saves that comparison without buying or enrolling a host. Desktop exposes it under Fleets → Plan expansion…, including catalog editing and saved history.

Source: this website