Skip to content

Restructure gpu_stack around one story, a calculator and a lab - #25

Merged
Cuuper22 merged 74 commits into
mainfrom
claude/loving-pasteur-szbfp4
Oct 2, 2026
Merged

Cuuper22 merged 74 commits into
mainfrom
claude/loving-pasteur-szbfp4

Conversation

@Cuuper22

@Cuuper22 Cuuper22 commented Oct 2, 2026

Copy link
Copy Markdown
Owner

What changed

The project is rebuilt around one purpose: a first-person story of where the cost of training an AI model comes from, with two tools under it.

Site (docs/)

  • One CuperOS desktop with three windows: Story, Calculator, Lab. Phones get the story directly with a tab bar.
  • Story: seven sections, each with an animated figure (why training needs so many GPUs, the cost ladder, what moves the bill with a live MFU slider, lithography, accuracy against 27 published runs, flaky datacenters, the agents' report card).
  • About 30 technical words have hover/tap explainers with small animated diagrams; they become a bottom sheet on phones.
  • Calculator: model size, tokens, GPU type and count to time, energy and cost, each number clickable down to what it is made of. Runs on the equation graph's own closed forms exported to JSON.
  • Lab: the flaky-datacenter simulator with a plain answer first; detail and agent (WebMCP) tools folded away.
  • Readability: Pixelify Sans only in window chrome, at weight 500 with no synthesized bold (its bold closed C into O); readable sans and mono elsewhere. Observatory first load went from 8.8 MB to a few MB; the 72 MB raw trace loads only on request.

Model (gpu_stack/)

  • Fixed four wrong equations (1F1B pipeline bubble, interleaved bubble, hierarchical allgather, MLA KV cache) with regression tests.
  • H100 presets now use the BF16 tensor-core peak (989.4 TFLOPS) with a labelled 40% MFU instead of the FP32 peak at 100%.
  • Unit checking now catches scale errors (seconds vs milliseconds, $/kWh vs $/Ws), not just dimensions.
  • Removed the nuclear/quark layers and slimmed lithography to the Rayleigh relation with cited wavelength and NA inputs; headline preset outputs are byte-identical.
  • New gpu_stack/calculator.py (gpu-stack estimate) and gpu_stack/drivers.py; check_against_published() reproduces the ~22% median error on 27 published runs.

Repository

  • Removed agent diaries, session ledgers, the agent work-log changelog, next-work tooling, the unrun E003-E006 protocols, the audit study folders and about 128 MB of research JSON. History keeps everything.
  • README rewritten as the story in short form plus "Try it".
  • CI gains ruff, mypy (core) and node test jobs.

Validation

  • python -m pytest -q: 861 passed
  • ruff check ., mypy: clean
  • node --test tests/*.mjs: 38 passed
  • Playwright at 1440x900, 1280x720 and 390x844: no console errors, no horizontal page scroll

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw


Generated by Claude Code

claude added 30 commits October 1, 2026 19:34
archive/ held agent session diaries, rest-break notes, a worklog, a pseudo-git ledger and a start-here handoff. Nothing in code, tests, CI or the site reads them. ROADMAP.md mentioned three of the paths; those lines now say the files were removed.

The removed content is in git history at parent commit 7a58388 (git show 7a58388:archive/...).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
process/ held SESSION_STATE, HANDOFF, IMPROVEMENT_MAP and VISIBLE_BACKLOG, written by earlier agent sessions. No code or test reads them (checked gpu_stack/next_work*.py, docs_stats_check.py, tests, CI). Two comments in tests/test_relation_roles.py named IMPROVEMENT_MAP.md and were reworded. README.md still lists process/ in its layout and links section; it was out of scope here and needs a one-line fix.

ROADMAP.md and VISIBLE_BACKLOG.md disagreed on priorities; that disagreement was not resolved, the stale backlog was only removed.

The removed content is in git history at parent commit 7a58388 (git show 7a58388:process/...).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
observations/literature/ duplicated gpu_stack/data/observations/literature/ byte for byte, and a test enforced the equality. The package-data copy is now the only copy (pyproject package-data glob is unchanged). observations/README.md moved next to the data.

References fixed: tests/test_research_observation_fixtures.py reads the package data and now checks the package-data declaration instead of byte equality; gpu_stack/next_work_evidence.py counts observation artifacts and hashes its cache signature from gpu_stack/data/observations instead of observations/; the --observation help text says packaged. experiments/e001-beyond-one-datacenter/screening-scenario-v1.json still mentions the old observations/ path in a free-text source string; experiments/ was out of scope and that file is a historical protocol input.

The removed copy is in git history at parent commit 7a58388 (git show 7a58388:observations/...).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…s/ drafting notes

.impeccable/ is state from a design-lint tool (a generated design.json and a live-inject config); the site build, tests and CI do not read it. docs/readme_fragments/ held seven agent drafting notes for the README (article structure, voice direction, QA checklist and similar); nothing links to or loads them. evals/webmcp-evals.json is kept because CHALLENGE.md documents running it. All eight docs/design/*.png mocks are kept because docs/design/observatory-fidelity-ledger.md and observatory-design-system.md reference them.

The removed content is in git history at parent commit 7a58388 (git show 7a58388:.impeccable/... and 7a58388:docs/readme_fragments/...).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…changelog

The old file was a 1,350-line pass-by-pass agent log with no version headings. The new file is 55 lines in Keep a Changelog form: one section per version from the pyproject.toml bumps in history (0.23.0 to 0.27.0, plus Unreleased for work after the 0.27.0 bump). There are no git tags. The first line points to the commit holding the old log.

The old detailed log is in git history at parent commit 7a58388 (git show 7a58388:CHANGELOG.md).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…te data

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
The unit checker compared dimensions only, so seconds vs milliseconds and
USD/kWh vs USD/(W*s) passed. It now also compares scale. Numeric literals
count as conversions only when they bridge the scale gap, so `a_s = b_ms`
and `a_s = b_ms * 1000` fail and `a_s = b_ms / 1000` passes.

Variables whose display unit is not SI-coherent (kWh prices, kW, GB, month,
year, liter, tonne) now carry real scaled sp_units. The 12 existing
conversion equations were already correct and pass. econ.finance.wacc_annual
was labeled 1/year but is a dimensionless fraction (it is added to 1), so
the label is fixed. Checks SymPy cannot decide are recorded and shown by
`audit` as unit_checks_undecided instead of passing silently.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Protocol, runner and library only. No results exist yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
130 equations reviewed (4 wrong, 1 reference mismatch, 17 suspect), 27
numeric checks against references, reachability of all 950 equations to the
headline targets, and suspect preset values. Scripts reproduce every number.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Protocol and simulation code only. Smoke outputs removed; the protocol
discloses what was seen during code checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
reanalyze.py recomputes every effect from the persisted artifacts with
several interval methods and reproduces all 39 original bootstrap
intervals exactly. EVIDENCE.md records, per run, what was measured versus
modeled, the original verdict verbatim, and a labeled post-hoc status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Adds ruff and mypy configuration, a perf extra (numpy) that CI installs so the
uncertainty fast path is tested, and a registered `slow` pytest marker. Drops
the unused pytest-asyncio dev dependency and regenerates uv.lock, which was
already stale. CI stays on pip.

The verify job re-ran the whole pytest suite; it is replaced by one
docs-stats step in the test job, the only gate verify had that the test job
lacked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Removes unused imports and dead locals outside gpu_stack/research and the
scope facades, keeping re-exports that other modules and tests import
(_boundary_family, _value_dependencies, fixtures from tests/helpers). Fixes
the nine mypy errors in gpu_stack/core. The perf test now asserts the fast
path ran (one resolver call for 200 samples) instead of only a 30 s bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
39 cited training runs (sources, pages and quotes per number), prediction
arms, baselines and pass lines, frozen before any prediction on them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…ixes

Performance
- Share one download per data file between observatory.js and webmcp-mission.js
  (new docs/data-cache.js); drop cache: "no-store" on immutable data files.
- Load recovery-v2 (4.2 MB) and the other E001-only results only when the E001
  view opens. Raw traces (72 MB, 19 MB, 8.8 MB) load only on a button that
  shows the file size first.
- Stop requesting data/e002-rack-dephasing-v3.json (no result exists; the band
  stays hidden). E001-only bands no longer leak into the E001-SC1 view.
- Observatory local transfer on load: 8.80 MB -> 2.35 MB.

Readability
- Pixel face only for window chrome; IBM Plex Sans for prose and labels, IBM
  Plex Mono for numbers and IDs. DESIGN.md font rule rewritten to match.
- Prose 15px, labels 13px, no mid-word headline breaks.
- Larger causal diagram with 12px+ labels; charts keep >= 85% of design width.
- Remove the duplicated "In plain words" box and duplicate plain answer.
- Mission bar details and the review queue / receipts rail are behind a toggle
  (closed on narrow screens, opens when something is staged).
- Index scroll-reveal is now an enhancement only; content is visible by default.
- Add Open Graph and Twitter tags to observatory.html and index.html.
- Bump the asset cache key and update the load-order test to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…mobile layout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Root-debt ranking does not predict influence on cost per token (tau-b 0.04,
supported for the headline pair only). No lithography root enters any
headline formula; the pinned power-limited FLOP rate that sits above them
does matter (ST 0.19).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
As shipped (100% MFU) the graph misses training time by a median 68%.
With an outside MFU prior it matches the 6ND/40%-MFU baseline exactly
(median error 22%) and adds nothing beyond it. Energy and money claims
cannot be tested with the available primary data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
- Small-system solving no longer swallows AmbiguousVariant or
  InvalidVariantSelector; they propagate to the caller (tests added).
- Add gpu_stack.__version__ (importlib.metadata, "0+unknown" fallback).
- verify, audit, next-work and docs_stats_check exit with one clear message
  when run outside a source clone.
- Raise verify gate timeouts (fast 600 s, full 1800 s) so the full pytest
  gate fits with headroom.
- Mark the four slowest tests in the suite (12-26 s each) @pytest.mark.slow;
  they still run by default. The uncertainty tests are all under 0.5 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
… hardening

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Checkpoint/restart against Daly's closed form, accounting identities,
queueing against Erlang C and Pollaczek-Khinchine, and published failure
rates. Protocol discloses a recovery-runtime exception found while building
the harness.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
The 1F1B bubble phi = (p-1)/(p+m-1) is bubble time over total time, but
training.eq.t_bubbles multiplies nominal step time by it. Step time came out
as 1 + phi instead of 1 + (p-1)/m (1.47 vs 1.875 at p = m = 8). Convert in
training.eq.pipeline_bubble_fraction with phi/(1-phi) so every term in
training.overhead_fraction is an overhead over nominal time and the others
(straggler, restart, eval) are not double counted. Cite Narayanan et al.
SC21. Add regression tests against the reference multiplier.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
… total

Interleaved 1F1B used effective depth p/v - 1 instead of (p-1)/v, giving
0.27 vs the correct 0.44 overhead at p = m = 8, v = 2 (after converting to
the same definition). GPipe used (p-1)/m (overhead over ideal) while 1F1B
used (p-1)/(p-1+m) (share of total), although Narayanan et al. SC21 give
both the same bubble. Every par.pp bubble variable is now a share of total
step time, GPipe equals 1F1B, interleaved uses depth (p-1)/v, and each
description states the definition. Add tests against the reference.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
col.eq.allgather_hier divided the inter-node payload by n_nodes only, so it
moved N/n per rank across nodes instead of N/(n r). It was 4.7x too large at
r = 8, n = 8 and hierarchical allreduce did not equal reducescatter plus
allgather inside the graph. Divide by ranks_per_node * n_nodes, matching
reducescatter_hier. Add tests for the two-level reference and the identity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
arch.eq.kv_mla stored 2 * d_latent, as if K and V latents were cached
separately. DeepSeek-V2 caches one shared compressed latent plus a decoupled
RoPE key, (d_c + d_R) elements per token per layer: 1152 bytes at 512 + 64 in
bf16, not 2048. arch.mla.d_latent now means the cached width d_c + d_R, stated
in its description. No new variable, so the registry counts quoted in the
docs do not change. Cite DeepSeek-V2 Table 1 and add tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
The equation is 6 * N_total * T with embeddings counted and no attention
score term. It cited Kaplan et al. 2020, whose C ~ 6 N B S uses non-embedding
parameters. Keep the formula (the headline presets use it) and fix the
description and references: cite Kaplan for the non-embedding form and
Narayanan et al. SC21 Eq. 4 for the exact reference, and state where the
approximation holds (within 3% from about 1B parameters, 23% high for
Pythia-70M). Add tests that pin both regimes against the exact formula.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
The H100 hardware preset assigned the FP32 CUDA-core rate (67 TFLOPS) to
gpu.peak_flops, NVIDIA's bidirectional NVLink total (900 GB/s) to a variable
the collective beta term reads as one-direction bandwidth, and 80e9 bytes
for "80GB" memory.

- gpu.peak_flops: dense BF16 tensor-core peak 989.4 TFLOPS, the datasheet's
  sparsity-footnoted 1,979 TFLOPS halved. FP32 is no longer assigned.
- gpu.nvlink.bw: 450 GB/s per direction. The variable description now says
  per direction.
- mem.hbm.capacity and cluster.node.hbm_capacity: 80 GiB and 640 GiB. The
  datasheet does not state the base, so the note labels this as inferred.
- Add ASSUMED_TRAINING_MFU (0.40, labeled assumption with the published
  38-46% range) for scenario closures to use.

No headline scenario value changes in this commit because the scenario
closures set the power-limited peak directly. Update the pinned hardware
tests, which change only because of these corrections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
LC3 non-inferiority with 6 fresh warm seeds x 3 pairs and a calibration-set
margin, plus SC1 averaging-control arms (EMA, cosine LR). Planning power
analysis uses only the original E001 artifacts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
All four unrun protocols (E003-E006) are inadequate as written: several
gates are arithmetically impossible at the planned n, some are too lax,
many are underspecified. Method check reproduces the known SC1 and LC3
gate defects (LC3's energy gate would have said falsified 64-82% of the
time with no real penalty).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
claude added 29 commits October 1, 2026 22:32
periodic_local's advantage over synchronous training is explained by
averaging at a constant learning rate, so it moves from 'holds up' to
'doesn't'. LC3's learning pass does not replicate on fresh seeds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…onfigurable

next-work and its modules and tests are gone. experiment-protocol lists
only E001 and E002. docs_stats_check now checks README.md by default and
takes --files for others.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Delete the study folders, the evidence ledger, analysis, docs/research and
the research program file. Keep scenario inputs under experiments/ with a
short README. Rewrite ROADMAP, add a CHANGELOG entry, drop links to deleted files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…unrun protocols

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Opens on a single Story window with a scrolling explainer (placeholder
sections between STORY START / STORY END markers), plus Calculator and Lab
icons. The Calculator window mounts GPUStackCalculator when calculator.js
exists and says "coming soon" otherwise. Phones get a Story / Calculator /
Lab tab bar instead of the desktop.

Removes the 13-button sidebar, registry stats, status lights, token journey,
layer and trace widgets, cone browser, glossary and the design notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
First screen is one question, an answer placeholder (LAB ANSWER marker) and
the recovery timeline. Everything else sits in closed sections that fetch
their data when first opened. The WebMCP panels move behind one Agent tools
button, the semantic depth and experiment pickers are gone, study codes are
replaced by plain names in visible text, and the unrun rack-power view and
unused CSS are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…h lithography

Remove the nuclear, quark, atomic and plasma-source equations (they had no
numeric effect on any headline target) and the presets that only fed them.
Wavelength and numerical aperture are now plain inputs; the 13.5 nm EUV and
193 nm ArF immersion exposures are presets. The ~60 physical_lithography_*
modules collapse into one physical_lithography.py. Tests for removed code are
deleted, the rest are ported to the surviving lithography equations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
… check, CLI

The calculator resolves the registered equations with symbolic inputs, so
its closed forms are the graph's own. Defaults are labelled assumptions.
check_against_published() reproduces the 27-run check (median error 22%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Sobol total-order on log cost per token for a 7B model, 2T tokens, 1,024 H100.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
docs/calculator.js evaluates expression trees exported from the graph; a node
test compares them with Python-computed values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Adds scripts/build_accuracy_figure_data.py and the 27 tier A rows it writes,
each with its source citations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
GPUStackFigures.mount(el, id) builds animated, keyboard accessible figures that
play in view, pause off screen and show a still frame under reduced motion:
why-so-many-gpus (hook-gpu-hours), cost-ladder, drivers, lithography, accuracy,
flaky-sites and agents-report-card. Adds a demo page and a node test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
33 draft explainers (docs/data/explainers.json), 32 animated SVG
mini-diagrams keyed by visual id (docs/explain-visuals.js), a demo page
with story text, and a node test that checks the data, the visuals and
the house style (no dashes, exclamation points or emoji, short bodies).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
GPUStackExplain.init() turns span.term and abbr elements with a
data-term into triggers for a small CuperOS window: intent-delayed hover,
keyboard focus, tap, flip and clamp positioning that follows scroll, one
window at a time, a bottom sheet at phone width, reduced-motion support
and dialog ARIA with focus management.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…e pixel face

README is rewritten around the story, the calculator and the lab. The Lab
gets a plain answer with explainers. Pixelify Sans loads at weight 500 only
with no synthesized bold, because its bold closes C into O. The hero image
is now the site itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…shed_runs.json

The old script read study files that were deleted. The calculator now
gives the same numbers as the rule of thumb (the earlier study graph was
about 0.1 percent higher), so the figure data and its built-in copy are
regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…aption reports the line width

The grid is 8 x 8 racks with visible idle cells, a legend, one working
GPU in the first frame and a two-row time readout. The canvas also drew
at the wrong height when it was exactly 300 px wide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Figures: 40px controls on touch, tap-to-pick dots on the accuracy plot,
13px minimum for figure text, lithography labels, cost ladder reveals as
the Story window scrolls. Explainers go beside a term when there is no
room above or below it. Lab: inspector under the causal field so the
graph fits, chart text 14px, mission bar wraps instead of cutting text.
Removed docs/figures-demo.html (nothing linked to or tested it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
@Cuuper22
Cuuper22 merged commit 5570249 into main Oct 2, 2026
16 checks passed
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.

2 participants