How it works › Explain the data
Explain the data
Zach, on the actuator-models views: "with data-ui as the base it's really about making these dashboards that really explain the data." A view can open with its answer and make its numbers readable, without a second page.
Every model on every bench
LiveThe whole robotparts-models case with its toolbar and rail. The pivot opens with its question, a strip of KPI cards and how to read it; its models are rolled up across actuators. Open Roll up to bring the actuators back, or switch tabs for column groups and sub-columns.
The live view starts when it scrolls into sight.
- type: pivot
name: Benches
intro:
text: |
**How does every model do on every bench?** A row is a model, rolled up across the actuators it ran on; a
column is one bench test; a cell is the median error of every run behind it, in multiples of that actuator's
measurement floor (1 × = as close as the rack repeats itself; twin-grade is ≤ 1.5 ×). In the strip, each dot
is a run and the tall tick their median, on one scale per column (its ends in the header). **Roll up** in the
toolbar brings the actuators back; click a cell for its runs, a model's name for its page.
kpi:
filters:
and:
- 'kind == "run"'
- '!x_floor.isEmpty()'
groupBy: { property: bench }
kpi:
value: { property: x_floor, summary: Median }
gate: { max: 1.5 }
filters:
and:
- 'kind == "run"'
- '!x_floor.isEmpty()'
order: [variant, actuator]
groupBy: { property: rung, direction: ASC }
splitBy: [bench, test]
value: { property: x_floor, summary: Median, display: dist }
rollup: { keep: [variant], dims: [actuator, variant, model, rung, family] }
columnSize: { variant: 200 }From the example Actuator models · benches, leaderboard, parameters
The keys
intro: {text, kpi}on any view:textis markdown (headings, lists, code, tables, links);kpiis an inlinetype: kpientry over the same data and rail filter. Drawn above the status line.rollup: {keep, agg, dims}on a table or pivot: one row per combination of the kept dimensions, the rest aggregated. A number becomes a cell with its median (oragg: mean, min, max, count, spread, sum), its range and its count; text that disagrees reads "N values", never a made-up value. Click a rolled row for the rows behind it.columnGroups: {label: [properties]}on a table: a header over its columns. A pivot's column groups draw the same way.- Displays (
display: {p: …}):statssplits a property into sub-columns (median, min, max, n, runs; or value, low, high, basis);rangeputs low–high beside the value;valueshows the basis mark with the range on hover;distdraws every value on one scale down the column, ends in the header;markdownrenders text as a document in the peek. - Fixed slots. A number cell is
[number][range][mark][count]with the column's slot widths, so digits and marks line up down a column whatever the value. Spread(max − min) joins Bases' summaries, and lowercase names (median,mean, …) work wherever a summary does.
- type: pivot
name: Benches
intro:
text: |
**How does every model do on every bench?** A row is a model, rolled up across the actuators it ran on; a
column is one bench test; a cell is the median error of every run behind it, in multiples of that actuator's
measurement floor (1 × = as close as the rack repeats itself; twin-grade is ≤ 1.5 ×). In the strip, each dot
is a run and the tall tick their median, on one scale per column (its ends in the header). **Roll up** in the
toolbar brings the actuators back; click a cell for its runs, a model's name for its page.
kpi:
filters:
and:
- 'kind == "run"'
- '!x_floor.isEmpty()'
groupBy: { property: bench }
kpi:
value: { property: x_floor, summary: Median }
gate: { max: 1.5 }
filters:
and:
- 'kind == "run"'
- '!x_floor.isEmpty()'
order: [variant, actuator]
groupBy: { property: rung, direction: ASC }
splitBy: [bench, test]
value: { property: x_floor, summary: Median, display: dist }
rollup: { keep: [variant], dims: [actuator, variant, model, rung, family] }
columnSize: { variant: 200 }Comes from docs/CONTRACT.md §16 (explain the data) in docs/.