Restructure gpu_stack around one story, a calculator and a lab - #25
Merged
Merged
Conversation
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
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
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
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
…grams 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
…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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
…uild Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/)
Model (gpu_stack/)
gpu_stack/calculator.py(gpu-stack estimate) andgpu_stack/drivers.py;check_against_published()reproduces the ~22% median error on 27 published runs.Repository
Validation
python -m pytest -q: 861 passedruff check .,mypy: cleannode --test tests/*.mjs: 38 passed🤖 Generated with Claude Code
https://claude.ai/code/session_01Q9dH3SaBQtLoGrqDXSAKMw
Generated by Claude Code