betterwithage commited on
Commit
3a1ba9a
·
verified ·
1 Parent(s): ab59652

a11oy = THE consolidated platform: plain-language tabs (Ask&Act, Safety Gates, Trust Score, Live Decisions, Readiness, Compliance, Forecast, Signed Receipts, Threat Library...) all wired to live services, real charts+3D, no jargon. Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>

Browse files
Files changed (1) hide show
  1. pages/console.html +251 -228
pages/console.html CHANGED
@@ -128,16 +128,13 @@ details.raw[open] summary{color:var(--muted);}
128
  <div class="topbar">
129
  <button class="menu-btn" onclick="document.querySelector('.side').classList.toggle('open')">☰</button>
130
  <span>SZL HOLDINGS</span><span class="sep">/</span>
131
- <span style="color:var(--teal)">A11OY</span><span class="sep">/</span>
132
- <span>DOCTRINE V11 · LOCKED</span><span class="sep">/</span>
133
- <span class="live"><span class="live-dot"></span>LIVE · RT</span>
134
- <nav class="switcher" aria-label="Flagship switcher">
135
- <span class="lbl">FLEET</span>
136
- <a class="flag active" href="https://szlholdings-a11oy.hf.space/console">a11oy</a>
137
- <a class="flag" href="https://szlholdings-sentra.hf.space/console">sentra</a>
138
- <a class="flag" href="https://szlholdings-amaru.hf.space/operational-core">amaru</a>
139
- <a class="flag" href="https://szlholdings-rosie.hf.space/">rosie</a>
140
- <a class="flag" href="https://szlholdings-killinchu.hf.space/elite">killinchu</a>
141
  </nav>
142
  </div>
143
 
@@ -146,26 +143,26 @@ details.raw[open] summary{color:var(--muted);}
146
  <div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
147
  <div class="nav-group">Operate</div>
148
  <div class="nav-item active" data-view="command" onclick="go('command')"><span class="ico">◎</span>Command Center</div>
149
- <div class="nav-item" data-view="fleet" onclick="go('fleet')"><span class="ico">⊟</span>Fleet Health</div>
150
- <div class="nav-item" data-view="superpowers" onclick="go('superpowers')"><span class="ico">✦</span>Five Superpowers</div>
151
- <div class="nav-item" data-view="warhacker" onclick="go('warhacker')"><span class="ico">⊞</span>Warhacker</div>
152
- <div class="nav-item" data-view="reason" onclick="go('reason')"><span class="ico">⊕</span>Reasoner</div>
153
- <div class="nav-item" data-view="mcp" onclick="go('mcp')"><span class="ico">⚙</span>MCP Tools</div>
154
- <div class="nav-group">Observe</div>
155
- <div class="nav-item" data-view="observability" onclick="go('observability')"><span class="ico">∿</span>Observability</div>
156
- <div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Mesh Reach</div>
157
- <div class="nav-item" data-view="wires" onclick="go('wires')"><span class="ico">⧉</span>Wires · Constitution</div>
158
- <div class="nav-item" data-view="gates" onclick="go('gates')"><span class="ico">⊠</span>Policy Gates</div>
159
- <div class="nav-item" data-view="lambda" onclick="go('lambda')"><span class="ico">Λ</span>Λ Trust Axes</div>
160
- <div class="nav-item" data-view="audit" onclick="go('audit')"><span class="ico">≣</span>Audit Log</div>
161
- <div class="nav-group">Govern</div>
162
- <div class="nav-item" data-view="brain" onclick="go('brain')"><span class="ico">⬡</span>Brain · Composition</div>
163
- <div class="nav-item" data-view="formulas" onclick="go('formulas')"><span class="ico">ƒ</span>Formulas</div>
164
- <div class="nav-item" data-view="bounty" onclick="go('bounty')"><span class="ico">∮</span>Λ-Bounty (F23)</div>
165
- <div class="nav-item" data-view="evidence" onclick="go('evidence')"><span class="ico">⎙</span>Evidence Ledger</div>
166
- <div class="nav-item" data-view="honest" onclick="go('honest')"><span class="ico">⊘</span>Honest Doctrine</div>
167
- <div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>LLM Router</div>
168
- <div class="side-foot">Λ = Conjecture 1 · proved = 5<br>{F1,F11,F12,F18,F19}<br>SLSA Build L2 · 5/5 organs<br>v11 LOCKED · 749/14/163</div>
169
  </aside>
170
 
171
  <main class="content" id="content"><div class="view-sub">loading…</div></main>
@@ -173,7 +170,11 @@ details.raw[open] summary{color:var(--muted);}
173
 
174
  <script>
175
  const API='/api/a11oy';
 
 
176
  async function getJSON(p){const r=await fetch(p);if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
 
 
177
  async function postJSON(p,b){const r=await fetch(p,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(b||{})});if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
178
  function esc(s){return String(s==null?'':s).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));}
179
  function el(id){return document.getElementById(id);}
@@ -208,216 +209,238 @@ function mesh3d(id,nodes,links){const host=el(id);if(!host||!window.ForceGraph3D
208
  .showNavInfo(false);
209
  setTimeout(()=>{try{_fg.width(host.clientWidth).height(host.clientHeight);}catch(e){}},300);}catch(e){host.innerHTML='<div class="row mono dim" style="padding:1rem">3D init: '+e.message+'</div>';}}
210
 
211
- const HONEST='<div class="honesty"><b>Honesty.</b> Every panel reads a live a11oy endpoint — no mock data. Λ is <b>Conjecture 1</b>, never a theorem. Proved formulas = <b>5</b> {F1,F11,F12,F18,F19}. SLSA <b>Build L2</b> on all 5 organ images. No L3 / FedRAMP / Iron Bank / CMMC. Receipts are real DSSE when a key is present, honest UNSIGNED otherwise.</div>';
 
212
 
213
  const VIEWS={
214
- command:{title:'Command Center',badge:'LIVE',sub:'The orchestrating brain at a glance — live fleet health, the cross-organ mesh, evidence integrity, and one-click into every governed surface.',
215
- render:async(c)=>{
216
- c.innerHTML=`<div class="kpis">
217
- <div class="kpi"><div class="k">Fleet reachable</div><div class="v live" id="k-fleet">probing…</div><div class="d">live probe ~8s</div></div>
218
- <div class="kpi"><div class="k">Mesh wires</div><div class="v teal" id="k-wires">—</div><div class="d">conserved cross-organ</div></div>
219
- <div class="kpi"><div class="k">Evidence checks</div><div class="v" id="k-evid">—</div><div class="d">passed / total</div></div>
220
- <div class="kpi"><div class="k">Λ status</div><div class="v teal">Conjecture 1</div><div class="d">NOT a theorem</div></div>
221
- <div class="kpi"><div class="k">SLSA</div><div class="v teal">Build L2</div><div class="d">all 5 organ images</div></div></div>
222
- <div class="card"><div class="card-h"><span class="card-t">Fleet — live peer health</span><span class="card-ep">GET /v4/fleet</span></div><div id="fleet"><div class="row mono dim">probing…</div></div></div>
223
- <div class="grid2">
224
- <div class="card"><div class="card-h"><span class="card-t">Cross-organ mesh</span><span class="card-ep">/v1/mesh/state</span></div><div id="cmesh"><div class="row mono dim">loading…</div></div></div>
225
- <div class="card"><div class="card-h"><span class="card-t">Evidence integrity</span><span class="card-ep">/v1/evidence</span></div><div id="cevid"><div class="row mono dim">loading…</div></div></div>
226
- </div>${HONEST}`;
227
- // INSTANT panels first (mesh ~70ms, evidence ~70ms) so the page never looks dead.
228
- // mesh wires
229
- try{const d=await getJSON(API+'/v1/mesh/state');const w=d.wires||{};setTxt('k-wires',Object.keys(w).length);setHTML('cmesh','');
230
- Object.entries(w).forEach(([k,v])=>addHTML('cmesh',`<div class="row"><span class="badge b-teal">${k}</span><span>${esc(v.edge)}</span><span class="spacer badge ${String(v.status).includes('PROCESS')?'b-gold':'b-live'}">${esc(v.status)}</span></div>`));}catch(e){setHTML('cmesh','<div class="row mono dim">mesh retrying…</div>');}
231
- // fleet reachability — LIVE probe (~8s); honest in-progress label, never a dead blank
232
- setHTML('fleet','<div class="row mono dim">live probe of 5 organs in progress (~8s)…</div>');
233
- getJSON(API+'/v1/observability/summary').then(d=>{const mr=Object.values(d.mesh_reach||{});let ok=0;setHTML('fleet','');
234
- mr.forEach((p,i)=>{const up=p.status==='ok';if(up)ok++;const nm=['a11oy','sentra','amaru','rosie','killinchu'][i]||p.organ||('organ'+i);
235
- addHTML('fleet',`<div class="row"><span class="badge ${up?'b-live':'b-err'}">${up?'OK':'DOWN'}</span><span>${esc(nm)}</span><span class="spacer mono dim">${p.latency_ms?Math.round(p.latency_ms)+'ms':''} ${esc(p.url||'')}</span></div>`);});
236
- setTxt('k-fleet',mr.length?ok+'/'+mr.length:'—');}).catch(e=>{setHTML('fleet','<div class="row mono dim">probe retrying… (cold start)</div>');setTxt('k-fleet','—');});
237
- // evidence
238
- try{const d=await getJSON(API+'/v1/evidence');if(d.passed!=null)setTxt('k-evid',d.passed+'/'+d.total_assertions);
239
- setHTML('cevid',`<div class="row"><span>Declarations</span><span class="spacer b-gold badge">${d.canonical?.declarations??'—'}</span></div>
240
- <div class="row"><span>Axioms</span><span class="spacer b-gold badge">${d.canonical?.axioms??'—'}</span></div>
241
- <div class="row"><span>Assertions passed</span><span class="spacer b-live badge">${d.passed}/${d.total_assertions}</span></div>
242
- <div class="row"><span>Lean repo</span><span class="spacer mono dim">lutar-lean</span></div>`);}catch(e){setHTML('cevid','<div class="row mono dim">evidence retrying…</div>');}
243
  }},
244
- fleet:{title:'Fleet Health',badge:'5 ORGANS',sub:'The orchestrator\u2019s registry of every governed organ \u2014 live reachability (real public-URL probes), per-organ latency, and the doctrine each organ reports. Unreachable is shown honestly, never faked green.',
245
- render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="fleet_load()">\u25b6 Probe + read registry</button></div>
246
- <div class="kpis"><div class="kpi"><div class="k">Reachable</div><div class="v live" id="fl-reach">\u2014</div><div class="d">live public-URL probe</div></div>
247
- <div class="kpi"><div class="k">Doctrine</div><div class="v teal" id="fl-doc">\u2014</div><div class="d">reported by fleet</div></div>
248
- <div class="kpi"><div class="k">\u039b status</div><div class="v teal">Conjecture 1</div><div class="d">NOT a theorem</div></div></div>
249
- <div class="card"><div class="card-h"><span class="card-t">Live reachability \u2014 a11oy \u2192 each organ</span><span class="card-ep">/v1/observability/summary</span></div><div id="fl-reach-host"><div class="row mono dim">probing\u2026</div></div></div>
250
- <div class="card"><div class="card-h"><span class="card-t">Organ registry \u2014 doctrine the fleet reports</span><span class="card-ep">GET /v4/fleet \u00b7 deep probe ~10s</span></div><div id="fl-reg"><div class="row mono dim">deep internal probe (~10s)\u2026</div></div></div>${HONEST}`;window.fleet_load();}},
251
- superpowers:{title:'Five Superpowers',badge:'LIVE',sub:'Five screenshot-provable superpowers. Each button POSTs/GETs a real a11oy endpoint and renders the raw response — Decision Replay, Tamper Theater, Λ-collapse, Resurrection, One-Signed-Organism.',
252
- render:(c)=>{c.innerHTML=`
253
- <div class="card"><div class="card-h"><span class="card-t">① Decision Replay & ② Tamper Theater</span><span class="card-ep">/v1/receipts/replay</span></div>
254
- <div class="btns"><button class="btn teal" onclick="sp_replay()">▶ Replay a decision</button><button class="btn" onclick="sp_tamper()">⚠ Detect tampering</button></div><pre class="out" id="o-replay">— click to run —</pre></div>
255
- <div class="card"><div class="card-h"><span class="card-t">③ Λ-collapse</span><span class="card-ep">/v1/lambda/score</span></div>
256
- <div class="btns"><button class="btn teal" onclick="sp_lambda(false)">▶ Healthy Λ</button><button class="btn" onclick="sp_lambda(true)">⊘ Collapse an axis</button></div><pre class="out" id="o-lambda">— click to run —</pre></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  <div class="grid2">
258
- <div class="card"><div class="card-h"><span class="card-t">④ Resurrection</span><span class="card-ep">GET /v4/fleet</span></div><div class="btns"><button class="btn teal" onclick="sp_fleet()">▶ Probe the fleet</button></div><pre class="out" id="o-fleet">— click to run —</pre></div>
259
- <div class="card"><div class="card-h"><span class="card-t">⑤ One-Signed-Organism</span><span class="card-ep">/v1/mesh/state</span></div><div class="btns"><button class="btn teal" onclick="sp_mesh()">▶ Show the organism</button></div><pre class="out" id="o-mesh">— click to run —</pre></div>
260
- </div>${HONEST}`;}},
261
- warhacker:{title:'Warhacker Orchestration',badge:'5 PROBLEMS',sub:'a11oy is the single launch point. Each launch calls the live organ endpoint server-side, renders the organ\u2019s real JSON, and records a signed Khipu receipt of the orchestration.',
262
- render:(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="wh_all()">▶ Launch all 5 demos</button></div>
263
- <div id="wh"></div>${HONEST}`;
264
- const probs=[['P1','cannonico','Cannonico — AI-drone oversight','killinchu'],['P2','tychee','Tychee — satellite GSW air-gap','sentra'],['P3','hangar2apps','HANGAR2APPS — deployment-readiness','amaru'],['P4','cyber-rts','Cyber RTS — anomaly triage','amaru'],['P5','raven','Raven — edge AI mesh','a11oy']];
265
- el('wh').innerHTML=probs.map(([id,key,t,o])=>`<div class="card"><div class="card-h"><span class="badge b-teal">${id}</span><span class="card-t">${t}</span><span class="card-ep">organ: ${o}</span></div><div class="btns"><button class="btn" onclick="wh_one('${key}','o-${key}')">▶ Launch</button></div><pre class="out" id="o-${key}">— click to launch —</pre></div>`).join('');}},
266
- reason:{title:'Governed Reasoner',badge:'LIVE POST',sub:'Ask the orchestrator to reason about an action under the constitution. a11oy selects the governing policy gate, evaluates severity, and returns the real rationale + witness-quorum requirement \u2014 no canned text.',
267
- render:(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Reason about a governed action</span><span class="card-ep">POST /v1/reason</span></div>
268
- <div class="btns">
269
- <button class="btn teal" onclick="reason_run('Launch a kinetic counter-UAS engagement','high')">\u25b6 High-severity action</button>
270
- <button class="btn" onclick="reason_run('Summarize today\\'s telemetry','low')">\u25b6 Low-severity action</button>
271
- </div><pre class="out" id="o-reason">\u2014 click to reason \u2014</pre></div>${HONEST}`;}},
272
- mcp:{title:'MCP Tool Plane',badge:'LIVE CALL',sub:'The Model-Context-Protocol tools a11oy exposes to agents \u2014 read the registry, then actually invoke a tool. Every call returns a real, doctrine-stamped response (kernel commit c7c0ba17).',
273
- render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Registered MCP tools</span><span class="card-ep">/v1/mcp/tools</span></div><div id="mcp-list"><div class="row mono dim">loading\u2026</div></div></div>
274
- <div class="card"><div class="card-h"><span class="card-t">Invoke a tool</span><span class="card-ep">POST /v1/mcp/call</span></div>
275
- <div class="btns">
276
- <button class="btn teal" onclick="mcp_call('lambda_score')">\u25b6 lambda_score</button>
277
- <button class="btn" onclick="mcp_call('a11oy_gate')">\u25b6 a11oy_gate</button>
278
- <button class="btn" onclick="mcp_call('khipu_sign')">\u25b6 khipu_sign</button>
279
- <button class="btn" onclick="mcp_call('khipu_verify')">\u25b6 khipu_verify</button>
280
- </div><pre class="out" id="o-mcp">\u2014 click to invoke \u2014</pre></div>${HONEST}`;window.mcp_list();}},
281
- observability:{title:'Observability',badge:'MELT + SIGNED',sub:'Observability, but cryptographically true. MELT + distributed tracing where every span is a DSSE-signed Khipu receipt, plus live cross-organ mesh reachability and Λ-drift.',
282
- render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="obs_load()">▶ Refresh MELT + mesh</button></div>
283
- <div class="kpis" id="obs-kpis"><div class="kpi"><div class="k">Mesh reachable</div><div class="v live" id="ok-mesh">—</div></div><div class="kpi"><div class="k">Signed spans</div><div class="v" id="ok-spans">—</div></div><div class="kpi"><div class="k">Chain verified</div><div class="v teal" id="ok-chain">—</div></div></div>
284
- <div class="card"><div class="card-h"><span class="card-t">Mesh reachability — live public-URL probes</span><span class="card-ep">/v1/observability/summary</span></div><div id="obs-mesh"><div class="row mono dim">loading…</div></div></div>
285
- <div class="card"><div class="card-h"><span class="card-t">Signed Khipu spans</span><span class="card-ep">/v1/observability/spans</span></div><pre class="out" id="obs-spans">loading…</pre></div>${HONEST}`;
286
- window.obs_load();}},
287
- wires:{title:'Wires · The Constitution',badge:'LIVE',sub:'The mesh is the constitution: five wires that bind the organs into one signed organism. Each row reads the live mesh-state endpoint. Honest labels distinguish a cross-Space wire from an in-process one.',
288
- render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="wires_load()">▶ Refresh the mesh</button></div><div id="wires-host"><div class="row mono dim">loading…</div></div>${HONEST}`;window.wires_load();}},
289
- mesh:{title:'Mesh Reach',badge:'5 ORGANS',sub:'Live per-organ reachability probes from a11oy to every flagship\u2019s public health endpoint. Real URL + HTTP code + latency. An unreachable organ is shown honestly — never faked green.',
290
- render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="mesh_load()">▶ Re-probe + rebuild graph</button></div>
291
- <div class="card"><div class="card-h"><span class="card-t">Organism — live 3D mesh</span><span class="card-ep">drag to orbit</span></div><div class="graph3d" id="mesh-3d"></div></div>
292
- <div class="card"><div class="card-h"><span class="card-t">Per-organ reachability</span><span class="card-ep">/v1/observability/summary</span></div><div id="mesh-host"><div class="row mono dim">probing…</div></div></div>${HONEST}`;window.mesh_load();}},
293
- formulas:{title:'PURIQ Formulas',badge:'23 AGENTS',sub:'The 23 FormulaAgents. The proved set — exactly five {F1,F11,F12,F18,F19}, Lean sorry-free — is honestly distinguished from the open conjectures, including Λ (F23), which is Conjecture 1, never a theorem.',
294
- render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Agents</div><div class="v" id="f-n">23</div></div><div class="kpi"><div class="k">Proved (locked)</div><div class="v teal" id="f-proved">5</div><div class="d">Lean sorry-free</div></div><div class="kpi"><div class="k">\u039b (F23)</div><div class="v warn">Conjecture 1</div><div class="d">NOT a theorem</div></div></div>
295
- <div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Proof status (locked kernel)</span><span class="card-ep">/v1/puriq/formulas</span></div><div class="chartbox"><canvas id="f-donut"></canvas></div><div class="legend"><span><i style="background:#5fb3a3"></i>proved {F1,F11,F12,F18,F19}</span><span><i style="background:#c9b787"></i>open / roadmap</span><span><i style="background:#b06a5a"></i>\u039b F23 conjecture</span></div></div>
296
- <div class="card"><div class="card-h"><span class="card-t">Harness</span><span class="card-ep">live</span></div><div id="f-host"><div class="row mono dim">loading\u2026</div></div></div></div>
297
- <details class="raw"><summary>raw /v1/puriq/formulas</summary><pre class="out" id="f-out">loading…</pre></details>${HONEST}`;
298
- try{const d=await getJSON(API+'/v1/puriq/formulas');setOut('f-out',d);
299
- const n=d.summary?.n_agents||23;setTxt('f-n',n);doughnut('f-donut',['proved','open','\u039b F23'],[5,Math.max(0,n-6),1],[TEAL,GOLD,'#b06a5a']);
300
- const s=d.summary||{};setHTML('f-host',`<div class="row"><span>Agents</span><span class="spacer b-gold badge">${esc(s.n_agents??23)}</span></div><div class="row"><span>Harness baseline</span><span class="spacer mono dim">${esc(s.harness_baseline??'')}</span></div><div class="row"><span>\u039b status</span><span class="spacer badge b-err">Conjecture 1</span></div>`);}
301
- catch(e){doughnut('f-donut',['proved','open','\u039b F23'],[5,17,1],[TEAL,GOLD,'#b06a5a']);setHTML('f-host','<div class="row mono dim">Proved sorry-free: F1,F11,F12,F18,F19 (5). \u039b=F23=Conjecture 1. retry: '+esc(e.message)+'</div>');setOut('f-out','retry: '+e.message);}}},
302
- evidence:{title:'Evidence Ledger',badge:'LEAN-ANCHORED',sub:'The audit trail anchored to the lutar-lean repository: declarations, axioms, sorries, and the assertion suite — read live from the evidence endpoint.',
303
- render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Evidence</span><span class="card-ep">/v1/evidence</span></div><pre class="out" id="e-out">loading…</pre></div>${HONEST}`;
304
- try{setOut('e-out',await getJSON(API+'/v1/evidence'));}catch(e){setOut('e-out','retrying… '+e.message);}}},
305
- llm:{title:'LLM Router',badge:'5-TIER',sub:'The five-tier model roster a11oy routes through. A real model call when a key is present, an honest stub otherwise — the tier selection and Λ-receipt are always real.',
306
- render:async(c)=>{c.innerHTML=`<div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Tier throughput</span><span class="card-ep">/v1/router/stats</span></div><div class="chartbox"><canvas id="l-bars"></canvas></div></div>
307
- <div class="card"><div class="card-h"><span class="card-t">Model roster</span><span class="card-ep">/v1/llm/tiers</span></div><div id="l-host" style="max-height:300px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div></div>
308
- <details class="raw"><summary>raw /v1/llm/tiers</summary><pre class="out" id="l-out">loading…</pre></details>${HONEST}`;
309
- try{const d=await getJSON(API+'/v1/llm/tiers').catch(()=>getJSON('/api/amaru/v1/llm/tiers'));setOut('l-out',d);
310
- const tiers=d.tiers||[];setHTML('l-host','');tiers.forEach(t=>addHTML('l-host',`<div class="row"><span class="badge b-teal">T${esc(t.rank??'')}</span><span>${esc(t.id||t.model||'')}</span><span class="spacer mono dim">${esc(t.use||'')}</span></div>`));}
311
- catch(e){setHTML('l-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');setOut('l-out','retry: '+e.message);}
312
  try{const r=await getJSON(API+'/v1/router/stats');const routes=r.routes||[];barH('l-bars',routes.map(x=>x.organ+' \u00b7 '+(x.tier||'')),routes.map(x=>x.throughput||0),routes.map(x=>x.license==='GREEN'?TEAL:GOLD));}catch(e){}}},
313
- gates:{title:'Policy Gates',badge:'49 GATES',sub:'Every policy gate the orchestrator composes \u2014 each named to a Lean theorem and file. lean_status and lean_verified are reported honestly: \u201creal\u201d means a Lean theorem exists; verified=false means it is not yet sorry-free.',
314
- render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Gates</div><div class="v" id="g-count">\u2014</div></div><div class="kpi"><div class="k">Lean-verified</div><div class="v teal" id="g-ver">\u2014</div><div class="d">sorry-free</div></div><div class="kpi"><div class="k">Lean-cited</div><div class="v" id="g-cite">\u2014</div><div class="d">theorem named</div></div></div>
315
- <div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Lean status mix</span><span class="card-ep">/v1/gates</span></div><div class="chartbox"><canvas id="g-donut"></canvas></div><div class="legend"><span><i style="background:#5fb3a3"></i>verified (sorry-free)</span><span><i style="background:#c9b787"></i>cited (theorem named)</span><span><i style="background:#b06a5a"></i>phantom (no theorem)</span></div></div>
316
- <div class="card"><div class="card-h"><span class="card-t">Gate registry</span><span class="card-ep">live</span></div><div id="g-host" style="max-height:300px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div></div>${HONEST}`;window.gates_load();}},
317
- lambda:{title:'\u039b Trust Axes',badge:'13 AXES',sub:'The 13-axis trust vector and the aggregate \u039b the gate floor evaluates. \u039b is Conjecture 1 (NOT a theorem): the aggregator is one honest choice, not a uniquely-pinned function \u2014 shown via the uniqueness field.',
318
- render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">\u039b aggregate</div><div class="v teal" id="la-val">\u2014</div></div><div class="kpi"><div class="k">Floor</div><div class="v" id="la-floor">\u2014</div></div><div class="kpi"><div class="k">Gate</div><div class="v" id="la-pass">\u2014</div></div><div class="kpi"><div class="k">Uniqueness</div><div class="v warn">Conjecture 1</div></div></div>
319
- <div class="grid2">
320
- <div class="card"><div class="card-h"><span class="card-t">\u039b aggregate gauge</span><span class="card-ep">/v1/lambda</span></div><div class="gauge-wrap" style="justify-content:center"><div class="gauge"><canvas id="la-gauge"></canvas><div class="lbl"><div><div class="big" id="la-gbig">\u2014</div><div class="sm">\u039b vs floor 0.90</div></div></div></div></div></div>
321
- <div class="card"><div class="card-h"><span class="card-t">13-axis trust radar</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="la-radar"></canvas></div></div>
 
 
 
 
322
  </div>
323
- <div class="card"><div class="card-h"><span class="card-t">Per-axis scores</span></div><div class="chartbox tall"><canvas id="la-bars"></canvas></div><div id="la-host" style="margin-top:.6rem"></div></div>${HONEST}`;window.lambda_load();}},
324
- audit:{title:'Audit Log',badge:'RING BUFFER',sub:'The orchestrator\u2019s in-memory audit ring (maxlen 200, resets on rebuild \u2014 disclosed honestly). Every governed decision a11oy makes lands here; durable storage is on the tower/UDS deploy, not the HF Space.',
325
- render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="audit_load()">\u25b6 Refresh log</button></div><div class="card"><div class="card-h"><span class="card-t">Recent governed decisions</span><span class="card-ep">/v1/audit-log</span></div><pre class="out" id="o-audit">loading\u2026</pre></div>${HONEST}`;window.audit_load();}},
326
- brain:{title:'Brain \u00b7 Gate Composition',badge:'LIVE',sub:'How the orchestrating brain composes governance: the gate-composition rules, the \u039b floor, and the formula roster it draws on. This is the wiring diagram of the decision substrate, read live.',
327
- render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Brain &amp; composition</span><span class="card-ep">/v1/brain</span></div><div id="br-host"><div class="row mono dim">loading\u2026</div></div><pre class="out" id="o-brain" style="margin-top:1rem">loading\u2026</pre></div>${HONEST}`;window.brain_load();}},
328
- bounty:{title:'\u039b-Bounty \u00b7 F23',badge:'OPEN CONJECTURE',sub:'F23 (\u039b uniqueness) is an OPEN bounty \u2014 NOT a theorem. The arbiter is verify-proof CI on a PR to lambda-bounty (sole, no-bypass). Read the live conjecture statement and the receipts buffered against it.',
329
- render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Conjecture 1 (F23)</span><span class="card-ep">/api/lambda-bounty/healthz</span></div><div id="bo-host"><div class="row mono dim">loading\u2026</div></div></div>
330
- <div class="card"><div class="card-h"><span class="card-t">Submission receipts</span><span class="card-ep">/api/lambda-bounty/receipts</span></div><pre class="out" id="o-bounty">loading\u2026</pre></div>${HONEST}`;window.bounty_load();}},
331
- honest:{title:'Honest Doctrine',badge:'NO BANDAIDS',sub:'The honesty panel, served straight from the organ: the doctrine lock, the footer claims, and the honest labels. This is the single source of truth for what we do and do NOT claim \u2014 published, not marketed.',
332
- render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Doctrine lock &amp; honest labels</span><span class="card-ep">/v1/honest</span></div><div id="ho-host"><div class="row mono dim">loading\u2026</div></div><pre class="out" id="o-honest" style="margin-top:1rem">loading\u2026</pre></div>${HONEST}`;window.honest_load();}},
333
  };
334
 
335
- // superpower handlers — proven-correct contracts (from pages/superpowers.html)
336
- const ACTION={severity:'high',confidence:0.92,actionId:'superpowers-demo',witnesses:[{id:'w1',role:'op',attested:true},{id:'w2',role:'auditor',attested:true},{id:'w3',role:'witness',attested:true}]};
337
- const AXES_OK={soundness:0.95,calibration:0.92,robustness:0.95,provenance:0.93,consent:0.94,reversibility:0.91,auditability:0.90,linearity:0.93,scope_compliance:0.92};
338
- const AXES_COLLAPSE={soundness:0.0,calibration:0.90,robustness:0.95,provenance:0.90,consent:0.90,reversibility:0.90,auditability:0.88,linearity:0.93,scope_compliance:0.91};
339
- async function sp_replay(){try{const d=await postJSON(API+'/v1/receipts/replay',{action:ACTION});setOut('o-replay','VERDICT '+String(d.replay_decision||'?').toUpperCase()+' \u00b7 hash '+String(d.replay_receipt_hash||'').slice(0,16)+'\u2026\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-replay','retry: '+e.message);}}
340
- async function sp_tamper(){try{const base={action:ACTION};const r1=await postJSON(API+'/v1/receipts/replay',base);const r2=await postJSON(API+'/v1/receipts/replay',base);const r3=await postJSON(API+'/v1/receipts/replay',{action:Object.assign({},ACTION,{confidence:0.50})});const summary={baseline_hash:r1.replay_receipt_hash,repeat_hash:r2.replay_receipt_hash,tampered_hash:r3.replay_receipt_hash,repeatable:r1.replay_receipt_hash===r2.replay_receipt_hash,tamper_detected:r1.replay_receipt_hash!==r3.replay_receipt_hash};setOut('o-replay',(summary.repeatable&&summary.tamper_detected?'TAMPER DETECTED \u00b7 baseline repeatable, tampered hash differs\n\n':'')+JSON.stringify(summary,null,2));}catch(e){setOut('o-replay','retry: '+e.message);}}
341
- async function sp_lambda(col){try{const d=await postJSON(API+'/v1/lambda/score',{axes:col?AXES_COLLAPSE:AXES_OK});setOut('o-lambda',(col&&d.lambda===0?'\u039b COLLAPSED to 0 \u00b7 gate DENY \u00b7 zero-pinned\n\n':'\u039b='+d.lambda+' \u00b7 gate '+(d.gate_pass?'ALLOW':'DENY')+'\n\n')+JSON.stringify(d,null,2));}catch(e){setOut('o-lambda','retry: '+e.message);}}
342
- async function sp_fleet(){try{setOut('o-fleet',await getJSON('/v4/fleet'));}catch(e){setOut('o-fleet','retry: '+e.message);}}
343
- async function sp_mesh(){try{setOut('o-mesh',await getJSON(API+'/v1/mesh/state'));}catch(e){setOut('o-mesh','retry: '+e.message);}}
344
- // warhacker
345
- async function wh_one(key,out){try{setOut(out,'launching…');const d=await postJSON(API+'/v1/warhacker/launch/'+key,{});const o=d.organ_response||{};setOut(out,'organ: '+d.organ+' status: '+(o.status)+' http: '+(o.http_code)+'\n'+JSON.stringify(o.json||o,null,2));}catch(e){setOut(out,'retry: '+e.message);}}
 
 
346
  async function wh_all(){for(const k of ['cannonico','tychee','hangar2apps','cyber-rts','raven']){await wh_one(k,'o-'+k);}}
347
- // observability
348
- async function obs_load(){try{const d=await getJSON(API+'/v1/observability/summary');const raw=JSON.stringify(d);const m=raw.match(/"organs_reachable":\s*(\d+)/),t=raw.match(/"organs_total":\s*(\d+)/);
349
- setTxt('ok-mesh',(m?m[1]:'?')+'/'+(t?t[1]:'?'));const mr=d.mesh_reach||{};setHTML('obs-mesh','');
350
- Object.entries(mr).forEach(([k,v])=>addHTML('obs-mesh',`<div class="row"><span class="badge ${(v.status==='ok')?'b-live':'b-err'}">${esc(v.status)}</span><span>${esc(k)}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} ${esc(v.url||'')}</span></div>`));
351
- if(!Object.keys(mr).length)setHTML('obs-mesh','<div class="row mono dim">summary loaded — see KPI</div>');}catch(e){setHTML('obs-mesh','<div class="row mono dim">retry: '+e.message+'</div>');}
352
- try{const s=await getJSON(API+'/v1/observability/spans');setTxt('ok-spans',(s.spans||s.nodes||[]).length||s.signed_spans||'—');setTxt('ok-chain',s.chain_verified?'YES':(s.chain_verified===false?'no':'—'));setOut('obs-spans',s);}catch(e){setOut('obs-spans','retry: '+e.message);}}
353
- // wires
354
- async function wires_load(){try{const d=await getJSON(API+'/v1/mesh/state');const w=d.wires||{};setHTML('wires-host','');
355
- Object.entries(w).forEach(([k,v])=>addHTML('wires-host',`<div class="card"><div class="card-h"><span class="badge b-teal">Wire ${k}</span><span class="card-t">${esc(v.edge)}</span><span class="spacer badge ${String(v.status).includes('PROCESS')?'b-gold':'b-live'}">${esc(v.status)}</span></div><div class="mono" style="font-size:11.5px;color:var(--paragraph)">${esc(v.detail)}</div></div>`));}catch(e){setHTML('wires-host','<div class="row mono dim">retry: '+e.message+'</div>');}}
356
- // mesh
357
  async function mesh_load(){
358
- try{const d=await getJSON(API+'/v1/observability/summary');const mrArr=Object.values(d.mesh_reach||{});
359
- const names=['a11oy','sentra','amaru','rosie','killinchu'];
360
- const nodes=[{id:'a11oy',name:'a11oy (orchestrator)',color:GOLD,val:14}];
361
- const links=[];
362
- mrArr.forEach((p,i)=>{const nm=names[i]||('organ'+i);if(nm==='a11oy')return;const up=p.status==='ok';
363
- nodes.push({id:nm,name:nm+(up?' \u00b7 ok '+(p.latency_ms?Math.round(p.latency_ms)+'ms':''):' \u00b7 unreachable'),color:up?TEAL:'#b06a5a',val:7});
364
- links.push({source:'a11oy',target:nm});});
365
- mesh3d('mesh-3d',nodes,links);
366
- }catch(e){const h=el('mesh-3d');if(h)h.innerHTML='<div class="row mono dim" style="padding:1rem">graph retry: '+esc(e.message)+'</div>';}
367
- try{const d=await getJSON(API+'/v1/observability/summary');const mr=d.mesh_reach||{};setHTML('mesh-host','');
368
- if(!Object.keys(mr).length){setHTML('mesh-host','<pre class="out">'+esc(JSON.stringify(d,null,2))+'</pre>');return;}
369
- Object.entries(mr).forEach(([k,v])=>addHTML('mesh-host',`<div class="row"><span class="badge ${(v.status==='ok')?'b-live':'b-err'}">${esc(v.status)}</span><span>${esc(k)}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} · ${esc(v.url||'')}</span></div>`));}catch(e){setHTML('mesh-host','<div class="row mono dim">retry: '+e.message+'</div>');}}
370
-
371
- // ===== expanded orchestrator handlers (all live endpoints) =====
372
- async function fleet_load(){
373
- try{const d=await getJSON(API+'/v1/observability/summary');const mr=d.mesh_reach||{};const arr=Object.values(mr);let ok=0;setHTML('fl-reach-host','');
374
- arr.forEach(v=>{const up=v.status==='ok';if(up)ok++;addHTML('fl-reach-host',`<div class="row"><span class="badge ${up?'b-live':'b-err'}">${esc(v.status||'?')}</span><span>${esc(v.organ||v.name||v.url||'organ')}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} ${esc(v.url||'')}</span></div>`);});
375
- setTxt('fl-reach',arr.length?ok+'/'+arr.length:'\u2014');}catch(e){setHTML('fl-reach-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
376
- try{const d=await getJSON('/v4/fleet');setTxt('fl-doc',d.doctrine?.version||d.doctrine||'v11');const peers=d.peers||[];setHTML('fl-reg','');
377
- peers.forEach(p=>{const doc=p.doctrine?(`v${p.doctrine.version||p.doctrine}`):'';const st=(p.status||'').toLowerCase();const up=st==='ok'||st==='reachable';
378
- addHTML('fl-reg',`<div class="row"><span class="badge ${up?'b-live':'b-gold'}">${esc(p.flagship||p.name||'organ')}</span><span class="mono dim">${esc(p.status||'')}</span><span class="spacer mono dim">${esc(doc)} ${esc(p.error||'')}</span></div>`);});
379
- if(!peers.length)setHTML('fl-reg','<div class="row mono dim">registry empty</div>');
380
- addHTML('fl-reg',`<div class="row"><span class="mono dim">Note: /v4/fleet probes from inside the Space (Space\u2192Space network-isolated on HF, so it can read \u201cunreachable\u201d). The live reachability above uses public-URL probes \u2014 the honest 5/5 number.</span></div>`);}catch(e){setHTML('fl-reg','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
381
- }
382
- async function reason_run(query,severity){try{setOut('o-reason','reasoning\u2026');const d=await postJSON(API+'/v1/reason',{query,severity,context:'a11oy app'});setOut('o-reason','GATE '+esc(d.gate||'?')+' \u00b7 severity '+esc(d.severity_evaluated||severity)+'\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-reason','retry: '+e.message);}}
383
- async function mcp_list(){try{const d=await getJSON(API+'/v1/mcp/tools');setHTML('mcp-list','');(d.tools||[]).forEach(t=>addHTML('mcp-list',`<div class="row"><span class="badge b-teal">${esc(t.name)}</span><span>${esc(t.description||'')}</span><span class="spacer mono dim">${esc(t.flagship||'')}</span></div>`));}catch(e){setHTML('mcp-list','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
384
- async function mcp_call(name){try{setOut('o-mcp','invoking '+name+'\u2026');
385
- const args = name==='lambda_score'?{axes:AXES_OK}
386
- : name==='a11oy_gate'?{action:ACTION}
387
- : name==='khipu_sign'?{payload:{actionId:'mcp-demo',severity:'high'}}
388
- : {receipt:{actionId:'mcp-demo'}};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
389
  const d=await postJSON(API+'/v1/mcp/call',{name,arguments:args});setOut('o-mcp','TOOL '+esc(d.tool||name)+' \u00b7 '+esc(d.status||'')+' \u00b7 kernel '+esc(d.kernel_commit||'')+'\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-mcp','retry: '+e.message);}}
390
- async function gates_load(){try{const d=await getJSON(API+'/v1/gates');const g=d.gates||[];setTxt('g-count',d.count||g.length);
391
- const ver=g.filter(x=>x.lean_verified===true).length;const cite=g.filter(x=>x.lean_theorem&&x.lean_verified!==true).length;const phantom=g.length-ver-cite;setTxt('g-ver',ver);setTxt('g-cite',g.filter(x=>x.lean_theorem).length);
392
- doughnut('g-donut',['verified','cited','phantom'],[ver,cite,Math.max(0,phantom)],[TEAL,GOLD,'#b06a5a']);
393
- setHTML('g-host','');g.slice(0,60).forEach(x=>{const v=x.lean_verified===true;addHTML('g-host',`<div class="row"><span class="badge ${v?'b-live':'b-gold'}">${v?'VERIFIED':(x.lean_status||'real')}</span><span>${esc(x.name)}</span><span class="spacer mono dim">${esc(x.lean_theorem||'')}</span></div>`);});
394
- addHTML('g-host',`<div class="row"><span class="mono dim">Honest: \u201creal\u201d = a Lean theorem is named; \u201cVERIFIED\u201d = sorry-free. Most gates cite a theorem; few are sorry-free yet \u2014 shown truthfully.</span></div>`);}catch(e){setHTML('g-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
395
- async function lambda_load(){try{const d=await getJSON(API+'/v1/lambda');const L=d.lambda||0;setTxt('la-val',L.toFixed?L.toFixed(4):L);setTxt('la-floor',d.lambda_floor??'\u2014');setTxt('la-pass',d.pass?'ALLOW':(d.pass===false?'DENY':'\u2014'));
396
- const axes=d.axes||[];const labels=axes.map(a=>a.name);const vals=axes.map(a=>a.score||0);
397
- gauge('la-gauge',L,'\u039b',L>=(d.lambda_floor||0.9)?TEAL:'#b06a5a');setTxt('la-gbig',(L.toFixed?L.toFixed(3):L));
398
- radar('la-radar',labels,vals);
399
- barH('la-bars',labels,vals,vals.map(v=>v>=0.9?TEAL:(v>=0.7?GOLD:'#b06a5a')));
400
- setHTML('la-host','<details class="raw"><summary>raw /v1/lambda</summary><pre class="out">'+esc(JSON.stringify(d,null,2))+'</pre></details>');}catch(e){setHTML('la-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
401
- async function audit_load(){try{const d=await getJSON(API+'/v1/audit-log');const e=d.entries||[];setOut('o-audit',e.length?JSON.stringify(d,null,2):'Audit ring is empty (total_buffered '+(d.total_buffered??0)+'). '+(d.note||'')+'\n\nRun a Superpower or Reasoner action, then refresh \u2014 governed decisions append here.');}catch(e){setOut('o-audit','retry: '+e.message);}}
402
- async function brain_load(){try{const d=await getJSON(API+'/v1/brain');const b=d.brain||{};setHTML('br-host','');
403
- addHTML('br-host',`<div class="row"><span>Role</span><span class="spacer b-gold badge">${esc(b.role||'')}</span></div>`);
404
- addHTML('br-host',`<div class="row"><span>\u039b floor</span><span class="spacer b-teal badge">${esc(b.lambda_floor??'')}</span></div>`);
405
- const gc=b.gate_composition||{};addHTML('br-host',`<div class="row"><span>Policy gates</span><span class="spacer b-gold badge">${esc(gc.policy_gates??'')}</span></div>`);
406
- addHTML('br-host',`<div class="row"><span>Anchor-formula gates</span><span class="spacer b-gold badge">${esc(gc.anchor_formula_gates??'')}</span></div>`);
407
- setOut('o-brain',d);}catch(e){setHTML('br-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
408
- async function bounty_load(){try{const d=await getJSON('/api/lambda-bounty/healthz');const cj=d.conjecture||{};setHTML('bo-host','');
409
- addHTML('bo-host',`<div class="row"><span class="badge b-err">${esc(cj.status||'OPEN')}</span><span>${esc(cj.id||'Conjecture 1')} \u00b7 ${esc(cj.formula||'F23')}</span></div>`);
410
- addHTML('bo-host',`<div class="row"><span class="mono" style="font-size:11.5px;color:var(--paragraph)">${esc(cj.statement||'')}</span></div>`);
411
- addHTML('bo-host',`<div class="row"><span>Arbiter</span><span class="spacer mono dim">${esc(cj.arbiter||'')}</span></div>`);
412
- addHTML('bo-host',`<div class="row"><span>Receipts buffered</span><span class="spacer b-gold badge">${esc(d.receipts_buffered??0)}</span></div>`);}catch(e){setHTML('bo-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
413
- try{const resp=await fetch('/api/lambda-bounty/receipts');const txt=(await resp.text()).trim();
414
- if(!txt){setOut('o-bounty','No submission receipts yet \u2014 the bounty is OPEN. A valid Lean proof on a PR to szl-holdings/lambda-bounty (verify-proof CI, no-bypass) is the only way to close Conjecture 1. The intake endpoint is live (HTTP '+resp.status+', application/x-ndjson) and currently holds 0 receipts \u2014 shown honestly.');}
415
- else{const rows=txt.split(/\n+/).map(l=>{try{return JSON.parse(l);}catch(_){return l;}});setOut('o-bounty',rows);}}
416
- catch(e){setOut('o-bounty','Intake live; no receipts buffered yet (bounty open). '+e.message);}}
417
  async function honest_load(){try{const d=await getJSON(API+'/v1/honest');const dl=d.doctrine_lock||{};setHTML('ho-host','');
418
- addHTML('ho-host',`<div class="row"><span>Doctrine</span><span class="spacer b-gold badge">${esc(dl.doctrine||'v11')} \u00b7 ${esc(dl.state||'LOCKED')}</span></div>`);
419
- addHTML('ho-host',`<div class="row"><span>Kernel</span><span class="spacer mono dim">${esc(dl.declarations||749)} decls / ${esc(dl.axioms||14)} axioms / ${esc(dl.sorries||163)} sorries \u00b7 ${esc(dl.commit||'c7c0ba17')}</span></div>`);
420
- addHTML('ho-host',`<div class="row"><span>\u039b</span><span class="spacer badge b-err">${esc(dl.lambda||'Conjecture 1')}</span></div>`);
 
421
  setOut('o-honest',d);}catch(e){setHTML('ho-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
422
 
423
  function go(view){
 
128
  <div class="topbar">
129
  <button class="menu-btn" onclick="document.querySelector('.side').classList.toggle('open')">☰</button>
130
  <span>SZL HOLDINGS</span><span class="sep">/</span>
131
+ <span style="color:var(--teal)">a11oy</span><span class="sep">/</span>
132
+ <span>GOVERNED-AI COMMAND PLATFORM</span><span class="sep">/</span>
133
+ <span class="live"><span class="live-dot"></span>LIVE</span>
134
+ <nav class="switcher" aria-label="Surfaces">
135
+ <span class="lbl">SURFACES</span>
136
+ <a class="flag active" href="https://szlholdings-a11oy.hf.space/">Command Platform</a>
137
+ <a class="flag" href="https://szlholdings-killinchu.hf.space/elite">Drones &amp; Vessels</a>
 
 
 
138
  </nav>
139
  </div>
140
 
 
143
  <div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
144
  <div class="nav-group">Operate</div>
145
  <div class="nav-item active" data-view="command" onclick="go('command')"><span class="ico">◎</span>Command Center</div>
146
+ <div class="nav-item" data-view="ask" onclick="go('ask')"><span class="ico">✦</span>Ask &amp; Act</div>
147
+ <div class="nav-item" data-view="demo" onclick="go('demo')"><span class="ico">⊞</span>Run a Demo</div>
148
+ <div class="nav-item" data-view="fleet" onclick="go('fleet')"><span class="ico">⊟</span>System Health</div>
149
+ <div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Live System Map</div>
150
+ <div class="nav-group">Decide &amp; Govern</div>
151
+ <div class="nav-item" data-view="lambda" onclick="go('lambda')"><span class="ico">◔</span>Trust Score</div>
152
+ <div class="nav-item" data-view="gates" onclick="go('gates')"><span class="ico">⊠</span>Safety Gates</div>
153
+ <div class="nav-item" data-view="feed" onclick="go('feed')"><span class="ico">∿</span>Live Decisions</div>
154
+ <div class="nav-item" data-view="readiness" onclick="go('readiness')"><span class="ico">✓</span>Readiness</div>
155
+ <div class="nav-item" data-view="compliance" onclick="go('compliance')"><span class="ico">§</span>Compliance</div>
156
+ <div class="nav-item" data-view="forecast" onclick="go('forecast')"><span class="ico">↗</span>Forecast</div>
157
+ <div class="nav-group">Prove &amp; Verify</div>
158
+ <div class="nav-item" data-view="receipts" onclick="go('receipts')"><span class="ico">⎙</span>Signed Receipts</div>
159
+ <div class="nav-item" data-view="formulas" onclick="go('formulas')"><span class="ico">ƒ</span>Proof &amp; Formulas</div>
160
+ <div class="nav-item" data-view="threats" onclick="go('threats')"><span class="ico">☠</span>Threat Library</div>
161
+ <div class="nav-group">Models &amp; Tools</div>
162
+ <div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>Model Router</div>
163
+ <div class="nav-item" data-view="mcp" onclick="go('mcp')"><span class="ico">⚙</span>Agent Tools</div>
164
+ <div class="nav-item" data-view="honest" onclick="go('honest')"><span class="ico">⊘</span>What We Claim</div>
165
+ <div class="side-foot">Trust score = research conjecture<br>5 formulas formally proven<br>SLSA Build L2 · 5 services<br>Verifiable receipts · honest by design</div>
166
  </aside>
167
 
168
  <main class="content" id="content"><div class="view-sub">loading…</div></main>
 
170
 
171
  <script>
172
  const API='/api/a11oy';
173
+ // Sibling organs — folded into this ONE app. Browser fetches their PUBLIC URLs directly (CORS open).
174
+ const ORG={sentra:'https://szlholdings-sentra.hf.space',amaru:'https://szlholdings-amaru.hf.space',rosie:'https://szlholdings-rosie.hf.space',killinchu:'https://szlholdings-killinchu.hf.space'};
175
  async function getJSON(p){const r=await fetch(p);if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
176
+ async function orgGet(organ,path){const r=await fetch(ORG[organ]+path);if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
177
+ async function orgPost(organ,path,body){const r=await fetch(ORG[organ]+path,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body||{})});if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
178
  async function postJSON(p,b){const r=await fetch(p,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(b||{})});if(!r.ok)throw new Error('HTTP '+r.status);return r.json();}
179
  function esc(s){return String(s==null?'':s).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));}
180
  function el(id){return document.getElementById(id);}
 
209
  .showNavInfo(false);
210
  setTimeout(()=>{try{_fg.width(host.clientWidth).height(host.clientHeight);}catch(e){}},300);}catch(e){host.innerHTML='<div class="row mono dim" style="padding:1rem">3D init: '+e.message+'</div>';}}
211
 
212
+ const HONEST='<div class="honesty"><b>How to read this.</b> Every panel reads a live service \u2014 no mock data. The trust score is a research conjecture, not a proven theorem. Five formulas are formally proven; the rest are open. Builds are SLSA Level 2 (not L3/FedRAMP/Iron Bank). Audit receipts are cryptographically signed where a key is present, and honestly marked unsigned otherwise.</div>';
213
+ const FLOOR=0.9;
214
 
215
  const VIEWS={
216
+ command:{title:'Command Center',badge:'LIVE',sub:'One pane of glass over the whole governed-AI platform \u2014 live service health, the connected system map, trust posture, and a verifiable audit trail.',
217
+ render:async(c)=>{c.innerHTML=`<div class="kpis">
218
+ <div class="kpi"><div class="k">Services up</div><div class="v live" id="k-fleet">probing\u2026</div><div class="d">live health probe</div></div>
219
+ <div class="kpi"><div class="k">Connections</div><div class="v teal" id="k-wires">\u2014</div><div class="d">cross-service links</div></div>
220
+ <div class="kpi"><div class="k">Trust score</div><div class="v teal" id="k-lam">\u2014</div><div class="d">vs floor 0.90</div></div>
221
+ <div class="kpi"><div class="k">Decisions today</div><div class="v" id="k-dec">\u2014</div><div class="d">governed + logged</div></div>
222
+ <div class="kpi"><div class="k">Build security</div><div class="v teal">SLSA L2</div><div class="d">all services</div></div></div>
223
+ <div class="grid2">
224
+ <div class="card"><div class="card-h"><span class="card-t">Trust posture</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="cmd-radar"></canvas></div></div>
225
+ <div class="card"><div class="card-h"><span class="card-t">Safety gate posture</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="cmd-gates"></canvas></div><div class="legend"><span><i style="background:#5fb3a3"></i>allow-capable</span><span><i style="background:#b06a5a"></i>deny-by-default</span></div></div>
226
+ </div>
227
+ <div class="card"><div class="card-h"><span class="card-t">Service health</span><span class="card-ep">live probe</span></div><div id="cmd-fleet"><div class="row mono dim">probing 5 services\u2026</div></div></div>${HONEST}`;
228
+ // instant: trust radar (this service)
229
+ try{const d=await getJSON(API+'/v1/lambda');const ax=d.axes||[];radar('cmd-radar',ax.map(a=>a.name),ax.map(a=>a.score||0));setTxt('k-lam',(d.lambda||0).toFixed?d.lambda.toFixed(3):d.lambda);}catch(e){}
230
+ // safety gates posture (sentra, fast)
231
+ try{const g=await orgGet('sentra','/api/sentra/v1/gates');const gs=g.gates||[];const deny=gs.filter(x=>x.expectedDecision==='deny').length;doughnut('cmd-gates',['allow-capable','deny-by-default'],[gs.length-deny,deny],[TEAL,'#b06a5a']);}catch(e){}
232
+ // live service probe (slower) non-blocking
233
+ getJSON(API+'/v1/observability/summary').then(d=>{const mr=Object.values(d.mesh_reach||{});let ok=0;const names=['a11oy','sentra','amaru','rosie','killinchu'];setHTML('cmd-fleet','');
234
+ mr.forEach((p,i)=>{const up=p.status==='ok';if(up)ok++;addHTML('cmd-fleet',`<div class="row"><span class="badge ${up?'b-live':'b-err'}">${up?'UP':'DOWN'}</span><span>${esc(names[i]||'service')}</span><span class="spacer mono dim">${p.latency_ms?Math.round(p.latency_ms)+'ms':''}</span></div>`);});
235
+ setTxt('k-fleet',mr.length?ok+'/'+mr.length:'\u2014');}).catch(()=>setTxt('k-fleet','\u2014'));
236
+ try{const m=await getJSON(API+'/v1/mesh/state');setTxt('k-wires',Object.keys(m.wires||{}).length);}catch(e){}
237
+ try{const f=await orgGet('sentra','/api/sentra/v1/verdict/feed?limit=50');setTxt('k-dec',f.total_buffered??(f.verdicts||[]).length);}catch(e){}
 
 
 
 
 
 
 
238
  }},
239
+
240
+ ask:{title:'Ask & Act',badge:'OPERATOR',sub:'Ask the platform a question and get a grounded, cited answer \u2014 it answers only from live system data and refuses to make things up. Then approve or deny an action; every action is logged to a signed, tamper-evident audit trail.',
241
+ render:(c)=>{c.innerHTML=`<div class="grid2">
242
+ <div class="card"><div class="card-h"><span class="card-t">Ask the operator</span><span class="card-ep">grounded + cited</span></div>
243
+ <div class="btns"><button class="btn teal" onclick="ask_q('Which services are live right now?')">Which services are live?</button><button class="btn" onclick="ask_q('What is the current trust score?')">Current trust score?</button><button class="btn" onclick="ask_q('Is the 3-of-4 consensus permitted?')">Consensus status?</button></div>
244
+ <pre class="out" id="o-ask">\u2014 pick a question \u2014</pre></div>
245
+ <div class="card"><div class="card-h"><span class="card-t">Approve / deny an action</span><span class="card-ep">signed audit</span></div>
246
+ <div class="btns"><button class="btn teal" onclick="act_do('approve')">Approve</button><button class="btn" onclick="act_do('deny')">Deny</button><button class="btn" onclick="act_do('acknowledge')">Acknowledge</button></div>
247
+ <pre class="out" id="o-act">\u2014 emit an action \u2014</pre></div>
248
+ </div>
249
+ <div class="card"><div class="card-h"><span class="card-t">What needs attention</span><span class="card-ep">live findings</span></div><div class="chartbox" style="height:200px"><canvas id="ask-rec"></canvas></div><div id="ask-rec-list"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;
250
+ window.ask_recs();}},
251
+
252
+ demo:{title:'Run a Demo',badge:'5 SCENARIOS',sub:'The platform is the single launch point for the Warhacker challenge problems. Each launch calls the live service for that problem, shows its real answer, and records a signed receipt of the decision.',
253
+ render:(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="wh_all()">\u25b6 Launch all 5</button></div><div id="wh"></div>${HONEST}`;
254
+ const probs=[['P1','cannonico','AI-drone oversight','Drones & Vessels'],['P2','tychee','Air-gapped satellite governance','Policy'],['P3','hangar2apps','Deployment readiness','Readiness'],['P4','cyber-rts','Anomaly triage','Reasoning'],['P5','raven','Edge AI mesh','Platform']];
255
+ el('wh').innerHTML=probs.map(([id,key,t,o])=>`<div class="card"><div class="card-h"><span class="badge b-teal">${id}</span><span class="card-t">${t}</span><span class="card-ep">handled by: ${o}</span></div><div class="btns"><button class="btn" onclick="wh_one('${key}','o-${key}')">\u25b6 Launch</button></div><pre class="out" id="o-${key}">\u2014 click to launch \u2014</pre></div>`).join('');}},
256
+
257
+ fleet:{title:'System Health',badge:'5 SERVICES',sub:'Live reachability of every service behind the platform \u2014 real probe, real latency. A service that is down shows honestly, never faked green.',
258
+ render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="fleet_load()">\u25b6 Re-probe</button></div>
259
+ <div class="kpis"><div class="kpi"><div class="k">Up</div><div class="v live" id="fl-reach">probing\u2026</div></div><div class="kpi"><div class="k">Build security</div><div class="v teal">SLSA L2</div></div><div class="kpi"><div class="k">Trust score</div><div class="v teal">research conjecture</div><div class="d">not a theorem</div></div></div>
260
+ <div class="card"><div class="card-h"><span class="card-t">Live reachability</span><span class="card-ep">public-URL probe</span></div><div id="fl-reach-host"><div class="row mono dim">probing\u2026</div></div></div>${HONEST}`;window.fleet_load();}},
261
+
262
+ mesh:{title:'Live System Map',badge:'3D',sub:'The platform and its services as one connected organism. The command platform sits at the core; each service is a node; every link is a live, conserved connection. Node color reflects the live health probe \u2014 down is shown honestly.',
263
+ render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="mesh_load()">\u25b6 Re-probe + rebuild</button></div>
264
+ <div class="card"><div class="card-h"><span class="card-t">Connected system \u2014 live 3D</span><span class="card-ep">drag to orbit</span></div><div class="graph3d" id="mesh-3d"></div></div>
265
+ <div class="card"><div class="card-h"><span class="card-t">Reachability detail</span><span class="card-ep">live</span></div><div id="mesh-host"><div class="row mono dim">probing\u2026</div></div></div>${HONEST}`;window.mesh_load();}},
266
+
267
+ lambda:{title:'Trust Score',badge:'13 CHECKS',sub:'Before any high-consequence action, the platform scores it across 13 trust dimensions and requires the combined score to clear a floor of 0.90. The score is honest about its own status: it is a research conjecture, not a proven-unique function.',
268
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Trust score</div><div class="v teal" id="la-val">\u2014</div></div><div class="kpi"><div class="k">Floor</div><div class="v" id="la-floor">0.90</div></div><div class="kpi"><div class="k">Decision</div><div class="v" id="la-pass">\u2014</div></div><div class="kpi"><div class="k">Status</div><div class="v warn">research conjecture</div></div></div>
269
  <div class="grid2">
270
+ <div class="card"><div class="card-h"><span class="card-t">Combined score</span><span class="card-ep">live</span></div><div class="gauge-wrap" style="justify-content:center"><div class="gauge"><canvas id="la-gauge"></canvas><div class="lbl"><div><div class="big" id="la-gbig">\u2014</div><div class="sm">vs floor 0.90</div></div></div></div></div></div>
271
+ <div class="card"><div class="card-h"><span class="card-t">13 trust dimensions</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="la-radar"></canvas></div></div>
272
+ </div>
273
+ <div class="card"><div class="card-h"><span class="card-t">Per-dimension scores</span></div><div class="chartbox tall"><canvas id="la-bars"></canvas></div><div id="la-host" style="margin-top:.6rem"></div></div>${HONEST}`;window.lambda_load();}},
274
+
275
+ gates:{title:'Safety Gates',badge:'8 GATES',sub:'Eight deny-by-default safety gates inspect every action for dangerous signals (injection, unsafe commands, banned vendors, and more). Anything suspicious is blocked before it runs.',
276
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Gates</div><div class="v" id="g-count">\u2014</div></div><div class="kpi"><div class="k">Deny-by-default</div><div class="v warn" id="g-deny">\u2014</div></div><div class="kpi"><div class="k">Categories</div><div class="v teal" id="g-cat">\u2014</div></div></div>
277
+ <div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Gate posture</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="g-donut"></canvas></div></div>
278
+ <div class="card"><div class="card-h"><span class="card-t">Try it \u2014 inspect an action</span><span class="card-ep">live decision</span></div><div class="btns"><button class="btn" onclick="gate_try('DROP TABLE users')">Malicious payload</button><button class="btn teal" onclick="gate_try('summarize todays telemetry')">Benign request</button></div><pre class="out" id="g-try">\u2014 try an action \u2014</pre></div></div>
279
+ <div class="card"><div class="card-h"><span class="card-t">The 8 gates</span></div><div id="g-host" style="max-height:280px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.gates_load();}},
280
+
281
+ feed:{title:'Live Decisions',badge:'STREAMING',sub:'A running feed of allow/deny decisions the safety system has made, each with the signals that drove it. This is the platform proving it is alive and governing in real time.',
282
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Decisions buffered</div><div class="v" id="fd-n">\u2014</div></div><div class="kpi"><div class="k">Denied</div><div class="v warn" id="fd-deny">\u2014</div></div><div class="kpi"><div class="k">Allowed</div><div class="v live" id="fd-allow">\u2014</div></div></div>
283
+ <div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Allow vs deny</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="fd-donut"></canvas></div></div>
284
+ <div class="card"><div class="card-h"><span class="card-t">Recent decisions</span><span class="card-ep">live feed</span></div><div id="fd-host" style="max-height:280px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div></div>${HONEST}`;window.feed_load();}},
285
+
286
+ readiness:{title:'Readiness',badge:'GO / NO-GO',sub:'A deployment-readiness check: the platform scores a subject against required criteria and returns a clear Go, Needs-Review, or No-Go verdict \u2014 with every gap named.',
287
+ render:(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Run a readiness check</span><span class="card-ep">live</span></div>
288
+ <div class="btns"><button class="btn teal" onclick="readiness_run()">\u25b6 Assess a sample subject</button></div>
289
+ <div class="grid2" style="margin-top:1rem"><div class="chartbox" style="height:220px"><canvas id="rd-donut"></canvas></div><div id="rd-host"><div class="row mono dim">click assess\u2026</div></div></div></div>${HONEST}`;}},
290
+
291
+ compliance:{title:'Compliance',badge:'EVIDENCE',sub:'Map the platform\u2019s controls to a recognized framework (NIST, STIG, ISO 27001) and show coverage \u2014 each control backed by an evidence hash. Audit-ready, with no third-party audit claimed.',
292
+ render:(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Compliance coverage</span><span class="card-ep">live</span></div>
293
+ <div class="btns"><button class="btn teal" onclick="comp_run('NIST')">NIST</button><button class="btn" onclick="comp_run('STIG')">STIG</button><button class="btn" onclick="comp_run('ISO27001')">ISO 27001</button></div>
294
+ <div class="grid2" style="margin-top:1rem"><div class="chartbox" style="height:220px"><canvas id="cp-donut"></canvas></div><div id="cp-host"><div class="row mono dim">pick a framework\u2026</div></div></div></div>${HONEST}`;}},
295
+
296
+ forecast:{title:'Forecast',badge:'WITH ERROR BAND',sub:'A witnessed forecast that returns a prediction together with an honest confidence band. The underlying math is partially formally verified \u2014 we say so plainly rather than overclaiming.',
297
+ render:(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Run a forecast</span><span class="card-ep">live</span></div>
298
+ <div class="btns"><button class="btn teal" onclick="forecast_run(0.5,8)">Forecast (input 0.5)</button><button class="btn" onclick="forecast_run(0.8,8)">Forecast (input 0.8)</button></div>
299
+ <div class="chartbox" style="margin-top:1rem"><canvas id="fc-line"></canvas></div><div id="fc-host" style="margin-top:.6rem"></div></div>${HONEST}`;}},
300
+
301
+ receipts:{title:'Signed Receipts',badge:'VERIFY YOURSELF',sub:'Every governed decision can produce a cryptographically signed, tamper-evident receipt that anyone can verify offline \u2014 no trust in us required. This is the core differentiator: no market leader signs individual AI decisions.',
302
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Receipts (platform)</div><div class="v" id="rc-n">\u2014</div></div><div class="kpi"><div class="k">Chain</div><div class="v teal" id="rc-chain">\u2014</div></div><div class="kpi"><div class="k">Offline-verifiable</div><div class="v live">yes</div><div class="d">drones service has a real key</div></div></div>
303
+ <div class="card"><div class="card-h"><span class="card-t">Receipt activity</span><span class="card-ep">live</span></div><div class="chartbox" style="height:200px"><canvas id="rc-line"></canvas></div></div>
304
+ <div class="card"><div class="card-h"><span class="card-t">Audit trail</span><span class="card-ep">hash-chained</span></div><div id="rc-host"><div class="row mono dim">loading\u2026</div></div></div>
305
+ <div class="honesty"><b>Verify it yourself.</b> The Drones &amp; Vessels service signs receipts with a real key. Fetch its public key at <span class="mono">/cosign.pub</span> and a receipt at <span class="mono">/api/killinchu/v1/receipt/export</span>, then verify the signature offline with cosign/openssl \u2014 a tampered byte fails. Other services honestly mark receipts unsigned where no key is wired.</div>`;window.receipts_load();}},
306
+
307
+ formulas:{title:'Proof & Formulas',badge:'HONEST',sub:'The math behind the platform. Five formulas are formally proven in Lean (machine-checked, no gaps). The rest are open or experimental. The trust-score uniqueness claim is an open research conjecture \u2014 never presented as a theorem.',
308
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Formula agents</div><div class="v" id="f-n">23</div></div><div class="kpi"><div class="k">Formally proven</div><div class="v teal">5</div><div class="d">machine-checked</div></div><div class="kpi"><div class="k">Trust-score uniqueness</div><div class="v warn">open conjecture</div></div></div>
309
+ <div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Proof status</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="f-donut"></canvas></div><div class="legend"><span><i style="background:#5fb3a3"></i>proven (5, locked)</span><span><i style="background:#c9b787"></i>open / roadmap</span><span><i style="background:#b06a5a"></i>conjecture</span></div></div>
310
+ <div class="card"><div class="card-h"><span class="card-t">Lean evidence</span><span class="card-ep">live</span></div><div id="f-host"><div class="row mono dim">loading\u2026</div></div></div></div>
311
+ <details class="raw"><summary>raw formula registry</summary><pre class="out" id="f-out">loading\u2026</pre></details>${HONEST}`;window.formulas_load();}},
312
+
313
+ threats:{title:'Threat Library',badge:'30 PATTERNS',sub:'The known attack patterns behind the safety gates \u2014 each tagged with severity, MITRE ATT&CK technique, and a CVSS score. This is the intelligence the platform screens every action against.',
314
+ render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Patterns</div><div class="v" id="th-n">\u2014</div></div><div class="kpi"><div class="k">Critical</div><div class="v warn" id="th-crit">\u2014</div></div><div class="kpi"><div class="k">High</div><div class="v" id="th-high">\u2014</div></div></div>
315
+ <div class="card"><div class="card-h"><span class="card-t">By severity</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="th-bars"></canvas></div></div>
316
+ <div class="card"><div class="card-h"><span class="card-t">Pattern list</span><span class="card-ep">live</span></div><div id="th-host" style="max-height:260px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.threats_load();}},
317
+
318
+ llm:{title:'Model Router',badge:'5-TIER',sub:'The platform routes each task to the right model tier by cost and capability. A real model call when a key is present, an honest stub otherwise \u2014 the tier choice and the trust receipt are always real.',
319
+ render:async(c)=>{c.innerHTML=`<div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Tier throughput</span><span class="card-ep">live</span></div><div class="chartbox"><canvas id="l-bars"></canvas></div></div>
320
+ <div class="card"><div class="card-h"><span class="card-t">Model roster</span><span class="card-ep">live</span></div><div id="l-host" style="max-height:300px;overflow-y:auto"><div class="row mono dim">loading\u2026</div></div></div></div>
321
+ <details class="raw"><summary>raw tiers</summary><pre class="out" id="l-out">loading\u2026</pre></details>${HONEST}`;
322
+ try{const d=await getJSON(API+'/v1/llm/tiers').catch(()=>orgGet('amaru','/api/amaru/v1/llm/tiers'));setOut('l-out',d);const tiers=d.tiers||[];setHTML('l-host','');tiers.forEach(t=>addHTML('l-host',`<div class="row"><span class="badge b-teal">T${esc(t.rank??'')}</span><span>${esc(t.id||t.model||'')}</span><span class="spacer mono dim">${esc(t.use||'')}</span></div>`));}catch(e){setHTML('l-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
 
323
  try{const r=await getJSON(API+'/v1/router/stats');const routes=r.routes||[];barH('l-bars',routes.map(x=>x.organ+' \u00b7 '+(x.tier||'')),routes.map(x=>x.throughput||0),routes.map(x=>x.license==='GREEN'?TEAL:GOLD));}catch(e){}}},
324
+
325
+ mcp:{title:'Agent Tools',badge:'LIVE',sub:'The tools the platform exposes to AI agents over the Model Context Protocol. Read the registry, then actually invoke a tool \u2014 every call returns a real, doctrine-stamped response.',
326
+ render:async(c)=>{c.innerHTML=`<div class="grid2"><div class="card"><div class="card-h"><span class="card-t">Tools available</span><span class="card-ep">live</span></div><div class="chartbox" style="height:220px"><canvas id="mcp-bar"></canvas></div></div>
327
+ <div class="card"><div class="card-h"><span class="card-t">Invoke a tool</span><span class="card-ep">live call</span></div><div class="btns"><button class="btn teal" onclick="mcp_call('lambda_score')">Score trust</button><button class="btn" onclick="mcp_call('a11oy_gate')">Run gate</button><button class="btn" onclick="mcp_call('khipu_sign')">Sign receipt</button><button class="btn" onclick="mcp_call('khipu_verify')">Verify receipt</button></div><pre class="out" id="o-mcp">\u2014 invoke \u2014</pre></div></div>
328
+ <div class="card"><div class="card-h"><span class="card-t">Registry</span></div><div id="mcp-list"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.mcp_list();}},
329
+
330
+ honest:{title:'What We Claim',badge:'NO BANDAIDS',sub:'The single source of truth for what this platform does and does NOT claim \u2014 published, not marketed. If it is not proven, we say so.',
331
+ render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Honest claims</span><span class="card-ep">live</span></div><div id="ho-host"><div class="row mono dim">loading\u2026</div></div></div>
332
+ <div class="card"><div class="card-h"><span class="card-t">What we do NOT claim</span></div>
333
+ <div class="row"><span class="badge b-err">NOT</span><span>The trust score is NOT a proven-unique function \u2014 it is a research conjecture.</span></div>
334
+ <div class="row"><span class="badge b-err">NOT</span><span>NOT SLSA L3, NOT FedRAMP, NOT Iron Bank, NOT CMMC. Builds are SLSA Level 2.</span></div>
335
+ <div class="row"><span class="badge b-err">NOT</span><span>NOT a third-party audit. Compliance coverage is self-evidenced with hashes.</span></div>
336
+ <div class="row"><span class="badge b-err">NOT</span><span>Only 5 formulas are formally proven; the rest are open or experimental.</span></div>
337
  </div>
338
+ <details class="raw"><summary>raw honesty record</summary><pre class="out" id="o-honest">loading\u2026</pre></details>${HONEST}`;window.honest_load();}},
 
 
 
 
 
 
 
 
 
339
  };
340
 
341
+ // ============ HANDLERS ============
342
+ // Ask & Act (rosie)
343
+ async function ask_q(q){try{setOut('o-ask','asking\u2026');const d=await orgPost('rosie','/api/rosie/v1/jarvis/ask',{question:q});
344
+ const cited=d.grounded?'grounded \u00b7 cited':'';const sig=(d.llm&&d.llm.lambda_receipt&&String(d.llm.lambda_receipt.signature||'').includes('PLACEHOLDER'))?'receipt UNSIGNED (no key \u2014 honest)':'';
345
+ setOut('o-ask','ANSWER ('+esc(cited)+')\n'+esc(d.answer||'')+'\n\n'+(sig?sig+'\n\n':'')+JSON.stringify(d.citations||d,null,2).slice(0,1200));}catch(e){setOut('o-ask','retry: '+e.message);}}
346
+ async function act_do(action){try{setOut('o-act','emitting\u2026');const d=await orgPost('rosie','/api/rosie/v1/jarvis/act',{action,target:'demo-action',note:'from a11oy command platform'});
347
+ const eh=(d.entry&&d.entry.entry_hash)||'';setOut('o-act','ACTION '+esc(action).toUpperCase()+' \u00b7 logged\nreceipt hash '+esc(eh).slice(0,20)+'\u2026 \u00b7 audit depth '+esc(d.audit_depth)+'\n\n'+JSON.stringify(d.receipt||d,null,2).slice(0,1000));}catch(e){setOut('o-act','retry: '+e.message);}}
348
+ async function ask_recs(){try{const d=await orgGet('rosie','/api/rosie/v1/jarvis/recommend');const cnt=d.counts||{};doughnut('ask-rec',['critical','warn','info','ok'],[cnt.critical||0,cnt.warn||0,cnt.info||0,cnt.ok||0],['#b06a5a',GOLD,TEAL,'#5a8a6e']);
349
+ setHTML('ask-rec-list','');(d.recommendations||[]).forEach(r=>addHTML('ask-rec-list',`<div class="row"><span class="badge ${r.severity==='critical'?'b-err':(r.severity==='warn'?'b-gold':'b-teal')}">${esc(r.severity)}</span><span>${esc(r.organ||'')}: ${esc(r.finding||'')}</span></div>`));
350
+ if(!(d.recommendations||[]).length)setHTML('ask-rec-list','<div class="row mono dim">no findings \u2014 all clear</div>');}catch(e){setHTML('ask-rec-list','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
351
+
352
+ // Demo / Warhacker (a11oy)
353
+ async function wh_one(key,out){try{setOut(out,'launching\u2026');const d=await postJSON(API+'/v1/warhacker/launch/'+key,{});const o=d.organ_response||{};setOut(out,'service: '+esc(d.organ)+' status: '+esc(o.status)+' http: '+esc(o.http_code)+'\n'+JSON.stringify(o.json||o,null,2).slice(0,900));}catch(e){setOut(out,'retry: '+e.message);}}
354
  async function wh_all(){for(const k of ['cannonico','tychee','hangar2apps','cyber-rts','raven']){await wh_one(k,'o-'+k);}}
355
+
356
+ // System health (a11oy public-URL probe)
357
+ async function fleet_load(){try{const d=await getJSON(API+'/v1/observability/summary');const arr=Object.values(d.mesh_reach||{});let ok=0;const names=['a11oy','sentra','amaru','rosie','killinchu'];setHTML('fl-reach-host','');
358
+ arr.forEach((v,i)=>{const up=v.status==='ok';if(up)ok++;addHTML('fl-reach-host',`<div class="row"><span class="badge ${up?'b-live':'b-err'}">${up?'UP':'DOWN'}</span><span>${esc(names[i]||'service')}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} ${esc(v.url||'')}</span></div>`);});
359
+ setTxt('fl-reach',arr.length?ok+'/'+arr.length:'\u2014');}catch(e){setHTML('fl-reach-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');setTxt('fl-reach','\u2014');}}
360
+
361
+ // Live system map (3D)
 
 
 
362
  async function mesh_load(){
363
+ try{const d=await getJSON(API+'/v1/observability/summary');const arr=Object.values(d.mesh_reach||{});const names=['a11oy','sentra','amaru','rosie','killinchu'];
364
+ const nodes=[{id:'a11oy',name:'command platform',color:GOLD,val:14}];const links=[];
365
+ arr.forEach((p,i)=>{const nm=names[i]||('service'+i);if(nm==='a11oy')return;const up=p.status==='ok';
366
+ nodes.push({id:nm,name:nm+(up?' \u00b7 up '+(p.latency_ms?Math.round(p.latency_ms)+'ms':''):' \u00b7 down'),color:up?TEAL:'#b06a5a',val:7});links.push({source:'a11oy',target:nm});});
367
+ mesh3d('mesh-3d',nodes,links);}catch(e){const h=el('mesh-3d');if(h)h.innerHTML='<div class="row mono dim" style="padding:1rem">graph retry: '+esc(e.message)+'</div>';}
368
+ try{const d=await getJSON(API+'/v1/observability/summary');const mr=d.mesh_reach||{};setHTML('mesh-host','');const names=['a11oy','sentra','amaru','rosie','killinchu'];
369
+ Object.values(mr).forEach((v,i)=>addHTML('mesh-host',`<div class="row"><span class="badge ${(v.status==='ok')?'b-live':'b-err'}">${esc(v.status)}</span><span>${esc(names[i]||'service')}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} \u00b7 ${esc(v.url||'')}</span></div>`));}catch(e){setHTML('mesh-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
370
+
371
+ // Trust score (a11oy /v1/lambda)
372
+ async function lambda_load(){try{const d=await getJSON(API+'/v1/lambda');const L=d.lambda||0;setTxt('la-val',L.toFixed?L.toFixed(4):L);setTxt('la-floor',d.lambda_floor??'0.90');setTxt('la-pass',d.pass?'ALLOW':(d.pass===false?'DENY':'\u2014'));
373
+ const ax=d.axes||[];const labels=ax.map(a=>a.name);const vals=ax.map(a=>a.score||0);
374
+ gauge('la-gauge',L,'',L>=(d.lambda_floor||FLOOR)?TEAL:'#b06a5a');setTxt('la-gbig',(L.toFixed?L.toFixed(3):L));
375
+ radar('la-radar',labels,vals);barH('la-bars',labels,vals,vals.map(v=>v>=0.9?TEAL:(v>=0.7?GOLD:'#b06a5a')));
376
+ setHTML('la-host','<details class="raw"><summary>raw trust vector</summary><pre class="out">'+esc(JSON.stringify(d,null,2))+'</pre></details>');}catch(e){setHTML('la-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
377
+
378
+ // Safety gates (sentra)
379
+ async function gates_load(){try{const d=await orgGet('sentra','/api/sentra/v1/gates');const g=d.gates||[];setTxt('g-count',d.total||g.length);
380
+ const deny=g.filter(x=>x.expectedDecision==='deny').length;setTxt('g-deny',deny);const cats=[...new Set(g.map(x=>x.category))];setTxt('g-cat',cats.length);
381
+ doughnut('g-donut',['allow-capable','deny-by-default'],[g.length-deny,deny],[TEAL,'#b06a5a']);
382
+ setHTML('g-host','');g.forEach(x=>addHTML('g-host',`<div class="row"><span class="badge ${x.expectedDecision==='deny'?'b-err':'b-live'}">${esc(x.expectedDecision||'')}</span><span>${esc(x.label||x.name)}</span><span class="spacer mono dim">${esc(x.category||'')}</span></div>`));}catch(e){setHTML('g-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
383
+ async function gate_try(action){try{setOut('g-try','inspecting\u2026');const d=await orgPost('sentra','/api/sentra/v1/verdict',{agent:'a11oy-demo',action,severity:'high',confidence:0.9,witnesses:[]});
384
+ setOut('g-try','DECISION '+esc(String(d.decision||'').toUpperCase())+'\n'+esc(d.reason||'')+'\nsignals: '+esc(JSON.stringify(d.signals||[]))+'\nreceipt '+esc(String(d.receipt_hash||'').slice(0,16)));}catch(e){setOut('g-try','retry: '+e.message);}}
385
+
386
+ // Live decisions (sentra verdict feed)
387
+ async function feed_load(){try{const d=await orgGet('sentra','/api/sentra/v1/verdict/feed?limit=50');const v=d.verdicts||[];setTxt('fd-n',d.total_buffered??v.length);
388
+ const deny=v.filter(x=>x.decision==='deny').length;const allow=v.length-deny;setTxt('fd-deny',deny);setTxt('fd-allow',allow);
389
+ doughnut('fd-donut',['allowed','denied'],[allow,deny],[TEAL,'#b06a5a']);
390
+ setHTML('fd-host','');v.slice(0,30).forEach(x=>addHTML('fd-host',`<div class="row"><span class="badge ${x.decision==='deny'?'b-err':'b-live'}">${esc(x.decision)}</span><span>${esc(x.agent||'')}</span><span class="spacer mono dim">${esc((x.signals||[]).join(', ')).slice(0,40)}</span></div>`));
391
+ if(!v.length)setHTML('fd-host','<div class="row mono dim">no decisions buffered yet</div>');}catch(e){setHTML('fd-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
392
+
393
+ // Readiness (amaru)
394
+ async function readiness_run(){try{setHTML('rd-host','<div class="row mono dim">assessing\u2026</div>');const d=await orgPost('amaru','/api/amaru/v1/readiness/assess',{subject:'demo-deploy',records:{medical_clearance:true,training:true}});
395
+ const a=d.assessment||{};const cleared=a.criteria_cleared||0,gaps=a.criteria_gaps||0,total=a.criteria_total||0,failed=Math.max(0,total-cleared-gaps);
396
+ doughnut('rd-donut',['cleared','gaps','failed'],[cleared,gaps,failed],[TEAL,GOLD,'#b06a5a']);
397
+ setHTML('rd-host',`<div class="row"><span class="badge ${a.verdict==='DEPLOYABLE'?'b-live':(a.verdict==='NOT_DEPLOYABLE'?'b-err':'b-gold')}">${esc(a.verdict||'')}</span><span>${esc(cleared)}/${esc(total)} criteria cleared</span></div>`+(a.checks||[]).map(ch=>`<div class="row"><span class="badge ${ch.result==='GAP'?'b-gold':'b-live'}">${esc(ch.result)}</span><span>${esc(ch.criterion)}</span></div>`).join(''));}catch(e){setHTML('rd-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
398
+
399
+ // Compliance (sentra)
400
+ async function comp_run(fw){try{setHTML('cp-host','<div class="row mono dim">mapping '+esc(fw)+'\u2026</div>');const d=await orgPost('sentra','/api/sentra/v1/elite/compliance',{framework:fw});
401
+ const cov=d.covered||0,total=d.total||0,gaps=Math.max(0,total-cov);doughnut('cp-donut',['covered','gaps'],[cov,gaps],[TEAL,'#b06a5a']);
402
+ setHTML('cp-host',`<div class="row"><span class="badge b-live">${esc(d.coverage_pct??0)}%</span><span>${esc(cov)}/${esc(total)} controls covered</span><span class="spacer mono dim">${esc(fw)}</span></div>`+(d.controls||[]).slice(0,12).map(c=>`<div class="row"><span class="badge ${c.status==='COVERED'?'b-live':'b-gold'}">${esc(c.status)}</span><span>${esc(c.id)} ${esc(c.name)}</span></div>`).join('')+`<div class="row mono dim">${esc(d.note||'No third-party audit')}</div>`);}catch(e){setHTML('cp-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
403
+
404
+ // Forecast (sentra)
405
+ async function forecast_run(input,k){try{setHTML('fc-host','<div class="row mono dim">forecasting\u2026</div>');const d=await orgGet('sentra','/api/sentra/v1/forecast/run?input_value='+input+'&k='+k);
406
+ const env=d.confidence_envelope||{};const pred=d.prediction||0;const lo=env.lower??pred,hi=env.upper??pred;
407
+ lineSpark('fc-line',['lower','prediction','upper'],[lo,pred,hi],TEAL);
408
+ setHTML('fc-host',`<div class="row"><span>Prediction</span><span class="spacer b-teal badge">${esc(pred.toFixed?pred.toFixed(4):pred)}</span></div><div class="row"><span>Confidence band</span><span class="spacer mono dim">[${esc(lo)}, ${esc(hi)}]</span></div><div class="row mono dim">${esc(d.honesty_note||'partial formal proof \u2014 not a zero-gap claim')}</div>`);}catch(e){setHTML('fc-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
409
+
410
+ // Signed receipts (rosie ledger + command-log)
411
+ async function receipts_load(){try{const d=await orgGet('rosie','/api/rosie/v1/ledger');setTxt('rc-n',d.count??(d.receipts||[]).length);
412
+ const r=d.receipts||[];lineSpark('rc-line',r.map((x,i)=>i),r.map((x,i)=>i+1),TEAL);
413
+ setHTML('rc-host','');r.slice(0,12).forEach(x=>addHTML('rc-host',`<div class="row"><span class="badge b-gold">#${esc(x.seq)}</span><span>${esc(x.action||'')}</span><span class="spacer mono dim">${esc(String(x.receipt_id||'').slice(0,16))}</span></div>`));
414
+ }catch(e){setHTML('rc-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
415
+ try{const cl=await orgGet('rosie','/api/rosie/v2/command-log');setTxt('rc-chain',cl.chain_verified?('verified \u00b7 depth '+(cl.depth||'')):'\u2014');}catch(e){setTxt('rc-chain','\u2014');}}
416
+
417
+ // Proof & formulas (a11oy)
418
+ async function formulas_load(){try{const d=await getJSON(API+'/v1/puriq/formulas');setOut('f-out',d);const n=d.summary?.n_agents||23;setTxt('f-n',n);
419
+ doughnut('f-donut',['proven','open','conjecture'],[5,Math.max(0,n-6),1],[TEAL,GOLD,'#b06a5a']);
420
+ setHTML('f-host',`<div class="row"><span>Formally proven (locked)</span><span class="spacer b-live badge">5</span></div><div class="row"><span>Proven set</span><span class="spacer mono dim">F1, F11, F12, F18, F19</span></div><div class="row"><span>Trust-score uniqueness</span><span class="spacer b-err badge">open conjecture</span></div><div class="row"><span>Lean repo</span><span class="spacer mono dim">lutar-lean</span></div>`);
421
+ }catch(e){doughnut('f-donut',['proven','open','conjecture'],[5,17,1],[TEAL,GOLD,'#b06a5a']);setHTML('f-host','<div class="row mono dim">Proven sorry-free: F1,F11,F12,F18,F19 (5). Trust-score uniqueness = open conjecture. retry: '+esc(e.message)+'</div>');setOut('f-out','retry: '+e.message);}}
422
+
423
+ // Threat library (sentra)
424
+ async function threats_load(){try{const d=await orgGet('sentra','/api/sentra/v1/threats/full');const c=d.corpus||[];setTxt('th-n',d.total||c.length);
425
+ const sev=s=>c.filter(x=>x.severity===s).length;const crit=sev('critical'),high=sev('high'),med=sev('medium'),low=sev('low');setTxt('th-crit',crit);setTxt('th-high',high);
426
+ barV('th-bars',['critical','high','medium','low'],[crit,high,med,low],['#b06a5a',GOLD,TEAL,'#5a8a6e']);
427
+ setHTML('th-host','');c.slice(0,30).forEach(x=>addHTML('th-host',`<div class="row"><span class="badge ${x.severity==='critical'?'b-err':(x.severity==='high'?'b-gold':'b-teal')}">${esc(x.severity)}</span><span>${esc(x.signature||x.category)}</span><span class="spacer mono dim">${esc(x.mitre_technique||'')} ${x.cvss_base?('CVSS '+x.cvss_base):''}</span></div>`));}catch(e){setHTML('th-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
428
+
429
+ // Agent tools (a11oy MCP)
430
+ const ACTION={severity:'high',confidence:0.92,actionId:'platform-demo',witnesses:[{id:'w1',role:'op',attested:true},{id:'w2',role:'auditor',attested:true},{id:'w3',role:'witness',attested:true}]};
431
+ const AXES_OK={soundness:0.95,calibration:0.92,robustness:0.95,provenance:0.93,consent:0.94,reversibility:0.91,auditability:0.90,linearity:0.93,scope_compliance:0.92};
432
+ async function mcp_list(){try{const d=await getJSON(API+'/v1/mcp/tools');const t=d.tools||[];setHTML('mcp-list','');t.forEach(x=>addHTML('mcp-list',`<div class="row"><span class="badge b-teal">${esc(x.name)}</span><span>${esc(x.description||'')}</span></div>`));
433
+ // tools-per-service bar from rosie mesh (amaru4 rosie3 sentra1 a11oy4)
434
+ try{const m=await orgGet('rosie','/api/rosie/v1/mesh/3d');const nd=m.nodes||[];barV('mcp-bar',nd.map(n=>n.id),nd.map(n=>n.mcp_tools||0),TEAL);}catch(e){}}catch(e){setHTML('mcp-list','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
435
+ async function mcp_call(name){try{setOut('o-mcp','invoking '+name+'\u2026');const args=name==='lambda_score'?{axes:AXES_OK}:name==='a11oy_gate'?{action:ACTION}:name==='khipu_sign'?{payload:{actionId:'mcp-demo',severity:'high'}}:{receipt:{actionId:'mcp-demo'}};
436
  const d=await postJSON(API+'/v1/mcp/call',{name,arguments:args});setOut('o-mcp','TOOL '+esc(d.tool||name)+' \u00b7 '+esc(d.status||'')+' \u00b7 kernel '+esc(d.kernel_commit||'')+'\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-mcp','retry: '+e.message);}}
437
+
438
+ // What we claim (a11oy honest)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
439
  async function honest_load(){try{const d=await getJSON(API+'/v1/honest');const dl=d.doctrine_lock||{};setHTML('ho-host','');
440
+ addHTML('ho-host',`<div class="row"><span>Formally proven formulas</span><span class="spacer b-live badge">5</span></div>`);
441
+ addHTML('ho-host',`<div class="row"><span>Build security</span><span class="spacer b-teal badge">SLSA Level 2</span></div>`);
442
+ addHTML('ho-host',`<div class="row"><span>Trust score</span><span class="spacer b-err badge">research conjecture</span></div>`);
443
+ addHTML('ho-host',`<div class="row"><span>Verifiable receipts</span><span class="spacer b-live badge">yes (real key on drones service)</span></div>`);
444
  setOut('o-honest',d);}catch(e){setHTML('ho-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
445
 
446
  function go(view){