CH-DEV-02 . family DEV
DUMBBELL
two dots + connector per category: before and after. Needs:
categories with a value at two moments; the movement is the message.
deviationchange-over-timecomparison
DL-01 AGRAW
DL-02 KATA
DL-03 LOGOS
DL-04 SHILPA
DL-05 OBEYA
DL-06 LEX
DL-07 SAGA
DL-08 SENTINEL
DL-09 ATLAS
DL-10 BASIRA
DL-11 SUTRA
DL-12 NOROSHI
DL-13 MIZAN
DL-14 EVIDENTIA
DL-15 ABRID
DL-16 TELOS
Use when
- before/after per category: backlog W24 vs W28, score last year vs now
- spotting the row that moved against the trend
Do not use when
- more than two moments (CH-TIM-01)
- two unrelated measures (CH-DST-02)
See instead
Alternatives
- CH-TIM-05 (few categories, slope reads better)
Rules
- before = dot_a muted, after = dot_b primary; the connector is the story
- labels state both values: '52 > 63'
- highlight the row moving against the trend
Never do this
- arrows instead of connectors (double-encodes direction)
- legends
- sorting that hides the counter-mover
QA before delivering
- both values labeled per row
- series labeled on first row
- highlight <= 1
- source present
Data shape
| title | action title naming the mover with numbers |
| source | bottom-left always |
| unit | on first label |
| series_labels | [before_name, after_name] |
| categories | array of {label, values: [before, after], highlight?} |
Sample data (golden)
{
"title": "System D is the only system where punch grew, 52 to 63",
"eyebrow": "OPEN PUNCH . W24 VS W28",
"source": "Source: sample dataset v1, 2026-07-12",
"unit": "items",
"series_labels": [
"W24",
"W28"
],
"categories": [
{
"label": "System A",
"values": [
28,
12
]
},
{
"label": "System B",
"values": [
31,
18
]
},
{
"label": "System C",
"values": [
39,
25
]
},
{
"label": "System D",
"values": [
52,
63
],
"highlight": true
},
{
"label": "System E",
"values": [
36,
31
]
}
]
}