betterwithage commited on
Commit
f3e16bc
·
verified ·
1 Parent(s): 811806b

chore(sync): mirror front-door files to Space (hf-sync)

Browse files

Automated front-door sync from szl-holdings/a11oy main via hf-sync.
Added/updated: cathedral.html, cathedral_genius.html, console/docs.html, console/index.html, console/pricing.html, console/throne-room.html, console/throne-room.js, live_wires.html, pages/api-keys.html, pages/audit.html, pages/ayni.html, pages/brain-dual.html, pages/brain-jack.html, pages/brain.html, pages/chaski.html, pages/codex-kernel.html, pages/company.html, pages/compliance.html, pages/console.html, pages/counter-uas.html, pages/cued-engagement.html, pages/docs.html, pages/energy-ops.html, pages/evidence.html, pages/fabric.html, pages/gap-report.html, pages/harvest.html, pages/hatun-mcp.html, pages/hub.html, pages/integrations.html, pages/landing.html, pages/mesh.html, pages/observability.html, pages/operator_organ.html, pages/pinn.html, pages/pnt.html, pages/pricing.html, pages/run-all.html, pages/sdk.html, pages/security.html, pages/status.html, pages/substrate.html, pages/superpowers.html, pages/throne-room.html, pages/throne-room.js, pages/uds.html, pages/upgrades.html, pages/wallpa.html, pages/warhacker.html, pages/wasi-rikuq.html, pages/wires.html, static/a11oy_cathedral.js, static/cathedral_app.js, static/shared/szl_codename_sanitizer.js, static/shared/szl_holo3d.js, static/shared/szl_label_engine.js, static/shared/szl_receipt_cosign.js
Deleted (gone from GitHub main): (none)

Keeps the served front-door (pages/*.html, console/*.html) identical
to GitHub main so an HF factory rebuild never drops a GitHub edit or
keeps serving a page that was deleted on GitHub.

Files changed (1) hide show
  1. pages/fabric.html +273 -93
pages/fabric.html CHANGED
@@ -1,101 +1,281 @@
1
  <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8"/>
5
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>Compute Fabric · Live Pool a11oy</title>
7
- <!--
8
- Dedicated COMPUTE FABRIC surface — NOT the generic Command Center. Boots the shared
9
- szl3d stage and mounts ONLY the compute-fabric surface (static/3d/surfaces/fabric.js),
10
- a 3D force-directed node mesh of the live compute pool bound to
11
- /api/a11oy/v1/compute-pool.
12
-
13
- Doctrine v11 (HARD): node reachability is a REAL TCP probe (MEASURED) — reachable
14
- glows teal, unreachable dims with a red ring; "sovereign" is a passed-through PROPERTY
15
- of owned hardware (gold), never inferred. The topology mesh is STRUCTURAL-ONLY — we do
16
- NOT claim measured NVLink bandwidth. The surface renders exactly the honesty label the
17
- JSON carries; if the endpoint 404s/errors/{degraded:true} it shows the honest state and
18
- keeps the last good mesh, or an honest NO-LIVE-DATA placeholder. 0 runtime CDN — three.js
19
- vendored same-origin via the importmap. System fonts only. WebGL2 default; ?webgpu=1 opts in.
20
- -->
21
- <script type="importmap">
22
- {
23
- "imports": {
24
- "three": "/static/3d/vendor/three/three.module.min.js",
25
- "three/webgpu": "/static/3d/vendor/three/three.webgpu.min.js",
26
- "three/addons/": "/static/3d/vendor/three/addons/"
27
- }
28
- }
29
- </script>
30
  <style>
31
- :root{--bg:#05070d;--line:#1b2734;--teal:#39d3c4;--gold:#e8c074;--cream:#eef3f6;--para:#9fb1bf}
32
- *{box-sizing:border-box}
33
- html,body{margin:0;height:100%}
34
- body{background:var(--bg);color:var(--cream);
35
- font:14px/1.5 ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial;overflow:hidden}
36
- header{padding:10px 16px;border-bottom:1px solid var(--line);
37
- background:linear-gradient(180deg,#08101a,#05070d);display:flex;align-items:center;gap:12px;flex-wrap:wrap}
38
- h1{font-size:16px;margin:0;letter-spacing:.4px}
39
- .badge{display:inline-block;font:10.5px ui-monospace,Menlo,monospace;padding:2px 7px;border-radius:6px;
40
- border:1px solid var(--line);color:var(--gold);background:#10171f}
41
- #backend{color:var(--teal)}
42
- .nav{margin-left:auto;display:flex;gap:12px;font:11px ui-monospace,Menlo,monospace}
43
- a{color:var(--teal);text-decoration:none}
44
- #stage-wrap{position:relative;width:100vw;height:calc(100vh - 52px)}
45
- #stage{position:absolute;inset:0}
46
- #stage canvas{display:block;width:100%;height:100%}
47
- #fallback{position:absolute;inset:0;display:none;align-items:center;justify-content:center;
48
- text-align:center;color:var(--para);padding:24px;font:13px ui-monospace,Menlo,monospace}
49
- </style>
50
- </head>
51
- <body>
52
- <header>
53
- <h1>&#9671; Compute Fabric &middot; Live Pool</h1>
54
- <span class="badge" id="backend">renderer: &hellip;</span>
55
- <span class="badge">three r<span id="three-rev">&hellip;</span></span>
56
- <span class="badge">0 runtime CDN</span>
57
- <span class="badge">reachability MEASURED (TCP probe)</span>
58
- <span class="badge">&Lambda; = Conjecture 1</span>
59
- <nav class="nav">
60
- <a href="/holographic#fabric">all surfaces</a>
61
- <a href="/energy-ops">energy &rarr;</a>
62
- <a href="/">&larr; a11oy</a>
63
- </nav>
64
- </header>
65
- <div id="stage-wrap">
66
- <div id="stage"></div>
67
- <div id="fallback">3D unavailable on this device &mdash; the compute-fabric surface needs a WebGL2 or WebGPU canvas.<br>
68
- The live pool topology is still available as JSON at /api/a11oy/v1/compute-pool.</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  </div>
70
- <script type="module">
71
- import szl3d from "/static/3d/szl3d/szl3d_boot.js";
72
- import * as live from "/static/3d/szl3d/szl3d_live.js";
73
- import * as label from "/static/3d/szl3d/szl3d_label.js";
74
- import * as THREE from "three";
75
- import surface from "/static/3d/surfaces/fabric.js";
76
 
77
- const $ = (id) => document.getElementById(id);
78
- $("three-rev").textContent = THREE.REVISION;
 
 
 
 
 
 
 
 
 
79
 
80
- (async function main() {
81
- try {
82
- const wantWebGPU = /[?&]webgpu=1\b/.test(location.search);
83
- const stage = await szl3d.boot($("stage"), {
84
- bloom: { strength: 0.9, radius: 0.5, threshold: 0.2 },
85
- cameraPos: [0, 4, 18],
86
- forceWebGL: !wantWebGPU,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  });
88
- $("backend").textContent = "renderer: " + stage.backend.toUpperCase();
89
- stage.start();
90
- const ctx = { stage, container: $("stage"), live, label, THREE, szl3d };
91
- surface.mount(ctx);
92
- window.__SZL3D_FABRIC__ = { stage, surface };
93
- } catch (e) {
94
- $("fallback").style.display = "flex";
95
- $("backend").textContent = "renderer: UNAVAILABLE";
96
- console.error("[fabric] stage boot failed:", e);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  }
98
- })();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  </script>
100
- </body>
101
- </html>
 
1
  <!DOCTYPE html>
2
+ <html lang="en"><head>
3
+ <meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
4
+ <title>a11oy — Fabric · Governed Distributed Compute Fabric (one unified view)</title>
5
+ <meta name="description" content="The Governed Distributed Compute Fabric as one unified system-of-systems view: sovereign GPU mesh (laptop + OMEN + chaski + cloud failover) under one governed router, honest TCP reachability, joules MEASURED per node, doctrine-locked. Terrestrial-proven core; orbital is a clearly-labeled ROADMAP frame. Doctrine v11 honest. 0 runtime CDN.">
6
+ <!-- SZL Estate shared modules (byte-identical cross-app), served in-image at /static/shared (0 CDN). -->
7
+ <script src="/static/shared/szl_label_engine.js"></script>
8
+ <script src="/static/shared/szl_holo3d.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  <style>
10
+ :root{--bg:#0b0e14;--card:#121826;--ink:#e8eef7;--mut:#8aa0bf;--acc:#5ad1c0;--acc2:#7aa2ff;--line:#243149;--warn:#e0c060;--bad:#ff5c5c;--ok:#16c784;--orbit:#b07cff}
11
+ *{box-sizing:border-box}
12
+ body{margin:0;font:15px/1.55 -apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background:var(--bg);color:var(--ink)}
13
+ .wrap{max-width:1180px;margin:0 auto;padding:30px 20px 96px}
14
+ h1{font-size:28px;margin:0 0 4px;letter-spacing:.2px}
15
+ h2{font-size:18px;margin:34px 0 10px;border-bottom:1px solid var(--line);padding-bottom:6px}
16
+ .sub{color:var(--mut);margin:0 0 14px}
17
+ .card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin:14px 0}
18
+ code{background:#0a1626;padding:1px 5px;border-radius:5px;color:var(--acc);font-size:12px}
19
+ a{color:var(--acc);text-decoration:none}a:hover{text-decoration:underline}
20
+ nav a{margin-right:14px;font-weight:600}
21
+ .note{color:var(--mut);font-size:13px}
22
+ .foot{margin-top:40px;color:var(--mut);font-size:12px;border-top:1px solid var(--line);padding-top:14px}
23
+ table{width:100%;border-collapse:collapse;font-size:13px}
24
+ th,td{text-align:left;padding:7px 9px;border-bottom:1px solid var(--line);vertical-align:top}
25
+ th{color:var(--mut);font-weight:600}
26
+ .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
27
+ .kpi{background:#0e1422;border:1px solid var(--line);border-radius:11px;padding:13px 15px}
28
+ .kpi .v{font:700 24px/1.1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--acc)}
29
+ .kpi .k{color:var(--mut);font-size:12px;margin-bottom:6px}
30
+ .kpi .l{margin-top:8px}
31
+ .holo{height:420px;width:100%;border-radius:12px;overflow:hidden;position:relative}
32
+ .legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:10px;font-size:12px;color:var(--mut)}
33
+ .legend .sw{display:inline-block;width:11px;height:11px;border-radius:50%;margin-right:6px;vertical-align:middle}
34
+ .nodegrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(255px,1fr));gap:12px;margin-top:6px}
35
+ .nd{background:#0e1422;border:1px solid var(--line);border-radius:11px;padding:13px 15px}
36
+ .nd h3{margin:0 0 4px;font-size:15px}
37
+ .nd .ep{font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;color:var(--mut);word-break:break-all}
38
+ .nd .row{display:flex;gap:7px;flex-wrap:wrap;margin-top:9px;align-items:center}
39
+ .nd .joule{margin-top:9px;font:12px/1.3 ui-monospace,Menlo,Consolas,monospace;color:var(--ink)}
40
+ .dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:6px}
41
+ .dot.up{background:var(--ok)}.dot.down{background:var(--bad)}
42
+ .sov{font-size:11px;font-weight:700;letter-spacing:.04em}
43
+ .orbit{background:linear-gradient(180deg,#150d28 0%,#0e0a1c 100%);border:1px solid #3a2a5e;border-radius:12px;padding:16px 18px;margin:14px 0}
44
+ .orbit h2{color:#cdb4ff;border-bottom-color:#3a2a5e}
45
+ .orbit .band{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
46
+ .banner{display:inline-block;background:#2a1c47;border:1px solid #5a3fa0;color:#d9c6ff;font:800 12px/1 ui-monospace,Menlo,monospace;letter-spacing:.12em;padding:7px 12px;border-radius:8px;text-transform:uppercase}
47
+ .err{color:var(--bad);font-size:13px}
48
+ .muted-num{color:var(--mut)}
49
+ .hl{color:var(--acc2);font-weight:700}
50
+ .flow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:center;padding:8px 0}
51
+ .flow .node{background:#16264a;border:1px solid var(--line);border-radius:10px;padding:8px 13px;font-weight:700;color:var(--acc2);font-size:13px}
52
+ .flow .arr{color:var(--mut);font-size:18px}
53
+ .refresh{background:var(--acc2);color:#06101f;border:0;border-radius:8px;padding:7px 13px;font-weight:700;cursor:pointer;font-size:13px}
54
+ .stamp{font:12px/1.3 ui-monospace,Menlo,monospace;color:var(--mut)}
55
+ </style></head>
56
+ <body><div class="wrap">
57
+ <nav class="note"><a href="/">home</a><a href="/mesh">/mesh</a><a href="/wires">/wires</a><a href="/observability">/observability</a><a href="/holo">/holo</a></nav>
58
+ <h1>a11oy — Fabric</h1>
59
+ <p class="sub">The <b>Governed Distributed Compute Fabric</b> as one unified system-of-systems view. Sovereign GPU mesh + honest TCP reachability + joules <b>MEASURED</b> per node + one governed OpenAI-compatible router + doctrine-locked provenance. <span class="hl">Terrestrial governed mesh is the proven core; orbital is a clearly-labeled ROADMAP frame.</span> Doctrine v11 · Λ = Conjecture 1 · 0 runtime CDN.</p>
60
+
61
+ <div class="card">
62
+ <div style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px">
63
+ <div class="note">Live sources (no fabrication): <code>/api/a11oy/v1/compute-pool-hardened</code> · <code>/api/a11oy/v1/energy/operator/status</code> · <code>/api/a11oy/v1/honest</code> · <code>/api/a11oy/provenance</code></div>
64
+ <button class="refresh" onclick="loadAll()">↻ refresh live</button>
65
+ </div>
66
+ <div class="stamp" id="stamp" style="margin-top:8px">loading live fabric state…</div>
67
+ </div>
68
+
69
+ <h2>1 · Fabric at a glance</h2>
70
+ <div class="card">
71
+ <div class="kpis" id="kpis"><div class="note">…</div></div>
72
+ <p class="note" style="margin-top:14px">Every figure is honestly labeled. <b>Reachability</b> is a real TCP probe THIS sweep — a timeout/refusal is reachable=false with the reason, never fabricated. <b>Joules</b> are MEASURED only via the on-box exporter (nodes with no exporter read SAMPLE / 0). <b>Sovereign</b> is a property of owned hardware, passed through, never inferred from reachability.</p>
73
  </div>
 
 
 
 
 
 
74
 
75
+ <h2>2 · System-of-systems mesh (3D)</h2>
76
+ <div class="card">
77
+ <div class="holo" id="holo"></div>
78
+ <div class="legend">
79
+ <span><span class="sw" style="background:#16c784"></span>reachable (LIVE TCP probe)</span>
80
+ <span><span class="sw" style="background:#ff5c5c"></span>unreachable this sweep (honest)</span>
81
+ <span><span class="sw" style="background:#7aa2ff"></span>sovereign owned GPU/CPU</span>
82
+ <span><span class="sw" style="background:#e0c060"></span>hosted-inference failover (non-sovereign)</span>
83
+ </div>
84
+ <p class="note" style="margin-top:12px"><b>Scaling model — honest:</b> nodes scale <span class="hl">horizontally (placement + load-balance)</span> under one governed router. VRAM does <b>NOT</b> merge across the network — there is <b>no fused/combined VRAM</b>. The router places each job on a reachable node; it does not pool memory across machines.</p>
85
+ </div>
86
 
87
+ <h2>3 · Nodes — honest per-node board</h2>
88
+ <div class="nodegrid" id="nodes"><div class="note">…</div></div>
89
+
90
+ <h2>4 · Energy joules MEASURED, climbing</h2>
91
+ <div class="card">
92
+ <div class="kpis" id="energy"><div class="note">…</div></div>
93
+ <table id="byNode" style="margin-top:14px"><tr><th>node</th><th>jobs</th><th>tokens</th><th>joules</th><th>label</th></tr></table>
94
+ <p class="note" style="margin-top:12px">Joules are MEASURED via the on-box exporter (node <code id="expnode">betterwithage</code>). Nodes without a local exporter contribute SAMPLE jobs (joules unmeasured) — shown honestly, never imputed. Signed receipts fold into the Khipu ledger: <code>/api/a11oy/v1/energy/provenance</code>.</p>
95
+ </div>
96
+
97
+ <h2>5 · Governed router + provenance</h2>
98
+ <div class="card">
99
+ <div class="flow">
100
+ <span class="node">request</span><span class="arr">→</span>
101
+ <span class="node">governed router</span><span class="arr">→</span>
102
+ <span class="node">placement (Λ-gated)</span><span class="arr">→</span>
103
+ <span class="node">sovereign node / failover</span><span class="arr">→</span>
104
+ <span class="node">signed receipt → Khipu</span>
105
+ </div>
106
+ <div id="prov" class="note" style="margin-top:8px">…</div>
107
+ </div>
108
+
109
+ <div class="orbit">
110
+ <div class="band">
111
+ <span class="banner">Roadmap · orbital framing</span>
112
+ <span id="orbitBadge"></span>
113
+ </div>
114
+ <h2 style="margin-top:6px">6 · Orbital system-of-systems — ROADMAP / analogy (we do NOT run satellites)</h2>
115
+ <p class="note">The same governance primitives the terrestrial mesh PROVES on real metal — honest reachability, joules MEASURED per node, Λ-gated placement, signed-receipt provenance — are exactly what distributed / edge / <b>orbital</b> compute system-of-systems will require. <span style="color:#cdb4ff;font-weight:700">This band is the vision frame, clearly labeled ROADMAP.</span> SZL does <b>not</b> operate satellites; nothing in the mesh above is orbital. We prove on terrestrial metal what the orbital-architecture crowd only asserts.</p>
116
+ <div class="kpis" id="orbit">
117
+ <div class="kpi"><div class="k">Terrestrial governed mesh</div><div class="v" id="orbReach">—</div><div class="l" id="orbReachL"></div></div>
118
+ <div class="kpi"><div class="k">Per-node energy accounting</div><div class="v">joules</div><div class="l" id="orbJ"></div></div>
119
+ <div class="kpi"><div class="k">Edge / orbital placement</div><div class="v">vision</div><div class="l" id="orbRm"></div></div>
120
+ </div>
121
+ </div>
122
+
123
+ <div class="foot" id="foot">
124
+ HONEST: all numbers above carry an explicit label — LIVE (real backend wired) · MEASURED (on-box exporter) · MODELED (deterministic, labeled) · ROADMAP (vision, not deployed). No fused/combined VRAM is claimed anywhere — nodes scale horizontally (placement + load-balance); memory does not merge across the network. Orbital is analogy/ROADMAP; SZL does not run satellites. Reachability is a real TCP probe, never fabricated. trust &lt; 100% · tamper-EVIDENT not tamper-proof · Λ = Conjecture 1 · locked = 8 {F1,F4,F7,F11,F12,F18,F19,F22} @ kernel <code id="kernel">c7c0ba17</code> (749/14/163). SLSA L1 honest · L2 attested · L3 roadmap. Canonical numbers <a href="https://github.com/szl-holdings/.github/blob/main/.github/data/lean_numbers.json" target="_blank" rel="noopener">lean_numbers.json</a>.
125
+ </div>
126
+ </div>
127
+
128
+ <script>
129
+ "use strict";
130
+ var L = (window.SZLLabels && window.SZLLabels.badgeHTML) ? function(k,t){ return window.SZLLabels.badgeHTML(k, t?{label:t}:undefined); } : function(k,t){ return '<span class="szl-pill">'+(t||k)+'</span>'; };
131
+ function $(id){ return document.getElementById(id); }
132
+ function fmt(n){ if(n==null||isNaN(n)) return '—'; return Number(n).toLocaleString('en-US',{maximumFractionDigits:0}); }
133
+ function fmt1(n){ if(n==null||isNaN(n)) return '—'; return Number(n).toLocaleString('en-US',{maximumFractionDigits:1}); }
134
+ async function getJSON(url){ var r = await fetch(url, {headers:{'accept':'application/json'}}); if(!r.ok) throw new Error(url+' HTTP '+r.status); return r.json(); }
135
+
136
+ var holoScene = null;
137
+ function buildHolo(pool){
138
+ var mount = $('holo');
139
+ if(!window.SZLHolo || !window.SZLHolo.Scene){ mount.innerHTML = '<p class="note" style="padding:18px">3D kit unavailable — node board below carries the full honest state.</p>'; return; }
140
+ mount.innerHTML = '';
141
+ // λ here is a presentation parameter (Conjecture 1, <1.0), NOT a measured value.
142
+ holoScene = new window.SZLHolo.Scene(mount, { title: 'GOVERNED DISTRIBUTED COMPUTE FABRIC', lambda: 0.42, autoRotate: true });
143
+ var nodes = (pool.nodes||[]);
144
+ // hub = the governed router (the host running this service / hetzner-box-cpu self node anchors center)
145
+ var specNodes = [{ id:'router', label:'governed router', pos:[0,0,0], locked:true }];
146
+ var R = 1.15;
147
+ nodes.forEach(function(n, i){
148
+ var ang = (i / Math.max(1,nodes.length)) * Math.PI * 2;
149
+ var y = (n.kind === 'hosted-inference') ? 0.55 : -0.25; // failover ring sits above
150
+ specNodes.push({
151
+ id: n.name,
152
+ label: n.name + (n.reachable ? ' ✓' : ' ✕'),
153
+ pos: [R*Math.cos(ang), y, R*Math.sin(ang)],
154
+ // lower lambda => greener/larger (more trust); reachable+sovereign = most trusted
155
+ lambda: n.reachable ? (n.sovereign ? 0.22 : 0.40) : 0.80
156
  });
157
+ });
158
+ var edges = nodes.map(function(n){ return { from:'router', to:n.name }; });
159
+ holoScene.addGraph({ nodes: specNodes, edges: edges });
160
+ // pulse the signed-receipt flow along the first reachable sovereign edge
161
+ holoScene.start();
162
+ // Override the SAMPLE HUD badge: this scene is bound to LIVE topology + MEASURED energy.
163
+ try {
164
+ var lbl = mount.querySelector('[data-szl-holo-labels]');
165
+ if(lbl){ lbl.innerHTML = L('LIVE','LIVE TOPOLOGY') + ' ' + L('MEASURED','JOULES MEASURED') + ' ' + L('ROADMAP','ORBITAL = ROADMAP'); }
166
+ } catch(e){}
167
+ }
168
+
169
+ function renderKpis(pool, energy){
170
+ var c = pool.counts || {};
171
+ var html = '';
172
+ html += kpi('Nodes total', fmt(c.nodes_total), L('LIVE'));
173
+ html += kpi('Reachable this sweep', fmt(c.nodes_reachable), L('LIVE','LIVE TCP PROBE'));
174
+ html += kpi('Sovereign GPU reachable', fmt(c.gpu_nodes_reachable), L('LIVE'));
175
+ html += kpi('Joules total', fmt(energy.joules_measured_total), L('MEASURED'));
176
+ html += kpi('Jobs completed', fmt(energy.jobs_completed||energy.jobs_done), L('MEASURED'));
177
+ html += kpi('Scaling', 'horizontal', L('MODELED','PLACEMENT + LB'));
178
+ $('kpis').innerHTML = html;
179
+ }
180
+ function kpi(k,v,label){ return '<div class="kpi"><div class="k">'+k+'</div><div class="v">'+v+'</div><div class="l">'+(label||'')+'</div></div>'; }
181
+
182
+ function renderNodes(pool, energy){
183
+ var byNode = energy.by_node || {};
184
+ var html = '';
185
+ (pool.nodes||[]).forEach(function(n){
186
+ var bn = byNode[n.name] || {};
187
+ var jmeas = bn.joules_measured;
188
+ var hasMeas = (typeof jmeas === 'number' && jmeas > 0);
189
+ var jLabel = hasMeas ? L('MEASURED') : L('SAMPLE','SAMPLE / NO EXPORTER');
190
+ var jVal = hasMeas ? (fmt1(jmeas)+' J') : '0 J (unmeasured)';
191
+ var sov = n.sovereign ? '<span class="sov" style="color:#7aa2ff">SOVEREIGN (owned)</span>' : '<span class="sov" style="color:#e0c060">HOSTED FAILOVER</span>';
192
+ var reach = n.reachable
193
+ ? '<span><span class="dot up"></span>reachable</span> ' + L('LIVE','LIVE TCP')
194
+ : '<span><span class="dot down"></span>unreachable: '+(n.detail||'?')+'</span> ' + L('LIVE','HONEST');
195
+ html += '<div class="nd"><h3>'+n.name+'</h3>'+
196
+ '<div class="note">'+n.kind+'</div>'+
197
+ '<div class="ep">'+(n.endpoint||'')+'</div>'+
198
+ '<div class="row">'+reach+'</div>'+
199
+ '<div class="row">'+sov+'</div>'+
200
+ '<div class="joule">energy: '+jVal+' &nbsp;'+jLabel+
201
+ (bn.jobs!=null ? ' &nbsp;<span class="muted-num">· '+fmt(bn.jobs)+' jobs · '+fmt(bn.tokens)+' tok</span>' : '')+
202
+ '</div></div>';
203
+ });
204
+ $('nodes').innerHTML = html;
205
+ }
206
+
207
+ function renderEnergy(energy){
208
+ var html = '';
209
+ html += kpi('Joules MEASURED total', fmt(energy.joules_measured_total), L('MEASURED'));
210
+ html += kpi('Measured token-joules', fmt(energy.measured_token_joules), L('MEASURED'));
211
+ html += kpi('Measured jobs', fmt(energy.measured_jobs), L('MEASURED'));
212
+ html += kpi('Sample jobs (unmeasured)', fmt(energy.sample_jobs), L('SAMPLE'));
213
+ html += kpi('Grid price', fmt1(energy.grid_price_eur_mwh)+' €/MWh', L('LIVE'));
214
+ html += kpi('Power sample', fmt1(energy.power_w_sample)+' W', L('SAMPLE'));
215
+ $('energy').innerHTML = html;
216
+ if(energy.exporter_node) $('expnode').textContent = energy.exporter_node;
217
+ var bn = energy.by_node || {};
218
+ var rows = '<tr><th>node</th><th>jobs</th><th>tokens</th><th>joules</th><th>label</th></tr>';
219
+ Object.keys(bn).forEach(function(k){
220
+ var v = bn[k]; var has = (typeof v.joules_measured==='number' && v.joules_measured>0);
221
+ rows += '<tr><td><b>'+k+'</b></td><td>'+fmt(v.jobs)+'</td><td>'+fmt(v.tokens)+'</td><td>'+(has?fmt1(v.joules_measured)+' J':'0 (unmeasured)')+'</td><td>'+(has?L('MEASURED'):L('SAMPLE'))+'</td></tr>';
222
+ });
223
+ $('byNode').innerHTML = rows;
224
+ }
225
+
226
+ function renderProv(prov, honest){
227
+ var slsa = (honest && honest.footer) ? '' : '';
228
+ var dl = (honest && honest.doctrine_lock) || {};
229
+ var html = '';
230
+ html += '<p>SLSA: <b>'+(prov.slsa||'L1')+'</b> — L1 honest · L2 attested · L3 roadmap. '+L('LIVE')+' &nbsp; Λ = '+(dl.lambda||'Conjecture 1')+' '+L('LIVE','CONJECTURE 1')+'</p>';
231
+ if(prov.khipu_dsse){
232
+ html += '<p>Provenance per answer: signed-receipt substrate · keyid <code>'+(prov.khipu_dsse.keyid||'?')+'</code> · verify at <code>'+(prov.khipu_dsse.verify_endpoint||'/api/a11oy/khipu/verify')+'</code>. tamper-EVIDENT (SHA3-256 hash-chain), not tamper-proof.</p>';
233
+ }
234
+ if(dl.locked_formula_ids){
235
+ html += '<p>Doctrine lock: <code>'+(dl.declarations||749)+'/'+(dl.axioms||14)+'/'+(dl.sorries||163)+'</code> @ kernel <code>'+(dl.commit||'c7c0ba17')+'</code> · locked = '+(dl.locked_formula_count||8)+' {'+(dl.locked_formula_ids||[]).join(',')+'} '+L('LIVE')+'</p>';
236
+ if(dl.commit) $('kernel').textContent = dl.commit;
237
  }
238
+ $('prov').innerHTML = html;
239
+ }
240
+
241
+ function renderOrbit(pool, energy){
242
+ var c = pool.counts || {};
243
+ $('orbitBadge').innerHTML = L('ROADMAP','VISION FRAME — NOT DEPLOYED');
244
+ $('orbReach').textContent = fmt(c.nodes_reachable) + '/' + fmt(c.nodes_total);
245
+ $('orbReachL').innerHTML = L('LIVE','PROVEN ON METAL');
246
+ $('orbJ').innerHTML = L('MEASURED','PER-NODE, REAL');
247
+ $('orbRm').innerHTML = L('ROADMAP','ANALOGY ONLY');
248
+ }
249
+
250
+ async function loadAll(){
251
+ $('stamp').textContent = 'fetching live fabric state…';
252
+ try {
253
+ var results = await Promise.allSettled([
254
+ getJSON('/api/a11oy/v1/compute-pool-hardened'),
255
+ getJSON('/api/a11oy/v1/energy/operator/status'),
256
+ getJSON('/api/a11oy/v1/honest'),
257
+ getJSON('/api/a11oy/provenance')
258
+ ]);
259
+ var pool = results[0].status==='fulfilled' ? results[0].value : {counts:{},nodes:[]};
260
+ var energy = results[1].status==='fulfilled' ? results[1].value : {by_node:{}};
261
+ var honest = results[2].status==='fulfilled' ? results[2].value : {};
262
+ var prov = results[3].status==='fulfilled' ? results[3].value : {};
263
+
264
+ renderKpis(pool, energy);
265
+ buildHolo(pool);
266
+ renderNodes(pool, energy);
267
+ renderEnergy(energy);
268
+ renderProv(prov, honest);
269
+ renderOrbit(pool, energy);
270
+
271
+ var errs = results.filter(function(r){return r.status==='rejected';});
272
+ var ts = pool.cached_at || new Date().toISOString();
273
+ $('stamp').innerHTML = 'live as of <code>'+ts+'</code> · '+L('LIVE','4 ENDPOINTS WIRED') +
274
+ (errs.length ? ' <span class="err">· '+errs.length+' source(s) unavailable (shown honestly empty)</span>' : '');
275
+ } catch(e){
276
+ $('stamp').innerHTML = '<span class="err">fabric load error: '+e+'</span>';
277
+ }
278
+ }
279
+ loadAll();
280
  </script>
281
+ </body></html>