betterwithage Claude Opus 4.7 commited on
Commit
4b2fcaa
·
verified ·
1 Parent(s): 8f4aa1c

deploy(hf): sync szl-holdings/killinchu@main derived COPY set

Browse files

Reusable Dockerfile-COPY-derived deploy from szl-holdings/killinchu main.
Files: 880 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).

Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

cathedral.html CHANGED
@@ -4,7 +4,7 @@
4
  Field node (killinchu, edge) tethered to the a11oy brain-sun upstream.
5
  Sovereign: Three.js r160 (MIT) VENDORED under /static/vendor3d, NO CDN.
6
  Honesty: locked proven = 8 {F1,F4,F7,F11,F12,F18,F19,F22}; experimental main 1304/22; Λ = Conjecture 1;
7
- Trust Gate = Conjecture; SLSA L1 honest / L2 roadmap. Live /healthz + ledger.
8
  "Enter Field Console" -> /elite (Counter-UAS Governance command deck).
9
  Vessels CONSOLIDATED into killinchu (/elite fleet group).
10
  Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
@@ -90,7 +90,7 @@ html,body{margin:0;height:100%;background:var(--indigo-900);overflow:hidden;colo
90
  <div class="title">killinchu · Maritime + Drone C2 (Field Node)</div>
91
  <div class="line">Doctrine <b>v11 LOCKED</b> · <b>749/14/163</b> · <span class="sha">c7c0ba17</span></div>
92
  <div class="line" style="margin-top:5px">Λ = <b>Conjecture 1</b> · Trust Gate = <b>Conjecture</b> · locked proven <b>8</b> {F1,F4,F7,F11,F12,F18,F19,F22}</div>
93
- <div class="line" style="margin-top:5px">Vessels <b>consolidated</b> into killinchu (/elite) · /wave910 (6 cards) · SLSA <b>L1 honest / L2 roadmap</b></div>
94
  <div class="line" style="margin-top:5px;color:var(--ink-dim)">Field node (edge) tethered to the a11oy substrate upstream</div>
95
  </div>
96
 
 
4
  Field node (killinchu, edge) tethered to the a11oy brain-sun upstream.
5
  Sovereign: Three.js r160 (MIT) VENDORED under /static/vendor3d, NO CDN.
6
  Honesty: locked proven = 8 {F1,F4,F7,F11,F12,F18,F19,F22}; experimental main 1304/22; Λ = Conjecture 1;
7
+ Trust Gate = Conjecture; SLSA L1 honest · L2 attested · L3 roadmap. Live /healthz + ledger.
8
  "Enter Field Console" -> /elite (Counter-UAS Governance command deck).
9
  Vessels CONSOLIDATED into killinchu (/elite fleet group).
10
  Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
 
90
  <div class="title">killinchu · Maritime + Drone C2 (Field Node)</div>
91
  <div class="line">Doctrine <b>v11 LOCKED</b> · <b>749/14/163</b> · <span class="sha">c7c0ba17</span></div>
92
  <div class="line" style="margin-top:5px">Λ = <b>Conjecture 1</b> · Trust Gate = <b>Conjecture</b> · locked proven <b>8</b> {F1,F4,F7,F11,F12,F18,F19,F22}</div>
93
+ <div class="line" style="margin-top:5px">Vessels <b>consolidated</b> into killinchu (/elite) · /wave910 (6 cards) · SLSA <b>L1 honest · L2 attested · L3 roadmap</b></div>
94
  <div class="line" style="margin-top:5px;color:var(--ink-dim)">Field node (edge) tethered to the a11oy substrate upstream</div>
95
  </div>
96
 
killinchu_elite_console.py CHANGED
@@ -371,11 +371,15 @@ __all__ = ["register"]
371
  # ===========================================================================
372
  _CEO_OVERLAY_HTML = r"""<!-- __SZL_CEO_OVERLAY__ : light CEO/investor overlay (additive, 0-CDN) -->
373
  <style>
374
- #szl-ceo-fab{position:fixed;right:16px;bottom:16px;z-index:2147483000;display:inline-flex;align-items:center;gap:8px;
 
 
 
 
375
  font-family:'JetBrains Mono',ui-monospace,monospace;font-size:12px;letter-spacing:.08em;text-transform:uppercase;
376
- padding:11px 16px;min-height:44px;border-radius:10px;border:1px solid rgba(201,183,135,.45);
377
  background:rgba(201,183,135,.12);color:#d6c69a;cursor:pointer;backdrop-filter:blur(8px);
378
- box-shadow:0 8px 26px -10px rgba(0,0,0,.7);}
379
  #szl-ceo-fab:hover{background:rgba(201,183,135,.2);border-color:rgba(201,183,135,.7);}
380
  #szl-ceo-fab .dot{width:8px;height:8px;border-radius:50%;background:#5fb3a3;box-shadow:0 0 0 3px rgba(95,179,163,.18);}
381
  #szl-ceo{position:fixed;inset:0;z-index:2147483001;display:none;overflow-y:auto;
@@ -881,7 +885,8 @@ a{color:inherit;text-decoration:none;}
881
  .nav-group[data-demo-sec]:focus-visible{outline:1px solid var(--teal-line,#2c5d52);outline-offset:2px;}
882
  .nav-item.demo-hidden,.nav-group.demo-hidden,.exp-fence-note.demo-hidden{display:none!important;}
883
  .exp-fence-note{margin:.15rem .5rem .35rem;padding:.45rem .55rem;font-family:var(--mono);font-size:9px;line-height:1.55;color:#caa84b;background:rgba(202,168,75,.06);border:1px dashed rgba(202,168,75,.35);border-radius:6px;letter-spacing:.04em;}
884
- .side-foot{margin-top:1.2rem;padding:.7rem .6rem;border-top:1px solid var(--gold-line);font-family:var(--mono);font-size:9.5px;color:var(--dim);line-height:1.7;}
 
885
 
886
  /* ===== CONTENT ===== */
887
  .content{padding:1.1rem 1.6rem 2rem;overflow-y:auto;overflow-x:hidden;height:100%;min-height:0;-webkit-overflow-scrolling:touch;}
@@ -1201,7 +1206,7 @@ details.raw{margin-top:1rem;} details.raw summary{cursor:pointer;font-family:var
1201
  9-11.5px on desktop by design; bumped to a readable 12px floor on mobile. */
1202
  .nav-group{font-size:12px!important;letter-spacing:.12em;}
1203
  .brand .role{font-size:12px!important;} /* small but >=11; brand sub */
1204
- .side-foot{font-size:12px!important;line-height:1.65;}
1205
  .kpi .k{font-size:12px!important;letter-spacing:.1em;}
1206
  .kpi .d{font-size:12px!important;}
1207
  .view-badge{font-size:12px!important;}
@@ -4930,8 +4935,8 @@ cosign verify-blob --key cosign.pub --signature sig.b64 payload.bin</pre></div>
4930
  <div class="kpi"><div class="k">Declarations</div><div class="v teal" id="me-dag">\u2014</div><div class="d">v11 kernel</div></div></div>
4931
  <div class="grid2">
4932
  <div class="card"><div class="card-h"><span class="card-t">${liveDot()}Golden metric \u2014 telemetry latency by service</span><span class="card-ep">live \u00b7 auto-refresh 8s</span></div><div class="echart" id="me-lat"></div></div>
4933
- <div class="card"><div class="card-h"><span class="card-t">${liveDot()}Event stream \u2014 track / span receipts</span><span class="card-ep"><select id="me-filter" style="background:var(--panel);color:var(--paragraph);border:1px solid var(--gold-line);border-radius:6px;padding:.25rem .5rem;font-family:var(--mono);font-size:11px"><option value="">all services</option></select></span></div>
4934
- <div id="me-stream" style="max-height:300px;overflow:auto"><div class="row mono dim">loading\u2026</div></div></div>
4935
  </div>
4936
  <div class="card" id="me-drill"><div class="row mono dim">Click any span in the stream to drill into it \u2014 its service, traceparent and its span receipt (DSSE-signed when a cosign key is armed, else UNSIGNED-honest) land here.</div></div>${HONEST}`;window.melt_load();}},
4937
 
@@ -7143,7 +7148,7 @@ async function melt_load(){
7143
  var sid=(++window._meSeq);
7144
  var span={id:sid,ts:nowts(),svc:svc.id,svcName:svc.name,model:(trk.model||'track'),status:(trk.status||'telemetry'),lat:svc._lat||0,tp:'00-'+Math.random().toString(16).slice(2,18)+'-'+Math.random().toString(16).slice(2,10)+'-01'};
7145
  window._meSpans[sid]=span;
7146
- var line='<div class="row me-span" data-svc="'+esc(span.svc)+'" style="cursor:pointer;animation:pulse 1.2s 1" onclick="window.melt_drill('+sid+')"><span class="badge b-live">span</span><span>'+esc(span.svcName)+' \u00b7 '+esc(span.model)+' \u00b7 '+esc(span.status)+'</span><span class="spacer mono dim">'+esc(span.ts)+'</span></div>';
7147
  ev.insertAdjacentHTML('afterbegin',line);
7148
  while(ev.children.length>40) ev.removeChild(ev.lastChild);
7149
  melt_apply_filter();
 
371
  # ===========================================================================
372
  _CEO_OVERLAY_HTML = r"""<!-- __SZL_CEO_OVERLAY__ : light CEO/investor overlay (additive, 0-CDN) -->
373
  <style>
374
+ /* Investor pill stacks ABOVE the floating reliability/Chaski orb badge so the two
375
+ never overlap or clip the circular FAB at 1280-1920px. Both share the bottom-right
376
+ corner; the pill sits one row up (safe-area aware), max-width capped to viewport. */
377
+ #szl-ceo-fab{position:fixed;right:calc(env(safe-area-inset-right,0px) + 16px);
378
+ bottom:calc(env(safe-area-inset-bottom,0px) + 74px);z-index:2147483000;display:inline-flex;align-items:center;gap:8px;
379
  font-family:'JetBrains Mono',ui-monospace,monospace;font-size:12px;letter-spacing:.08em;text-transform:uppercase;
380
+ padding:11px 16px;min-height:44px;max-width:calc(100vw - 32px);border-radius:10px;border:1px solid rgba(201,183,135,.45);
381
  background:rgba(201,183,135,.12);color:#d6c69a;cursor:pointer;backdrop-filter:blur(8px);
382
+ box-shadow:0 8px 26px -10px rgba(0,0,0,.7);white-space:nowrap;}
383
  #szl-ceo-fab:hover{background:rgba(201,183,135,.2);border-color:rgba(201,183,135,.7);}
384
  #szl-ceo-fab .dot{width:8px;height:8px;border-radius:50%;background:#5fb3a3;box-shadow:0 0 0 3px rgba(95,179,163,.18);}
385
  #szl-ceo{position:fixed;inset:0;z-index:2147483001;display:none;overflow-y:auto;
 
885
  .nav-group[data-demo-sec]:focus-visible{outline:1px solid var(--teal-line,#2c5d52);outline-offset:2px;}
886
  .nav-item.demo-hidden,.nav-group.demo-hidden,.exp-fence-note.demo-hidden{display:none!important;}
887
  .exp-fence-note{margin:.15rem .5rem .35rem;padding:.45rem .55rem;font-family:var(--mono);font-size:9px;line-height:1.55;color:#caa84b;background:rgba(202,168,75,.06);border:1px dashed rgba(202,168,75,.35);border-radius:6px;letter-spacing:.04em;}
888
+ .side-foot{margin-top:1.2rem;padding:.85rem .6rem 1.1rem;border-top:1px solid var(--gold-line);font-family:var(--mono);font-size:10px;color:var(--dim);line-height:1.95;letter-spacing:.02em;}
889
+ .side-foot br{line-height:2.1;}
890
 
891
  /* ===== CONTENT ===== */
892
  .content{padding:1.1rem 1.6rem 2rem;overflow-y:auto;overflow-x:hidden;height:100%;min-height:0;-webkit-overflow-scrolling:touch;}
 
1206
  9-11.5px on desktop by design; bumped to a readable 12px floor on mobile. */
1207
  .nav-group{font-size:12px!important;letter-spacing:.12em;}
1208
  .brand .role{font-size:12px!important;} /* small but >=11; brand sub */
1209
+ .side-foot{font-size:12px!important;line-height:1.9;}
1210
  .kpi .k{font-size:12px!important;letter-spacing:.1em;}
1211
  .kpi .d{font-size:12px!important;}
1212
  .view-badge{font-size:12px!important;}
 
4935
  <div class="kpi"><div class="k">Declarations</div><div class="v teal" id="me-dag">\u2014</div><div class="d">v11 kernel</div></div></div>
4936
  <div class="grid2">
4937
  <div class="card"><div class="card-h"><span class="card-t">${liveDot()}Golden metric \u2014 telemetry latency by service</span><span class="card-ep">live \u00b7 auto-refresh 8s</span></div><div class="echart" id="me-lat"></div></div>
4938
+ <div class="card"><div class="card-h"><span class="card-t">Event stream \u2014 track / span receipts <span class="badge b-warn" style="margin-left:.4rem">MODELED cadence</span></span><span class="card-ep"><select id="me-filter" style="background:var(--panel);color:var(--paragraph);border:1px solid var(--gold-line);border-radius:6px;padding:.25rem .5rem;font-family:var(--mono);font-size:11px"><option value="">all services</option></select></span></div>
4939
+ <div id="me-stream" style="max-height:300px;overflow:auto"><div class="row mono dim">awaiting spans</div></div></div>
4940
  </div>
4941
  <div class="card" id="me-drill"><div class="row mono dim">Click any span in the stream to drill into it \u2014 its service, traceparent and its span receipt (DSSE-signed when a cosign key is armed, else UNSIGNED-honest) land here.</div></div>${HONEST}`;window.melt_load();}},
4942
 
 
7148
  var sid=(++window._meSeq);
7149
  var span={id:sid,ts:nowts(),svc:svc.id,svcName:svc.name,model:(trk.model||'track'),status:(trk.status||'telemetry'),lat:svc._lat||0,tp:'00-'+Math.random().toString(16).slice(2,18)+'-'+Math.random().toString(16).slice(2,10)+'-01'};
7150
  window._meSpans[sid]=span;
7151
+ var line='<div class="row me-span" data-svc="'+esc(span.svc)+'" style="cursor:pointer;animation:pulse 1.2s 1" onclick="window.melt_drill('+sid+')"><span class="badge b-warn" title="MODELED: span composed from real /mesh/state services + /threats/active tracks; the emission cadence is synthesized, not a captured trace event">MODELED</span><span>'+esc(span.svcName)+' \u00b7 '+esc(span.model)+' \u00b7 '+esc(span.status)+'</span><span class="spacer mono dim">'+esc(span.ts)+'</span></div>';
7152
  ev.insertAdjacentHTML('afterbegin',line);
7153
  while(ev.children.length>40) ev.removeChild(ev.lastChild);
7154
  melt_apply_filter();
static/landing.html CHANGED
@@ -155,7 +155,7 @@ img, svg { display: block; }
155
  /* ---- ORBITAL ANIMATION -------------------------------------------------- */
156
  .ds-orbital { position: relative; width: 100%; aspect-ratio: 1 / 1; max-width: 520px; margin: 0 auto; border-radius: 18px; overflow: hidden; background: radial-gradient(circle at 50% 50%, rgba(201,183,135,0.06) 0%, rgba(201,183,135,0.02) 35%, rgba(0,0,0,0) 65%), #0d0d0d; border: 1px solid var(--hairline); box-shadow: 0 30px 80px -20px rgba(0,0,0,0.6), inset 0 0 0 1px rgba(255,255,255,0.02); }
157
  .ds-orbital__corner { position: absolute; width: 14px; height: 14px; border-top: 1px solid var(--gold); border-left: 1px solid var(--gold); opacity: 0.55; pointer-events: none; }
158
- .ds-orbital__hud {text-shadow:0 0 6px rgba(8,8,8,.95),0 0 2px #080808; position: absolute; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); line-height: 1.7; z-index: 3; }
159
  .ds-orbital__hud .gold { color: var(--gold-dim); }
160
  .ds-orbital__hud .teal { color: var(--teal); }
161
  .ds-orbital__scan { position: absolute; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--gold) 50%, transparent); opacity: 0.35; mix-blend-mode: screen; animation: ds-scan 5.5s linear infinite; z-index: 2; }
 
155
  /* ---- ORBITAL ANIMATION -------------------------------------------------- */
156
  .ds-orbital { position: relative; width: 100%; aspect-ratio: 1 / 1; max-width: 520px; margin: 0 auto; border-radius: 18px; overflow: hidden; background: radial-gradient(circle at 50% 50%, rgba(201,183,135,0.06) 0%, rgba(201,183,135,0.02) 35%, rgba(0,0,0,0) 65%), #0d0d0d; border: 1px solid var(--hairline); box-shadow: 0 30px 80px -20px rgba(0,0,0,0.6), inset 0 0 0 1px rgba(255,255,255,0.02); }
157
  .ds-orbital__corner { position: absolute; width: 14px; height: 14px; border-top: 1px solid var(--gold); border-left: 1px solid var(--gold); opacity: 0.55; pointer-events: none; }
158
+ .ds-orbital__hud{text-shadow:0 0 6px rgba(8,8,8,.95),0 0 2px #080808; position: absolute; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); line-height: 1.7; z-index: 3; ;background:rgba(8,12,20,.78);padding:5px 7px;border-radius:2px}
159
  .ds-orbital__hud .gold { color: var(--gold-dim); }
160
  .ds-orbital__hud .teal { color: var(--teal); }
161
  .ds-orbital__scan { position: absolute; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--gold) 50%, transparent); opacity: 0.35; mix-blend-mode: screen; animation: ds-scan 5.5s linear infinite; z-index: 2; }
static/navy.html CHANGED
@@ -52,12 +52,12 @@
52
  <header>
53
  <svg class="logo" viewBox="0 0 32 32"><path d="M16 3 L27 27 L16 21 L5 27 Z" fill="#d7b96b"/></svg>
54
  <div class="ttl">Killinchu <b>/ Warhacker</b> — Defense Unicorns hackathon, packages on UDS Core</div>
55
- <span class="chip"><span class="dot"></span>4 ORGANS LIVE</span>
56
  <span class="chip" style="color:#5cc4bf;border-color:rgba(92,196,191,.45)" title="Compatible with Defense Unicorns UDS Core (not certified)">✓ UDS Core compatible</span>
57
  <span class="chip" style="color:#5cc4bf;border-color:rgba(92,196,191,.45)" title="Section 889: five banned vendors, none used">✓ Section 889 · 5 banned vendors clean</span>
58
  <span class="chip">ZARF-packaged</span>
59
  <span class="sp"></span>
60
- <span class="doc">DOCTRINE v11 LOCKED · 749 · 14 · 163 · SLSA L1 honest (L2 in progress) · Λ Conjecture (not a theorem)</span>
61
  </header>
62
  <main>
63
  <h1>Defense Unicorns Warhacker — <span class="accent">packages on UDS Core</span>.</h1>
@@ -67,7 +67,7 @@
67
  <div class="cell good"><div class="v">Enterprise Agents</div><div class="k">CDAO lane (our lane)</div></div>
68
  <div class="cell good"><div class="v">✓ UDS Core compatible</div><div class="k">interoperability badge (not certified)</div></div>
69
  <div class="cell good"><div class="v">ZARF-packaged</div><div class="k">airgap bundle (available)</div></div>
70
- <div class="cell"><div class="v">SLSA L1 honest</div><div class="k">L2 in progress</div></div>
71
  <div class="cell good"><div class="v">✓ Section 889 · 5 clean</div><div class="k">no banned vendors</div></div>
72
  </div>
73
 
@@ -78,7 +78,7 @@
78
  <a href="/uds">UDS Core</a> ·
79
  <a href="/uds/sbom">SBOM (SPDX+CycloneDX)</a> ·
80
  <a href="/uds/sigstore">Sigstore (cosign + public Rekor)</a> ·
81
- <a href="/uds/cmmc">CMMC L1 (17 practices)</a> ·
82
  <a href="/uds/889">Section 889 (five vendors)</a> ·
83
  <a href="/uds/zarf">ZARF air-gap deploy</a> ·
84
  <a href="/uds/mission-owner">Mission Owner (Iron Bank sponsor ask)</a>
@@ -99,11 +99,11 @@
99
  <h2>Honest compliance posture</h2>
100
  <table>
101
  <tr><th>Item</th><th>State</th><th>Note</th></tr>
102
- <tr><td>SLSA Build</td><td class="warn">L1 honest (L2 in progress)</td><td>Real cosign-signed provenance, Rekor-anchored. L2 via hosted CI + cosign, in progress.</td></tr>
103
  <tr><td>ZARF + UDS Core packaging</td><td class="ok">Available</td><td>UDS Core compatible; ZARF bundle for airgap. Not certified.</td></tr>
104
  <tr><td>NDAA §889</td><td class="ok">Defensible / signable</td><td>5 banned vendors: Huawei, ZTE, Hytera, Hikvision, Dahua. No banned hardware on bench.</td></tr>
105
  <tr><td>Iron Bank</td><td class="no">Not accredited</td><td>Iron Bank requires a government Mission Owner sponsor — invitation-only; you cannot self-register. Target via Warhacker.</td></tr>
106
- <tr><td>CMMC</td><td class="warn">L1 self-attest (planned)</td><td>L2/L3 deferred until a contract imposes CUI.</td></tr>
107
  </table>
108
  </section>
109
 
 
52
  <header>
53
  <svg class="logo" viewBox="0 0 32 32"><path d="M16 3 L27 27 L16 21 L5 27 Z" fill="#d7b96b"/></svg>
54
  <div class="ttl">Killinchu <b>/ Warhacker</b> — Defense Unicorns hackathon, packages on UDS Core</div>
55
+ <span class="chip" title="Live status is on the /operator console; this booth is a static overview">4 ORGANS · status on /operator</span>
56
  <span class="chip" style="color:#5cc4bf;border-color:rgba(92,196,191,.45)" title="Compatible with Defense Unicorns UDS Core (not certified)">✓ UDS Core compatible</span>
57
  <span class="chip" style="color:#5cc4bf;border-color:rgba(92,196,191,.45)" title="Section 889: five banned vendors, none used">✓ Section 889 · 5 banned vendors clean</span>
58
  <span class="chip">ZARF-packaged</span>
59
  <span class="sp"></span>
60
+ <span class="doc">DOCTRINE v11 LOCKED · 749 · 14 · 163 · SLSA L1 honest · L2 attested · L3 roadmap · Λ Conjecture (not a theorem)</span>
61
  </header>
62
  <main>
63
  <h1>Defense Unicorns Warhacker — <span class="accent">packages on UDS Core</span>.</h1>
 
67
  <div class="cell good"><div class="v">Enterprise Agents</div><div class="k">CDAO lane (our lane)</div></div>
68
  <div class="cell good"><div class="v">✓ UDS Core compatible</div><div class="k">interoperability badge (not certified)</div></div>
69
  <div class="cell good"><div class="v">ZARF-packaged</div><div class="k">airgap bundle (available)</div></div>
70
+ <div class="cell"><div class="v">SLSA L1 honest</div><div class="k">L2 attested · L3 roadmap</div></div>
71
  <div class="cell good"><div class="v">✓ Section 889 · 5 clean</div><div class="k">no banned vendors</div></div>
72
  </div>
73
 
 
78
  <a href="/uds">UDS Core</a> ·
79
  <a href="/uds/sbom">SBOM (SPDX+CycloneDX)</a> ·
80
  <a href="/uds/sigstore">Sigstore (cosign + public Rekor)</a> ·
81
+ <a href="/uds/cmmc">CMMC L1 self-attest (roadmap, 17 practices)</a> ·
82
  <a href="/uds/889">Section 889 (five vendors)</a> ·
83
  <a href="/uds/zarf">ZARF air-gap deploy</a> ·
84
  <a href="/uds/mission-owner">Mission Owner (Iron Bank sponsor ask)</a>
 
99
  <h2>Honest compliance posture</h2>
100
  <table>
101
  <tr><th>Item</th><th>State</th><th>Note</th></tr>
102
+ <tr><td>SLSA Build</td><td class="warn">L1 honest · L2 attested · L3 roadmap</td><td>Real cosign-signed provenance, Rekor-anchored. L2 attested via hosted CI + cosign; L3 is a roadmap item.</td></tr>
103
  <tr><td>ZARF + UDS Core packaging</td><td class="ok">Available</td><td>UDS Core compatible; ZARF bundle for airgap. Not certified.</td></tr>
104
  <tr><td>NDAA §889</td><td class="ok">Defensible / signable</td><td>5 banned vendors: Huawei, ZTE, Hytera, Hikvision, Dahua. No banned hardware on bench.</td></tr>
105
  <tr><td>Iron Bank</td><td class="no">Not accredited</td><td>Iron Bank requires a government Mission Owner sponsor — invitation-only; you cannot self-register. Target via Warhacker.</td></tr>
106
+ <tr><td>CMMC</td><td class="warn">L1 self-attest — roadmap</td><td>Roadmap item, not a held certification. L2/L3 deferred until a contract imposes CUI.</td></tr>
107
  </table>
108
  </section>
109
 
static/uds-compliance.html CHANGED
@@ -120,12 +120,12 @@
120
  <!-- FRAMEWORKS -->
121
  <section class="sec" id="s-frameworks">
122
  <h1>Framework <b>Mappings</b></h1>
123
- <p class="sub">STIG-hardened</p>
124
  <div class="grid g2">
125
- <div class="card" id="fw-"><h3>STIG-hardened</h3><div class="load">Loading…</div></div>
126
  <div class="card" id="fw-nist"><h3>NIST AI RMF 1.0</h3><div class="load">Loading…</div></div>
127
  <div class="card" id="fw-eu"><h3>EU AI Act Article 12</h3><div class="load">Loading…</div></div>
128
- <div class="card" id="fw-fedramp"><h3>FedRAMP Moderate posture</h3><div class="load">Loading…</div></div>
129
  </div>
130
  </section>
131
  <!-- RAW -->
@@ -155,7 +155,7 @@ const API="/api/killinchu/uds/v1";
155
  const FLAGSHIPS=[{k:"a11oy",label:"Orchestrator (a11oy)"},{k:"killinchu",label:"Field Node (killinchu)"},{k:"vessels",label:"vessels"},{k:"hatun-mcp",label:"hatun-mcp"}];
156
  const $=s=>document.querySelector(s);
157
  async function get(p){const r=await fetch(API+"/"+p);return r.json();}
158
- function sigLine(j){const ok=j.signed;return `<span class="dot ${ok?'ok':'no'}"></span>${ok?'DSSE SIGNED':'UNSIGNED (no key in runtime — honest, not fabricated)'} · keyid ${(j.dsse&&j.dsse.signatures&&j.dsse.signatures[0]?j.dsse.signatures[0].keyid:'szlholdings-cosign')} · receipt ${(j.receipt_sha256||'').slice(0,16)||''}`;}
159
  function badge(v){if(v===true)return '<span class="badge b-green">yes</span>';if(v===false)return '<span class="badge b-red">no</span>';return `<span class="badge b-warn">${v}</span>`;}
160
 
161
  // nav
@@ -166,44 +166,44 @@ document.querySelectorAll('#nav a').forEach(a=>a.onclick=()=>{
166
  async function loadStig(){
167
  const j=await get("stig/scan-report/killinchu");
168
  const b=j.baseline||{},h=j.hardened||{};
 
 
169
  $('#stig-kpis').innerHTML=`
170
- <div class="card"><h3>Baseline score</h3><div class="kpi">${b.score_pct}<small>/100</small></div><div class="bar"><span style="width:${b.score_pct}%"></span></div></div>
171
- <div class="card"><h3>Hardened score</h3><div class="kpi" style="color:var(--teal)">${h.score_pct}<small>/100</small></div><div class="delta up">+${(h.score_pct-b.score_pct).toFixed(2)} from hardening layer</div></div>
172
- <div class="card"><h3>Rules passed</h3><div class="kpi">${b.rules_passed}${h.rules_passed}</div><div class="delta up">${j.rules_fixed_by_image_hardening} fixed</div></div>
173
- <div class="card"><h3>High-sev fails</h3><div class="kpi" style="color:var(--gold)">${(b.fail_by_severity||{}).high||0}</div><div class="honest" style="margin-top:6px">FIPS/SELinux kernel-boot, not image-layer</div></div>`;
174
  const tb=$('#stig-table tbody');tb.innerHTML="";
175
  for(const fo of FLAGSHIPS){const f=fo.k;const jr=await get("stig/scan-report/"+f);const node=(f==="vessels");
176
  const jb=jr.baseline||{},jh=jr.hardened||{};
177
  tb.innerHTML+=`<tr><td><b>${fo.label}</b></td><td class="mono" style="font-size:11px">${node?'nodejs20 (IB)':'ubi9-minimal (IB)'}</td>
178
- <td class="num">${jb.score_pct??''}</td><td class="num" style="color:var(--teal)">${jh.score_pct??''}</td>
179
- <td class="num">${jr.rules_fixed_by_image_hardening??''}</td>
180
  <td>${node?'<span class="badge b-warn">node base pending</span>':'<span class="badge b-green">scanned</span>'}</td></tr>`;}
181
  $('#stig-sig').innerHTML=sigLine(j);
182
  $('#stig-fails').innerHTML=(j.top_high_severity_fails||[]).map(r=>`<span class="badge b-red" style="margin:3px">${r}</span>`).join('')+
183
  `<div class="honest">${j.honesty||''}</div>`;
184
  }
185
- /* loadIB() REMOVED — STIG Baseline per CTO P1 REJECT */</b></td><td>${f.language}</td>
186
- <td class="mono" style="font-size:11px">${f.current_base}</td><td class="mono" style="font-size:11px">${f.ironbank_target_base.replace('registry1.dso.mil/ironbank/','…/')}</td>
187
- <td>${badge(f.ironbank_image_pushed==='Y')}</td><td><span class="badge b-warn">${f.pull_status}</span></td></tr>`);
188
- $('#ib-honest').textContent=j.honesty||'';$('#ib-sig').innerHTML=sigLine(j);}
189
  async function loadBB(){const j=await get("big-bang/parity");const o=j.rendered_objects||{};
190
- $('#bb-kpis').innerHTML=`<div class="card"><h3>helm lint</h3><div class="kpi" style="font-size:22px;color:var(--green)">PASS</div><div class="honest">${j.lint_status||''}</div></div>
191
- <div class="card"><h3>Rendered objects</h3><div class="kpi">${o.total||''}</div><div class="delta up">7 flagships × full set</div></div>
192
- <div class="card"><h3>Chart artifact</h3><div class="kpi" style="font-size:18px">${j.packaged_artifact||'szl-0.1.0.tgz'}</div><div class="honest">helm ${j.helm_version||''}</div></div>`;
 
193
  const tb=$('#bb-table tbody');tb.innerHTML="";(j.big_bang_compat_matrix||[]).forEach(m=>
194
  tb.innerHTML+=`<tr><td>${m.feature}</td><td>${badge(m.big_bang)}</td><td>${badge(m.szl)}</td></tr>`);
195
  $('#bb-honest').textContent=(j.install_command?'$ '+j.install_command+' — ':'')+(j.honesty||'');$('#bb-sig').innerHTML=sigLine(j);}
196
  async function loadTW(){const j=await get("tradewinds/listing");const c=j.company||{},p=j.compliance_posture||{},s=j.solution||{};
197
  $('#tw-company').innerHTML=`<h3>Company</h3><table>
198
  <tr><td>Name</td><td><b>${c.name||''}</b></td></tr>
199
- <tr><td>CAGE</td><td>${c.cage_code&&c.cage_code.value?c.cage_code.value:'<span class="badge b-warn">stub SAM.gov</span>'}</td></tr>
200
- <tr><td>UEI</td><td>${c.uei&&c.uei.value?c.uei.value:'<span class="badge b-warn">stub SAM.gov</span>'}</td></tr>
201
  <tr><td>Tradewinds acct</td><td><span class="badge b-warn">founder action</span></td></tr></table>`;
202
  $('#tw-posture').innerHTML=`<h3>Compliance posture</h3><table>
203
- <tr><td>IL5</td><td>${badge((p.il5_readiness||{}).status||'ROADMAP')}</td></tr>
204
- <tr><td>STIG-Hardened</td><td>${badge((p.stig-hardened||{}).status||'ROADMAP')}</td></tr>
205
- <tr><td>FedRAMP</td><td>${badge((p.fedramp||{}).status||'ROADMAP')}</td></tr>
206
- <tr><td>SLSA</td><td>${badge((p.slsa||{}).status||'L1')}</td></tr>
207
  <tr><td>Signing</td><td class="mono" style="font-size:11px">${(p.signing||{}).keyid||'szlholdings-cosign'}</td></tr></table>`;
208
  $('#tw-caps').innerHTML=`<div style="font-weight:600;margin-bottom:8px">${s.name||''}</div><div class="honest" style="border-color:var(--gold)">${s.tagline||''}</div><ul>`+
209
  (s.capabilities||[]).map(x=>`<li style="margin:4px 0">${x}</li>`).join('')+'</ul><div class="honest">'+(j.honesty||'')+'</div>';
@@ -220,13 +220,13 @@ async function loadFW(){
220
  const eu=await get("eu-ai-act/article-12");$('#fw-eu').innerHTML=`<h3>EU AI Act Article 12</h3>`+
221
  `<div style="font-size:12px;color:var(--muted)">${eu.article||''}</div><pre style="max-height:200px;margin-top:8px">${JSON.stringify(eu.logging_mechanism||eu,null,1)}</pre>`+
222
  `<div class="honest">${eu.honesty||''}</div><div class="sig">${sigLine(eu)}</div>`;
223
- const fr=await get("fedramp/posture");$('#fw-fedramp').innerHTML=`<h3>FedRAMP Moderate posture</h3>`+
224
- `<div style="font-size:12px;color:var(--muted);margin-bottom:6px">${fr.baseline||''}</div>`+
225
  (fr.families||[]).map(f=>`<div style="margin:4px 0">${badge(f.status==='supported'?true:f.status)} <b>${f.family}</b></div>`).join('')+
226
- `<div class="honest">${fr.authorization_status||''} ${fr.honesty||''}</div><div class="sig">${sigLine(fr)}</div>`;
227
  }
228
  $('#raw-pick').onchange=async e=>{$('#raw-out').textContent='…';const j=await get(e.target.value);$('#raw-out').textContent=JSON.stringify(j,null,2);};
229
- (async()=>{try{await loadStig();awaitawait loadBB();await loadTW();await loadFW();
230
  $('#raw-out').textContent=JSON.stringify(await get("stig/scan-report/killinchu"),null,2);}catch(e){console.error(e);}})();
231
  </script>
232
  </body>
 
120
  <!-- FRAMEWORKS -->
121
  <section class="sec" id="s-frameworks">
122
  <h1>Framework <b>Mappings</b></h1>
123
+ <p class="sub">Engineering-level control mappings — STIG-Hardened delta, NIST AI RMF, EU AI Act Art.12, and FedRAMP posture. Mappings, not conformity assertions; no certification claimed.</p>
124
  <div class="grid g2">
125
+ <div class="card" id="fw-stig-hardened"><h3>STIG-Hardened delta</h3><div class="load">Loading…</div></div>
126
  <div class="card" id="fw-nist"><h3>NIST AI RMF 1.0</h3><div class="load">Loading…</div></div>
127
  <div class="card" id="fw-eu"><h3>EU AI Act Article 12</h3><div class="load">Loading…</div></div>
128
+ <div class="card" id="fw-fedramp"><h3>FedRAMP Moderate — roadmap posture</h3><div class="load">Loading…</div></div>
129
  </div>
130
  </section>
131
  <!-- RAW -->
 
155
  const FLAGSHIPS=[{k:"a11oy",label:"Orchestrator (a11oy)"},{k:"killinchu",label:"Field Node (killinchu)"},{k:"vessels",label:"vessels"},{k:"hatun-mcp",label:"hatun-mcp"}];
156
  const $=s=>document.querySelector(s);
157
  async function get(p){const r=await fetch(API+"/"+p);return r.json();}
158
+ function sigLine(j){const ok=j.signed;return `<span class="dot ${ok?'ok':'no'}"></span>${ok?'DSSE SIGNED':'UNSIGNED (no key in runtime — honest, not fabricated)'} · keyid ${(j.dsse&&j.dsse.signatures&&j.dsse.signatures[0]?j.dsse.signatures[0].keyid:'szlholdings-cosign')} · receipt ${(j.receipt_sha256||'').slice(0,16)||'awaiting sweep'}`;}
159
  function badge(v){if(v===true)return '<span class="badge b-green">yes</span>';if(v===false)return '<span class="badge b-red">no</span>';return `<span class="badge b-warn">${v}</span>`;}
160
 
161
  // nav
 
166
  async function loadStig(){
167
  const j=await get("stig/scan-report/killinchu");
168
  const b=j.baseline||{},h=j.hardened||{};
169
+ const bScore=(b.score_pct!=null?b.score_pct:null), hScore=(h.score_pct!=null?h.score_pct:null);
170
+ const delta=(bScore!=null&&hScore!=null)?('+'+(hScore-bScore).toFixed(2)+' from hardening layer'):'awaiting sweep';
171
  $('#stig-kpis').innerHTML=`
172
+ <div class="card"><h3>Baseline score <span class="badge b-mute">measured</span></h3><div class="kpi">${bScore!=null?bScore:'<small>awaiting sweep</small>'}${bScore!=null?'<small>/100</small>':''}</div><div class="bar"><span style="width:${bScore!=null?bScore:0}%"></span></div></div>
173
+ <div class="card"><h3>Hardened score <span class="badge b-mute">measured</span></h3><div class="kpi" style="color:var(--teal)">${hScore!=null?hScore:'<small>awaiting sweep</small>'}${hScore!=null?'<small>/100</small>':''}</div><div class="delta up">${delta}</div></div>
174
+ <div class="card"><h3>Rules passed <span class="badge b-mute">measured</span></h3><div class="kpi">${(b.rules_passed!=null&&h.rules_passed!=null)?b.rules_passed+''+h.rules_passed:'<small>awaiting sweep</small>'}</div><div class="delta up">${j.rules_fixed_by_image_hardening!=null?j.rules_fixed_by_image_hardening+' fixed':'awaiting sweep'}</div></div>
175
+ <div class="card"><h3>High-sev fails <span class="badge b-mute">measured</span></h3><div class="kpi" style="color:var(--gold)">${(b.fail_by_severity||{}).high||0}</div><div class="honest" style="margin-top:6px">FIPS/SELinux gaps are kernel-boot, not image-layer</div></div>`;
176
  const tb=$('#stig-table tbody');tb.innerHTML="";
177
  for(const fo of FLAGSHIPS){const f=fo.k;const jr=await get("stig/scan-report/"+f);const node=(f==="vessels");
178
  const jb=jr.baseline||{},jh=jr.hardened||{};
179
  tb.innerHTML+=`<tr><td><b>${fo.label}</b></td><td class="mono" style="font-size:11px">${node?'nodejs20 (IB)':'ubi9-minimal (IB)'}</td>
180
+ <td class="num">${jb.score_pct!=null?jb.score_pct:'<span class="badge b-mute">awaiting sweep</span>'}</td><td class="num" style="color:var(--teal)">${jh.score_pct!=null?jh.score_pct:'<span class="badge b-mute">awaiting sweep</span>'}</td>
181
+ <td class="num">${jr.rules_fixed_by_image_hardening!=null?jr.rules_fixed_by_image_hardening:'<span class="badge b-mute">awaiting sweep</span>'}</td>
182
  <td>${node?'<span class="badge b-warn">node base pending</span>':'<span class="badge b-green">scanned</span>'}</td></tr>`;}
183
  $('#stig-sig').innerHTML=sigLine(j);
184
  $('#stig-fails').innerHTML=(j.top_high_severity_fails||[]).map(r=>`<span class="badge b-red" style="margin:3px">${r}</span>`).join('')+
185
  `<div class="honest">${j.honesty||''}</div>`;
186
  }
187
+ /* loadIB() REMOVED — STIG Baseline per CTO P1 REJECT (Charter §24). No orphaned render. */
 
 
 
188
  async function loadBB(){const j=await get("big-bang/parity");const o=j.rendered_objects||{};
189
+ const lintPass=(j.lint_status||'').toLowerCase().includes('pass')||j.lint_passed===true;
190
+ $('#bb-kpis').innerHTML=`<div class="card"><h3>helm lint <span class="badge b-mute">measured</span></h3><div class="kpi" style="font-size:22px;color:${lintPass?'var(--green)':'var(--gold)'}">${j.lint_status?(lintPass?'PASS':'REVIEW'):'awaiting sweep'}</div><div class="honest">${j.lint_status||'no helm lint output in this runtime'}</div></div>
191
+ <div class="card"><h3>Rendered objects <span class="badge b-mute">measured</span></h3><div class="kpi">${o.total!=null?o.total:'<small>awaiting sweep</small>'}</div><div class="delta up">${o.total!=null?'across '+FLAGSHIPS.length+' components':'no render'}</div></div>
192
+ <div class="card"><h3>Chart artifact</h3><div class="kpi" style="font-size:18px">${j.packaged_artifact||'szl-0.1.0.tgz'}</div><div class="honest">helm ${j.helm_version||'version awaiting sweep'}</div></div>`;
193
  const tb=$('#bb-table tbody');tb.innerHTML="";(j.big_bang_compat_matrix||[]).forEach(m=>
194
  tb.innerHTML+=`<tr><td>${m.feature}</td><td>${badge(m.big_bang)}</td><td>${badge(m.szl)}</td></tr>`);
195
  $('#bb-honest').textContent=(j.install_command?'$ '+j.install_command+' — ':'')+(j.honesty||'');$('#bb-sig').innerHTML=sigLine(j);}
196
  async function loadTW(){const j=await get("tradewinds/listing");const c=j.company||{},p=j.compliance_posture||{},s=j.solution||{};
197
  $('#tw-company').innerHTML=`<h3>Company</h3><table>
198
  <tr><td>Name</td><td><b>${c.name||''}</b></td></tr>
199
+ <tr><td>CAGE</td><td>${c.cage_code&&c.cage_code.value?c.cage_code.value:'<span class="badge b-warn">awaiting SAM.gov</span>'}</td></tr>
200
+ <tr><td>UEI</td><td>${c.uei&&c.uei.value?c.uei.value:'<span class="badge b-warn">awaiting SAM.gov</span>'}</td></tr>
201
  <tr><td>Tradewinds acct</td><td><span class="badge b-warn">founder action</span></td></tr></table>`;
202
  $('#tw-posture').innerHTML=`<h3>Compliance posture</h3><table>
203
+ <tr><td>IL5</td><td>${badge((p.il5_readiness||{}).status||'roadmap')}</td></tr>
204
+ <tr><td>STIG-Hardened</td><td>${badge((p['stig-hardened']||{}).status||'roadmap')}</td></tr>
205
+ <tr><td>FedRAMP</td><td>${badge((p.fedramp||{}).status||'roadmap')}</td></tr>
206
+ <tr><td>SLSA</td><td>${badge((p.slsa||{}).status||'L1 honest · L2 attested · L3 roadmap')}</td></tr>
207
  <tr><td>Signing</td><td class="mono" style="font-size:11px">${(p.signing||{}).keyid||'szlholdings-cosign'}</td></tr></table>`;
208
  $('#tw-caps').innerHTML=`<div style="font-weight:600;margin-bottom:8px">${s.name||''}</div><div class="honest" style="border-color:var(--gold)">${s.tagline||''}</div><ul>`+
209
  (s.capabilities||[]).map(x=>`<li style="margin:4px 0">${x}</li>`).join('')+'</ul><div class="honest">'+(j.honesty||'')+'</div>';
 
220
  const eu=await get("eu-ai-act/article-12");$('#fw-eu').innerHTML=`<h3>EU AI Act Article 12</h3>`+
221
  `<div style="font-size:12px;color:var(--muted)">${eu.article||''}</div><pre style="max-height:200px;margin-top:8px">${JSON.stringify(eu.logging_mechanism||eu,null,1)}</pre>`+
222
  `<div class="honest">${eu.honesty||''}</div><div class="sig">${sigLine(eu)}</div>`;
223
+ const fr=await get("fedramp/posture");$('#fw-fedramp').innerHTML=`<h3>FedRAMP Moderate — roadmap posture</h3>`+
224
+ `<div style="font-size:12px;color:var(--muted);margin-bottom:6px">${fr.baseline||'awaiting sweep'} · roadmap item, not an authorization</div>`+
225
  (fr.families||[]).map(f=>`<div style="margin:4px 0">${badge(f.status==='supported'?true:f.status)} <b>${f.family}</b></div>`).join('')+
226
+ `<div class="honest">${fr.authorization_status||'not authorized — FedRAMP is a roadmap item, no ATO held'} ${fr.honesty||''}</div><div class="sig">${sigLine(fr)}</div>`;
227
  }
228
  $('#raw-pick').onchange=async e=>{$('#raw-out').textContent='…';const j=await get(e.target.value);$('#raw-out').textContent=JSON.stringify(j,null,2);};
229
+ (async()=>{try{await loadStig();await loadBB();await loadTW();await loadFW();
230
  $('#raw-out').textContent=JSON.stringify(await get("stig/scan-report/killinchu"),null,2);}catch(e){console.error(e);}})();
231
  </script>
232
  </body>
static/uds.html CHANGED
@@ -171,7 +171,7 @@
171
  <span class="chip"><span class="dot"></span>4 ORGANS LIVE</span>
172
  <span class="chip">SOLE FRONT DOOR · /api/killinchu/uds/v1/*</span>
173
  <span class="sp"></span>
174
- <span class="doc">DOCTRINE <b>v11</b> LOCKED · 749 · 14 · 163 · SLSA L1 (honest) · Λ Conjecture (not a theorem)</span>
175
  </header>
176
 
177
  <div class="body">
@@ -212,7 +212,7 @@
212
  <div class="col center">
213
  <div style="position:relative">
214
  <div id="cesiumContainer"></div>
215
- <div class="globe-tag" id="globetag">🦅 <b>Killinchu</b> in the field · airspace <b id="gt-class"></b> · tracks <b id="gt-tracks">simulated snapshot</b></div>
216
  </div>
217
  <div class="killstrip">
218
  <div class="hd">
@@ -302,14 +302,14 @@
302
  .then(function(j){
303
  var links=(j.aggregated_receipt&&j.aggregated_receipt.chain)||[];
304
  renderChain(links); links.forEach(function(l){setHero(l.organ,l.verdict,l.latency_ms);});
305
- ORGANS.forEach(function(o){ if(!links.filter(function(l){return l.organ===o.k;})[0]) setHero(o.k,""); });
306
  var v=j.verdict||"warn"; el("killverdict").className="v "+v; el("killverdict").textContent=v.toUpperCase();
307
  lastSha=j.receipt_sha256;
308
  var agg=j.aggregated_receipt||{}, sig=(agg.aggregate_signature||"").slice(0,42);
309
  var R=el("receipt"); R.style.display="block";
310
- R.innerHTML=kv("mission",j.uds_mission_id||"")+kv("verdict",(j.verdict||"").toUpperCase())+
311
- kv("sha256",j.receipt_sha256||"","sha")+kv("signed",String(agg.aggregate_signed))+
312
- kv("keyid",agg.keyid||"szlholdings-cosign")+kv("sig",sig?sig+"…":"","sig");
313
  el("verifyBtn").disabled=false;
314
  if(action==="geofence_check"){ el("gt-class").textContent="checked"; }
315
  })
 
171
  <span class="chip"><span class="dot"></span>4 ORGANS LIVE</span>
172
  <span class="chip">SOLE FRONT DOOR · /api/killinchu/uds/v1/*</span>
173
  <span class="sp"></span>
174
+ <span class="doc">DOCTRINE <b>v11</b> LOCKED · 749 · 14 · 163 · SLSA L1 honest · L2 attested · L3 roadmap · Λ Conjecture (not a theorem)</span>
175
  </header>
176
 
177
  <div class="body">
 
212
  <div class="col center">
213
  <div style="position:relative">
214
  <div id="cesiumContainer"></div>
215
+ <div class="globe-tag" id="globetag">🦅 <b>Killinchu</b> in the field · airspace <b id="gt-class">awaiting init</b> · tracks <b id="gt-tracks">simulated snapshot</b></div>
216
  </div>
217
  <div class="killstrip">
218
  <div class="hd">
 
302
  .then(function(j){
303
  var links=(j.aggregated_receipt&&j.aggregated_receipt.chain)||[];
304
  renderChain(links); links.forEach(function(l){setHero(l.organ,l.verdict,l.latency_ms);});
305
+ ORGANS.forEach(function(o){ if(!links.filter(function(l){return l.organ===o.k;})[0]) setHero(o.k,"not-run"); });
306
  var v=j.verdict||"warn"; el("killverdict").className="v "+v; el("killverdict").textContent=v.toUpperCase();
307
  lastSha=j.receipt_sha256;
308
  var agg=j.aggregated_receipt||{}, sig=(agg.aggregate_signature||"").slice(0,42);
309
  var R=el("receipt"); R.style.display="block";
310
+ R.innerHTML=kv("mission",j.uds_mission_id||"unavailable")+kv("verdict",(j.verdict||"warn").toUpperCase())+
311
+ kv("sha256",j.receipt_sha256||"unavailable","sha")+kv("signed",String(agg.aggregate_signed))+
312
+ kv("keyid",agg.keyid||"szlholdings-cosign")+kv("sig",sig?sig+"…":"unsigned (no key in runtime)","sig");
313
  el("verifyBtn").disabled=false;
314
  if(action==="geofence_check"){ el("gt-class").textContent="checked"; }
315
  })