Who observes a beacon

Who observes it

stado host health <target>, stado host beacon list, stado registry doctor, and the read side of the service layer: stado service list joins the declared managed set against the latest beacons and issues no ssh at all. Independent host-beacon reads start together and retain registry order in the result, so one slow store read does not postpone every other host. stado service status <name> first narrows the declarations and reads beacons only for hosts that declare that service; a status lookup does not fetch unrelated hosts or build their unit rows. The beacon join reports unknown when a host has gone quiet; service status of a failed unit separately attempts its exit and stderr reads, carrying those readers' refusals as failure evidence (stado-rs/src/deploy/service/model/managed/status.rs). The autonomy cycle's service reconciliation reads the same documents (operations).

The host's declared service answering probes reuse one HTTP client and connection pool across beacon passes. After a standing-service recovery attempt, Stado cancels its in-flight question before asking again; a hung request cannot retain another task and connection after each attempt. A completed declaration pass also cancels questions and drops answers for services no longer declared on this host. An HTTP client initialization failure appears as a refused cause in the unit's answering reading, not as a healthy process or an absent question. See Service.

For a declared service.answering question, stado service list and stado service status <name> print an answering: <host> <unit>: <reading> line beneath their table. Their --json rows carry the same reading as answering: asked, waiting (with elapsed wait and possibly last), stood (with the host's declared bound), unreadable with the actual catalog, directory or resolver cause that prevented asking, or finished with a result whose state is answered (HTTP status, the HTTP library's successful verdict, elapsed time and the response detail on failure) or refused (the actual transport or request-construction cause). Stado Desktop's Managed services table marks a standing, unreadable, refused or unsuccessful HTTP answer, or one with no HTTP status even if it claims success (including the last result while a new question waits), when process state is active. A malformed answering value, including an answered result without its successful verdict, remains in the CLI's raw JSON row alongside answering_error; the plain table prints answering-error with the decode cause and observed value. Desktop keeps the other fleet rows visible and shows that row-local cause in its table and inspector, rather than treating a missing verdict as a failed or successful HTTP answer.

The beacon's reported_at still governs freshness: a stale reading is historical evidence, not proof that the API answers now.

The read-only real-host journey tests/service_answering/cli.mjs requires STADO_BIN, STADO_TEST_SOURCE_REVISION, STADO_ANSWERING_HOST and STADO_ANSWERING_NAME for a committed build and a declared service. It reads the actual host beacon, a fresh stado host ping verdict, service status and fleet list. It requires a finished answer or a waiting question with a last answered HTTP result whose successful verdict is true, and checks an unknown-name refusal. asked, stood, unreadable, refused, or an HTTP error answer do not prove the API works; a stale beacon does not either. Its command exits, raw responses and hashes are kept under .build/service-answering-cli-*.

Readers resolve a target to its beacon object through the slug rule in monitor/host_health/load.rs — target name, declared hostnames, and their first dot-labels, in order.

Source: this website