Parent: #1666 (Phase 2 — decided UI, observation strip + thermal timeline)
Depends on: #2018
Summary
The main visualization of the decided layout: temperature and CPU-load lanes stacked on one shared time axis with a synchronized cursor, replacing the temporary per-metric charts.
Scope
- Temperature lane: daily min–max band + average line + idle-temperature line + baseline band (idle baseline ±2 °C) with a dashed baseline reference. Y domain adapts to the data instead of the fixed 0–100 range, so a +5 °C drift is visible as a slope.
- CPU load lane: daily average for 90d / 1y, bucketed series for 30d and below.
- Cursor sync across lanes via Recharts
syncId; one shared tooltip reads temperature avg/range, idle temperature, Δ vs baseline, and CPU load for the hovered day.
- Missing periods render as gaps spanning every lane (
connectNulls stays off; absent stays absent).
- Pending-sensors note (package power / fan not collected on this machine) instead of permanently empty lanes; future lanes mount in this position as collectors land.
- Series colors come from the chart theme tokens (
--chart-*), replacing the hard-coded temperature/power RGB literals.
Non-goals
- Observation strip and band comparison (follow-up issue).
- Power / fan lane content (Phase 3).
Evidence
- Unit tests for lane data shaping (gap preservation, adaptive domain) and a web/mock E2E capture showing both lanes with a deliberate gap fixture.
Parent: #1666 (Phase 2 — decided UI, observation strip + thermal timeline)
Depends on: #2018
Summary
The main visualization of the decided layout: temperature and CPU-load lanes stacked on one shared time axis with a synchronized cursor, replacing the temporary per-metric charts.
Scope
syncId; one shared tooltip reads temperature avg/range, idle temperature, Δ vs baseline, and CPU load for the hovered day.connectNullsstays off; absent stays absent).--chart-*), replacing the hard-coded temperature/power RGB literals.Non-goals
Evidence