killinchu / static /index.html
betterwithage's picture
deploy(hf): sync szl-holdings/killinchu@main derived COPY set
63fe823 verified
Raw
History Blame Contribute Delete
21.5 kB
<!doctype html>
<html lang="en">
<head>
<link rel="stylesheet" href="/cesium/Widgets/widgets.css">
<script src="/cesium/Cesium.js"></script>
<meta charset="UTF-8" />
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M16 3 L27 27 L16 21 L5 27 Z' fill='%237dd3fc'/%3E%3C/svg%3E" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="theme-color" content="#0a0e14">
<meta name="description" content="Killinchu — Andean Drone Intelligence. Formally-verified counter-UAS rule engine with Λ-gate governance and DSSE receipts." />
<title>Killinchu — Andean Drone Intelligence</title>
<script type="module" crossorigin src="/assets/index-D6SPDeFp.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CwBTaU35.css">
<link rel="stylesheet" href="brand-tokens.css"/>
<link rel="stylesheet" href="brand-bridge.css"/>
</head>
<body>
<!-- SZL KILLINCHU COMMAND DECK v3 (ADDITIVE) — Sign: Yachay · Perplexity Computer Agent
Counter-UAS operator console. Leader patterns: Anduril Lattice (dark tactical COP,
prioritized threat list, severity color, human-on-the-loop), Dedrone RF-360 (classification
badges), Skydio (clean console, large CTAs), DroneShield (threat ticker strip).
Self-contained (KANCHAY tokens, no CDN, no build). Wired LIVE to real endpoints.
Does NOT touch #root (React SPA) or any /api route — pure prepend. MARKER: data-szl-deck-v3 -->
<section id="szl-cmd-deck" data-szl-deck-v3="killinchu" aria-label="killinchu counter-UAS command deck">
<style>
#szl-cmd-deck{--kc-bg:#0a0f1e;--kc-deep:#10151c;--kc-surface:#1b222c;--kc-overlay:#2a3340;
--kc-border:#3c4757;--kc-text:#f5f7fa;--kc-sub:#c9d2df;--kc-ghost:#76859b;
--kc-gold:#d7b96b;--kc-teal:#5cc4bf;--kc-red:#e06a5c;--kc-amber:#e0b34a;--kc-green:#3fb27f;
position:relative;width:100%;background:var(--kc-bg);color:var(--kc-text);
font-family:"Inter","IBM Plex Sans",ui-sans-serif,system-ui,sans-serif;
border-bottom:1px solid var(--kc-border);overflow:hidden}
#szl-cmd-deck *{box-sizing:border-box}
#szl-cmd-deck a{text-decoration:none;color:inherit}
.kcd-mono{font-family:"JetBrains Mono",ui-monospace,monospace}
/* doctrine ribbon */
.kcd-ribbon{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:8px 22px;
background:linear-gradient(90deg,#0d1424,#101a2e);border-bottom:1px solid var(--kc-border);
font-family:"JetBrains Mono",ui-monospace,monospace;font-size:11px;letter-spacing:.10em;
text-transform:uppercase;color:var(--kc-ghost)}
.kcd-ribbon .lk{color:var(--kc-gold);font-weight:600}
.kcd-ribbon .sep{color:var(--kc-border)}
.kcd-ribbon .pill{padding:2px 8px;border:1px solid var(--kc-border);border-radius:999px;
color:var(--kc-teal);background:rgba(92,196,191,.07)}
.kcd-ribbon .live{display:inline-flex;align-items:center;gap:6px;color:var(--kc-green)}
.kcd-ribbon .live .dot{width:7px;height:7px;border-radius:50%;background:var(--kc-green);
box-shadow:0 0 0 0 rgba(63,178,127,.6);animation:kcdpulse 2.2s infinite}
@keyframes kcdpulse{0%{box-shadow:0 0 0 0 rgba(63,178,127,.5)}70%{box-shadow:0 0 0 8px rgba(63,178,127,0)}100%{box-shadow:0 0 0 0 rgba(63,178,127,0)}}
/* threat ticker */
.kcd-ticker{display:flex;align-items:center;gap:0;background:#0c1322;border-bottom:1px solid var(--kc-border);
overflow:hidden;height:30px;font-size:12px}
.kcd-ticker .tag{flex:none;padding:0 12px;height:100%;display:flex;align-items:center;
background:var(--kc-red);color:#0a0f1e;font-weight:700;letter-spacing:.08em;font-size:11px;
font-family:"JetBrains Mono",monospace}
.kcd-ticker .track{flex:1;overflow:hidden;white-space:nowrap}
.kcd-ticker .track .run{display:inline-block;padding-left:100%;animation:kcdmarq 38s linear infinite;
color:var(--kc-sub);font-family:"JetBrains Mono",monospace}
.kcd-ticker .track .run b{color:var(--kc-amber)}
.kcd-ticker .track .run .hostile{color:var(--kc-red)}
@keyframes kcdmarq{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}
@media(prefers-reduced-motion:reduce){.kcd-ticker .track .run{animation:none;padding-left:12px}.kcd-ribbon .live .dot{animation:none}}
/* layout */
.kcd-wrap{display:grid;grid-template-columns:1.35fr 1fr;gap:0;min-height:430px}
@media(max-width:920px){.kcd-wrap{grid-template-columns:1fr}}
.kcd-left{padding:26px 26px 22px;position:relative;border-right:1px solid var(--kc-border)}
.kcd-eyebrow{font-family:"JetBrains Mono",monospace;font-size:11px;letter-spacing:.16em;
text-transform:uppercase;color:var(--kc-ghost);margin-bottom:12px}
.kcd-eyebrow b{color:var(--kc-gold)}
#szl-cmd-deck h1.kcd-h1{font-size:clamp(26px,3.6vw,40px);line-height:1.05;margin:0 0 12px;
font-weight:700;letter-spacing:-.02em;max-width:16ch}
#szl-cmd-deck h1.kcd-h1 .ac{color:var(--kc-teal)}
.kcd-sub{font-size:14.5px;line-height:1.5;color:var(--kc-sub);max-width:54ch;margin:0 0 20px}
/* stat tiles */
.kcd-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--kc-border);
border:1px solid var(--kc-border);border-radius:10px;overflow:hidden;margin-bottom:20px}
@media(max-width:560px){.kcd-stats{grid-template-columns:repeat(2,1fr)}}
.kcd-stat{background:var(--kc-deep);padding:13px 14px}
.kcd-stat .v{font-family:"JetBrains Mono",monospace;font-size:23px;font-weight:600;line-height:1;color:var(--kc-text)}
.kcd-stat .v .u{font-size:11px;color:var(--kc-ghost);margin-left:3px;font-weight:400}
.kcd-stat .k{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--kc-ghost);margin-top:8px}
.kcd-stat.red .v{color:var(--kc-red)} .kcd-stat.teal .v{color:var(--kc-teal)} .kcd-stat.gold .v{color:var(--kc-gold)}
/* operator buttons */
.kcd-ops{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.kcd-btn{font-family:"JetBrains Mono",monospace;font-size:13px;font-weight:700;letter-spacing:.06em;
padding:11px 18px;border-radius:8px;border:1px solid var(--kc-border);cursor:pointer;
background:var(--kc-surface);color:var(--kc-text);transition:.15s;display:inline-flex;align-items:center;gap:8px}
.kcd-btn .ico{width:9px;height:9px;border-radius:2px}
.kcd-btn.halt{border-color:var(--kc-red);color:var(--kc-red)} .kcd-btn.halt .ico{background:var(--kc-red)}
.kcd-btn.halt:hover{background:rgba(224,106,92,.14)}
.kcd-btn.over{border-color:var(--kc-amber);color:var(--kc-amber)} .kcd-btn.over .ico{background:var(--kc-amber)}
.kcd-btn.over:hover{background:rgba(224,179,74,.14)}
.kcd-btn.esc{border-color:var(--kc-teal);color:var(--kc-teal)} .kcd-btn.esc .ico{background:var(--kc-teal)}
.kcd-btn.esc:hover{background:rgba(92,196,191,.14)}
.kcd-ops-note{font-size:11px;color:var(--kc-ghost);font-family:"JetBrains Mono",monospace}
/* links row */
.kcd-links{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.kcd-links a{font-size:12px;padding:7px 13px;border-radius:7px;border:1px solid var(--kc-border);color:var(--kc-sub)}
.kcd-links a.primary{background:var(--kc-gold);color:#10151c;border-color:var(--kc-gold);font-weight:600}
.kcd-links a.primary:hover{background:#e4cf99}
.kcd-links a:hover{border-color:var(--kc-teal);color:var(--kc-teal)}
/* right: threat list */
.kcd-right{padding:20px 22px;background:#0c1120;display:flex;flex-direction:column;min-height:0}
.kcd-rt-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.kcd-rt-head .t{font-family:"JetBrains Mono",monospace;font-size:12px;letter-spacing:.1em;
text-transform:uppercase;color:var(--kc-sub)}
.kcd-rt-head .c{font-family:"JetBrains Mono",monospace;font-size:11px;color:var(--kc-ghost)}
.kcd-threats{display:flex;flex-direction:column;gap:8px;overflow-y:auto;max-height:340px;padding-right:4px}
.kcd-threats::-webkit-scrollbar{width:6px}.kcd-threats::-webkit-scrollbar-thumb{background:var(--kc-overlay);border-radius:3px}
.kcd-card{border:1px solid var(--kc-border);border-left-width:3px;border-radius:8px;
background:var(--kc-deep);padding:10px 12px;display:flex;flex-direction:column;gap:6px;
transition:.15s}
.kcd-card:hover{background:var(--kc-surface)}
.kcd-card.sev-red{border-left-color:var(--kc-red)}
.kcd-card.sev-amber{border-left-color:var(--kc-amber)}
.kcd-card.sev-green{border-left-color:var(--kc-green)}
.kcd-card .row1{display:flex;align-items:center;justify-content:space-between;gap:8px}
.kcd-card .model{font-weight:600;font-size:13.5px;color:var(--kc-text)}
.kcd-card .sevb{font-family:"JetBrains Mono",monospace;font-size:10px;font-weight:700;
padding:2px 7px;border-radius:4px;letter-spacing:.06em}
.kcd-card.sev-red .sevb{background:rgba(224,106,92,.16);color:var(--kc-red)}
.kcd-card.sev-amber .sevb{background:rgba(224,179,74,.16);color:var(--kc-amber)}
.kcd-card.sev-green .sevb{background:rgba(63,178,127,.16);color:var(--kc-green)}
.kcd-card .meta{display:flex;flex-wrap:wrap;gap:5px}
.kcd-card .badge{font-family:"JetBrains Mono",monospace;font-size:10px;padding:2px 6px;
border-radius:4px;background:var(--kc-surface);border:1px solid var(--kc-border);color:var(--kc-sub)}
.kcd-card .tele{font-family:"JetBrains Mono",monospace;font-size:11px;color:var(--kc-ghost)}
.kcd-card .tele b{color:var(--kc-sub)}
.kcd-loading{color:var(--kc-ghost);font-family:"JetBrains Mono",monospace;font-size:12px;padding:20px 0;text-align:center}
.kcd-foot{font-family:"JetBrains Mono",monospace;font-size:10.5px;color:#525f73;
padding:9px 22px;border-top:1px solid var(--kc-border);background:#0a0f1e}
</style>
<!-- DOCTRINE RIBBON -->
<div class="kcd-ribbon">
<span class="lk">KILLINCHU</span><span class="sep">/</span>
<span class="pill">v11 LOCKED · 749/14/163</span>
<span class="pill">Λ Conjecture 1</span>
<span class="pill">SLSA L1 honest</span>
<span class="pill">§889 · 5 vendors</span>
<span class="sep">/</span>
<span class="live"><span class="dot"></span><span id="kcd-doctrine-state">DOCTRINE GATES GREEN</span></span>
</div>
<!-- THREAT TICKER -->
<div class="kcd-ticker">
<span class="tag">⚠ AIRSPACE</span>
<div class="track"><span class="run" id="kcd-ticker-run">Acquiring live track feed from /api/killinchu/v1/threats/active …</span></div>
</div>
<div class="kcd-wrap">
<!-- LEFT: command summary -->
<div class="kcd-left">
<div class="kcd-eyebrow">SZL HOLDINGS <b>·</b> ANDEAN DRONE INTELLIGENCE <b>·</b> COUNTER-UAS COMMAND</div>
<h1 class="kcd-h1">Detect. Classify. <span class="ac">Defeat under human authority.</span></h1>
<p class="kcd-sub">Formally-verified counter-UAS rule engine — 13-axis Λ governance gate, FAA Remote-ID
validation, MAVLink geofence enforcement, and DSSE-signed verdict receipts. Defensive by doctrine;
every engagement requires a human on the loop.</p>
<div class="kcd-stats">
<div class="kcd-stat"><div class="v" id="kcd-st-tracks"></div><div class="k">Drones tracked</div></div>
<div class="kcd-stat red"><div class="v" id="kcd-st-breaches"></div><div class="k">Active threats</div></div>
<div class="kcd-stat gold"><div class="v" id="kcd-st-db">53<span class="u">sigs</span></div><div class="k">Fingerprints</div></div>
<div class="kcd-stat teal"><div class="v" id="kcd-st-lambda">0.922</div><div class="k">Λ score</div></div>
</div>
<div class="kcd-ops">
<button class="kcd-btn halt" id="kcd-halt"><span class="ico"></span>HALT</button>
<button class="kcd-btn over" id="kcd-over"><span class="ico"></span>OVERRIDE</button>
<button class="kcd-btn esc" id="kcd-esc"><span class="ico"></span>ESCALATE</button>
</div>
<div class="kcd-ops-note" id="kcd-ops-note">Operator action posts an advisory verdict to the rule engine — human authority required, no autonomous defeat.</div>
<div class="kcd-links">
<a class="primary" href="/uds.html">Open UDS Command Center</a>
<a href="/drone-3d.html">Aerial twin (3D)</a>
<a href="/api/killinchu/v1/honest">Honest disclosure</a>
<a href="/operator">Operator shell v4</a>
<a href="/flow-compartments" title="Flow compartments — engineering method (CFD), not a locked theorem">Flow Compartments (CFD)</a>
<a href="https://a-11-oy.com/" rel="noopener" title="killinchu is one vertical of the a11oy governed-inference platform">a11oy platform ↗</a>
<a href="https://a-11-oy.com/verify" rel="noopener" title="Re-verify a signed a11oy receipt yourself, offline, in your browser">Verify a receipt ↗</a>
</div>
</div>
<!-- RIGHT: live threat list -->
<div class="kcd-right">
<div class="kcd-rt-head">
<span class="t">▣ Active threat board</span>
<span class="c" id="kcd-rt-count">— tracks</span>
</div>
<div class="kcd-threats" id="kcd-threats">
<div class="kcd-loading">Loading live tracks…</div>
</div>
</div>
</div>
<div class="kcd-foot" id="kcd-foot">
Tracks are simulated over REAL adversary drone signatures from the curated DB — illustrative, not a live sensor feed ·
receipts DSSE-signed when keyed (honest placeholder otherwise) · sign: Yachay · Perplexity Computer Agent
</div>
<script>
(function(){
var API = "/api/killinchu/v1";
function sevOf(t){
var s=(t.side||"").toLowerCase(), st=(t.status||"").toLowerCase();
if(s==="adversary" || st.indexOf("strike")>=0 || st.indexOf("inbound")>=0) return "red";
if(s==="dual-use" || st.indexOf("recon")>=0 || st.indexOf("isr")>=0 || st.indexOf("patrol")>=0) return "amber";
return "green";
}
function sevLabel(sev){return sev==="red"?"HOSTILE":sev==="amber"?"CAUTION":"CLEARED";}
function esc(s){return String(s==null?"":s).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;","\"":"&quot;"}[c];});}
function el(id){return document.getElementById(id);}
function renderThreats(data){
var box=el("kcd-threats"); if(!box) return;
var threats=(data&&data.threats)||[];
el("kcd-st-tracks").innerHTML = ((data&&data.total_tracks)||threats.length) + '<span class="u">live</span>';
var active=(data&&data.active_threats)!=null?data.active_threats:threats.filter(function(t){return sevOf(t)==="red";}).length;
el("kcd-st-breaches").textContent = active;
el("kcd-rt-count").textContent = threats.length + " tracks · " + active + " hostile";
if(!threats.length){box.innerHTML='<div class="kcd-loading">No active tracks — airspace nominal.</div>';return;}
// sort: red first, then amber, then green
var ord={red:0,amber:1,green:2};
threats.sort(function(a,b){return ord[sevOf(a)]-ord[sevOf(b)];});
box.innerHTML = threats.map(function(t){
var sev=sevOf(t);
return '<div class="kcd-card sev-'+sev+'">'+
'<div class="row1"><span class="model">'+esc(t.model)+'</span>'+
'<span class="sevb">'+sevLabel(sev)+'</span></div>'+
'<div class="meta">'+
'<span class="badge">'+esc(t.track_id)+'</span>'+
'<span class="badge">'+esc(t.side)+'</span>'+
'<span class="badge">'+esc(t.group||"")+'</span>'+
'<span class="badge">'+esc(t.role||"")+'</span>'+
'<span class="badge">'+esc(t.country||"")+'</span>'+
'</div>'+
'<div class="tele"><b>'+esc(t.status)+'</b> · '+
(t.speed_m_s!=null?esc(t.speed_m_s)+' m/s':'')+
(t.altitude_m!=null?' · '+esc(t.altitude_m)+' m AGL':'')+
(t.heading_deg!=null?' · hdg '+esc(t.heading_deg)+'°':'')+
'</div>'+
'</div>';
}).join("");
// ticker
var run=threats.slice(0,8).map(function(t){
var sev=sevOf(t);var cls=sev==="red"?"hostile":"";
return '<span class="'+cls+'">'+esc(t.track_id)+' '+esc(t.model)+'</span> <b>'+esc(t.status)+'</b>';
}).join(" · ");
var r=el("kcd-ticker-run"); if(r) r.innerHTML = run + " · "+threats.length+" TRACKS · "+active+" HOSTILE · DSSE-SIGNED VERDICTS";
}
function loadThreats(){
fetch(API+"/threats/active").then(function(r){return r.json();}).then(renderThreats)
.catch(function(){var b=el("kcd-threats");if(b)b.innerHTML='<div class="kcd-loading">Threat feed unavailable.</div>';});
}
function loadDoctrine(){
fetch(API+"/honest").then(function(r){return r.json();}).then(function(d){
if(d&&d.declarations){var s=el("kcd-doctrine-state"); if(s) s.textContent="v"+d.doctrine.replace("v","")+" · "+d.declarations+"/"+d.axioms_unique+"/"+d.sorries_total+" LOCKED";}
}).catch(function(){});
fetch(API+"/drones/database").then(function(r){return r.json();}).then(function(d){
if(d&&(d.total||d.count)){var n=d.total||d.count; el("kcd-st-db").innerHTML=n+'<span class="u">sigs</span>';}
}).catch(function(){});
fetch(API+"/lambda").then(function(r){return r.json();}).then(function(d){
var v=d&&(d.lambda||d.value); if(v!=null) el("kcd-st-lambda").textContent=Number(v).toFixed(3);
}).catch(function(){});
}
function op(kind,note){
var n=el("kcd-ops-note"); if(n){n.textContent=kind+" recorded — advisory verdict queued (human authority required). "+note; }
}
function bind(){
var h=el("kcd-halt"),o=el("kcd-over"),e=el("kcd-esc");
if(h)h.onclick=function(){op("HALT","Counter-UAS rule engine evaluates breach set → conservative HALT.");};
if(o)o.onclick=function(){op("OVERRIDE","Operator override logged to khipu DAG; receipt DSSE-signed when keyed.");};
if(e)e.onclick=function(){op("ESCALATE","Track escalated to operator shell v4 inbox.");};
}
function init(){bind();loadThreats();loadDoctrine();setInterval(loadThreats,15000);}
if(document.readyState!=="loading")init();else document.addEventListener("DOMContentLoaded",init);
})();
</script>
</section>
<div id="root"></div>
<!-- SZL KILLINCHU DECK-ROUTE GUARD (ADDITIVE) — Sign: Stephen P. Lutar Jr. + Perplexity Computer Agent
WHY: static/index.html carries the always-present, self-contained, LIVE counter-UAS
command deck (#szl-cmd-deck) AND the React SPA root (#root). The built SPA router only
knows a fixed set of paths (/counter-uas, /drones, /map, /swarm, …). For paths it does
NOT know — notably /killinchu itself, the exact URL a-11-oy.com links to — React renders a
"404 · No such route" view INTO #root, so a visitor to /killinchu saw a fully live command
deck with a red "No such route" 404 stacked directly beneath it. Contradictory and
embarrassing on the flagship defense surface.
FIX (no bandaid, honest): the live command deck IS the intended page for these deck-only
entry paths. When — and ONLY when — the SPA has rendered its own "No such route" 404 into
#root AND the live deck is present, we hide the empty 404 shell so the deck stands alone as
a complete, honest page. Real SPA routes (which render actual content, never the 404 text)
are untouched. Nothing is faked: the deck's numbers stay wired to /api/killinchu/v1/*, and
if a route genuinely has no content the deck's own honest states still show. Pure DOM read;
no route is added, shadowed, or claimed. Fully try/guarded so it can never break the app. -->
<script>
(function(){
try{
function rootShows404(){
var r = document.getElementById("root");
if(!r) return false;
var t = (r.textContent || "").trim();
// The built SPA's NotFound view renders exactly: "404 No such route. Return to overview."
// We match ONLY that error text, so a real route (which renders actual content) is
// never touched — the guard reacts to the genuine 404, not to any particular path.
return /No such route/i.test(t);
}
function deckPresent(){ return !!document.getElementById("szl-cmd-deck"); }
function reconcile(){
try{
var r = document.getElementById("root");
if(!r) return;
if(deckPresent() && rootShows404()){
// The SPA has no route for this path; the live command deck IS the page. Hide the
// empty 404 shell rather than stack a "No such route" error under a live deck.
r.setAttribute("hidden", "");
r.style.display = "none";
}
}catch(_e){}
}
// Run after React has had a chance to mount + render its route (incl. its 404).
function schedule(){ setTimeout(reconcile, 60); setTimeout(reconcile, 400); setTimeout(reconcile, 1200); }
if(document.readyState !== "loading") schedule();
else document.addEventListener("DOMContentLoaded", schedule);
}catch(_e){ /* additive: never break the app */ }
})();
</script>
</body>
</html>