Results — single run detail #

URL: /results/{run_id}

The detail view is what you land on after clicking a row in the Results list. It shows everything Litmus recorded for one run: a sticky summary header, an Overview with stats, and tabs for Steps, Measurements, the Execution Timeline (multi-slot runs only), and DUT History.

You can also leave it open during a run to watch progress live — the status chip shows a "Live" indicator and the tables fill in as steps and measurements arrive. See Live updates below.

If the run ID in the URL doesn't resolve, the page shows a "Run not found." card with a link back to the list.

Summary header #

Detail — summary header

The header sticks to the top of the viewport as you scroll the tab content. It carries:

ElementWhat it shows
TitleThe static label Test Run Summary
Outcome chipColored chip showing the current status. For finished runs the chip reads the final outcome (PASSED, FAILED, ERRORED, SKIPPED, TERMINATED, ABORTED, or DONE). For in-flight runs the chip reads RUNNING, and an animated blue dot + Live label appears next to it.
Back buttonReturns to the Results list (/results)
Part NumberDUT part number stamped on the run
SerialDUT serial number
HostnameStation hostname that ran the test
ProjectProject name from litmus.yaml
StartedRun start timestamp, rendered in browser-local time
EndedRun end timestamp, while the run is in-flight (replaced live when the run.ended event arrives)

Tabs #

Below the header, a tab strip switches between five views. The Execution Timeline tab only appears for multi-slot runs (sessions with at least one measurement that carries a slot_id).

TabWhat's there
OverviewTwo stats cards summarising steps and measurements
StepsThe step table — one row per step execution, in execution order
MeasurementsThe measurement table — one row per recorded measurement
Execution Timeline(multi-slot only) Gantt-style chart of all slots in the parallel session, with this run's slot highlighted
DUT HistoryA short list of other runs for the same DUT serial

The active tab is mirrored into the URL (?tab=Steps, ?tab=Measurements, etc.), so a bookmark lands the reader back on the same tab.

Overview #

Detail — Overview tab

Two cards. Each is clickable — click anywhere on a card to jump to the corresponding tab.

Test Statistics:

StatMeaning
StepsTotal step count for the run
PassedSteps whose outcome is not Failed. Note this counts Errored, Skipped, and in-flight steps as passed too — it's a total − failed calculation, not "judged passed."
FailedSteps whose outcome rolled up to Failed
Pass RatePassed / Steps, rendered as a percentage rounded down (e.g. 99.7% shows as 99%). Shown only when the run has at least one step.

Measurement Statistics:

StatMeaning
MeasurementsTotal measurement count for the run
PassedMeasurements with outcome Passed
FailedMeasurements with outcome Failed
Pass RatePassed / Measurements, rendered as a percentage rounded down. Shown only when the run has at least one measurement.

Steps #

Detail — Steps tab

One row per step execution, in execution order — including skipped, planned, and setup-only steps.

ColumnWhat it shows
#Sequence-relative position within the parent step. Sweep variants of the same step share this number, distinguished by Vector.
StepSequence-qualified path (e.g. TestPowerSequence/test_efficiency). Falls back to the step name when no path is recorded.
VectorWhich sweep variant. 0 for non-swept steps; otherwise 0..N-1 across the variants of a step.
OutcomeColored chip showing the step's outcome. Beyond the final-state vocabulary listed for the header chip, step rows can also show RUNNING (step in flight), WAITING (queued / setup-only), NEVER RAN (collected but never started), and PLANNED (in the run manifest but the run ended first).
Duration (s)Wall-clock duration in seconds, formatted to 3 decimals. when the step hasn't finished.
MeasurementsNumber of measurements recorded inside this step
InputsCommanded sweep parameters for this step / vector, rendered as compact key=value pairs. Blank for non-swept steps.
OutputsRecorded vector-level observations (the out_* columns), in the same compact form. Blank when none were stamped.

Empty steps render the No steps recorded yet. message in the table body until the first row arrives.

Measurements #

Detail — Measurements tab

One row per recorded measurement. Use this view when you care about the values themselves, not the step structure around them.

ColumnWhat it shows
StepThe step name this measurement belongs to
MeasurementThe measurement name passed to verify or logger.measure
ValueMeasured value with units appended (e.g. 3.31 V). when the measurement recorded no value (errored).
LimitsThe low–high band the value was checked against (e.g. 3.135 – 3.465). when no limit was active.
OutcomeColored chip showing the measurement outcome

Below the table, an Artifacts card appears only when at least one measurement carries an attached artifact (waveforms, screenshots, logs, files). Each measurement with artifacts gets a row of buttons you can click to download or view inline.

Empty measurements render the No measurements recorded yet. message until the first row arrives.

Execution Timeline (multi-slot only) #

The Execution Timeline tab only appears for multi-slot parallel sessions — runs where at least one measurement carries a slot_id. It loads on demand: the first time you click the tab, the chart fetches the session's full step list and draws a Gantt of every slot's activity, with this run's slot highlighted.

For single-slot runs (the common case) the tab is hidden entirely.

DUT History #

A short table of other runs for the same DUT serial — useful for "is this unit's last 5 runs all green?" checks. Loads on demand on first click. Up to 10 rows, drawn from the project's most recent 100 runs — older history for the same DUT isn't shown here. Click any row to jump to that run's detail page.

When no other runs exist for the DUT serial within that window, the tab body shows No other runs found for DUT: <serial>.

Live updates #

When you open the page on an in-flight run, four event types feed live updates:

  • run.ended — flips the status chip from RUNNING to the final outcome, fills in the Ended timestamp, and stops the Live indicator
  • test.step_started and test.step_ended — refresh the Steps table and the Overview stats
  • test.measurement — refreshes the Measurements table and the Overview stats

Once the run ends, the page stops watching for updates and keeps the final values. If the events daemon isn't reachable when the page loads, the page stays static — refresh manually to see new rows.

Underlying data #

The page reads from three Litmus stores:

  • Run header / status — from the runs index, same as the Results list
  • Steps — from the per-run steps view (one row per step execution)
  • Measurements — from the per-run measurements view (one row per recorded measurement)

The CLI equivalents:

For the Python equivalents, see RunsQuery and friends.

For the underlying schemas, see Models reference → RunSummary, TestStep, and Measurement.

Common tasks #

  • Drill into a failing measurement — open the Measurements tab, scan for FAILED chips, then jump to the DUT History tab to see whether the prior run for the same DUT had the same failure.
  • Pull a waveform or log — Measurements tab, scroll to the Artifacts card below the table, click the artifact button.
  • Watch a long test live — open the detail page during the run and leave it; the chip shows RUNNING with a Live dot, and tables fill in as steps and measurements arrive.

Bookmarkable URL state #

The active tab is mirrored into the URL via the tab query parameter:

URLTab
/results/{run_id}Overview (default)
/results/{run_id}?tab=StepsSteps
/results/{run_id}?tab=MeasurementsMeasurements
/results/{run_id}?tab=Execution%20TimelineExecution Timeline (multi-slot only)
/results/{run_id}?tab=DUT%20HistoryDUT History

Bookmarking the URL bookmarks the run + the open tab.

See also #