a11oy / static /cathedral_app.js
betterwithage's picture
deploy(hf): sync szl-holdings/a11oy@main derived COPY set
7f8c86f verified
Raw
History Blame Contribute Delete
34.3 kB
/* ============================================================================
* app.js — SZL Cathedral · Constellation · Khipu (sovereign 3D, vendored Three.js)
* GENIUS ELEVATION — the flagship showpiece.
*
* RE-FACE rule honored: the only labelled bodies are
* - a11oy (central brain / sun)
* - 3 a11oy-INTERNAL capabilities: reasoning / policy / operator (NOT organs)
* - killinchu (field node)
* - a sovereign compute-fabric ring (real nodes from /compute-pool-hardened, honest tier)
* - Khipu receipt stars (anonymous receipt DAG, cord arcs)
* No amaru / sentra / rosie node labels anywhere.
*
* HONESTY DOCTRINE v11 (machine-checked against live endpoints):
* Λ = Conjecture 1 (advisory, NOT a theorem, NOT "proven trust").
* Khipu BFT = Conjecture 2. locked-proven kernel = EXACTLY 8.
* Trust = conformal (never 100%, NOT Hoeffding). SLSA L1 honest / L2 roadmap.
* joules = MEASURED only via a real on-box NVML exporter; shown as SAMPLE/seed otherwise.
* organs = EXPERIMENTAL tier. killinchu effectors = SIMULATED.
* Live data from real /healthz, /compute-pool-hardened, /lambda, /khipu/ledger.
* Honest SEED -> LIVE promotion; OFFLINE labelled loudly; no fabricated numbers.
*
* Sovereign: Three.js r160 (MIT) + OrbitControls vendored under ./vendor. NO CDN.
* No external postprocessing — bloom is faked with additive layered sprites + fresnel
* built only from vendored three primitives. System font stacks only.
*
* Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
* ========================================================================== */
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/OrbitControls.js';
/* ---------- reduced-motion + perf posture ---------------------------------- */
const REDUCED = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const IS_TOUCH = window.matchMedia('(pointer: coarse)').matches;
/* ---------- canonical content (the proven anatomy, surfaced honestly) ------- */
const CAPABILITIES = [
{
id: 'reasoning', title: 'Reasoning & Provenance',
color: 0x5cc4bf, angle: 0,
plain: 'Grounded reasoning, memory/recall and provenance over a signed knowledge base — an internal a11oy function.',
functions: [
'grounded ask (cites its source, refuses to fabricate)',
'13-axis Trust Score (geometric-mean aggregate, floor 0.90)',
'knowledge ontology (axioms → theorems → formulas)',
'model router (5-tier, cost-aware)'
],
proof: [
'Trust-Score CI from CONFORMAL (W5-3 + W7-4) — distribution-free, anti-overconfidence floor (never 100%, NOT Hoeffding)',
'Model-Router stability C20 + PAC-Bayes/router envelope W7-5 (min ≤ avg ≤ max)',
'Ontology label-invariance: F-G2 / F-G4 / F-G6 / W7-1 (graph substrate, wave 6/7)'
]
},
{
id: 'policy', title: 'Policy & Compliance',
color: 0xd7b96b, angle: 2.094,
plain: 'Deny-by-default safety gates and full ALLOW/DENY verdicts with signed receipts — an internal a11oy function.',
functions: [
'8 deny-by-default safety gates',
'full verdict (ALLOW / DENY) with signals + receipt hash',
'30-signature threat corpus (MITRE ATT&CK + CVSS)',
'readiness / compliance (NIST / STIG / ISO)'
],
proof: [
'Gate-soundness P2 — no action without BOTH policy AND kernel/doctrine check; a single DENY is absorbing',
'Agentic-loop P3 non-interference — poisoned input provably cannot flip a DENY into an ALLOW'
]
},
{
id: 'operator', title: 'Operator · Ask / Act / Approvals',
color: 0xe58e54, angle: 4.189,
plain: 'The governed run loop: ask, act with approvals, and emit replayable signed receipts — an internal a11oy function.',
functions: [
'governed run loop P1–P6 (sign → gate → chain → memory → replay)',
'human approvals gate for high-impact actions',
'replayable, hash-chained receipts (Khipu)',
'governed agentic coder (P1–P6), open-weight models'
],
proof: [
'Agentic-loop P1–P6 (PR #188): 28 kernel-verified theorems — run is auditable, gate-sound, injection-resistant end-to-end',
'P5 replay-determinism gated only by declared hashFn_collision_resistant axiom (named, not a hardness proof)'
]
}
];
const A11OY = {
id: 'a11oy', title: 'a11oy — Command Platform (the brain)',
plain: 'The orchestrating governance substrate: one brain coordinating reasoning, policy and operator capabilities. Every result carries a signed provenance receipt. Live: /healthz · /lambda.',
functions: [
'command center + five superpowers + 25-demo Warhacker board (5×5 live)',
'a11oy Code (governed agentic coder, P1–P6, open-weight router)',
'one governance substrate (capabilities are internal, no service split)',
'13-axis Trust Score aggregate (yuyay_v3, geometric mean, floor 0.90)',
'/proven: wave 9/10 formula cards (several with live runtime checks)',
'signed Khipu receipts for every governed action'
],
proof: [
'Locked proven kernel = 8 @ c7c0ba17 (749 decl / 14 unique axioms / 163 sorries) — machine-enforced count, never moves',
'Experimental tier (kernel 7885fd9, Lean v4.18.0): 1304 declarations, 36 CI-green theorems (Wave5-8 + agentic P1-P6 + airtight Λ + coder) — kernel-verified but NOT folded into the locked 8',
'Λ-Aggregator uniqueness (F23) = Conjecture 1 — NOT a theorem (open CAUCHY_ND sorry + missing symmetry axiom; unconditional uniqueness machine-checked FALSE)',
'Λ proven CONDITIONAL on slice-multiplicativity (separability) under {A1,A2,A3,A5}, axiom-free — CUT-2 (PR #202); Byzantine BFT safety stays Conjecture 2'
],
url: 'https://szlholdings-a11oy.hf.space'
};
const KILLINCHU = {
id: 'killinchu', title: 'killinchu — Field Node (drones & vessels)',
plain: 'Counter-UAS drone & vessel intelligence at the tactical edge — the deployed field node of the substrate. Effectors are SIMULATED. Live: /healthz.',
functions: [
'maritime + drone C2 — vessels consolidated into killinchu (/elite fleet group)',
'OpenDroneID / ASTM F3411 · ADS-B Mode-S 1090ES · MAVLink v1/v2 decoders',
'counter-UAS A-gate + 13-axis edge Λ verdict · tactical routing · threat ranking (effectors SIMULATED)',
'/wave910: wave 9/10 edge formula cards · Q2 Gershgorin spectral bound',
'signed Khipu receipts (ECDSA-P256 DSSE when the signing key is present; else UNSIGNED, labelled)'
],
proof: [
'Edge verdict bound by proven formulas: C20/W7-5 router, W5-3/W7-4 conformal (never 100%)',
'Experimental frontier (Wave 12 CF-13 DEQ input-Lipschitz, CF-17 fp-summation stability; Wave 14 CF-19 Reed–Solomon MDS bound) — never folded into the locked 8',
'Same doctrine lock 749/14/163 @ c7c0ba17 · Λ = Conjecture 1 · Khipu BFT = Conjecture 2 · SLSA L1 honest / L2 roadmap'
],
url: 'https://szlholdings-killinchu.hf.space'
};
/* compute-fabric inspector content is built live from /compute-pool-hardened (honest tiers). */
const FABRIC = {
id: 'fabric', title: 'Sovereign compute fabric',
plain: 'A real multi-node compute pool. Sovereign = owned self-hosted hardware (the box + the RTX). Hosted APIs and cloud GPUs are fallback only — labelled NON-sovereign. No energy/joule claim made here.',
functions: ['live node roster loads from /api/a11oy/v1/compute-pool-hardened'],
proof: ['No node fabricated · reachable=true only on a real probe this poll · Λ = Conjecture 1, not one of the locked 8'],
url: 'https://a-11-oy.com/api/a11oy/v1/compute-pool-hardened'
};
/* ---------- live endpoints (real /healthz + live data; CORS open) ----------- */
const ENDPOINTS = {
a11oy: {
health: 'https://szlholdings-a11oy.hf.space/healthz',
lambda: 'https://szlholdings-a11oy.hf.space/api/a11oy/v1/lambda'
},
killinchu: {
health: 'https://szlholdings-killinchu.hf.space/healthz',
ledger: 'https://szlholdings-killinchu.hf.space/api/killinchu/v1/khipu/ledger'
},
fabric: 'https://a-11-oy.com/api/a11oy/v1/compute-pool-hardened'
};
/* ---------- renderer / scene / camera --------------------------------------- */
const canvas = document.getElementById('scene');
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: false, powerPreference: 'high-performance' });
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); // perf: cap DPR
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1.18;
const scene = new THREE.Scene();
scene.fog = new THREE.FogExp2(0x070815, 0.0018);
const camera = new THREE.PerspectiveCamera(55, window.innerWidth / window.innerHeight, 0.1, 6000);
camera.position.set(0, 90, 380);
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.06;
controls.minDistance = 90;
controls.maxDistance = 1400;
controls.enablePan = false;
controls.autoRotate = !REDUCED; // cinematic idle orbit (off under reduced-motion)
controls.autoRotateSpeed = 0.40;
controls.target.set(0, 0, 0);
/* ---------- lighting --------------------------------------------------------- */
scene.add(new THREE.AmbientLight(0x33304a, 0.9));
const keyLight = new THREE.PointLight(0xffe6a8, 2.6, 2000, 1.4); // the sun emits warm gold
scene.add(keyLight);
const rim = new THREE.DirectionalLight(0x5c8fd1, 0.55); rim.position.set(-220, 130, -160); scene.add(rim);
/* ---------- deep star backdrop (depth, not data) ---------------------------- */
const disposables = [];
(function backdrop() {
const N = 2600, pos = new Float32Array(N * 3), siz = new Float32Array(N);
for (let i = 0; i < N; i++) {
const r = 1500 + Math.random() * 1900;
const t = Math.random() * Math.PI * 2, p = Math.acos(2 * Math.random() - 1);
pos[i*3] = r*Math.sin(p)*Math.cos(t); pos[i*3+1] = r*Math.cos(p); pos[i*3+2] = r*Math.sin(p)*Math.sin(t);
siz[i] = Math.random() < 0.08 ? 2.6 : 1.2;
}
const g = new THREE.BufferGeometry();
g.setAttribute('position', new THREE.BufferAttribute(pos, 3));
g.setAttribute('size', new THREE.BufferAttribute(siz, 1));
disposables.push(g);
scene.add(new THREE.Points(g, new THREE.PointsMaterial({ color: 0x8a90c0, size: 1.5, sizeAttenuation: true, transparent: true, opacity: 0.55 })));
})();
/* ---------- soft radial glow sprite texture (sovereign, procedural) --------- */
function glowTexture(inner, outer) {
const s = 128, c = document.createElement('canvas'); c.width = c.height = s;
const ctx = c.getContext('2d');
const g = ctx.createRadialGradient(s/2, s/2, 0, s/2, s/2, s/2);
g.addColorStop(0.0, inner);
g.addColorStop(0.35, outer);
g.addColorStop(1.0, 'rgba(0,0,0,0)');
ctx.fillStyle = g; ctx.fillRect(0, 0, s, s);
const tex = new THREE.CanvasTexture(c); tex.anisotropy = 2;
return tex;
}
const GLOW_TEX = glowTexture('rgba(255,231,168,0.95)', 'rgba(216,154,46,0.35)');
/* ---------- interactable registry ------------------------------------------- */
const interactables = []; // meshes with userData.inspect + userData.focus
function registerBody(mesh, data, focusGetter) {
mesh.userData.inspect = data;
mesh.userData.focus = focusGetter; // () => {target:Vector3, dist:Number}
interactables.push(mesh);
}
/* ---------- a11oy — the brain / sun (fresnel rim + layered additive bloom) -- */
const sunGroup = new THREE.Group(); scene.add(sunGroup);
// fresnel rim shader (vendored three ShaderMaterial only — no postprocessing CDN)
const sunCoreGeo = new THREE.IcosahedronGeometry(34, 5);
const sunMat = new THREE.ShaderMaterial({
uniforms: {
uTime: { value: 0 },
uColorHot: { value: new THREE.Color(0xfff0c2) },
uColorCore: { value: new THREE.Color(0xd79a2e) },
uPulse: { value: 0.0 } // breathing, tied to live healthz
},
vertexShader: `
varying vec3 vN; varying vec3 vView;
void main(){
vec3 p = position;
vN = normalize(normalMatrix * normal);
vec4 mv = modelViewMatrix * vec4(p,1.0);
vView = normalize(-mv.xyz);
gl_Position = projectionMatrix * mv;
}`,
fragmentShader: `
uniform float uTime; uniform vec3 uColorHot; uniform vec3 uColorCore; uniform float uPulse;
varying vec3 vN; varying vec3 vView;
void main(){
float fres = pow(1.0 - max(dot(vN, vView), 0.0), 2.2);
float shimmer = 0.5 + 0.5*sin(uTime*1.4 + vN.y*6.0);
vec3 col = mix(uColorCore, uColorHot, fres*0.85 + 0.15*shimmer);
float glow = (0.55 + 0.45*uPulse);
gl_FragColor = vec4(col * (1.15 + fres*1.6) * glow, 1.0);
}`
});
const sunCore = new THREE.Mesh(sunCoreGeo, sunMat);
sunGroup.add(sunCore);
registerBody(sunCore, A11OY, () => ({ target: sunGroup.position.clone(), dist: 170 }));
disposables.push(sunCoreGeo);
// layered additive bloom sprites (fake bloom, sovereign)
const bloomSprites = [];
[ {s: 150, o: 0.42}, {s: 250, o: 0.26}, {s: 400, o: 0.14} ].forEach(L => {
const spr = new THREE.Sprite(new THREE.SpriteMaterial({
map: GLOW_TEX, color: 0xffd98a, transparent: true, opacity: L.o,
blending: THREE.AdditiveBlending, depthWrite: false
}));
spr.scale.set(L.s, L.s, 1);
sunGroup.add(spr); bloomSprites.push({ spr, base: L.o, size: L.s });
});
// inner translucent glow shell
const sunGlowGeo = new THREE.SphereGeometry(48, 32, 32);
const sunGlow = new THREE.Mesh(sunGlowGeo, new THREE.MeshBasicMaterial({ color: 0xffd98a, transparent: true, opacity: 0.10, side: THREE.BackSide }));
sunGroup.add(sunGlow); disposables.push(sunGlowGeo);
// "brain" wireframe lattice (the orchestrating brain motif)
const brainGeo = new THREE.IcosahedronGeometry(42, 2);
const brainLattice = new THREE.Mesh(brainGeo, new THREE.MeshBasicMaterial({ color: 0xffe6a8, wireframe: true, transparent: true, opacity: 0.20 }));
sunGroup.add(brainLattice); disposables.push(brainGeo);
sunGroup.add(makeLabel('a11oy', 0xffe6a8, 64));
/* ---------- 3 internal capabilities orbiting the sun ------------------------ */
const ORBIT_R = 158;
const capBodies = [];
CAPABILITIES.forEach((cap) => {
const grp = new THREE.Group();
const geo = new THREE.IcosahedronGeometry(15, 2);
const mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({ color: cap.color, emissive: cap.color, emissiveIntensity: 0.6, roughness: 0.5, metalness: 0.2 }));
grp.add(mesh); disposables.push(geo);
const ringGeo = new THREE.TorusGeometry(22, 0.7, 8, 64);
const ring = new THREE.Mesh(ringGeo, new THREE.MeshBasicMaterial({ color: cap.color, transparent: true, opacity: 0.35 }));
ring.rotation.x = Math.PI / 2; grp.add(ring); disposables.push(ringGeo);
// soft glow halo per capability
const halo = new THREE.Sprite(new THREE.SpriteMaterial({ map: GLOW_TEX, color: cap.color, transparent: true, opacity: 0.30, blending: THREE.AdditiveBlending, depthWrite: false }));
halo.scale.set(70, 70, 1); grp.add(halo);
grp.add(makeLabel(cap.title.split(/[ &·]/)[0], cap.color, 30));
scene.add(grp);
const entry = { grp, mesh, cap, baseAngle: cap.angle };
registerBody(mesh, cap, () => ({ target: grp.position.clone(), dist: 95 }));
capBodies.push(entry);
const tether = new THREE.Line(
new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(), new THREE.Vector3()]),
new THREE.LineBasicMaterial({ color: cap.color, transparent: true, opacity: 0.28 })
);
scene.add(tether); entry.tether = tether;
});
/* ---------- sovereign compute fabric ring (real nodes, honest tier) --------- */
const fabricGroup = new THREE.Group(); scene.add(fabricGroup);
let fabricNodes = []; // {mesh, sovereign, reachable}
const FABRIC_R = 240;
function colorForNode(n){
if (!n.reachable) return 0x6b6f86; // unreachable = grey
if (n.sovereign) return 0x4fd18b; // owned, live = teal/green
return 0x9b8cff; // reachable but hosted/non-sovereign = violet
}
function renderFabric(nodes){
// dispose old
fabricNodes.forEach(o => { fabricGroup.remove(o.mesh); o.mesh.geometry.dispose(); });
fabricNodes = [];
if (!nodes || !nodes.length) return;
nodes.forEach((n, i) => {
const a = (i / nodes.length) * Math.PI * 2;
const geo = n.kind && n.kind.includes('gpu')
? new THREE.OctahedronGeometry(7, 0)
: new THREE.BoxGeometry(9, 9, 9);
const col = colorForNode(n);
const m = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({
color: col, emissive: col, emissiveIntensity: n.reachable ? 0.7 : 0.15,
roughness: 0.5, metalness: 0.3, transparent: true, opacity: n.reachable ? 0.95 : 0.5
}));
m.position.set(Math.cos(a) * FABRIC_R, Math.sin(a * 1.7) * 30 - 70, Math.sin(a) * FABRIC_R);
m.userData.inspect = { ...FABRIC, title: 'Compute node · ' + (n.name || 'node'),
plain: (n.sovereign ? 'SOVEREIGN (owned self-hosted hardware). ' : 'NON-sovereign — hosted/cloud fallback, not owned compute. ')
+ (n.reachable ? 'Reachable on this poll. ' : 'NOT reachable this poll. ')
+ (n.detail || ''),
functions: [ 'kind: ' + (n.kind || '—'), 'endpoint: ' + (n.endpoint || '—'),
'capabilities: ' + ((n.capabilities||[]).join(', ') || '—'),
(n.models && n.models.length ? 'models: ' + n.models.join(', ') : 'models: —') ],
proof: [ n.source || 'live /compute-pool-hardened', 'No energy/joule claim. Λ = Conjecture 1, not one of the locked 8.' ],
url: FABRIC.url };
m.userData.focus = () => ({ target: m.getWorldPosition(new THREE.Vector3()), dist: 70 });
fabricGroup.add(m); interactables.push(m);
fabricNodes.push({ mesh: m, sovereign: n.sovereign, reachable: n.reachable });
});
}
/* ---------- killinchu — the field node (offset, deployed at the edge) ------- */
const fieldGroup = new THREE.Group();
fieldGroup.position.set(380, -50, -130);
const fieldGeo = new THREE.OctahedronGeometry(20, 0);
const fieldNode = new THREE.Mesh(fieldGeo, new THREE.MeshStandardMaterial({ color: 0x5c8fd1, emissive: 0x2c5f9e, emissiveIntensity: 0.65, roughness: 0.45, metalness: 0.3 }));
fieldGroup.add(fieldNode); disposables.push(fieldGeo);
const fieldRingGeo = new THREE.TorusGeometry(30, 0.8, 8, 80);
const fieldRing = new THREE.Mesh(fieldRingGeo, new THREE.MeshBasicMaterial({ color: 0x5c8fd1, transparent: true, opacity: 0.4 }));
fieldRing.rotation.x = Math.PI / 2.4; fieldGroup.add(fieldRing); disposables.push(fieldRingGeo);
const fieldHalo = new THREE.Sprite(new THREE.SpriteMaterial({ map: GLOW_TEX, color: 0x5c8fd1, transparent: true, opacity: 0.28, blending: THREE.AdditiveBlending, depthWrite: false }));
fieldHalo.scale.set(95, 95, 1); fieldGroup.add(fieldHalo);
fieldGroup.add(makeLabel('killinchu', 0x8fb6e6, 40));
scene.add(fieldGroup);
registerBody(fieldNode, KILLINCHU, () => ({ target: fieldGroup.position.clone(), dist: 120 }));
// Wire D — traceparent link sun ↔ field node (the substrate reaches the edge)
const fieldWire = new THREE.Line(
new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0,0,0), fieldGroup.position.clone()]),
new THREE.LineBasicMaterial({ color: 0x9b8cff, transparent: true, opacity: 0.4 })
);
scene.add(fieldWire);
/* ---------- Khipu constellation: receipt stars + cord arcs (DAG) ------------ */
const khipuGroup = new THREE.Group(); scene.add(khipuGroup);
let receiptPoints = null, cordLines = null, receiptData = [];
let cordPulse = 0; // 0..1 pulse spike when a new receipt streams in
const VERDICT_COLOR = { allow: 0x4fd18b, advisory: 0xd7b96b, deny: 0xc0392b };
function verdictOf(l){ return l >= 0.9 ? 'allow' : (l >= 0.5 ? 'advisory' : 'deny'); }
// deterministic hash → unit sphere position (reproducible across reloads)
function seededVec(seed, radius){
let h = 2166136261 >>> 0;
for (let i=0;i<seed.length;i++){ h ^= seed.charCodeAt(i); h = Math.imul(h, 16777619) >>> 0; }
const a = (h % 10000)/10000 * Math.PI*2;
const b = Math.acos(2*(((h>>>13)%10000)/10000)-1);
const r = radius * (0.55 + 0.45*(((h>>>7)%10000)/10000));
return new THREE.Vector3(r*Math.sin(b)*Math.cos(a), r*Math.cos(b), r*Math.sin(b)*Math.sin(a));
}
// Build a deterministic SEED constellation (clearly labelled SEED until live answers).
function seedConstellation(){
const arr = [];
for (let i=0;i<64;i++){
const id = 'seed-'+i.toString(16).padStart(4,'0');
// honest spread of seed verdicts: mostly allow, a few advisory, rare deny
const roll = ((i*2654435761)>>>0)%100;
const l = roll < 80 ? 0.90 + (roll%10)/100 : (roll < 95 ? 0.62 + (roll%30)/100 : 0.30 + (roll%20)/100);
arr.push({ id, prev: i>0 && (i%5!==0) ? 'seed-'+(i-1).toString(16).padStart(4,'0') : null,
lambda: Math.min(0.999, l), source: 'SEED' });
}
return arr;
}
function renderConstellation(nodes, isNew){
receiptData = nodes;
if (receiptPoints){ khipuGroup.remove(receiptPoints); receiptPoints.geometry.dispose(); receiptPoints.material.dispose(); }
if (cordLines){ khipuGroup.remove(cordLines); cordLines.geometry.dispose(); cordLines.material.dispose(); }
const pos = new Float32Array(nodes.length*3), col = new Float32Array(nodes.length*3);
const byId = {};
nodes.forEach((n,i)=>{
const v = seededVec(n.id, 250); n._v = v; byId[n.id] = v;
pos[i*3]=v.x; pos[i*3+1]=v.y; pos[i*3+2]=v.z;
const c = new THREE.Color(VERDICT_COLOR[verdictOf(n.lambda)] || 0x888888);
col[i*3]=c.r; col[i*3+1]=c.g; col[i*3+2]=c.b;
});
const g = new THREE.BufferGeometry();
g.setAttribute('position', new THREE.BufferAttribute(pos,3));
g.setAttribute('color', new THREE.BufferAttribute(col,3));
receiptPoints = new THREE.Points(g, new THREE.PointsMaterial({ size: 5.0, vertexColors:true, transparent:true, opacity:0.94, sizeAttenuation:true, map: GLOW_TEX, blending: THREE.AdditiveBlending, depthWrite:false }));
khipuGroup.add(receiptPoints);
// cord arcs: prev → cur (the receipt DAG cords / quipu), coloured by child verdict
const linePos = [], lineCol = [];
nodes.forEach((n)=>{ if (n.prev && byId[n.prev]){ const a=byId[n.prev], b=n._v;
const mid = a.clone().add(b).multiplyScalar(0.5).multiplyScalar(1.18);
const curve = new THREE.QuadraticBezierCurve3(a, mid, b).getPoints(10);
const cc = new THREE.Color(VERDICT_COLOR[verdictOf(n.lambda)] || 0xc08f2f);
for (let k=0;k<curve.length-1;k++){
linePos.push(curve[k].x,curve[k].y,curve[k].z, curve[k+1].x,curve[k+1].y,curve[k+1].z);
lineCol.push(cc.r,cc.g,cc.b, cc.r,cc.g,cc.b);
}
}});
const lg = new THREE.BufferGeometry();
lg.setAttribute('position', new THREE.Float32BufferAttribute(linePos,3));
lg.setAttribute('color', new THREE.Float32BufferAttribute(lineCol,3));
cordLines = new THREE.LineSegments(lg, new THREE.LineBasicMaterial({ vertexColors:true, transparent:true, opacity:0.34 }));
khipuGroup.add(cordLines);
if (isNew && !REDUCED) cordPulse = 1.0; // spike a pulse when a new receipt set streams in
}
/* ---------- floating text label sprites (canvas texture) -------------------- */
function makeLabel(text, color, size){
const c = document.createElement('canvas'); c.width = 256; c.height = 64;
const ctx = c.getContext('2d');
ctx.font = '700 34px ui-monospace, Menlo, Consolas, monospace';
ctx.fillStyle = '#'+new THREE.Color(color).getHexString();
ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
ctx.shadowColor = 'rgba(0,0,0,0.85)'; ctx.shadowBlur = 8;
ctx.fillText(text, 128, 34);
const tex = new THREE.CanvasTexture(c); tex.anisotropy = 4;
const spr = new THREE.Sprite(new THREE.SpriteMaterial({ map: tex, transparent: true, depthWrite: false }));
spr.scale.set(size*2, size*0.5, 1);
spr.position.y = size*0.9;
spr.userData.isLabel = true;
return spr;
}
/* ---------- camera fly-to choreography -------------------------------------- */
let flying = null; // {fromPos, toPos, fromTgt, toTgt, t, dur}
function flyTo(target, dist){
controls.autoRotate = false;
const dir = camera.position.clone().sub(controls.target).normalize();
const toPos = target.clone().add(dir.multiplyScalar(dist));
flying = { fromPos: camera.position.clone(), toPos,
fromTgt: controls.target.clone(), toTgt: target.clone(),
t: 0, dur: REDUCED ? 0.001 : 1.05 };
}
function easeInOut(x){ return x < 0.5 ? 4*x*x*x : 1 - Math.pow(-2*x+2,3)/2; }
/* ---------- raycasting (click to inspect + fly) ----------------------------- */
const ray = new THREE.Raycaster(); ray.params.Points.threshold = 6;
const ptr = new THREE.Vector2();
let downXY = null;
function ptrFromEvent(e){
const r = canvas.getBoundingClientRect();
const cx = e.clientX ?? (e.touches && e.touches[0].clientX);
const cy = e.clientY ?? (e.touches && e.touches[0].clientY);
ptr.x = ((cx-r.left)/r.width)*2-1; ptr.y = -((cy-r.top)/r.height)*2+1;
return { cx, cy };
}
canvas.addEventListener('pointerdown', (e)=>{ downXY = { x: e.clientX, y: e.clientY }; });
canvas.addEventListener('pointerup', (e)=>{
if (!downXY) return;
const moved = Math.hypot(e.clientX-downXY.x, e.clientY-downXY.y);
downXY = null;
if (moved > 6) return; // it was a drag/orbit, not a click
ptrFromEvent(e);
ray.setFromCamera(ptr, camera);
const hits = ray.intersectObjects(interactables, false);
if (hits.length){
const o = hits[0].object;
openInspector(o.userData.inspect);
if (o.userData.focus){ const f = o.userData.focus(); flyTo(f.target, f.dist); }
}
});
/* ---------- inspector panel ------------------------------------------------- */
const insp = document.getElementById('inspector');
document.getElementById('insp-close').addEventListener('click', ()=>{ insp.classList.remove('show'); controls.autoRotate = !REDUCED; });
function openInspector(d){
if (!d) return;
document.getElementById('insp-title').textContent = d.title;
document.getElementById('insp-plain').textContent = d.plain;
let html = '<div class="ih">Functions</div><ul>' + d.functions.map(f=>`<li>${esc(f)}</li>`).join('') + '</ul>';
if (d.proof){ html += '<div class="ih">Proof support (honest)</div><ul>' + d.proof.map(p=>`<li class="proof">${esc(p)}</li>`).join('') + '</ul>'; }
if (d.url){ html += `<div class="ih">Live</div><ul><li><a href="${esc(d.url)}" target="_blank" rel="noopener" style="color:#7fe0db">${esc(d.url)} ↗</a></li></ul>`; }
document.getElementById('insp-body').innerHTML = html;
insp.classList.add('show');
}
function esc(s){ return String(s).replace(/[&<>"]/g, c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c])); }
/* ---------- live polling + honest SEED→LIVE promotion ----------------------- */
let liveState = { a11oy:'…', killinchu:'…' }, fabricCounts = null;
let feedSource = 'SEED', lastLambda = null, sunPulseTarget = 0.5;
const ticker = []; // recent receipt-feed lines
async function getJSON(url, ms){
const ctrl = new AbortController(); const t = setTimeout(()=>ctrl.abort(), ms||7000);
try { const r = await fetch(url, { signal: ctrl.signal, headers:{accept:'application/json'} });
if (!r.ok) throw new Error('HTTP '+r.status); return await r.json(); }
finally { clearTimeout(t); }
}
function pushTicker(line){ ticker.unshift(line); if (ticker.length > 4) ticker.pop(); paintTicker(); }
let prevReceiptIds = '';
async function poll(){
// 1) health (drives status dots + sun breathing target)
let healthy = 0;
await Promise.all(['a11oy','killinchu'].map(async k=>{
try { const h = await getJSON(ENDPOINTS[k].health, 7000); const ok = h && h.status==='ok'; liveState[k] = ok ? 'LIVE' : 'DEGRADED'; if (ok) healthy++; }
catch(_) { liveState[k] = 'OFFLINE'; }
}));
sunPulseTarget = 0.30 + 0.35*healthy; // 0.30..1.0 brighter when both live
// 2) sovereign compute fabric (real nodes)
try {
const cp = await getJSON(ENDPOINTS.fabric, 8000);
if (cp && Array.isArray(cp.nodes)){
renderFabric(cp.nodes); fabricCounts = cp.counts || null;
}
} catch(_) { /* keep last fabric render; honest */ }
// 3) live constellation: prefer killinchu real ledger; else colour SEED with live a11oy Λ; else SEED
let nodes = null, src = 'SEED · deterministic (no live receipts yet)';
try {
const led = await getJSON(ENDPOINTS.killinchu.ledger, 7000);
if (led && Array.isArray(led.nodes) && led.nodes.length){
nodes = led.nodes.map((n,i)=>({ id: (n.digest||('k'+i)).slice(0,16), prev: (n.parents&&n.parents[0])?String(n.parents[0]).slice(0,16):null,
lambda: typeof n.lambda==='number' ? n.lambda : (n.signed?0.92:0.40), source:'LIVE' }));
src = 'LIVE · killinchu khipu ledger ('+nodes.length+' receipts · '+(led.slsa||'SLSA L1')+')';
} else if (led && Array.isArray(led.nodes)) {
// ledger reachable but EMPTY — honest: ledger is in-memory per Space, non-persistent
src = 'LIVE ledger reachable · 0 receipts (in-memory, non-persistent) · showing SEED';
}
} catch(_) {}
if (!nodes){
try {
const lam = await getJSON(ENDPOINTS.a11oy.lambda, 7000);
if (lam && typeof lam.lambda==='number'){
lastLambda = lam.lambda;
nodes = seedConstellation().map(n=>({ ...n, lambda: lam.lambda, source:'SEED+liveΛ' }));
src = 'SEED positions · LIVE a11oy Λ='+lam.lambda.toFixed(3)+' (13-axis Trust Score, floor '+(lam.lambda_floor??0.9)+')';
}
} catch(_) {}
}
if (!nodes) nodes = seedConstellation();
feedSource = src;
const ids = nodes.map(n=>n.id).join('|');
const isNew = ids !== prevReceiptIds && prevReceiptIds !== '';
renderConstellation(nodes, isNew);
if (isNew){
const top = nodes[0];
pushTicker((top.source.startsWith('LIVE')?'◆ LIVE':'◇ seed') + ' ' + (top.id||'').slice(0,10) + ' · Λ ' + (top.lambda||0).toFixed(2) + ' · ' + verdictOf(top.lambda).toUpperCase());
}
prevReceiptIds = ids;
paintHUD();
}
function paintHUD(){
const rows = [
{ label:'a11oy · brain', s:liveState.a11oy },
{ label:'killinchu · field', s:liveState.killinchu }
];
let html = rows.map(r=>{
const cls = r.s==='LIVE' ? 'live' : (r.s==='OFFLINE' ? 'off' : 'seed');
return `<div class="row"><span class="dot ${cls}"></span><span>${r.label}</span><span class="meta">${r.s}</span></div>`;
}).join('');
if (fabricCounts){
html += `<div class="row"><span class="dot live"></span><span>compute fabric</span><span class="meta">${fabricCounts.nodes_reachable}/${fabricCounts.nodes_total} up · ${fabricCounts.gpu_nodes_reachable} GPU</span></div>`;
}
document.getElementById('status-rows').innerHTML = html;
document.getElementById('feed-src').textContent = feedSource;
}
function paintTicker(){
const el = document.getElementById('ticker-lines'); if (!el) return;
el.innerHTML = ticker.length ? ticker.map(t=>`<div class="tk">${esc(t)}</div>`).join('') : '<div class="tk dim">awaiting receipt stream…</div>';
}
/* ---------- animation loop (delta-clamped, perf-safe) ----------------------- */
const clock = new THREE.Clock();
let acc = 0;
function animate(){
requestAnimationFrame(animate);
let dt = clock.getDelta(); if (dt > 0.05) dt = 0.05; // clamp after tab-switch
acc += dt;
const t = acc;
// sun: shader time + breathing pulse toward live target
sunMat.uniforms.uTime.value = t;
const pulse = REDUCED ? sunPulseTarget : (0.5*sunPulseTarget + 0.5*(sunPulseTarget*(0.85+0.15*Math.sin(t*1.6))));
sunMat.uniforms.uPulse.value += (pulse - sunMat.uniforms.uPulse.value) * 0.05;
const bp = sunMat.uniforms.uPulse.value;
keyLight.intensity = 1.8 + 1.4*bp;
bloomSprites.forEach((b,i)=>{ b.spr.material.opacity = b.base * (0.7 + 0.6*bp); if(!REDUCED){ const s=b.size*(1+0.03*Math.sin(t*1.3+i)); b.spr.scale.set(s,s,1);} });
if (!REDUCED){
sunCore.rotation.y += 0.0015*dt*60; brainLattice.rotation.y -= 0.0011*dt*60; brainLattice.rotation.x += 0.0006*dt*60;
sunGlow.material.opacity = 0.08 + 0.04*Math.sin(t*2);
capBodies.forEach((cb,i)=>{
const a = cb.baseAngle + t*0.55;
const x = Math.cos(a)*ORBIT_R, z = Math.sin(a)*ORBIT_R, y = Math.sin(a*1.3+i)*24;
cb.grp.position.set(x,y,z); cb.mesh.rotation.y += 0.01;
cb.tether.geometry.setFromPoints([new THREE.Vector3(0,0,0), new THREE.Vector3(x,y,z)]);
cb.tether.geometry.attributes.position.needsUpdate = true;
});
fieldNode.rotation.y += 0.008; fieldRing.rotation.z += 0.004;
khipuGroup.rotation.y += 0.0006*dt*60;
fabricGroup.rotation.y -= 0.0004*dt*60;
fabricNodes.forEach((o,i)=>{ o.mesh.rotation.x += 0.01; o.mesh.rotation.y += 0.008; });
} else {
// reduced-motion: place capabilities statically along their base angle
capBodies.forEach((cb,i)=>{ const a=cb.baseAngle; const x=Math.cos(a)*ORBIT_R, z=Math.sin(a)*ORBIT_R, y=Math.sin(a*1.3+i)*24;
cb.grp.position.set(x,y,z); cb.tether.geometry.setFromPoints([new THREE.Vector3(0,0,0), new THREE.Vector3(x,y,z)]); cb.tether.geometry.attributes.position.needsUpdate = true; });
}
// cord pulse decay → brighten cords briefly when a new receipt streams in
if (cordPulse > 0){ cordPulse = Math.max(0, cordPulse - dt*0.8);
if (cordLines) cordLines.material.opacity = 0.34 + 0.5*cordPulse;
if (receiptPoints) receiptPoints.material.opacity = 0.94 + 0.06*cordPulse;
}
// camera fly-to choreography
if (flying){
flying.t += dt / flying.dur;
const k = easeInOut(Math.min(1, flying.t));
camera.position.lerpVectors(flying.fromPos, flying.toPos, k);
controls.target.lerpVectors(flying.fromTgt, flying.toTgt, k);
if (flying.t >= 1) flying = null;
}
controls.update();
renderer.render(scene, camera);
}
/* ---------- boot ------------------------------------------------------------ */
window.addEventListener('resize', ()=>{
camera.aspect = window.innerWidth/window.innerHeight; camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
});
renderConstellation(seedConstellation(), false); // immediate honest SEED paint
paintHUD(); paintTicker();
animate();
requestAnimationFrame(()=> document.getElementById('boot').classList.add('hide'));
poll();
setInterval(poll, 8000);
// yield cinematic auto-orbit the moment the user grabs the scene
controls.addEventListener('start', ()=>{ controls.autoRotate = false; });