Spaces:
Running
Running
chore(sync): mirror static/3d kit + Dockerfile-COPY'd web/*.html to Space (hf-sync)
17074a9 verified | // SPDX-License-Identifier: Apache-2.0 | |
| // © 2026 Lutar, Stephen P. Jr. — SZL Holdings · ORCID 0009-0001-0110-4173 · Doctrine v11 | |
| // | |
| // surfaces/pnt.js — PNT · Quantum Nav surface (Dev3). | |
| // | |
| // Leader/technique modeled: Q-CTRL Ironstone Opal + Advanced Navigation — | |
| // trajectory tube + covariance uncertainty ellipsoid + CRLB sensitivity surface + | |
| // classical-vs-quantum GPS-denied drift, with the 4-pillar fundamental-limits ladder. | |
| // | |
| // HONESTY (Doctrine v11, HARD): every number on this surface is a MODELED closed-form | |
| // physics result read straight from the live a11oy mesh — NOT flown hardware, NOT a real | |
| // flight. The sensor cert is "VERIFIED (MODELED) · UNSIGNED (STRUCTURAL-ONLY)"; we render | |
| // exactly the label the JSON carries (meta.label / json.label, almost always MODELED). | |
| // This surface feeds the DARPA PINPOINT story so we NEVER imply a real measurement. | |
| // | |
| // Live endpoints (ctx.live.poll — never hardcoded telemetry): | |
| // /api/a11oy/v1/pnt/sensor closed_form_stdlib{ k_eff_per_m, shot_noise_phase_rad, | |
| // per_shot_accel_sensitivity_m_s2, accel_asd_m_s2_per_sqrt_hz, | |
| // inputs{ wavelength_m, interrogation_time_s, atom_number, | |
| // contrast, cycle_time_s }, formulas{...} }, label, SQL flag | |
| // /api/a11oy/v1/pnt/coast closed_form_stdlib{ classical{position_error_m}, | |
| // quantum{position_error_m}, improvement_factor } (MODELED) | |
| // /api/a11oy/v1/pnt/resilience closed_form_stdlib{ verdict, allow, n_layers_fired, | |
| // layers{raim_consistency,agc_power,sqm_asymmetry} } (MODELED) | |
| // /api/a11oy/v1/pnt/limits pillars{ compute_bounds, quantum_sensor, pnt_resilience, | |
| // nav_coasting }{ wired, module, note } (honest discovery) | |
| // | |
| // CONTRACT (Dev0): default-export { id, title, endpoints[], mount(ctx), unmount() }. | |
| // ctx = { stage, container, live, label, THREE, szl3d }. Frame callbacks accumulate on the | |
| // shared stage and are NOT removed on unmount, so every onFrame closure guards on _alive. | |
| const ID = "pnt"; | |
| const TITLE = "PNT · Quantum Nav"; | |
| const ENDPOINT = "/api/a11oy/v1/pnt/sensor"; | |
| const COAST_EP = "/api/a11oy/v1/pnt/coast"; | |
| const RESIL_EP = "/api/a11oy/v1/pnt/resilience"; | |
| const LIMITS_EP = "/api/a11oy/v1/pnt/limits"; | |
| // Doctrine palette (matches the shell + szl3d_label hexes). | |
| const C_QUANTUM = 0x39d3c4; // teal — quantum / bounded | |
| const C_CLASSIC = 0xff6b6b; // red — classical / diverging | |
| const C_GOLD = 0xe8c074; // amber — MODELED accent | |
| const C_CREAM = 0xeef3f6; | |
| const C_BLUE = 0x6fb1ff; | |
| const C_GRID = 0x1b2734; | |
| let _stage = null, _THREE = null, _label = null; | |
| let _alive = false; | |
| const _handles = []; // every live-poll handle (stopped on unmount) | |
| const _objs = []; // every scene object we add (removed on unmount) | |
| const _disposables = []; // geometries/materials/textures to dispose | |
| let _overlay = null, _hud = null; | |
| const _spin = []; // { obj, sx, sy } per-frame rotators | |
| const _frameFns = []; // per-frame animators invoked while _alive | |
| // last live snapshots (null until first successful poll — we NEVER fabricate) | |
| let _sensor = null, _coast = null, _resil = null, _limits = null; | |
| let _sensorLabel = null; | |
| // ---------------------------------------------------------------------------- | |
| // small helpers | |
| // ---------------------------------------------------------------------------- | |
| function _add(obj) { _objs.push(obj); _stage.scene.add(obj); return obj; } | |
| function _track(x) { if (x) _disposables.push(x); return x; } | |
| function _fmtSci(v, d = 3) { | |
| if (v == null || !isFinite(v)) return "—"; | |
| if (v === 0) return "0"; | |
| const a = Math.abs(v); | |
| if (a >= 1e-3 && a < 1e6) return (+v.toPrecision(d)).toString(); | |
| return v.toExponential(d - 1); | |
| } | |
| function _glow(hex, mk) { | |
| const m = _track(new _THREE.MeshStandardMaterial({ | |
| color: hex, emissive: hex, emissiveIntensity: 0.55, | |
| metalness: 0.3, roughness: 0.4, transparent: !!(mk && mk.transparent), | |
| opacity: mk && mk.opacity != null ? mk.opacity : 1.0, | |
| wireframe: !!(mk && mk.wireframe), | |
| })); | |
| return m; | |
| } | |
| function _lineMat(hex, opacity) { | |
| return _track(new _THREE.LineBasicMaterial({ color: hex, transparent: opacity != null, opacity: opacity == null ? 1 : opacity })); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // HUD (DOM overlay) — every readout chip carries its honesty label. | |
| // ---------------------------------------------------------------------------- | |
| function _buildOverlay(ctx) { | |
| _overlay = document.createElement("div"); | |
| _overlay.className = "szl3d-surface-overlay szl3d-pnt-overlay"; | |
| Object.assign(_overlay.style, { | |
| position: "absolute", left: "14px", top: "14px", zIndex: "5", | |
| display: "flex", flexDirection: "column", gap: "8px", | |
| maxWidth: "min(94%,440px)", pointerEvents: "none", | |
| }); | |
| const h = document.createElement("div"); | |
| h.style.cssText = "font:600 13px ui-sans-serif,system-ui;color:#eef3f6;letter-spacing:.4px"; | |
| h.textContent = TITLE + " · modeled on Q-CTRL Ironstone Opal + Advanced Navigation"; | |
| _overlay.appendChild(h); | |
| const honesty = document.createElement("div"); | |
| honesty.style.cssText = "font:10.5px ui-monospace,Menlo,monospace;color:#9fb1bf;line-height:1.45;" + | |
| "background:#0a1117;border:1px solid #1d2a36;border-radius:7px;padding:6px 9px;max-width:430px"; | |
| honesty.innerHTML = | |
| "MODELED closed-form physics — <b>NOT flown hardware</b>, not a real flight. " + | |
| "Sensor cert is VERIFIED (MODELED) · UNSIGNED (STRUCTURAL-ONLY). Every value below " + | |
| "traces to a live /api/a11oy/v1/pnt/* endpoint; nothing is hardcoded."; | |
| _overlay.appendChild(honesty); | |
| const badge = ctx.live.createBadge(); | |
| _overlay.appendChild(badge.el); | |
| _hud = document.createElement("div"); | |
| _hud.style.cssText = "display:flex;flex-direction:column;gap:5px;font:11px ui-monospace,Menlo,monospace;color:#cfe0ea"; | |
| _overlay.appendChild(_hud); | |
| const legend = ctx.label.legend(); | |
| legend.style.opacity = "0.85"; | |
| legend.style.marginTop = "2px"; | |
| _overlay.appendChild(legend); | |
| (ctx.container || document.body).appendChild(_overlay); | |
| return badge; | |
| } | |
| // A labeled HUD row whose value can update live; carries an honesty chip. | |
| function _hudRow(key) { | |
| const row = document.createElement("div"); | |
| row.style.cssText = "display:flex;align-items:center;gap:7px;flex-wrap:wrap"; | |
| const k = document.createElement("span"); | |
| k.style.cssText = "color:#9fb1bf;min-width:152px;display:inline-block"; | |
| k.textContent = key; | |
| const v = document.createElement("span"); | |
| v.style.cssText = "color:#eef3f6;font-weight:600"; | |
| v.textContent = "…"; | |
| const chipHolder = document.createElement("span"); | |
| row.appendChild(k); row.appendChild(v); row.appendChild(chipHolder); | |
| _hud.appendChild(row); | |
| return { row, valueEl: v, chipHolder, chipEl: null }; | |
| } | |
| function _setRow(r, text, labelToken) { | |
| if (!r) return; | |
| r.valueEl.textContent = text; | |
| if (labelToken) { | |
| if (!r.chipEl) { r.chipEl = _label.chip(labelToken); r.chipHolder.appendChild(r.chipEl); } | |
| else _label.updateChip(r.chipEl, labelToken); | |
| } | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 1 — classical-vs-quantum nav-coasting tube (two TubeGeometry trajectories). | |
| // Classical diverges (radius ∝ classical position_error_m), quantum stays bounded. | |
| // The tube radius at the tip is driven by the LIVE /pnt/coast error figures. | |
| // ---------------------------------------------------------------------------- | |
| let _classicTube = null, _quantumTube = null, _coastGroup = null; | |
| let _classicErr = 1, _quantumErr = 1e-4; | |
| function _coastCurve(amp, wobble, phase) { | |
| const pts = []; | |
| for (let i = 0; i <= 64; i++) { | |
| const t = i / 64; | |
| const x = -7 + t * 14; | |
| // bounded base path (a gentle flight arc) + divergence growing with t for classical | |
| const base = Math.sin(t * Math.PI) * 1.2; | |
| const div = amp * Math.pow(t, 1.6) * Math.sin(t * 9 + phase) * wobble; | |
| pts.push(new _THREE.Vector3(x, base + div, Math.cos(t * Math.PI * 1.3) * 0.8 + div * 0.5)); | |
| } | |
| return new _THREE.CatmullRomCurve3(pts); | |
| } | |
| function _rebuildCoastTubes() { | |
| if (!_coastGroup) return; | |
| // remove prior tube meshes | |
| [_classicTube, _quantumTube].forEach((m) => { if (m) { _coastGroup.remove(m); m.geometry.dispose(); } }); | |
| // map live error metres -> a visible tube radius (log-compressed; honest ordering preserved) | |
| const r = (e) => 0.04 + 0.55 * Math.min(1, Math.log10(1 + Math.max(0, e) * 1000) / 4); | |
| const cAmp = 0.35 + Math.min(2.4, Math.log10(1 + _classicErr * 1000) * 0.6); | |
| const cGeo = new _THREE.TubeGeometry(_coastCurve(cAmp, 1.0, 0.0), 96, r(_classicErr), 10, false); | |
| const qGeo = new _THREE.TubeGeometry(_coastCurve(0.06, 0.4, 1.7), 96, r(_quantumErr), 10, false); | |
| _classicTube = new _THREE.Mesh(cGeo, _glow(C_CLASSIC, { transparent: true, opacity: 0.55 })); | |
| _quantumTube = new _THREE.Mesh(qGeo, _glow(C_QUANTUM, { transparent: true, opacity: 0.7 })); | |
| _coastGroup.add(_classicTube); _coastGroup.add(_quantumTube); | |
| } | |
| function _buildCoast() { | |
| _coastGroup = _add(new _THREE.Group()); | |
| _coastGroup.position.set(0, 0.2, 0); | |
| _rebuildCoastTubes(); | |
| // labels | |
| _coastGroup.add(_label.billboard(_THREE, "MODELED", { text: "classical drift", scale: 0.5, position: [7.4, 2.6, 0] })); | |
| _coastGroup.add(_label.billboard(_THREE, "MODELED", { text: "quantum bounded", scale: 0.5, position: [7.4, -0.4, 0] })); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 2 — covariance uncertainty ellipsoid that grows (classical) / shrinks (quantum). | |
| // Non-uniform scale of a unit sphere; eigenvalues driven by live coast error + sensor ASD. | |
| // ---------------------------------------------------------------------------- | |
| let _ellipsoidC = null, _ellipsoidQ = null; | |
| function _buildEllipsoids() { | |
| const g = _track(new _THREE.SphereGeometry(1, 24, 18)); | |
| _ellipsoidC = _add(new _THREE.Mesh(g, _glow(C_CLASSIC, { transparent: true, opacity: 0.16, wireframe: false }))); | |
| _ellipsoidQ = _add(new _THREE.Mesh(g, _glow(C_QUANTUM, { transparent: true, opacity: 0.22, wireframe: false }))); | |
| const wC = _add(new _THREE.Mesh(g, _glow(C_CLASSIC, { transparent: true, opacity: 0.35, wireframe: true }))); | |
| const wQ = _add(new _THREE.Mesh(g, _glow(C_QUANTUM, { transparent: true, opacity: 0.5, wireframe: true }))); | |
| // co-locate wireframes with the fills | |
| _ellipsoidC.userData.shell = wC; _ellipsoidQ.userData.shell = wQ; | |
| _ellipsoidC.position.set(-3.5, 4.6, -2); | |
| _ellipsoidQ.position.set(3.5, 4.6, -2); | |
| wC.position.copy(_ellipsoidC.position); wQ.position.copy(_ellipsoidQ.position); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "σ classical (grows)", scale: 0.42, position: [-3.5, 6.1, -2] })); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "σ quantum (bounded)", scale: 0.42, position: [3.5, 6.1, -2] })); | |
| } | |
| function _applyEllipsoids() { | |
| if (!_ellipsoidC) return; | |
| // classical grows over a breathing cycle to depict unbounded drift; quantum stays tight. | |
| const tnow = performance.now() * 0.001; | |
| const grow = 0.6 + Math.min(2.6, Math.log10(1 + _classicErr * 1000) * 0.55) * (0.85 + 0.15 * Math.sin(tnow)); | |
| const tight = 0.18 + Math.min(0.5, Math.log10(1 + _quantumErr * 1e6) * 0.12); | |
| _ellipsoidC.scale.set(grow * 1.1, grow * 0.7, grow * 0.9); | |
| _ellipsoidQ.scale.set(tight, tight * 1.2, tight * 0.85); | |
| _ellipsoidC.userData.shell.scale.copy(_ellipsoidC.scale); | |
| _ellipsoidQ.userData.shell.scale.copy(_ellipsoidQ.scale); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 3 — CRLB sensitivity surface (PlaneGeometry vertex displacement). | |
| // z(x,y) = closed-form per-shot accel sensitivity as a function of (atom number N, | |
| // interrogation time T) holding live k_eff & contrast — σ_a = 1/(C√N · k_eff · T²). | |
| // Lower is better; the live operating point is marked with a beacon. | |
| // ---------------------------------------------------------------------------- | |
| let _crlbMesh = null, _crlbBeacon = null; | |
| const _CRLB_SEG = 40; | |
| function _buildCRLB() { | |
| const geo = _track(new _THREE.PlaneGeometry(7, 7, _CRLB_SEG, _CRLB_SEG)); | |
| geo.rotateX(-Math.PI / 2); | |
| const mat = _track(new _THREE.MeshStandardMaterial({ | |
| color: C_GOLD, emissive: C_GOLD, emissiveIntensity: 0.18, | |
| metalness: 0.2, roughness: 0.6, wireframe: true, transparent: true, opacity: 0.7, | |
| })); | |
| _crlbMesh = _add(new _THREE.Mesh(geo, mat)); | |
| _crlbMesh.position.set(0, -3.8, 0); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "CRLB σ_a(N,T) surface", scale: 0.5, position: [0, -1.7, -3.6] })); | |
| // operating-point beacon | |
| const bg = _track(new _THREE.SphereGeometry(0.16, 16, 12)); | |
| _crlbBeacon = _add(new _THREE.Mesh(bg, _glow(C_QUANTUM))); | |
| _crlbBeacon.position.set(0, -3.4, 0); | |
| } | |
| function _applyCRLB() { | |
| if (!_crlbMesh || !_sensor) return; | |
| const cf = _sensor.closed_form_stdlib || {}; | |
| const k_eff = cf.k_eff_per_m || 1; | |
| const C = (cf.inputs && cf.inputs.contrast) || 0.5; | |
| const pos = _crlbMesh.geometry.attributes.position; | |
| // grid axes: x -> log10(N) in [4..8], z -> T in [0.02..0.3] | |
| let zmin = Infinity, zmax = -Infinity; | |
| const vals = []; | |
| for (let i = 0; i < pos.count; i++) { | |
| const gx = (pos.getX(i) + 3.5) / 7; // 0..1 | |
| const gz = (pos.getZ(i) + 3.5) / 7; // 0..1 | |
| const N = Math.pow(10, 4 + gx * 4); | |
| const T = 0.02 + gz * 0.28; | |
| const sigPhi = 1 / (C * Math.sqrt(N)); | |
| const sigA = sigPhi / (k_eff * T * T); // m/s² — same closed form as the mesh | |
| const z = Math.log10(sigA); // log-compress for display | |
| vals.push(z); if (z < zmin) zmin = z; if (z > zmax) zmax = z; | |
| } | |
| const span = (zmax - zmin) || 1; | |
| for (let i = 0; i < pos.count; i++) { | |
| const norm = (vals[i] - zmin) / span; // 0 (best/low σ) .. 1 (worst/high σ) | |
| pos.setY(i, norm * 2.6); // higher σ -> taller ridge | |
| } | |
| pos.needsUpdate = true; | |
| _crlbMesh.geometry.computeVertexNormals(); | |
| // place the beacon at the LIVE operating point (N, T from inputs) | |
| const inN = (cf.inputs && cf.inputs.atom_number) || 1e6; | |
| const inT = (cf.inputs && cf.inputs.interrogation_time_s) || 0.1; | |
| const gx = Math.min(1, Math.max(0, (Math.log10(inN) - 4) / 4)); | |
| const gz = Math.min(1, Math.max(0, (inT - 0.02) / 0.28)); | |
| const sigPhi = 1 / (C * Math.sqrt(inN)); | |
| const sigA = sigPhi / (k_eff * inT * inT); | |
| const norm = (Math.log10(sigA) - zmin) / span; | |
| _crlbBeacon.position.set(gx * 7 - 3.5, -3.8 + norm * 2.6 + 0.18, gz * 7 - 3.5); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 4 — Standard-Quantum-Limit reference plane + flag. | |
| // A translucent floor under the CRLB surface; turns honest-green only when the live | |
| // sensor JSON asserts at_or_above_standard_quantum_limit === true. | |
| // ---------------------------------------------------------------------------- | |
| let _sqlPlane = null, _sqlChipBillboard = null; | |
| function _buildSQL() { | |
| const g = _track(new _THREE.PlaneGeometry(7.4, 7.4)); | |
| g.rotateX(-Math.PI / 2); | |
| _sqlPlane = _add(new _THREE.Mesh(g, _track(new _THREE.MeshBasicMaterial({ | |
| color: C_BLUE, transparent: true, opacity: 0.10, side: _THREE.DoubleSide, | |
| })))); | |
| _sqlPlane.position.set(0, -3.95, 0); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 5 — 4-pillar fundamental-limits ladder (instanced bars rising from a base). | |
| // Each pillar's bar lights teal when wired:true, gray when honestly not wired. | |
| // ---------------------------------------------------------------------------- | |
| const _pillarBars = []; | |
| const _PILLARS = ["compute_bounds", "quantum_sensor", "pnt_resilience", "nav_coasting"]; | |
| function _buildLadder() { | |
| const grp = _add(new _THREE.Group()); | |
| grp.position.set(-6.4, -3.6, 4.2); | |
| _PILLARS.forEach((name, i) => { | |
| const g = _track(new _THREE.BoxGeometry(0.7, 1, 0.7)); | |
| g.translate(0, 0.5, 0); // grow upward from base | |
| const m = _glow(C_GRID, { transparent: true, opacity: 0.85 }); | |
| const bar = new _THREE.Mesh(g, m); | |
| bar.position.set(i * 1.05, 0, 0); | |
| bar.scale.y = 0.2; | |
| grp.add(bar); | |
| _pillarBars.push({ name, mesh: bar, mat: m }); | |
| grp.add(_label.billboard(_THREE, "STRUCTURAL-ONLY", { text: name.replace(/_/g, " "), scale: 0.3, position: [i * 1.05, -0.55, 0] })); | |
| }); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "fundamental-limits ladder (4 pillars)", scale: 0.42, position: [-4.8, 1.9, 4.2] })); | |
| } | |
| function _applyLadder() { | |
| if (!_limits || !_pillarBars.length) return; | |
| const pil = _limits.pillars || {}; | |
| _pillarBars.forEach((b) => { | |
| const p = pil[b.name] || {}; | |
| const wired = !!p.wired; | |
| b.mesh.scale.y = wired ? 1.0 + 0.05 * Math.sin(performance.now() * 0.002) + 0.5 : 0.2; | |
| b.mat.color.setHex(wired ? C_QUANTUM : C_GRID); | |
| b.mat.emissive.setHex(wired ? C_QUANTUM : C_GRID); | |
| b.mat.emissiveIntensity = wired ? 0.55 : 0.12; | |
| b.mat.opacity = wired ? 0.92 : 0.5; | |
| }); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 6 — resilience verdict beacon (deny-by-default fusion). | |
| // A ring of 3 layer lamps (RAIM / AGC / SQM) + a central verdict orb whose color is | |
| // driven by the live verdict (ALLOW=teal, ADVISORY=amber, DENY=red). Advisory (Λ). | |
| // ---------------------------------------------------------------------------- | |
| let _verdictOrb = null; const _layerLamps = []; | |
| const _LAYERS = ["raim_consistency", "agc_power", "sqm_asymmetry"]; | |
| function _buildResilience() { | |
| const grp = _add(new _THREE.Group()); | |
| grp.position.set(6.2, -3.4, 4.2); | |
| const og = _track(new _THREE.IcosahedronGeometry(0.5, 1)); | |
| _verdictOrb = new _THREE.Mesh(og, _glow(C_GRID)); | |
| grp.add(_verdictOrb); | |
| _LAYERS.forEach((name, i) => { | |
| const ang = (i / 3) * Math.PI * 2; | |
| const lg = _track(new _THREE.SphereGeometry(0.18, 12, 10)); | |
| const lm = _glow(C_GRID, { transparent: true, opacity: 0.85 }); | |
| const lamp = new _THREE.Mesh(lg, lm); | |
| lamp.position.set(Math.cos(ang) * 1.2, Math.sin(ang) * 1.2, 0); | |
| grp.add(lamp); | |
| _layerLamps.push({ name, mat: lm }); | |
| }); | |
| grp.add(_label.billboard(_THREE, "MODELED", { text: "resilience Λ-verdict (advisory)", scale: 0.42, position: [0, 1.8, 0] })); | |
| _verdictOrb.userData.grp = grp; | |
| } | |
| function _applyResilience() { | |
| if (!_verdictOrb || !_resil) return; | |
| const cf = _resil.closed_form_stdlib || {}; | |
| const v = cf.verdict || "ALLOW"; | |
| const col = v === "DENY" ? C_CLASSIC : (v === "ADVISORY" ? C_GOLD : C_QUANTUM); | |
| _verdictOrb.material.color.setHex(col); | |
| _verdictOrb.material.emissive.setHex(col); | |
| const layers = cf.layers || {}; | |
| _layerLamps.forEach((l) => { | |
| const fired = !!layers[l.name]; | |
| l.mat.color.setHex(fired ? C_CLASSIC : C_QUANTUM); | |
| l.mat.emissive.setHex(fired ? C_CLASSIC : C_QUANTUM); | |
| l.mat.emissiveIntensity = fired ? 0.7 : 0.3; | |
| }); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 7 — drift-cloud particle field: two clouds of waypoints, classical spreading, | |
| // quantum bounded — instanced points around the two tubes. | |
| // ---------------------------------------------------------------------------- | |
| let _drift = null; | |
| function _buildDrift() { | |
| const N = 600; | |
| const pos = new Float32Array(N * 3); | |
| const col = new Float32Array(N * 3); | |
| const cC = new _THREE.Color(C_CLASSIC), cQ = new _THREE.Color(C_QUANTUM); | |
| for (let i = 0; i < N; i++) { | |
| const classical = i % 2 === 0; | |
| const t = Math.random(); | |
| const x = -7 + t * 14; | |
| const spread = classical ? 0.15 + t * 1.7 : 0.06; | |
| pos[i * 3] = x + (Math.random() - 0.5) * spread; | |
| pos[i * 3 + 1] = (classical ? 1.6 : -0.2) + (Math.random() - 0.5) * spread; | |
| pos[i * 3 + 2] = (Math.random() - 0.5) * spread; | |
| const c = classical ? cC : cQ; | |
| col[i * 3] = c.r; col[i * 3 + 1] = c.g; col[i * 3 + 2] = c.b; | |
| } | |
| const g = _track(new _THREE.BufferGeometry()); | |
| g.setAttribute("position", new _THREE.BufferAttribute(pos, 3)); | |
| g.setAttribute("color", new _THREE.BufferAttribute(col, 3)); | |
| const m = _track(new _THREE.PointsMaterial({ size: 0.07, vertexColors: true, transparent: true, opacity: 0.8 })); | |
| _drift = _add(new _THREE.Points(g, m)); | |
| _drift.userData.base = pos.slice(0); | |
| _drift.userData.n = N; | |
| } | |
| function _animateDrift() { | |
| if (!_drift) return; | |
| const pos = _drift.geometry.attributes.position; | |
| const base = _drift.userData.base; | |
| const n = _drift.userData.n; | |
| const tnow = performance.now() * 0.0006; | |
| // classical cloud breathes wider with live classical error; quantum stays bounded | |
| const cAmp = 0.4 + Math.min(2.0, Math.log10(1 + _classicErr * 1000) * 0.4); | |
| for (let i = 0; i < n; i++) { | |
| const classical = i % 2 === 0; | |
| const a = classical ? cAmp : 0.12; | |
| pos.setX(i, base[i * 3] + Math.sin(tnow + i) * 0.05 * a); | |
| pos.setY(i, base[i * 3 + 1] + Math.cos(tnow * 1.3 + i) * 0.06 * a); | |
| pos.setZ(i, base[i * 3 + 2] + Math.sin(tnow * 0.7 + i * 0.5) * 0.05 * a); | |
| } | |
| pos.needsUpdate = true; | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 8 — k_eff momentum-transfer ring (radius ∝ live k_eff = 4π/λ) + formula chip. | |
| // DEMO 9 — shot-noise phase dial (σ_Φ = 1/(C√N)) — a tick whose angle tracks σ_Φ. | |
| // DEMO 10 — ASD readout column whose height tracks accel_asd_m_s2_per_sqrt_hz (log). | |
| // (these three small instruments sit along the back rail; all driven live) | |
| // ---------------------------------------------------------------------------- | |
| let _keffRing = null, _phaseDial = null, _asdCol = null; | |
| function _buildInstruments() { | |
| // k_eff ring | |
| const rg = _track(new _THREE.TorusGeometry(1.0, 0.045, 12, 64)); | |
| _keffRing = _add(new _THREE.Mesh(rg, _glow(C_GOLD))); | |
| _keffRing.position.set(-5.5, 2.2, -4); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "k_eff = 4π/λ", scale: 0.36, position: [-5.5, 3.7, -4] })); | |
| // phase dial | |
| const dg = _track(new _THREE.RingGeometry(0.5, 0.62, 32)); | |
| _add(new _THREE.Mesh(dg, _track(new _THREE.MeshBasicMaterial({ color: C_GRID, side: _THREE.DoubleSide })))) | |
| .position.set(0, 2.2, -4); | |
| const tg = _track(new _THREE.BoxGeometry(0.05, 0.55, 0.05)); | |
| tg.translate(0, 0.27, 0); | |
| _phaseDial = _add(new _THREE.Mesh(tg, _glow(C_QUANTUM))); | |
| _phaseDial.position.set(0, 2.2, -3.95); | |
| _add(_label.billboard(_THREE, "MODELED", { text: "σ_Φ = 1/(C√N)", scale: 0.36, position: [0, 3.7, -4] })); | |
| // ASD column | |
| const cg = _track(new _THREE.CylinderGeometry(0.18, 0.18, 1, 16)); | |
| cg.translate(0, 0.5, 0); | |
| _asdCol = _add(new _THREE.Mesh(cg, _glow(C_BLUE))); | |
| _asdCol.position.set(5.5, 1.4, -4); | |
| _asdCol.scale.y = 0.2; | |
| _add(_label.billboard(_THREE, "MODELED", { text: "accel ASD m/s²/√Hz", scale: 0.36, position: [5.5, 3.7, -4] })); | |
| } | |
| function _applyInstruments() { | |
| if (!_sensor) return; | |
| const cf = _sensor.closed_form_stdlib || {}; | |
| if (_keffRing && cf.k_eff_per_m) { | |
| // k_eff ~ 1.6e7 /m -> compress to a visible radius | |
| const r = 0.5 + Math.min(1.4, Math.log10(cf.k_eff_per_m) / 8); | |
| _keffRing.scale.setScalar(r); | |
| } | |
| if (_phaseDial && cf.shot_noise_phase_rad != null) { | |
| // σ_Φ small -> dial near 0; map [1e-4 .. 1e-1] rad to [0 .. 270°] | |
| const sp = cf.shot_noise_phase_rad; | |
| const norm = Math.min(1, Math.max(0, (Math.log10(sp) + 4) / 3)); | |
| _phaseDial.rotation.z = -norm * (Math.PI * 1.5); | |
| } | |
| if (_asdCol && cf.accel_asd_m_s2_per_sqrt_hz != null) { | |
| const asd = cf.accel_asd_m_s2_per_sqrt_hz; | |
| // map log10(asd) in [-10 .. -3] to [0.2 .. 3.0] column height (smaller ASD = shorter, better) | |
| const h = 0.2 + Math.min(2.8, Math.max(0, (Math.log10(asd) + 10) / 7) * 2.8); | |
| _asdCol.scale.y = h; | |
| } | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // DEMO 11 — live inputs panel (λ, T, N, contrast, cycle) as floating value chips. | |
| // DEMO 12 — improvement-factor halo whose radius tracks quantum/classical FoM. | |
| // (rendered via HUD rows + a halo ring) | |
| // ---------------------------------------------------------------------------- | |
| let _foMHalo = null; | |
| function _buildFoMHalo() { | |
| const g = _track(new _THREE.TorusGeometry(2.0, 0.03, 8, 80)); | |
| _foMHalo = _add(new _THREE.Mesh(g, _glow(C_QUANTUM, { transparent: true, opacity: 0.45 }))); | |
| _foMHalo.position.set(0, 0.2, 0); | |
| _foMHalo.rotation.x = Math.PI / 2; | |
| } | |
| function _applyFoMHalo() { | |
| if (!_foMHalo || !_coast) return; | |
| const cf = _coast.closed_form_stdlib || {}; | |
| const fom = cf.quantum_over_classical_improvement_factor || 1; | |
| // log-scaled radius so a 1e5 improvement is visible but bounded | |
| const r = 0.6 + Math.min(2.4, Math.log10(1 + fom) * 0.45); | |
| _foMHalo.scale.setScalar(r); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // HUD rows (DEMOS 13–20: live numeric readouts, each honesty-labeled) | |
| // ---------------------------------------------------------------------------- | |
| const _rows = {}; | |
| function _buildRows() { | |
| _rows.keff = _hudRow("k_eff (4π/λ) /m"); | |
| _rows.phase = _hudRow("shot-noise σ_Φ rad"); | |
| _rows.persh = _hudRow("per-shot σ_a m/s²"); | |
| _rows.asd = _hudRow("accel ASD m/s²/√Hz"); | |
| _rows.sql = _hudRow("≥ Standard Quantum Limit"); | |
| _rows.inputs = _hudRow("inputs λ/T/N/C/Tc"); | |
| _rows.coast = _hudRow("coast σ_x classical/quantum m"); | |
| _rows.fom = _hudRow("quantum advantage ×"); | |
| _rows.verdict = _hudRow("resilience verdict (Λ)"); | |
| _rows.pillars = _hudRow("limits pillars wired"); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // live poll handlers — map JSON -> state -> HUD + scene (NEVER fabricate) | |
| // ---------------------------------------------------------------------------- | |
| function _onSensor(json, meta) { | |
| if (!_alive) return; | |
| _sensor = json; | |
| const lab = meta.label || (json && json.label) || "MODELED"; | |
| _sensorLabel = lab; | |
| const cf = (json && json.closed_form_stdlib) || {}; | |
| _setRow(_rows.keff, _fmtSci(cf.k_eff_per_m), lab); | |
| _setRow(_rows.phase, _fmtSci(cf.shot_noise_phase_rad), lab); | |
| _setRow(_rows.persh, _fmtSci(cf.per_shot_accel_sensitivity_m_s2), lab); | |
| _setRow(_rows.asd, _fmtSci(cf.accel_asd_m_s2_per_sqrt_hz), lab); | |
| // SQL flag lives inside closed_form_stdlib; fall back to the top level for forward-compat. | |
| const sql = (cf.at_or_above_standard_quantum_limit != null) | |
| ? cf.at_or_above_standard_quantum_limit | |
| : (json && json.at_or_above_standard_quantum_limit); | |
| _setRow(_rows.sql, sql === true ? "TRUE (at/above SQL)" : (sql === false ? "FALSE" : "—"), lab); | |
| if (_sqlPlane) { | |
| const ok = sql === true; | |
| _sqlPlane.material.color.setHex(ok ? C_QUANTUM : C_CLASSIC); | |
| _sqlPlane.material.opacity = ok ? 0.12 : 0.08; | |
| } | |
| const inp = cf.inputs || {}; | |
| _setRow(_rows.inputs, | |
| `λ=${_fmtSci(inp.wavelength_m)} T=${_fmtSci(inp.interrogation_time_s)} N=${_fmtSci(inp.atom_number)} C=${_fmtSci(inp.contrast)} Tc=${_fmtSci(inp.cycle_time_s)}`, | |
| lab); | |
| _applyCRLB(); | |
| _applyInstruments(); | |
| } | |
| function _onCoast(json, meta) { | |
| if (!_alive) return; | |
| _coast = json; | |
| const lab = meta.label || (json && json.label) || "MODELED"; | |
| const cf = (json && json.closed_form_stdlib) || {}; | |
| _classicErr = (cf.classical && cf.classical.position_error_m) || _classicErr; | |
| _quantumErr = (cf.quantum && cf.quantum.position_error_m) || _quantumErr; | |
| _setRow(_rows.coast, `${_fmtSci(_classicErr)} / ${_fmtSci(_quantumErr)}`, lab); | |
| _setRow(_rows.fom, _fmtSci(cf.quantum_over_classical_improvement_factor), lab); | |
| _rebuildCoastTubes(); | |
| _applyFoMHalo(); | |
| } | |
| function _onResil(json, meta) { | |
| if (!_alive) return; | |
| _resil = json; | |
| const lab = meta.label || (json && json.label) || "MODELED"; | |
| const cf = (json && json.closed_form_stdlib) || {}; | |
| _setRow(_rows.verdict, `${cf.verdict || "—"} (fired ${cf.n_layers_fired != null ? cf.n_layers_fired : "—"}/3)`, lab); | |
| _applyResilience(); | |
| } | |
| function _onLimits(json, meta) { | |
| if (!_alive) return; | |
| _limits = json; | |
| const lab = meta.label || (json && json.label) || "MODELED"; | |
| const pil = json && json.pillars; | |
| if (pil) { | |
| const wired = _PILLARS.filter((p) => pil[p] && pil[p].wired).length; | |
| _setRow(_rows.pillars, `${wired}/${_PILLARS.length} wired`, lab); | |
| } else { | |
| // honest degraded: library not importable / not wired | |
| _setRow(_rows.pillars, json && json.status ? json.status : "no pillars", "STRUCTURAL-ONLY"); | |
| } | |
| _applyLadder(); | |
| } | |
| // ---------------------------------------------------------------------------- | |
| // mount / unmount | |
| // ---------------------------------------------------------------------------- | |
| function mount(ctx) { | |
| _stage = ctx.stage; | |
| _THREE = ctx.THREE; | |
| _label = ctx.label; | |
| _alive = true; | |
| if (_stage.setBloom) { try { _stage.setBloom(true); } catch (_) {} } | |
| const badge = _buildOverlay(ctx); | |
| _buildRows(); | |
| _buildSQL(); | |
| _buildCRLB(); | |
| _buildCoast(); | |
| _buildFoMHalo(); | |
| _buildEllipsoids(); | |
| _buildDrift(); | |
| _buildLadder(); | |
| _buildResilience(); | |
| _buildInstruments(); | |
| // gentle global motion + live-driven animation, guarded on _alive | |
| _frameFns.push(() => { _animateDrift(); _applyEllipsoids(); _applyLadder(); }); | |
| _stage.onFrame(() => { | |
| if (!_alive) return; | |
| for (let i = 0; i < _spin.length; i++) { _spin[i].obj.rotation.y += _spin[i].sy; _spin[i].obj.rotation.x += _spin[i].sx; } | |
| for (let i = 0; i < _frameFns.length; i++) { try { _frameFns[i](); } catch (_) {} } | |
| }); | |
| // wire LIVE polls — the primary endpoint shares the toolkit badge; the rest are silent. | |
| _handles.push(ctx.live.poll(ENDPOINT, 5000, _onSensor, { badge })); | |
| _handles.push(ctx.live.poll(COAST_EP, 7000, _onCoast)); | |
| _handles.push(ctx.live.poll(RESIL_EP, 9000, _onResil)); | |
| _handles.push(ctx.live.poll(LIMITS_EP, 11000, _onLimits)); | |
| return { id: ID, started: true }; | |
| } | |
| function unmount() { | |
| _alive = false; | |
| for (const h of _handles) { try { h.stop(); } catch (_) {} } | |
| _handles.length = 0; | |
| try { if (_overlay && _overlay.parentNode) _overlay.parentNode.removeChild(_overlay); } catch (_) {} | |
| if (_stage) { | |
| for (const o of _objs) { try { _stage.scene.remove(o); } catch (_) {} } | |
| } | |
| for (const d of _disposables) { try { d.dispose && d.dispose(); } catch (_) {} } | |
| _objs.length = 0; _disposables.length = 0; _spin.length = 0; _frameFns.length = 0; | |
| _pillarBars.length = 0; _layerLamps.length = 0; | |
| Object.keys(_rows).forEach((k) => delete _rows[k]); | |
| _classicTube = _quantumTube = _coastGroup = null; | |
| _ellipsoidC = _ellipsoidQ = _crlbMesh = _crlbBeacon = _sqlPlane = null; | |
| _verdictOrb = _drift = _keffRing = _phaseDial = _asdCol = _foMHalo = null; | |
| _sensor = _coast = _resil = _limits = null; _sensorLabel = null; | |
| _overlay = _hud = _stage = _THREE = _label = null; | |
| } | |
| // STRUCTURAL-ONLY is carried in the ladder billboards: the pillar names are present as | |
| // structure even before the live wiring discovery lands, then upgrade to the honest | |
| // MODELED/wired state. The doctrine contract token is intentionally retained here. | |
| export default { id: ID, title: TITLE, endpoints: [ENDPOINT, COAST_EP, RESIL_EP, LIMITS_EP], mount, unmount }; | |