← all components

Stats & charts

Observability built as a first-class surface rather than a debug page, mirroring the pipeline's own stats.py "trust dial". No chart library — every mark here is a div grid, an SVG path or a stroke-dasharray, which is why the whole visual language stays inside the token system.

00

Headline tiles

Six numbers that answer "is the Well healthy" before you read anything else. Each tile carries a label, the value, and a subtitle that names the underlying table or gives the comparison — a number with no denominator is not a signal.

🔢
Stat tile
Label, value, subtitle. An optional accent colours the value only, which is how green reads as "healthy" and amber as "watch this" without inventing a second component.
ui/src/components/Charts.tsx · Stat
Plain
atoms1,611chunks in mimir.chunk
Accented · healthy
facts1,61063 open questions
Accented · declining
ingest · 30d412-38% vs prior
Stat grid
An auto-fill grid of tiles. Building this showcase surfaced two defects in the tile subtitles, both since fixed in the shipped code and reflected here: the entities subtitle interpolated snap.totals.edges raw while the value above it went through fmtNum (so "1,868" sat beside "1634 typed edges"), and the tokens subtitle claimed an "embedded substrate" while the coverage ring beside it correctly read 0.0%. Subtitles now run through the same formatter as their values, and the tokens subtitle is computed from embedCoverage at the ring's own precision. Both are logged as fixed on the issues page.
ui/src/views/Stats.tsx · .stat-grid
All six
atoms1,611chunks in mimir.chunk
tokens2.4Mlexical substrate — 0.0% embedded
entities1,8681,634 typed edges
facts1,61063 open questions
sources188with provenance + permalink
ingest · 30d1.6k+412% vs prior
01

Charts

Four mark types, each chosen for a specific question. Bars compare categories. The sparkline shows throughput shape over 14 months. Rings show a proportion you are meant to feel bad about when it is low. The depth column is the only one that also encodes the product's own depth-is-age rule.

📊
BarRows
A three-column grid — label, track, value — with the fill scaled to the largest bucket rather than the total, so a dominant category does not flatten everything else into invisibility. Fill is a left-to-right gradient from the bucket colour at 13% alpha to full, plus a soft outward glow of the same hue.
ui/src/components/Charts.tsx · BarRows
With percentages
internal1.2k 72%
confidential290 18%
public133 8%
private36 2%
With a suffix · zero row
Provenance98%
Q-rank44%
Autonomy gate0%
📈
Sparkline
A smoothed area chart drawn as one cubic path with control points at the midpoint of each segment, plus a gradient fill fading to transparent and a dot on every sample. The final dot is at full opacity and the rest at 0.35, so "where we are now" is legible without a label. Stroke uses vector-effect: non-scaling-stroke, because the SVG is stretched non-uniformly by preserveAspectRatio="none".
ui/src/components/Charts.tsx · Sparkline
14 months · sharp recent spike
2025-062026-07
Coverage Ring
A stroke-dasharray arc rotated -90° to start at twelve o'clock, with a coloured drop-shadow and a 900ms eased transition on the dash so a value change sweeps rather than jumps. Centre text carries one decimal place; the sub-line carries the raw fraction.
ui/src/components/Charts.tsx · Ring
Zero — the honest embedding number
0.0%0 / 1.6kembedded
Partial
68.3%1.1k atomstouched ≤ 90d
Full
100.0%1.6k / 1.6kfacet coverage
🕳️
DepthColumn
Corpus depth by year, and the one chart that carries the product's central metaphor. The row index drives an alpha ramp so older years sit lower and dimmer — the same rule the Constellation applies to nodes, restated as a bar chart. Year label and value opacity are computed from the same depth term, so the whole row fades together.
ui/src/components/Charts.tsx · DepthColumn
Six years
2026876
2025359
2024193
2023104
202252
202127
02

Panels

Every chart lives in the same shell: a card with a two-part head — a title stating what is measured, and a mono note stating how. The note is where the honesty lives: "drives RLS, not just display", "% of requests where the lens was injected", "atoms by year · older sits deeper".

Chart panel
Card, head, chart, optional axis strip. The wide variant spans the grid for the sparkline; the rings variant centres two rings on a row. That is the whole layout vocabulary of the Stats view — three panel shapes and nothing else.
ui/src/styles/views/stats.css · .panel
Standard

By classification

drives RLS, not just display
internal1.2k 72%
confidential290 18%
With axis strip

Ingest volume

atoms/month · Muninn throughput · 14 months
2025-062026-07
Stats loading state
Before the provider answers, the whole view collapses to an eyebrow and one mono line: measuring the Well…. No skeleton shapes — a skeleton implies the layout is known, and here it genuinely is not until the snapshot arrives.
ui/src/views/Stats.tsx · early return
Loading
Stats

measuring the Well…