v0.5.8 — Pin lifetime + hero glide
Two display-layer refinements on top of the 10 Hz cockpit that landed in v0.5.7. Past-prediction pins now share their visible lifetime with the active forecast horizon, and hero metric numbers tween toward each freshly fetched value via requestAnimationFrame so the eye glides across cache-flips instead of stepping through them.
Hero glide
live now and the Δ-prediction now read from displayT / displayPred Lit state which cubic-eases toward the freshest fetched value over ≈400 ms. At 10 Hz refresh + 3 s predict-cache, a 13.9° → 7.5° flip used to teleport the moment the cache rolled over; now it becomes a perceptually smooth glide. The data layer is untouched — fetch cadence, predict-cache TTL, and cur.t semantics are exactly what v0.5.7 shipped. Only the visual layer is interpolated.
requestAnimationFrame self-cancels when a value lands, and disconnectedCallback cleans up an in-flight tween so navigating away doesn't leak a frame loop.
Pin lifetime
Past-prediction pins now decay with the active horizon.
Earlier hotfix clamped expired pins to the left canvas edge, producing an ever-growing fan of red rays anchored at -T_PAST. The right idea: a pin's visible age equals the active horizon (5 / 15 / 30 s), then it fades to nothing — same memory window as the forecast curve points to. Quadratic alpha gives a soft tail; ring radius also tapers with age so the newest pin is the brightest mark on the canvas.
The horizon toggle becomes a single semantic lens: what you see ahead = what you remember behind. At +5s mode the canvas shows last-5-s of pins next to a +5 s forecast curve; at +30s, a full half-minute of memory on either side.
Fixed
- Cockpit's hero
live nowreading is no longer momentarily blank during the very first refresh —displayTfalls back tocur.tbefore the first tween completes.
Tests
715+ tests pass. No backend contract changes.