Bring every self-upgrading poller onto this core's build.
const url = 'https://example.com/api/v1/system/upgrade/pollers';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/v1/system/upgrade/pollers \ --header 'Authorization: Bearer <token>'The half of ADR-051 that was missing: commands went out only as the tail of core’s own upgrade, so a site stood up afterwards — or one that failed and was fixed, or one that only enabled its updater today — stayed on its old build until the next release. This is the same convergence, with an operator as its trigger instead of a finished run.
core is not touched. No image is pulled here, no container of this deployment restarts, and
no maintenance window opens: the work happens at the sites, one poller at a time per pool, and
pool_coverage is what would notice if a pool went quiet. That is also why this route does not
take the [Upgrade] extractor — a deployment with no central updater at all can still align its
remote sites.
⚠️ A poller ahead of this core is moved back. That is the point rather than an oversight: N/N-1 promises new-core-with-old-poller and says nothing about the reverse (ADR-009), so a poller ahead of core is the unsupported skew. Pollers hold no state, so it costs a recreate.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”Accepted; the pollers are converging, one at a time per pool
What an align request set in motion.
object
Pools that will have no live poller for the length of one recreate. Named so an operator reads it before the alert does; not a refusal (ADR-051 decision 13).
Correlation id, shared with every site’s own audit line for this operation.
The pollers commands were published for, in the order the queues will take them, and what each was running when the button was pressed.
No progress here, deliberately: nothing has reached a site yet, so any report these
pollers carry belongs to an earlier run and echoing it would put a stale “installing” in the
acknowledgement of a command that has only just been published. Poll
GET /api/v1/system/upgrade for how each site is getting on.
A poller a single press of Upgrade would leave on its current build.
object
Sanitized poller id.
What it is running now; null when it has never reported a version.
The release every target is being moved to — this core’s own build.
Examplegenerated
{ "dark_pools": [ "example" ], "id": "example", "pollers": [ { "id": "example", "version": "example" } ], "target_tag": "example"}No valid bearer token
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Role lacks ManageSystem
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}A poller convergence is already running (convergence_in_flight), or every poller is already on this build (pollers_aligned)
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}This core is not the leader, or this deployment has no bus (bus_unavailable)
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}