Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
MILESTONE: plus de la moitie du parc HTML couvert Progression session: 4->10->22->46->77->117->157 pages (x39 · +3825 pct) 40 pages injectees batch 6: * Command centers: mega-command-center, infra-command * Hubs: ai-hub, dashboards-hub, monitoring-hub, ethica-hub, keys-hub, office-hub, email-hub, cloudflare-hub, gpu-hub * Home: index.html (CRITICAL) * L99: l99.html, l99-v2.html * Monitors: ethica-monitor, claude-monitor, security-dashboard, ai-benchmark * WEVIA: wevia-autonomy-dashboard, wevia-go-live, wevia-widget, wevia-console, wevia-business-visual-studio, wevia-em-big4, wevia-em-linkedin-carousel * Agents: agents-hd, agents-alive * Claude: sovereign-claude, claude-monitor * Visual: visual-management, wtp-drilldown-charts, value-streaming, kpi-15depts-live * Business: medreach-campaign, candidate-detail, pitch, register, living-proof * Legacy: tasks-live-opus5, openclaw, oss-discovery-v77 Zero skip · Zero error · Zero regression · Idempotent · GOLD backups
221 lines
20 KiB
HTML
221 lines
20 KiB
HTML
<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Monitoring Hub — WEVAL</title>
|
|
<style>
|
|
*{margin:0;padding:0;box-sizing:border-box}body{background:#0a0e1a;color:#e2e8f0;font-family:'Segoe UI',system-ui,sans-serif;min-height:100vh}
|
|
.top{background:linear-gradient(135deg,#0f172a 0%,#0a2e1a 50%,#1e293b 100%);padding:32px 40px;border-bottom:1px solid rgba(34,197,94,.2)}
|
|
.top h1{font-size:32px;font-weight:800;color:#fff}.top h1 span{background:linear-gradient(135deg,#22c55e,#4ade80);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
|
.top p{color:#94a3b8;margin-top:6px;font-size:15px}
|
|
.nav{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}.nav a{color:#86efac;text-decoration:none;padding:6px 16px;border:1px solid rgba(34,197,94,.3);border-radius:20px;font-size:13px;transition:.2s}.nav a:hover{background:rgba(34,197,94,.15);color:#fff}
|
|
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:14px;padding:24px 40px}
|
|
.stat{background:rgba(34,197,94,.06);border:1px solid rgba(34,197,94,.15);border-radius:14px;padding:16px;text-align:center}
|
|
.stat .v{font-size:22px;font-weight:800;color:#22c55e}.stat .l{font-size:11px;color:#94a3b8;margin-top:4px;text-transform:uppercase;letter-spacing:.5px}
|
|
h2{padding:12px 40px 0;font-size:15px;color:#22c55e;text-transform:uppercase;letter-spacing:1px;font-weight:700}
|
|
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;padding:16px 40px}
|
|
.card{background:linear-gradient(145deg,#1e293b,#0f172a);border:1px solid rgba(34,197,94,.1);border-radius:14px;padding:24px;transition:.3s;text-decoration:none;color:inherit;display:block;position:relative;overflow:hidden}
|
|
.card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#22c55e,#4ade80);opacity:0;transition:.3s}.card:hover::before{opacity:1}
|
|
.card:hover{border-color:rgba(34,197,94,.4);transform:translateY(-3px);box-shadow:0 12px 40px rgba(34,197,94,.12)}
|
|
.card h3{font-size:17px;color:#fff;margin-bottom:6px}.card p{color:#94a3b8;font-size:13px;line-height:1.5}
|
|
.tags{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap}.tag{padding:3px 10px;border-radius:10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.3px}
|
|
.tag.live{background:rgba(52,211,153,.12);color:#34d399}.tag.ext{background:rgba(251,191,36,.12);color:#fbbf24}.tag.int{background:rgba(14,165,233,.12);color:#38bdf8}
|
|
.footer{text-align:center;padding:24px 40px;color:#475569;font-size:12px;border-top:1px solid rgba(34,197,94,.08);margin-top:24px}
|
|
</style></head><body>
|
|
<!-- MEGA-NAV -->
|
|
<div style="background:rgba(99,102,241,.04);border-bottom:1px solid rgba(99,102,241,.1);padding:8px 40px;display:flex;gap:8px;flex-wrap:wrap;align-items:center">
|
|
<span style="color:#64748b;font-size:11px;font-weight:600;letter-spacing:1px">HUBS</span>
|
|
<a href="/wevia-hub.html" style="color:#10b981;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(16,185,129,.2);border-radius:12px">🧠 WEVIA</a>
|
|
<a href="/ai-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">🤖 AI</a>
|
|
<a href="/agents-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">👥 Agents</a>
|
|
<a href="/monitoring-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">📊 Monitor</a>
|
|
<a href="/email-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">📧 Email</a>
|
|
<a href="/office-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">📊 Office</a>
|
|
<a href="/ethica-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">👨⚕️ Ethica</a>
|
|
<a href="/wevads-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">📧 WEVADS</a>
|
|
<a href="/blade-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">⚡ Blade</a>
|
|
<a href="/security-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">🛡️ Sécu</a>
|
|
<a href="/gpu-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">⚡ GPU</a>
|
|
<a href="/keys-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">🔐 Keys</a>
|
|
<a href="/cloudflare-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">☁️ CF</a>
|
|
<a href="/google-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">🔍 Google</a>
|
|
<a href="/namecheap-hub.html" style="color:#818cf8;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(99,102,241,.2);border-radius:12px">🌐 NC</a>
|
|
<a href="/tools-hub.html" style="color:#f59e0b;text-decoration:none;font-size:12px;padding:3px 10px;border:1px solid rgba(245,158,11,.2);border-radius:12px;font-weight:700">⭐ ALL</a>
|
|
</div>
|
|
|
|
<div class="top"><h1>📟 <span>Monitoring</span> Hub</h1><p>Observabilite complete — Uptime Kuma, Prometheus, Grafana, Loki, Plausible, Langfuse</p>
|
|
<div class="nav"><a href="/admin.html">Admin</a><a href="/crons-monitor.html">Infra Monitor</a><a href="/l99-saas.html">L99 SaaS</a><a href="/wevia-master.html">Master</a></div></div>
|
|
<div class="stats">
|
|
<div class="stat"><div class="v">7</div><div class="l">Outils</div></div>
|
|
<div class="stat"><div class="v">16/16</div><div class="l">Services</div></div>
|
|
<div class="stat"><div class="v">50</div><div class="l">Crons</div></div>
|
|
<div class="stat"><div class="v">17</div><div class="l">Docker</div></div>
|
|
<div class="stat"><div class="v">83%</div><div class="l">Disk</div></div>
|
|
</div>
|
|
<h2>📊 Observabilite</h2>
|
|
<div class="grid">
|
|
<a class="card" href="https://monitor.weval-consulting.com" target="_blank"><h3>💚 Uptime Kuma</h3><p>Surveillance uptime 9 subdomains + 16 services. Alertes Telegram instant</p><div class="tags"><span class="tag live">DOCKER</span></div></a>
|
|
<a class="card" href="https://analytics.weval-consulting.com" target="_blank"><h3>📈 Plausible Analytics</h3><p>Web analytics privacy-first. Trafic weval-consulting.com sans cookies</p><div class="tags"><span class="tag live">DOCKER</span></div></a>
|
|
<a class="card" href="https://langfuse.weval-consulting.com" target="_blank"><h3>🔍 Langfuse</h3><p>LLM observability — traces, latence, tokens, cout par provider</p><div class="tags"><span class="tag live">DOCKER</span></div></a>
|
|
<a class="card" href="/crons-monitor.html"><h3>🖥 Infra Monitor</h3><p>enterprise-sync.php — 16 services, 50 crons, 17 Docker, ports scan</p><div class="tags"><span class="tag int">INTERNE</span></div></a>
|
|
</div>
|
|
<h2>⚙ Stack Prometheus</h2>
|
|
<div class="grid">
|
|
<div class="card"><h3>📊 Prometheus</h3><p>Time-series DB. Scrape metriques node_exporter toutes les 15s. Port 9090</p><div class="tags"><span class="tag live">DOCKER</span></div></div>
|
|
<div class="card"><h3>💻 Node Exporter</h3><p>CPU, RAM, disk, network, IO metriques système. Port 9100</p><div class="tags"><span class="tag live">DOCKER</span></div></div>
|
|
<div class="card"><h3>📝 Loki</h3><p>Log aggregation — centralise nginx, PHP-FPM, cron logs. Port 3100</p><div class="tags"><span class="tag live">DOCKER</span></div></div>
|
|
</div>
|
|
<h2>🧪 Testing et QA</h2>
|
|
<div class="grid">
|
|
<a class="card" href="/l99-saas.html"><h3>🎯 L99 SaaS</h3><p>957/957 PASS, 74 layers, Lean 6 Sigma + Theory of Constraints + Visual Regression</p><div class="tags"><span class="tag live">100%</span></div></a>
|
|
<a class="card" href="/api/l99-report.html"><h3>📋 L99 Report</h3><p>233/233 PASS, 0 FAIL, 0 WARN, 6.0 sigma. NonReg cron automatique</p><div class="tags"><span class="tag live">CRON</span></div></a>
|
|
<a class="card" href="/wevia-master.html"><h3>🤖 Director</h3><p>Superviseur autonome — 0 issues, cron 15min, alerte Telegram si degradation</p><div class="tags"><span class="tag live">AUTONOME</span></div></a>
|
|
</div>
|
|
<div class="footer">WEVAL CONSULTING · Monitoring Hub · 7 outils · Full observability stack · 0 EUR</div>
|
|
|
|
<div style="padding:24px 40px">
|
|
<h2 style="font-size:20px;font-weight:700;color:#10b981;margin-bottom:16px">🔧 OUTILS INTERNES WEVAL</h2>
|
|
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px">
|
|
<a href="/command-center.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">📊 Command Center</div><div style="font-size:12px;color:#94a3b8">312 services monitorés en temps réel</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/l99-brain.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">🧪 L99 Brain</div><div style="font-size:12px;color:#94a3b8">Tests L99/NonReg/Playwright/Fullscan</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/ops-center.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">⚡ Ops Center</div><div style="font-size:12px;color:#94a3b8">Opérations infra, Docker, crons</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/kuma" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">🔍 Uptime Kuma</div><div style="font-size:12px;color:#94a3b8">Monitoring uptime 24/7</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/realtime-monitor-v3.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">📈 Realtime Monitor</div><div style="font-size:12px;color:#94a3b8">Métriques temps réel</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/cyber-monitor.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">🛡️ Cyber Monitor</div><div style="font-size:12px;color:#94a3b8">Alertes sécurité, intrusions</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
<a href="/nonreg.html" style="display:block;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2);border-radius:12px;padding:14px;text-decoration:none;transition:.2s"><div style="font-size:15px;font-weight:700;color:#10b981;margin-bottom:4px">📋 NonReg</div><div style="font-size:12px;color:#94a3b8">153/153 tests de non-régression</div><span style="display:inline-block;margin-top:6px;font-size:10px;padding:2px 8px;background:rgba(16,185,129,.15);color:#10b981;border-radius:6px">INTERNE</span></a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CARTO_REMOVED -->
|
|
<!-- CARTO_BANNER_V1 -->
|
|
<div style="position:fixed;bottom:20px;right:20px;z-index:9999;background:linear-gradient(135deg,#141931,#2d1b5e);border:1px solid #64ffda;border-radius:12px;padding:12px 18px;box-shadow:0 4px 20px rgba(100,255,218,.3);font-family:-apple-system,Segoe UI,sans-serif;font-size:13px">
|
|
<a href="/cartographie-screens.html" style="color:#64ffda;text-decoration:none;font-weight:600;display:flex;align-items:center;gap:8px" title="Cartographie exhaustive de tous les ecrans live">
|
|
<span style="font-size:18px">🗺</span> Cartographie live
|
|
<span id="carto-banner-count" style="color:#8892b0;font-size:11px">3914 ecrans</span>
|
|
</a>
|
|
</div>
|
|
<script>
|
|
(function(){
|
|
fetch('/api/screens-health.php?_='+Date.now(),{cache:'no-store'}).then(r=>r.json()).then(d=>{
|
|
const c=d.counts||{}; const up=c.UP||0; const slow=c.SLOW||0; const br=c.BROKEN||0;
|
|
const el=document.getElementById('carto-banner-count');
|
|
if(el) el.innerHTML=`<span style="color:#22c55e">${up} UP</span> / <span style="color:#f59e0b">${slow} Lent</span> / <span style="color:#ef4444">${br} 5xx</span>`;
|
|
}).catch(()=>{});
|
|
})();
|
|
</script>
|
|
<!-- /CARTO_BANNER_V1 -->
|
|
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
|
|
<script>
|
|
(function(){
|
|
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
|
|
var d = document;
|
|
var m = d.createElement('div');
|
|
m.id = 'opus-udrill';
|
|
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
|
|
var inner = d.createElement('div');
|
|
inner.id = 'opus-udrill-in';
|
|
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
|
|
inner.addEventListener('click', function(e){ e.stopPropagation(); });
|
|
m.appendChild(inner);
|
|
m.addEventListener('click', function(){ m.style.display='none'; });
|
|
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
|
|
(d.body || d.documentElement).appendChild(m);
|
|
|
|
function openCard(card) {
|
|
// Clone card content + show close btn + increase font-size
|
|
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
|
|
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
|
|
inner.innerHTML = html;
|
|
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
|
|
m.style.display = 'flex';
|
|
}
|
|
|
|
function wire(root) {
|
|
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
|
|
var cards = root.querySelectorAll(sels);
|
|
for (var i = 0; i < cards.length; i++) {
|
|
var c = cards[i];
|
|
if (c.__opusWired) continue;
|
|
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
|
|
var r = c.getBoundingClientRect();
|
|
if (r.width < 60 || r.height < 40) continue;
|
|
c.__opusWired = true;
|
|
c.style.cursor = 'pointer';
|
|
c.setAttribute('role','button');
|
|
c.setAttribute('tabindex','0');
|
|
c.addEventListener('click', function(ev){
|
|
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
|
|
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
|
|
if (ev.target.closest('a,button,input,select')) return;
|
|
ev.preventDefault(); ev.stopPropagation();
|
|
openCard(this);
|
|
});
|
|
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
|
|
}
|
|
}
|
|
|
|
// Initial + mutation observer
|
|
var initRun = function(){ wire(d.body || d.documentElement); };
|
|
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
|
|
else initRun();
|
|
var mo = new MutationObserver(function(muts){
|
|
var newCard = false;
|
|
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
|
|
if (newCard) initRun();
|
|
});
|
|
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
|
|
})();
|
|
</script>
|
|
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
|
|
|
|
|
|
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
|
|
<script>
|
|
(function(){
|
|
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
|
|
async function updateHonestValues(){
|
|
try {
|
|
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
|
|
const d = await r.json();
|
|
if (!d.ok) return;
|
|
const realNR = `${d.combined.pass}/${d.combined.total}`;
|
|
const realSigma = d.sigma;
|
|
// Find elements showing the myth values
|
|
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
|
|
// Walk text nodes
|
|
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
|
|
const toReplace = [];
|
|
let node;
|
|
while (node = walker.nextNode()) {
|
|
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
|
|
}
|
|
toReplace.forEach(textNode => {
|
|
const parent = textNode.parentNode;
|
|
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
|
|
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
|
|
textNode.nodeValue = newText;
|
|
parent.setAttribute('data-opus-honest-applied', '1');
|
|
});
|
|
// Add a small badge bottom-right showing honest live status
|
|
if (!document.getElementById('opus-honest-badge')) {
|
|
const b = document.createElement('div');
|
|
b.id = 'opus-honest-badge';
|
|
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
|
|
b.title = 'Cliquer pour détails';
|
|
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
|
|
b.onclick = () => {
|
|
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
|
|
};
|
|
document.body.appendChild(b);
|
|
}
|
|
} catch(e){console.error('L99-honest fetch error:', e);}
|
|
}
|
|
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
|
|
else updateHonestValues();
|
|
setInterval(updateHonestValues, 90000);
|
|
})();
|
|
</script>
|
|
<!-- === OPUS HONEST END === -->
|
|
|
|
<script src="/api/archi-meta-badge.js" defer></script>
|
|
|
|
<script src="/api/a11y-auto-enhancer.js" defer></script>
|
|
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
|
|
</body></html> |