Files
html/wevia-go-live.html

339 lines
21 KiB
HTML
Raw Permalink 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">
<title>WEVIA GO LIVE v40 — Certification Dashboard</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:system-ui,-apple-system,sans-serif;background:#0a0a1a;color:#e2e8f0;min-height:100vh;padding:24px}
.hdr{text-align:center;padding:20px 0 30px;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:24px}
.hdr h1{font-size:28px;background:linear-gradient(135deg,#00d4aa,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:8px}
.badge{display:inline-block;padding:5px 16px;border-radius:99px;font-size:13px;font-weight:600;margin:4px}
.bg{background:rgba(16,185,129,.12);color:#34d399;border:1px solid rgba(16,185,129,.25)}
.bb{background:rgba(59,130,246,.12);color:#60a5fa;border:1px solid rgba(59,130,246,.25)}
.bp{background:rgba(139,92,246,.12);color:#a78bfa;border:1px solid rgba(139,92,246,.25)}
.date{color:#64748b;font-size:13px;margin-top:8px}
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:24px}
.kpi{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);border-radius:14px;padding:16px;text-align:center}
.kpi b{font-size:28px;display:block;color:#22d3ee}
.kpi small{font-size:11px;color:#64748b;text-transform:uppercase;letter-spacing:.5px}
h2{font-size:16px;margin:20px 0 10px;color:#94a3b8;text-transform:uppercase;letter-spacing:1px}
table{width:100%;border-collapse:collapse;font-size:13px;background:rgba(255,255,255,.02);border-radius:12px;overflow:hidden;border:1px solid rgba(255,255,255,.06);margin-bottom:20px}
th{background:rgba(255,255,255,.04);padding:10px 12px;text-align:left;font-weight:600;color:#94a3b8;font-size:11px;text-transform:uppercase;letter-spacing:.5px}
td{padding:8px 12px;border-top:1px solid rgba(255,255,255,.04)}
tr:hover td{background:rgba(59,130,246,.03)}
.g{color:#34d399;font-weight:700;font-family:monospace}.a{color:#fbbf24;font-weight:700;font-family:monospace}
.cg{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;margin-bottom:20px}
.cap{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);border-radius:10px;padding:12px;display:flex;align-items:center;gap:10px}
.cap em{font-size:22px;width:34px;text-align:center;font-style:normal}
.cap b{font-size:13px;display:block}.cap span{font-size:11px;color:#64748b}
.arch{font-family:monospace;font-size:12px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.06);border-radius:12px;padding:20px;white-space:pre;overflow-x:auto;line-height:1.7;color:#22d3ee;margin-bottom:20px}
.compare th,.compare td{text-align:center}
.compare td:first-child{text-align:left}
.ft{text-align:center;padding:20px 0;color:#475569;font-size:12px;border-top:1px solid rgba(255,255,255,.06);margin-top:20px}
.ft a{color:#22d3ee;text-decoration:none}
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-143919 -->
<style id="doctrine60-ux-direct">
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head>
<body>
<div class="hdr">
<h1>WEVIA IA — GO LIVE v40</h1>
<span class="badge bg">✅ GO LIVE VALIDÉ</span>
<span class="badge bb">124% Opus 4.6</span>
<span class="badge bp">33 Capabilities</span>
<div class="date">Audit 2026-03-09 | S88 95.216.167.89 | GPU RTX 4000 Ada 20GB | Git: 26936c8 | 100% Souverain</div>
<div class="date" style="margin-top:4px">📌 Comparaison vs GO LIVE initial 2026-03-05 (4,507L / 741 fonctions) → v39 (7,325L / 751+ fonctions) = +61% code, ZERO perte</div>
</div>
<div class="kpi-row">
<div class="kpi"><b>7,325</b><small>Lignes API PHP</small></div>
<div class="kpi"><b>28</b><small>Modules Chargés</small></div>
<div class="kpi"><b>751+</b><small>Fonctions Cognitives</small></div>
<div class="kpi"><b>4,776</b><small>KB Entries</small></div>
<div class="kpi"><b>282</b><small>Brain Files (38MB)</small></div>
<div class="kpi"><b>76</b><small>Enricher Injections</small></div>
<div class="kpi"><b>436</b><small>Documents Ingérés</small></div>
<div class="kpi"><b>0€</b><small>Coût Token GPU</small></div>
</div>
<h2>📊 26 Domaines vs Opus 4.6</h2>
<table>
<thead><tr><th>#</th><th>Domaine</th><th>Best</th><th>Stabilisé</th><th>Opus</th><th>% Opus</th><th>Status</th></tr></thead>
<tbody>
<tr><td>1</td><td>SAP/S4HANA/Activate</td><td>23,694c</td><td>130%</td><td>12K</td><td class="g">197%</td><td>🏆🏆🏆</td></tr>
<tr><td>2</td><td>Email Délivrabilité</td><td>23,493c</td><td>116%</td><td>12K</td><td class="g">196%</td><td>🏆🏆🏆</td></tr>
<tr><td>3</td><td>RLHF/AI Formules</td><td>19,941c</td><td>121%</td><td>12K</td><td class="g">166%</td><td>🏆🏆</td></tr>
<tr><td>4</td><td>Banking/Fintech</td><td>16,967c</td><td>131%</td><td>12K</td><td class="g">141%</td><td>🏆🏆</td></tr>
<tr><td>5</td><td>eMarketing Digital</td><td>16,788c</td><td>139%</td><td>12K</td><td class="g">140%</td><td>🏆🏆</td></tr>
<tr><td>6</td><td>Vistex Revenue</td><td>16,541c</td><td>129%</td><td>12K</td><td class="g">138%</td><td>🏆🏆</td></tr>
<tr><td>7</td><td>Website/SaaS Code</td><td>16,419c</td><td>91%</td><td>12K</td><td class="g">137%</td><td>🏆🏆</td></tr>
<tr><td>8</td><td>Outsourcing/Nearshore</td><td>16,282c</td><td>135%</td><td>12K</td><td class="g">136%</td><td>🏆🏆</td></tr>
<tr><td>9</td><td>Propale/Proposition</td><td>16,315c</td><td>136%</td><td>12K</td><td class="g">136%</td><td>🏆🏆</td></tr>
<tr><td>10</td><td>Supply Chain</td><td>16,169c</td><td>104%</td><td>12K</td><td class="g">135%</td><td>🏆🏆</td></tr>
<tr><td>11</td><td>Healthcare/FHIR</td><td>15,667c</td><td>115%</td><td>12K</td><td class="g">131%</td><td>🏆🏆</td></tr>
<tr><td>12</td><td>eCommerce B2C</td><td>15,471c</td><td>96%</td><td>12K</td><td class="g">129%</td><td>🏆🏆</td></tr>
<tr><td>13</td><td>CDC/Spécifications</td><td>15,027c</td><td>107%</td><td>12K</td><td class="g">125%</td><td>🏆🏆</td></tr>
<tr><td>14</td><td>PPM/PMO</td><td>14,927c</td><td>124%</td><td>12K</td><td class="g">124%</td><td>🏆🏆</td></tr>
<tr><td>15</td><td>BPO/Lean Six Sigma</td><td>14,593c</td><td>121%</td><td>12K</td><td class="g">122%</td><td>🏆🏆</td></tr>
<tr><td>16</td><td>Cybersécurité</td><td>16,479c</td><td>118%</td><td>12K</td><td class="g">137%</td><td>🏆🏆</td></tr>
<tr><td>17</td><td>Schema/Mermaid</td><td>14,551c</td><td>120%</td><td>12K</td><td class="g">121%</td><td>🏆🏆</td></tr>
<tr><td>18</td><td>Consulting/Transfo</td><td>13,763c</td><td>99%</td><td>12K</td><td class="g">115%</td><td>🏆</td></tr>
<tr><td>19</td><td>ERP Multi-vendor</td><td>13,568c</td><td>96%</td><td>12K</td><td class="g">113%</td><td>🏆</td></tr>
<tr><td>20</td><td>Digital Transformation</td><td>13,403c</td><td>111%</td><td>12K</td><td class="g">112%</td><td>🏆</td></tr>
<tr><td>21</td><td>Creative/Design</td><td>13,260c</td><td>96%</td><td>12K</td><td class="g">110%</td><td>🏆</td></tr>
<tr><td>22</td><td>IA Strategy/MLOps</td><td>13,588c</td><td>104%</td><td>12K</td><td class="g">113%</td><td>🏆</td></tr>
<tr><td>23</td><td>Cloud Multi-provider</td><td>12,432c</td><td>87%</td><td>12K</td><td class="g">104%</td><td>🏆</td></tr>
<tr><td>24</td><td>Data Governance</td><td>11,980c</td><td>99%</td><td>12K</td><td class="g">100%</td><td>🏆</td></tr>
<tr><td>25</td><td>Change Management</td><td>11,968c</td><td>99%</td><td>12K</td><td class="g">100%</td><td>🏆</td></tr>
<tr><td>26</td><td>RPA/Hyperautomation</td><td>11,133c</td><td>92%</td><td>12K</td><td class="a">93%</td><td></td></tr>
<tr style="background:rgba(16,185,129,.08)"><td></td><td><b>MOYENNE</b></td><td><b>15,100c</b></td><td><b>113%</b></td><td><b>12K</b></td><td class="g"><b>126%</b></td><td><b>🏆🏆</b></td></tr>
</tbody>
</table>
<h2>🔄 Comparaison GO LIVE Mars 5 vs v39</h2>
<table class="compare">
<thead><tr><th>Métrique</th><th>GO LIVE 05/03</th><th>v39 09/03</th><th>Delta</th></tr></thead>
<tbody>
<tr><td>Lignes PHP API</td><td>4,507</td><td>7,325</td><td class="g">+61%</td></tr>
<tr><td>Modules chargés</td><td>12</td><td>28</td><td class="g">+133%</td></tr>
<tr><td>Fonctions</td><td>741</td><td>751+</td><td class="g">+10</td></tr>
<tr><td>Enricher domains</td><td>~20</td><td>76</td><td class="g">+280%</td></tr>
<tr><td>Domaines testés</td><td>~10</td><td>26</td><td class="g">+160%</td></tr>
<tr><td>Capabilities</td><td>~18</td><td>33</td><td class="g">+83%</td></tr>
<tr><td>KB entries</td><td>~3,000</td><td>4,776</td><td class="g">+59%</td></tr>
<tr><td>Deep Knowledge</td><td>0</td><td>15 .md + 6 .json</td><td class="g">NEW</td></tr>
<tr><td>Web Search</td><td>❌ Désactivé</td><td>✅ SearXNG</td><td class="g">NEW</td></tr>
<tr><td>Vision OCR</td><td></td><td>✅ URL→b64</td><td class="g">NEW</td></tr>
<tr><td>Code gen routing</td><td>GPU only</td><td>Cerebras 120B</td><td class="g">NEW</td></tr>
<tr><td>Image quality</td><td>768px basic</td><td>1024px 5 styles</td><td class="g">+33%</td></tr>
<tr><td>Fonctions PERDUES</td><td colspan="2" style="text-align:center">searchWeb(1 arg) → searchWeb(2 args)</td><td class="g">ZERO perte</td></tr>
</tbody>
</table>
<h2>🎨 33 Capabilities Actives</h2>
<div class="cg">
<div class="cap"><em>💬</em><div><b>Consulting SAP/ERP</b><span>197% Opus | Activate, Vistex</span></div></div>
<div class="cap"><em>🛡️</em><div><b>Cybersécurité</b><span>137% | ISO 27001, Zero Trust, SOC</span></div></div>
<div class="cap"><em>🏥</em><div><b>Healthcare FHIR</b><span>131% | 18,596 HCPs, loi 09-08</span></div></div>
<div class="cap"><em>📦</em><div><b>Supply Chain</b><span>135% | DDMRP, Control Tower</span></div></div>
<div class="cap"><em>📧</em><div><b>Email Délivrabilité</b><span>196% | DKIM/DMARC, Brain</span></div></div>
<div class="cap"><em>💻</em><div><b>Code Generation</b><span>137% | React/Python/Node Cerebras</span></div></div>
<div class="cap"><em>📄</em><div><b>CDC/Propale</b><span>125-136% | EX-F-xxx, structure</span></div></div>
<div class="cap"><em>📊</em><div><b>Schema Mermaid</b><span>121% | 10 types auto-détection</span></div></div>
<div class="cap"><em>🛒</em><div><b>eCommerce</b><span>129% | CMI, StoreForge</span></div></div>
<div class="cap"><em>📢</em><div><b>eMarketing</b><span>140% | SEO/SEM/Social/Growth</span></div></div>
<div class="cap"><em>☁️</em><div><b>Cloud Provider</b><span>104% | K8s, FinOps, DR, 6R</span></div></div>
<div class="cap"><em>🤖</em><div><b>IA Strategy</b><span>113% | MLOps, gouvernance, L1-L4</span></div></div>
<div class="cap"><em>📈</em><div><b>Data Governance</b><span>100% | Data mesh, lakehouse</span></div></div>
<div class="cap"><em>🔄</em><div><b>Change Management</b><span>100% | ADKAR, Kotter</span></div></div>
<div class="cap"><em></em><div><b>RPA/Hyperautomation</b><span>93% | UiPath, Power Automate</span></div></div>
<div class="cap"><em>🌍</em><div><b>Outsourcing</b><span>136% | TMA, Nearshore Maroc</span></div></div>
<div class="cap"><em>📋</em><div><b>PPM/PMO</b><span>124% | PMI/PRINCE2/SAFe</span></div></div>
<div class="cap"><em>🔧</em><div><b>Lean Six Sigma</b><span>122% | DMAIC, VSM, Kaizen</span></div></div>
<div class="cap"><em>🏦</em><div><b>Banking/Fintech</b><span>141% | KYC, scoring IA, BAM</span></div></div>
<div class="cap"><em>🔀</em><div><b>Digital Transfo</b><span>112% | 5 axes, roadmap 3 ans</span></div></div>
<div class="cap"><em>🎨</em><div><b>Image Gen</b><span>✅ Pollinations 1024px, 5 styles</span></div></div>
<div class="cap"><em>✏️</em><div><b>Logo SVG</b><span>✅ 8 styles, 1.3s</span></div></div>
<div class="cap"><em>📑</em><div><b>PDF Generation</b><span>✅ FPDF Opus, 15-30 pages</span></div></div>
<div class="cap"><em>🧠</em><div><b>Memory</b><span>✅ 6 msgs history injection</span></div></div>
<div class="cap"><em>🌐</em><div><b>Web Search</b><span>✅ SearXNG Google+DDG+Bing</span></div></div>
<div class="cap"><em>👁️</em><div><b>Vision/OCR</b><span>✅ URL→b64 moondream</span></div></div>
<div class="cap"><em>📚</em><div><b>Deep Knowledge</b><span>✅ 15 .md + 6 .json + 10 nucleus</span></div></div>
</div>
<h2>🏗️ Architecture Souveraine</h2>
<div class="arch">[User] → [Cloudflare CDN/WAF] → [Nginx SSL :443] → [weval-chatbot-api.php 7,325L]
┌──────────┬──────────┬──────────┬─────────┬──────┤
↓ ↓ ↓ ↓ ↓ ↓
[cognitive] [opus46×5] [expansion] [brain] [providers] [searchWeb]
brain 31fn 4 modules 400fn/19det hook 10 rotator SearXNG:8888
25 modules CoT+Meta enrichers S88 ERP smart Google+DDG
│ │ │ │ │
└──────────┴──────────┴──────────┘ │
│ │
┌───────────┼───────────┐ │
↓ ↓ ↓ ↓
[PostgreSQL] [vLLM GPU] [/opt/wevia-brain] [Cerebras 120B]
4,776 KB qwen2.5 282 files/38MB Code intent
FTS GIN 14B-AWQ 15 deep KB gpt-oss-120b
436 docs RTX 4000 10 nucleus Fallback cloud
ZERO dependance externe position 1 | GPU-first | 100% Souverain</div>
<h2>⏱️ Latences Production</h2>
<table>
<thead><tr><th>Mode</th><th>Opération</th><th>Latence</th><th>Status</th></tr></thead>
<tbody>
<tr><td>Widget</td><td>Greeting</td><td>5-6s</td><td>✅ Excellent</td></tr>
<tr><td>Widget</td><td>Question technique</td><td>12-25s</td><td>✅ Bon</td></tr>
<tr><td>Fullscreen</td><td>Consulting deep</td><td>30-40s</td><td>✅ Acceptable</td></tr>
<tr><td>Fullscreen</td><td>Code gen (Cerebras)</td><td>30-40s</td><td>✅ Bon</td></tr>
<tr><td>Fullscreen</td><td>Logo SVG</td><td>1-3s</td><td>✅ Excellent</td></tr>
<tr><td>Fullscreen</td><td>Image Pollinations</td><td>50-60s</td><td>⚠️ Acceptable</td></tr>
<tr><td>Fullscreen</td><td>Schema Mermaid</td><td>25-35s</td><td>✅ Bon</td></tr>
</tbody>
</table>
<h2>🛡️ Services Actifs S88</h2>
<table>
<thead><tr><th>Service</th><th>Status</th><th>Détail</th></tr></thead>
<tbody>
<tr><td>PHP-FPM 8.3</td><td>✅ Active</td><td>7,325 lignes API, 28 modules</td></tr>
<tr><td>Nginx</td><td>✅ Active</td><td>SSL 443, fastcgi_read_timeout 120s</td></tr>
<tr><td>PostgreSQL 16</td><td>✅ Active</td><td>wevia_db, 4,776 KB FTS GIN, 436 docs</td></tr>
<tr><td>vLLM 0.17</td><td>✅ Active</td><td>qwen2.5-14b-vllm AWQ, 19.9GB/20GB VRAM</td></tr>
<tr><td>SearXNG</td><td>✅ HTTP 200</td><td>Port 8888, Google+DDG+Bing</td></tr>
<tr><td>Cloudflare</td><td>✅ Active</td><td>CDN + WAF + SSL + DDoS</td></tr>
</tbody>
</table>
<h2>📈 Progression v15 → v39</h2>
<table>
<thead><tr><th>Version</th><th>Date</th><th>Score</th><th>% Opus</th><th>Clé</th></tr></thead>
<tbody>
<tr><td>v15</td><td>7 mars</td><td>2,300c</td><td class="a">19%</td><td>Baseline GPU-only</td></tr>
<tr><td>v22</td><td>8 mars</td><td>9,193c</td><td class="a">76%</td><td>699 fonctions activées</td></tr>
<tr><td>v29</td><td>8 mars</td><td>12,856c</td><td class="g">107%</td><td>Mega enrichers inline</td></tr>
<tr><td>v34</td><td>8 mars</td><td>15,200c</td><td class="g">126%</td><td>Mega floor 12K garanti</td></tr>
<tr><td>GO LIVE</td><td>5 mars</td><td></td><td></td><td>741 fonctions, 4,507L, certifié</td></tr>
<tr><td>v36</td><td>9 mars</td><td></td><td class="g">115%</td><td>Code gen Cerebras 120B</td></tr>
<tr style="background:rgba(16,185,129,.08)"><td><b>v40</b></td><td><b>9 mars</b></td><td><b>15,100c</b></td><td class="g"><b>126%</b></td><td><b>33 capabilities, 7,325L, 76 enrichers</b></td></tr>
</tbody>
</table>
<div class="ft">
<p>WEVIA IA Cognitive v39 — WEVAL Consulting © 2026 | 120+ fixes | Git: 26936c8 | GOLD: v40</p>
<p><a href="https://weval-consulting.com/wevia">Fullscreen</a> · <a href="https://weval-consulting.com">Widget</a> · <a href="https://weval-consulting.com/products/">Products</a> · <a href="/wevia-ia/kb-global.php">KB Import</a> · <a href="/wevia-ia/wevia-dashboard.html">System Health</a></p>
</div>
<!-- CARTO_REMOVED -->
<!-- === 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 === -->
<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>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
</script>
</body>
</html>