The Mental Model
There are three different kinds of state in play:
Do not infer device readiness from job success alone. A workflow can complete successfully and
still leave the device in
quarantine because a separate condition is decisive, for example an
Ironic maintenance flag, a missing SLURM node, a failed provision state, or a custody hold.
Locking And Concurrency
TheWorkflow.exclusive flag controls device-level conflict checks:
Current non-contending workflows are report generation and firmware inventory. Burn-in and
connectivity verification are non-exclusive, but they still conflict with an active exclusive
workflow.
A workflow can also hold a device it does not run on by naming it in a parameter
(
HELD_DEVICE_PARAMETERS in core/workflow/names.py). The node swap holds the spare named in
replacement_host_name. While such a job is active, every contending job on the named device
is refused, exclusive or not, so an enrolment of a swap’s spare waits until the swap finishes.
Names match case-insensitively within the job’s site. Admission also checks and locks the
named device as one of the holder’s own devices, so a node swap naming a busy spare is refused,
and of two submissions touching the same device at the same moment, the second is refused.
Cancellation is a job-level operation. Calling POST /api/v1/jobs/{id}/cancel/ moves the job to
cancellation_requested; the workflow agent then dispatches Temporal cancellation for in-flight
device workflows and later converges the job and device rows to terminal statuses.
Fleet Manager only ever cancels the top-level (per-device or batch) workflow — child workflows,
such as a burn-in’s per-test SingleTestWorkflow, are not tracked or cancelled directly. Parents
start their children with cancellation_type=ABANDON and parent_close_policy=REQUEST_CANCEL so a
cancel terminalizes the parent promptly and then cascades a graceful cancel to the child by
workflow id — which reaches the child’s live run even after it has continue_as_new’d, where a
run-id-pinned cancel would miss it.
Workflow Groups
Fleet Manager workflows are easier to read by operational intent. Each section below uses the same columns: when to use it, submission restrictions, parameters, and the device-state effect.
The API stores workflow inputs in
Job.parameters. Some values are operator-supplied; others, such
as engagement_mode, are stamped by the workflow agent from site configuration so Temporal replay
stays deterministic.
Enrolment
Enrollment Completion Proof
A normal Enrollment withrun_inspection=true captures the request-time infrastructure identity and establishes or applies Device proof only at
terminal completion. It does not need a start-of-work condition transition: workflow exclusivity
prevents a concurrent workflow from consuming proof while Enrollment is active, and terminal
failure uses the captured identity for a non-revoking guarded failure write. Matching proof is
preserved; stale metadata is cleared when the operated identity still matches.
Inspection-half success means the configured inspection checks passed against either fresh or
cached Ironic inventory. An already available, active, or
Nova-owned node is not reinspected because that could disrupt a deployed machine; its cached inventory
must still be present and pass the same hardware, link, and cable validation. Missing or invalid cached
data fails Enrollment and cannot produce proof. The versioned inspection activity returns the exact
resolved Ironic infrastructure_ref, and the workflow returns qualifying proof for that reference
only after cleaning and every later configured stage succeeds.
A diagnostic Enrollment with run_inspection=false does not validate cached inspection data or return
completion proof. It still captures the resolved
Ironic reference so a later failure can be finalized against the correct infrastructure identity.
At a site with temporalWorker.enrollmentSteps.ironicEnrol=false, Enrollment likewise runs every
other enabled stage and returns a diagnostic completion, but skips the entire Ironic stage and retains
the request-time identity for failure finalization. Because no Ironic validation runs, it neither
invalidates older completion proof at start nor produces new proof on success.
See Device State Machines for the
proof lifecycle and terminal-write rules.
Burn-In Testing
Customer Release
In-Service Ops
In-band firmware collection
Deploy compatible satellite workers before the hub applies admission migrations 0202 and 0203. Confirm that no old Temporal worker remains. Before enablingtemporalWorker.hardwareTests.firmwareInventoryInBandEnabled
(default false) at a site:
- Confirm site readiness, SLURM node access, and resource-class mappings. This release
supports
GB300andB200_8NIC. Unmapped classes fail before SLURM dispatch. - Verify that the satellite worker’s credentials can PUT and GET objects in its configured Fleet Manager bucket. The worker checks storage access at startup.
- Set the flag to
trueand confirm that the new worker starts successfully.
include_in_band=false until these checks pass. Disabling the flag preserves status,
result, and cancellation activities for collectors already submitted.
Both admission migrations are irreversible. Before a worker rollback, disable the flag
and deploy a forward repair that closes include_in_band and dry_run admission.
Remove these properties from stored workflow schemas and new-organisation defaults;
keep additionalProperties=false. Drain or cancel incompatible Jobs before starting
old workers. Reversing the migrations does not close admission.
Readable Split Transition Views
These views summarize the workflow and connector paths that commonly move devices between operational statuses. The canonical operational-status derivation remains Device State Machines. Each diagram stays focused on one lifecycle, while the aggregate map and table connect the paths back to workflows and parameters. The actual fully managed derivation is condition-based and ordered: Ironic failure, maintenance, enrollment state, validation allocation, customer allocation, customer-ready traits, and SLURM membership/schedulability all contribute. Custody states are connector/workflow-owned. If a diagram and the condition details appear to disagree, trust the conditions shown on the device detail page.Aggregate Status Map
Use this as the quick orientation view. It shows which operational statuses can connect without trying to carry every workflow parameter on the graph.Fully Managed Lifecycle
Metal Delegated Lifecycle
External Partner Custody Lifecycle
Failure And Repair Overlay
These failure edges are condition-derived, not normal workflow requests. They appear when the infrastructure state reports a failed provision, cleaning, or maintenance outcome;Ironic node clean is the workflow that can recover the device back to quarantine.
Inventory And Health Are Separate
Workflows that affectoperational_status usually do not affect inventory_status or
health_status.
Why A Successful Workflow May Leave A Device Blocked
Common cases:What To Check After Running A Workflow
- Check
Job.statusfor the aggregate outcome. - Check
JobDeviceStatus.status,failure_code,phase, andfailure_messagefor per-device detail. - Open the device and inspect
operational_status,health_status, andoperational_status_conditions. - If the device is ineligible for a next workflow, call
POST /api/v1/eligibility/check/with the target workflow and device set; the response gives structured reasons. - For burn-in workflows, use the job Results tab and the Burn-in Testing Guide rather than treating device status as test evidence.