betterwithage commited on
Commit
3c8387c
·
verified ·
1 Parent(s): 986457a

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, web/agent-loop.html, web/agentic-gpu.html, web/autoreview.html, web/console.html, web/console_index.html, web/constitution.html, web/defense-readiness.html, web/dns.html, web/elite_console.html, web/energy-holographic.html, web/energy.html, web/estate-hologram.html, web/fleet-c2.html, web/formulas.html, web/governance.html, web/holo.html, web/hologram.html, web/immune.html, web/index.html, web/living-anatomy.html, web/materials.html, web/nemo.html, web/operator.html, web/quant.html, web/restraint-bench.html, web/restraint.html, web/sda.html, web/signature-is-not-proof.html, web/v4_fleet_panel.html
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 (4) hide show
  1. web/console.html +3 -3
  2. web/dns.html +105 -0
  3. web/hologram.html +486 -0
  4. web/sda.html +3 -3
web/console.html CHANGED
@@ -1,7 +1,7 @@
1
  <!DOCTYPE html>
2
  <!-- SPDX-License-Identifier: Apache-2.0 © 2026 SZL Holdings · Doctrine v11 LOCKED 749/14/163 @ c7c0ba17 · Λ = Conjecture 1 (NOT a theorem)
3
  Premium operator console — Greene polish. HONESTY OVER CHECKLIST: every tile binds to a REAL same-origin
4
- /api/rosie/v1/... endpoint verified live on the rosie Space. No synthetic data. Skeletons (not spinners).
5
  Sign: Yachay · Co-Authored-By: Perplexity Computer Agent -->
6
  <html lang="en" data-theme="dark">
7
  <head>
@@ -163,7 +163,7 @@ footer b{color:var(--gold)}
163
  <!-- doctrine plaque -->
164
  <div class="plaque">
165
  <b>v11 LOCKED</b> <span class="sep">·</span> 749/14/163 <span class="sep">·</span> <b>c7c0ba17</b><br>
166
- Λ = <b>Conjecture 1</b> <span class="sep">·</span> SLSA L1 honest + L2 attested
167
  </div>
168
 
169
  <button class="theme-toggle" id="themeToggle" aria-label="Toggle light/dark theme">◑</button>
@@ -231,7 +231,7 @@ footer b{color:var(--gold)}
231
  <footer>
232
  a11oy Substrate Console · every tile bound to a <b>real</b> same-origin <code>/api/a11oy/v1/…</code> endpoint ·
233
  skeletons over spinners · W3C traceparent on every panel.<br>
234
- <b>Doctrine v11 LOCKED · 749/14/163 · c7c0ba17 · Λ = Conjecture 1 (NOT a theorem) · SLSA L1 honest + L2 attested · HONESTY OVER CHECKLIST</b><br>
235
  Sign: Yachay &lt;yachay@szlholdings.ai&gt; · Co-Authored-By: Perplexity Computer Agent &lt;agent@perplexity.ai&gt;
236
  </footer>
237
 
 
1
  <!DOCTYPE html>
2
  <!-- SPDX-License-Identifier: Apache-2.0 © 2026 SZL Holdings · Doctrine v11 LOCKED 749/14/163 @ c7c0ba17 · Λ = Conjecture 1 (NOT a theorem)
3
  Premium operator console — Greene polish. HONESTY OVER CHECKLIST: every tile binds to a REAL same-origin
4
+ /api/a11oy/v1/companion/... endpoint (honest operator surface) verified live. No synthetic data. Skeletons (not spinners).
5
  Sign: Yachay · Co-Authored-By: Perplexity Computer Agent -->
6
  <html lang="en" data-theme="dark">
7
  <head>
 
163
  <!-- doctrine plaque -->
164
  <div class="plaque">
165
  <b>v11 LOCKED</b> <span class="sep">·</span> 749/14/163 <span class="sep">·</span> <b>c7c0ba17</b><br>
166
+ Λ = <b>Conjecture 1</b> <span class="sep">·</span> SLSA L1 honest (L2 roadmap, not yet claimed)
167
  </div>
168
 
169
  <button class="theme-toggle" id="themeToggle" aria-label="Toggle light/dark theme">◑</button>
 
231
  <footer>
232
  a11oy Substrate Console · every tile bound to a <b>real</b> same-origin <code>/api/a11oy/v1/…</code> endpoint ·
233
  skeletons over spinners · W3C traceparent on every panel.<br>
234
+ <b>Doctrine v11 LOCKED · 749/14/163 · c7c0ba17 · Λ = Conjecture 1 (NOT a theorem) · SLSA L1 honest (L2 roadmap, not yet claimed) · HONESTY OVER CHECKLIST</b><br>
235
  Sign: Yachay &lt;yachay@szlholdings.ai&gt; · Co-Authored-By: Perplexity Computer Agent &lt;agent@perplexity.ai&gt;
236
  </footer>
237
 
web/dns.html ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8">
2
+ <meta name="viewport" content="width=device-width,initial-scale=1">
3
+ <title>DNS &amp; Subdomains — Pending Records · a11oy</title>
4
+ <!-- SPDX-License-Identifier: Apache-2.0 · © 2026 SZL Holdings · Doctrine v11 · 0 runtime CDN.
5
+ Honest, user-visible name: DNS & Subdomains. NEVER a codename. This is a STATIC
6
+ internal infrastructure roadmap — a tracked list of DNS records to add. It does
7
+ NOT query live DNS and shows NO live metrics; statuses are hand-maintained and
8
+ dated. Verify any record live with `dig <name>` before relying on it. -->
9
+ <style>
10
+ :root{--bg:#070b16;--panel:#101a2e;--panel2:#16223a;--ink:#e8eef7;--mut:#8aa0bd;--gold:#d8a23c;--acc:#5ad1c0;
11
+ --line:#243149;--grn:#3fb950;--amb:#e0c060;--red:#ff6b6b;}
12
+ *{box-sizing:border-box}body{margin:0;background:radial-gradient(1200px 700px at 70% -10%,#14213b,var(--bg));
13
+ color:var(--ink);font:15px/1.55 -apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}
14
+ .wrap{max-width:1100px;margin:0 auto;padding:0 20px 80px}
15
+ #banner{position:sticky;top:0;z-index:9;background:linear-gradient(90deg,rgba(216,162,60,.20),rgba(200,100,60,.16));
16
+ border-bottom:1px solid rgba(232,192,116,.5);color:var(--amb);font:600 .80rem/1.4 ui-monospace,monospace;
17
+ letter-spacing:.05em;text-transform:uppercase;padding:.6rem 1rem;display:flex;gap:.6rem;align-items:center}
18
+ #banner .dot{width:.6rem;height:.6rem;border-radius:50%;background:var(--amb);box-shadow:0 0 8px var(--amb)}
19
+ h1{font-size:25px;margin:22px 0 2px}h2{font-size:17px;margin:28px 0 10px;border-bottom:1px solid var(--line);padding-bottom:6px}
20
+ .sub{color:var(--mut);margin:0 0 14px;max-width:760px}a{color:var(--acc);text-decoration:none}a:hover{text-decoration:underline}
21
+ .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin:10px 0}
22
+ table{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:8px 8px;border-bottom:1px solid var(--line);vertical-align:top}
23
+ th{color:var(--mut);font-weight:600}code{background:#0a1626;padding:1px 5px;border-radius:5px;color:var(--acc);font-size:12px}
24
+ .b{display:inline-block;padding:1px 8px;border-radius:999px;font-size:11px;font-weight:700;white-space:nowrap}
25
+ .green{background:#0f3a2e;color:#5ad1c0}.amber{background:#3a2f0f;color:#e0c060}.red{background:#3a0f14;color:#ff8a8a}.grey{background:#1b2740;color:#8aa0bd}
26
+ .pill{font-size:11px;padding:1px 7px;border-radius:999px;border:1px solid var(--line);color:var(--mut)}
27
+ ol{margin:6px 0 6px 18px;padding:0}ol li{margin:4px 0}
28
+ .foot{margin-top:34px;color:var(--mut);font-size:12px;border-top:1px solid var(--line);padding-top:14px}
29
+ .note{color:var(--mut);font-size:12px}
30
+ .legend{display:flex;gap:14px;flex-wrap:wrap;margin:8px 0 2px;font-size:12px;color:var(--mut)}
31
+ </style></head><body>
32
+ <div id="banner"><span class="dot"></span><span>Internal infrastructure roadmap — DNS records to add · static page, no live DNS query · statuses hand-maintained &amp; dated</span></div>
33
+ <div class="wrap">
34
+ <nav class="note" style="padding-top:12px"><a href="/">home</a> · <a href="/console">/console</a> · <a href="/immune">/immune</a></nav>
35
+ <h1>DNS &amp; Subdomains <span class="pill">pending records</span></h1>
36
+ <p class="sub">A running list of the DNS records we want to add. Nothing here is blocking a live service — it is a triage list to work through. <b>immune</b> already has a public home on Hugging Face (<a href="https://szlholdings-immune.hf.space" target="_blank" rel="noopener">szlholdings-immune.hf.space</a>), so the subdomain is a nice-to-have that is <b>on hold</b> until the trip is over.</p>
37
+
38
+ <div class="legend">
39
+ <span><span class="b amber">PENDING</span> staged / ready, record not yet added</span>
40
+ <span><span class="b red">BLOCKED</span> needs founder / registrar action</span>
41
+ <span><span class="b grey">CANDIDATE</span> unconfirmed — confirm when back</span>
42
+ <span><span class="b green">DONE</span> record live</span>
43
+ </div>
44
+
45
+ <h2>1 · Pending records (confirmed)</h2>
46
+ <div class="card">
47
+ <table>
48
+ <tr><th>Host / record</th><th>Type</th><th>Target</th><th>TTL</th><th>Status</th><th>Notes / action</th></tr>
49
+ <tr>
50
+ <td><code>immune.a11oy.net</code></td>
51
+ <td>A</td>
52
+ <td><code>167.233.50.75</code></td>
53
+ <td>300</td>
54
+ <td><span class="b amber">PENDING</span> <span class="b red">BLOCKED</span></td>
55
+ <td>Box side is staged: nginx vhost added (<code>nginx -t</code> OK), container listening, TLS to be issued by certbot <i>after</i> the A-record resolves. Add the A-record at the registrar for <code>a11oy.net</code>. Registrar API is disabled at the account level (Namecheap error 1011102), so it must be added <b>by hand in the registrar dashboard</b> — see step list below. No outage in the meantime: immune is served on Hugging Face.</td>
56
+ </tr>
57
+ </table>
58
+ </div>
59
+
60
+ <h2>2 · Backlog (confirm when back)</h2>
61
+ <div class="card">
62
+ <p class="note" style="margin-top:0">Known infrastructure gaps that <i>may</i> want DNS. Listed as candidates only — confirm whether we actually want each before adding.</p>
63
+ <table>
64
+ <tr><th>Host / record</th><th>Type</th><th>Target</th><th>Status</th><th>Notes</th></tr>
65
+ <tr>
66
+ <td><code>killinchu.net</code></td>
67
+ <td>registration + DNS</td>
68
+ <td>—</td>
69
+ <td><span class="b grey">CANDIDATE</span> <span class="b red">BLOCKED</span></td>
70
+ <td>Domain registration / DNS is founder-gated (registrar account). Decide whether to register and where to point it.</td>
71
+ </tr>
72
+ <tr>
73
+ <td><code>companion.alloyszlholdings.com</code></td>
74
+ <td>A</td>
75
+ <td><code>5.161.81.107</code></td>
76
+ <td><span class="b grey">CANDIDATE</span></td>
77
+ <td>Companion chatbox runs on the secondary box (<code>5.161.81.107</code>, a different host than a11oy) but has no public A-record yet. Add only if we want the chatbox on a public subdomain.</td>
78
+ </tr>
79
+ <tr>
80
+ <td><code>manifesto.alloyszlholdings.com</code></td>
81
+ <td>A</td>
82
+ <td><code>5.161.81.107</code></td>
83
+ <td><span class="b grey">CANDIDATE</span></td>
84
+ <td>Manifesto chatbox, same box as above. Same decision as the companion chatbox.</td>
85
+ </tr>
86
+ </table>
87
+ </div>
88
+
89
+ <h2>3 · How to add a record</h2>
90
+ <div class="card">
91
+ <ol>
92
+ <li>Sign in to the registrar that holds the domain (a11oy.net is on Namecheap).</li>
93
+ <li>Open <b>Domain List → Manage → Advanced DNS</b>.</li>
94
+ <li>Add a new record: <b>Type</b> = A, <b>Host</b> = the left-most label (e.g. <code>immune</code>), <b>Value</b> = the target IP, <b>TTL</b> = Automatic (or 300).</li>
95
+ <li>Save. Allow a few minutes to propagate, then verify with <code>dig immune.a11oy.net +short</code> (should return the target IP).</li>
96
+ <li>Once it resolves, issue TLS on the box: <code>certbot --nginx -d immune.a11oy.net</code>.</li>
97
+ </ol>
98
+ <p class="note">The registrar API is disabled on this account (Namecheap returns error 1011102, "API Key is invalid or API access has not been enabled"), so these records can't be added programmatically right now — they must be added by hand in the dashboard, or API access re-enabled in the registrar account settings.</p>
99
+ </div>
100
+
101
+ <div class="foot">
102
+ Static infrastructure roadmap · no live data · Doctrine v11 · last updated 2026-06-16.
103
+ Verify any record live with <code>dig &lt;name&gt; +short</code> before relying on it.
104
+ </div>
105
+ </div></body></html>
web/hologram.html ADDED
@@ -0,0 +1,486 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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, viewport-fit=cover"/>
6
+ <title>SZL Holographic Command Bridge — living agentic-GPU organism</title>
7
+ <meta name="description" content="A 3D holographic command bridge for the SZL agentic-GPU organism: the RTX 5000 @ betterwithage as the MIND core, six proven round9 organs (BRAIN/HEART/BLOOD/IMMUNE/SKELETON/NERVOUS) orbiting and pulsing when active, energy-flow particles streaming from energy sources to the core (colored by source), and the consent-only swarm as a constellation. Reads the REAL endpoints (/code/healthz, /v1/energy/budget, organ probes). HONEST: sovereign glow only when /code/healthz says sovereign:true; energy figures are SAMPLE/ESTIMATE; Λ trust = Conjecture 1; unreachable organs render dim/unknown — no fabricated data. Three.js r128 vendored locally (NO CDN)."/>
8
+ <style>
9
+ :root{
10
+ --bg0:#03060c; --bg1:#06101e; --ink:#dbe7ff; --dim:#7e93b8; --line:#16243c;
11
+ --green:#34f5b0; --amber:#ffcb57; --red:#ff5d73; --grey:#5d6e8c;
12
+ --teal:#39d7ff; --violet:#b98cff; --gold:#ffd66e;
13
+ --solar:#ffd24a; --wind:#5ad6ff; --hydro:#36b6ff; --flare:#ff7a3c; --grid:#9aa6bd;
14
+ --mono:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
15
+ --sans:Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
16
+ }
17
+ *{box-sizing:border-box}
18
+ html,body{margin:0;height:100%;background:var(--bg0);color:var(--ink);font-family:var(--sans);overflow:hidden}
19
+ #stage{position:fixed;inset:0;display:block}
20
+ /* HUD overlay */
21
+ .hud{position:fixed;pointer-events:none;font-family:var(--mono);text-shadow:0 1px 8px #000a}
22
+ .hud b{font-weight:600}
23
+ #title{top:18px;left:22px;max-width:46vw;pointer-events:auto}
24
+ #title h1{margin:0;font-size:16px;letter-spacing:.14em;color:var(--ink);font-weight:600}
25
+ #title .sub{margin-top:4px;font-size:11px;color:var(--dim);letter-spacing:.04em;line-height:1.5}
26
+ .badge{display:inline-block;margin-top:8px;padding:3px 8px;border:1px solid var(--line);border-radius:999px;
27
+ font-size:10px;letter-spacing:.08em;color:var(--dim);background:#0a1422aa}
28
+ /* mind posture card */
29
+ #mind{top:18px;right:22px;width:300px;border:1px solid var(--line);border-radius:14px;
30
+ background:linear-gradient(180deg,#0a1626dd,#060d18ee);padding:14px 16px;pointer-events:auto;backdrop-filter:blur(4px)}
31
+ #mind .row{display:flex;justify-content:space-between;gap:10px;font-size:12px;padding:3px 0;border-bottom:1px dashed #13203660}
32
+ #mind .row:last-child{border-bottom:0}
33
+ #mind .k{color:var(--dim)}
34
+ #mind .v{color:var(--ink);text-align:right}
35
+ .pill{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.04em}
36
+ .pill.green{background:#0c3a2c;color:var(--green);box-shadow:0 0 14px #34f5b055}
37
+ .pill.amber{background:#3a2e0c;color:var(--amber)}
38
+ .pill.red{background:#3a1018;color:var(--red)}
39
+ .pill.grey{background:#1a2333;color:var(--grey)}
40
+ #mind h2{margin:0 0 8px;font-size:11px;letter-spacing:.16em;color:var(--dim);font-weight:600}
41
+ /* organ legend / energy legend */
42
+ #legend{bottom:18px;left:22px;border:1px solid var(--line);border-radius:12px;background:#070f1ccc;
43
+ padding:11px 13px;pointer-events:auto;font-size:11px;max-width:340px;backdrop-filter:blur(3px)}
44
+ #legend h3{margin:0 0 6px;font-size:10px;letter-spacing:.14em;color:var(--dim);font-weight:600}
45
+ .lg-row{display:flex;align-items:center;gap:7px;padding:2px 0;color:var(--dim)}
46
+ .dot{width:9px;height:9px;border-radius:50%;flex:none;box-shadow:0 0 8px currentColor}
47
+ .organs-list{display:grid;grid-template-columns:1fr 1fr;gap:2px 14px;margin-top:6px}
48
+ /* energy/flow card */
49
+ #flow{bottom:18px;right:22px;width:300px;border:1px solid var(--line);border-radius:14px;
50
+ background:linear-gradient(180deg,#0a1626dd,#060d18ee);padding:13px 16px;pointer-events:auto;backdrop-filter:blur(4px)}
51
+ #flow h2{margin:0 0 8px;font-size:11px;letter-spacing:.16em;color:var(--dim);font-weight:600}
52
+ #flow .row{display:flex;justify-content:space-between;font-size:12px;padding:3px 0;border-bottom:1px dashed #13203660}
53
+ #flow .row:last-child{border-bottom:0}
54
+ #flow .k{color:var(--dim)} #flow .v{color:var(--ink)}
55
+ .sample{display:inline-block;margin-left:6px;padding:1px 6px;border:1px solid #4a3a12;border-radius:6px;
56
+ font-size:9px;letter-spacing:.06em;color:var(--amber);background:#241c08}
57
+ /* organ tooltip */
58
+ #tip{position:fixed;pointer-events:none;font-family:var(--mono);font-size:11px;color:var(--ink);
59
+ background:#0a1626ee;border:1px solid var(--line);border-radius:10px;padding:8px 11px;max-width:280px;
60
+ opacity:0;transition:opacity .12s;z-index:9;box-shadow:0 8px 30px #000a}
61
+ #tip .t{font-weight:600;letter-spacing:.06em} #tip .d{color:var(--dim);margin-top:3px;line-height:1.45}
62
+ #tip .st{margin-top:5px}
63
+ /* footer doctrine line */
64
+ #foot{bottom:0;left:0;right:0;text-align:center;font-size:10px;color:var(--grey);
65
+ padding:7px 12px;letter-spacing:.05em;background:linear-gradient(0deg,#03060ce0,#03060c00)}
66
+ #foot code{color:var(--dim)}
67
+ a{color:var(--teal);text-decoration:none}
68
+ /* no-webgl fallback */
69
+ #nogl{position:fixed;inset:0;display:none;place-items:center;text-align:center;padding:40px;
70
+ font-family:var(--mono);color:var(--dim)}
71
+ #nogl.show{display:grid}
72
+ @media(max-width:760px){
73
+ #title{max-width:90vw} #mind,#flow{width:min(92vw,300px)}
74
+ #legend{display:none}
75
+ }
76
+ </style>
77
+ </head>
78
+ <body>
79
+ <canvas id="stage"></canvas>
80
+
81
+ <div id="nogl">
82
+ <div>
83
+ <div style="font-size:15px;color:var(--ink);letter-spacing:.1em">WebGL unavailable</div>
84
+ <p>This holographic bridge needs WebGL. The live data it renders is still honest and reachable
85
+ as JSON at <code>/api/a11oy/code/healthz</code> and <code>/api/a11oy/v1/energy/budget</code>,
86
+ and as a 2D surface at <a href="/energy">/energy</a>.</p>
87
+ </div>
88
+ </div>
89
+
90
+ <div class="hud" id="title">
91
+ <h1>HOLOGRAPHIC COMMAND BRIDGE</h1>
92
+ <div class="sub">
93
+ The living <b>agentic-GPU organism</b> — RTX&nbsp;5000 @ betterwithage as the <b>MIND</b>,
94
+ six proven round9 <b>organs</b> as the body, energy flow as its <b>circulation</b>.<br/>
95
+ Reads the real endpoints; renders nothing it cannot confirm.
96
+ </div>
97
+ <span class="badge" id="conn">● connecting…</span>
98
+ </div>
99
+
100
+ <div class="hud" id="mind">
101
+ <h2>MIND CORE — /code/healthz</h2>
102
+ <div class="row"><span class="k">Posture</span><span class="v"><span class="pill grey" id="m_posture">unknown</span></span></div>
103
+ <div class="row"><span class="k">Sovereign</span><span class="v" id="m_sov">—</span></div>
104
+ <div class="row"><span class="k">Inference</span><span class="v" id="m_inf">—</span></div>
105
+ <div class="row"><span class="k">Λ trust</span><span class="v" id="m_lambda">Conjecture&nbsp;1</span></div>
106
+ </div>
107
+
108
+ <div class="hud" id="flow">
109
+ <h2>CIRCULATION — /v1/energy/budget</h2>
110
+ <div class="row"><span class="k">Dominant source</span><span class="v" id="f_src">—</span></div>
111
+ <div class="row"><span class="k">Σ joules<span class="sample">SAMPLE</span></span><span class="v" id="f_j">—</span></div>
112
+ <div class="row"><span class="k">Receipts</span><span class="v" id="f_n">—</span></div>
113
+ <div class="row"><span class="k">Bekenstein</span><span class="v" id="f_bek">—</span></div>
114
+ </div>
115
+
116
+ <div class="hud" id="legend">
117
+ <h3>ENERGY SOURCES (flow color)</h3>
118
+ <div class="lg-row"><span class="dot" style="color:var(--solar)"></span>solar
119
+ <span class="dot" style="color:var(--wind);margin-left:10px"></span>wind
120
+ <span class="dot" style="color:var(--hydro);margin-left:10px"></span>hydro
121
+ <span class="dot" style="color:var(--flare);margin-left:10px"></span>flare
122
+ <span class="dot" style="color:var(--grid);margin-left:10px"></span>grid</div>
123
+ <h3 style="margin-top:9px">ORGAN STATE</h3>
124
+ <div class="lg-row"><span class="dot" style="color:var(--green)"></span>active&nbsp;(pulses)
125
+ <span class="dot" style="color:var(--amber);margin-left:10px"></span>degraded
126
+ <span class="dot" style="color:var(--grey);margin-left:10px"></span>unknown&nbsp;(unreachable — honest dim)</div>
127
+ </div>
128
+
129
+ <div id="tip"></div>
130
+
131
+ <div class="hud" id="foot">
132
+ Three.js r128 vendored locally — <b>0 runtime CDN</b>. Energy figures are <b>SAMPLE/ESTIMATE</b>
133
+ (no power meter wired). Sovereign glow only when <code>/code/healthz</code> reports
134
+ <code>sovereign:true</code>. Λ trust = <b>Conjecture 1</b> (advisory, never a theorem).
135
+ Unreachable organs render dim — <b>no fabricated data</b>. Consent-only swarm.
136
+ </div>
137
+
138
+ <!-- THREE r128 (MIT), vendored locally at /vendor/three.min.js — NO CDN (matches fleet-c2.html). -->
139
+ <script src="/vendor/three.min.js"></script>
140
+ <script>
141
+ "use strict";
142
+ (function(){
143
+ // ---- honest fetch: never throws, returns null on any failure ----
144
+ var API = "/api/a11oy";
145
+ function getJSON(u){
146
+ return fetch(u, {cache:"no-store"})
147
+ .then(function(r){ return r.ok ? r.json() : null; })
148
+ .catch(function(){ return null; });
149
+ }
150
+ function esc(s){ return String(s==null?"":s).replace(/[<>&]/g,function(c){return {"<":"&lt;",">":"&gt;","&":"&amp;"}[c];}); }
151
+ function fmt(n,d){ var x=Number(n); return isFinite(x)? x.toFixed(d==null?2:d) : "—"; }
152
+ function $(id){ return document.getElementById(id); }
153
+
154
+ // ---- organ catalogue: each is a PROVEN round9 formula doing a real job ----
155
+ // status starts "unknown" (dim) and only goes active/degraded on confirmed signal.
156
+ var ORGANS = [
157
+ {id:"BRAIN", col:0xb98cff, role:"belief-update admission (PAC-Bayes McAllester) — how the mind reasons under uncertainty",
158
+ probe:API+"/v1/formulas", note:"amaru /v1/formulas (pac_bayes)"},
159
+ {id:"HEART", col:0xff5d73, role:"σ-algebra receipt bus — every GPU action leaves a measurable beat",
160
+ probe:API+"/v1/receipts/summary",note:"amaru /receipts · khipu ledger"},
161
+ {id:"BLOOD", col:0xff7a3c, role:"Cardano-anchored DSSE — carries signed provenance to every organ",
162
+ probe:API+"/v1/khipu/health", note:"sentra /khipu/sign"},
163
+ {id:"IMMUNE", col:0x34f5b0, role:"Neyman-Pearson deny-by-default gates — rejects unsafe/overclaim work",
164
+ probe:API+"/v1/gates", note:"sentra /v1/gates (8 gates)"},
165
+ {id:"SKELETON",col:0x39d7ff, role:"the Lean proof spine (Λ = Conjecture 1) — holds the body honest",
166
+ probe:API+"/math/lean/theorems", note:"amaru /math/lean/theorems"},
167
+ {id:"NERVOUS", col:0xffd66e, role:"Shannon-alarm drift sense — proprioception + self-monitor",
168
+ probe:API+"/overwatch/snapshot", note:"amaru /overwatch/snapshot"}
169
+ ];
170
+
171
+ // energy-source -> color (matches the CSS legend)
172
+ var SRC_COLOR = {
173
+ solar:0xffd24a, wind:0x5ad6ff, hydro:0x36b6ff, flare:0xff7a3c, grid:0x9aa6bd
174
+ };
175
+ function srcColor(s){
176
+ s = String(s||"").toLowerCase();
177
+ for(var k in SRC_COLOR){ if(s.indexOf(k)>=0) return SRC_COLOR[k]; }
178
+ return 0x9aa6bd; // unknown source -> grid grey (honest neutral)
179
+ }
180
+
181
+ // ---------- WebGL guard ----------
182
+ if(!window.THREE || !(function(){try{var c=document.createElement("canvas");
183
+ return !!(window.WebGLRenderingContext && (c.getContext("webgl")||c.getContext("experimental-webgl")));
184
+ }catch(e){return false;}})()){
185
+ $("nogl").classList.add("show");
186
+ $("conn").textContent = "● WebGL unavailable — JSON endpoints still honest";
187
+ // still drive the HUD cards from live JSON so the data is not lost.
188
+ pollData();
189
+ setInterval(pollData, 15000);
190
+ return;
191
+ }
192
+
193
+ // ---------- scene ----------
194
+ var THREE = window.THREE;
195
+ var canvas = $("stage");
196
+ var renderer = new THREE.WebGLRenderer({canvas:canvas, antialias:true, alpha:true});
197
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio||1, 2));
198
+ var scene = new THREE.Scene();
199
+ scene.fog = new THREE.FogExp2(0x03060c, 0.018);
200
+
201
+ var camera = new THREE.PerspectiveCamera(52, 1, 0.1, 400);
202
+ camera.position.set(0, 9, 34);
203
+
204
+ scene.add(new THREE.AmbientLight(0x223355, 0.7));
205
+ var key = new THREE.PointLight(0x66aaff, 1.1, 200); key.position.set(0,18,18); scene.add(key);
206
+
207
+ // starfield backdrop
208
+ (function(){
209
+ var g = new THREE.BufferGeometry(), N=1400, p=new Float32Array(N*3);
210
+ for(var i=0;i<N;i++){ var r=120+Math.random()*120;
211
+ var th=Math.random()*Math.PI*2, ph=Math.acos(2*Math.random()-1);
212
+ p[i*3]=r*Math.sin(ph)*Math.cos(th); p[i*3+1]=r*Math.cos(ph)*0.5; p[i*3+2]=r*Math.sin(ph)*Math.sin(th); }
213
+ g.setAttribute("position", new THREE.BufferAttribute(p,3));
214
+ scene.add(new THREE.Points(g, new THREE.PointsMaterial({color:0x2b3b5a,size:0.6,sizeAttenuation:true})));
215
+ })();
216
+
217
+ // ============ MIND CORE (RTX 5000) ============
218
+ var core = new THREE.Group(); scene.add(core);
219
+ var coreGeo = new THREE.IcosahedronGeometry(3.2, 2);
220
+ var coreMat = new THREE.MeshStandardMaterial({
221
+ color:0x0e2a44, emissive:0x0a3a55, emissiveIntensity:0.6,
222
+ metalness:0.6, roughness:0.25, transparent:true, opacity:0.92, flatShading:true
223
+ });
224
+ var coreMesh = new THREE.Mesh(coreGeo, coreMat); core.add(coreMesh);
225
+ // wireframe shell — its color = sovereign posture (grey until confirmed)
226
+ var shellMat = new THREE.MeshBasicMaterial({color:0x5d6e8c, wireframe:true, transparent:true, opacity:0.35});
227
+ var shell = new THREE.Mesh(new THREE.IcosahedronGeometry(3.9,1), shellMat); core.add(shell);
228
+ // sovereign glow halo (hidden until sovereign:true is confirmed)
229
+ var haloMat = new THREE.SpriteMaterial({color:0x34f5b0, transparent:true, opacity:0.0, depthWrite:false, blending:THREE.AdditiveBlending});
230
+ var halo = new THREE.Sprite(haloMat); halo.scale.set(22,22,1); core.add(halo);
231
+ // (procedural radial sprite so we ship NO image asset)
232
+ (function(){
233
+ var s=128, cv=document.createElement("canvas"); cv.width=cv.height=s;
234
+ var x=cv.getContext("2d"), gr=x.createRadialGradient(s/2,s/2,0,s/2,s/2,s/2);
235
+ gr.addColorStop(0,"rgba(255,255,255,0.9)"); gr.addColorStop(0.4,"rgba(255,255,255,0.25)"); gr.addColorStop(1,"rgba(255,255,255,0)");
236
+ x.fillStyle=gr; x.fillRect(0,0,s,s);
237
+ haloMat.map = new THREE.CanvasTexture(cv); haloMat.needsUpdate=true;
238
+ })();
239
+
240
+ // ============ ORGAN NODES (6, orbiting) ============
241
+ var organMeshes = [];
242
+ var ORBIT = 11.5;
243
+ ORGANS.forEach(function(o, i){
244
+ var grp = new THREE.Group();
245
+ var ang = (i/ORGANS.length)*Math.PI*2;
246
+ var node = new THREE.Mesh(
247
+ new THREE.OctahedronGeometry(1.15, 0),
248
+ new THREE.MeshStandardMaterial({color:o.col, emissive:o.col, emissiveIntensity:0.25,
249
+ metalness:0.4, roughness:0.4, transparent:true, opacity:0.45}) // dim until confirmed active
250
+ );
251
+ var ring = new THREE.Mesh(
252
+ new THREE.TorusGeometry(1.7, 0.06, 8, 40),
253
+ new THREE.MeshBasicMaterial({color:o.col, transparent:true, opacity:0.25})
254
+ );
255
+ ring.rotation.x = Math.PI/2;
256
+ grp.add(node); grp.add(ring);
257
+ grp.userData = {organ:o, baseAngle:ang, node:node, ring:ring, status:"unknown", pulse:0};
258
+ scene.add(grp);
259
+ organMeshes.push(grp);
260
+ });
261
+
262
+ // ============ ENERGY-FLOW PARTICLES (sources -> core) ============
263
+ // Each "source" emits particles that stream inward; color = energy source.
264
+ // Number of active streams + their color is DERIVED from live receipts, never invented.
265
+ var MAXP = 900;
266
+ var flowGeo = new THREE.BufferGeometry();
267
+ var fpos = new Float32Array(MAXP*3), fcol = new Float32Array(MAXP*3);
268
+ var fdat = []; // per-particle {ang,rad,spd,active}
269
+ for(var i=0;i<MAXP;i++){
270
+ fdat.push({ang:Math.random()*Math.PI*2, rad:0, spd:0, active:false, col:[0.36,0.42,0.55]});
271
+ fpos[i*3]=0; fpos[i*3+1]=0; fpos[i*3+2]=0;
272
+ fcol[i*3]=0.36; fcol[i*3+1]=0.42; fcol[i*3+2]=0.55;
273
+ }
274
+ flowGeo.setAttribute("position", new THREE.BufferAttribute(fpos,3));
275
+ flowGeo.setAttribute("color", new THREE.BufferAttribute(fcol,3));
276
+ var flowPts = new THREE.Points(flowGeo, new THREE.PointsMaterial({
277
+ size:0.5, vertexColors:true, transparent:true, opacity:0.85,
278
+ blending:THREE.AdditiveBlending, depthWrite:false, sizeAttenuation:true
279
+ }));
280
+ scene.add(flowPts);
281
+ var activeStreams = 0; // set from live data; 0 = honest "no confirmed flow"
282
+
283
+ function setFlow(streamCount, colorHex){
284
+ activeStreams = Math.max(0, Math.min(MAXP, streamCount|0));
285
+ var c = new THREE.Color(colorHex);
286
+ for(var i=0;i<MAXP;i++){
287
+ var on = i < activeStreams;
288
+ fdat[i].active = on;
289
+ if(on){
290
+ fdat[i].rad = 26 + Math.random()*40;
291
+ fdat[i].ang = Math.random()*Math.PI*2;
292
+ fdat[i].spd = 0.10 + Math.random()*0.14;
293
+ fdat[i].col = [c.r, c.g, c.b];
294
+ }
295
+ }
296
+ }
297
+
298
+ // ============ SWARM CONSTELLATION ============
299
+ // Faint outer ring of points = consent-only swarm nodes (count from /v1/gates or default fabric).
300
+ var swarmGrp = new THREE.Group(); scene.add(swarmGrp);
301
+ function buildSwarm(n){
302
+ while(swarmGrp.children.length) swarmGrp.remove(swarmGrp.children[0]);
303
+ n = Math.max(1, Math.min(64, n|0));
304
+ for(var i=0;i<n;i++){
305
+ var a=(i/n)*Math.PI*2 + 0.3, r=20+ (i%3)*1.6;
306
+ var m=new THREE.Mesh(new THREE.SphereGeometry(0.22,8,8),
307
+ new THREE.MeshBasicMaterial({color:i===0?0x34f5b0:0x39557a}));
308
+ m.position.set(Math.cos(a)*r, (Math.sin(i*1.7)*2.2), Math.sin(a)*r);
309
+ swarmGrp.add(m);
310
+ }
311
+ }
312
+ buildSwarm(7); // default 7-node fabric; replaced by live count when available
313
+
314
+ // ---------- interaction: drag-rotate, wheel-zoom, hover organs ----------
315
+ var ray = new THREE.Raycaster(), mouse = new THREE.Vector2();
316
+ var rotY=0.0, rotX=0.0, dragging=false, lx=0, ly=0, autoRot=true, zoom=34;
317
+ canvas.addEventListener("pointerdown", function(e){ dragging=true; autoRot=false; lx=e.clientX; ly=e.clientY; });
318
+ window.addEventListener("pointerup", function(){ dragging=false; });
319
+ window.addEventListener("pointermove", function(e){
320
+ if(dragging){ rotY += (e.clientX-lx)*0.005; rotX += (e.clientY-ly)*0.004;
321
+ rotX=Math.max(-0.9,Math.min(0.9,rotX)); lx=e.clientX; ly=e.clientY; }
322
+ // hover tooltip
323
+ mouse.x=(e.clientX/window.innerWidth)*2-1; mouse.y=-(e.clientY/window.innerHeight)*2+1;
324
+ ray.setFromCamera(mouse, camera);
325
+ var hit = ray.intersectObjects(organMeshes.map(function(g){return g.userData.node;}));
326
+ var tip=$("tip");
327
+ if(hit.length){
328
+ var g = organMeshes.filter(function(gg){return gg.userData.node===hit[0].object;})[0];
329
+ var u=g.userData, st=u.status;
330
+ var stc = st==="active"?"var(--green)":(st==="degraded"?"var(--amber)":"var(--grey)");
331
+ tip.innerHTML = '<div class="t" style="color:#'+u.organ.col.toString(16).padStart(6,"0")+'">'+esc(u.organ.id)+'</div>'+
332
+ '<div class="d">'+esc(u.organ.role)+'</div>'+
333
+ '<div class="st"><span style="color:'+stc+'">●</span> '+esc(st)+' · <span style="color:var(--dim)">'+esc(u.organ.note)+'</span></div>';
334
+ tip.style.left=(e.clientX+14)+"px"; tip.style.top=(e.clientY+12)+"px"; tip.style.opacity=1;
335
+ } else tip.style.opacity=0;
336
+ });
337
+ canvas.addEventListener("wheel", function(e){ e.preventDefault(); zoom=Math.max(16,Math.min(70, zoom+e.deltaY*0.02)); }, {passive:false});
338
+
339
+ function resize(){
340
+ var w=window.innerWidth, h=window.innerHeight;
341
+ renderer.setSize(w,h,false); camera.aspect=w/h; camera.updateProjectionMatrix();
342
+ }
343
+ window.addEventListener("resize", resize); resize();
344
+
345
+ // ---------- animation ----------
346
+ var t0=performance.now();
347
+ function tick(now){
348
+ var t=(now-t0)/1000;
349
+ if(autoRot) rotY += 0.0016;
350
+ // camera framing from rot + zoom
351
+ camera.position.x = Math.sin(rotY)*zoom*Math.cos(rotX);
352
+ camera.position.z = Math.cos(rotY)*zoom*Math.cos(rotX);
353
+ camera.position.y = 9 + Math.sin(rotX)*zoom;
354
+ camera.lookAt(0,0,0);
355
+
356
+ core.rotation.y += 0.003; shell.rotation.y -= 0.0017; shell.rotation.x += 0.0009;
357
+ coreMat.emissiveIntensity = 0.55 + Math.sin(t*1.6)*0.12; // gentle breathing
358
+
359
+ // organs orbit + pulse when active
360
+ organMeshes.forEach(function(g){
361
+ var u=g.userData, a=u.baseAngle + t*0.12;
362
+ var R=ORBIT + Math.sin(t*0.4 + u.baseAngle)*0.6;
363
+ g.position.set(Math.cos(a)*R, Math.sin(a*1.3 + u.baseAngle)*2.4, Math.sin(a)*R);
364
+ g.lookAt(0,0,0);
365
+ var s=1;
366
+ if(u.status==="active"){ u.pulse += 0.06; s = 1 + Math.abs(Math.sin(u.pulse))*0.5;
367
+ u.node.material.emissiveIntensity = 0.5 + Math.abs(Math.sin(u.pulse))*0.8;
368
+ u.node.material.opacity = 0.95; u.ring.material.opacity = 0.55;
369
+ } else if(u.status==="degraded"){ s=1+Math.sin(t*4)*0.06;
370
+ u.node.material.emissiveIntensity=0.35; u.node.material.opacity=0.7; u.ring.material.opacity=0.3;
371
+ } else { // unknown -> dim, still, honest
372
+ u.node.material.emissiveIntensity=0.12; u.node.material.opacity=0.32; u.ring.material.opacity=0.14;
373
+ }
374
+ u.node.scale.setScalar(s);
375
+ });
376
+
377
+ // energy-flow particles stream inward toward the core; recycle at center
378
+ var pos=flowGeo.attributes.position.array, col=flowGeo.attributes.color.array;
379
+ for(var i=0;i<MAXP;i++){
380
+ var d=fdat[i];
381
+ if(!d.active){ pos[i*3]=0;pos[i*3+1]=-999;pos[i*3+2]=0; continue; }
382
+ d.rad -= d.spd; if(d.rad < 3.4){ d.rad = 26 + Math.random()*40; d.ang = Math.random()*Math.PI*2; }
383
+ var yy = Math.sin(d.ang*2 + d.rad*0.1)*2.2;
384
+ pos[i*3] = Math.cos(d.ang)*d.rad;
385
+ pos[i*3+1] = yy;
386
+ pos[i*3+2] = Math.sin(d.ang)*d.rad;
387
+ col[i*3]=d.col[0]; col[i*3+1]=d.col[1]; col[i*3+2]=d.col[2];
388
+ }
389
+ flowGeo.attributes.position.needsUpdate=true; flowGeo.attributes.color.needsUpdate=true;
390
+
391
+ swarmGrp.rotation.y += 0.0006;
392
+ renderer.render(scene,camera);
393
+ requestAnimationFrame(tick);
394
+ }
395
+ requestAnimationFrame(tick);
396
+
397
+ // ---------- LIVE DATA: bind the hologram to the real endpoints ----------
398
+ function applyPosture(hz){
399
+ var pEl=$("m_posture"), sEl=$("m_sov"), iEl=$("m_inf");
400
+ if(!hz){ // unreachable -> honest unknown, NO sovereign glow
401
+ pEl.className="pill grey"; pEl.textContent="unknown — unreachable";
402
+ sEl.textContent="—"; iEl.textContent="—";
403
+ shellMat.color.setHex(0x5d6e8c); haloMat.opacity=0.0;
404
+ $("conn").textContent="● /code/healthz unreachable — honest empty-state";
405
+ return;
406
+ }
407
+ var sov = hz.sovereign===true, inf=String(hz.inference||"");
408
+ sEl.textContent = sov ? "true" : "false";
409
+ iEl.textContent = inf || "—";
410
+ if(sov && inf==="self-hosted-gpu"){
411
+ pEl.className="pill green"; pEl.textContent="GREEN — sovereign GPU serving";
412
+ shellMat.color.setHex(0x34f5b0); // green shell
413
+ haloMat.color.setHex(0x34f5b0); haloMat.opacity=0.55; // sovereign glow ON
414
+ } else if(sov){
415
+ pEl.className="pill green"; pEl.textContent="GREEN — sovereign";
416
+ shellMat.color.setHex(0x34f5b0); haloMat.color.setHex(0x34f5b0); haloMat.opacity=0.4;
417
+ } else {
418
+ // reachable but NOT sovereign -> amber, NO sovereign glow (half-state refused)
419
+ pEl.className="pill amber"; pEl.textContent="MAINTENANCE — router fallback";
420
+ shellMat.color.setHex(0xffcb57); haloMat.opacity=0.0;
421
+ }
422
+ $("conn").textContent="● live";
423
+ }
424
+
425
+ function applyBudget(b){
426
+ var srcEl=$("f_src"), jEl=$("f_j"), nEl=$("f_n"), bekEl=$("f_bek");
427
+ if(!b){
428
+ srcEl.textContent="—"; jEl.textContent="—"; nEl.textContent="0 (no confirmed flow)";
429
+ bekEl.textContent="—"; setFlow(0,0x9aa6bd); // honest: no data => no streams
430
+ return;
431
+ }
432
+ var rows = b.receipts || b.ledger || b.tasks || [];
433
+ if(!Array.isArray(rows)) rows=[];
434
+ var n = (b.count!=null)? b.count : rows.length;
435
+ // dominant energy source by joules (SAMPLE) — honest if none present
436
+ var bySrc={}, totJ=0;
437
+ rows.forEach(function(r){
438
+ var s=String(r.energy_source||r.source||"").toLowerCase()||"unknown";
439
+ var j=Number(r.joules_est||r.joules||0)||0;
440
+ bySrc[s]=(bySrc[s]||0)+j; totJ+=j;
441
+ });
442
+ if(b.total_joules_est!=null) totJ=Number(b.total_joules_est)||totJ;
443
+ var dom="unknown", domJ=-1;
444
+ for(var s in bySrc){ if(bySrc[s]>domJ){domJ=bySrc[s];dom=s;} }
445
+ srcEl.innerHTML = (dom==="unknown")? '<span style="color:var(--dim)">unlabeled</span>'
446
+ : '<span style="color:#'+srcColor(dom).toString(16).padStart(6,"0")+'">'+esc(dom)+'</span>';
447
+ jEl.textContent = (totJ>0)? fmt(totJ,3) : "—";
448
+ nEl.textContent = String(n);
449
+ // Bekenstein gate (proven F19/TH6) — show pass count if present, else summary
450
+ var within = rows.filter(function(r){return r.within===true || r.bekenstein_ok===true;}).length;
451
+ bekEl.innerHTML = rows.length
452
+ ? '<span style="color:var(--green)">'+within+'/'+rows.length+' within bound</span>'
453
+ : (b.total_shannon_bits!=null? '<span style="color:var(--dim)">Σ bits '+fmt(b.total_shannon_bits,0)+'</span>':'—');
454
+ // streams: scale with receipt count (bounded), colored by dominant source.
455
+ // 0 receipts => 0 streams (honest: we draw flow only for confirmed activity).
456
+ setFlow(Math.min(MAXP, n*40), srcColor(dom));
457
+ }
458
+
459
+ function applyOrgan(g, ok){
460
+ // ok===true active, ok===false reachable-but-degraded, null unknown
461
+ g.userData.status = (ok===true)?"active":(ok===false?"degraded":"unknown");
462
+ }
463
+
464
+ function pollData(){
465
+ getJSON(API+"/code/healthz").then(applyPosture);
466
+ getJSON(API+"/v1/energy/budget").then(applyBudget);
467
+ // probe each organ endpoint; honest dim on null. Never blocks the scene.
468
+ organMeshes.forEach(function(g){
469
+ getJSON(g.userData.organ.probe).then(function(j){
470
+ applyOrgan(g, j==null ? null : true);
471
+ });
472
+ });
473
+ // swarm size from gates payload if present (else keep default fabric)
474
+ getJSON(API+"/v1/gates").then(function(j){
475
+ if(j){
476
+ var n = Array.isArray(j)? j.length : (j.nodes? j.nodes.length : (j.count||7));
477
+ buildSwarm(n);
478
+ }
479
+ });
480
+ }
481
+ pollData();
482
+ setInterval(pollData, 15000);
483
+ })();
484
+ </script>
485
+ </body>
486
+ </html>
web/sda.html CHANGED
@@ -36,7 +36,7 @@ pre{background:#0a1626;border:1px solid var(--line);border-radius:8px;padding:12
36
  <div class="wrap">
37
  <nav class="note" style="padding-top:12px"><a href="/">home</a> · <a href="/counter-uas">/counter-uas</a> · <a href="/orbital">/orbital</a> · <a href="/immune">/immune</a> · <a href="/api/a11oy/v1/sda/status" target="_blank" rel="noopener">/api/a11oy/v1/sda/status</a></nav>
38
  <h1>SDA — Space / Domain Awareness <span class="pill">Counter-UAS</span></h1>
39
- <p class="sub">One honest pane over three contact domains: <b>vessel</b> (AIS replay), <b>drone</b> (counter-UAS, scored by the real Sentra T11–T20 model), and <b>space-object</b> (modeled orbital). Verdicts use the <b>real 13-axis Λ aggregate</b> (floor 0.90) and sign a Khipu receipt. <span id="srcstat" class="pill">source: …</span></p>
40
 
41
  <h2>1 · Status</h2>
42
  <div class="card"><div class="kpis" id="kpis"><div class="note">loading live status…</div></div>
@@ -52,7 +52,7 @@ pre{background:#0a1626;border:1px solid var(--line);border-radius:8px;padding:12
52
  <table id="tracks"><tr><th>id</th><th>type</th><th>name</th><th>position</th><th>risk</th><th>flags</th><th>data</th></tr>
53
  <tr><td colspan="7" class="note">loading live tracks…</td></tr></table></div>
54
 
55
- <h2>3 · Counter-UAS verdict <span class="note">(real Sentra Λ logic · signed Khipu receipt)</span></h2>
56
  <div class="card">
57
  <span class="note">contact:</span>
58
  <select id="vtype"><option value="drone">drone</option><option value="vessel">vessel</option><option value="space-object">space-object</option></select>
@@ -62,7 +62,7 @@ pre{background:#0a1626;border:1px solid var(--line);border-radius:8px;padding:12
62
  <p class="note">Effector is <b>SIMULATED, human-on-loop</b> — an assessment + signed receipt, never a kinetic or jamming action.</p>
63
  <pre id="vout">// verdict result + Khipu receipt</pre></div>
64
 
65
- <div class="foot">Tracks: vessels are the warhacker-demo UDS <code>demo_ais_replay.sh</code> sample AIS dataset (<b>REPLAY</b> — no live AIS receiver); drone contacts are <b>SAMPLE</b> counter-UAS demo contacts scored by the REAL Sentra drone-cyber T11–T20 model; space objects are <b>MODELED</b> orbital-roadmap objects (no on-orbit sensor). SZL does not operate the radar/AIS/on-orbit sensor behind these — we never claim a live feed we don't have. Counter-UAS verdict reuses the real <code>organs/sentra/sentra_drone_cyber.py</code> 13-axis Λ logic (floor 0.90), not re-weakened. Khipu signatures are <b>DSSE PLACEHOLDER</b> (chain integrity real; Sigstore not wired); SLSA L1 honest. Λ = Conjecture 1; Khipu = Conjecture 2; trust never 100%; locked = 8 @ c7c0ba17. Doctrine v11.</div>
66
  <script>
67
  const A="/api/a11oy/v1/sda";
68
  function rc(r){return r>=0.7?"red":(r>=0.4?"amber":"green");}
 
36
  <div class="wrap">
37
  <nav class="note" style="padding-top:12px"><a href="/">home</a> · <a href="/counter-uas">/counter-uas</a> · <a href="/orbital">/orbital</a> · <a href="/immune">/immune</a> · <a href="/api/a11oy/v1/sda/status" target="_blank" rel="noopener">/api/a11oy/v1/sda/status</a></nav>
38
  <h1>SDA — Space / Domain Awareness <span class="pill">Counter-UAS</span></h1>
39
+ <p class="sub">One honest pane over three contact domains: <b>vessel</b> (AIS replay), <b>drone</b> (counter-UAS, scored by the real counter-UAS drone-cyber organ (T11–T20)), and <b>space-object</b> (modeled orbital). Verdicts use the <b>real 13-axis Λ aggregate</b> (floor 0.90) and sign a Khipu receipt. <span id="srcstat" class="pill">source: …</span></p>
40
 
41
  <h2>1 · Status</h2>
42
  <div class="card"><div class="kpis" id="kpis"><div class="note">loading live status…</div></div>
 
52
  <table id="tracks"><tr><th>id</th><th>type</th><th>name</th><th>position</th><th>risk</th><th>flags</th><th>data</th></tr>
53
  <tr><td colspan="7" class="note">loading live tracks…</td></tr></table></div>
54
 
55
+ <h2>3 · Counter-UAS verdict <span class="note">(real counter-UAS drone-cyber Λ logic · signed Khipu receipt)</span></h2>
56
  <div class="card">
57
  <span class="note">contact:</span>
58
  <select id="vtype"><option value="drone">drone</option><option value="vessel">vessel</option><option value="space-object">space-object</option></select>
 
62
  <p class="note">Effector is <b>SIMULATED, human-on-loop</b> — an assessment + signed receipt, never a kinetic or jamming action.</p>
63
  <pre id="vout">// verdict result + Khipu receipt</pre></div>
64
 
65
+ <div class="foot">Tracks: vessels are the warhacker-demo UDS <code>demo_ais_replay.sh</code> sample AIS dataset (<b>REPLAY</b> — no live AIS receiver); drone contacts are <b>SAMPLE</b> counter-UAS demo contacts scored by the REAL counter-UAS drone-cyber organ (T11–T20); space objects are <b>MODELED</b> orbital-roadmap objects (no on-orbit sensor). SZL does not operate the radar/AIS/on-orbit sensor behind these — we never claim a live feed we don't have. Counter-UAS verdict reuses the real <code>organs/sentra/sentra_drone_cyber.py</code> 13-axis Λ logic (floor 0.90), not re-weakened. Khipu signatures are <b>DSSE PLACEHOLDER</b> (chain integrity real; Sigstore not wired); SLSA L1 honest. Λ = Conjecture 1; Khipu = Conjecture 2; trust never 100%; locked = 8 @ c7c0ba17. Doctrine v11.</div>
66
  <script>
67
  const A="/api/a11oy/v1/sda";
68
  function rc(r){return r>=0.7?"red":(r>=0.4?"amber":"green");}