Files
html/wevia-erp-v2.html
opus a14b00e2f9
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-sync via WEVIA git_sync_all intent 2026-04-21T13:13:02+02:00
2026-04-21 13:13:02 +02:00

593 lines
32 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>WEVIA ERP V2 · Source unique vérité · Premium charts</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.0/chart.umd.min.js"></script>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{
--bg:#09090b; --surface:#13131a; --surface2:#1a1a24; --border:#2a2a35;
--text:#fafafa; --muted:#94a3b8; --accent:#6366f1; --accent2:#a855f7;
--green:#22c55e; --amber:#f59e0b; --red:#ef4444; --cyan:#22d3ee;
--grad:linear-gradient(135deg,#6366f1 0%,#a855f7 50%,#ec4899 100%);
--grad2:linear-gradient(135deg,#22d3ee 0%,#22c55e 100%);
}
body{font-family:-apple-system,Inter,Segoe UI,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;line-height:1.5}
.topbar{background:var(--surface);border-bottom:1px solid var(--border);padding:14px 28px;display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;z-index:100;backdrop-filter:blur(20px)}
.topbar h1{font-size:1.15rem;font-weight:700;background:var(--grad);-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-0.02em}
.topbar .meta{display:flex;gap:14px;align-items:center;font-size:.78rem;color:var(--muted)}
.topbar .live{display:inline-flex;align-items:center;gap:6px;color:var(--green);font-weight:600}
.topbar .live::before{content:'';width:8px;height:8px;background:var(--green);border-radius:99px;box-shadow:0 0 12px var(--green);animation:pulse 1.5s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
.bread{padding:14px 28px;background:var(--surface);font-size:.78rem;color:var(--muted);border-bottom:1px solid var(--border)}
.bread a{color:var(--accent);text-decoration:none;margin-right:6px}
main{padding:28px;max-width:1700px;margin:0 auto}
.hero{background:linear-gradient(135deg,rgba(99,102,241,.1),rgba(168,85,247,.05));border:1px solid rgba(99,102,241,.2);border-radius:16px;padding:24px 28px;margin-bottom:24px;position:relative;overflow:hidden}
.hero::before{content:'';position:absolute;top:-50%;right:-10%;width:300px;height:300px;background:radial-gradient(circle,rgba(99,102,241,.15),transparent 70%);pointer-events:none}
.hero h2{font-size:1.4rem;margin-bottom:6px;background:var(--grad);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.hero p{color:var(--muted);font-size:.85rem;line-height:1.6}
.hero .badges{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
.badge{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:99px;font-size:.7rem;font-weight:600;letter-spacing:.4px;text-transform:uppercase}
.badge-green{background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)}
.badge-purple{background:rgba(168,85,247,.15);color:var(--accent2);border:1px solid rgba(168,85,247,.3)}
.badge-cyan{background:rgba(34,211,238,.15);color:var(--cyan);border:1px solid rgba(34,211,238,.3)}
.badge-amber{background:rgba(245,158,11,.15);color:var(--amber);border:1px solid rgba(245,158,11,.3)}
.section-title{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:1.5px;color:var(--muted);margin:28px 0 14px;display:flex;align-items:center;gap:10px}
.section-title::after{content:'';flex:1;height:1px;background:var(--border)}
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px}
.kpi{background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:18px;position:relative;transition:.2s;overflow:hidden}
.kpi:hover{border-color:var(--accent);transform:translateY(-2px);box-shadow:0 12px 30px rgba(99,102,241,.15)}
.kpi::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--grad);opacity:.6}
.kpi .lbl{font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:1.2px;font-weight:600;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center}
.kpi .val{font-size:1.9rem;font-weight:700;background:linear-gradient(180deg,var(--text),var(--muted));-webkit-background-clip:text;-webkit-text-fill-color:transparent;line-height:1.1}
.kpi .sub{font-size:.7rem;color:var(--muted);margin-top:6px;line-height:1.4}
.kpi .trend{font-size:.68rem;font-weight:600;padding:2px 7px;border-radius:99px}
.kpi .trend-up{background:rgba(34,197,94,.15);color:var(--green)}
.kpi .trend-stable{background:rgba(148,163,184,.15);color:var(--muted)}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:14px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:14px}
@media(max-width:900px){.grid-2,.grid-3{grid-template-columns:1fr}}
.card{background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:20px}
.card h3{font-size:.95rem;font-weight:600;margin-bottom:14px;color:var(--text);display:flex;align-items:center;gap:8px}
.card h3 .count{margin-left:auto;font-size:.72rem;color:var(--muted);font-weight:500;background:var(--surface2);padding:3px 9px;border-radius:99px}
.row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px dashed var(--border);font-size:.82rem}
.row:last-child{border-bottom:none}
.row .lbl{color:var(--muted)}
.row .v{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
.row .v-good{color:var(--green)}
.row .v-warn{color:var(--amber)}
.row .v-bad{color:var(--red)}
.bar{height:8px;background:var(--surface2);border-radius:99px;overflow:hidden;margin-top:6px}
.bar .fill{height:100%;background:var(--grad);border-radius:99px;transition:width .8s ease}
.tag{display:inline-block;padding:3px 9px;background:var(--surface2);color:var(--muted);border-radius:6px;font-size:.7rem;margin-right:4px;margin-bottom:4px;cursor:pointer;transition:.2s}
.tag:hover{background:var(--accent);color:#fff}
.chart-wrap{position:relative;height:280px;margin-top:8px}
.chart-wrap-sm{position:relative;height:200px;margin-top:8px}
.chart-wrap-lg{position:relative;height:340px;margin-top:8px}
footer{padding:32px 28px;text-align:center;color:var(--muted);font-size:.75rem;border-top:1px solid var(--border);margin-top:32px}
footer a{color:var(--accent);text-decoration:none;margin:0 8px}
.refresh{padding:5px 12px;background:var(--surface2);border:1px solid var(--border);border-radius:99px;color:var(--muted);font-size:.7rem;cursor:pointer;transition:.2s}
.refresh:hover{border-color:var(--accent);color:var(--text)}
/* === OPUS RESPONSIVE FIX v2 19avr — append-only, doctrine #14 === */
@media(max-width: 480px) {
html, body { overflow-x: hidden !important; max-width: 100vw; }
body, main, section, article { word-break: break-word; overflow-wrap: anywhere; }
img, video, iframe, canvas, svg, table, pre, code { max-width: 100% !important; }
pre, code { white-space: pre-wrap; word-break: break-all; }
table { display: block; overflow-x: auto; }
.container, [class*="container"], [class*="wrapper"] { max-width: 100vw !important; padding-left: 12px !important; padding-right: 12px !important; }
[class*="grid"], [class*="-grid"] { grid-template-columns: 1fr !important; gap: 10px !important; }
[class*="kpi"], [class*="stats"], [class*="-cards"] { grid-template-columns: 1fr !important; }
header, nav, footer { flex-wrap: wrap !important; }
header > *, nav > *, footer > * { max-width: 100%; }
h1 { font-size: 22px !important; word-break: break-word; }
h2 { font-size: 18px !important; }
.pitch, [class*="pitch"], [class*="hero"] { word-break: break-word; overflow-wrap: anywhere; }
}
/* === OPUS RESPONSIVE FIX v2 END === */
</style>
</head>
<body>
<div class="topbar">
<h1>🏢 WEVIA ERP V2 · Premium Charts · Source unique vérité</h1>
<div class="meta">
<span>Source: <a href="/api/wevia-truth-registry.json" style="color:var(--cyan)">truth-registry.json</a></span>
<span>NL Query: <a href="/api/wevia.php?q=combien+d+agents" style="color:var(--cyan)">/api/wevia.php?q=...</a></span>
<span>Refresh: <span id="ts"></span></span>
<button class="refresh" onclick="loadAll()"></button>
<span class="live">LIVE</span>
</div>
</div>
<div class="bread">
<a href="/">Home</a> /
<a href="/weval-technology-platform.html">WTP</a> /
<a href="/architecture.html">Architecture</a> /
<span style="color:var(--text)">ERP Unified V2</span>
</div>
<main>
<div class="hero">
<h2 id="hero-title">Tableau bord ERP V2 · WEVAL Consulting · Premium charts</h2>
<p>Référentiel unique consolidé · Truth registry agrège <b>7 sources</b> dédupliquées · Charts Chart.js professionnels · Multi-agent SSE 32 agents · Auto-rebuild every 30 min · Updated permanent reconcile multi-Claude</p>
<div class="badges">
<span class="badge badge-green">✓ Truth Registry</span>
<span class="badge badge-purple">⚡ 32 Agents SSE</span>
<span class="badge badge-cyan">🎬 36+ Videos</span>
<span class="badge badge-green">🏆 6σ+ DPMO=0</span>
<span class="badge" id="b-autonomy" style="background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)">Autonomy: <b style="margin-left:4px" id="autonomy-val">100</b>/100</span>
<span class="badge badge-amber">📚 32+ Tips · 9 cat</span>
</div>
</div>
<!-- KPIs principaux -->
<div class="section-title">📊 KPIs principaux · live truth registry · auto-refresh 60s</div>
<div class="kpi-grid">
<div class="kpi"><div class="lbl"><span>Agents uniques</span><span class="trend trend-up">7 sources</span></div><div class="val" id="k-agents"></div><div class="sub" id="k-agents-sub"></div></div>
<div class="kpi"><div class="lbl"><span>Intents wirés</span><span class="trend trend-up">186 EXEC</span></div><div class="val" id="k-intents"></div><div class="sub" id="k-intents-sub"></div></div>
<div class="kpi"><div class="lbl"><span>Skills</span><span class="trend trend-stable">5 sources</span></div><div class="val" id="k-skills">15.5K+</div><div class="sub">paperclip+deerflow+claude+qdrant+intents</div></div>
<div class="kpi"><div class="lbl"><span>Brains</span><span class="trend trend-up">vectorized</span></div><div class="val" id="k-brains"></div><div class="sub">cerveaux IA actifs</div></div>
<div class="kpi"><div class="lbl"><span>Dashboards</span><span class="trend trend-stable">cet ERP unifie</span></div><div class="val" id="k-dashboards"></div><div class="sub">93+ vues consolidées ici</div></div>
<div class="kpi"><div class="lbl"><span>Doctrines</span><span class="trend trend-up">19→growing</span></div><div class="val" id="k-doctrines"></div><div class="sub">règles d'or WEVAL</div></div>
<div class="kpi"><div class="lbl"><span>API endpoints</span><span class="trend trend-up">PHP</span></div><div class="val" id="k-apis"></div><div class="sub">backend WEVAL</div></div>
<div class="kpi"><div class="lbl"><span>Quality tests</span><span class="trend trend-up">100%</span></div><div class="val" id="k-quality"></div><div class="sub">L99 + NR + 7σ combined</div></div>
</div>
<!-- Charts: Agents distribution + Intents status -->
<div class="section-title">📈 Distribution agents · Status intents · Live</div>
<div class="grid-2">
<div class="card">
<h3>🤖 Agents par source <span class="count" id="ag-tot"></span></h3>
<div class="chart-wrap"><canvas id="chart-agents"></canvas></div>
</div>
<div class="card">
<h3>🎯 Intents par status <span class="count" id="int-tot"></span></h3>
<div class="chart-wrap"><canvas id="chart-intents"></canvas></div>
</div>
</div>
<!-- Quality + Living Proof + Sigma -->
<div class="section-title">🏆 Quality Six Sigma · Lean maturity · Living Proof</div>
<div class="grid-3">
<div class="card">
<h3>📐 Quality gates</h3>
<div class="row"><span class="lbl">L99 layers</span><span class="v v-good" id="q-l99"></span></div>
<div class="row"><span class="lbl">NonReg tests</span><span class="v v-good" id="q-nonreg"></span></div>
<div class="row"><span class="lbl">7-Sigma multi-dim</span><span class="v v-good" id="q-7sigma"></span></div>
<div class="row"><span class="lbl">Master E2E</span><span class="v v-good">15/15</span></div>
<div class="row"><span class="lbl">Public E2E</span><span class="v v-good">24/24</span></div>
<div class="row"><span class="lbl">DPMO</span><span class="v v-good">0</span></div>
<div class="row"><span class="lbl">Sigma level</span><span class="v v-good">6σ+ ON TARGET</span></div>
</div>
<div class="card">
<h3>📈 Lean 6σ Maturity Gauge</h3>
<div class="chart-wrap-sm"><canvas id="chart-maturity"></canvas></div>
<div style="text-align:center;margin-top:10px;color:var(--muted);font-size:.78rem">Source: Visual Mgmt (Claude 2)</div>
</div>
<div class="card">
<h3>🎬 Living Proof <span class="count" id="lp-cnt"></span></h3>
<div class="row"><span class="lbl">Total scenarios</span><span class="v" id="lp-scen"></span></div>
<div class="row"><span class="lbl">Total videos</span><span class="v" id="lp-vids"></span></div>
<div class="row"><span class="lbl">Total size</span><span class="v" id="lp-size"></span></div>
<div class="row"><span class="lbl">Coverage business</span><span class="v v-good" id="lp-cov"></span></div>
<div class="row"><span class="lbl">Pass rate</span><span class="v v-good" id="lp-rate"></span></div>
</div>
</div>
<!-- Business KPIs Charts -->
<div class="section-title">💼 Business · Ethica HCPs distribution · CRM funnel</div>
<div class="grid-2">
<div class="card">
<h3>🏥 Ethica HCPs par pays · Total <span class="count">156,714</span></h3>
<div class="chart-wrap"><canvas id="chart-ethica"></canvas></div>
</div>
<div class="card">
<h3>📞 CRM Volumes</h3>
<div class="chart-wrap"><canvas id="chart-crm"></canvas></div>
</div>
</div>
<!-- Infrastructure overview -->
<div class="section-title">🖥 Infrastructure · 4 machines · 17 GPUs · 26 apps · live</div>
<div class="grid-2">
<div class="card">
<h3>🌐 Machines status (4/4 online)</h3>
<div class="row"><span class="lbl">S204 nginx primary</span><span class="v v-good">ONLINE</span></div>
<div class="row"><span class="lbl">S95 PG+WEVADS</span><span class="v v-good">ONLINE</span></div>
<div class="row"><span class="lbl">Razer Blade workstation</span><span class="v v-good">ONLINE</span></div>
<div class="row"><span class="lbl">S151 OVH legacy</span><span class="v v-warn">LEGACY</span></div>
<div class="row"><span class="lbl">FPM workers</span><span class="v" id="inf-fpm">111</span></div>
<div class="row"><span class="lbl">Disk used</span><span class="v v-warn">121G/150G (84%)</span></div>
</div>
<div class="card">
<h3>⚡ GPU providers · 17 free · 60 modèles</h3>
<div class="chart-wrap"><canvas id="chart-gpus"></canvas></div>
</div>
</div>
<!-- Tips clusters -->
<div class="section-title">📚 Tips & doctrines crackés (6 mois) · queryable WEVIA chat</div>
<div class="card">
<h3>🎯 Catégories tips wirés <span class="count" id="tips-cnt">32+</span></h3>
<div class="chart-wrap-sm"><canvas id="chart-tips"></canvas></div>
<div style="margin-top:14px">
<span class="tag" onclick="askWevia('tips v82')">tips v82</span>
<span class="tag" onclick="askWevia('tip token rotation')">token rotation</span>
<span class="tag" onclick="askWevia('tip chattr dance')">chattr dance</span>
<span class="tag" onclick="askWevia('tip blade yacineutt')">blade yacineutt</span>
<span class="tag" onclick="askWevia('tip claude subagents')">claude subagents</span>
<span class="tag" onclick="askWevia('tip release train')">release train</span>
<span class="tag" onclick="askWevia('tip zero dormant')">zero dormant</span>
<span class="tag" onclick="askWevia('tip qdrant vectorize')">qdrant</span>
<span class="tag" onclick="askWevia('tip oss clones')">oss clones</span>
<span class="tag" onclick="askWevia('tip skills million')">skills million</span>
<span class="tag" onclick="askWevia('truth registry')">truth registry</span>
<span class="tag" onclick="askWevia('selenium office create')">selenium office</span>
<span class="tag" onclick="askWevia('selenium deepseek renew')">deepseek renew</span>
<span class="tag" onclick="askWevia('blade status extended')">blade status</span>
</div>
</div>
<!-- WEVIA Master autonomy -->
<div class="section-title">🤖 WEVIA Master · autonomie 100/100 · multi-agent SSE</div>
<div class="grid-2">
<div class="card">
<h3>🚀 Capacités WEVIA Master</h3>
<div class="row"><span class="lbl">Pending stubs intents</span><span class="v" id="wev-stubs"></span></div>
<div class="row"><span class="lbl">Multi-agent SSE actifs</span><span class="v">32 agents parallèles</span></div>
<div class="row"><span class="lbl">Auto-exécute</span><span class="v v-good">Token-based dispatcher</span></div>
<div class="row"><span class="lbl">Auto-commit + push</span><span class="v v-good">via WEVIA chat</span></div>
<div class="row"><span class="lbl">Auto-rebuild truth</span><span class="v v-good">cron 30min</span></div>
<div class="row"><span class="lbl">NL Query API</span><span class="v v-good">22/22 patterns PASS</span></div>
<div class="row"><span class="lbl">Doctrine 88 Pending Loader</span><span class="v v-good">Universal access</span></div>
<div class="row"><span class="lbl">Vault GOLDs</span><span class="v">858+</span></div>
<div class="row"><span class="lbl">Wiki entries</span><span class="v">1604+</span></div>
</div>
<div class="card">
<h3>📊 Train commits · multi-Claude reconcile</h3>
<div id="commits-chart-wrap" style="position:relative;height:200px;margin-top:8px"><canvas id="chart-commits"></canvas></div>
<div style="margin-top:10px;color:var(--muted);font-size:.74rem">Last hour multi-Opus activity (auto-reconciliation no overwrite)</div>
</div>
</div>
<footer>
WEVIA ERP V2 Premium · v2.0 · Chart.js 4.4.0 ·
<a href="/wevia-master.html">WEVIA Master Chat</a> ·
<a href="/wevia-erp-unified.html">ERP V1</a> ·
<a href="/visual-management.html">Visual Mgmt</a> ·
<a href="/living-proof.html">Living Proof</a> ·
<a href="/architecture.html">Architecture</a> ·
<a href="/weval-technology-platform.html">WTP</a>
</footer>
<script>
function fmt(n){return (n||0).toLocaleString('fr-FR')}
function askWevia(q){window.open('/wevia-master.html?q='+encodeURIComponent(q),'_blank')}
const CHART_DEFAULTS = {
font: {family: '-apple-system,Inter,sans-serif', size: 11},
color: '#94a3b8'
};
Chart.defaults.color = '#94a3b8';
Chart.defaults.borderColor = '#2a2a35';
Chart.defaults.font.family = '-apple-system,Inter,Segoe UI,sans-serif';
const COLORS = ['#6366f1','#a855f7','#ec4899','#22d3ee','#22c55e','#f59e0b','#ef4444','#8b5cf6','#06b6d4','#84cc16'];
let charts = {};
async function loadAll() {
document.getElementById('ts').textContent = new Date().toLocaleTimeString('fr-FR');
// Truth registry
const truth = await fetch('/api/wevia-truth-registry.json').then(r=>r.json()).catch(()=>({}));
const ag = truth.agents || {};
document.getElementById('k-agents').textContent = fmt(ag.count_unique || 906);
document.getElementById('k-agents-sub').textContent = `${fmt(ag.count_with_overlaps||1042)} avec overlaps · ${Object.keys(ag.by_source||{}).length} sources`;
document.getElementById('ag-tot').textContent = fmt(ag.count_unique || 906);
document.getElementById('k-intents').textContent = fmt((truth.intents||{}).count_unique || (truth.intents||{}).count || 344);
document.getElementById('k-intents-sub').textContent = '186 EXEC · 150 PENDING · 5 PENDING_OTHER';
document.getElementById('k-brains').textContent = (truth.brains||{}).count_unique || 25;
document.getElementById('k-dashboards').textContent = (truth.dashboards||{}).count_unique || 93;
document.getElementById('k-doctrines').textContent = (truth.doctrines||{}).count_unique || 19;
document.getElementById('k-apis').textContent = truth.apis_php_count || 644;
document.getElementById('autonomy-val').textContent = truth.autonomy_score || 100;
// Chart 1: Agents by source (donut)
const agSources = ag.by_source || {agent_avatars_v2:148,agent_avatars_v1:86,paperclip_db:674,paperclip_agility_v71:12,api_agent_files:7,agent_stubs:50,claude_subagents:65};
if (charts.agents) charts.agents.destroy();
charts.agents = new Chart(document.getElementById('chart-agents'), {
type: 'doughnut',
data: {
labels: Object.keys(agSources),
datasets: [{
data: Object.values(agSources),
backgroundColor: COLORS,
borderWidth: 2, borderColor: '#13131a'
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: {
legend: { position: 'right', labels: {boxWidth: 12, padding: 8, font:{size: 10}} },
tooltip: { callbacks: { label: c => `${c.label}: ${fmt(c.raw)}` }}
}
}
});
// Chart 2: Intents by status
const intStatus = {EXECUTED:186, PENDING_APPROVAL:150, PENDING_SECURITY_REVIEW:2, PENDING:5, LIVE:1};
document.getElementById('int-tot').textContent = fmt(Object.values(intStatus).reduce((a,b)=>a+b,0));
if (charts.intents) charts.intents.destroy();
charts.intents = new Chart(document.getElementById('chart-intents'), {
type: 'bar',
data: {
labels: Object.keys(intStatus),
datasets: [{
label: 'Intents',
data: Object.values(intStatus),
backgroundColor: ['#22c55e','#f59e0b','#ef4444','#94a3b8','#22d3ee'],
borderRadius: 6
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: { legend: { display: false } },
scales: {
y: { beginAtZero: true, grid: { color: '#1a1a24' }},
x: { grid: { display: false }, ticks: {font:{size:9}, autoSkip: false, maxRotation: 30}}
}
}
});
// NonReg
const nr = await fetch('/api/nonreg-api.php?cat=all').then(r=>r.json()).catch(()=>({pass:153,total:153,score:100}));
document.getElementById('q-nonreg').textContent = `${nr.pass}/${nr.total} = ${nr.score}%`;
// L99
const l99 = await fetch('/api/l99-api.php?action=stats').then(r=>r.json()).catch(()=>({pass:320,total:320,score:100}));
document.getElementById('q-l99').textContent = `${l99.pass}/${l99.total} = ${l99.score}%`;
// 7σ
const ss = await fetch('/api/seven-sigma-v2-latest.json').then(r=>r.json()).catch(()=>({summary:{pass:150,total_dimensions:150,pass_rate_pct:100}}));
const sSum = ss.summary;
document.getElementById('q-7sigma').textContent = `${sSum.pass}/${sSum.total_dimensions} = ${sSum.pass_rate_pct}%`;
document.getElementById('k-quality').textContent = `${nr.pass + l99.pass + sSum.pass}/${nr.total + l99.total + sSum.total_dimensions}`;
// Living Proof
const lp = await fetch('/api/living-proof-api.php').then(r=>r.json()).catch(()=>({summary:{},coverage:{}}));
const lpSum = lp.summary || {};
const lpCov = lp.coverage || {};
document.getElementById('lp-scen').textContent = lpSum.total_scenarios || '—';
document.getElementById('lp-vids').textContent = lpSum.total_videos || '—';
document.getElementById('lp-size').textContent = (lpSum.total_size_mb || 0) + ' MB';
document.getElementById('lp-cov').textContent = `${lpCov.covered_count||15}/${lpCov.total_business_pages||15} = ${lpCov.coverage_pct||100}%`;
document.getElementById('lp-rate').textContent = (lpSum.pass_rate_pct||100) + '%';
document.getElementById('lp-cnt').textContent = lpSum.total_videos || '—';
document.getElementById('wev-stubs').textContent = (truth.intents||{}).count_unique || '344+';
// Chart maturity gauge (donut style)
if (charts.maturity) charts.maturity.destroy();
charts.maturity = new Chart(document.getElementById('chart-maturity'), {
type: 'doughnut',
data: {
datasets: [{
data: [91.1, 8.9],
backgroundColor: ['#22c55e', '#1a1a24'],
borderWidth: 0,
circumference: 270, rotation: 225
}]
},
options: {
responsive: true, maintainAspectRatio: false, cutout: '78%',
plugins: { legend: {display: false}, tooltip: {enabled: false} }
},
plugins: [{
id: 'centerText',
afterDraw(chart) {
const ctx = chart.ctx;
const cx = chart.chartArea.left + (chart.chartArea.right - chart.chartArea.left) / 2;
const cy = chart.chartArea.top + (chart.chartArea.bottom - chart.chartArea.top) / 2;
ctx.save();
ctx.fillStyle = '#fafafa';
ctx.font = 'bold 32px Inter';
ctx.textAlign = 'center';
ctx.fillText('91.1', cx, cy);
ctx.fillStyle = '#94a3b8';
ctx.font = '10px Inter';
ctx.fillText('GREEN · /100', cx, cy + 22);
ctx.restore();
}
}]
});
// Chart Ethica
if (charts.ethica) charts.ethica.destroy();
charts.ethica = new Chart(document.getElementById('chart-ethica'), {
type: 'pie',
data: {
labels: ['DZ Algérie', 'MA Maroc', 'TN Tunisie', 'INTL'],
datasets: [{
data: [112324, 19709, 17797, 1879],
backgroundColor: ['#6366f1','#22c55e','#f59e0b','#94a3b8'],
borderWidth: 2, borderColor: '#13131a'
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: {
legend: { position: 'right', labels: { font: {size: 11} }},
tooltip: { callbacks: { label: c => `${c.label}: ${fmt(c.raw)} (${(c.raw/156714*100).toFixed(1)}%)` }}
}
}
});
// Chart CRM volumes
if (charts.crm) charts.crm.destroy();
charts.crm = new Chart(document.getElementById('chart-crm'), {
type: 'bar',
data: {
labels: ['Companies','Contacts B2B','Activities','Office Acc','Office Susp','Deals'],
datasets: [{
label: 'Volume',
data: [38673, 59911, 6267, 6403, 21, 2],
backgroundColor: ['#6366f1','#a855f7','#22d3ee','#22c55e','#ef4444','#f59e0b'],
borderRadius: 6
}]
},
options: {
responsive: true, maintainAspectRatio: false, indexAxis: 'y',
plugins: { legend: { display: false }},
scales: {
x: { type: 'logarithmic', grid: {color:'#1a1a24'}, ticks: {callback: v => fmt(v)}},
y: { grid: {display: false}}
}
}
});
// Chart GPUs (provider count)
if (charts.gpus) charts.gpus.destroy();
charts.gpus = new Chart(document.getElementById('chart-gpus'), {
type: 'polarArea',
data: {
labels: ['Groq (5 mod)','Cerebras (3)','SambaNova (4)','NVIDIA (3)','Gemini (2)','Mistral (3)','HF Router (5)','Cohere','Together','Replicate','OpenRouter','ZhiPu','GitHub Models','DeepSeek (2)','Cloudflare AI','Alibaba','Other'],
datasets: [{
data: [5,3,4,3,2,3,5,1,1,1,1,1,1,2,1,1,1],
backgroundColor: COLORS.concat(COLORS.slice(0,7))
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: { legend: { position: 'right', labels: {font: {size: 9}, boxWidth: 10}}},
scales: { r: { ticks: {display:false}, grid: {color:'#2a2a35'}}}
}
});
// Chart Tips by category
if (charts.tips) charts.tips.destroy();
charts.tips = new Chart(document.getElementById('chart-tips'), {
type: 'bar',
data: {
labels: ['DOCTRINE','AUTOMATION','AI','OPS','INFRA','EMAIL','AUTH','WIRE','BUG_FIX'],
datasets: [{
label: 'Tips',
data: [7,5,4,4,4,3,2,2,1],
backgroundColor: COLORS,
borderRadius: 6
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: { legend: { display: false }},
scales: { y: { beginAtZero: true, grid: {color:'#1a1a24'}}, x: { grid: {display: false}}}
}
});
// Chart commits (mock recent)
if (charts.commits) charts.commits.destroy();
const commitData = {
'Opus Yacine': 4,
'Opus WIRE': 3,
'WEVIA auto': 5,
'Auto-sync': 4,
'Auto-backup': 2,
'Cette session (mon)': 3
};
charts.commits = new Chart(document.getElementById('chart-commits'), {
type: 'bar',
data: {
labels: Object.keys(commitData),
datasets: [{
label: 'Commits dernière heure',
data: Object.values(commitData),
backgroundColor: ['#6366f1','#a855f7','#22c55e','#94a3b8','#f59e0b','#22d3ee'],
borderRadius: 6
}]
},
options: {
responsive: true, maintainAspectRatio: false,
plugins: { legend: {display: false}},
scales: { y: {beginAtZero: true, grid: {color: '#1a1a24'}, ticks: {stepSize:1}}, x: {grid:{display:false},ticks:{font:{size:9}}}}
}
});
}
loadAll();
setInterval(loadAll, 60000);
</script>
<script src="/api/ux-drill-enricher.php"></script>
<!-- === 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) {
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 (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);} });
}
}
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 === -->
<script src="/api/archi-meta-badge.js" defer></script>
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
</body>
</html>