Skip to content

Buildout replay: press play and watch the AI buildout arrive on the map - #33

Draft
aurph wants to merge 3 commits into
mainfrom
feat/buildout-timeline
Draft

Buildout replay: press play and watch the AI buildout arrive on the map#33
aurph wants to merge 3 commits into
mainfrom
feat/buildout-timeline

Conversation

@aurph

@aurph aurph commented Sep 8, 2026

Copy link
Copy Markdown
Owner

The mission sentence — visualizing the AI buildout for anybody who has questions — animated, on the surface you've called the biggest selling point. No new dependencies, no keys, no tokens, real data only.

What it is

A time-scrubber on the cluster map (new card directly under the existing Cluster map on Compute Frontier). Press play:

  • Facilities light up in the year they came online — solid circles, sized by running MW, with a brand-orange pop as each year's arrivals land.
  • Announced targets appear hollow and dashed at their promised year — and stay hollow until they actually energize, even after the target year passes. The hype gap, in motion.
  • An instrument overlay on the map corner carries the big mono year and the running tally: live GW vs targeted GW (aria-live for screen readers). Play/pause + a year scrubber below; drag anywhere in time.

Honesty rules (pure, tested lib)

client/src/lib/buildout-timeline.ts: live = operational clusters at their online year using rated MW; targets = planned MW at the announced year; free-form dates parse to a year only when a real year exists ("Late 2020s" is excluded, not guessed) and the excluded count is disclosed in the footer. 216 of 235 clusters are datable today. 5 unit tests include the shipped registry animating with a sane span.

Craft notes

  • Reuses the existing map idiom exactly: CARTO dark tiles, status colors, sqrt-MW sizing — nothing off-brand.
  • prefers-reduced-motion drops the pop animation (discrete stepping remains); no autoplay ever.
  • Named BuildoutReplay because a BuildoutTimeline component already exists on the Power page (facilities-by-opening-year bar chart, untouched) — complementary surfaces over different registries.

Verification

489/489 tests, tsc clean, build green, page serves 200 with the data flowing. Not browser-verified this session — the whole point is how it feels, so: open /compute-frontier, press play, and judge. Carries the #30 lockfile fix; independent of the other open PRs (inserts after the map card, away from #29's insertion point — both apply cleanly).

🤖 Generated with Claude Code

https://claude.ai/code/session_01FY4ziPhfu8VBPFVy5cDMNy

Two advisories published upstream since the last merge (browserslist
unbounded memory growth, HIGH; postcss-selector-parser AST recursion,
low) trip CI's npm-audit gate on every new push, blocking the whole
open PR train. npm audit fix; 0 vulnerabilities after; tests/tsc/build
green. Lockfile-only.
The mission sentence, animated: an interactive time-scrubber on the
cluster map. Facilities light up in the year they came online (solid,
sized by running MW, brand-orange pop as each year's arrivals land);
announced targets appear hollow and dashed at their promised year and
STAY hollow until they actually energize, even after the target year
passes - the hype gap, visible in motion. An instrument overlay on the
map carries the big mono year and the running tally (live GW vs
targeted GW, aria-live), with a play/pause + scrubber strip below.

Honesty rules live in a pure, tested lib (client/src/lib/
buildout-timeline.ts): live = operational clusters at their online
year using rated MW; targets = planned MW at announced year; "Late
2020s"-style undatable entries are excluded and DISCLOSED in the
footer, never guessed. Real data only, no new deps, no keys, no
tokens; CARTO tiles + status colors + sqrt-MW sizing all reuse the
existing map idiom. prefers-reduced-motion drops the pop animation
(discrete steps remain); no autoplay.

Named BuildoutReplay because a BuildoutTimeline component already
exists on the Power page (facilities-by-opening-year bar chart, left
untouched); the two are complementary surfaces over different
registries.

489 tests (5 new), tsc, build green; page serves 200 with 216/235
clusters datable. Visuals not browser-verified this session - eyeball
/compute-frontier and press play.
The curve is now the scrubber: a cumulative GW area strip under the map
(solid orange = live, dashed hollow = targeted) with a moving playhead;
click anywhere on it to jump in time, or keep the slider. The overlay
gains a per-year delta (+X.X GW arrived), a rolling count-up tally
(rAF ease, jumps under reduced motion), and a headliner line naming
each year's biggest arrival - live arrivals outrank same-year promises
because the story each tick tells is what actually showed up (pure,
tested in yearlySeries). Arrival pop upgraded to a two-phase radiating
ring with an overshoot settle. Play slowed to 1.1s/year so the
headliners are readable. Chart series use seriesMotion() per the
repo's chart-motion guard (which correctly failed the first cut).

490 tests (6 lib tests), tsc, build green; page serves 200.
@aurph

aurph commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

Round 2 — finished into a real instrument (the first cut was bones, fair call):

  • The curve is now the scrubber. A cumulative GW area strip sits under the map — solid orange for what's live, dashed hollow for what's promised — with a playhead that tracks the year during playback. Click anywhere on the curve to jump in time; the slider stays for precision.
  • Headliners. Each tick, the overlay names the year's biggest arrival ("came online · Colossus 1 · 500 MW") — live arrivals outrank same-year promises, because the story each year tells is what actually showed up. Pure and unit-tested (yearlySeries).
  • Rolling tally + per-year delta. The GW counters ease upward as years land (+X.X GW arrived this year shown beside the big year); reduced-motion users get instant jumps.
  • Bigger landing. Arrival pop upgraded to a two-phase radiating ring with an overshoot-settle; playback slowed to 1.1s/year so the headliners are readable.

Craft note: the repo's own chart-motion guard failed my first cut for hardcoding isAnimationActive instead of seriesMotion() — fixed to the convention. 490/490 tests, tsc, build green, page serving. Press play again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant