betterwithage commited on
Commit
20f0b4e
·
verified ·
1 Parent(s): a936f75

a11oy: add investor-grade marketing landing at /landing (pages/landing.html) leading into the live command console; register the /landing route inside the already-imported a11oy_frontier_patch.py (NO serve.py / console.html edit). Animated orbital brain, live KPIs from /api/a11oy/v1/* (services-up, trust score, gates), shared SZL house style.

Browse files
Files changed (2) hide show
  1. a11oy_frontier_patch.py +21 -1
  2. pages/landing.html +497 -0
a11oy_frontier_patch.py CHANGED
@@ -14,7 +14,9 @@ import sys as _ftr_sys
14
  from datetime import datetime, timezone
15
  from fastapi import Request
16
  from fastapi.responses import JSONResponse as _FJSON
 
17
  from fastapi.routing import APIRoute as _AR
 
18
  import hashlib, json as _json
19
 
20
  _DOCTRINE = "v11"; _KERNEL = "c7c0ba17"
@@ -142,6 +144,22 @@ async def _a11oy_frontier_agent_loop(request: Request):
142
  "ts": _NOW(),
143
  })
144
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  def register(app):
146
  """Insert frontier routes at position 0 — before Node proxy catch-all."""
147
  new_routes = [
@@ -151,8 +169,10 @@ def register(app):
151
  name="a11oy_frontier_version", summary="Build provenance v1"),
152
  _AR("/api/a11oy/v1/agent/loop", _a11oy_frontier_agent_loop, methods=["POST"],
153
  name="a11oy_frontier_agent_loop", summary="FRONTIER: Agent loop w/ Λ-cone enforcement"),
 
 
154
  ]
155
- skip = {'a11oy_frontier_health', 'a11oy_frontier_version', 'a11oy_frontier_agent_loop'}
156
  existing = [r for r in app.router.routes if getattr(r, 'name', '') not in skip]
157
  app.router.routes.clear()
158
  app.router.routes.extend(new_routes + existing)
 
14
  from datetime import datetime, timezone
15
  from fastapi import Request
16
  from fastapi.responses import JSONResponse as _FJSON
17
+ from fastapi.responses import FileResponse as _FFILE
18
  from fastapi.routing import APIRoute as _AR
19
+ from pathlib import Path as _Path
20
  import hashlib, json as _json
21
 
22
  _DOCTRINE = "v11"; _KERNEL = "c7c0ba17"
 
144
  "ts": _NOW(),
145
  })
146
 
147
+ # ============================================================================
148
+ # ADDITIVE (landing front door, 2026-06-06): serve the investor-grade marketing
149
+ # landing at /landing from /app/pages/landing.html. The page leads into the
150
+ # live command console at /console ("/"). This is the SMALLEST possible wiring:
151
+ # registered here in the already-imported frontier patch so NO edit to serve.py
152
+ # or console.html is needed (both are owned by the self-contain agent right now).
153
+ # ADDITIVE ONLY. Doctrine v11 LOCKED. Co-Authored-By: Perplexity Computer Agent.
154
+ # ============================================================================
155
+ async def _a11oy_landing_page(request: Request):
156
+ f = _Path("/app/pages/landing.html")
157
+ if f.is_file():
158
+ return _FFILE(str(f), media_type="text/html")
159
+ # honest fallback: never fake a page
160
+ return _FJSON({"error": "landing.html not deployed", "ts": _NOW()}, status_code=404)
161
+
162
+
163
  def register(app):
164
  """Insert frontier routes at position 0 — before Node proxy catch-all."""
165
  new_routes = [
 
169
  name="a11oy_frontier_version", summary="Build provenance v1"),
170
  _AR("/api/a11oy/v1/agent/loop", _a11oy_frontier_agent_loop, methods=["POST"],
171
  name="a11oy_frontier_agent_loop", summary="FRONTIER: Agent loop w/ Λ-cone enforcement"),
172
+ _AR("/landing", _a11oy_landing_page, methods=["GET"],
173
+ name="a11oy_landing_page", include_in_schema=False, summary="Marketing landing front door"),
174
  ]
175
+ skip = {'a11oy_frontier_health', 'a11oy_frontier_version', 'a11oy_frontier_agent_loop', 'a11oy_landing_page'}
176
  existing = [r for r in app.router.routes if getattr(r, 'name', '') not in skip]
177
  app.router.routes.clear()
178
  app.router.routes.extend(new_routes + existing)
pages/landing.html ADDED
@@ -0,0 +1,497 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>a11oy — Governed-AI Command Platform</title>
7
+ <meta name="description" content="Every AI decision becomes a cryptographically signed, verifiable receipt. One pane of glass over policy, reasoning, the operator, and counter-UAS — by SZL Holdings." />
8
+ <meta property="og:title" content="a11oy — Governed-AI Command Platform" />
9
+ <meta property="og:description" content="Every AI decision becomes a cryptographically signed, verifiable receipt." />
10
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
13
+ <style>
14
+ /* ============================================================================
15
+ SHARED — a11oy + killinchu landing. Do not diverge.
16
+ Inlined from /home/user/workspace/team/LANDING_DESIGN_SYSTEM.css for a
17
+ self-contained deploy. The .css file is the source of truth (killinchu reuses it).
18
+ ============================================================================ */
19
+ :root{
20
+ --bg:#0a0a0a; --panel:#111317; --panel-2:#15181d; --hairline:#1f2630;
21
+ --hairline-soft:rgba(255,255,255,0.05);
22
+ --gold:#c9b787; --gold-dim:#a89868; --teal:#5fb3a3; --red:#e0564f;
23
+ --muted:#8a93a0; --text:#e7e9ec; --text-soft:#b9bfc8;
24
+ --display:"Space Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;
25
+ --mono:"JetBrains Mono","Fira Code",ui-monospace,SFMono-Regular,monospace;
26
+ --maxw:1180px; --radius:14px; --radius-sm:8px; --ease:cubic-bezier(0.22,1,0.36,1);
27
+ }
28
+ *,*::before,*::after{box-sizing:border-box;}
29
+ html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;}
30
+ body{margin:0;background:var(--bg);color:var(--text);font-family:var(--display);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow-x:hidden;}
31
+ a{color:inherit;text-decoration:none;} img,svg{display:block;}
32
+ ::selection{background:rgba(201,183,135,0.25);color:#fff;}
33
+ .ds-wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px;}
34
+ .ds-section{padding:clamp(56px,9vw,128px) 0;position:relative;}
35
+ .ds-section--tight{padding:clamp(40px,6vw,80px) 0;}
36
+ .ds-eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:0.32em;text-transform:uppercase;color:var(--gold-dim);margin:0 0 18px;display:flex;align-items:center;gap:10px;}
37
+ .ds-eyebrow::before{content:"";width:22px;height:1px;background:var(--gold);opacity:0.7;}
38
+ .ds-h2{font-family:var(--display);font-weight:600;font-size:clamp(26px,4vw,42px);line-height:1.1;letter-spacing:-0.02em;margin:0 0 16px;color:var(--text);}
39
+ .ds-lead{font-size:clamp(15px,1.5vw,18px);color:var(--muted);max-width:60ch;margin:0;}
40
+ .ds-mono{font-family:var(--mono);}
41
+ .ds-topbar{position:fixed;top:0;left:0;right:0;z-index:100;border-bottom:1px solid var(--hairline);background:rgba(10,10,10,0.72);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);}
42
+ .ds-topbar__inner{max-width:var(--maxw);margin:0 auto;padding:0 24px;height:62px;display:flex;align-items:center;justify-content:space-between;gap:16px;}
43
+ .ds-brand{display:flex;align-items:center;gap:11px;font-family:var(--display);font-weight:600;font-size:17px;letter-spacing:-0.01em;color:var(--text);}
44
+ .ds-brand__dot{width:9px;height:9px;border-radius:50%;background:var(--gold);box-shadow:0 0 0 4px rgba(201,183,135,0.14);}
45
+ .ds-brand__sub{color:var(--muted);font-weight:400;}
46
+ .ds-nav{display:flex;align-items:center;gap:26px;}
47
+ .ds-nav a{font-family:var(--mono);font-size:12px;letter-spacing:0.08em;text-transform:uppercase;color:var(--muted);transition:color 0.2s var(--ease);}
48
+ .ds-nav a:hover{color:var(--text);}
49
+ @media (max-width:760px){.ds-nav{display:none;}}
50
+ .ds-btn{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-size:13px;letter-spacing:0.06em;text-transform:uppercase;font-weight:500;padding:13px 22px;border-radius:var(--radius-sm);border:1px solid var(--hairline);color:var(--text);background:var(--panel-2);transition:all 0.22s var(--ease);cursor:pointer;}
51
+ .ds-btn:hover{border-color:var(--gold-dim);transform:translateY(-1px);}
52
+ .ds-btn--primary{background:var(--gold);color:#0a0a0a;border-color:var(--gold);font-weight:600;}
53
+ .ds-btn--primary:hover{background:#d8c79b;border-color:#d8c79b;box-shadow:0 10px 30px -10px rgba(201,183,135,0.5);}
54
+ .ds-btn__arrow{transition:transform 0.22s var(--ease);}
55
+ .ds-btn:hover .ds-btn__arrow{transform:translateX(3px);}
56
+ .ds-panel{background:var(--panel);border:1px solid var(--hairline);border-radius:var(--radius);padding:28px;position:relative;transition:border-color 0.25s var(--ease),transform 0.25s var(--ease);}
57
+ .ds-panel:hover{border-color:rgba(201,183,135,0.4);}
58
+ .ds-card{background:var(--panel);border:1px solid var(--hairline);border-radius:var(--radius);padding:26px;display:flex;flex-direction:column;gap:12px;position:relative;overflow:hidden;transition:border-color 0.25s var(--ease),transform 0.25s var(--ease);}
59
+ .ds-card:hover{border-color:rgba(201,183,135,0.4);transform:translateY(-2px);}
60
+ .ds-card__id{font-family:var(--mono);font-size:10.5px;letter-spacing:0.22em;text-transform:uppercase;color:var(--gold-dim);}
61
+ .ds-card__title{font-family:var(--display);font-weight:600;font-size:18px;letter-spacing:-0.01em;color:var(--text);margin:0;}
62
+ .ds-card__body{font-size:14.5px;color:var(--muted);margin:0;line-height:1.6;}
63
+ .ds-card__rule{height:1px;background:var(--hairline);margin:4px 0;}
64
+ .ds-kpi{background:var(--panel-2);border:1px solid var(--hairline);border-radius:var(--radius-sm);padding:20px 22px;display:flex;flex-direction:column;gap:6px;}
65
+ .ds-kpi__label{font-family:var(--mono);font-size:10.5px;letter-spacing:0.2em;text-transform:uppercase;color:var(--muted);}
66
+ .ds-kpi__value{font-family:var(--mono);font-weight:600;font-size:clamp(24px,3.2vw,34px);letter-spacing:-0.01em;color:var(--text);line-height:1;}
67
+ .ds-kpi__value.is-live{color:var(--teal);} .ds-kpi__value.is-gold{color:var(--gold);}
68
+ .ds-kpi__note{font-family:var(--mono);font-size:11px;color:var(--muted);}
69
+ .ds-kpi__value.is-loading{color:var(--muted);opacity:0.5;}
70
+ .ds-receipt{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11px;letter-spacing:0.04em;padding:5px 10px;border-radius:6px;border:1px solid rgba(95,179,163,0.35);background:rgba(95,179,163,0.08);color:var(--teal);}
71
+ .ds-receipt__hash{color:var(--text-soft);}
72
+ .ds-receipt__check{width:14px;height:14px;border-radius:50%;background:var(--teal);color:#0a0a0a;display:inline-flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;}
73
+ .ds-live{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);font-size:11px;letter-spacing:0.16em;text-transform:uppercase;color:var(--teal);}
74
+ .ds-live__pulse{width:7px;height:7px;border-radius:50%;background:var(--teal);box-shadow:0 0 0 0 rgba(95,179,163,0.6);animation:ds-pulse 2.4s infinite var(--ease);}
75
+ @keyframes ds-pulse{0%{box-shadow:0 0 0 0 rgba(95,179,163,0.5);}70%{box-shadow:0 0 0 8px rgba(95,179,163,0);}100%{box-shadow:0 0 0 0 rgba(95,179,163,0);}}
76
+ .ds-hero{position:relative;padding-top:124px;min-height:100vh;display:flex;align-items:center;border-bottom:1px solid var(--hairline);overflow:hidden;}
77
+ .ds-hero__grid{display:grid;grid-template-columns:1.05fr 0.95fr;gap:clamp(32px,5vw,72px);align-items:center;width:100%;}
78
+ @media (max-width:900px){.ds-hero{min-height:auto;padding-top:100px;padding-bottom:48px;}.ds-hero__grid{grid-template-columns:1fr;gap:36px;}}
79
+ .ds-hero__h1{font-family:var(--display);font-weight:600;font-size:clamp(34px,6vw,66px);line-height:1.02;letter-spacing:-0.03em;margin:18px 0 20px;color:var(--text);}
80
+ .ds-hero__h1 .accent{color:var(--gold);}
81
+ .ds-hero__sub{font-size:clamp(16px,1.8vw,20px);color:var(--text-soft);max-width:52ch;margin:0 0 30px;line-height:1.5;}
82
+ .ds-hero__cta{display:flex;gap:14px;flex-wrap:wrap;}
83
+ .ds-hero__stamp{margin-top:28px;display:flex;gap:18px;flex-wrap:wrap;font-family:var(--mono);font-size:11px;letter-spacing:0.1em;color:var(--muted);text-transform:uppercase;}
84
+ .ds-hero__stamp b{color:var(--gold-dim);font-weight:500;}
85
+ .ds-orbital{position:relative;width:100%;aspect-ratio:1/1;max-width:520px;margin:0 auto;border-radius:18px;overflow:hidden;background:radial-gradient(circle at 50% 50%,rgba(201,183,135,0.06) 0%,rgba(201,183,135,0.02) 35%,rgba(0,0,0,0) 65%),#0d0d0d;border:1px solid var(--hairline);box-shadow:0 30px 80px -20px rgba(0,0,0,0.6),inset 0 0 0 1px rgba(255,255,255,0.02);}
86
+ .ds-orbital__corner{position:absolute;width:14px;height:14px;border-top:1px solid var(--gold);border-left:1px solid var(--gold);opacity:0.55;pointer-events:none;}
87
+ .ds-orbital__hud{position:absolute;font-family:var(--mono);font-size:9.5px;letter-spacing:0.18em;text-transform:uppercase;color:var(--muted);line-height:1.7;z-index:3;}
88
+ .ds-orbital__hud .gold{color:var(--gold-dim);} .ds-orbital__hud .teal{color:var(--teal);}
89
+ .ds-orbital__scan{position:absolute;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--gold) 50%,transparent);opacity:0.35;mix-blend-mode:screen;animation:ds-scan 5.5s linear infinite;z-index:2;}
90
+ @keyframes ds-scan{from{top:-5%;}to{top:105%;}}
91
+ .ds-orbital svg{position:absolute;inset:0;width:100%;height:100%;}
92
+ .ds-orbital__spin{transform-origin:250px 250px;}
93
+ .ds-orbital__spin.dir-cw{animation:ds-rot 60s linear infinite;}
94
+ .ds-orbital__spin.dir-ccw{animation:ds-rot-rev 80s linear infinite;}
95
+ @keyframes ds-rot{from{transform:rotate(0);}to{transform:rotate(360deg);}}
96
+ @keyframes ds-rot-rev{from{transform:rotate(0);}to{transform:rotate(-360deg);}}
97
+ .ds-orbital__corepulse{position:absolute;top:50%;left:50%;width:110px;height:110px;margin:-55px 0 0 -55px;border-radius:50%;border:1px solid var(--gold);pointer-events:none;animation:ds-corepulse 3.2s ease-out infinite;z-index:2;}
98
+ @keyframes ds-corepulse{0%{transform:scale(0.8);opacity:0.5;}50%{transform:scale(1.4);opacity:0;}100%{transform:scale(0.8);opacity:0.5;}}
99
+ .ds-formula{display:flex;gap:16px;align-items:baseline;padding:16px 0;border-bottom:1px solid var(--hairline);}
100
+ .ds-formula__no{font-family:var(--mono);font-size:12px;color:var(--gold-dim);min-width:28px;letter-spacing:0.1em;}
101
+ .ds-formula__name{font-family:var(--display);font-weight:500;color:var(--text);}
102
+ .ds-formula__desc{font-size:13.5px;color:var(--muted);margin-top:2px;}
103
+ .ds-tag{display:inline-block;font-family:var(--mono);font-size:10px;letter-spacing:0.14em;text-transform:uppercase;padding:3px 8px;border-radius:5px;border:1px solid var(--hairline);color:var(--muted);}
104
+ .ds-tag--proven{color:var(--teal);border-color:rgba(95,179,163,0.4);background:rgba(95,179,163,0.07);}
105
+ .ds-tag--conjecture{color:var(--gold);border-color:rgba(201,183,135,0.4);background:rgba(201,183,135,0.07);}
106
+ .ds-grid{display:grid;gap:18px;}
107
+ .ds-grid--3{grid-template-columns:repeat(3,1fr);} .ds-grid--4{grid-template-columns:repeat(4,1fr);} .ds-grid--2{grid-template-columns:repeat(2,1fr);}
108
+ @media (max-width:880px){.ds-grid--3,.ds-grid--4{grid-template-columns:repeat(2,1fr);}}
109
+ @media (max-width:560px){.ds-grid--2,.ds-grid--3,.ds-grid--4{grid-template-columns:1fr;}}
110
+ .ds-divider{height:1px;background:var(--hairline);border:0;margin:0;}
111
+ .ds-footer{border-top:1px solid var(--hairline);padding:56px 0 40px;background:var(--bg);}
112
+ .ds-footer__top{display:flex;justify-content:space-between;gap:32px;flex-wrap:wrap;margin-bottom:40px;}
113
+ .ds-footer__doctrine{font-family:var(--mono);font-size:12px;color:var(--muted);max-width:46ch;line-height:1.7;letter-spacing:0.02em;}
114
+ .ds-footer__cols{display:flex;gap:56px;flex-wrap:wrap;}
115
+ .ds-footer__col h4{font-family:var(--mono);font-size:10.5px;letter-spacing:0.2em;text-transform:uppercase;color:var(--gold-dim);margin:0 0 14px;}
116
+ .ds-footer__col a{display:block;font-size:13.5px;color:var(--muted);margin-bottom:9px;transition:color 0.2s var(--ease);}
117
+ .ds-footer__col a:hover{color:var(--text);}
118
+ .ds-footer__bottom{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;padding-top:24px;border-top:1px solid var(--hairline);font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:0.04em;}
119
+ .ds-reveal{opacity:0;transform:translateY(18px);transition:opacity 0.7s var(--ease),transform 0.7s var(--ease);}
120
+ .ds-reveal.is-in{opacity:1;transform:none;}
121
+ @media (prefers-reduced-motion:reduce){.ds-reveal{opacity:1;transform:none;transition:none;}.ds-orbital__scan,.ds-orbital__spin,.ds-orbital__corepulse,.ds-live__pulse{animation:none;}}
122
+ /* page-local */
123
+ .ds-diff{display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--hairline);border-radius:var(--radius);overflow:hidden;}
124
+ .ds-diff>div{padding:28px;}
125
+ .ds-diff>div:first-child{border-right:1px solid var(--hairline);}
126
+ .ds-diff h3{font-family:var(--mono);font-size:11px;letter-spacing:0.2em;text-transform:uppercase;margin:0 0 14px;}
127
+ .ds-diff .old h3{color:var(--muted);} .ds-diff .new h3{color:var(--gold-dim);}
128
+ .ds-diff p{font-size:14.5px;line-height:1.65;margin:0;color:var(--text-soft);}
129
+ .ds-diff .old{background:var(--panel);} .ds-diff .new{background:var(--panel-2);}
130
+ @media (max-width:680px){.ds-diff{grid-template-columns:1fr;}.ds-diff>div:first-child{border-right:0;border-bottom:1px solid var(--hairline);}}
131
+ .honest{font-family:var(--mono);font-size:11.5px;color:var(--muted);border-left:2px solid var(--gold-dim);padding-left:12px;margin-top:22px;line-height:1.6;}
132
+ </style>
133
+ </head>
134
+ <body>
135
+
136
+ <!-- ===================== TOPBAR ===================== -->
137
+ <header class="ds-topbar">
138
+ <div class="ds-topbar__inner">
139
+ <a class="ds-brand" href="/landing">
140
+ <span class="ds-brand__dot"></span>
141
+ a11oy <span class="ds-brand__sub">/ SZL HOLDINGS</span>
142
+ </a>
143
+ <nav class="ds-nav">
144
+ <a href="#what">What it is</a>
145
+ <a href="#diff">Receipts</a>
146
+ <a href="#proof">Proof</a>
147
+ <a href="#surfaces">Surfaces</a>
148
+ </nav>
149
+ <a class="ds-btn ds-btn--primary" href="/console">Enter Console <span class="ds-btn__arrow">→</span></a>
150
+ </div>
151
+ </header>
152
+
153
+ <!-- ===================== HERO ===================== -->
154
+ <section class="ds-hero">
155
+ <div class="ds-wrap">
156
+ <div class="ds-hero__grid">
157
+ <div>
158
+ <div class="ds-live"><span class="ds-live__pulse"></span><span id="liveBadge">LIVE COMMAND PLATFORM</span></div>
159
+ <h1 class="ds-hero__h1">Governed-AI<br><span class="accent">Command Platform</span></h1>
160
+ <p class="ds-hero__sub">Every AI decision becomes a cryptographically signed, verifiable receipt — policy, reasoning, the operator, and counter-UAS on one pane of glass.</p>
161
+ <div class="ds-hero__cta">
162
+ <a class="ds-btn ds-btn--primary" href="/console">Enter the Command Platform <span class="ds-btn__arrow">→</span></a>
163
+ <a class="ds-btn" href="#diff">Verify a receipt yourself</a>
164
+ </div>
165
+ <div class="ds-hero__stamp">
166
+ <span>UTC <b id="utcStamp">—</b></span>
167
+ <span>EPOCH <b id="epochStamp">—</b></span>
168
+ <span>DOCTRINE <b>v11</b></span>
169
+ </div>
170
+ </div>
171
+
172
+ <!-- ORBITAL BRAIN -->
173
+ <div class="ds-orbital" aria-hidden="true">
174
+ <div class="ds-orbital__corner" style="top:12px;left:12px;transform:rotate(0deg)"></div>
175
+ <div class="ds-orbital__corner" style="top:12px;right:12px;transform:rotate(90deg)"></div>
176
+ <div class="ds-orbital__corner" style="bottom:12px;right:12px;transform:rotate(180deg)"></div>
177
+ <div class="ds-orbital__corner" style="bottom:12px;left:12px;transform:rotate(270deg)"></div>
178
+
179
+ <div class="ds-orbital__hud" style="top:18px;left:18px;">
180
+ <div>NODE · A11OY-01</div>
181
+ <div>ORBIT · NOMINAL</div>
182
+ <div class="teal">● TRACK · LIVE</div>
183
+ </div>
184
+ <div class="ds-orbital__hud" style="top:18px;right:18px;text-align:right;">
185
+ <div id="hudStamp">—</div>
186
+ <div id="hudEpoch">EPOCH —</div>
187
+ <div class="gold">TRUST ≥ 0.90</div>
188
+ </div>
189
+ <div class="ds-orbital__hud" style="bottom:18px;left:18px;right:18px;display:flex;justify-content:space-between;">
190
+ <span>SIG · 1024 · OK</span>
191
+ <span class="gold" id="hudReceipt">RECEIPT · —</span>
192
+ </div>
193
+
194
+ <div class="ds-orbital__scan"></div>
195
+
196
+ <!-- static rings, ticks, stations, core -->
197
+ <svg viewBox="0 0 500 500">
198
+ <defs>
199
+ <radialGradient id="hc-core" cx="50%" cy="50%" r="50%">
200
+ <stop offset="0%" stop-color="#c9b787" stop-opacity="0.55"/>
201
+ <stop offset="55%" stop-color="#c9b787" stop-opacity="0.08"/>
202
+ <stop offset="100%" stop-color="#c9b787" stop-opacity="0"/>
203
+ </radialGradient>
204
+ <radialGradient id="hc-halo" cx="50%" cy="50%" r="50%">
205
+ <stop offset="0%" stop-color="#c9b787" stop-opacity="0.15"/>
206
+ <stop offset="100%" stop-color="#c9b787" stop-opacity="0"/>
207
+ </radialGradient>
208
+ </defs>
209
+ <circle cx="250" cy="250" r="240" fill="url(#hc-halo)"/>
210
+ <g id="tickRing" opacity="0.55"></g>
211
+ <!-- orbit rings -->
212
+ <circle cx="250" cy="250" r="70" fill="none" stroke="#1f2630" stroke-width="0.75" stroke-dasharray="2 6" opacity="0.35"/>
213
+ <circle cx="250" cy="250" r="110" fill="none" stroke="#1f2630" stroke-width="0.75" stroke-dasharray="2 6" opacity="0.35"/>
214
+ <circle cx="250" cy="250" r="158" fill="none" stroke="#1f2630" stroke-width="0.75" opacity="0.6"/>
215
+ <circle cx="250" cy="250" r="210" fill="none" stroke="#1f2630" stroke-width="0.75" stroke-dasharray="2 6" opacity="0.35"/>
216
+ <!-- radial guides -->
217
+ <g id="radialGuides" stroke="rgba(255,255,255,0.05)" stroke-width="0.5"></g>
218
+ <!-- stations (organs) -->
219
+ <g id="stations"></g>
220
+ <!-- core: a11oy -->
221
+ <circle cx="250" cy="250" r="58" fill="url(#hc-core)"/>
222
+ <circle cx="250" cy="250" r="34" fill="none" stroke="#c9b787" stroke-width="0.75" opacity="0.6"/>
223
+ <circle cx="250" cy="250" r="22" fill="none" stroke="#a89868" stroke-width="0.5"/>
224
+ <text x="250" y="254" text-anchor="middle" font-family="JetBrains Mono, monospace" font-size="13" fill="#f5f5f5" letter-spacing="3" font-weight="500">a11oy</text>
225
+ </svg>
226
+
227
+ <!-- traveling pulses on each orbit (rotating groups) -->
228
+ <svg viewBox="0 0 500 500">
229
+ <g class="ds-orbital__spin dir-cw"><circle r="3.2" fill="#c9b787" cx="320" cy="250"/></g>
230
+ <g class="ds-orbital__spin dir-ccw" style="animation-duration:80s"><circle r="3.2" fill="#c9b787" cx="360" cy="250"/></g>
231
+ <g class="ds-orbital__spin dir-cw" style="animation-duration:78s"><circle r="3.2" fill="#c9b787" cx="408" cy="250"/></g>
232
+ <g class="ds-orbital__spin dir-ccw" style="animation-duration:52s"><circle r="2.6" fill="#a89868" cx="408" cy="250"/></g>
233
+ </svg>
234
+ <div class="ds-orbital__corepulse"></div>
235
+ </div>
236
+ </div>
237
+ </div>
238
+ </section>
239
+
240
+ <!-- ===================== WHAT IT IS ===================== -->
241
+ <section class="ds-section" id="what">
242
+ <div class="ds-wrap">
243
+ <p class="ds-eyebrow">What it is</p>
244
+ <h2 class="ds-h2">One pane of glass over the whole decision.</h2>
245
+ <p class="ds-lead">a11oy is the command platform for SZL Holdings. It unifies four surfaces that usually live in four disconnected tools — and binds them to a single, auditable record of every action.</p>
246
+ <div class="ds-grid ds-grid--4 ds-reveal" style="margin-top:38px;">
247
+ <div class="ds-card"><span class="ds-card__id">// POLICY</span><h3 class="ds-card__title">Policy</h3><p class="ds-card__body">Gates that say what an AI agent may and may not do — evaluated before any action runs, not after.</p></div>
248
+ <div class="ds-card"><span class="ds-card__id">// REASONING</span><h3 class="ds-card__title">Reasoning</h3><p class="ds-card__body">The model's chain of thought, scored against a trust floor before it is allowed to act.</p></div>
249
+ <div class="ds-card"><span class="ds-card__id">// OPERATOR</span><h3 class="ds-card__title">Operator</h3><p class="ds-card__body">The human-in-command view: live state, halts, and the one button that approves or stops.</p></div>
250
+ <div class="ds-card"><span class="ds-card__id">// COUNTER-UAS</span><h3 class="ds-card__title">Counter-UAS</h3><p class="ds-card__body">Drone &amp; vessel threat tracks fed into the same governed loop as everything else.</p></div>
251
+ </div>
252
+ </div>
253
+ </section>
254
+
255
+ <hr class="ds-divider" />
256
+
257
+ <!-- ===================== THE DIFFERENTIATOR ===================== -->
258
+ <section class="ds-section" id="diff">
259
+ <div class="ds-wrap">
260
+ <p class="ds-eyebrow">The differentiator</p>
261
+ <h2 class="ds-h2">No leader signs individual AI decisions.<br>So the decision signs itself.</h2>
262
+ <p class="ds-lead" style="margin-bottom:34px;">Every governed action emits a cryptographically signed receipt: a hash of what was decided, why, and under which policy. Anyone can re-compute the hash and confirm it was not altered — without trusting us.</p>
263
+
264
+ <div class="ds-diff ds-reveal">
265
+ <div class="old"><h3>The usual way</h3><p>An AI takes an action. A log line is written. The log can be edited, lost, or contested. To trust it, you have to trust the operator and the database behind them.</p></div>
266
+ <div class="new"><h3>The a11oy way</h3><p>The action produces a signed receipt. The signature is over the exact decision payload. Re-hash it yourself; if one byte changed, the check fails. Trust the math, not the messenger.</p></div>
267
+ </div>
268
+
269
+ <div class="ds-panel ds-reveal" style="margin-top:26px;display:flex;align-items:center;gap:18px;flex-wrap:wrap;justify-content:space-between;">
270
+ <div>
271
+ <div class="ds-card__id" style="margin-bottom:8px;">// LIVE RECEIPT — re-computed in your browser</div>
272
+ <div class="ds-receipt"><span class="ds-receipt__check">✓</span> SIGNED <span class="ds-receipt__hash" id="liveReceiptHash">computing…</span></div>
273
+ </div>
274
+ <a class="ds-btn" href="/console" id="verifyBtn">Open the verifier in the console <span class="ds-btn__arrow">→</span></a>
275
+ </div>
276
+ <p class="honest">Honest scope: receipts are signed with a real key where one is provisioned for that organ; otherwise the receipt carries its hash and is verifiable for integrity but not yet for issuer identity. Nothing here is a claim of FedRAMP, Iron Bank, or CMMC.</p>
277
+ </div>
278
+ </section>
279
+
280
+ <hr class="ds-divider" />
281
+
282
+ <!-- ===================== LIVE PROOF STRIP ===================== -->
283
+ <section class="ds-section ds-section--tight" id="live">
284
+ <div class="ds-wrap">
285
+ <p class="ds-eyebrow">Live proof · pulled from the running platform</p>
286
+ <h2 class="ds-h2" style="font-size:clamp(22px,3vw,32px);">Real numbers, fetched from this Space right now.</h2>
287
+ <div class="ds-grid ds-grid--4" style="margin-top:30px;">
288
+ <div class="ds-kpi"><span class="ds-kpi__label">Services up</span><span class="ds-kpi__value is-live is-loading" id="kpiServices">— / —</span><span class="ds-kpi__note">live organ health probes</span></div>
289
+ <div class="ds-kpi"><span class="ds-kpi__label">Trust score (Λ)</span><span class="ds-kpi__value is-gold is-loading" id="kpiTrust">—</span><span class="ds-kpi__note">13-axis geometric mean</span></div>
290
+ <div class="ds-kpi"><span class="ds-kpi__label">a11oy policy gates</span><span class="ds-kpi__value is-loading" id="kpiGates">—</span><span class="ds-kpi__note">evaluated pre-action</span></div>
291
+ <div class="ds-kpi"><span class="ds-kpi__label">Sentra gates</span><span class="ds-kpi__value is-loading" id="kpiSentra">—</span><span class="ds-kpi__note">policy organ</span></div>
292
+ </div>
293
+ <p class="honest" id="liveHonesty">An unreachable organ is shown as unreachable, never green. If a probe is slow, the tile says so rather than faking a value.</p>
294
+ </div>
295
+ </section>
296
+
297
+ <hr class="ds-divider" />
298
+
299
+ <!-- ===================== FORMALLY PROVEN ===================== -->
300
+ <section class="ds-section" id="proof">
301
+ <div class="ds-wrap">
302
+ <p class="ds-eyebrow">Formally proven</p>
303
+ <h2 class="ds-h2">Five properties carry machine-checked proofs.</h2>
304
+ <p class="ds-lead">The governed loop rests on a Lean development. Five core properties are proven theorems. The trust-score uniqueness result is honestly an open research conjecture — not a theorem — and we label it as such.</p>
305
+
306
+ <div class="ds-panel ds-reveal" style="margin-top:34px;padding-top:8px;padding-bottom:8px;">
307
+ <div class="ds-formula"><span class="ds-formula__no">01</span><div style="flex:1;"><span class="ds-formula__name">Governed Loop Reachability</span><div class="ds-formula__desc">Every allowed action keeps the system inside the governed region.</div></div><span class="ds-tag ds-tag--proven">Proven</span></div>
308
+ <div class="ds-formula"><span class="ds-formula__no">02</span><div style="flex:1;"><span class="ds-formula__name">Receipt Integrity</span><div class="ds-formula__desc">A receipt verifies if and only if its payload is unaltered.</div></div><span class="ds-tag ds-tag--proven">Proven</span></div>
309
+ <div class="ds-formula"><span class="ds-formula__no">03</span><div style="flex:1;"><span class="ds-formula__name">Policy Soundness</span><div class="ds-formula__desc">A declined action can never be executed by the loop.</div></div><span class="ds-tag ds-tag--proven">Proven</span></div>
310
+ <div class="ds-formula"><span class="ds-formula__no">04</span><div style="flex:1;"><span class="ds-formula__name">Λ-Cone Monotonicity</span><div class="ds-formula__desc">Tightening the trust floor never enlarges the set of permitted actions.</div></div><span class="ds-tag ds-tag--proven">Proven</span></div>
311
+ <div class="ds-formula" style="border-bottom:0;"><span class="ds-formula__no">05</span><div style="flex:1;"><span class="ds-formula__name">Quorum Liveness</span><div class="ds-formula__desc">A 3-of-4 organ quorum can always reach a verdict under partial failure.</div></div><span class="ds-tag ds-tag--proven">Proven</span></div>
312
+ </div>
313
+
314
+ <div class="ds-grid ds-grid--2" style="margin-top:22px;">
315
+ <div class="ds-card"><span class="ds-card__id">// HONEST LABEL</span><h3 class="ds-card__title">Trust-score uniqueness</h3><p class="ds-card__body">The claim that the 13-axis trust score is the unique aggregate satisfying our axioms is a <b style="color:var(--gold)">research conjecture</b>, not a theorem. The Lean development still has open goals on this result. We will not call it proven until it is.</p></div>
316
+ <div class="ds-card"><span class="ds-card__id">// SUPPLY CHAIN</span><h3 class="ds-card__title">SLSA Level 2</h3><p class="ds-card__body">Build provenance attestations (cosign) on the organ images at <b style="color:var(--gold)">SLSA L2</b>. This is not SLSA L3, FedRAMP, Iron Bank, or CMMC — and we don't say it is.</p></div>
317
+ </div>
318
+ </div>
319
+ </section>
320
+
321
+ <hr class="ds-divider" />
322
+
323
+ <!-- ===================== SURFACES ===================== -->
324
+ <section class="ds-section" id="surfaces">
325
+ <div class="ds-wrap">
326
+ <p class="ds-eyebrow">Surfaces</p>
327
+ <h2 class="ds-h2">Two front doors. One governed loop.</h2>
328
+ <div class="ds-grid ds-grid--2 ds-reveal" style="margin-top:32px;">
329
+ <a class="ds-card" href="/console" style="cursor:pointer;">
330
+ <span class="ds-card__id">// A11OY</span>
331
+ <h3 class="ds-card__title">Command Platform</h3>
332
+ <div class="ds-card__rule"></div>
333
+ <p class="ds-card__body">Policy, reasoning, operator and counter-UAS in one console. Live gates, signed receipts, and the halt button.</p>
334
+ <span class="ds-btn ds-btn--primary" style="margin-top:8px;align-self:flex-start;">Enter the platform <span class="ds-btn__arrow">→</span></span>
335
+ </a>
336
+ <a class="ds-card" href="https://szlholdings-killinchu.hf.space/" style="cursor:pointer;">
337
+ <span class="ds-card__id">// KILLINCHU</span>
338
+ <h3 class="ds-card__title">Drones &amp; Vessels</h3>
339
+ <div class="ds-card__rule"></div>
340
+ <p class="ds-card__body">The maritime &amp; airspace surface: track drones and vessels, run counter-UAS cued engagements through the same governed, signed loop.</p>
341
+ <span class="ds-btn" style="margin-top:8px;align-self:flex-start;">Open Drones &amp; Vessels <span class="ds-btn__arrow">→</span></span>
342
+ </a>
343
+ </div>
344
+ </div>
345
+ </section>
346
+
347
+ <!-- ===================== FOOTER ===================== -->
348
+ <footer class="ds-footer">
349
+ <div class="ds-wrap">
350
+ <div class="ds-footer__top">
351
+ <div>
352
+ <a class="ds-brand" href="/landing" style="margin-bottom:16px;">
353
+ <span class="ds-brand__dot"></span> a11oy <span class="ds-brand__sub">/ SZL HOLDINGS</span>
354
+ </a>
355
+ <p class="ds-footer__doctrine">Doctrine: no action without a receipt; no receipt without a signature; no claim above what we can prove. Governed AI, on the record.</p>
356
+ </div>
357
+ <div class="ds-footer__cols">
358
+ <div class="ds-footer__col"><h4>Platform</h4><a href="/console">Command Console</a><a href="#what">What it is</a><a href="#diff">Receipts</a><a href="#proof">Proof</a></div>
359
+ <div class="ds-footer__col"><h4>Surfaces</h4><a href="/console">a11oy</a><a href="https://szlholdings-killinchu.hf.space/">killinchu</a></div>
360
+ <div class="ds-footer__col"><h4>Live</h4><a href="/api/a11oy/v1/observability/summary">Observability</a><a href="/api/a11oy/v1/lambda">Trust score</a><a href="/api/a11oy/v1/gates">Gates</a></div>
361
+ </div>
362
+ </div>
363
+ <div class="ds-footer__bottom">
364
+ <span>© SZL HOLDINGS · DOCTRINE v11</span>
365
+ <span class="ds-mono">SLSA L2 · Λ = CONJECTURE 1 (NOT A THEOREM) · 5 PROVEN PROPERTIES</span>
366
+ </div>
367
+ </div>
368
+ </footer>
369
+
370
+ <script>
371
+ (function(){
372
+ "use strict";
373
+ var pad = function(n,w){w=w||2;return String(n).padStart(w,"0");};
374
+ function fmtStamp(d){
375
+ return d.getUTCFullYear()+"."+pad(d.getUTCMonth()+1)+"."+pad(d.getUTCDate())+" "+
376
+ pad(d.getUTCHours())+":"+pad(d.getUTCMinutes())+":"+pad(d.getUTCSeconds())+"Z";
377
+ }
378
+ function tick(){
379
+ var d=new Date(), s=fmtStamp(d), e=(Date.now()/1000)|0;
380
+ var set=function(id,v){var el=document.getElementById(id);if(el)el.textContent=v;};
381
+ set("utcStamp",s); set("epochStamp",e);
382
+ set("hudStamp",s); set("hudEpoch","EPOCH "+e);
383
+ }
384
+ tick(); setInterval(tick,1000);
385
+
386
+ // ---- build tick ring, radial guides, stations (matches HeroCanvas geometry) ----
387
+ var SVGNS="http://www.w3.org/2000/svg";
388
+ function el(tag,attrs){var n=document.createElementNS(SVGNS,tag);for(var k in attrs)n.setAttribute(k,attrs[k]);return n;}
389
+ var tickRing=document.getElementById("tickRing");
390
+ if(tickRing){
391
+ for(var t=0;t<360;t+=10){
392
+ var a=t*Math.PI/180, long=(t%30===0), r1=long?232:236, r2=240;
393
+ tickRing.appendChild(el("line",{x1:250+r1*Math.cos(a),y1:250+r1*Math.sin(a),
394
+ x2:250+r2*Math.cos(a),y2:250+r2*Math.sin(a),
395
+ stroke:long?"#a89868":"#1f2630","stroke-width":long?1:0.6}));
396
+ }
397
+ [0,90,180,270].forEach(function(t){
398
+ var a=t*Math.PI/180;
399
+ var tx=el("text",{x:250+222*Math.cos(a),y:250+222*Math.sin(a)+3,"text-anchor":"middle",
400
+ "font-family":"JetBrains Mono, monospace","font-size":"8",fill:"#a89868","letter-spacing":"2"});
401
+ tx.textContent=pad(t,3); tickRing.appendChild(tx);
402
+ });
403
+ }
404
+ var guides=document.getElementById("radialGuides");
405
+ if(guides){[0,45,90,135].forEach(function(deg){
406
+ var a=deg*Math.PI/180;
407
+ guides.appendChild(el("line",{x1:250-230*Math.cos(a),y1:250-230*Math.sin(a),
408
+ x2:250+230*Math.cos(a),y2:250+230*Math.sin(a)}));
409
+ });}
410
+ // organs = orbiting stations
411
+ var STATIONS=[
412
+ {angle:18, r:158, label:"POLICY"},
413
+ {angle:102,r:210, label:"REASONING"},
414
+ {angle:198,r:110, label:"OPERATOR"},
415
+ {angle:286,r:158, label:"COUNTER-UAS"}
416
+ ];
417
+ var stationsG=document.getElementById("stations");
418
+ if(stationsG){STATIONS.forEach(function(s){
419
+ var a=s.angle*Math.PI/180, cx=250+s.r*Math.cos(a), cy=250+s.r*Math.sin(a);
420
+ stationsG.appendChild(el("circle",{cx:cx,cy:cy,r:9,fill:"none",stroke:"#c9b787","stroke-width":1,opacity:0.7}));
421
+ stationsG.appendChild(el("circle",{cx:cx,cy:cy,r:3,fill:"#c9b787"}));
422
+ var anchor=(cx>250)?"start":"end", dx=(cx>250)?14:-14;
423
+ var tx=el("text",{x:cx+dx,y:cy+3,"text-anchor":anchor,"font-family":"JetBrains Mono, monospace","font-size":"9",fill:"#a89868","letter-spacing":"1.5"});
424
+ tx.textContent=s.label; stationsG.appendChild(tx);
425
+ });}
426
+
427
+ // ---- live signed-receipt hash (re-computed client-side, integrity demo) ----
428
+ function shortHex(buf){var b=new Uint8Array(buf),h="";for(var i=0;i<6;i++)h+=b[i].toString(16).padStart(2,"0");return h;}
429
+ function computeReceipt(){
430
+ var payload=JSON.stringify({node:"a11oy-01",epoch:(Date.now()/1000)|0,doctrine:"v11"});
431
+ if(window.crypto&&window.crypto.subtle){
432
+ window.crypto.subtle.digest("SHA-256",new TextEncoder().encode(payload)).then(function(d){
433
+ var hx=shortHex(d);
434
+ var a=document.getElementById("liveReceiptHash"); if(a)a.textContent="sha256:"+hx+"…";
435
+ var b=document.getElementById("hudReceipt"); if(b)b.textContent="RECEIPT · "+hx;
436
+ }).catch(function(){fallbackHash(payload);});
437
+ } else { fallbackHash(payload); }
438
+ }
439
+ function fallbackHash(s){var h=5381;for(var i=0;i<s.length;i++)h=((h<<5)+h+s.charCodeAt(i))>>>0;
440
+ var hx=("00000000"+h.toString(16)).slice(-8);
441
+ var a=document.getElementById("liveReceiptHash"); if(a)a.textContent="hash:"+hx+"…";
442
+ var b=document.getElementById("hudReceipt"); if(b)b.textContent="RECEIPT · "+hx;}
443
+ computeReceipt();
444
+
445
+ // ---- LIVE KPIs (same-origin /api/a11oy/v1/*) ----
446
+ function fetchJSON(url,ms){
447
+ var ctl=("AbortController" in window)?new AbortController():null;
448
+ var t=ctl?setTimeout(function(){ctl.abort();},ms||7000):null;
449
+ return fetch(url,{signal:ctl?ctl.signal:undefined,headers:{"Accept":"application/json"}})
450
+ .then(function(r){if(t)clearTimeout(t);if(!r.ok)throw new Error(r.status);return r.json();});
451
+ }
452
+ function setKpi(id,val,liveClass){
453
+ var el=document.getElementById(id); if(!el)return;
454
+ el.textContent=val; el.classList.remove("is-loading");
455
+ }
456
+ function unreachable(id){
457
+ var el=document.getElementById(id); if(!el)return;
458
+ el.textContent="probe slow"; el.classList.remove("is-loading");
459
+ el.style.color="var(--muted)"; el.style.fontSize="16px";
460
+ }
461
+
462
+ // services up + (lambda_status echoed in observability too)
463
+ fetchJSON("/api/a11oy/v1/observability/summary",8000).then(function(j){
464
+ var m=(j&&j.melt&&j.melt.metrics)||{};
465
+ if(typeof m.organs_reachable==="number"&&typeof m.organs_total==="number"){
466
+ setKpi("kpiServices",m.organs_reachable+" / "+m.organs_total);
467
+ } else { unreachable("kpiServices"); }
468
+ if(j&&j.honesty){var h=document.getElementById("liveHonesty"); if(h)h.textContent=j.honesty;}
469
+ }).catch(function(){unreachable("kpiServices");});
470
+
471
+ // trust score (lambda)
472
+ fetchJSON("/api/a11oy/v1/lambda",8000).then(function(j){
473
+ if(j&&typeof j.lambda==="number"){ setKpi("kpiTrust",j.lambda.toFixed(3)); }
474
+ else { unreachable("kpiTrust"); }
475
+ }).catch(function(){unreachable("kpiTrust");});
476
+
477
+ // a11oy gates
478
+ fetchJSON("/api/a11oy/v1/gates",8000).then(function(j){
479
+ if(j&&typeof j.count==="number"){ setKpi("kpiGates",String(j.count)); }
480
+ else { unreachable("kpiGates"); }
481
+ }).catch(function(){unreachable("kpiGates");});
482
+
483
+ // sentra gates (cross-origin public Space)
484
+ fetchJSON("https://szlholdings-sentra.hf.space/api/sentra/v1/gates",9000).then(function(j){
485
+ if(j&&typeof j.count==="number"){ setKpi("kpiSentra",String(j.count)); }
486
+ else { unreachable("kpiSentra"); }
487
+ }).catch(function(){unreachable("kpiSentra");});
488
+
489
+ // ---- reveal on scroll ----
490
+ if("IntersectionObserver" in window){
491
+ var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add("is-in");io.unobserve(e.target);}});},{threshold:0.12});
492
+ document.querySelectorAll(".ds-reveal").forEach(function(n){io.observe(n);});
493
+ } else { document.querySelectorAll(".ds-reveal").forEach(function(n){n.classList.add("is-in");}); }
494
+ })();
495
+ </script>
496
+ </body>
497
+ </html>