{"id":2924,"date":"2026-01-15T23:51:08","date_gmt":"2026-01-15T23:51:08","guid":{"rendered":"https:\/\/kairorobot.com\/?page_id=2924"},"modified":"2026-01-25T07:29:22","modified_gmt":"2026-01-25T07:29:22","slug":"signal-radar","status":"publish","type":"page","link":"https:\/\/directtopic.com\/kairorobot.com\/signal-radar\/","title":{"rendered":"Signal Radar"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2924\" class=\"elementor elementor-2924\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b904d72 e-flex e-con-boxed e-con e-parent\" data-id=\"b904d72\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-101fdf2 elementor-widget elementor-widget-html\" data-id=\"101fdf2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =========================\r\nMBT \u2014 3D Spherical Radar (16D)\r\nFULL REPLACE (WordPress + Elementor)\r\n\u2705 FULLSCREEN\r\n\u2705 RADAR WEB\/PAUTINA (disk grid)\r\n\u2705 SCANNING BEAM (wedge + scan line)\r\n========================= -->\r\n\r\n<style>\r\n\/* ===== MBT RADAR (scoped) ===== *\/\r\n#mbtRadarEmbed{\r\n  --c-mb:#22d3ee; --c-nx:#a78bfa; --c-ag:#34d399; --c-rm:#fbbf24; --c-qv:#60a5fa; --c-vc:#f472b6;\r\n  --bg:#05070b; --panel:rgba(0,0,0,0.28); --border:rgba(255,255,255,0.10);\r\n  --text:rgba(226,232,240,0.92); --muted:rgba(148,163,184,0.70); --glow:rgba(34,211,238,0.22);\r\n  --radius:18px;\r\n\r\n  font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Arial;\r\n  background:var(--bg);\r\n  overflow:hidden;\r\n  isolation:isolate;\r\n\r\n  \/* FULLSCREEN *\/\r\n  position:fixed;\r\n  left:0; right:0;\r\n  top:var(--wp-admin--admin-bar--height, 0px);\r\n  bottom:0;\r\n  width:100%;\r\n  height:calc(100dvh - var(--wp-admin--admin-bar--height, 0px));\r\n  z-index:9999;\r\n\r\n  opacity:0;\r\n  transition:opacity 420ms ease;\r\n}\r\n#mbtRadarEmbed.ready{opacity:1;}\r\n\r\n#mbtRadarEmbed::before{\r\n  content:\"\"; position:absolute; inset:0; pointer-events:none; z-index:0;\r\n  background:\r\n    radial-gradient(circle at 50% 30%, rgba(96,165,250,0.10), rgba(0,0,0,0) 55%),\r\n    radial-gradient(circle at 20% 70%, rgba(244,114,182,0.07), rgba(0,0,0,0) 60%),\r\n    radial-gradient(circle at 80% 75%, rgba(34,211,238,0.07), rgba(0,0,0,0) 60%),\r\n    linear-gradient(rgba(255,255,255,0.05) 1px, transparent 1px),\r\n    linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px);\r\n  background-size:auto,auto,auto,64px 64px,64px 64px;\r\n  opacity:0.10;\r\n}\r\n\r\n#mbtRadarEmbed *{box-sizing:border-box}\r\n#mbtRadarEmbed #app{position:relative; z-index:1; width:100%; height:100%; display:flex; flex-direction:column;}\r\n\r\n#mbtRadarEmbed header{\r\n  padding:14px 16px 10px;\r\n  display:flex; flex-direction:column; align-items:center; gap:10px;\r\n}\r\n#mbtRadarEmbed #title{\r\n  font-weight:900; letter-spacing:.04em; color:var(--text);\r\n  font-size:22px; filter:drop-shadow(0 0 12px var(--glow)); user-select:none;\r\n}\r\n@media (min-width:640px){#mbtRadarEmbed #title{font-size:26px}}\r\n\r\n#mbtRadarEmbed .metricsRow{\r\n  max-width:1200px; width:100%;\r\n  display:flex; justify-content:center; gap:10px; flex-wrap:wrap; margin-top:4px;\r\n}\r\n#mbtRadarEmbed .metric{\r\n  display:flex; align-items:center; gap:10px;\r\n  padding:8px 12px; border-radius:999px;\r\n  border:1px solid var(--border);\r\n  background:rgba(255,255,255,0.04); backdrop-filter:blur(8px);\r\n  box-shadow:0 0 18px rgba(0,0,0,0.45);\r\n  min-width:220px;\r\n}\r\n#mbtRadarEmbed .metric .mName{font-weight:900;font-size:12px;letter-spacing:.08em;color:rgba(226,232,240,0.90)}\r\n#mbtRadarEmbed .metric .bar{position:relative;flex:1;height:8px;border-radius:999px;background:rgba(255,255,255,0.10);overflow:hidden}\r\n#mbtRadarEmbed .metric .fill{position:absolute;left:0;top:0;bottom:0;width:0%;\r\n  background:linear-gradient(90deg, rgba(34,211,238,0.95), rgba(167,139,250,0.95));\r\n  box-shadow:0 0 18px rgba(34,211,238,0.18)\r\n}\r\n#mbtRadarEmbed .metric .val{font-weight:900;font-size:12px;color:rgba(226,232,240,0.92);min-width:48px;text-align:right}\r\n#mbtRadarEmbed .metric.drift .fill{background:linear-gradient(90deg, rgba(251,191,36,0.95), rgba(244,114,182,0.95));}\r\n#mbtRadarEmbed .metric.nxmega .fill{background:linear-gradient(90deg, rgba(167,139,250,0.95), rgba(34,211,238,0.95));}\r\n#mbtRadarEmbed .metric.riskp .fill{background:linear-gradient(90deg, rgba(239,68,68,0.95), rgba(251,191,36,0.95));}\r\n\r\n#mbtRadarEmbed #grid{\r\n  flex:1; min-height:0;\r\n  display:grid;\r\n  grid-template-columns:minmax(260px, 340px) 1fr minmax(260px, 340px);\r\n  gap:12px; padding:0 12px 14px; align-items:stretch;\r\n}\r\n@media (max-width:980px){\r\n  #mbtRadarEmbed #grid{grid-template-columns:1fr; grid-template-rows:auto 1fr auto;}\r\n  #mbtRadarEmbed #leftCol, #mbtRadarEmbed #rightCol{display:grid;grid-template-columns:1fr 1fr; gap:12px}\r\n}\r\n@media (max-width:720px){\r\n  #mbtRadarEmbed #leftCol, #mbtRadarEmbed #rightCol{grid-template-columns:1fr;}\r\n}\r\n#mbtRadarEmbed .col{display:flex;flex-direction:column;gap:12px;min-height:0}\r\n\r\n#mbtRadarEmbed .panel{\r\n  flex:1; min-height:0; overflow:hidden;\r\n  border:1px solid var(--border);\r\n  background:var(--panel);\r\n  border-radius:var(--radius);\r\n  backdrop-filter:blur(10px);\r\n  box-shadow:0 0 40px rgba(0,0,0,0.55);\r\n  padding:12px;\r\n  display:flex; flex-direction:column; gap:10px;\r\n}\r\n#mbtRadarEmbed .panelHeader{display:flex;align-items:center;justify-content:space-between;gap:10px}\r\n#mbtRadarEmbed .panelTitle{display:flex;align-items:center;gap:10px}\r\n#mbtRadarEmbed .icoWrap{\r\n  width:38px;height:38px;border-radius:12px;\r\n  display:inline-flex;align-items:center;justify-content:center;\r\n  border:1px solid rgba(255,255,255,0.12);\r\n  background:rgba(255,255,255,0.04);\r\n}\r\n#mbtRadarEmbed .icoWrap svg{width:23px;height:23px}\r\n#mbtRadarEmbed .ico-mb{color:var(--c-mb)} .ico-nx{color:var(--c-nx)}\r\n#mbtRadarEmbed .ico-ag{color:var(--c-ag)} .ico-rm{color:var(--c-rm)}\r\n#mbtRadarEmbed .ico-qv{color:var(--c-qv)} .ico-vc{color:var(--c-vc)}\r\n#mbtRadarEmbed .panelTitle .name{font-weight:900;color:var(--text);letter-spacing:.02em}\r\n#mbtRadarEmbed .roleLine{color:rgba(148,163,184,0.80);font-size:12px}\r\n#mbtRadarEmbed .dot{width:10px;height:10px;border-radius:999px}\r\n\r\n#mbtRadarEmbed .deltaLine{\r\n  font-size:13px;color:rgba(226,232,240,0.85);\r\n  padding:8px 10px;border:1px solid rgba(255,255,255,0.08);\r\n  background:rgba(255,255,255,0.04); border-radius:12px; line-height:1.25;\r\n}\r\n#mbtRadarEmbed .deltaLabel{color:rgba(148,163,184,0.80);font-weight:800;margin-right:6px}\r\n#mbtRadarEmbed .deltaUp{color:rgba(167,243,208,0.92);font-weight:800}\r\n#mbtRadarEmbed .deltaDown{color:rgba(254,202,202,0.92);font-weight:800}\r\n#mbtRadarEmbed .deltaSep{color:rgba(148,163,184,0.55);margin:0 8px}\r\n\r\n#mbtRadarEmbed .log{\r\n  flex:1; min-height:0; overflow:hidden;\r\n  display:flex; flex-direction:column; justify-content:flex-end; gap:6px;\r\n  padding:2px 0;\r\n  -webkit-mask-image:linear-gradient(to top, rgba(0,0,0,1) 82%, rgba(0,0,0,0));\r\n  mask-image:linear-gradient(to top, rgba(0,0,0,1) 82%, rgba(0,0,0,0));\r\n}\r\n#mbtRadarEmbed .msg{font-size:14px;line-height:1.35;color:rgba(226,232,240,0.86);filter:drop-shadow(0 0 10px rgba(0,0,0,0.45))}\r\n@media (min-width:640px){#mbtRadarEmbed .msg{font-size:15px}}\r\n#mbtRadarEmbed .ts{color:rgba(148,163,184,0.60);font-family:ui-monospace,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;margin-right:8px}\r\n#mbtRadarEmbed .who{font-weight:900;color:rgba(226,232,240,0.92)}\r\n#mbtRadarEmbed .sep{color:rgba(148,163,184,0.55);margin:0 8px}\r\n#mbtRadarEmbed .warn{color:rgba(254,202,202,0.92)}\r\n#mbtRadarEmbed .ok{color:rgba(167,243,208,0.92)}\r\n#mbtRadarEmbed .ml{color:rgba(221,214,254,0.92)}\r\n#mbtRadarEmbed .exec{color:rgba(186,230,253,0.92)}\r\n\r\n#mbtRadarEmbed #stageWrap{\r\n  position:relative; min-height:0; display:flex; flex-direction:column;\r\n  border:1px solid var(--border); background:rgba(0,0,0,0.18);\r\n  border-radius:var(--radius); overflow:hidden;\r\n  box-shadow:0 0 40px rgba(0,0,0,0.55);\r\n}\r\n#mbtRadarEmbed #stage{position:relative; flex:1; min-height:0}\r\n#mbtRadarEmbed canvas{position:absolute;inset:0;display:block;width:100%;height:100%}\r\n#mbtRadarEmbed #flash{position:absolute;inset:0;pointer-events:none;opacity:0;mix-blend-mode:screen;will-change:opacity,background}\r\n#mbtRadarEmbed #vignette{position:absolute;inset:-2px;pointer-events:none;opacity:0;mix-blend-mode:screen;transition:opacity 420ms ease;will-change:opacity,background;\r\n  background:radial-gradient(circle at 50% 50%, rgba(96,165,250,0.06) 0%, rgba(96,165,250,0.02) 42%, rgba(0,0,0,0) 74%);\r\n}\r\n#mbtRadarEmbed #vignette.on{opacity:1}\r\n#mbtRadarEmbed #labels{position:absolute;inset:0;pointer-events:none}\r\n\r\n#mbtRadarEmbed .lbl{\r\n  position:absolute; transform:translate(-50%,-50%);\r\n  font-size:12px; font-weight:560; letter-spacing:.08em;\r\n  color:rgba(245,252,255,0.96);\r\n  text-shadow:0 0 2px rgba(0,0,0,0.95), 0 0 10px rgba(120,220,255,0.35);\r\n  user-select:none; white-space:nowrap; opacity:.96;\r\n  --hx1:rgba(120,220,255,.85);\r\n  --hx2:rgba(120,220,255,.35);\r\n}\r\n#mbtRadarEmbed .lbl.risk{color:rgba(255,210,210,0.97)}\r\n#mbtRadarEmbed .lbl.data{color:rgba(200,240,255,0.97)}\r\n#mbtRadarEmbed .lbl.exec{color:rgba(195,255,225,0.97)}\r\n#mbtRadarEmbed .lbl.hot{\r\n  background:rgba(0,0,0,0.18);\r\n  box-shadow:0 0 22px var(--hx2);\r\n  text-shadow:\r\n    0 0 2px rgba(0,0,0,.95),\r\n    0 0 16px var(--hx1),\r\n    0 0 44px var(--hx2);\r\n}\r\n<\/style>\r\n\r\n<div id=\"mbtRadarEmbed\">\r\n  <div id=\"app\">\r\n    <header>\r\n      <div id=\"title\">MBT \u2014 3D Spherical Radar (16D)<\/div>\r\n\r\n      <div class=\"metricsRow\">\r\n        <div class=\"metric\">\r\n          <span class=\"mName\">Consensus<\/span>\r\n          <div class=\"bar\"><div class=\"fill\" id=\"m_consensus\"><\/div><\/div>\r\n          <span class=\"val\" id=\"m_consensus_val\">\u2014<\/span>\r\n        <\/div>\r\n        <div class=\"metric drift\">\r\n          <span class=\"mName\">Drift<\/span>\r\n          <div class=\"bar\"><div class=\"fill\" id=\"m_drift\"><\/div><\/div>\r\n          <span class=\"val\" id=\"m_drift_val\">\u2014<\/span>\r\n        <\/div>\r\n        <div class=\"metric nxmega\">\r\n          <span class=\"mName\">Nexus \u2194 Mega<\/span>\r\n          <div class=\"bar\"><div class=\"fill\" id=\"m_nxmega\"><\/div><\/div>\r\n          <span class=\"val\" id=\"m_nxmega_val\">\u2014<\/span>\r\n        <\/div>\r\n        <div class=\"metric riskp\">\r\n          <span class=\"mName\">Risk pressure<\/span>\r\n          <div class=\"bar\"><div class=\"fill\" id=\"m_risk\"><\/div><\/div>\r\n          <span class=\"val\" id=\"m_risk_val\">\u2014<\/span>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <div id=\"grid\">\r\n      <!-- LEFT -->\r\n      <div class=\"col\" id=\"leftCol\">\r\n        <div class=\"panel\" id=\"panel_Mega_Brain\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-mb\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M9 3c-2.6 0-4.6 2.1-4.6 4.6v.9C3.4 9 2.7 10.1 2.7 11.4c0 1.1.5 2.1 1.3 2.8-.6.7-1 1.6-1 2.6 0 2.3 1.9 4.2 4.2 4.2H9\"><\/path>\r\n                  <path d=\"M15 3c2.6 0 4.6 2.1 4.6 4.6v.9c1 .5 1.7 1.6 1.7 2.9 0 1.1-.5 2.1-1.3 2.8.6.7 1 1.6 1 2.6 0 2.3-1.9 4.2-4.2 4.2H15\"><\/path>\r\n                  <path d=\"M9 7v14\"><\/path><path d=\"M15 7v14\"><\/path>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Mega_Brain\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Mega Brain<\/div>\r\n                <div class=\"roleLine\" id=\"role_Mega_Brain\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Mega_Brain\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Mega_Brain\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\" id=\"panel_Nexus\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-nx\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <circle cx=\"6\" cy=\"12\" r=\"2\"><\/circle>\r\n                  <circle cx=\"18\" cy=\"6\" r=\"2\"><\/circle>\r\n                  <circle cx=\"18\" cy=\"18\" r=\"2\"><\/circle>\r\n                  <path d=\"M8 12h6l2-4\"><\/path><path d=\"M8 12h6l2 4\"><\/path>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Nexus\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Nexus<\/div>\r\n                <div class=\"roleLine\" id=\"role_Nexus\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Nexus\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Nexus\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\" id=\"panel_Quantum_Veil\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-qv\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12z\"><\/path>\r\n                  <circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Quantum_Veil\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Quantum Veil<\/div>\r\n                <div class=\"roleLine\" id=\"role_Quantum_Veil\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Quantum_Veil\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Quantum_Veil\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- CENTER -->\r\n      <div id=\"stageWrap\">\r\n        <div id=\"stage\">\r\n          <canvas id=\"c\"><\/canvas>\r\n          <div id=\"flash\"><\/div>\r\n          <div id=\"vignette\"><\/div>\r\n          <div id=\"labels\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- RIGHT -->\r\n      <div class=\"col\" id=\"rightCol\">\r\n        <div class=\"panel\" id=\"panel_Vortex_Core\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-vc\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M12 3c4.5 0 8 3.5 8 8 0 4.1-3 7.5-7 8\"><\/path>\r\n                  <path d=\"M12 21c-4.5 0-8-3.5-8-8 0-4.1 3-7.5 7-8\"><\/path>\r\n                  <path d=\"M12 7a5 5 0 0 1 5 5\"><\/path>\r\n                  <path d=\"M12 17a5 5 0 0 1-5-5\"><\/path>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Vortex_Core\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Vortex Core<\/div>\r\n                <div class=\"roleLine\" id=\"role_Vortex_Core\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Vortex_Core\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Vortex_Core\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\" id=\"panel_Aegis\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-ag\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4z\"><\/path>\r\n                  <path d=\"M9 12l2 2 4-4\"><\/path>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Aegis\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Aegis<\/div>\r\n                <div class=\"roleLine\" id=\"role_Aegis\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Aegis\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Aegis\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\" id=\"panel_Risk_Manager\">\r\n          <div class=\"panelHeader\">\r\n            <div class=\"panelTitle\">\r\n              <span class=\"icoWrap ico-rm\" aria-hidden=\"true\">\r\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4z\"><\/path>\r\n                  <path d=\"M12 8v6\"><\/path>\r\n                  <path d=\"M12 17h.01\"><\/path>\r\n                <\/svg>\r\n              <\/span>\r\n              <span class=\"dot\" id=\"dot_Risk_Manager\"><\/span>\r\n              <div>\r\n                <div class=\"name\">Risk Manager<\/div>\r\n                <div class=\"roleLine\" id=\"role_Risk_Manager\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"deltaLine\" id=\"delta_Risk_Manager\"><span class=\"deltaLabel\">Movement:<\/span> \u2014<\/div>\r\n          <div class=\"log\" id=\"log_Risk_Manager\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/* ===========================================================\r\nMBT \u2014 FULLSCREEN 3D SPHERICAL RADAR\r\nFixes per request:\r\n1) REAL RADAR WEB\/PAUTINA (disk grid)\r\n2) VISIBLE SCANNING BEAM (wedge + scan line)\r\n3) FULLSCREEN (fixed, respects WP admin bar)\r\n=========================================================== *\/\r\n(function(){\r\n  const root = document.getElementById(\"mbtRadarEmbed\");\r\n  if(!root) return;\r\n  if(root.dataset.mbtInited===\"1\") return;\r\n  root.dataset.mbtInited=\"1\";\r\n\r\n  \/\/ detect WP admin bar height\r\n  const adminBar = document.getElementById(\"wpadminbar\");\r\n  if(adminBar){\r\n    const h = adminBar.getBoundingClientRect().height || 0;\r\n    root.style.setProperty(\"--wp-admin--admin-bar--height\", h+\"px\");\r\n  }\r\n\r\n  const q=(id)=>root.querySelector(\"#\"+(window.CSS&&CSS.escape?CSS.escape(id):id));\r\n  const clamp01=(x)=>Math.max(0,Math.min(1,x));\r\n  const lerp=(a,b,t)=>a+(b-a)*t;\r\n  const mean=(arr)=>arr.length?arr.reduce((s,x)=>s+x,0)\/arr.length:0;\r\n  const nowTime=()=>{const d=new Date();return `${String(d.getHours()).padStart(2,\"0\")}:${String(d.getMinutes()).padStart(2,\"0\")}:${String(d.getSeconds()).padStart(2,\"0\")}`;}\r\n  const escapeHtml=(s)=>String(s).replace(\/[&<>\"']\/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\r\n  function seedRand(seed){let t=seed>>>0;return ()=>{t+=0x6D2B79F5;let r=Math.imul(t^(t>>>15),1|t);r^=r+Math.imul(r^(r>>>7),61|r);return((r^(r>>>14))>>>0)\/4294967296;};}\r\n  function hexToRgb(hex){\r\n    const h=String(hex||\"\").trim();\r\n    if(!h.startsWith(\"#\")) return {r:120,g:220,b:255};\r\n    const x = (h.length===4)?parseInt(h[1]+h[1]+h[2]+h[2]+h[3]+h[3],16):parseInt(h.slice(1),16);\r\n    return {r:(x>>16)&255,g:(x>>8)&255,b:x&255};\r\n  }\r\n\r\n  const CONFIG={\r\n    chaos:0.55,\r\n    msgGapMs:420,\r\n    msgMax:14,\r\n    riskOn:0.62,\r\n    riskOff:0.44,\r\n    settleMs:2000,\r\n  };\r\n\r\n  const SERIES_META=[\r\n    { name:\"Mega Brain\",   color:[0.133,0.827,0.933], css:\"#22d3ee\", role:\"Orchestrator \u2022 Strategy \u2022 Routing \u2022 Memory\" },\r\n    { name:\"Nexus\",        color:[0.655,0.545,0.980], css:\"#a78bfa\", role:\"Signals \u2022 Feature pipeline \u2022 Inference\" },\r\n    { name:\"Vortex Core\",  color:[0.957,0.447,0.714], css:\"#f472b6\", role:\"Federated core \u2022 Aggregation \u2022 Global coordination \u2022 Swarm memory\" },\r\n    { name:\"Quantum Veil\", color:[0.376,0.647,0.980], css:\"#60a5fa\", role:\"On-device \u2022 Personalize \u2022 Uncertainty + anomaly shield\" },\r\n    { name:\"Aegis\",        color:[0.204,0.827,0.600], css:\"#34d399\", role:\"Policy \u2022 Allocation \u2022 Execution guardrails\" },\r\n    { name:\"Risk Manager\", color:[0.984,0.749,0.141], css:\"#fbbf24\", role:\"3-tier risk (Bot\/Server\/Mega) \u2022 Stops\/TP\" },\r\n  ];\r\n\r\n  const AXES=[\r\n    \"DATA_FEED\",\"HISTORY_FEED\",\"FEATURE_PIPELINE\",\"INFERENCE\",\r\n    \"CONFIDENCE\",\"REGIME_VOL\",\"STRATEGY\",\"ALLOCATION\",\"ROUTING\",\"EXECUTION\",\r\n    \"RISK_BOT\",\"RISK_SERVER\",\"RISK_MEGA\",\"STOPS_TP\",\"MONITORING\",\"TEACHERS_AUDIT\"\r\n  ];\r\n\r\n  \/\/ Panels\r\n  const panelMap={};\r\n  for(const s of SERIES_META){\r\n    const id=s.name.replace(\/ \/g,\"_\");\r\n    panelMap[s.name]={dot:q(\"dot_\"+id),role:q(\"role_\"+id),delta:q(\"delta_\"+id),log:q(\"log_\"+id)};\r\n    if(panelMap[s.name].dot){panelMap[s.name].dot.style.background=s.css;panelMap[s.name].dot.style.boxShadow=`0 0 14px ${s.css}`;}\r\n    if(panelMap[s.name].role){panelMap[s.name].role.textContent=s.role;}\r\n  }\r\n\r\n  function makeSideLogger(panels){\r\n    const queues=Object.fromEntries(Object.keys(panels).map(k=>[k,[]]));\r\n    const lastMsgAt=Object.fromEntries(Object.keys(panels).map(k=>[k,0]));\r\n    const lastDeltaAt=Object.fromEntries(Object.keys(panels).map(k=>[k,0]));\r\n    const lastDeltaHtml=Object.fromEntries(Object.keys(panels).map(k=>[k,\"\"]));\r\n\r\n    function render(model){\r\n      const qx=queues[model], el=panels[model]&&panels[model].log;\r\n      if(!qx||!el) return;\r\n      el.innerHTML=qx.map((m,idx)=>{\r\n        const age=(Date.now()-m.t)\/1000;\r\n        const opacity=Math.max(0.33,1-idx*0.08-age*0.03);\r\n        const who=(m.actors&&m.actors.length)?m.actors.join(\" + \"):model;\r\n        return `<div class=\"msg ${m.kind||\"\"}\" style=\"opacity:${opacity.toFixed(3)}\">\r\n          <span class=\"ts\">${nowTime()}<\/span><span class=\"who\">${escapeHtml(who)}<\/span><span class=\"sep\">\u2014<\/span>${escapeHtml(m.text)}\r\n        <\/div>`;\r\n      }).join(\"\");\r\n    }\r\n\r\n    function log(actors,text,kind=\"info\"){\r\n      const list=Array.isArray(actors)?actors:[actors].filter(Boolean);\r\n      if(!list.length) return;\r\n      const now=Date.now();\r\n      for(const a of list){\r\n        if(!queues[a]) continue;\r\n        if(now-lastMsgAt[a] < CONFIG.msgGapMs) continue;\r\n        lastMsgAt[a]=now;\r\n        const qx=queues[a];\r\n        qx.unshift({t:Date.now(),actors:list,text,kind});\r\n        while(qx.length>CONFIG.msgMax) qx.pop();\r\n        render(a);\r\n      }\r\n    }\r\n\r\n    function setDeltas(model,v,t){\r\n      const el=panels[model]&&panels[model].delta;\r\n      if(!el) return;\r\n      const now=Date.now();\r\n      if(now-lastDeltaAt[model] < 260) return;\r\n      lastDeltaAt[model]=now;\r\n\r\n      const diffs=AXES.map((ax,i)=>({ax,d:t[i]-v[i]})).sort((a,b)=>Math.abs(b.d)-Math.abs(a.d));\r\n      const up=diffs.filter(x=>x.d>0.01).slice(0,2);\r\n      const down=diffs.filter(x=>x.d<-0.01).slice(0,2);\r\n      const fmt=(x)=>`${x.d>0?\"\u2191\":\"\u2193\"}${x.ax} ${(x.d>0?\"+\":\"\")}${x.d.toFixed(2)}`;\r\n      const html=`<span class=\"deltaLabel\">Movement:<\/span>\r\n        <span class=\"deltaUp\">${escapeHtml(up.map(fmt).join(\"   \")||\"\u2014\")}<\/span>\r\n        <span class=\"deltaSep\">|<\/span>\r\n        <span class=\"deltaDown\">${escapeHtml(down.map(fmt).join(\"   \")||\"\u2014\")}<\/span>`;\r\n      if(html!==lastDeltaHtml[model]){lastDeltaHtml[model]=html;el.innerHTML=html;}\r\n    }\r\n\r\n    return {log,setDeltas};\r\n  }\r\n\r\n  const side=makeSideLogger(panelMap);\r\n  side.log([\"Mega Brain\"],\"Boot: orchestration online \u2022 memory sync warm.\",\"ok\");\r\n  side.log([\"Nexus\"],\"Boot: signals streaming \u2022 feature pipe primed.\",\"ok\");\r\n  side.log([\"Vortex Core\"],\"Boot: swarm aggregation + global sync ready.\",\"ok\");\r\n  side.log([\"Quantum Veil\"],\"Boot: anomaly shield armed.\",\"ok\");\r\n  side.log([\"Aegis\"],\"Boot: guardrails armed (policy\/allocation\/execution).\",\"ok\");\r\n  side.log([\"Risk Manager\"],\"Boot: 3-tier risk stack ready (Bot\/Server\/Mega).\",\"ok\");\r\n\r\n  \/\/ Metrics\r\n  const mConsensusFill=q(\"m_consensus\"), mConsensusVal=q(\"m_consensus_val\");\r\n  const mDriftFill=q(\"m_drift\"), mDriftVal=q(\"m_drift_val\");\r\n  const mNxMegaFill=q(\"m_nxmega\"), mNxMegaVal=q(\"m_nxmega_val\");\r\n  const mRiskFill=q(\"m_risk\"), mRiskVal=q(\"m_risk_val\");\r\n  const setMetric=(fillEl,valEl,x)=>{\r\n    const v=clamp01(Number(x)||0);\r\n    if(fillEl) fillEl.style.width=Math.round(v*100)+\"%\";\r\n    if(valEl) valEl.textContent=Math.round(v*100)+\"%\";\r\n  };\r\n\r\n  \/\/ Stage\r\n  const stage=q(\"stage\");\r\n  const canvas=q(\"c\");\r\n  const flashEl=q(\"flash\");\r\n  const vignetteEl=q(\"vignette\");\r\n  const labelsEl=q(\"labels\");\r\n  if(!stage||!canvas||!labelsEl){root.classList.add(\"ready\");return;}\r\n\r\n  \/\/ Labels\r\n  labelsEl.innerHTML=\"\";\r\n  const labelNodes=AXES.map((t)=>{\r\n    const d=document.createElement(\"div\");\r\n    d.className=\"lbl\";\r\n    d.textContent=t;\r\n    if(t.startsWith(\"RISK\")||t===\"STOPS_TP\") d.classList.add(\"risk\");\r\n    else if(t.startsWith(\"DATA\")||t.startsWith(\"FEATURE\")||t===\"INFERENCE\") d.classList.add(\"data\");\r\n    else if(t===\"EXECUTION\"||t===\"ALLOCATION\"||t===\"ROUTING\") d.classList.add(\"exec\");\r\n    labelsEl.appendChild(d);\r\n    return d;\r\n  });\r\n\r\n  const axisHotUntil=new Float64Array(AXES.length);\r\n  const axisHotColor=new Array(AXES.length).fill(\"#22d3ee\");\r\n  function hotAxis(i,css,ms=240){axisHotUntil[i]=performance.now()+ms;axisHotColor[i]=css||\"#22d3ee\";}\r\n\r\n  \/\/ WebGL\r\n  const gl=canvas.getContext(\"webgl\",{antialias:true,alpha:false,premultipliedAlpha:false});\r\n  if(!gl){root.classList.add(\"ready\");return;}\r\n  gl.enable(gl.BLEND);\r\n  gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\r\n  gl.enable(gl.DEPTH_TEST);\r\n  gl.depthFunc(gl.LEQUAL);\r\n\r\n  function compile(type,src){\r\n    const sh=gl.createShader(type);\r\n    gl.shaderSource(sh,src);\r\n    gl.compileShader(sh);\r\n    if(!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(sh)||\"shader\");\r\n    return sh;\r\n  }\r\n  function program(vs,fs){\r\n    const p=gl.createProgram();\r\n    gl.attachShader(p, compile(gl.VERTEX_SHADER,vs));\r\n    gl.attachShader(p, compile(gl.FRAGMENT_SHADER,fs));\r\n    gl.linkProgram(p);\r\n    if(!gl.getProgramParameter(p, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p)||\"program\");\r\n    return p;\r\n  }\r\n\r\n  const VS_LINE=`\r\n    attribute vec3 aPos;\r\n    uniform mat4 uMVP;\r\n    varying float vNear;\r\n    void main(){\r\n      vec4 clip=uMVP*vec4(aPos,1.0);\r\n      gl_Position=clip;\r\n      float z01=(clip.z\/clip.w)*0.5+0.5;\r\n      vNear=1.0-clamp(z01,0.0,1.0);\r\n    }`;\r\n  const FS_LINE=`\r\n    precision mediump float;\r\n    uniform vec4 uColor;\r\n    varying float vNear;\r\n    void main(){\r\n      float a=uColor.a*(0.30+0.70*vNear);\r\n      gl_FragColor=vec4(uColor.rgb,a);\r\n    }`;\r\n\r\n  const VS_SURF=`\r\n    attribute vec3 aPos;\r\n    attribute vec3 aNor;\r\n    uniform mat4 uMVP;\r\n    uniform mat4 uModel;\r\n    varying float vLit;\r\n    void main(){\r\n      gl_Position=uMVP*vec4(aPos,1.0);\r\n      vec3 n=normalize((uModel*vec4(aNor,0.0)).xyz);\r\n      vec3 lightDir=normalize(vec3(0.35,0.65,0.55));\r\n      float diff=max(dot(n,lightDir),0.0);\r\n      vLit=0.22+0.78*diff;\r\n    }`;\r\n  const FS_SURF=`\r\n    precision mediump float;\r\n    uniform vec4 uColor;\r\n    varying float vLit;\r\n    void main(){ gl_FragColor=vec4(uColor.rgb*vLit,uColor.a); }`;\r\n\r\n  const VS_POINTS=`\r\n    attribute vec3 aPos;\r\n    attribute vec3 aCol;\r\n    attribute float aSize;\r\n    uniform mat4 uMVP;\r\n    varying vec3 vCol;\r\n    void main(){\r\n      vec4 clip=uMVP*vec4(aPos,1.0);\r\n      gl_Position=clip;\r\n      vCol=aCol;\r\n      float z=max(0.18,1.0-(clip.z\/clip.w)*0.40);\r\n      gl_PointSize=aSize*120.0*z;\r\n    }`;\r\n  const FS_POINTS=`\r\n    precision mediump float;\r\n    varying vec3 vCol;\r\n    void main(){\r\n      vec2 uv=gl_PointCoord*2.0-1.0;\r\n      float d=dot(uv,uv);\r\n      float a=smoothstep(1.0,0.0,d);\r\n      gl_FragColor=vec4(vCol,a);\r\n    }`;\r\n\r\n  const progLine=program(VS_LINE,FS_LINE);\r\n  const progSurf=program(VS_SURF,FS_SURF);\r\n  const progPts=program(VS_POINTS,FS_POINTS);\r\n\r\n  const locLine={aPos:gl.getAttribLocation(progLine,\"aPos\"),uMVP:gl.getUniformLocation(progLine,\"uMVP\"),uColor:gl.getUniformLocation(progLine,\"uColor\")};\r\n  const locSurf={aPos:gl.getAttribLocation(progSurf,\"aPos\"),aNor:gl.getAttribLocation(progSurf,\"aNor\"),uMVP:gl.getUniformLocation(progSurf,\"uMVP\"),uModel:gl.getUniformLocation(progSurf,\"uModel\"),uColor:gl.getUniformLocation(progSurf,\"uColor\")};\r\n  const locPts={aPos:gl.getAttribLocation(progPts,\"aPos\"),aCol:gl.getAttribLocation(progPts,\"aCol\"),aSize:gl.getAttribLocation(progPts,\"aSize\"),uMVP:gl.getUniformLocation(progPts,\"uMVP\")};\r\n\r\n  \/\/ Mat4\r\n  function mat4Mul(a,b){\r\n    const o=new Float32Array(16);\r\n    for(let c=0;c<4;c++) for(let r=0;r<4;r++){\r\n      o[c*4+r]=a[0*4+r]*b[c*4+0]+a[1*4+r]*b[c*4+1]+a[2*4+r]*b[c*4+2]+a[3*4+r]*b[c*4+3];\r\n    }\r\n    return o;\r\n  }\r\n  function mat4Perspective(fovy,aspect,near,far){\r\n    const f=1\/Math.tan(fovy\/2), nf=1\/(near-far);\r\n    const o=new Float32Array(16);\r\n    o[0]=f\/aspect; o[5]=f; o[10]=(far+near)*nf; o[11]=-1; o[14]=2*far*near*nf;\r\n    return o;\r\n  }\r\n  function mat4RotateX(a){const c=Math.cos(a),s=Math.sin(a);return new Float32Array([1,0,0,0, 0,c,s,0, 0,-s,c,0, 0,0,0,1]);}\r\n  function mat4RotateY(a){const c=Math.cos(a),s=Math.sin(a);return new Float32Array([c,0,-s,0, 0,1,0,0, s,0,c,0, 0,0,0,1]);}\r\n  function mat4LookAt(eye,center,up){\r\n    const ex=eye[0],ey=eye[1],ez=eye[2];\r\n    let zx=ex-center[0], zy=ey-center[1], zz=ez-center[2];\r\n    let zlen=Math.hypot(zx,zy,zz)||1; zx\/=zlen; zy\/=zlen; zz\/=zlen;\r\n    let xx=up[1]*zz-up[2]*zy, xy=up[2]*zx-up[0]*zz, xz=up[0]*zy-up[1]*zx;\r\n    let xlen=Math.hypot(xx,xy,xz)||1; xx\/=xlen; xy\/=xlen; xz\/=xlen;\r\n    let yx=zy*xz-zz*xy, yy=zz*xx-zx*xz, yz=zx*xy-zy*xx;\r\n    const o=new Float32Array(16);\r\n    o[0]=xx; o[1]=yx; o[2]=zx; o[4]=xy; o[5]=yy; o[6]=zy; o[8]=xz; o[9]=yz; o[10]=zz; o[15]=1;\r\n    o[12]=-(xx*ex+xy*ey+xz*ez); o[13]=-(yx*ex+yy*ey+yz*ez); o[14]=-(zx*ex+zy*ey+zz*ez);\r\n    return o;\r\n  }\r\n  function vec4MulMat4(m,v){\r\n    const x=v[0],y=v[1],z=v[2],w=v[3];\r\n    return [\r\n      m[0]*x+m[4]*y+m[8]*z+m[12]*w,\r\n      m[1]*x+m[5]*y+m[9]*z+m[13]*w,\r\n      m[2]*x+m[6]*y+m[10]*z+m[14]*w,\r\n      m[3]*x+m[7]*y+m[11]*z+m[15]*w,\r\n    ];\r\n  }\r\n\r\n  \/\/ Resize\r\n  function resize(){\r\n    const r=stage.getBoundingClientRect();\r\n    const dpr=Math.min(2.0, window.devicePixelRatio||1);\r\n    canvas.width=Math.max(2,Math.floor(r.width*dpr));\r\n    canvas.height=Math.max(2,Math.floor(r.height*dpr));\r\n    gl.viewport(0,0,canvas.width,canvas.height);\r\n  }\r\n  window.addEventListener(\"resize\", resize);\r\n  resize();\r\n  try{ new ResizeObserver(resize).observe(stage); }catch(e){}\r\n\r\n  \/\/ Interaction\r\n  let yaw=0.65, pitch=-0.28, distance=8.6;\r\n  let dragging=false, lastX=0, lastY=0;\r\n  const posX=(e)=>e.touches?e.touches[0].clientX:e.clientX;\r\n  const posY=(e)=>e.touches?e.touches[0].clientY:e.clientY;\r\n  function onDown(e){dragging=true; lastX=posX(e); lastY=posY(e);}\r\n  function onMove(e){\r\n    if(!dragging) return;\r\n    const x=posX(e), y=posY(e);\r\n    const dx=x-lastX, dy=y-lastY;\r\n    lastX=x; lastY=y;\r\n    yaw += dx*0.0065;\r\n    pitch += dy*0.0065;\r\n    const lim=Math.PI\/2-0.08;\r\n    pitch=Math.max(-lim,Math.min(lim,pitch));\r\n  }\r\n  function onUp(){dragging=false;}\r\n  function onWheel(e){\r\n    distance *= (e.deltaY>0?1.06:0.94);\r\n    distance=Math.max(5.2,Math.min(14.5,distance));\r\n  }\r\n  stage.addEventListener(\"mousedown\", onDown);\r\n  window.addEventListener(\"mousemove\", onMove);\r\n  window.addEventListener(\"mouseup\", onUp);\r\n  stage.addEventListener(\"touchstart\", onDown,{passive:true});\r\n  stage.addEventListener(\"touchmove\", onMove,{passive:true});\r\n  stage.addEventListener(\"touchend\", onUp,{passive:true});\r\n  stage.addEventListener(\"wheel\", onWheel,{passive:true});\r\n\r\n  \/\/ Buffers\r\n  function createBuffer(data, usage){\r\n    const b=gl.createBuffer();\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,b);\r\n    gl.bufferData(gl.ARRAY_BUFFER,data,usage||gl.DYNAMIC_DRAW);\r\n    return b;\r\n  }\r\n\r\n  function drawLine(mvp, buf, count, rgba, mode){\r\n    gl.useProgram(progLine);\r\n    gl.uniformMatrix4fv(locLine.uMVP,false,mvp);\r\n    gl.uniform4f(locLine.uColor, rgba[0],rgba[1],rgba[2],rgba[3]);\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,buf);\r\n    gl.enableVertexAttribArray(locLine.aPos);\r\n    gl.vertexAttribPointer(locLine.aPos,3,gl.FLOAT,false,0,0);\r\n    gl.drawArrays(mode||gl.LINES,0,count);\r\n  }\r\n  function drawPoints(mvp, posBuf, colBuf, sizeBuf, count){\r\n    gl.useProgram(progPts);\r\n    gl.uniformMatrix4fv(locPts.uMVP,false,mvp);\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,posBuf);\r\n    gl.enableVertexAttribArray(locPts.aPos);\r\n    gl.vertexAttribPointer(locPts.aPos,3,gl.FLOAT,false,0,0);\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,colBuf);\r\n    gl.enableVertexAttribArray(locPts.aCol);\r\n    gl.vertexAttribPointer(locPts.aCol,3,gl.FLOAT,false,0,0);\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,sizeBuf);\r\n    gl.enableVertexAttribArray(locPts.aSize);\r\n    gl.vertexAttribPointer(locPts.aSize,1,gl.FLOAT,false,0,0);\r\n\r\n    gl.drawArrays(gl.POINTS,0,count);\r\n  }\r\n  function drawSphere(mvp, model, posBuf, norBuf, stripCount, strips){\r\n    gl.useProgram(progSurf);\r\n    gl.uniformMatrix4fv(locSurf.uMVP,false,mvp);\r\n    gl.uniformMatrix4fv(locSurf.uModel,false,model);\r\n    gl.uniform4f(locSurf.uColor, 0.08,0.13,0.18, 0.24);\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,posBuf);\r\n    gl.enableVertexAttribArray(locSurf.aPos);\r\n    gl.vertexAttribPointer(locSurf.aPos,3,gl.FLOAT,false,0,0);\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER,norBuf);\r\n    gl.enableVertexAttribArray(locSurf.aNor);\r\n    gl.vertexAttribPointer(locSurf.aNor,3,gl.FLOAT,false,0,0);\r\n\r\n    let off=0;\r\n    for(let s=0;s<strips;s++){\r\n      gl.drawArrays(gl.TRIANGLE_STRIP, off, stripCount);\r\n      off+=stripCount;\r\n    }\r\n  }\r\n\r\n  \/\/ Axis dirs\r\n  const latByIdx=[0.36,0.34,0.30,0.26,0.18,0.12,0.06,0.02,-0.02,-0.08,-0.18,-0.26,-0.32,-0.36,-0.12,0.10];\r\n  const axisDirs=AXES.map((_,i)=>{\r\n    const ang=(i\/AXES.length)*Math.PI*2;\r\n    const lat=latByIdx[i]||0;\r\n    const y=Math.sin(lat), r=Math.cos(lat);\r\n    const x=Math.cos(ang)*r, z=Math.sin(ang)*r;\r\n    const l=Math.hypot(x,y,z)||1;\r\n    return [x\/l,y\/l,z\/l];\r\n  });\r\n\r\n  \/\/ Geometry sizes\r\n  const sphereR=2.25;\r\n\r\n  \/\/ Sphere wire\r\n  function buildSphereLines(latN, lonN, r){\r\n    const lines=[];\r\n    for(let i=1;i<latN;i++){\r\n      const v=i\/latN, th=v*Math.PI;\r\n      const y=Math.cos(th)*r, rr=Math.sin(th)*r;\r\n      for(let j=0;j<lonN;j++){\r\n        const u0=(j\/lonN)*Math.PI*2, u1=((j+1)\/lonN)*Math.PI*2;\r\n        lines.push(rr*Math.cos(u0),y,rr*Math.sin(u0), rr*Math.cos(u1),y,rr*Math.sin(u1));\r\n      }\r\n    }\r\n    for(let j=0;j<lonN;j++){\r\n      const u=(j\/lonN)*Math.PI*2;\r\n      for(let i=0;i<latN*2;i++){\r\n        const v0=i\/(latN*2), v1=(i+1)\/(latN*2);\r\n        const th0=v0*Math.PI, th1=v1*Math.PI;\r\n        const y0=Math.cos(th0)*r, rr0=Math.sin(th0)*r;\r\n        const y1=Math.cos(th1)*r, rr1=Math.sin(th1)*r;\r\n        lines.push(rr0*Math.cos(u),y0,rr0*Math.sin(u), rr1*Math.cos(u),y1,rr1*Math.sin(u));\r\n      }\r\n    }\r\n    return new Float32Array(lines);\r\n  }\r\n  const sphereWire=buildSphereLines(12,24,sphereR);\r\n  const sphereWireBuf=createBuffer(sphereWire, gl.STATIC_DRAW);\r\n  const sphereWireCount=sphereWire.length\/3;\r\n\r\n  \/\/ Sphere mesh\r\n  function buildSphereMesh(latN, lonN, r){\r\n    const pos=[], nor=[];\r\n    for(let i=0;i<latN;i++){\r\n      const v0=i\/latN, v1=(i+1)\/latN;\r\n      const th0=v0*Math.PI, th1=v1*Math.PI;\r\n      for(let j=0;j<=lonN;j++){\r\n        const u=(j\/lonN)*Math.PI*2;\r\n        const x0=Math.sin(th0)*Math.cos(u), y0=Math.cos(th0), z0=Math.sin(th0)*Math.sin(u);\r\n        const x1=Math.sin(th1)*Math.cos(u), y1=Math.cos(th1), z1=Math.sin(th1)*Math.sin(u);\r\n        pos.push(x0*r,y0*r,z0*r, x1*r,y1*r,z1*r);\r\n        nor.push(x0,y0,z0, x1,y1,z1);\r\n      }\r\n    }\r\n    return {pos:new Float32Array(pos), nor:new Float32Array(nor), stripCount:(lonN+1)*2, strips:latN};\r\n  }\r\n  const sphereMesh=buildSphereMesh(20,40,sphereR);\r\n  const spherePosBuf=createBuffer(sphereMesh.pos, gl.STATIC_DRAW);\r\n  const sphereNorBuf=createBuffer(sphereMesh.nor, gl.STATIC_DRAW);\r\n\r\n  \/* =========================\r\n     RADAR WEB \/ PAUTINA (disk grid)\r\n     ========================= *\/\r\n  function buildRadarDiskGrid(r, rings, spokes, seg){\r\n    const lines=[];\r\n    const TAU=Math.PI*2;\r\n\r\n    \/\/ rings\r\n    for(let k=1;k<=rings;k++){\r\n      const rr=r*(k\/rings);\r\n      for(let i=0;i<seg;i++){\r\n        const a0=(i\/seg)*TAU, a1=((i+1)\/seg)*TAU;\r\n        lines.push(Math.cos(a0)*rr, 0, Math.sin(a0)*rr,  Math.cos(a1)*rr, 0, Math.sin(a1)*rr);\r\n      }\r\n    }\r\n    \/\/ spokes\r\n    for(let s=0;s<spokes;s++){\r\n      const a=(s\/spokes)*TAU;\r\n      lines.push(0,0,0,  Math.cos(a)*r, 0, Math.sin(a)*r);\r\n    }\r\n\r\n    \/\/ extra \"cross hair\"\r\n    lines.push(-r,0,0, r,0,0);\r\n    lines.push(0,0,-r, 0,0,r);\r\n\r\n    return new Float32Array(lines);\r\n  }\r\n  const diskGrid=buildRadarDiskGrid(sphereR*1.02, 7, 18, 128);\r\n  const diskGridBuf=createBuffer(diskGrid, gl.STATIC_DRAW);\r\n  const diskGridCount=diskGrid.length\/3;\r\n\r\n  \/* =========================\r\n     SCANNING BEAM (wedge + scan line)\r\n     ========================= *\/\r\n  const SWEEP_SEG=72;\r\n  const sweepPos=new Float32Array((SWEEP_SEG+2)*3); \/\/ center + arc\r\n  const sweepBuf=createBuffer(sweepPos);\r\n  const sweepCount=(SWEEP_SEG+2);\r\n\r\n  const scanLinePos=new Float32Array(2*3);\r\n  const scanLineBuf=createBuffer(scanLinePos);\r\n  const scanLineCount=2;\r\n\r\n  function updateSweepGeometry(tSec, width, radius){\r\n    const ang=tSec*0.85;\r\n    const half=width*0.5;\r\n\r\n    \/\/ center\r\n    sweepPos[0]=0; sweepPos[1]=0; sweepPos[2]=0;\r\n\r\n    for(let i=0;i<=SWEEP_SEG;i++){\r\n      const u=i\/SWEEP_SEG;\r\n      const a=(ang-half)+u*(width);\r\n      const x=Math.cos(a)*radius;\r\n      const z=Math.sin(a)*radius;\r\n      const p=(i+1)*3;\r\n      sweepPos[p+0]=x;\r\n      sweepPos[p+1]=0;\r\n      sweepPos[p+2]=z;\r\n    }\r\n\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, sweepBuf);\r\n    gl.bufferSubData(gl.ARRAY_BUFFER,0,sweepPos);\r\n\r\n    \/\/ scan line (leading edge)\r\n    const ax=Math.cos(ang+half)*radius;\r\n    const az=Math.sin(ang+half)*radius;\r\n    scanLinePos[0]=0; scanLinePos[1]=0; scanLinePos[2]=0;\r\n    scanLinePos[3]=ax; scanLinePos[4]=0; scanLinePos[5]=az;\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, scanLineBuf);\r\n    gl.bufferSubData(gl.ARRAY_BUFFER,0,scanLinePos);\r\n  }\r\n\r\n  \/* =========================\r\n     Stars (background)\r\n     ========================= *\/\r\n  const STAR_N=850;\r\n  const starsPos=new Float32Array(STAR_N*3);\r\n  const starsCol=new Float32Array(STAR_N*3);\r\n  const starsSize=new Float32Array(STAR_N);\r\n  const starsBaseCol=new Float32Array(STAR_N*3);\r\n  const starsPhase=new Float32Array(STAR_N);\r\n  const starsFreq=new Float32Array(STAR_N);\r\n\r\n  for(let i=0;i<STAR_N;i++){\r\n    const u=Math.random()*2-1;\r\n    const a=Math.random()*Math.PI*2;\r\n    const R=7.5+Math.random()*9.0;\r\n    const t=Math.sqrt(1-u*u);\r\n    starsPos[i*3+0]=Math.cos(a)*t*R;\r\n    starsPos[i*3+1]=u*R;\r\n    starsPos[i*3+2]=Math.sin(a)*t*R;\r\n\r\n    const tint=0.65+0.35*Math.random();\r\n    const blu=0.82+0.18*Math.random();\r\n    const r=0.45*tint, g=0.55*tint, b=0.75*tint*blu;\r\n    starsCol[i*3+0]=r; starsCol[i*3+1]=g; starsCol[i*3+2]=b;\r\n    starsBaseCol[i*3+0]=r; starsBaseCol[i*3+1]=g; starsBaseCol[i*3+2]=b;\r\n\r\n    starsSize[i]=0.010+0.012*Math.random();\r\n    starsPhase[i]=Math.random()*Math.PI*2;\r\n    starsFreq[i]=0.18+Math.random()*1.05;\r\n  }\r\n  const starsPosBuf=createBuffer(starsPos, gl.STATIC_DRAW);\r\n  const starsColBuf=createBuffer(starsCol);\r\n  const starsSizeBuf=createBuffer(starsSize, gl.STATIC_DRAW);\r\n\r\n  function updateStarsTwinkle(tSec){\r\n    for(let i=0;i<STAR_N;i++){\r\n      const k=i*3;\r\n      const tw=0.62+0.38*Math.sin(tSec*starsFreq[i]+starsPhase[i]);\r\n      const m=0.78+0.52*tw;\r\n      starsCol[k+0]=starsBaseCol[k+0]*m;\r\n      starsCol[k+1]=starsBaseCol[k+1]*m;\r\n      starsCol[k+2]=starsBaseCol[k+2]*m;\r\n    }\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, starsColBuf);\r\n    gl.bufferSubData(gl.ARRAY_BUFFER,0,starsCol);\r\n  }\r\n\r\n  \/* =========================\r\n     Series (agents)\r\n     ========================= *\/\r\n  const SERIES=SERIES_META.map((s,si)=>{\r\n    const rnd=seedRand(1337+si*999);\r\n    const v=new Array(AXES.length), t=new Array(AXES.length), mf=new Array(AXES.length), mp=new Array(AXES.length);\r\n    for(let i=0;i<AXES.length;i++){\r\n      const b=0.30+0.45*rnd();\r\n      v[i]=b; t[i]=b; mf[i]=0.35+1.95*rnd(); mp[i]=Math.PI*2*rnd();\r\n    }\r\n    return {...s,v,t,mf,mp};\r\n  });\r\n\r\n  function makeSeriesBuffers(n){\r\n    const fanPos=new Float32Array((n+2)*3);\r\n    const loopPos=new Float32Array(n*3);\r\n    const ptsPos=new Float32Array(n*3);\r\n    const ptsCol=new Float32Array(n*3);\r\n    const ptsSize=new Float32Array(n);\r\n    return {\r\n      fanPos,loopPos,ptsPos,ptsCol,ptsSize,\r\n      fanBuf:createBuffer(fanPos),\r\n      loopBuf:createBuffer(loopPos),\r\n      ptsPosBuf:createBuffer(ptsPos),\r\n      ptsColBuf:createBuffer(ptsCol),\r\n      ptsSizeBuf:createBuffer(ptsSize),\r\n    };\r\n  }\r\n  const seriesBufs={};\r\n  for(const s of SERIES_META) seriesBufs[s.name]=makeSeriesBuffers(AXES.length);\r\n\r\n  const FAN_COUNT=AXES.length+2;\r\n\r\n  \/* =========================\r\n     Risk flash\/vignette\r\n     ========================= *\/\r\n  let riskActive=false, belowOffSince=null;\r\n  let flashAlpha=0, flashRGB=[239,68,68];\r\n  function triggerFlash(rgb){flashRGB=rgb;flashAlpha=1.0;}\r\n  function updateFlash(dt){\r\n    if(!flashEl) return;\r\n    if(flashAlpha<=0){flashEl.style.opacity=\"0\";return;}\r\n    flashAlpha=Math.max(0, flashAlpha-dt*1.25);\r\n    const a0=0.55*flashAlpha, a1=0.22*flashAlpha, a2=0.08*flashAlpha;\r\n    const c=flashRGB;\r\n    flashEl.style.background=`radial-gradient(circle at 50% 50%,\r\n      rgba(${c[0]},${c[1]},${c[2]},${a0.toFixed(3)}) 0%,\r\n      rgba(${c[0]},${c[1]},${c[2]},${a1.toFixed(3)}) 42%,\r\n      rgba(${c[0]},${c[1]},${c[2]},${a2.toFixed(3)}) 62%,\r\n      rgba(0,0,0,0) 76%)`;\r\n    flashEl.style.opacity=String(Math.min(1,0.95*flashAlpha));\r\n  }\r\n  function updateRiskState(riskScore){\r\n    const now=Date.now();\r\n    if(!riskActive){\r\n      if(riskScore>=CONFIG.riskOn){\r\n        riskActive=true; belowOffSince=null;\r\n        triggerFlash([239,68,68]);\r\n        if(vignetteEl){vignetteEl.classList.add(\"on\"); vignetteEl.style.background=\"radial-gradient(circle at 50% 50%, rgba(239,68,68,0.14) 0%, rgba(239,68,68,0.06) 40%, rgba(0,0,0,0) 74%)\";}\r\n        side.log([\"Risk Manager\",\"Aegis\"],\"Risk spike \u2014 protective mode enabled.\",\"warn\");\r\n      }\r\n      return;\r\n    }\r\n    if(riskScore<=CONFIG.riskOff){\r\n      if(belowOffSince==null) belowOffSince=now;\r\n      if(now-belowOffSince>=CONFIG.settleMs){\r\n        riskActive=false; belowOffSince=null;\r\n        triggerFlash([34,197,94]);\r\n        if(vignetteEl) vignetteEl.classList.remove(\"on\");\r\n        side.log([\"Risk Manager\",\"Mega Brain\"],\"Risk stabilized \u2014 returning to normal operation.\",\"ok\");\r\n      }\r\n    } else belowOffSince=null;\r\n  }\r\n\r\n  \/* =========================\r\n     Telemetry (offline)\r\n     ========================= *\/\r\n  let lastTelemetry=null;\r\n  function computeTelemetry(items){\r\n    const sig=mean(items.map(x=>Number((x&&x.signal)||0)));\r\n    const conf=clamp01(mean(items.map(x=>clamp01(Number((x&&x.confidence)||0)))));\r\n    const regime=((items[0]&&items[0].regime)||\"unknown\").toString().toLowerCase();\r\n    const vol=regime.includes(\"high\")?1.0:regime.includes(\"low\")?0.20:(regime.includes(\"normal\")||regime.includes(\"mid\"))?0.55:0.65;\r\n\r\n    const rb=clamp01(Math.abs(sig)*conf);\r\n    const rs=clamp01(0.55*vol+0.45*(1-conf));\r\n    const rm=clamp01(0.65*vol+0.35*(1-conf));\r\n    const riskScore=clamp01(0.18*rb+0.42*rs+0.40*rm);\r\n\r\n    const A=new Array(AXES.length).fill(0);\r\n    A[0]=clamp01(0.55+0.45*conf);\r\n    A[1]=clamp01(0.30+0.70*conf);\r\n    A[2]=clamp01(0.25+0.75*conf);\r\n    A[3]=clamp01(0.25+0.75*conf);\r\n    A[4]=clamp01(conf);\r\n    A[5]=clamp01(vol);\r\n    A[6]=clamp01(Math.abs(sig));\r\n    A[7]=clamp01(0.20+0.80*(Math.abs(sig)*conf));\r\n    A[8]=clamp01(0.25+0.75*conf);\r\n    A[9]=clamp01(0.15+0.85*(Math.abs(sig)*conf*(1-0.65*vol)));\r\n    A[10]=rb; A[11]=rs; A[12]=rm;\r\n    A[13]=clamp01(0.35+0.65*vol);\r\n    A[14]=clamp01(0.30+0.70*(1-conf)+0.35*vol);\r\n    A[15]=clamp01(0.25+0.75*(1-conf)+0.30*vol);\r\n\r\n    return {A,riskScore,conf,vol};\r\n  }\r\n\r\n  function applyTargets(tel){\r\n    const base=tel.A;\r\n    for(let si=0; si<SERIES.length; si++){\r\n      const s=SERIES[si];\r\n      const rnd=seedRand(7777+si*123);\r\n      for(let i=0;i<AXES.length;i++){\r\n        const focus =\r\n          s.name===\"Mega Brain\" ? (i===6||i===8||i===0||i===15?1.0:0.75) :\r\n          s.name===\"Nexus\" ? (i===2||i===3||i===4?1.0:0.70) :\r\n          s.name===\"Vortex Core\" ? (i===1||i===0||i===8||i===14?0.92:0.72) :\r\n          s.name===\"Quantum Veil\" ? (i===4||i===15||i===14?0.95:0.70) :\r\n          s.name===\"Aegis\" ? (i===7||i===9||i===14||i===13?0.95:0.70) :\r\n          (i>=10&&i<=13?1.0:0.70);\r\n\r\n        const jitter=(rnd()-0.5)*0.08*CONFIG.chaos;\r\n        const bias=(riskActive && (i>=10&&i<=14)) ? 0.10 : 0.0;\r\n        s.t[i]=clamp01(lerp(s.t[i], clamp01(base[i]*focus+bias+jitter), 0.85));\r\n      }\r\n    }\r\n  }\r\n\r\n  function renderMetrics(tel){\r\n    const quality=clamp01(tel.conf);\r\n    const disagree=clamp01(tel.vol*0.55+(1-tel.conf)*0.35);\r\n    const drift=clamp01((1-quality)*0.45+tel.vol*0.55);\r\n    const consensus=clamp01((1-disagree*0.85)*(0.55+0.45*quality));\r\n    const nxMega=clamp01(1-disagree*0.75);\r\n    const riskP=clamp01(tel.riskScore);\r\n\r\n    setMetric(mConsensusFill,mConsensusVal,consensus);\r\n    setMetric(mDriftFill,mDriftVal,drift);\r\n    setMetric(mNxMegaFill,mNxMegaVal,nxMega);\r\n    setMetric(mRiskFill,mRiskVal,riskP);\r\n  }\r\n\r\n  function offlineTick(){\r\n    const k=performance.now()*0.001;\r\n    const spike=(Math.sin(k*0.45)>0.82)||(Math.random()<0.035);\r\n    const sig=Math.sin(k*0.8)*(0.2+0.8*Math.random());\r\n    const conf=clamp01((spike?0.32:0.55)+0.45*Math.random());\r\n    const regime=spike?\"highvol\":(Math.random()<0.55?\"normal\":\"unknown\");\r\n\r\n    const items=[];\r\n    const n=Math.random()<0.2?10:2;\r\n    for(let i=0;i<n;i++){\r\n      items.push({signal:sig*(0.8+0.4*Math.random()), confidence:clamp01(conf*(0.9+0.2*Math.random())), regime});\r\n    }\r\n    const tel=computeTelemetry(items);\r\n    lastTelemetry=tel;\r\n\r\n    updateRiskState(tel.riskScore);\r\n    applyTargets(tel);\r\n\r\n    if(spike){\r\n      side.log([\"Risk Manager\"],\"Volatility spike \u2014 raising stops\/TP sensitivity.\",\"warn\");\r\n      side.log([\"Mega Brain\"],\"Strategy pivot \u2014 routing & allocation rebalanced.\",\"exec\");\r\n      side.log([\"Nexus\"],\"Feature drift detected \u2014 recalibrating inference.\",\"ml\");\r\n      hotAxis(5,\"#fbbf24\",300); hotAxis(13,\"#fbbf24\",300); hotAxis(3,\"#a78bfa\",300);\r\n    }else if(Math.random()<0.18){\r\n      side.log([\"Vortex Core\"],\"Swarm sync \u2014 aggregated signals normalized.\",\"info\");\r\n    }\r\n  }\r\n\r\n  \/\/ Labels placement (outside projected sphere)\r\n  function ndcToPx(nx,ny,w,h){\r\n    return [(nx*0.5+0.5)*w, (1-(ny*0.5+0.5))*h];\r\n  }\r\n  function placeLabels(view,proj,model,w,h){\r\n    const vp=mat4Mul(proj,view);\r\n    const c=vec4MulMat4(vp,[0,0,0,1]);\r\n    const cn=[c[0]\/c[3], c[1]\/c[3]];\r\n    const cpx=ndcToPx(cn[0],cn[1],w,h);\r\n\r\n    const e=vec4MulMat4(vp,[sphereR,0,0,1]);\r\n    const en=[e[0]\/e[3], e[1]\/e[3]];\r\n    const epx=ndcToPx(en[0],en[1],w,h);\r\n\r\n    const radPx=Math.hypot(epx[0]-cpx[0], epx[1]-cpx[1]);\r\n    const fontPx=Math.max(10.5,Math.min(14.0,10.2+radPx*0.010));\r\n    const marginPx=Math.max(10,Math.min(22,12+radPx*0.030));\r\n\r\n    const mvp=mat4Mul(vp,model);\r\n    const vm=mat4Mul(view,model);\r\n    const now=performance.now();\r\n\r\n    for(let i=0;i<AXES.length;i++){\r\n      const node=labelNodes[i];\r\n      const d=axisDirs[i];\r\n\r\n      const clip=vec4MulMat4(mvp,[d[0]*sphereR,d[1]*sphereR,d[2]*sphereR,1]);\r\n      const ndcx=clip[0]\/clip[3], ndcy=clip[1]\/clip[3];\r\n      let ppx=ndcToPx(ndcx,ndcy,w,h);\r\n\r\n      let vx=ppx[0]-cpx[0], vy=ppx[1]-cpx[1];\r\n      let vlen=Math.hypot(vx,vy);\r\n\r\n      if(vlen<2.0 || !Number.isFinite(vlen)){\r\n        const dv=vec4MulMat4(vm,[d[0],d[1],d[2],0]);\r\n        vx=dv[0]; vy=-dv[1];\r\n        vlen=Math.hypot(vx,vy)||1;\r\n      }\r\n      vx\/=vlen; vy\/=vlen;\r\n\r\n      const lx=cpx[0]+vx*(radPx+marginPx);\r\n      const ly=cpx[1]+vy*(radPx+marginPx);\r\n\r\n      node.style.left=lx.toFixed(2)+\"px\";\r\n      node.style.top=ly.toFixed(2)+\"px\";\r\n      node.style.fontSize=fontPx.toFixed(2)+\"px\";\r\n\r\n      if(now<axisHotUntil[i]){\r\n        node.classList.add(\"hot\");\r\n        const rgb=hexToRgb(axisHotColor[i]);\r\n        node.style.setProperty(\"--hx1\",`rgba(${rgb.r},${rgb.g},${rgb.b},0.90)`);\r\n        node.style.setProperty(\"--hx2\",`rgba(${rgb.r},${rgb.g},${rgb.b},0.34)`);\r\n      }else{\r\n        node.classList.remove(\"hot\");\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ Update series buffers\r\n  function updateSeries(dt,tSec){\r\n    const a=1.0-Math.exp(-dt*(2.2+1.3*CONFIG.chaos));\r\n    for(let si=0; si<SERIES.length; si++){\r\n      const s=SERIES[si];\r\n      const bu=seriesBufs[s.name];\r\n\r\n      for(let i=0;i<AXES.length;i++){\r\n        const micro=Math.sin(tSec*s.mf[i]+s.mp[i])*(0.022+0.030*CONFIG.chaos);\r\n        const target=clamp01(s.t[i]+micro);\r\n        const prev=s.v[i];\r\n        s.v[i]=prev+(target-prev)*a;\r\n\r\n        const dv=s.v[i]-prev;\r\n        if(Math.abs(dv)>0.020) hotAxis(i,s.css,220);\r\n      }\r\n\r\n      side.setDeltas(s.name,s.v,s.t);\r\n\r\n      bu.fanPos[0]=0; bu.fanPos[1]=0; bu.fanPos[2]=0;\r\n\r\n      for(let i=0;i<AXES.length;i++){\r\n        const d=axisDirs[i];\r\n        const r=sphereR*(0.26+0.74*s.v[i]);\r\n        const x=d[0]*r, y=d[1]*r, z=d[2]*r;\r\n\r\n        const f=(i+1)*3;\r\n        bu.fanPos[f+0]=x; bu.fanPos[f+1]=y; bu.fanPos[f+2]=z;\r\n\r\n        const l=i*3;\r\n        bu.loopPos[l+0]=x; bu.loopPos[l+1]=y; bu.loopPos[l+2]=z;\r\n\r\n        bu.ptsPos[l+0]=x; bu.ptsPos[l+1]=y; bu.ptsPos[l+2]=z;\r\n\r\n        bu.ptsCol[l+0]=s.color[0]; bu.ptsCol[l+1]=s.color[1]; bu.ptsCol[l+2]=s.color[2];\r\n        bu.ptsSize[i]=0.028+0.020*s.v[i];\r\n      }\r\n\r\n      const end=(AXES.length+1)*3;\r\n      bu.fanPos[end+0]=bu.fanPos[3];\r\n      bu.fanPos[end+1]=bu.fanPos[4];\r\n      bu.fanPos[end+2]=bu.fanPos[5];\r\n\r\n      gl.bindBuffer(gl.ARRAY_BUFFER,bu.fanBuf); gl.bufferSubData(gl.ARRAY_BUFFER,0,bu.fanPos);\r\n      gl.bindBuffer(gl.ARRAY_BUFFER,bu.loopBuf); gl.bufferSubData(gl.ARRAY_BUFFER,0,bu.loopPos);\r\n      gl.bindBuffer(gl.ARRAY_BUFFER,bu.ptsPosBuf); gl.bufferSubData(gl.ARRAY_BUFFER,0,bu.ptsPos);\r\n      gl.bindBuffer(gl.ARRAY_BUFFER,bu.ptsColBuf); gl.bufferSubData(gl.ARRAY_BUFFER,0,bu.ptsCol);\r\n      gl.bindBuffer(gl.ARRAY_BUFFER,bu.ptsSizeBuf); gl.bufferSubData(gl.ARRAY_BUFFER,0,bu.ptsSize);\r\n    }\r\n  }\r\n\r\n  \/\/ Bootstrap\r\n  root.classList.add(\"ready\");\r\n\r\n  \/\/ Animation loop\r\n  let lastT=performance.now()*0.001;\r\n  let telemAcc=0;\r\n\r\n  function frame(tms){\r\n    const tSec=tms*0.001;\r\n    let dt=tSec-lastT; lastT=tSec;\r\n    dt=Math.max(0.0001, Math.min(0.050, dt));\r\n\r\n    \/\/ telemetry ~2Hz\r\n    telemAcc+=dt;\r\n    if(telemAcc>0.48){\r\n      telemAcc=0;\r\n      offlineTick();\r\n    }\r\n\r\n    \/\/ matrices\r\n    const rect=stage.getBoundingClientRect();\r\n    const w=rect.width||1, h=rect.height||1;\r\n    const aspect=(canvas.width\/canvas.height)|| (w\/h) || 1;\r\n\r\n    const autoY=tSec*0.10;\r\n    const autoX=Math.sin(tSec*0.22)*0.05;\r\n    const model=mat4Mul(mat4RotateY(yaw+autoY), mat4RotateX(pitch+autoX));\r\n\r\n    const view=mat4LookAt([0,0,distance],[0,0,0],[0,1,0]);\r\n    const proj=mat4Perspective((50*Math.PI)\/180, aspect, 0.10, 70.0);\r\n    const pv=mat4Mul(proj,view);\r\n    const mvp=mat4Mul(pv,model);\r\n\r\n    \/\/ background twinkle\r\n    updateStarsTwinkle(tSec);\r\n\r\n    \/\/ clear\r\n    gl.clearColor(0.02,0.03,0.05,1.0);\r\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\r\n\r\n    \/\/ stars in world space\r\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\r\n    drawPoints(pv, starsPosBuf, starsColBuf, starsSizeBuf, STAR_N);\r\n\r\n    \/\/ sphere surface (do NOT write depth, so grid\/beam always visible)\r\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\r\n    gl.depthMask(false);\r\n    drawSphere(mvp, model, spherePosBuf, sphereNorBuf, sphereMesh.stripCount, sphereMesh.strips);\r\n    gl.depthMask(true);\r\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\r\n\r\n    \/\/ sphere wire\r\n    drawLine(mvp, sphereWireBuf, sphereWireCount, [0.50,0.62,0.78, 0.14], gl.LINES);\r\n\r\n    \/\/ === RADAR GRID + BEAM (always visible) ===\r\n    \/\/ turn off depth test so it never disappears behind glass\r\n    gl.disable(gl.DEPTH_TEST);\r\n\r\n    \/\/ disk grid (PAUTINA)\r\n    drawLine(mvp, diskGridBuf, diskGridCount, [0.20,0.95,0.62, 0.22], gl.LINES);\r\n    drawLine(mvp, diskGridBuf, diskGridCount, [0.10,0.25,0.18, 0.10], gl.LINES);\r\n\r\n    \/\/ sweep wedge + scan line\r\n    const sweepWidth = riskActive ? 0.46 : 0.34;\r\n    updateSweepGeometry(tSec, sweepWidth, sphereR*1.02);\r\n\r\n    const wedgeColor = riskActive ? [0.98,0.28,0.20, 0.14] : [0.20,0.98,0.62, 0.12];\r\n    drawLine(mvp, sweepBuf, sweepCount, wedgeColor, gl.TRIANGLE_FAN);\r\n\r\n    const lineColor = riskActive ? [1.00,0.35,0.25, 0.26] : [0.22,1.00,0.70, 0.22];\r\n    drawLine(mvp, scanLineBuf, scanLineCount, lineColor, gl.LINES);\r\n\r\n    \/\/ restore depth\r\n    gl.enable(gl.DEPTH_TEST);\r\n\r\n    \/\/ series\r\n    if(!lastTelemetry) lastTelemetry={riskScore:0.35, conf:0.62, vol:0.45};\r\n    renderMetrics(lastTelemetry);\r\n    updateSeries(dt,tSec);\r\n\r\n    for(let si=0; si<SERIES.length; si++){\r\n      const s=SERIES[si];\r\n      const bu=seriesBufs[s.name];\r\n      drawLine(mvp, bu.fanBuf, FAN_COUNT, [s.color[0],s.color[1],s.color[2], 0.050], gl.TRIANGLE_FAN);\r\n      drawLine(mvp, bu.loopBuf, AXES.length, [s.color[0],s.color[1],s.color[2], 0.15], gl.LINE_LOOP);\r\n      drawPoints(mvp, bu.ptsPosBuf, bu.ptsColBuf, bu.ptsSizeBuf, AXES.length);\r\n    }\r\n\r\n    \/\/ flash overlay\r\n    updateFlash(dt);\r\n\r\n    \/\/ labels\r\n    placeLabels(view,proj,model,w,h);\r\n\r\n    requestAnimationFrame(frame);\r\n  }\r\n\r\n  requestAnimationFrame(frame);\r\n\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>MBT \u2014 3D Spherical Radar (16D) Consensus \u2014 Drift \u2014 Nexus \u2194 Mega \u2014 Risk&#8230;<\/p>\n","protected":false},"author":1243,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-2924","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/pages\/2924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/users\/1243"}],"replies":[{"embeddable":true,"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/comments?post=2924"}],"version-history":[{"count":21,"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/pages\/2924\/revisions"}],"predecessor-version":[{"id":2947,"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/pages\/2924\/revisions\/2947"}],"wp:attachment":[{"href":"https:\/\/directtopic.com\/kairorobot.com\/wp-json\/wp\/v2\/media?parent=2924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}