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_activeanddisk_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_platformandgpu_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_typeandgpu_mem_gbsay 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 astado workload runno 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 carrymemory_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