grok4.20 “If you ever open-source the globe + the SVD → kinematic pipeline, people in the AV perception community (OpenPCDet, MMDetection3D, comma.ai OpenPilot forks) will immediately recognize it as “eigenportfolio-style embedding for dynamic objects.” That’s how close the math is.”

.html patched -live

grok4.4 v00

gemini v00

<!DOCTYPE html>
<html class="bg-[#050608] text-zinc-300">
<head>
    <meta charset="UTF-8">
    <title>Sovereign | 5D Kinematic Globe – Lens View</title>
    <script src="<https://cdn.tailwindcss.com>"></script>
    <script src="<https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js>"></script>
    <style>
        ::-webkit-scrollbar { display: none; }
        body { margin: 0; overflow: hidden; font-family: 'Courier New', Courier, monospace; }
        canvas { display: block; position: absolute; inset: 0; z-index: 0; }
        #ui-layer { position: relative; z-index: 10; pointer-events: none; }
        .pointer-events-auto { pointer-events: auto; }
    </style>
</head>
<body class="bg-[#050608] h-screen w-screen">

    <div id="ui-layer" class="w-full h-full p-5 flex justify-between select-none">

        <!-- LEFT PANEL – Controls + Global Metrics -->
        <div class="flex flex-col gap-4 w-72">

            <div class="border border-zinc-800 bg-black/75 backdrop-blur-sm p-4 rounded-lg pointer-events-auto shadow-lg shadow-black/60">
                <h2 class="text-blue-400 font-bold uppercase text-xs tracking-wider border-b border-zinc-800 pb-2 mb-3">HEGEMON LENS V2</h2>
                <div class="text-xs space-y-1.5 text-zinc-400">
                    <div class="flex justify-between"><span>Topology</span><span class="text-zinc-200">Spherical 5D</span></div>
                    <div class="flex justify-between"><span>Render Engine</span><span class="text-zinc-200">WebGL</span></div>
                    <div class="flex justify-between"><span>Sync Status</span><span class="text-amber-400 font-medium">SIMULATION</span></div>
                </div>
            </div>

            <div class="border border-zinc-800 bg-black/75 backdrop-blur-sm p-4 rounded-lg pointer-events-auto text-xs">
                <h3 class="text-blue-400 uppercase text-[11px] font-bold mb-2">GLOBAL LENS METRICS</h3>
                <div id="global-metrics" class="space-y-1 text-zinc-400">
                    <div class="flex justify-between"><span>Active Vectors</span><span id="g-count" class="text-emerald-400 font-bold">0000</span></div>
                    <div class="flex justify-between"><span>Avg Bayesian Pull</span><span id="g-bayes" class="text-white font-bold">0.0000</span></div>
                    <div class="flex justify-between"><span>Avg Entropy (Z)</span><span id="g-entropy" class="text-zinc-300 font-bold">0.0000</span></div>
                    <div class="flex justify-between"><span>Dominant Regime</span><span id="g-phase" class="font-bold text-amber-400">—</span></div>
                </div>
            </div>

            <div class="border border-zinc-800 bg-black/60 p-3 rounded-lg pointer-events-auto text-[10px] grid grid-cols-2 gap-x-3 gap-y-1.5">
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#33cc66]"></div>Recovery</div>
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#19e633]"></div>Bull</div>
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#ffdd33]"></div>Top</div>
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#ff8833]"></div>Early Recession</div>
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#ff3333]"></div>Recession</div>
                <div class="flex items-center gap-2"><div class="w-3 h-3 rounded-full bg-[#c63366]"></div>Bear</div>
            </div>

        </div>

        <!-- RIGHT PANEL – Hover/Click Inspector -->
        <div id="inspector-pane" class="w-80 border border-zinc-800 bg-black/85 backdrop-blur-md p-5 rounded-lg pointer-events-auto hidden flex-col transition-all duration-200 shadow-2xl shadow-black/70">
            <div class="flex justify-between items-center border-b border-zinc-800 pb-3 mb-4">
                <h2 id="ui-ticker" class="text-amber-300 font-bold uppercase text-base tracking-widest">—</h2>
                <span id="ui-sdr-hex" class="px-2.5 py-1 rounded text-xs font-mono font-bold bg-zinc-900 text-white border border-zinc-700">#000000</span>
            </div>
            <div class="space-y-3 text-sm">
                <div class="flex justify-between"><span class="text-zinc-500">Stance</span><span id="ui-stance" class="text-emerald-400 font-bold">—</span></div>
                <div class="flex justify-between"><span class="text-zinc-500">Regime</span><span id="ui-phase" class="text-blue-300 font-bold">—</span></div>
                <div class="flex justify-between"><span class="text-zinc-500">Entropy (Z)</span><span id="ui-entropy" class="text-zinc-200">0.0000</span></div>
                <div class="flex justify-between"><span class="text-zinc-500">Kinematic</span><span id="ui-kinematics" class="text-zinc-200">0.00, 0.00</span></div>
                <div class="flex justify-between"><span class="text-zinc-500">Bayes Pull</span><span id="ui-bayes" class="text-white">0.0000</span></div>
            </div>
            <div class="mt-5 border border-zinc-800 p-1.5 rounded-full overflow-hidden">
                <div id="gradient-bar" class="h-2 w-full rounded-full bg-gradient-to-r from-[#050608] to-white"></div>
            </div>
        </div>

    </div>

    <div id="canvas-container"></div>

    <script>
        // ───────────────────────────────────────────────
        //          SOVEREIGN GLASS LENS – Standalone V2
        // ───────────────────────────────────────────────

        const scene = new THREE.Scene();
        scene.fog = new THREE.FogExp2(0x050608, 0.0018);

        const camera = new THREE.PerspectiveCamera(55, innerWidth / innerHeight, 0.1, 2000);
        camera.position.set(0, 35, 110);

        const renderer = new THREE.WebGLRenderer({ antialias: false, powerPreference: "low-power" });
        renderer.setSize(innerWidth, innerHeight);
        renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
        document.getElementById('canvas-container').appendChild(renderer.domElement);

        // Lighting – makes glass lens feel real
        scene.add(new THREE.AmbientLight(0xaaaaaa, 0.4));
        const lensLight = new THREE.PointLight(0x88ccff, 2.2, 500);
        lensLight.position.set(20, 60, 50);
        scene.add(lensLight);

        const GLOBE_RADIUS = 60;

        // Glass-like boundary (Local Void)
        const sphereMat = new THREE.MeshPhongMaterial({
            color: 0x27272a, wireframe: true, transparent: true, opacity: 0.38,
            shininess: 100, specular: 0x99eeff
        });
        const boundingSphere = new THREE.Mesh(new THREE.SphereGeometry(GLOBE_RADIUS, 48, 32), sphereMat);
        scene.add(boundingSphere);

        // Great Attractor core + glow
        scene.add(new THREE.Mesh(new THREE.SphereGeometry(4, 64, 64), new THREE.MeshBasicMaterial({color: 0xffdd44})));
        scene.add(new THREE.Mesh(new THREE.SphereGeometry(9, 32, 32), new THREE.MeshBasicMaterial({
            color: 0xffaa00, transparent: true, opacity: 0.22, blending: THREE.AdditiveBlending
        })));

        // Dark matter sand
        const sandCount = 12000;
        const sandGeo = new THREE.BufferGeometry();
        const pos = new Float32Array(sandCount * 3);
        for (let i = 0; i < sandCount * 3; i += 3) {
            const r = GLOBE_RADIUS * Math.cbrt(Math.random());
            const theta = Math.random() * Math.PI * 2;
            const phi = Math.acos(2 * Math.random() - 1);
            pos[i]   = r * Math.sin(phi) * Math.cos(theta);
            pos[i+1] = r * Math.sin(phi) * Math.sin(theta);
            pos[i+2] = r * Math.cos(phi);
        }
        sandGeo.setAttribute('position', new THREE.BufferAttribute(pos, 3));
        const sandMat = new THREE.PointsMaterial({ color: 0x4b4b52, size: 0.16, transparent: true, opacity: 0.5 });
        scene.add(new THREE.Points(sandGeo, sandMat));

        // ─── Kinematic Instanced Streaks ───
        const MAX_MOVERS = 1800;
        let activeMovers = 0;
        const streakGeo = new THREE.CylinderGeometry(0.42, 0.42, 7, 6);
        streakGeo.translate(0, 3.5, 0);
        streakGeo.rotateX(Math.PI / 2);

        const shaderMat = new THREE.ShaderMaterial({
            vertexShader: `
                attribute vec3 instanceColor;
                varying vec3 vColor;
                void main() {
                    vColor = instanceColor * 1.12;
                    gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
                }`,
            fragmentShader: `varying vec3 vColor; void main() { gl_FragColor = vec4(vColor, 0.94); }`,
            transparent: true, depthWrite: false, blending: THREE.AdditiveBlending
        });

        const movers = new THREE.InstancedMesh(streakGeo, shaderMat, MAX_MOVERS);
        const dummy = new THREE.Object3D();
        const colors = new Float32Array(MAX_MOVERS * 3);
        movers.instanceColor = new THREE.InstancedBufferAttribute(colors, 3);
        movers.count = 0;
        scene.add(movers);

        let ledger = [];

        const phaseColors = {
            "EARLY_RECOVERY": [0.2,0.85,0.45], "BULL_MARKET": [0.15,0.95,0.25],
            "MARKET_TOP": [0.95,0.85,0.15], "EARLY_RECESSION": [0.95,0.55,0.15],
            "FULL_RECESSION": [0.95,0.15,0.15], "BEAR_MARKET": [0.65,0.15,0.35]
        };
        const phaseKeys = Object.keys(phaseColors);

        function generateMockData() {
            activeMovers = Math.floor(Math.random() * 400) + 800;
            ledger = [];
            for (let i = 0; i < activeMovers; i++) {
                const phase = phaseKeys[Math.floor(Math.random() * phaseKeys.length)];
                const c = phaseColors[phase];
                colors[i*3] = c[0]; colors[i*3+1] = c[1]; colors[i*3+2] = c[2];

                const x = (Math.random()-0.5)*28;
                const y = (Math.random()-0.5)*28;
                const z = Math.random() * 65;

                ledger.push({
                    ticker: `H${Math.floor(Math.random()*9000+1000)}`,
                    x, y, z,
                    bayes: Math.random() * 0.98 + 0.02,
                    phase,
                    stance: z > 48 ? "CIRCUIT_LOCK" : (z > 20 ? "ACCUMULATE" : "OBSERVE"),
                    hex: '#' + c.map(v=>Math.round(v*255).toString(16).padStart(2,'0')).join('').toUpperCase(),
                    pos: new THREE.Vector3(x, z - GLOBE_RADIUS*0.6, y),
                    vel: new THREE.Vector3(x*0.04, 0, y*0.04)
                });
            }
            movers.count = activeMovers;
            movers.geometry.attributes.instanceColor.needsUpdate = true;
            updateGlobalMetrics();
        }

        function updateGlobalMetrics() {
            if (!activeMovers) return;
            const avgBayes = ledger.reduce((s,d)=>s+d.bayes,0) / activeMovers;
            const avgZ    = ledger.reduce((s,d)=>s+(d.z||0),0) / activeMovers;

            const counts = {};
            ledger.forEach(d => counts[d.phase] = (counts[d.phase]||0) + 1);
            const domPhase = Object.keys(counts).reduce((a,b)=>counts[a]>counts[b]?a:b, "—");

            document.getElementById('g-count').textContent   = activeMovers.toString().padStart(4,'0');
            document.getElementById('g-bayes').textContent   = avgBayes.toFixed(4);
            document.getElementById('g-entropy').textContent = avgZ.toFixed(4);
            document.getElementById('g-phase').textContent   = domPhase;
            document.getElementById('g-phase').className     = `font-bold ${domPhase.includes('BULL')||domPhase.includes('RECOVERY')?'text-emerald-400':'text-amber-400'}`;
        }

        // ─── Interaction ───
        const raycaster = new THREE.Raycaster();
        const mouse = new THREE.Vector2();
        let lockedId = null;

        window.addEventListener('mousemove', e => {
            mouse.x = (e.clientX / innerWidth) * 2 - 1;
            mouse.y = -(e.clientY / innerHeight) * 2 + 1;
            updateInspector();
        });

        window.addEventListener('click', e => {
            mouse.x = (e.clientX / innerWidth) * 2 - 1;
            mouse.y = -(e.clientY / innerHeight) * 2 + 1;
            raycaster.setFromCamera(mouse, camera);
            const hit = raycaster.intersectObject(movers);
            lockedId = hit.length ? hit[0].instanceId : null;
            document.body.style.cursor = lockedId ? 'none' : 'default';
            updateInspector();
        });

        function updateInspector() {
            raycaster.setFromCamera(mouse, camera);
            const hits = raycaster.intersectObject(movers);
            const idx = lockedId ?? (hits.length ? hits[0].instanceId : -1);
            const data = ledger[idx];

            const pane = document.getElementById('inspector-pane');
            if (data) {
                document.getElementById('ui-ticker').textContent = data.ticker;
                const hexEl = document.getElementById('ui-sdr-hex');
                hexEl.textContent = data.hex;
                hexEl.style.color = data.hex;
                hexEl.style.backgroundColor = data.hex + '22';

                const stanceEl = document.getElementById('ui-stance');
                stanceEl.textContent = data.stance;
                stanceEl.className = data.stance.includes('ACCUMULATE') ? 'text-emerald-400 font-bold' :
                                     data.stance.includes('LOCK') ? 'text-red-400 font-bold' : 'text-blue-300 font-bold';

                document.getElementById('ui-phase').textContent     = data.phase;
                document.getElementById('ui-entropy').textContent   = (data.z||0).toFixed(4);
                document.getElementById('ui-kinematics').textContent = `${data.x.toFixed(2)}, ${data.y.toFixed(2)}`;
                document.getElementById('ui-bayes').textContent     = data.bayes.toFixed(4);
                document.getElementById('gradient-bar').style.background = `linear-gradient(90deg, #050608, ${data.hex})`;

                pane.classList.remove('hidden');
                pane.classList.add('flex');
            } else {
                pane.classList.add('hidden');
                pane.classList.remove('flex');
            }
        }

        // ─── Animation Loop ───
        function animate() {
            requestAnimationFrame(animate);

            boundingSphere.rotation.y += 0.0004;
            scene.children[3].rotation.y -= 0.00025; // sand

            for (let i = 0; i < activeMovers; i++) {
                const d = ledger[i];
                d.pos.add(d.vel);

                const dist = d.pos.length();
                if (dist > GLOBE_RADIUS * 1.02) d.pos.multiplyScalar(-0.97);

                dummy.position.copy(d.pos);
                dummy.lookAt(d.pos.clone().add(d.vel));
                const force = Math.hypot(d.x, d.y);
                dummy.scale.set(1, 1, 1 + force * 0.09);
                dummy.updateMatrix();
                movers.setMatrixAt(i, dummy.matrix);
            }
            movers.instanceMatrix.needsUpdate = true;

            // Gentle camera orbit
            const t = Date.now() * 0.00008;
            camera.position.x = Math.sin(t) * 130;
            camera.position.z = Math.cos(t) * 130;
            camera.lookAt(0,0,0);

            renderer.render(scene, camera);
        }

        // Start
        generateMockData();
        setInterval(generateMockData, 14000); // refresh feel every ~14s
        animate();

        window.addEventListener('resize', () => {
            camera.aspect = innerWidth / innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(innerWidth, innerHeight);
        });
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JC-SDK | Sovereign Globe Matrix</title>
    <style>
        body { margin: 0; overflow: hidden; background-color: #f0f2f5; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
        canvas { display: block; }
        
        /* Outlook-Centric Glassmorphism Pane */
        #inspector-pane {
            position: absolute; top: 20px; right: 20px; width: 340px;
            background: rgba(255, 255, 255, 0.85); border: 1px solid rgba(200, 200, 200, 0.5);
            border-radius: 8px; box-shadow: 0 8px 32px rgba(0,0,0,0.1);
            padding: 24px; display: none; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
        }
        
        .header-row { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 1px solid #e1dfdd; padding-bottom: 12px; margin-bottom: 16px; }
        h2 { margin: 0; font-size: 1.5rem; color: #201f1e; font-weight: 600; letter-spacing: -0.5px; }
        .sdr-badge { padding: 4px 10px; border-radius: 12px; font-size: 0.75rem; font-weight: 700; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,0.2); }
        
        .data-row { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 0.95rem; }
        .data-label { color: #605e5c; font-weight: 500; }
        .data-value { color: #0078d4; font-weight: 600; font-family: 'Courier New', Courier, monospace; }
        
        #gradient-bar { height: 6px; width: 100%; border-radius: 3px; margin-top: 20px; }
        #status-indicator { position: absolute; bottom: 20px; left: 20px; color: #a19f9d; font-size: 0.85rem; font-family: monospace; }
    </style>
</head>
<body>

    <div id="inspector-pane">
        <div class="header-row">
            <h2 id="ui-ticker">TICKER</h2>
            <span id="ui-sdr-hex" class="sdr-badge">#000000</span>
        </div>
        <div class="data-row"><span class="data-label">Bayesian Gravity:</span><span id="ui-bayes" class="data-value">0.0000</span></div>
        <div class="data-row"><span class="data-label">SVD Mesh Fold:</span><span id="ui-svd" class="data-value">0.0000</span></div>
        <div class="data-row"><span class="data-label">Quantum Mark (Psi):</span><span id="ui-qmark" class="data-value">0.0000</span></div>
        <div class="data-row"><span class="data-label">Kinematic Velocity:</span><span id="ui-vel" class="data-value">0.00</span></div>
        <div id="gradient-bar"></div>
    </div>

    <div id="status-indicator">JC-SDK WEB3NODE // SPHERICAL TOPOLOGY LIVE // LEDGER: SYNCING</div>

    <script src="<https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js>"></script>
    <script>
        // --- 1. LEAN SCENE & CAMERA ---
        const scene = new THREE.Scene();
        scene.fog = new THREE.FogExp2(0xf0f2f5, 0.0015);
        const camera = new THREE.PerspectiveCamera(55, window.innerWidth / window.innerHeight, 0.1, 1000);
        camera.position.set(0, 30, 120);

        const renderer = new THREE.WebGLRenderer({ antialias: false, powerPreference: "low-power", alpha: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
        document.body.appendChild(renderer.domElement);

        const GLOBE_RADIUS = 50;

        // --- 2. THE LOCAL VOID (The Glass Sphere Boundary) ---
        const sphereGeo = new THREE.SphereGeometry(GLOBE_RADIUS, 32, 32);
        const sphereMat = new THREE.MeshBasicMaterial({ color: 0xc8c6c4, wireframe: true, transparent: true, opacity: 0.05 });
        const boundingSphere = new THREE.Mesh(sphereGeo, sphereMat);
        scene.add(boundingSphere);

        // --- 3. THE AIRY SAND (Background Dark Matter / Liquidity) ---
        const sandCount = 15000;
        const sandGeo = new THREE.BufferGeometry();
        const sandPos = new Float32Array(sandCount * 3);
        for(let i=0; i<sandCount*3; i+=3) {
            // Distribute randomly within the sphere
            const r = GLOBE_RADIUS * Math.cbrt(Math.random());
            const theta = Math.random() * 2 * Math.PI;
            const phi = Math.acos(2 * Math.random() - 1);
            sandPos[i] = r * Math.sin(phi) * Math.cos(theta);
            sandPos[i+1] = r * Math.sin(phi) * Math.sin(theta);
            sandPos[i+2] = r * Math.cos(phi);
        }
        sandGeo.setAttribute('position', new THREE.BufferAttribute(sandPos, 3));
        const sandMat = new THREE.PointsMaterial({ color: 0xa19f9d, size: 0.1, transparent: true, opacity: 0.4 });
        const sandSystem = new THREE.Points(sandGeo, sandMat);
        scene.add(sandSystem);

        // --- 4. THE MOVERS (Pastel Streaks via InstancedMesh) ---
        const MOVER_COUNT = 2000;
        // Using a cylinder to represent a "streak" of movement
        const streakGeo = new THREE.CylinderGeometry(0.2, 0.2, 4, 8); 
        streakGeo.translate(0, 2, 0); // Pivot at the base
        streakGeo.rotateX(Math.PI / 2); // Align length with Z-axis for lookAt()

        const pastelShader = new THREE.ShaderMaterial({
            vertexShader: `
                attribute vec3 instanceColor;
                attribute float instanceAlpha;
                varying vec3 vColor;
                varying float vAlpha;
                void main() {
                    vColor = instanceColor;
                    vAlpha = instanceAlpha;
                    gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
                }
            `,
            fragmentShader: `
                varying vec3 vColor;
                varying float vAlpha;
                void main() {
                    // Soften colors to pastel directly on GPU
                    vec3 pastel = mix(vColor, vec3(1.0), 0.4);
                    gl_FragColor = vec4(pastel, vAlpha);
                }
            `,
            transparent: true,
            depthWrite: false
        });

        const moversMesh = new THREE.InstancedMesh(streakGeo, pastelShader, MOVER_COUNT);
        const dummy = new THREE.Object3D();
        const colors = new Float32Array(MOVER_COUNT * 3);
        const alphas = new Float32Array(MOVER_COUNT);
        const ledgerData = [];

        // Initialize Ledger Data & Physics State
        for (let i = 0; i < MOVER_COUNT; i++) {
            const bayes = Math.random(); 
            const qmark = Math.random();
            const svd = Math.random() * 1.5;
            
            // Start position inside sphere
            const pos = new THREE.Vector3().randomDirection().multiplyScalar(Math.random() * GLOBE_RADIUS);
            // Velocity vector
            const vel = new THREE.Vector3().randomDirection().multiplyScalar(0.1 + Math.random() * 0.4);
            
            const r = Math.random(), g = Math.random(), b = Math.random();
            colors[i*3] = r; colors[i*3+1] = g; colors[i*3+2] = b;
            alphas[i] = 0.3 + (qmark * 0.7); // Q-Mark controls opacity/pulse

            ledgerData.push({
                id: i,
                ticker: `NODE-${Math.floor(Math.random()*9000)+1000}`,
                pos: pos, vel: vel,
                bayes: bayes, svd: svd, qmark: qmark,
                hex: '#' + [r,g,b].map(x => Math.round(x*255).toString(16).padStart(2, '0')).join('').toUpperCase()
            });
        }
        
        moversMesh.instanceColor = new THREE.InstancedBufferAttribute(colors, 3);
        moversMesh.setAttribute('instanceAlpha', new THREE.InstancedBufferAttribute(alphas, 1));
        scene.add(moversMesh);

        // --- 5. RAYCASTING (Outlook Inspector Update) ---
        const raycaster = new THREE.Raycaster();
        const mouse = new THREE.Vector2();
        const uiPane = document.getElementById('inspector-pane');

        window.addEventListener('mousemove', (event) => {
            mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
            mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
            raycaster.setFromCamera(mouse, camera);
            
            // Expand raycaster threshold to hit thin streaks easily
            raycaster.params.InstancedMesh.threshold = 1.5; 
            const intersects = raycaster.intersectObject(moversMesh);

            if (intersects.length > 0) {
                const data = ledgerData[intersects[0].instanceId];
                document.getElementById('ui-ticker').innerText = data.ticker;
                document.getElementById('ui-sdr-hex').innerText = data.hex;
                document.getElementById('ui-sdr-hex').style.backgroundColor = data.hex;
                document.getElementById('ui-bayes').innerText = data.bayes.toFixed(4);
                document.getElementById('ui-svd').innerText = data.svd.toFixed(4);
                document.getElementById('ui-qmark').innerText = data.qmark.toFixed(4);
                document.getElementById('ui-vel').innerText = data.vel.length().toFixed(3);
                document.getElementById('gradient-bar').style.background = `linear-gradient(90deg, #f0f2f5 0%, ${data.hex} 100%)`;
                uiPane.style.display = 'block';
                document.body.style.cursor = 'crosshair';
            } else {
                uiPane.style.display = 'none';
                document.body.style.cursor = 'default';
            }
        });

        // --- 6. KINEMATIC RENDER LOOP ---
        const targetPos = new THREE.Vector3();
        function animate() {
            requestAnimationFrame(animate);

            // Rotate the macro structure slightly
            sandSystem.rotation.y += 0.0005;
            boundingSphere.rotation.y -= 0.0002;

            // Update physical trajectories for all instanced streaks
            for (let i = 0; i < MOVER_COUNT; i++) {
                const data = ledgerData[i];
                
                // Move position along velocity vector
                data.pos.add(data.vel);

                // Gravitational Pull of the Bayesian Center
                // High bayes = pulled to center. Low bayes = drifts to edge.
                const distToCenter = data.pos.length();
                const bayesianTargetRadius = GLOBE_RADIUS * (1.0 - data.bayes);
                
                if (distToCenter > GLOBE_RADIUS) {
                    // Wrap around if it hits the Local Void boundary (Snow Globe effect)
                    data.pos.multiplyScalar(-0.99);
                }

                // Calculate geometry orientation (Streak points in direction of travel)
                targetPos.copy(data.pos).add(data.vel);
                dummy.position.copy(data.pos);
                dummy.lookAt(targetPos);
                
                // Scale thickness by SVD, length by velocity magnitude
                dummy.scale.set(0.5 + data.svd, 0.5 + data.svd, data.vel.length() * 10);
                dummy.updateMatrix();
                moversMesh.setMatrixAt(i, dummy.matrix);
            }
            moversMesh.instanceMatrix.needsUpdate = true;

            // Gentle camera orbit
            camera.position.x = Math.sin(Date.now() * 0.0002) * 120;
            camera.position.z = Math.cos(Date.now() * 0.0002) * 120;
            camera.lookAt(0, 0, 0);

            renderer.render(scene, camera);
        }
        animate();

        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });
    </script>
</body>
</html>

image.png

^gemini visualization of globe.html

image.png

below is live html dash

image.png