Skip to content

Commit 6866256

Browse files
Cuuper22claude
andcommitted
Merge redesign/cuperos-unification: one brand, plain words, real motion
Executes the design critique end to end: README rewritten for lay readers with the lab log split to docs/research/results-log.md, agent-process ledgers moved out of the repo root, index tokens consolidated and demos animated, the observatory re-homed inside CuperOS chrome with the portfolio palette, a freshman translation layer that restates verdicts instead of hiding them, and scenario-band micro-animations. Full pytest: 1039 passed. docs-stats gate: OK. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 parents 76a6b67 + e0efaf4 commit 6866256

24 files changed

Lines changed: 1278 additions & 329 deletions

README.md

Lines changed: 72 additions & 262 deletions
Large diffs are not rendered by default.

docs/app.js

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ const traces = {
103103
note: "This path is why the project keeps economics attached to physics. A price can inherit assumptions from power, cooling, utilization, kernels, and lower physical boundaries.",
104104
meterLabel: "scenario-report resolves 4 of 4 targets",
105105
meterFoot: "status: ok, issue_count: 0",
106-
meterWidth: "100%",
106+
meterScale: "1",
107107
path: [
108108
["econ.cost.per_token", "target", "What does one token cost?"],
109109
["econ.run.power_cost", "equation", "Power has to be paid for."],
@@ -122,7 +122,7 @@ const traces = {
122122
note: "The trace view keeps the easy phrase, faster training, connected to the things that actually move it: tensors, kernels, collectives, memory, topology, and utilization.",
123123
meterLabel: "representative fixture: 6666666.66666667 tokens/s",
124124
meterFoot: "synthetic anchor, not vendor truth",
125-
meterWidth: "82%",
125+
meterScale: "0.82",
126126
path: [
127127
["training.tokens_per_sec", "target", "How fast do tokens move?"],
128128
["training.step_time", "equation", "Compute plus comms plus bubbles."],
@@ -141,7 +141,7 @@ const traces = {
141141
note: "This is the layer where non-experts can see why cooling and facility assumptions are part of model training, not an external footnote.",
142142
meterLabel: "representative fixture: econ.job.dc_power = 5200.0",
143143
meterFoot: "explicit fixture assignment path",
144-
meterWidth: "68%",
144+
meterScale: "0.68",
145145
path: [
146146
["econ.job.dc_power", "target", "What power does the job imply?"],
147147
["cluster.site.power_it", "equation", "GPU and infrastructure load."],
@@ -206,6 +206,7 @@ function renderLayer(key) {
206206
stack.replaceChildren(...layer.stack.map((item, index) => {
207207
const row = document.createElement("div");
208208
row.className = `dependency-row${index === layer.stack.length - 1 ? " active" : ""}`;
209+
row.style.setProperty("--i", String(index));
209210
const label = document.createElement("span");
210211
label.textContent = item;
211212
const depth = document.createElement("span");
@@ -229,6 +230,7 @@ function renderTrace(key) {
229230
tracePath.replaceChildren(...trace.path.map(([labelText, role, detail], index) => {
230231
const node = document.createElement("div");
231232
node.className = `trace-node${index === trace.path.length - 1 ? " active" : ""}`;
233+
node.style.setProperty("--i", String(index));
232234
const roleLabel = document.createElement("small");
233235
roleLabel.textContent = role;
234236
const label = document.createElement("b");
@@ -241,7 +243,7 @@ function renderTrace(key) {
241243
traceNote.textContent = trace.note;
242244
traceMeterLabel.textContent = trace.meterLabel;
243245
traceMeterFoot.textContent = trace.meterFoot;
244-
traceMeter.style.setProperty("--meter-width", trace.meterWidth);
246+
traceMeter.style.setProperty("--meter-scale", trace.meterScale);
245247
targetTabs.forEach((tab) => {
246248
tab.setAttribute("aria-selected", String(tab.dataset.target === key));
247249
});
@@ -281,3 +283,35 @@ if (clock) {
281283
updateClock();
282284
setInterval(updateClock, 1000);
283285
}
286+
287+
// Scroll reveals. The hidden pre-reveal state only exists once html.js-anim
288+
// is set, so readers without JS, without IntersectionObserver, or with
289+
// reduced motion requested always get the fully visible page.
290+
(function initReveals() {
291+
const motionOk = !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
292+
if (!("IntersectionObserver" in window) || !motionOk) {
293+
return;
294+
}
295+
const targets = document.querySelectorAll(
296+
".primer-panel, .journey-strip, .section-window, .stat-grid .stat, " +
297+
".glossary-grid .glossary-term, .dialog-grid .dialog-body, .timeline-row"
298+
);
299+
if (!targets.length) {
300+
return;
301+
}
302+
targets.forEach((el, index) => {
303+
el.classList.add("reveal");
304+
// Stagger siblings that arrive in the same viewport batch.
305+
el.style.setProperty("--reveal-i", String(index % 4));
306+
});
307+
document.documentElement.classList.add("js-anim");
308+
const observer = new IntersectionObserver((entries) => {
309+
entries.forEach((entry) => {
310+
if (entry.isIntersecting) {
311+
entry.target.classList.add("in-view");
312+
observer.unobserve(entry.target);
313+
}
314+
});
315+
}, { rootMargin: "0px 0px -8% 0px", threshold: 0.05 });
316+
targets.forEach((el) => observer.observe(el));
317+
})();

docs/cone-browser.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@
229229
var shown = Math.min(parents.length, MAX_CHILDREN);
230230
for (var i = 0; i < shown; i++) {
231231
var childBtn = makeNodeButton(depth + 1, parents[i], false);
232+
// Stagger slot for the cascade-in animation (capped in CSS).
233+
childBtn.style.setProperty("--i", String(i));
232234
container.appendChild(childBtn);
233235
}
234236
if (parents.length > MAX_CHILDREN) {

docs/index.html

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
<p class="file-path">gpu_stack/readme/frontdoor.txt</p>
8787
<h1 id="page-title">gpu_stack</h1>
8888
<p class="tagline">
89-
A causal virtual datacenter that connects learning dynamics, execution, failures, facility power, economics, and evidence, then makes the same result understandable from freshman intuition through raw research trace.
89+
A virtual AI datacenter you can interrogate. It predicts what a training run does to time, power, and money, says how sure it is, and can show you what every one of its numbers is made of.
9090
</p>
9191
<div class="action-row">
9292
<a class="retro-btn primary" href="observatory.html"><span class="px-icon px-graph"></span> Open observatory</a>
@@ -161,6 +161,51 @@ <h2 id="primer-heading">Read it like a receipt, not a magic answer.</h2>
161161
<div class="stat"><b>884</b><span>equations with unit checks</span></div>
162162
</section>
163163

164+
<section class="journey-strip" id="journey" aria-label="One token's journey down the stack">
165+
<div class="journey-head">
166+
<p class="eyebrow">token_journey.exe</p>
167+
<h2>Follow one token from math to money.</h2>
168+
<p class="caption">Every station is a layer of the model. The lamp lights as the token passes through, and the trip always ends at an invoice.</p>
169+
</div>
170+
<div class="journey-track">
171+
<div class="journey-station" style="--i:0;">
172+
<span class="journey-lamp" aria-hidden="true"></span>
173+
<b>Model math</b>
174+
<span>attention, FFN, parameters</span>
175+
</div>
176+
<div class="journey-hop" style="--i:0;" aria-hidden="true"></div>
177+
<div class="journey-station" style="--i:1;">
178+
<span class="journey-lamp" aria-hidden="true"></span>
179+
<b>Kernels</b>
180+
<span>instructions, tiling, occupancy</span>
181+
</div>
182+
<div class="journey-hop" style="--i:1;" aria-hidden="true"></div>
183+
<div class="journey-station" style="--i:2;">
184+
<span class="journey-lamp" aria-hidden="true"></span>
185+
<b>Memory</b>
186+
<span>HBM traffic, caches, bandwidth</span>
187+
</div>
188+
<div class="journey-hop" style="--i:2;" aria-hidden="true"></div>
189+
<div class="journey-station" style="--i:3;">
190+
<span class="journey-lamp" aria-hidden="true"></span>
191+
<b>Silicon</b>
192+
<span>transistors, lithography, atoms</span>
193+
</div>
194+
<div class="journey-hop" style="--i:3;" aria-hidden="true"></div>
195+
<div class="journey-station" style="--i:4;">
196+
<span class="journey-lamp" aria-hidden="true"></span>
197+
<b>Power</b>
198+
<span>board, rack, cooling, PUE</span>
199+
</div>
200+
<div class="journey-hop" style="--i:4;" aria-hidden="true"></div>
201+
<div class="journey-invoice">
202+
<span class="journey-lamp" aria-hidden="true"></span>
203+
<b>Invoice: ~$3 per million tokens</b>
204+
<span>synthetic fixture value, not a market price</span>
205+
</div>
206+
</div>
207+
</section>
208+
164209
<section class="section-window" aria-labelledby="model-heading">
165210
<div class="section-copy">
166211
<p class="eyebrow">Symbolic causal backbone</p>

docs/observatory.html

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,39 @@
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
66
<meta name="description" content="GPUSTACK causal observatory for evidence-preserving virtual datacenter experiments.">
7-
<meta name="theme-color" content="#f3f0e7">
7+
<meta name="theme-color" content="#0e7d84">
88
<title>GPUSTACK Causal Observatory · E001</title>
9+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' shape-rendering='crispEdges'%3E%3Crect width='16' height='16' fill='%23008080'/%3E%3Crect x='3' y='3' width='10' height='10' fill='%23808080' stroke='%231A1A1A'/%3E%3Crect x='5' y='5' width='6' height='6' fill='%23C0C0C0'/%3E%3C/svg%3E">
910
<link rel="preconnect" href="https://fonts.googleapis.com">
1011
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11-
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;family=Pixelify+Sans:wght@500;600&amp;display=swap" rel="stylesheet">
12-
<link rel="stylesheet" href="styles/90-observatory.css?v=20260712.12">
12+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&amp;family=IBM+Plex+Sans:wght@400;500;600;700&amp;family=Pixelify+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet">
13+
<link rel="stylesheet" href="styles/00-foundation.css">
14+
<link rel="stylesheet" href="styles/90-observatory.css?v=20260713.1">
15+
<link rel="stylesheet" href="styles/60-taskbar.css">
16+
<link rel="stylesheet" href="styles/70-pixel-icons.css">
17+
<link rel="stylesheet" href="styles/95-observatory-cuperos.css?v=20260713.1">
1318
<script src="observatory.js?v=20260712.10" defer></script>
1419
</head>
1520
<body data-depth="freshman" data-data-state="loading">
1621
<a class="skip-link" href="#observatory-main">Skip to experiment</a>
1722

23+
<div class="obs-desktop">
24+
<div class="desktop-logo">
25+
<span class="logo-text">CuperOS</span>
26+
<span class="logo-version">CAUSAL OBSERVATORY V0.27</span>
27+
</div>
28+
29+
<div class="window obs-app-window" aria-label="Causal observatory window">
30+
<div class="title-bar">
31+
<div class="title-text"><span class="px-icon px-graph"></span> observatory.exe · E001</div>
32+
<div class="window-controls" aria-hidden="true">
33+
<span class="window-btn">_</span>
34+
<span class="window-btn"></span>
35+
<span class="window-btn">x</span>
36+
</div>
37+
</div>
38+
<div class="window-content obs-window-content">
39+
1840
<header class="obs-header" aria-label="Observatory header">
1941
<a class="obs-identity" href="index.html" aria-label="GPUSTACK home">
2042
<span class="obs-wordmark">GPUSTACK</span>
@@ -66,6 +88,7 @@ <h1 id="experiment-question">Can one observable controller safely spend semantic
6688
<span>small-model learning + virtual datacenter</span>
6789
</div>
6890
<p class="plain-answer" id="plain-answer">Loading the held-out semantic-consistency result. No conclusion is shown until its evidence boundary is known.</p>
91+
<p class="plain-words" id="plain-words"></p>
6992
<p class="artifact-state" id="artifact-state" role="status" aria-live="polite">Reading data/e001-semantic-consistency-v1.json…</p>
7093
</div>
7194
</section>
@@ -86,6 +109,7 @@ <h3 id="semantic-consistency-insight-title">Result loading</h3>
86109
</div>
87110
<div>
88111
<p id="semantic-consistency-plain-answer">The observatory will state whether adaptive switching preserved held-out learning and beat the frozen fixed comparator.</p>
112+
<p class="plain-words" id="semantic-consistency-plain-words"></p>
89113
<strong id="semantic-consistency-boundary-short">Infrastructure remains modeled unless the artifact says otherwise.</strong>
90114
</div>
91115
</article>
@@ -413,6 +437,7 @@ <h2 id="learning-v1-title">Did adaptive recovery preserve learning efficiency?</
413437
<h3 id="learning-insight-title">The learning result is loading</h3>
414438
</div>
415439
<p id="learning-plain-answer">The observatory will state the measured answer once the persisted artifact is available.</p>
440+
<p class="plain-words" id="learning-plain-words"></p>
416441
</article>
417442

418443
<div class="learning-depth-copy" id="learning-depth-copy">
@@ -513,6 +538,7 @@ <h2 id="equal-work-v1-title">What survives when useful work is held equal?</h2>
513538
<h3 id="equal-work-insight-title">Equal-work result loading</h3>
514539
</div>
515540
<p id="equal-work-plain-answer">The observatory will state the result after loading the persisted LC3 artifact.</p>
541+
<p class="plain-words" id="equal-work-plain-words"></p>
516542
</article>
517543

518544
<div class="equal-work-depth-copy">
@@ -629,6 +655,7 @@ <h3 id="checkpoint-power-insight-title">Result loading</h3>
629655
</div>
630656
<div>
631657
<p id="checkpoint-power-plain-answer">The observatory will state the measurement boundary after loading the persisted artifact.</p>
658+
<p class="plain-words" id="checkpoint-power-plain-words"></p>
632659
<strong id="checkpoint-power-decision">No policy claim is available yet.</strong>
633660
</div>
634661
</article>
@@ -776,6 +803,7 @@ <h3 id="checkpoint-energy-insight-title">Result loading</h3>
776803
</div>
777804
<div>
778805
<p id="checkpoint-energy-plain-answer">The observatory will state the mechanism after loading the persisted artifact.</p>
806+
<p class="plain-words" id="checkpoint-energy-plain-words"></p>
779807
<strong id="checkpoint-energy-mechanism">Mechanism estimate loading.</strong>
780808
</div>
781809
</article>
@@ -1154,6 +1182,34 @@ <h3 id="decision-ledger-title">Policy decision ledger</h3>
11541182
<span>All experiment times shown in seconds unless nanoseconds are selected in full trace.</span>
11551183
</footer>
11561184

1185+
</div>
1186+
</div>
1187+
</div>
1188+
1189+
<footer class="taskbar" aria-label="CuperOS taskbar">
1190+
<div class="taskbar-left">
1191+
<a class="start-button" href="https://cuuper22.github.io/"><span class="px-icon px-start"></span> Start</a>
1192+
<a class="task-button" href="index.html"><span class="px-icon px-chip"></span> gpu_stack.exe</a>
1193+
<span class="task-button is-active"><span class="px-icon px-graph"></span> observatory.exe</span>
1194+
</div>
1195+
<div class="taskbar-clock" id="obs-clock">12:00 PM</div>
1196+
</footer>
1197+
11571198
<div class="sr-status" id="sr-status" role="status" aria-live="polite"></div>
1199+
1200+
<script>
1201+
(function () {
1202+
var clock = document.getElementById("obs-clock");
1203+
if (!clock) { return; }
1204+
function tick() {
1205+
var now = new Date();
1206+
var h = now.getHours() % 12 || 12;
1207+
var m = String(now.getMinutes()).padStart(2, "0");
1208+
clock.textContent = h + ":" + m + " " + (now.getHours() >= 12 ? "PM" : "AM");
1209+
}
1210+
tick();
1211+
setInterval(tick, 1000);
1212+
})();
1213+
</script>
11581214
</body>
11591215
</html>

0 commit comments

Comments
 (0)