On this page
Workloads
stado workload places declared work on an eligible registry host and returns either the interactive stream or the workload's report/receipt. Workload names, product ownership, interaction mode, registry gates, accepted plan schemas, and report fields are data rather than CLI variants. A new product workload is one row in the declaration.
Invocations
stado workload list [--json]- Lists every compiled workload kind.
--jsonreturns{schema_version, workloads}and each workload carrieskind,product,interactive,registry_allowance,plan_schema, andreport.
- Lists every compiled workload kind.
stado workload run <KIND> [--target <TARGET>] [--plan <FILE>] [--json]- Runs a non-interactive kind.
--targetpins placement; without it Stado chooses an eligible local registry target.--plansupplies the declared JSON schema.--jsonreturns the workload report or receipt. A workload whose process failed reports that process's own last output:weles-browser-taskcarriesstdout_tailandstderr_tailin its report, and its refusal sentence quotes both, so the failing browser step is read instead of the newest warning line.
- Runs a non-interactive kind.
stado workload status <KIND|ID> [--target <TARGET>] [--json]- Reads a kind report. Capture and diagnostic receipts may be addressed as
weles-capture:<batch>andweles-diagnostics:<run-id>; a bare receipt ID is treated as a capture batch.--targetpins the report host.--jsonreturns the full report.
- Reads a kind report. Capture and diagnostic receipts may be addressed as
stado workload attach <KIND> [--target <TARGET>] [--workspace <WORKSPACE>] [--resume <SESSION>]- Attaches inherited stdin/stdout/stderr to an interactive kind.
jeden-sessionderives the workspace from the current directory, selects by live capacity when unpinned, and attaches to the managed Jeden runtime whose durable ledger is~/.jeden/sessions.--resumerequires the selected host to own that named ledger. Nothing but the managedjedenandstadobinaries is required on the host: the attachment runs the managed Jeden with~/.stado/binahead of itsPATH, and Jeden reads its own credentials through Stado.
- Attaches inherited stdin/stdout/stderr to an interactive kind.
Native API
GET /api/operator/workload/attach upgrades one authenticated request to a WebSocket that owns one interactive attachment. It answers to the same authorization as POST /api/operator/run: loopback callers are trusted by the Host guard, and every other caller presents an operator bearer.
- The first client frame is the attachment request:
{"kind", "target", "workspace", "resume", "confirmation"}, andconfirmationmust beRUN_MUTATIONbecause an interactive attachment can change the target. - The server answers
{"type":"attached","protocol":"stado.workload.v1"}once the workload process is running. - Server binary frames carry one channel byte and then bytes:
1is the workload's standard output,2is its standard error. Client text and binary frames are that process's standard input, byte for byte; an empty binary frame closes it. - The final server frame is
{"type":"exit","code","ok"}, or{"type":"error","message"}when the attachment was refused. The refusal is the CLI's own sentence. - Closing the socket ends the process group of the attached workload, so a disconnected operator leaves nothing running on the host.
Declaration
The declaration is stado-rs/data/workloads.json, compiled into Stado with include_str!. It currently declares:
jeden-session: productjeden; interactive; no Weles action gate; stream report carries target, workspace, stdio stream, and durable session ledger.weles-capture: productweles-worker; gated bytargets[].weles.actionsentrygeneric_capture; plan schemawisent.weles-capture-plan.v1; receipt carries target, batch, accepted actions, and artifact prefixes. The whole plan is validated before target admission is contacted, so enqueue is all-or-nothing.weles-browser-task: productweles-worker; gated by the plan'sactionintargets[].weles.actions; plan schemawisent.weles-browser-task-plan.v1; report carries target, action, run ID, outcome, profile, result, and the run process's own retained standard output and standard error.weles-diagnostics: productweles-worker; no action gate; plan schemawisent.weles-diagnostics-plan.v1; report carries target, run ID, artifact inventory, or exact artifact content.weles-image-inspect: productweles-worker; gated bygeneric_browser_task; plan schemawisent.weles-image-inspect-plan.v1; report carries target, run ID, source URL, and image diagnostics.weles-activity: productweles-worker; no action gate; no plan; report carries target, worker release, API runtime, and recorded runs.weles-recordings: productweles-worker; no action gate; plan schemawisent.weles-recordings-plan.v1; report carries target, recordings directory, registry generation, and updated LaunchAgents.weles-api-runtime: productweles-worker; no action gate; plan schemawisent.weles-api-runtime-plan.v1; report carries target, revision, and managed-service restart.weles-browser-runtime: productweles-worker; no action gate; plan schemawisent.weles-browser-runtime-plan.v1; report carries required/observed Playwright components, browser-engine readiness, and repairs.gui-automation: productcua-driver; no action gate; plan schemawisent.gui-automation-plan.v1; operations areenable,disable, andgrant-accessibility; report carries autologin, remote management, Accessibility, and runtime state.mobile-runtime: productweles-worker; gated by the target'smobile_runtimeregistry declaration; plan schemawisent.mobile-runtime-plan.v1; report carries Appium, drivers, platform-tools, and repairs.
A Weles workload with an action gate is declared on a target only when weles.enabled is true and that target's weles.actions contains the resolved action. Other Weles reports require a weles declaration but do not invent an action gate. mobile-runtime requires targets[].mobile_runtime; gui-automation requires a local Darwin target; jeden-session requires a local target. With no target Stado chooses the first eligible declared host, except jeden-session, which retains its live-capacity scoring and durable-session host probing.
Exact declaration refusals
workload kind '<KIND>' is not declared; add it to stado-rs/data/workloads.json<TARGET> declares no <KIND>; add it to stado-rs/data/workloads.jsonthe fleet declares no <KIND>; add it to stado-rs/data/workloads.json<KIND> plan declares schema <OBSERVED>, not <EXPECTED>; fix the whole plan before any work is enqueued<KIND> requires --plan FILE with schema <SCHEMA>; add the plan declared by stado-rs/data/workloads.json<KIND> accepts no plan; remove --plan because stado-rs/data/workloads.json declares none- "
is interactive and cannot produce JSON; use stado workload attach <KIND>" - "
is interactive; use stado workload attach <KIND>" - "
is not interactive; use stado workload run <KIND>" <TARGET> declares no recordings directory; add it to the canonical registry<TARGET> declares no mobile-runtime; add it to the canonical registry
Kind-specific plan refusals name the missing field and the plan that must be fixed. Host/runtime refusals retain the target, missing runtime component or credential, and the declaration or repair command the operator must change.
Replaced host verbs
The workload capability removes all 15 incident verbs and their dispatch/entry-point implementations:
stado host jeden-connectstado host weles-capturestado host weles-capture-statusstado host weles-browser-taskstado host weles-browser-runtimestado host weles-run-diagnosticsstado host weles-image-inspectstado host weles-activitystado host weles-api-runtimestado host weles-recordings-dirstado host mobile-runtimestado host gui-automation enablestado host gui-automation disablestado host gui-automation statusstado host gui-automation grant-accessibility
Stado Desktop
The selected host inspector includes a Workloads section. It reads stado workload list --json, lists every declared kind with its product, stream/receipt mode, and report fields, and offers a read-only Read status action for non-interactive kinds. The last CLI report is shown verbatim in a bounded, selectable monospace view; the CLI's refusal sentence is shown when the selected target does not declare the kind or its report cannot be read.
Every interactive kind carries an Attach… button beside it. The sheet states the target, the selected Stado endpoint, the workspace, and an optional existing session ledger, then connects the stream through GET /api/operator/workload/attach. Output and diagnostics arrive live in two selectable views, Send input writes one line to the attached process's standard input, Finish input closes it, and the sheet reports the workload's own exit status or its refusal sentence. Changing the selected endpoint or closing the sheet disconnects the stream, which ends the attached process on the host.
Source: this website