Spaces:
Running
Running
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- 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)">
|
| 132 |
-
<span>
|
| 133 |
-
<span class="live"><span class="live-dot"></span>LIVE
|
| 134 |
-
<nav class="switcher" aria-label="
|
| 135 |
-
<span class="lbl">
|
| 136 |
-
<a class="flag active" href="https://szlholdings-a11oy.hf.space/
|
| 137 |
-
<a class="flag" href="https://szlholdings-
|
| 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="
|
| 150 |
-
<div class="nav-item" data-view="
|
| 151 |
-
<div class="nav-item" data-view="
|
| 152 |
-
<div class="nav-item" data-view="
|
| 153 |
-
<div class="nav-
|
| 154 |
-
<div class="nav-
|
| 155 |
-
<div class="nav-item" data-view="
|
| 156 |
-
<div class="nav-item" data-view="
|
| 157 |
-
<div class="nav-item" data-view="
|
| 158 |
-
<div class="nav-item" data-view="
|
| 159 |
-
<div class="nav-item" data-view="
|
| 160 |
-
<div class="nav-
|
| 161 |
-
<div class="nav-
|
| 162 |
-
<div class="nav-item" data-view="
|
| 163 |
-
<div class="nav-item" data-view="
|
| 164 |
-
<div class="nav-
|
| 165 |
-
<div class="nav-item" data-view="
|
| 166 |
-
<div class="nav-item" data-view="
|
| 167 |
-
<div class="nav-item" data-view="
|
| 168 |
-
<div class="side-foot">
|
| 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=>({'&':'&','<':'<','>':'>'}[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>
|
|
|
|
| 212 |
|
| 213 |
const VIEWS={
|
| 214 |
-
command:{title:'Command Center',badge:'LIVE',sub:'
|
| 215 |
-
render:async(c)=>{
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 223 |
-
<div class="
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
//
|
| 229 |
-
try{const
|
| 230 |
-
|
| 231 |
-
//
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 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 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
<div class="
|
| 249 |
-
|
| 250 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
<
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
<div class="grid2">
|
| 258 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 259 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 260 |
-
</div>
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
<
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
render:async(c)=>{c.innerHTML=`<div class="
|
| 291 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 292 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
<
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
<
|
| 309 |
-
|
| 310 |
-
|
| 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 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
<div class="card"><div class="card-h"><span class="card-t">
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
</div>
|
| 323 |
-
<
|
| 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 & 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 & 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 |
-
//
|
| 336 |
-
|
| 337 |
-
const
|
| 338 |
-
const
|
| 339 |
-
|
| 340 |
-
async function
|
| 341 |
-
|
| 342 |
-
async function
|
| 343 |
-
|
| 344 |
-
/
|
| 345 |
-
|
|
|
|
|
|
|
| 346 |
async function wh_all(){for(const k of ['cannonico','tychee','hangar2apps','cyber-rts','raven']){await wh_one(k,'o-'+k);}}
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
//
|
| 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
|
| 359 |
-
const
|
| 360 |
-
const
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
async function
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 391 |
-
|
| 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>
|
| 419 |
-
addHTML('ho-host',`<div class="row"><span>
|
| 420 |
-
addHTML('ho-host',`<div class="row"><span>
|
|
|
|
| 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 & 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 & 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 & 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 & 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 & 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 & 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=>({'&':'&','<':'<','>':'>'}[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 & 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){
|