Spaces:
Running
Running
| /* ============================================================================= | |
| * covenant-cockpit.js — SZL Living Anatomy · COVENANT COCKPIT v1 (data spine) | |
| * ============================================================================= | |
| * The holographic trust surface of PCGI (Proof-Carrying Governed Intelligence). | |
| * This module is the HONEST DATA SPINE for covenant-cockpit.html's Three.js | |
| * scene. It reads REAL szl-receipt in-toto receipts and turns each governed | |
| * decision into a provenance graph: | |
| * | |
| * decision ──governs──▶ Λ-gate (policy_id) | |
| * ──backs────▶ Lean proof (lean_theorem @ kernel_commit) | |
| * ──burned───▶ energy (measured joules OR honest UNAVAILABLE) | |
| * ──cosigned─▶ BFT witness(es) | |
| * | |
| * CRITICAL DISCIPLINE (binding — honest by construction): | |
| * - Nodes come ONLY from real receipt JSON. No receipts → an HONEST empty | |
| * state ("no receipts yet"). We NEVER fabricate a node. | |
| * - The verify badge is a GENUINE WebCrypto ECDSA-P256-SHA256 check over the | |
| * szl-receipt DSSE PAE, against the bundled cosign public key. An unsigned | |
| * receipt reads UNAVAILABLE (unsigned-honest), never a fake "verified". | |
| * - Energy is verbatim measured joules OR the string UNAVAILABLE — a joule is | |
| * never fabricated. | |
| * - Λ is advisory; its uniqueness is Conjecture 1 — surfaced from the receipt, | |
| * never dressed up as a theorem. The Lean proof node backs the KERNEL | |
| * invariant, not "the AI is correct". | |
| * - Read-only, same-origin. Loads ./receipts.json if present, else the bundled | |
| * ./receipts.sample.json, else the honest empty state. | |
| * | |
| * No build step, no framework, no CDN — a plain ES module that runs as a static | |
| * SDK page at the .static.hf.space URL, exactly like index.html / live-body.html. | |
| * The pure functions (normalizeBundle / buildGraph / verifyEnvelope) take no DOM | |
| * and are unit-tested headless in qa_cockpit.mjs. | |
| * ============================================================================ */ | |
| ; | |
| /* ---- KANCHAY palette (canonical brand · purple BANNED) -------------------- */ | |
| const KANCHAY = { | |
| void: "#080c14", | |
| proof: "#3af4c8", // teal — Lean proof / verified | |
| lattice: "#5b8dee", // blue — decision node / edges | |
| gold: "#d7b96b", // gold — Λ-gate / policy | |
| warn: "#e0795b", // ember — energy burned / failed verify | |
| audit: "#9ef0c0", // mint — BFT witness | |
| dim: "#3a4456", // honest unavailable / dormant | |
| text: "#e9eef7", | |
| }; | |
| /* ---- node kinds → color + geometry hint ---------------------------------- */ | |
| const NODE_KIND = { | |
| decision: { color: KANCHAY.lattice, glyph: "◆", label: "decision" }, | |
| gate: { color: KANCHAY.gold, glyph: "⛨", label: "Λ-gate" }, | |
| proof: { color: KANCHAY.proof, glyph: "⊢", label: "Lean proof" }, | |
| energy: { color: KANCHAY.warn, glyph: "⚡", label: "energy" }, | |
| witness: { color: KANCHAY.audit, glyph: "✍", label: "BFT witness" }, | |
| }; | |
| /* ---- verify status vocabulary -------------------------------------------- */ | |
| const VERIFY = { | |
| VERIFIED: "verified", // signed + WebCrypto DSSE signature valid | |
| UNAVAILABLE: "unavailable", // unsigned-honest, or no pubkey, or not run | |
| FAILED: "failed", // signed but signature invalid (tamper) | |
| PENDING: "pending", | |
| }; | |
| /* ---- candidate data sources (same-origin, read-only) --------------------- */ | |
| const SOURCES = ["./receipts.json", "./receipts.sample.json"]; | |
| /* ---- one honest GET (never throws) --------------------------------------- */ | |
| async function getJSON(url, timeoutMs = 9000) { | |
| const ctl = new AbortController(); | |
| const t = setTimeout(() => ctl.abort(), timeoutMs); | |
| try { | |
| const res = await fetch(url, { | |
| method: "GET", mode: "same-origin", credentials: "omit", | |
| signal: ctl.signal, cache: "no-store", | |
| }); | |
| clearTimeout(t); | |
| if (!res.ok) return { ok: false, why: `HTTP ${res.status}` }; | |
| return { ok: true, json: await res.json() }; | |
| } catch (e) { | |
| clearTimeout(t); | |
| return { ok: false, why: (e && e.name === "AbortError") ? "timeout" : "not found" }; | |
| } | |
| } | |
| /* ---- base64 → bytes (browser + node safe) -------------------------------- */ | |
| function b64ToBytes(b64) { | |
| if (typeof atob === "function") { | |
| const bin = atob(String(b64).replace(/-/g, "+").replace(/_/g, "/")); | |
| const u = new Uint8Array(bin.length); | |
| for (let i = 0; i < bin.length; i++) u[i] = bin.charCodeAt(i); | |
| return u; | |
| } | |
| return new Uint8Array(Buffer.from(String(b64), "base64")); // node fallback | |
| } | |
| /* ---- normalize a loaded bundle into honest receipt records --------------- * | |
| * Accepts the bundled shape {cosign_pub, receipts:[{id,envelope,statement}]} | |
| * OR a bare array of envelopes/records. Returns decoded, doctrine-clean records. | |
| * Pure: no DOM, no network. */ | |
| function normalizeBundle(raw) { | |
| let list = []; | |
| let cosignPub = null; | |
| if (Array.isArray(raw)) { | |
| list = raw; | |
| } else if (raw && typeof raw === "object") { | |
| cosignPub = raw.cosign_pub || raw.cosignPub || null; | |
| list = raw.receipts || raw.items || []; | |
| } | |
| const receipts = []; | |
| for (const entry of (Array.isArray(list) ? list : [])) { | |
| // an entry may be {envelope, statement, id} OR a bare envelope | |
| const env = entry && entry.envelope ? entry.envelope | |
| : (entry && entry.payload ? entry : null); | |
| if (!env || !env.payload) continue; // not a receipt shape → skip (no fake node) | |
| let body = null; | |
| try { body = JSON.parse(new TextDecoder().decode(b64ToBytes(env.payload))); } | |
| catch { body = null; } | |
| if (!body || typeof body !== "object") continue; // undecodable → honest skip | |
| receipts.push({ | |
| id: entry.id || body.subject || env.digest || `receipt-${receipts.length}`, | |
| envelope: env, | |
| statement: entry.statement || null, | |
| body, | |
| digest: env.digest || null, | |
| signed: env.signed === true, | |
| }); | |
| } | |
| return { receipts, cosignPub }; | |
| } | |
| /* ---- build the provenance graph from real receipts (PURE) ---------------- * | |
| * Returns {nodes, edges, stats}. Empty input → empty graph (honest). */ | |
| function buildGraph(receipts) { | |
| const nodes = []; | |
| const edges = []; | |
| const byId = new Map(); | |
| const list = Array.isArray(receipts) ? receipts : []; | |
| function ensure(id, kind, label, meta) { | |
| let n = byId.get(id); | |
| if (n) { n.degree++; return n; } | |
| n = { id, kind, label, meta: meta || {}, degree: 1, pos: [0, 0, 0] }; | |
| byId.set(id, n); nodes.push(n); | |
| return n; | |
| } | |
| list.forEach((r, i) => { | |
| const b = r.body || {}; | |
| const dId = `d:${r.id}`; | |
| const decision = ensure(dId, "decision", r.id, { | |
| receiptIndex: i, receiptId: r.id, verdict: b.verdict, producer: b.producer, | |
| }); | |
| // Λ-gate that governed it | |
| if (b.policy_id) { | |
| const g = ensure(`g:${b.policy_id}`, "gate", b.policy_id, { policy_id: b.policy_id }); | |
| edges.push({ from: dId, to: g.id, kind: "governs" }); | |
| } | |
| // Lean proof backing the KERNEL invariant (not "the AI is correct") | |
| if (b.lean_theorem) { | |
| const p = ensure(`p:${b.lean_theorem}`, "proof", b.lean_theorem, { | |
| lean_theorem: b.lean_theorem, kernel_commit: b.kernel_commit || null, | |
| }); | |
| edges.push({ from: dId, to: p.id, kind: "backs" }); | |
| } | |
| // energy burned (measured joules OR honest UNAVAILABLE) | |
| const energy = b.energy; | |
| const measured = energy && typeof energy === "object" && typeof energy.joules === "number"; | |
| const e = ensure(`e:${r.id}`, "energy", measured ? `${energy.joules} J` : "UNAVAILABLE", { | |
| measured: !!measured, | |
| joules: measured ? energy.joules : null, | |
| receiptId: r.id, | |
| }); | |
| edges.push({ from: dId, to: e.id, kind: "burned" }); | |
| // BFT witnesses that co-signed | |
| for (const w of (Array.isArray(b.bft_witnesses) ? b.bft_witnesses : [])) { | |
| const wn = ensure(`w:${w}`, "witness", String(w), { witness: String(w) }); | |
| edges.push({ from: dId, to: wn.id, kind: "cosigned" }); | |
| } | |
| }); | |
| layout(nodes); | |
| const stats = { | |
| receipts: list.length, | |
| decisions: nodes.filter((n) => n.kind === "decision").length, | |
| gates: nodes.filter((n) => n.kind === "gate").length, | |
| proofs: nodes.filter((n) => n.kind === "proof").length, | |
| witnesses: nodes.filter((n) => n.kind === "witness").length, | |
| energyMeasured: nodes.filter((n) => n.kind === "energy" && n.meta.measured).length, | |
| energyUnavailable: nodes.filter((n) => n.kind === "energy" && !n.meta.measured).length, | |
| edges: edges.length, | |
| }; | |
| return { nodes, edges, stats }; | |
| } | |
| /* deterministic 3D orbital layout by node kind (mutates node.pos) ----------- */ | |
| function layout(nodes) { | |
| const byKind = {}; | |
| for (const n of nodes) (byKind[n.kind] = byKind[n.kind] || []).push(n); | |
| // ring placer: even angular spread, per-kind phase, on a shell | |
| const ring = (arr, radius, y, phase, zJitter) => { | |
| const n = arr.length; | |
| arr.forEach((node, i) => { | |
| const a = (n <= 1 ? phase : (i / n) * Math.PI * 2 + phase); | |
| node.pos = [ | |
| Math.cos(a) * radius, | |
| y + (zJitter ? Math.sin(i * 1.7) * zJitter : 0), | |
| Math.sin(a) * radius, | |
| ]; | |
| node._angle = a; | |
| }); | |
| }; | |
| ring(byKind.decision || [], 1.5, 0.0, Math.PI / 2, 0.12); // inner ring | |
| ring(byKind.gate || [], 1.1, 1.5, 0.0, 0.0); // top dome | |
| ring(byKind.proof || [], 1.1, -1.5, Math.PI, 0.0); // bottom dome | |
| ring(byKind.witness || [], 3.1, 0.0, Math.PI / 5, 0.5); // outer equatorial | |
| // energy sits radially just outside its own decision | |
| const decs = byKind.decision || []; | |
| const decAngle = new Map(decs.map((d) => [d.meta.receiptId, d._angle])); | |
| for (const e of (byKind.energy || [])) { | |
| const a = decAngle.has(e.meta.receiptId) ? decAngle.get(e.meta.receiptId) | |
| : Math.random() * Math.PI * 2; | |
| e.pos = [Math.cos(a) * 2.3, -0.1, Math.sin(a) * 2.3]; | |
| } | |
| } | |
| /* ---- WebCrypto DSSE ECDSA-P256-SHA256 verify (szl-receipt binary-LE PAE) -- * | |
| * Matches szl_receipt._canonical.pae EXACTLY: little-endian 64-bit lengths, | |
| * NOT the ascii-decimal DSSE variant. Returns a VERIFY.* status. */ | |
| function _cat() { | |
| const arrs = [].slice.call(arguments); | |
| let n = 0; for (const a of arrs) n += a.length; | |
| const o = new Uint8Array(n); let p = 0; | |
| for (const a of arrs) { o.set(a, p); p += a.length; } | |
| return o; | |
| } | |
| function _le64(n) { | |
| const b = new Uint8Array(8); let v = BigInt(n); | |
| for (let i = 0; i < 8; i++) { b[i] = Number(v & 0xffn); v >>= 8n; } | |
| return b; | |
| } | |
| function _paeBinary(payloadType, payloadBytes) { | |
| const enc = new TextEncoder(); | |
| const t = enc.encode(payloadType || ""); | |
| return _cat(enc.encode("DSSEv1 "), _le64(t.length), t, | |
| enc.encode(" "), _le64(payloadBytes.length), payloadBytes); | |
| } | |
| function _derToRaw(der) { | |
| let i = 0; | |
| if (der[i++] !== 0x30) throw new Error("bad DER (no SEQUENCE)"); | |
| let sl = der[i++]; if (sl & 0x80) { let n = sl & 0x7f; while (n--) i++; } | |
| const rdInt = () => { | |
| if (der[i++] !== 0x02) throw new Error("bad DER (no INTEGER)"); | |
| const len = der[i++]; let v = der.slice(i, i + len); i += len; | |
| while (v.length > 1 && v[0] === 0) v = v.slice(1); | |
| return v; | |
| }; | |
| const r = rdInt(), s = rdInt(); | |
| const out = new Uint8Array(64); out.set(r, 32 - r.length); out.set(s, 64 - s.length); | |
| return out; | |
| } | |
| function _subtle() { | |
| if (typeof crypto !== "undefined" && crypto.subtle) return crypto.subtle; | |
| if (typeof globalThis !== "undefined" && globalThis.crypto && globalThis.crypto.subtle) | |
| return globalThis.crypto.subtle; | |
| return null; | |
| } | |
| async function importCosign(pem) { | |
| const s = _subtle(); if (!s) throw new Error("WebCrypto unavailable"); | |
| const b64 = String(pem).replace(/-----[^-]+-----/g, "").replace(/\s+/g, ""); | |
| return s.importKey("spki", b64ToBytes(b64), { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"]); | |
| } | |
| async function verifyEnvelope(envelope, key) { | |
| if (!envelope || envelope.signed !== true || !envelope.signature) | |
| return { status: VERIFY.UNAVAILABLE, detail: "unsigned-honest (no signature)" }; | |
| if (!key) return { status: VERIFY.UNAVAILABLE, detail: "no cosign public key bundled" }; | |
| const s = _subtle(); if (!s) return { status: VERIFY.UNAVAILABLE, detail: "WebCrypto unavailable" }; | |
| try { | |
| const payload = b64ToBytes(envelope.payload); | |
| const pae = _paeBinary(envelope.payloadType, payload); | |
| const rawSig = _derToRaw(b64ToBytes(envelope.signature)); | |
| const ok = await s.verify({ name: "ECDSA", hash: "SHA-256" }, key, rawSig, pae); | |
| return ok | |
| ? { status: VERIFY.VERIFIED, detail: "ECDSA-P256-SHA256 over DSSE PAE — unaltered from signer" } | |
| : { status: VERIFY.FAILED, detail: "signature mismatch — do NOT trust this receipt" }; | |
| } catch (e) { | |
| return { status: VERIFY.UNAVAILABLE, detail: `verify error: ${e && e.message ? e.message : e}` }; | |
| } | |
| } | |
| /* ---- top-level loader (browser): first present source wins ---------------- */ | |
| async function loadReceipts() { | |
| for (const url of SOURCES) { | |
| const r = await getJSON(url); | |
| if (!r.ok) continue; | |
| const { receipts, cosignPub } = normalizeBundle(r.json); | |
| if (receipts.length === 0) continue; // present but empty → try next | |
| return { source: url, receipts, cosignPub, empty: false }; | |
| } | |
| return { source: null, receipts: [], cosignPub: null, empty: true, | |
| why: "no receipts.json or receipts.sample.json with valid receipts" }; | |
| } | |
| /* ---- the engine surface -------------------------------------------------- */ | |
| const CovenantCockpit = { | |
| KANCHAY, NODE_KIND, VERIFY, SOURCES, | |
| getJSON, b64ToBytes, normalizeBundle, buildGraph, layout, | |
| importCosign, verifyEnvelope, loadReceipts, | |
| }; | |
| if (typeof window !== "undefined") window.CovenantCockpit = CovenantCockpit; | |
| export default CovenantCockpit; | |
| export { | |
| KANCHAY, NODE_KIND, VERIFY, SOURCES, | |
| getJSON, b64ToBytes, normalizeBundle, buildGraph, layout, | |
| importCosign, verifyEnvelope, loadReceipts, | |
| }; | |