{"id":1043,"date":"2026-03-13T07:19:32","date_gmt":"2026-03-13T07:19:32","guid":{"rendered":"https:\/\/cortexorigin.com\/?page_id=1043"},"modified":"2026-03-23T14:39:17","modified_gmt":"2026-03-23T14:39:17","slug":"1043-2","status":"publish","type":"page","link":"https:\/\/cortexorigin.com\/index.php\/1043-2\/","title":{"rendered":"Evaluation Dashboard"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Menu Cortex ORIGIN\u2122<\/title>\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');\n \nbody { margin: 0; padding: 0; background: #F4F0EB; font-family: 'DM Sans', sans-serif; }\n \n\/* MENU BAR \u2014 FULL WIDTH *\/\n.cortex-nav-outer {\n  width: 100vw;\n  position: relative;\n  left: 50%;\n  transform: translateX(-50%);\n  background: #0C1829;\n  padding: 0 2rem;\n  box-sizing: border-box;\n  z-index: 9999;\n}\n.menu-bar {\n  background: transparent;\n  padding: 0;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: relative;\n  z-index: 100;\n  width: 100%;\n  box-sizing: border-box;\n  max-width: 1400px;\n  margin: 0 auto;\n}\n.menu-logo {\n  font-family: 'DM Sans', sans-serif; font-weight: 700; font-size: 0.95rem;\n  color: #fff; padding: 1rem 0; letter-spacing: 0.03em; white-space: nowrap;\n}\n.menu-logo span { color: #C9A96E; }\n.menu-items { display: flex; align-items: center; gap: 0; }\n \n\/* \u2500\u2500 AETZU ARROW AI BUTTON \u2500\u2500 *\/\n.menu-aetzu {\n  display: flex; align-items: center;\n  padding: 0.45rem 1rem;\n  margin-right: 0.5rem;\n  background: rgba(201,169,110,0.12);\n  border: 1px solid rgba(201,169,110,0.35);\n  border-radius: 3px;\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 0.65rem; font-weight: 500;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  color: #C9A96E;\n  text-decoration: none;\n  transition: all 0.25s;\n  white-space: nowrap;\n  gap: 0.5rem;\n}\n.menu-aetzu::before {\n  content: '\u2b21';\n  font-size: 0.75rem;\n  opacity: 0.7;\n}\n.menu-aetzu:hover {\n  background: rgba(201,169,110,0.25);\n  border-color: rgba(201,169,110,0.6);\n  color: #fff;\n}\n \n.menu-item {\n  position: relative; padding: 1rem 1rem;\n  font-size: 0.78rem; font-weight: 500; color: rgba(184,212,240,0.75);\n  cursor: pointer; letter-spacing: 0.02em; transition: color 0.2s;\n  white-space: nowrap;\n}\n.menu-item:hover { color: #fff; }\n.menu-item::after {\n  content: '\u25be'; margin-left: 0.3rem; font-size: 0.6rem; opacity: 0.5;\n}\n.menu-item.no-drop::after { content: ''; }\n.menu-cta {\n  font-family: 'JetBrains Mono', monospace; font-size: 0.65rem; font-weight: 500;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  padding: 0.5rem 1.2rem; border-radius: 2px;\n  background: rgba(201,169,110,0.15); color: #C9A96E; border: 1px solid rgba(201,169,110,0.3);\n  cursor: pointer; transition: all 0.3s; white-space: nowrap;\n}\n.menu-cta:hover { background: rgba(201,169,110,0.25); color: #fff; }\n \n\/* DROPDOWN *\/\n.menu-dropdown {\n  display: none; position: absolute; top: 100%; left: 0;\n  background: #0C1829; border: 1px solid rgba(74,144,217,0.15);\n  border-top: 2px solid #C9A96E; border-radius: 0 0 4px 4px;\n  min-width: 320px; padding: 0.8rem 0; z-index: 200;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.4);\n}\n.menu-item:hover .menu-dropdown { display: block; }\n.menu-dropdown a {\n  display: block; padding: 0.5rem 1.5rem; font-size: 0.8rem; color: rgba(184,212,240,0.6);\n  text-decoration: none; transition: all 0.2s; line-height: 1.5;\n}\n.menu-dropdown a:hover { color: #fff; background: rgba(74,144,217,0.08); }\n.menu-dropdown .drop-label {\n  font-family: 'JetBrains Mono', monospace; font-size: 0.58rem; font-weight: 600;\n  letter-spacing: 0.15em; color: #C9A96E; text-transform: uppercase;\n  padding: 0.6rem 1.5rem 0.3rem; display: block;\n}\n.menu-dropdown .drop-sep {\n  border: none; border-top: 1px solid rgba(74,144,217,0.08);\n  margin: 0.5rem 1.5rem;\n}\n \n.menu-dropdown a.drop-highlight {\n  display: flex; align-items: center; justify-content: space-between;\n  margin: 0.4rem 0.8rem 0.2rem;\n  padding: 0.55rem 1rem;\n  background: rgba(201,169,110,0.08);\n  border: 1px solid rgba(201,169,110,0.2);\n  border-radius: 3px;\n  color: #C9A96E;\n  font-weight: 600; font-size: 0.78rem;\n  transition: all 0.2s;\n}\n.menu-dropdown a.drop-highlight:hover {\n  background: rgba(201,169,110,0.18); color: #fff; border-color: rgba(201,169,110,0.45);\n}\n.drop-highlight-arrow { font-size: 0.65rem; opacity: 0.6; margin-left: 8px; }\n \n.menu-dropdown a.drop-sim {\n  display: flex; align-items: center; justify-content: space-between;\n  margin: 0.25rem 0.8rem;\n  padding: 0.5rem 1rem;\n  background: rgba(74,144,217,0.06);\n  border: 1px solid rgba(74,144,217,0.18);\n  border-radius: 3px;\n  color: rgba(184,212,240,0.85);\n  font-size: 0.78rem;\n  transition: all 0.2s;\n}\n.menu-dropdown a.drop-sim:hover {\n  background: rgba(74,144,217,0.14); color: #fff; border-color: rgba(74,144,217,0.4);\n}\n.drop-sim-icon { font-size: 0.7rem; opacity: 0.55; margin-left: 8px; }\n \n\/* MEGA DROPDOWN *\/\n.mega-dropdown {\n  display: none; position: absolute; top: 100%; left: -100px;\n  background: #0C1829; border: 1px solid rgba(74,144,217,0.15);\n  border-top: 2px solid #C9A96E; border-radius: 0 0 4px 4px;\n  width: 640px; padding: 1.5rem; z-index: 200;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.4);\n}\n.menu-item:hover .mega-dropdown { display: block; }\n.mega-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 0 2rem; }\n.mega-col .drop-label { padding: 0 0 0.3rem; }\n.mega-col a {\n  display: block; padding: 0.35rem 0; font-size: 0.78rem; color: rgba(184,212,240,0.6);\n  text-decoration: none; transition: color 0.2s;\n}\n.mega-col a:hover { color: #fff; }\n.mega-col a.drop-highlight {\n  margin: 0.5rem 0 0.2rem; padding: 0.5rem 0.8rem;\n  background: rgba(201,169,110,0.08); border: 1px solid rgba(201,169,110,0.2);\n  border-radius: 3px; color: #C9A96E; font-weight: 600;\n  display: flex; align-items: center; justify-content: space-between;\n}\n.mega-col a.drop-highlight:hover {\n  background: rgba(201,169,110,0.18); color: #fff; border-color: rgba(201,169,110,0.45);\n}\n<\/style>\n<\/head>\n<body>\n \n<div class=\"cortex-nav-outer\"><div class=\"menu-bar\">\n  <div class=\"menu-logo\">CORTEX <span>ORIGIN\u2122<\/span><\/div>\n  <div class=\"menu-items\">\n \n    <!-- AETZU ARROW AI \u2014 bouton \u00e0 gauche d'Architecture -->\n    <a href=\"https:\/\/cortexorigin.com\/index.php\/aetzu-arrow-ai\/\" class=\"menu-aetzu\">\n      AETZU ARROW AI\u2122\n    <\/a>\n \n    <!-- 1. ARCHITECTURE -->\n    <div class=\"menu-item\">\n      Architecture\n      <div class=\"mega-dropdown\">\n        <div class=\"mega-cols\">\n          <div class=\"mega-col\">\n            <span class=\"drop-label\">Socle critique (TCB)<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/larchitecture-cortex-origin\/\">CORTEX ORIGIN\u2122 \u2014 Vue d&rsquo;ensemble<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-core\/\">Cortex Core\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/omega-gouvernance-decisionnelle\/\">OMEGA\u2122 \u2014 Gouvernance<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/180-2\/\">PRISM\u2122 \u2014 Preuve<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-aegis\/\">AEGIS\u2122 \u2014 Ex\u00e9cution<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-fulcrum\/\">FULCRUM\u2122<\/a>\n            <hr class=\"drop-sep\" style=\"margin:0.5rem 0\">\n            <span class=\"drop-label\" style=\"padding:0.4rem 0 0.3rem\">S\u00e9curit\u00e9 &amp; Confinement<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/2026\/01\/02\/sentinel-securite-active-et-gouvernance-des-signaux\/\">SENTINEL\u2122 \u2014 S\u00e9curit\u00e9 active<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/wall-dome-les-4-formules-de-confinement-et-gouvernance-runtime\/\">WALL-DOME\u2122 \u2014 Confinement<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cerbere\/\">CERB\u00c8RE\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cerbere-decision-guard\/\">Decision Guard\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/1241-2\/\" class=\"drop-highlight\">\n              CMS CORTEX MORPHIC SHIELD\u2122\n              <span class=\"drop-highlight-arrow\">\u2197<\/span>\n            <\/a>\n          <\/div>\n          <div class=\"mega-col\">\n            <span class=\"drop-label\">Interface &amp; Orchestration<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/2026\/01\/02\/ava-cpl\/\">AVA\u2122 &amp; CPL\u2122 \u2014 Interface<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/multi-lcm-trm-engine-orchestration-gouvernee-multi-modeles-ia\/\">Multi LCM \/ TRM Engine\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/trm-contrain-nano\/\">TRM Contrain Nano\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-ecoflux\/\">EcoFlux\u2122 \u2014 Frugalit\u00e9<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/morph-gates\/\">MORPH GATES\u2122 \u2014 CI\/CD<\/a>\n            <hr class=\"drop-sep\" style=\"margin:0.5rem 0\">\n            <span class=\"drop-label\" style=\"padding:0.4rem 0 0.3rem\">Capacit\u00e9s avanc\u00e9es<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-quantum-ready\/\">Quantum-Ready\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cyber-orion-3\/\">CYBER-ORION\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-labcode\/\">LabCode\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-chameleon\/\">CHAMELEON\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-mirror-lab\/\">MIRROR LAB\u2122<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n \n    <!-- 2. APPLICATIONS -->\n    <div class=\"menu-item\">\n      Applications\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">Verticales technologiques<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/imcortex-2\/\">IMCORTEX\u2122 \u0394IMC \u2014 Architecture cognitive<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/space-ai-autonomie-gouvernee\/\">Space AI \u2014 Autonomie gouvern\u00e9e<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/quantum-assurance-architecture-quantum-ready\/\">Quantum Assurance<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/wall-dome-drones-systemes-autonomes\/\">Drones &amp; Syst\u00e8mes autonomes<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">IAG par secteur<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-banque-la-finance-les-oiv\/\">Banque, Finance &amp; OIV<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-defense-la-securite-le-cyber\/\">D\u00e9fense &amp; Cybers\u00e9curit\u00e9<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-letat-le-regalien\/\">\u00c9tat &amp; R\u00e9galien<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/592-2\/\">Tous les secteurs<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 3. V\u00c9RIFICATION -->\n    <div class=\"menu-item\">\n      V\u00e9rification\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">CFVL \u2014 Laboratoire formel<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/689-2\/\">CFVL \u2014 Page principale<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/841-2\/\">Journal R&amp;D<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/833-2\/\">Publications &amp; \u00e9valuations<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/827-2\/\">M\u00e9thodologie<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Recherche<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/604-2\/\">Cortex AGI Exp\u00e9rimental<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-2\/\">MVP CORTEX\u2122<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/814-2\/\">IA expliqu\u00e9e simplement<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 4. SECTEURS -->\n    <div class=\"menu-item\">\n      Secteurs\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">Audiences<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/investisseurs-partenaires\/\">Investisseurs &amp; partenaires<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/industriels-integrateurs\/\">Industriels &amp; int\u00e9grateurs<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/decideurs-publics-autorites\/\">D\u00e9cideurs publics &amp; autorit\u00e9s<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Packs Applications (paC)<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-banque-la-finance-les-oiv\/\">Finance &amp; Banque<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-defense-la-securite-le-cyber\/\">D\u00e9fense &amp; Cyber<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-letat-le-regalien\/\">\u00c9tat &amp; R\u00e9galien<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 5. CFVL -->\n    <div class=\"menu-item\">\n      CFVL\n      <div class=\"menu-dropdown\" style=\"min-width:300px\">\n        <span class=\"drop-label\">Programme de certification<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/689-2\/\">CFVL \u2014 Page principale<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/841-2\/\">Journal R&amp;D<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/833-2\/\">Publications<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/rapport-mttd-mttb\/\">Rapport MTTD \/ MTTB<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Simulations interactives<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/test\/\" class=\"drop-sim\">\n          Simulations Attaque\n          <span class=\"drop-sim-icon\">\u26a1<\/span>\n        <\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/simulation\/\" class=\"drop-sim\">\n          Sch\u00e9ma &amp; Simulations\n          <span class=\"drop-sim-icon\">\u25ce<\/span>\n        <\/a>\n        <hr class=\"drop-sep\">\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/1043-2\/\" class=\"drop-highlight\">\n          Evaluation Dashboard\n          <span class=\"drop-highlight-arrow\">\u2197<\/span>\n        <\/a>\n      <\/div>\n    <\/div>\n \n    <!-- CTA -->\n    <a href=\"mailto:press@cortexorigin.com\" style=\"text-decoration:none\">\n      <div class=\"menu-cta\">Contact<\/div>\n    <\/a>\n \n  <\/div>\n<\/div>\n<\/div>\n<\/body>\n<\/html>\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>CFVL Certification Dashboard \u2014 CORTEX ORIGIN\u2122<\/title>\n<style>\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n:root {\n  --bg:#f5f4f1; --bg2:#ffffff; --bg3:#f0eeeb;\n  --border:rgba(0,0,0,0.08); --borderem:rgba(0,0,0,0.15);\n  --text:#1a1a18; --text2:#6b6966; --text3:#9e9b98;\n  --tcb:#534AB7; --tcb-bg:#EEEDFE; --tcb-txt:#3C3489;\n  --safe:#854F0B; --safe-bg:#FAEEDA; --safe-txt:#633806;\n  --sec:#0F6E56; --sec-bg:#E1F5EE; --sec-txt:#085041;\n  --wip:#993C1D; --wip-bg:#FAECE7; --wip-txt:#712B13;\n  --mtd:#5B2D8E; --mtd-bg:#F3EEFE; --mtd-txt:#3D1D6B;\n  --r:10px; --r-sm:6px;\n}\nbody { background:var(--bg); color:var(--text); font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif; font-size:14px; line-height:1.6; -webkit-font-smoothing:antialiased; }\n.page { max-width:1080px; margin:0 auto; padding:48px 24px 80px; }\n.eyebrow { font-size:11px; font-weight:600; letter-spacing:.13em; text-transform:uppercase; color:var(--text3); margin-bottom:10px; }\nh1 { font-size:26px; font-weight:700; color:var(--text); letter-spacing:-.02em; margin-bottom:6px; }\n.subline { font-size:13px; color:var(--text2); max-width:520px; margin-bottom:36px; }\n.kpi-grid { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; margin-bottom:32px; }\n.kpi { background:var(--bg3); border-radius:var(--r); padding:14px 16px; }\n.kpi-lbl { font-size:10px; font-weight:600; letter-spacing:.1em; text-transform:uppercase; color:var(--text3); margin-bottom:5px; }\n.kpi-val { font-size:24px; font-weight:700; color:var(--text); letter-spacing:-.02em; line-height:1; margin-bottom:3px; }\n.kpi-sub { font-size:11px; color:var(--text2); }\n.filters { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:24px; }\n.fbtn { font-size:12px; font-weight:500; padding:6px 16px; border-radius:20px; border:.5px solid var(--borderem); background:transparent; color:var(--text2); cursor:pointer; transition:all .15s; outline:none; }\n.fbtn:hover { background:var(--bg3); color:var(--text); }\n.fbtn.active { background:var(--bg2); color:var(--text); border-color:var(--borderem); }\n.fbtn.f-tcb.active  { background:var(--tcb-bg);  color:var(--tcb-txt);  border-color:rgba(83,74,183,.3); }\n.fbtn.f-safe.active { background:var(--safe-bg); color:var(--safe-txt); border-color:rgba(133,79,11,.3); }\n.fbtn.f-sec.active  { background:var(--sec-bg);  color:var(--sec-txt);  border-color:rgba(15,110,86,.3); }\n.fbtn.f-mtd.active  { background:var(--mtd-bg);  color:var(--mtd-txt);  border-color:rgba(91,45,142,.3); }\n.layer { margin-bottom:6px; }\n.layer.hidden { display:none; }\n.layer-head { display:flex; align-items:center; gap:12px; margin:18px 0 12px; }\n.pill { font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; padding:4px 12px; border-radius:20px; white-space:nowrap; }\n.p-tcb  { background:var(--tcb-bg);  color:var(--tcb-txt); }\n.p-safe { background:var(--safe-bg); color:var(--safe-txt); }\n.p-sec  { background:var(--sec-bg);  color:var(--sec-txt); }\n.p-mtd  { background:var(--mtd-bg);  color:var(--mtd-txt); }\n.lline  { flex:1; height:.5px; background:var(--border); }\n.mods { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; }\n.mod { background:var(--bg2); border:.5px solid var(--border); border-left:3px solid transparent; border-radius:var(--r); padding:14px 16px; cursor:pointer; transition:box-shadow .18s,transform .15s,border-color .15s; position:relative; }\n.mod:hover { box-shadow:0 4px 16px rgba(0,0,0,.08); transform:translateY(-2px); border-color:var(--borderem); }\n.mod.c-tcb  { border-left-color:var(--tcb); }\n.mod.c-safe { border-left-color:var(--safe); }\n.mod.c-sec  { border-left-color:var(--sec); }\n.mod.c-wip  { border-left-color:var(--wip); }\n.mod.c-mtd  { border-left-color:var(--mtd); }\n.mod-head { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; margin-bottom:7px; }\n.mod-id { font-size:10px; font-weight:600; letter-spacing:.04em; color:var(--text3); }\n.badge { font-size:11px; font-weight:700; padding:2px 8px; border-radius:4px; white-space:nowrap; }\n.b-100  { background:var(--tcb-bg);  color:var(--tcb-txt); }\n.b-ok   { background:var(--sec-bg);  color:var(--sec-txt); }\n.b-wip  { background:var(--wip-bg);  color:var(--wip-txt); }\n.b-mtd  { background:var(--mtd-bg);  color:var(--mtd-txt); }\n.mod-name { font-size:13px; font-weight:700; color:var(--text); margin-bottom:9px; letter-spacing:-.01em; }\n.metrics { display:flex; flex-wrap:wrap; gap:3px 10px; margin-bottom:10px; }\n.mt { font-size:11px; color:var(--text2); }\n.mt strong { color:var(--text); font-weight:600; }\n.bar-bg { height:3px; background:var(--bg3); border-radius:2px; overflow:hidden; }\n.bar-fg { height:100%; border-radius:2px; }\n.hint { position:absolute; bottom:9px; right:12px; font-size:9px; font-weight:700; letter-spacing:.08em; color:var(--text3); opacity:0; transition:opacity .18s; text-transform:uppercase; }\n.mod:hover .hint { opacity:1; }\n.chart-sec { background:var(--bg2); border:.5px solid var(--border); border-radius:var(--r); padding:22px; margin-top:28px; }\n.chart-title { font-size:11px; font-weight:600; letter-spacing:.1em; text-transform:uppercase; color:var(--text3); margin-bottom:14px; }\n.legend { display:flex; flex-wrap:wrap; gap:14px; margin-bottom:14px; }\n.leg { font-size:11px; color:var(--text2); display:flex; align-items:center; gap:6px; }\n.leg-dot { width:8px; height:8px; border-radius:2px; flex-shrink:0; }\n.chart-wrap { position:relative; width:100%; height:380px; }\n.disclaimer { margin-top:24px; padding:12px 16px; background:var(--bg3); border-radius:var(--r-sm); font-size:11px; color:var(--text3); line-height:1.75; font-style:italic; }\n.overlay { display:none; position:fixed; inset:0; background:rgba(0,0,0,.35); z-index:900; }\n.overlay.open { display:block; }\n.detail-panel { position:fixed; top:0; right:-640px; width:min(620px,95vw); height:100vh; background:var(--bg2); border-left:.5px solid var(--borderem); box-shadow:-20px 0 60px rgba(0,0,0,.12); overflow-y:auto; z-index:901; transition:right .3s cubic-bezier(.4,0,.2,1); padding:0; }\n.detail-panel.open { right:0; }\n.dp-header { display:flex; align-items:flex-start; justify-content:space-between; padding:24px 28px 20px; border-bottom:.5px solid var(--border); position:sticky; top:0; background:var(--bg2); z-index:2; }\n.dp-meta { font-size:10px; font-weight:600; letter-spacing:.06em; color:var(--text3); margin-bottom:4px; }\n.dp-name { font-size:22px; font-weight:700; color:var(--text); letter-spacing:-.02em; }\n.dp-score { font-size:28px; font-weight:700; padding:8px 18px; border-radius:var(--r); white-space:nowrap; align-self:center; }\n.dp-close { background:var(--bg3); border:.5px solid var(--border); border-radius:var(--r-sm); color:var(--text2); font-size:18px; width:32px; height:32px; cursor:pointer; display:flex; align-items:center; justify-content:center; transition:background .15s; flex-shrink:0; margin-left:12px; }\n.dp-close:hover { background:var(--borderem); color:var(--text); }\n.dp-body { padding:24px 28px; }\n.dp-kpis { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; margin-bottom:22px; }\n.dp-kpi { background:var(--bg3); border-radius:var(--r-sm); padding:12px 14px; }\n.dp-kpi-lbl { font-size:10px; font-weight:600; letter-spacing:.1em; text-transform:uppercase; color:var(--text3); margin-bottom:4px; }\n.dp-kpi-val { font-size:22px; font-weight:700; color:var(--text); letter-spacing:-.02em; line-height:1; margin-bottom:2px; }\n.dp-kpi-sub { font-size:11px; color:var(--text2); }\n.dp-sec-title { font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; color:var(--text3); margin:20px 0 12px; }\n.tool-row { display:flex; align-items:center; gap:10px; margin-bottom:10px; }\n.tool-name { font-size:12px; font-weight:600; color:var(--text); min-width:150px; }\n.tool-bar  { flex:1; height:6px; background:var(--bg3); border-radius:3px; overflow:hidden; }\n.tool-fill { height:100%; border-radius:3px; }\n.tool-val  { font-size:11px; color:var(--text2); min-width:100px; text-align:right; }\n.status-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; margin-bottom:20px; }\n.status-card { border:.5px solid var(--border); border-radius:var(--r-sm); padding:12px 14px; display:flex; align-items:flex-start; gap:10px; }\n.status-icon { width:28px; height:28px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:13px; flex-shrink:0; font-weight:700; }\n.si-ok   { background:var(--sec-bg); color:var(--sec-txt); }\n.si-tcb  { background:var(--tcb-bg); color:var(--tcb-txt); }\n.si-warn { background:var(--wip-bg); color:var(--wip-txt); }\n.si-mtd  { background:var(--mtd-bg); color:var(--mtd-txt); }\n.status-title { font-size:12px; font-weight:600; color:var(--text); }\n.status-sub   { font-size:11px; color:var(--text2); margin-top:2px; line-height:1.5; }\n.dp-chart-wrap { position:relative; width:100%; height:220px; margin-bottom:20px; }\n.gap-alert { display:inline-flex; align-items:center; gap:6px; background:var(--wip-bg); color:var(--wip-txt); font-size:11px; font-weight:600; padding:5px 12px; border-radius:4px; margin-bottom:10px; }\n.remain-note { font-size:12px; color:var(--text2); line-height:1.8; }\n.remain-note b { color:var(--text); }\n.remain-note code { font-family:'SF Mono','Fira Mono',monospace; font-size:11px; background:var(--bg3); padding:1px 5px; border-radius:3px; color:var(--tcb); }\n@media(max-width:720px){ .kpi-grid{grid-template-columns:repeat(2,1fr);} .mods{grid-template-columns:1fr;} .dp-kpis{grid-template-columns:1fr;} .status-grid{grid-template-columns:1fr;} }\n@media(max-width:420px){ h1{font-size:20px;} }\n<\/style>\n<\/head>\n<body>\n<div class=\"page\">\n  <div class=\"eyebrow\">Certification Program \u00b7 CORTEX ORIGIN\u2122 \u00b7 v8.1<\/div>\n  <h1>CFVL Evaluation Dashboard<\/h1>\n  <p class=\"subline\">Programme de v\u00e9rification formelle multi-couches. <strong>15 modules \u00e9valu\u00e9s<\/strong> \u2014 EAL7, Frama-C\/WP, CBMC, Isabelle\/HOL, Coq\/Rocq \u00b7 AVA-VAN-001 v1.5 \u00b7 57\/57 norm. \u00b7 evidence-grade EAL7.<\/p>\n \n  <div class=\"kpi-grid\">\n    <div class=\"kpi\"><div class=\"kpi-lbl\">\u00c9valuations<\/div><div class=\"kpi-val\">15<\/div><div class=\"kpi-sub\">modules \u00e9valu\u00e9s \u00b7 v8.1<\/div><\/div>\n    <div class=\"kpi\"><div class=\"kpi-lbl\">Score parfait<\/div><div class=\"kpi-val\" style=\"color:var(--tcb)\">7<\/div><div class=\"kpi-sub\">modules \u00e0 100 \/ 100<\/div><\/div>\n    <div class=\"kpi\"><div class=\"kpi-lbl\">Propri\u00e9t\u00e9s CBMC<\/div><div class=\"kpi-val\" style=\"color:var(--sec)\">5 177+<\/div><div class=\"kpi-sub\">tous modules \u00b7 0 failed<\/div><\/div>\n    <div class=\"kpi\"><div class=\"kpi-lbl\">Lemmes Isabelle<\/div><div class=\"kpi-val\">901+<\/div><div class=\"kpi-sub\">0 sorry \/ admitted<\/div><\/div>\n  <\/div>\n \n  <div class=\"filters\">\n    <button class=\"fbtn active\"  onclick=\"doFilter('all',  this)\">Tous les modules<\/button>\n    <button class=\"fbtn f-tcb\"   onclick=\"doFilter('tcb',  this)\">TCB \u2014 Preuve formelle<\/button>\n    <button class=\"fbtn f-safe\"  onclick=\"doFilter('safe', this)\">Safety-Critical<\/button>\n    <button class=\"fbtn f-sec\"   onclick=\"doFilter('sec',  this)\">S\u00e9curit\u00e9 &amp; Orchestration<\/button>\n    <button class=\"fbtn f-mtd\"   onclick=\"doFilter('mtd',  this)\">MTD &amp; R\u00e9silience<\/button>\n  <\/div>\n \n  <!-- TCB -->\n  <div class=\"layer\" id=\"ly-tcb\">\n    <div class=\"layer-head\"><span class=\"pill p-tcb\">TCB \u00b7 Preuve formelle compl\u00e8te<\/span><span class=\"lline\"><\/span><\/div>\n    <div class=\"mods\">\n      <div class=\"mod c-tcb\" onclick=\"openDetail('omega')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-001 \u00b7 M10<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">OMEGA\u2122 PolicyForge<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>161\/161<\/strong> WP<\/span><span class=\"mt\"><strong>167<\/strong> Isabelle<\/span><span class=\"mt\"><strong>12<\/strong> Coq<\/span><span class=\"mt\"><strong>171<\/strong> tests<\/span><span class=\"mt\">DTE v8.0<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--tcb)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-tcb\" onclick=\"openDetail('prism')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-002 \u00b7 M02<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">PRISM\u2122 v43<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>281\/281<\/strong> WP<\/span><span class=\"mt\"><strong>215<\/strong> Isabelle<\/span><span class=\"mt\"><strong>23<\/strong> Coq<\/span><span class=\"mt\"><strong>~30,4 M<\/strong> Fuzz \u2705<\/span><span class=\"mt\">0 sorry<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--tcb)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-wip\" onclick=\"openDetail('m00')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-003 \u00b7 M00<\/span><span class=\"badge b-wip\">85 % \u2699<\/span><\/div>\n        <div class=\"mod-name\">Root of Trust<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>714\/714<\/strong> WP<\/span><span class=\"mt\"><strong>477<\/strong> Isabelle<\/span><span class=\"mt\"><strong>490<\/strong> Coq<\/span><span class=\"mt\"><strong>1,83 Mds<\/strong> Run1 \u2705<\/span><span class=\"mt\">Run2 \u23f3 17\/03<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:85%;background:var(--wip)\"><\/div><\/div>\n        <span class=\"hint\">Run2 en cours \u2197<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- Safety -->\n  <div class=\"layer\" id=\"ly-safe\">\n    <div class=\"layer-head\" style=\"margin-top:10px\"><span class=\"pill p-safe\">Safety-Critical \u00b7 Preuve partielle + robustesse<\/span><span class=\"lline\"><\/span><\/div>\n    <div class=\"mods\">\n      <div class=\"mod c-safe\" onclick=\"openDetail('m09')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-005 \u00b7 M09<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">CircuitBreaker\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>463<\/strong> CBMC<\/span><span class=\"mt\"><strong>59<\/strong> tests<\/span><span class=\"mt\"><strong>2,379 Mds<\/strong> Fuzz \u2705<\/span><span class=\"mt\"><strong>9\/9<\/strong> FI<\/span><span class=\"mt\">record absolu<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--safe)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- Sec & Orchestration -->\n  <div class=\"layer\" id=\"ly-sec\">\n    <div class=\"layer-head\" style=\"margin-top:10px\"><span class=\"pill p-sec\">S\u00e9curit\u00e9 &amp; Orchestration \u00b7 Tests + confinement seL4<\/span><span class=\"lline\"><\/span><\/div>\n    <div class=\"mods\">\n      <div class=\"mod c-sec\" onclick=\"openDetail('sentinel')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-006 \u00b7 M01<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">SENTINEL\u2122 v8<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>1 291<\/strong> CBMC<\/span><span class=\"mt\"><strong>22<\/strong> Isabelle<\/span><span class=\"mt\"><strong>220<\/strong> tests EAL<\/span><span class=\"mt\"><strong>~1,9 Md<\/strong> Fuzz<\/span><span class=\"mt\"><strong>96,3%<\/strong> cov.<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('walldome')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-007 \u00b7 WALL-DOME\u2122<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">WALL-DOME\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>156\/156<\/strong> Frama-C WP<\/span><span class=\"mt\"><strong>231<\/strong> CBMC<\/span><span class=\"mt\"><strong>25,23 Mds<\/strong> Fuzz<\/span><span class=\"mt\">ProVerif 5\/5<\/span><span class=\"mt\">Z3 10\/10<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('trustlink')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-009 \u00b7 M11<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">TrustLink\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>373\/379<\/strong> WP (98,4%)<\/span><span class=\"mt\"><strong>752<\/strong> CBMC<\/span><span class=\"mt\"><strong>20<\/strong> Isabelle<\/span><span class=\"mt\"><strong>237<\/strong> tests<\/span><span class=\"mt\"><strong>403M<\/strong> Fuzz<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('avacpl')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-011 \u00b7 M26<\/span><span class=\"badge b-ok\">96 \/ 100<\/span><\/div>\n        <div class=\"mod-name\">AVA-CPL\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>267\/282<\/strong> Frama-C WP<\/span><span class=\"mt\"><strong>100<\/strong> Isabelle (0 Admitted)<\/span><span class=\"mt\"><strong>2,58 Mds<\/strong> Fuzz<\/span><span class=\"mt\"><strong>161<\/strong> tests PASS<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:96%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('igw')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-012 \u00b7 M27<\/span><span class=\"badge b-ok\">94 \/ 100<\/span><\/div>\n        <div class=\"mod-name\">InterfaceGateway\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>75\/77<\/strong> Frama-C WP<\/span><span class=\"mt\"><strong>~985M<\/strong> Fuzz<\/span><span class=\"mt\"><strong>40<\/strong> tests PASS<\/span><span class=\"mt\">non-escalade prouv\u00e9e<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:94%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('aegis')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-013 \u00b7 AEGIS\u2122<\/span><span class=\"badge b-ok\">94 \/ 100<\/span><\/div>\n        <div class=\"mod-name\">AEGIS\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>596\/640<\/strong> Frama-C WP<\/span><span class=\"mt\"><strong>75\/75<\/strong> tests<\/span><span class=\"mt\"><strong>19,84 Mds<\/strong> Fuzz \u2705<\/span><span class=\"mt\">TLA+ [E1\u2013E8]<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:94%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('atlas')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-014 \u00b7 ATLAS\u2122<\/span><span class=\"badge b-ok\">97 \/ 100<\/span><\/div>\n        <div class=\"mod-name\">ATLAS\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>366\/366<\/strong> Frama-C WP<\/span><span class=\"mt\"><strong>89\/89<\/strong> tests<\/span><span class=\"mt\"><strong>19,84 Mds<\/strong> Fuzz v2 \u2705<\/span><span class=\"mt\">TLA+ [A1\u2013A6]<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:97%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-tcb\" onclick=\"openDetail('m24')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-015 \u00b7 M24<\/span><span class=\"badge b-100\">100 \/ 100 \u2605<\/span><\/div>\n        <div class=\"mod-name\">Offline Controller\u2122 V16.4.48<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>13<\/strong> props CBMC<\/span><span class=\"mt\">0 failed<\/span><span class=\"mt\">Bug P-M2 corrig\u00e9<\/span><span class=\"mt\">halt_path <strong>3,02 ns<\/strong><\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--tcb)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- MTD & R\u00e9silience -->\n  <div class=\"layer\" id=\"ly-mtd\">\n    <div class=\"layer-head\" style=\"margin-top:10px\"><span class=\"pill p-mtd\">MTD \u00b7 R\u00e9silience \u00b7 CI\/CD Guard \u00b7 Sandbox \u00b7 v8.1<\/span><span class=\"lline\"><\/span><\/div>\n    <div class=\"mods\">\n      <div class=\"mod c-mtd\" onclick=\"openDetail('cms')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-016 \u00b7 CMS<\/span><span class=\"badge b-100\">100 \/ 100 \u2605<\/span><\/div>\n        <div class=\"mod-name\">CORTEX MORPHIC SHIELD\u2122<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>60\/60<\/strong> CBMC (P01\u2013P60)<\/span><span class=\"mt\"><strong>23<\/strong> Isabelle<\/span><span class=\"mt\"><strong>~125 Mds+<\/strong> Fuzz \u2705<\/span><span class=\"mt\"><strong>161<\/strong> tests<\/span><span class=\"mt\">+9 CEM brut<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--mtd)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('mirrorlab')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-033 \u00b7 MIRRORLAB\u2122<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">MIRRORLAB\u2122 v1.2<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>77<\/strong> tests PASS<\/span><span class=\"mt\">0 FAIL<\/span><span class=\"mt\"><strong>1,49 Mds<\/strong> Fuzz \u2705<\/span><span class=\"mt\">ML-07 6\/6 BLOCKED<\/span><span class=\"mt\">4 extensions<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n      <div class=\"mod c-sec\" onclick=\"openDetail('morphgates')\">\n        <div class=\"mod-head\"><span class=\"mod-id\">EVAL-034 \u00b7 MORPH GATES\u2122<\/span><span class=\"badge b-ok\">100 %<\/span><\/div>\n        <div class=\"mod-name\">MORPH GATES\u2122 v1.0<\/div>\n        <div class=\"metrics\"><span class=\"mt\"><strong>16<\/strong> tests PASS<\/span><span class=\"mt\">0 FAIL<\/span><span class=\"mt\">Tampering d\u00e9tect\u00e9<\/span><span class=\"mt\">FAIL-CLOSED<\/span><span class=\"mt\">Ed25519 MorphProof<\/span><\/div>\n        <div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:100%;background:var(--sec)\"><\/div><\/div>\n        <span class=\"hint\">Voir d\u00e9tails \u2197<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- Chart -->\n  <div class=\"chart-sec\">\n    <div class=\"chart-title\">Scores par module \u2014 vue comparative \u00b7 15 modules v8.1<\/div>\n    <div class=\"legend\">\n      <span class=\"leg\"><span class=\"leg-dot\" style=\"background:var(--tcb)\"><\/span>TCB<\/span>\n      <span class=\"leg\"><span class=\"leg-dot\" style=\"background:var(--safe)\"><\/span>Safety-Critical<\/span>\n      <span class=\"leg\"><span class=\"leg-dot\" style=\"background:var(--sec)\"><\/span>S\u00e9curit\u00e9 &amp; Orchestration<\/span>\n      <span class=\"leg\"><span class=\"leg-dot\" style=\"background:var(--mtd)\"><\/span>MTD &amp; R\u00e9silience<\/span>\n      <span class=\"leg\"><span class=\"leg-dot\" style=\"background:#D85A30\"><\/span>En cours<\/span>\n    <\/div>\n    <div class=\"chart-wrap\"><canvas id=\"mainChart\"><\/canvas><\/div>\n  <\/div>\n \n  <div class=\"disclaimer\">Les pourcentages d&rsquo;avancement sont des estimations internes bas\u00e9es sur le ratio preuves existantes \/ jalons requis. Ils ne constituent pas un engagement contractuel. v8.1 \u00b7 16 mars 2026 \u00b7 AVA-VAN-001 v1.5 \u00b7 Score CEM 57\/57 normalis\u00e9 \u00b7 66\/57 brut.<\/div>\n<\/div>\n \n<div class=\"overlay\" id=\"overlay\" onclick=\"closeDetail()\"><\/div>\n<div class=\"detail-panel\" id=\"detailPanel\">\n  <div class=\"dp-header\">\n    <div>\n      <div class=\"dp-meta\" id=\"dp-meta\"><\/div>\n      <div class=\"dp-name\" id=\"dp-name\"><\/div>\n    <\/div>\n    <div style=\"display:flex;align-items:center;gap:10px\">\n      <div class=\"dp-score\" id=\"dp-score\"><\/div>\n      <button class=\"dp-close\" onclick=\"closeDetail()\">\u00d7<\/button>\n    <\/div>\n  <\/div>\n  <div class=\"dp-body\" id=\"dp-body\"><\/div>\n<\/div>\n \n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\n<script>\n(function(){\nvar MODS = {\n  omega:{meta:'EVAL-001 \u00b7 M10 \u00b7 Couche TCB',name:'OMEGA\u2122 PolicyForge',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'161\/161',sub:'100 % annotations'},{lbl:'Lemmes Isabelle',val:'167',sub:'0 sorry'},{lbl:'Th\u00e9or\u00e8mes Coq',val:'12',sub:'prouv\u00e9s'},{lbl:'Tests',val:'171',sub:'PASS'}],tools:[{name:'Frama-C \/ WP',pct:100,label:'161\/161 (100%)',color:'#534AB7'},{name:'Tests fonctionnels',pct:100,label:'171 \/ 171 PASS',color:'#0F6E56'},{name:'Isabelle\/HOL',pct:100,label:'167 lemmes \u2014 0 sorry',color:'#0F6E56'},{name:'Coq \/ Rocq',pct:100,label:'12 th\u00e9or\u00e8mes PASS',color:'#0F6E56'}],radar:{labels:['Preuve formelle\\n(WP)','Tests\\nfonctionnels','Isabelle\\n\/HOL','Coq\\n\/Rocq','DTE\\ncomplet'],data:[100,100,100,100,100],color:'#534AB7'},status:[{icon:'\u2726',cls:'si-tcb',title:'DTE v8.0 complet',sub:'Document technique \u2014 100 % couvert'},{icon:'\u2713',cls:'si-ok',title:'161\/161 WP v\u00e9rifi\u00e9es',sub:'Toutes les annotations Frama-C prouv\u00e9es'},{icon:'\u2713',cls:'si-ok',title:'0 sorry Isabelle',sub:'167 lemmes sans axiome non prouv\u00e9'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  prism:{meta:'EVAL-002 \u00b7 M02 \u00b7 Couche TCB',name:'PRISM\u2122 v43',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'281\/281',sub:'100 % annotations'},{lbl:'Lemmes Isabelle',val:'215',sub:'0 sorry'},{lbl:'Th\u00e9or\u00e8mes Coq',val:'23',sub:'prouv\u00e9s'},{lbl:'Fuzzing',val:'~30,4 M',sub:'Run1+Run2 \u2705 \u00b7 0 crash'}],tools:[{name:'Frama-C \/ WP',pct:100,label:'281\/281 (100%)',color:'#534AB7'},{name:'Tests fonctionnels',pct:100,label:'63 \/ 63 PASS',color:'#0F6E56'},{name:'Isabelle\/HOL',pct:100,label:'215 lemmes \u2014 0 sorry',color:'#0F6E56'},{name:'Coq \/ Rocq',pct:100,label:'23 th\u00e9or\u00e8mes PASS',color:'#0F6E56'},{name:'Fuzzing',pct:100,label:'~30,4 M \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['Preuve formelle\\n(WP)','Tests\\nfonctionnels','Isabelle\\n\/HOL','Coq\\n\/Rocq','Fuzzing'],data:[100,100,100,100,100],color:'#534AB7'},status:[{icon:'\u2726',cls:'si-tcb',title:'DTE complet v4.0',sub:'281 work packages v\u00e9rifi\u00e9s \u2014 100 %'},{icon:'\u2713',cls:'si-ok',title:'0 sorry Isabelle',sub:'215 lemmes \u2014 aucun axiome non prouv\u00e9'},{icon:'\u2713',cls:'si-ok',title:'~30,4 M fuzzing \u2705',sub:'Run1 ~20M + Run2 10,4M \u00b7 0 crash'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  m00:{meta:'EVAL-003 \u00b7 M00 \u00b7 TCB \u2014 EN COURS',name:'Root of Trust',score:'85 %',scoreClass:'b-wip',kpis:[{lbl:'Frama-C \/ WP',val:'714\/714',sub:'100 % annotations'},{lbl:'Isabelle\/HOL',val:'477',sub:'lemmes prouv\u00e9s'},{lbl:'Coq \/ Rocq',val:'490',sub:'th\u00e9or\u00e8mes'},{lbl:'Fuzzing Run1',val:'1,83 Mds',sub:'\u2705 0 crash \u00b7 Run2 \u23f3 17\/03'}],tools:[{name:'Frama-C \/ WP',pct:100,label:'714\/714 (100%)',color:'#534AB7'},{name:'Isabelle\/HOL',pct:100,label:'477 lemmes \u2014 0 sorry',color:'#0F6E56'},{name:'Coq \/ Rocq',pct:100,label:'490 th\u00e9or\u00e8mes PASS',color:'#0F6E56'},{name:'libFuzzer Run1',pct:100,label:'1,83 Mds \u2705 \u00b7 0 crash',color:'#0F6E56'},{name:'libFuzzer Run2',pct:60,label:'\u23f3 en cours \u2014 fin 17\/03',color:'#D85A30'},{name:'ATE_IND.2',pct:0,label:'Planifi\u00e9',color:'#9e9b98'}],radar:{labels:['Preuve formelle\\n(WP)','Isabelle\\n\/HOL','Coq\\n\/Rocq','Fuzzing\\nRun1 \u2705','seL4\\nsprints'],data:[100,100,100,100,85],color:'#D85A30'},status:[{icon:'\u2713',cls:'si-ok',title:'714\/714 WP v\u00e9rifi\u00e9es',sub:'Record du programme \u2014 plus grand DTE'},{icon:'\u2713',cls:'si-ok',title:'Bugs P-M00-1 & P-M00-2 corrig\u00e9s',sub:'Trouv\u00e9s et corrig\u00e9s lors des preuves formelles'},{icon:'\u2713',cls:'si-ok',title:'Run1 : 1,83 Mds \u2705',sub:'0 crash \u00b7 slow-unit 1157s qualifi\u00e9 (FAIL-CLOSED)'},{icon:'\u2699',cls:'si-warn',title:'Run2 libFuzzer \u23f3 fin 17\/03',sub:'48h \u00b7 r\u00e9sultats attendus ~14h le 17\/03'}],gap:{points:15,text:'<b>libFuzzer Run2<\/b> \u2014 campagne 48h en cours, fin pr\u00e9vue 17\/03 ~14h.<br><b>ATE_IND.2 (CESTI)<\/b> \u2014 audit tiers ind\u00e9pendant \u00e0 planifier.'}},\n  m09:{meta:'EVAL-005 \u00b7 M09 \u00b7 Safety-Critical',name:'CircuitBreaker\u2122',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Props CBMC',val:'463',sub:'propri\u00e9t\u00e9s v\u00e9rifi\u00e9es'},{lbl:'Tests PASS',val:'59\/59',sub:'fonctionnels + robustesse'},{lbl:'Fuzzing',val:'2,379 Mds',sub:'record absolu \u00b7 0 crash'},{lbl:'Fault Injection',val:'9\/9',sub:'FI PASS'}],tools:[{name:'CBMC',pct:100,label:'463 propri\u00e9t\u00e9s (100%)',color:'#854F0B'},{name:'Tests fonctionnels',pct:100,label:'59 \/ 59 PASS',color:'#0F6E56'},{name:'Fuzzing run2 24h',pct:100,label:'2,379 Mds \u2014 0 crash \u2605 record',color:'#0F6E56'},{name:'Fault Injection',pct:100,label:'9\/9 PASS',color:'#0F6E56'},{name:'Endurance',pct:100,label:'100 000 cycles',color:'#0F6E56'}],radar:{labels:['CBMC\\nprops','Tests\\nfonct.','Fuzzing\\nrobust.','Fault\\nInjection','Endurance'],data:[100,100,100,100,100],color:'#854F0B'},status:[{icon:'\u2713',cls:'si-ok',title:'463 propri\u00e9t\u00e9s CBMC',sub:'P1\u2013P8 toutes v\u00e9rifi\u00e9es \u2014 0 failed'},{icon:'\u2605',cls:'si-tcb',title:'2,379 Mds fuzzing \u2014 record absolu',sub:'24h run2 \u00b7 0 crash \u00b7 record programme'},{icon:'\u2713',cls:'si-ok',title:'Endurance 100K cycles',sub:'Stabilit\u00e9 long terme valid\u00e9e'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  sentinel:{meta:'EVAL-006 \u00b7 M01 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'SENTINEL\u2122 v8',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Props CBMC',val:'1 291',sub:'propri\u00e9t\u00e9s v\u00e9rifi\u00e9es'},{lbl:'Lemmes Isabelle',val:'22',sub:'0 sorry'},{lbl:'Tests EAL',val:'220',sub:'PASS'},{lbl:'Couverture',val:'96,3%',sub:'r\u00e9gion \u00b7 100% ligne'}],tools:[{name:'CBMC',pct:100,label:'1 291 props (100%)',color:'#0F6E56'},{name:'Isabelle\/HOL',pct:100,label:'22 lemmes \u2014 0 sorry',color:'#0F6E56'},{name:'Tests EAL',pct:100,label:'220 \/ 220 PASS',color:'#0F6E56'},{name:'Fuzzing',pct:100,label:'~1,9 Md entr\u00e9es \u2014 0 crash',color:'#0F6E56'},{name:'MC\/DC',pct:100,label:'58 tests PASS',color:'#0F6E56'}],radar:{labels:['CBMC\\nprops','Isabelle\\n\/HOL','Tests\\nEAL','Fuzzing\\n(Fuzz)','MC\/DC\\ncov.'],data:[100,100,100,100,96],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'1 291 propri\u00e9t\u00e9s CBMC',sub:'Nombre le plus \u00e9lev\u00e9 hors CMS'},{icon:'\u2713',cls:'si-ok',title:'~1,9 milliard entr\u00e9es fuzz',sub:'0 crash \u00b7 0 hang \u2014 robustesse maximale'},{icon:'\u2713',cls:'si-ok',title:'0 sorry Isabelle',sub:'22 lemmes enti\u00e8rement prouv\u00e9s'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  walldome:{meta:'EVAL-007 \u00b7 WALL-DOME\u2122 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'WALL-DOME\u2122',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'156\/156',sub:'100 % annotations'},{lbl:'Fuzzing',val:'25,23 Mds',sub:'0 crash \u00b7 0 hang'},{lbl:'Tests',val:'89\/89',sub:'PASS'},{lbl:'Outils formels',val:'6',sub:'Frama-C, CBMC, ProVerif, Z3, TLA+, Why3'}],tools:[{name:'Frama-C \/ WP',pct:100,label:'156\/156 (100%)',color:'#0F6E56'},{name:'CBMC',pct:100,label:'231 propri\u00e9t\u00e9s',color:'#0F6E56'},{name:'ProVerif',pct:100,label:'5\/5 PASS',color:'#0F6E56'},{name:'Z3 \/ TLA+',pct:100,label:'10\/10 \u00b7 1 480 \u00e9tats',color:'#0F6E56'},{name:'Why3',pct:100,label:'26\/26 PASS',color:'#0F6E56'},{name:'Fuzzing',pct:100,label:'25,23 Mds \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['Frama-C\\n\/WP','CBMC','ProVerif\\n\/Z3','TLA+\\n\/Why3','Fuzzing'],data:[100,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2726',cls:'si-tcb',title:'6 outils formels distincts',sub:'Record de diversit\u00e9 outillage du programme'},{icon:'\u2713',cls:'si-ok',title:'25,23 milliards entr\u00e9es fuzz',sub:'Campagne la plus longue \u2014 0 crash'},{icon:'\u2713',cls:'si-ok',title:'TLA+ 1 480 \u00e9tats v\u00e9rifi\u00e9s',sub:'Mod\u00e8le de comportement prouv\u00e9 exhaustivement'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  trustlink:{meta:'EVAL-009 \u00b7 M11 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'TrustLink\u2122',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'373\/379',sub:'98,4 % annotations'},{lbl:'Props CBMC',val:'752',sub:'v\u00e9rifi\u00e9es'},{lbl:'Tests',val:'237',sub:'PASS'},{lbl:'Couverture',val:'95%',sub:'code coverage'}],tools:[{name:'Frama-C \/ WP',pct:98,label:'373\/379 (98,4%)',color:'#854F0B'},{name:'CBMC',pct:100,label:'752 propri\u00e9t\u00e9s',color:'#0F6E56'},{name:'Isabelle\/HOL',pct:100,label:'20 lemmes',color:'#0F6E56'},{name:'Tests fonctionnels',pct:100,label:'237 \/ 237 PASS',color:'#0F6E56'},{name:'Fuzzing',pct:100,label:'403M entr\u00e9es \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['Frama-C\\n\/WP','CBMC\\nprops','Isabelle\\n\/HOL','Tests\\nfonct.','Fuzzing'],data:[98,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'752 propri\u00e9t\u00e9s CBMC',sub:'V\u00e9rification exhaustive des invariants'},{icon:'\u2713',cls:'si-ok',title:'403M entr\u00e9es fuzz',sub:'0 crash \u2014 robustesse confirm\u00e9e'},{icon:'\u26a0',cls:'si-warn',title:'6\/379 WP ouvertes',sub:'CFVL-EVAL-009 v3.0 \u2014 98,4% v\u00e9rifi\u00e9s'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:null},\n  avacpl:{meta:'EVAL-011 \u00b7 M26 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'AVA-CPL\u2122',score:'96 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'267\/282',sub:'94,7 % annotations'},{lbl:'Isabelle',val:'100',sub:'th\u00e9or\u00e8mes \u2014 0 Admitted'},{lbl:'Fuzzing',val:'2,58 Mds',sub:'0 crash'},{lbl:'Tests',val:'161',sub:'PASS'}],tools:[{name:'Frama-C \/ WP',pct:95,label:'267\/282 (94,7%)',color:'#854F0B'},{name:'Isabelle (0 Admitted)',pct:100,label:'100 th\u00e9or\u00e8mes',color:'#0F6E56'},{name:'Tests fonctionnels',pct:100,label:'161 \/ 161 PASS',color:'#0F6E56'},{name:'Fuzzing',pct:100,label:'2,58 Mds \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['Frama-C\\n\/WP','Isabelle','Tests\\nfonct.','Fuzzing','ATE_IND.2'],data:[95,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'100 th\u00e9or\u00e8mes Isabelle',sub:'0 Admitted \u2014 preuves enti\u00e8rement v\u00e9rifi\u00e9es'},{icon:'\u2713',cls:'si-ok',title:'2,58 milliards fuzz',sub:'0 crash \u2014 robustesse maximale'},{icon:'\u25b3',cls:'si-warn',title:'15\/282 WP ouvertes',sub:'94,7% v\u00e9rifi\u00e9s \u2014 15 annotations restantes'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:{points:4,text:'<b>15 annotations Frama-C\/WP restantes<\/b> \u2014 cl\u00f4ture pr\u00e9vue au prochain sprint.'}},\n  igw:{meta:'EVAL-012 \u00b7 M27 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'InterfaceGateway\u2122',score:'94 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'75 \/ 77',sub:'97,4 % des annotations'},{lbl:'Fuzzing',val:'~985M',sub:'0 crash \u00b7 0 hang'},{lbl:'Tests PASS',val:'40 \/ 40',sub:'33 fonctionnels + 7 robustesse'},{lbl:'Non-escalade',val:'Prouv\u00e9e',sub:'propri\u00e9t\u00e9 cl\u00e9 d\u00e9montr\u00e9e'}],tools:[{name:'Frama-C \/ WP',pct:97,label:'75\/77 (97,4%)',color:'#854F0B'},{name:'Tests fonctionnels',pct:100,label:'33 \/ 33 PASS',color:'#0F6E56'},{name:'Tests robustesse',pct:100,label:'7 \/ 7 PASS',color:'#0F6E56'},{name:'Fuzzing (corpus)',pct:100,label:'~985M \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['Preuve formelle\\n(WP)','Tests\\nfonctionnels','Robustesse\\n(Fuzz)','Propri\u00e9t\u00e9s\\nde s\u00e9curit\u00e9','Tests\\nrobustesse'],data:[97,100,98,100,100],color:'#0F6E56'},status:[{icon:'\u2726',cls:'si-tcb',title:'Non-escalade de privil\u00e8ges',sub:\"Preuve formelle \u2014 aucune interface ne peut \u00e9lever les droits\"},{icon:'\u2713',cls:'si-ok',title:'0 crash sur ~985M entr\u00e9es',sub:'Robustesse aux entr\u00e9es malform\u00e9es confirm\u00e9e'},{icon:'\u2713',cls:'si-ok',title:'40 \/ 40 tests PASS',sub:'33 fonctionnels + 7 robustesse \u2014 0 r\u00e9gression'},{icon:'\u25b3',cls:'si-warn',title:'2 annotations WP ouvertes',sub:'75\/77 v\u00e9rifi\u00e9es \u2014 2 contrats restants'}],gap:{points:6,text:'<b>WP (2\/77 ouvertes)<\/b> \u2014 cl\u00f4turer les 2 annotations Frama-C.<br><b>ATE_IND.2 (CESTI)<\/b> \u2014 audit tiers planifi\u00e9.'}},\n  aegis:{meta:'EVAL-013 \u00b7 AEGIS\u2122 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'AEGIS\u2122',score:'94 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'596\/640',sub:'93,1 % annotations'},{lbl:'Tests PASS',val:'75\/75',sub:'fonctionnels'},{lbl:'Fuzzing',val:'19,84 Mds',sub:'\u2705 0 crash \u00b7 0 slow-unit'},{lbl:'TLA+',val:'[E1\u2013E8]',sub:'\u00e9tats v\u00e9rifi\u00e9s'}],tools:[{name:'Frama-C \/ WP',pct:93,label:'596\/640 (93,1%)',color:'#854F0B'},{name:'Tests fonctionnels',pct:100,label:'75 \/ 75 PASS',color:'#0F6E56'},{name:'Fuzzing 24h',pct:100,label:'19,84 Mds \u2014 0 crash',color:'#0F6E56'},{name:'TLA+',pct:100,label:'[E1\u2013E8] v\u00e9rifi\u00e9s',color:'#0F6E56'},{name:'Fail-closed',pct:100,label:'Universel \u2014 prouv\u00e9',color:'#534AB7'}],radar:{labels:['Frama-C\\n\/WP','Tests\\nfonct.','TLA+\\n[E1\u2013E8]','Fail-closed\\nuniversel','Fuzzing\\n19,84 Mds'],data:[93,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2726',cls:'si-tcb',title:'Fail-closed universel',sub:\"Aucun \u00e9tat d'\u00e9chec ne peut r\u00e9sulter en syst\u00e8me ouvert\"},{icon:'\u2713',cls:'si-ok',title:'75\/75 tests PASS',sub:'Couverture fonctionnelle compl\u00e8te'},{icon:'\u2713',cls:'si-ok',title:'19,84 Mds fuzzing \u2705',sub:'AegisCannotActWithoutOmega prouv\u00e9 \u00b7 0 crash'},{icon:'\u25b3',cls:'si-warn',title:'44\/640 WP ouvertes',sub:'93,1% v\u00e9rifi\u00e9s \u2014 44 annotations restantes'}],gap:{points:6,text:'<b>44 annotations Frama-C restantes<\/b> (640 total) \u2014 cl\u00f4ture pr\u00e9vue prochain sprint.<br><b>ATE_IND.2 (CESTI)<\/b> \u2014 audit tiers ind\u00e9pendant.'}},\n  atlas:{meta:'EVAL-014 \u00b7 ATLAS\u2122 \u00b7 S\u00e9curit\u00e9 & Orchestration',name:'ATLAS\u2122',score:'97 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Frama-C \/ WP',val:'366\/366',sub:'100 % annotations'},{lbl:'Tests PASS',val:'89\/89',sub:'fonctionnels'},{lbl:'Fuzzing v2',val:'19,84 Mds',sub:'\u2705 0 crash (v1 crash corrig\u00e9)'},{lbl:'TLA+ \/ CBMC',val:'628 props',sub:'[A1\u2013A6] \u00b7 6 propri\u00e9t\u00e9s TLA+'}],tools:[{name:'Frama-C \/ WP',pct:100,label:'366\/366 (100%)',color:'#0F6E56'},{name:'Tests fonctionnels',pct:100,label:'89 \/ 89 PASS',color:'#0F6E56'},{name:'Fuzzing v2 24h',pct:100,label:'19,84 Mds \u2014 0 crash',color:'#0F6E56'},{name:'TLA+ [A1\u2013A6]',pct:100,label:'6 propri\u00e9t\u00e9s v\u00e9rifi\u00e9es',color:'#0F6E56'},{name:'CBMC',pct:100,label:'628 props (v2)',color:'#0F6E56'}],radar:{labels:['Frama-C\\n\/WP','Tests\\nfonct.','TLA+\\n[A1\u2013A6]','CBMC\\n628 props','Fuzzing\\nv2 19,84 Mds'],data:[100,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'366\/366 WP v\u00e9rifi\u00e9es',sub:'Couverture formelle 100 %'},{icon:'\u2605',cls:'si-tcb',title:'19,84 Mds fuzzing v2 \u2705',sub:'v1 : 1 crash trouv\u00e9 \u2192 corrig\u00e9. v2 : 0 crash sur 19,84 Mds'},{icon:'\u2713',cls:'si-ok',title:'628 propri\u00e9t\u00e9s CBMC',sub:'v2 revalid\u00e9 apr\u00e8s correction crash v1'},{icon:'\u2713',cls:'si-ok',title:'ATE_IND.2 (CESTI)',sub:'Audit tiers ind\u00e9pendant \u2014 100 %'}],gap:{points:3,text:'<b>ATLAS v1 crash corrig\u00e9<\/b> \u2014 v2 compl\u00e8tement valid\u00e9 : 19,84 Mds \u00b7 0 crash.<br><b>3 v\u00e9rifications inter-module restantes (23\/26)<\/b>.'}},\n  m24:{meta:'EVAL-015 \u00b7 M24 \u00b7 Hors-TCB L1b',name:'Offline Controller\u2122 V16.4.48',score:'100 \/ 100 \u2605',scoreClass:'b-100',kpis:[{lbl:'Props CBMC \u00a77',val:'13',sub:'0 failed'},{lbl:'halt_path',val:'3,02 ns',sub:'corrig\u00e9 \u00f79 \u00b7 \u00e9tait 28,1 ns'},{lbl:'Fuzzer',val:'0 crash',sub:'standalone C'},{lbl:'Score',val:'100\/100',sub:'score parfait \u2605'}],tools:[{name:'CBMC \u00a77',pct:100,label:'13\/13 propri\u00e9t\u00e9s \u2014 0 failed',color:'#534AB7'},{name:'Fuzzer standalone',pct:100,label:'0 crash \u2014 0 hang',color:'#0F6E56'},{name:'halt_path benchmark',pct:100,label:'3,02 ns (\u00f79 corrig\u00e9)',color:'#0F6E56'},{name:'ATE_IND.2',pct:100,label:'CESTI \u2014 100 %',color:'#0F6E56'}],radar:{labels:['CBMC\\n\u00a77','Fuzzer\\nstandalone','halt_path\\n3,02 ns','Bug\\ncorrig\u00e9','Score\\n100\/100'],data:[100,100,100,100,100],color:'#534AB7'},status:[{icon:'\u2605',cls:'si-tcb',title:'Score parfait 100\/100',sub:'Seul module avec score parfait et bug r\u00e9el corrig\u00e9'},{icon:'\u2726',cls:'si-tcb',title:'Bug P-M2 trouv\u00e9 via CBMC',sub:'m24_restore() \u2014 FAIL-CLOSED invariant \u2014 corrig\u00e9'},{icon:'\u2713',cls:'si-ok',title:'halt_path 3,02 ns',sub:'Corrig\u00e9 \u00f79 vs benchmark v8.0 (\u00e9tait 28,1 ns)'},{icon:'\u2713',cls:'si-ok',title:'Fuzzer standalone \u2014 0 crash',sub:'Campagne exhaustive \u2014 robustesse maximale'}],gap:null},\n  cms:{meta:'EVAL-016 \u00b7 CMS \u00b7 MTD & R\u00e9silience \u00b7 NOUVEAU v8.1',name:'CORTEX MORPHIC SHIELD\u2122',score:'100 \/ 100 \u2605',scoreClass:'b-100',kpis:[{lbl:'CBMC (P01\u2013P60)',val:'60\/60',sub:'0 failed \u2014 exhaustif'},{lbl:'Fuzzing total',val:'~125 Mds+',sub:'Phase1 122 Mds + Phase2 3,37 Mds'},{lbl:'Tests PASS',val:'161\/161',sub:'fonctionnels'},{lbl:'Isabelle',val:'23',sub:'th\u00e9or\u00e8mes \u00b7 0 sorry'}],tools:[{name:'CBMC P01\u2013P60',pct:100,label:'60\/60 \u2014 0 failed',color:'#5B2D8E'},{name:'Isabelle\/HOL',pct:100,label:'23 th\u00e9or\u00e8mes \u2014 0 sorry',color:'#0F6E56'},{name:'Tests fonctionnels',pct:100,label:'161 \/ 161 PASS',color:'#0F6E56'},{name:'Fuzzing Phase1',pct:100,label:'122 Mds \u2014 0 crash',color:'#0F6E56'},{name:'Fuzzing Phase2 libFuzzer',pct:100,label:'~3,37 Mds \u2014 0 crash',color:'#0F6E56'}],radar:{labels:['CBMC\\nP01\u2013P60','Isabelle\\nHOL','Tests\\nfonct.','Fuzzing\\n~125 Mds+','CEM\\n+9 pts'],data:[100,100,100,100,100],color:'#5B2D8E'},status:[{icon:'\u2726',cls:'si-mtd',title:'Moving Target Defence',sub:'Fisher-Yates \u00b7 rotation IP\/port <30s \u00b7 16 sous-syst\u00e8mes \u00b7 7258 LOC'},{icon:'\u2605',cls:'si-tcb',title:'CBMC 60\/60 PASS',sub:'P01\u2013P60 : rotation, HMAC, FSM, ring buffer, honeypots, anti-replay'},{icon:'\u2713',cls:'si-ok',title:'~125 Mds+ fuzzing \u00b7 0 crash',sub:'Phase1 interne + Phase2 libFuzzer 24h \u00b7 ASan+UBSan'},{icon:'\u2726',cls:'si-mtd',title:'+9 pts CEM brut',sub:'Score CEM : 57\/57 normalis\u00e9 \u00b7 66\/57 brut \u00b7 VUL-009\u2192012 NON EXPLOIT'}],gap:null},\n  mirrorlab:{meta:'EVAL-033 \u00b7 MIRRORLAB\u2122 \u00b7 MTD &#038; R\u00e9silience \u00b7 v8.1',name:'MIRRORLAB\u2122 v1.2',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Tests PASS',val:'77\/77',sub:'ML-01 \u00e0 ML-07'},{lbl:'Fuzzing',val:'1,49 Mds',sub:'24h \u00b7 0 crash'},{lbl:'Hostile Audit',val:'6\/6',sub:'ML-07 BLOCKED'},{lbl:'Extensions',val:'4',sub:'M24+Quar.+Replay+Factory'}],tools:[{name:'Tests ML-01\u2192ML-07',pct:100,label:'77 \/ 77 PASS',color:'#0F6E56'},{name:'Fuzzing 24h',pct:100,label:'1,49 Mds \u2014 0 crash',color:'#0F6E56'},{name:'ML-07 Hostile Audit',pct:100,label:'6\/6 BLOCKED',color:'#0F6E56'},{name:'Extension offline_bridge',pct:100,label:'M24 \u2192 MIRRORLAB \u2192 attest.',color:'#0F6E56'}],radar:{labels:['Tests\\nML-01\u219207','Fuzzing\\n1,49 Mds','Hostile\\nAudit 6\/6','Extensions\\n4 modules','Neutralit\u00e9\\nDUR-03'],data:[100,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'77\/77 tests PASS \u00b7 0 FAIL',sub:'Campagne compl\u00e8te ML-01 \u00e0 ML-07'},{icon:'\u2726',cls:'si-tcb',title:'ML-07 Hostile Audit 6\/6 BLOCKED',sub:'Aucune fuite vers production \u2014 isolation totale'},{icon:'\u2713',cls:'si-ok',title:'1,49 Mds fuzzing \u00b7 0 crash',sub:'Campagne 24h \u00b7 ASan+UBSan \u00b7 DUR-03 \u2705'},{icon:'\u2713',cls:'si-ok',title:'4 extensions v1.2',sub:'quarantine_capsule \u00b7 offline_bridge \u00b7 replay \u00b7 factory'}],gap:null},\n  morphgates:{meta:'EVAL-034 \u00b7 MORPH GATES\u2122 \u00b7 MTD &#038; R\u00e9silience \u00b7 v8.1',name:'MORPH GATES\u2122 v1.0',score:'100 \/ 100',scoreClass:'b-ok',kpis:[{lbl:'Tests PASS',val:'16\/16',sub:'0 FAIL'},{lbl:'Tampering',val:'D\u00e9tect\u00e9',sub:'syst\u00e9matique \u00b7 100%'},{lbl:'Architecture',val:'FAIL-CLOSED',sub:'pipeline bloqu\u00e9'},{lbl:'Signature',val:'Ed25519',sub:'bundle MorphProof'}],tools:[{name:'Tests pipeline',pct:100,label:'16 \/ 16 PASS',color:'#0F6E56'},{name:'Tampering detection',pct:100,label:'100% d\u00e9tect\u00e9 \u2014 syst\u00e9matique',color:'#0F6E56'},{name:'FAIL-CLOSED',pct:100,label:'Architecture \u2014 blocage pipeline',color:'#534AB7'},{name:'Ed25519 MorphProof',pct:100,label:'Bundle sign\u00e9 \u00b7 INV-005',color:'#0F6E56'},{name:'Fuzzing 24h',pct:100,label:'0 crash',color:'#0F6E56'}],radar:{labels:['Tests\\npipeline','Tampering\\nd\u00e9tect\u00e9','FAIL-CLOSED\\narch.','Ed25519\\nMorphProof','Fuzzing\\n24h'],data:[100,100,100,100,100],color:'#0F6E56'},status:[{icon:'\u2713',cls:'si-ok',title:'16\/16 tests PASS \u00b7 0 FAIL',sub:'Tous les cas de pipeline test\u00e9s'},{icon:'\u2726',cls:'si-tcb',title:'Tampering d\u00e9tect\u00e9 syst\u00e9matiquement',sub:'INV-005 \u00b7 int\u00e9grit\u00e9 cha\u00eene PRISM'},{icon:'\u2713',cls:'si-ok',title:'FAIL-CLOSED architecture',sub:'Pipeline bloqu\u00e9 sur toute anomalie d\u00e9tect\u00e9e'},{icon:'\u2713',cls:'si-ok',title:'Ed25519 bundle MorphProof',sub:'Signature cryptographique de chaque run'}],gap:null}\n};\n \nvar radarChart=null;\nwindow.openDetail=function(id){\n  var d=MODS[id]; if(!d) return;\n  document.getElementById('dp-meta').textContent=d.meta;\n  document.getElementById('dp-name').textContent=d.name;\n  var sc=document.getElementById('dp-score');\n  sc.textContent=d.score; sc.className='dp-score badge '+d.scoreClass;\n  var html='';\n  html+='<div class=\"dp-kpis\">';\n  d.kpis.forEach(function(k){html+='<div class=\"dp-kpi\"><div class=\"dp-kpi-lbl\">'+k.lbl+'<\/div><div class=\"dp-kpi-val\"'+(k.color?' style=\"color:'+k.color+'\"':'')+'>'+k.val+'<\/div><div class=\"dp-kpi-sub\">'+k.sub+'<\/div><\/div>';});\n  html+='<\/div>';\n  html+='<div class=\"dp-sec-title\">Outils de v\u00e9rification<\/div>';\n  d.tools.forEach(function(t){html+='<div class=\"tool-row\"><span class=\"tool-name\">'+t.name+'<\/span><div class=\"tool-bar\"><div class=\"tool-fill\" style=\"width:'+t.pct+'%;background:'+t.color+'\"><\/div><\/div><span class=\"tool-val\">'+t.label+'<\/span><\/div>';});\n  html+='<div class=\"dp-sec-title\">Couverture par axe<\/div>';\n  html+='<div class=\"dp-chart-wrap\"><canvas id=\"radarCanvas\"><\/canvas><\/div>';\n  html+='<div class=\"dp-sec-title\">Propri\u00e9t\u00e9s cl\u00e9s<\/div>';\n  html+='<div class=\"status-grid\">';\n  d.status.forEach(function(s){html+='<div class=\"status-card\"><div class=\"status-icon '+s.cls+'\">'+s.icon+'<\/div><div><div class=\"status-title\">'+s.title+'<\/div><div class=\"status-sub\">'+s.sub+'<\/div><\/div><\/div>';});\n  html+='<\/div>';\n  if(d.gap){html+='<div class=\"dp-sec-title\">Jalons restants<\/div><div class=\"gap-alert\">\u26a0 '+d.gap.points+' points manquants pour 100\/100<\/div><p class=\"remain-note\">'+d.gap.text+'<\/p>';}\n  document.getElementById('dp-body').innerHTML=html;\n  if(radarChart){radarChart.destroy();radarChart=null;}\n  setTimeout(function(){\n    var canvas=document.getElementById('radarCanvas');\n    if(!canvas||typeof Chart==='undefined') return;\n    var r=d.radar;\n    radarChart=new Chart(canvas,{type:'radar',data:{labels:r.labels,datasets:[{data:r.data,backgroundColor:hexAlpha(r.color,0.12),borderColor:r.color,borderWidth:1.5,pointBackgroundColor:r.color,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{display:false}},scales:{r:{min:85,max:100,ticks:{stepSize:5,color:'#9e9b98',font:{size:10},backdropColor:'transparent',callback:function(v){return v+'%';}},grid:{color:'rgba(0,0,0,0.07)'},angleLines:{color:'rgba(0,0,0,0.07)'},pointLabels:{color:'#6b6966',font:{size:10}}}}}});\n  },50);\n  document.getElementById('detailPanel').classList.add('open');\n  document.getElementById('overlay').classList.add('open');\n  document.body.style.overflow='hidden';\n};\nwindow.closeDetail=function(){\n  document.getElementById('detailPanel').classList.remove('open');\n  document.getElementById('overlay').classList.remove('open');\n  document.body.style.overflow='';\n};\ndocument.addEventListener('keydown',function(e){if(e.key==='Escape')closeDetail();});\nfunction hexAlpha(hex,a){var r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);return 'rgba('+r+','+g+','+b+','+a+')';}\nwindow.doFilter=function(layer,btn){\n  document.querySelectorAll('.fbtn').forEach(function(b){b.classList.remove('active');});\n  btn.classList.add('active');\n  var map={tcb:'ly-tcb',safe:'ly-safe',sec:'ly-sec',mtd:'ly-mtd'};\n  Object.keys(map).forEach(function(k){document.getElementById(map[k]).classList.toggle('hidden',layer!=='all'&&layer!==k);});\n};\nfunction initMain(){\n  var c=document.getElementById('mainChart');\n  if(!c||typeof Chart==='undefined'){setTimeout(initMain,200);return;}\n  new Chart(c,{\n    type:'bar',\n    data:{\n      labels:['M10 OMEGA','M02 PRISM','M00 RoT','M09 Circuit.','M01 SENTINEL','WALL-DOME','M11 TrustLink','M26 AVA-CPL','M27 IGW','AEGIS\u2122','ATLAS\u2122','M24 OffCtrl','CMS MORPHIC','MIRRORLAB','MORPH GATES'],\n      datasets:[{\n        data:[100,100,85,100,100,100,100,96,94,94,97,100,100,100,100],\n        backgroundColor:['#534AB7','#534AB7','#D85A30','#854F0B','#0F6E56','#0F6E56','#0F6E56','#0F6E56','#0F6E56','#0F6E56','#0F6E56','#534AB7','#5B2D8E','#0F6E56','#0F6E56'],\n        borderRadius:4,barPercentage:0.6\n      }]\n    },\n    options:{\n      indexAxis:'y',responsive:true,maintainAspectRatio:false,\n      plugins:{legend:{display:false},tooltip:{backgroundColor:'#fff',borderColor:'rgba(0,0,0,.12)',borderWidth:1,titleColor:'#1a1a18',bodyColor:'#6b6966',padding:10,callbacks:{label:function(c){return '  Score : '+c.raw+' \/ 100';}}}},\n      scales:{\n        x:{min:0,max:105,ticks:{color:'#9e9b98',font:{size:11},callback:function(v){return v+'%';}},grid:{color:'rgba(0,0,0,0.05)'},border:{display:false}},\n        y:{ticks:{color:'#6b6966',font:{size:11}},grid:{display:false},border:{display:false}}\n      }\n    }\n  });\n}\ninitMain();\n})();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>CORTEX ORIGIN\u2122 \u2014 Solar Defense v3.1<\/title>\n<style>\n*{box-sizing:border-box;margin:0;padding:0}\nbody{background:#f0eeeb;font-family:'JetBrains Mono',monospace;display:flex;flex-direction:column;align-items:center;padding:1.2rem;gap:.8rem}\n.hdr{width:100%;max-width:900px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.5rem}\n.hdr-title{font-size:.62rem;letter-spacing:.22em;color:#6b6966;text-transform:uppercase}\n.hdr-sub{font-size:.46rem;color:#9e9b98;margin-top:2px}\n.hdr-status{display:flex;align-items:center;gap:6px;font-size:.52rem;letter-spacing:.1em}\n.dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}\n@keyframes blink{0%,100%{opacity:1}50%{opacity:.15}}\n.mode-bar{display:flex;gap:.5rem;flex-wrap:wrap;justify-content:center}\n.mbtn{font-family:'JetBrains Mono',monospace;font-size:.55rem;padding:.42rem .95rem;border-radius:4px;cursor:pointer;letter-spacing:.07em;border:1.5px solid;background:transparent;transition:all .2s}\n.mbtn-norm  {border-color:#D97706;color:#D97706}.mbtn-norm.active  {background:#D97706;color:#0d1117;box-shadow:0 0 14px rgba(217,119,6,.5)}\n.mbtn-zd    {border-color:#ef4444;color:#ef4444}.mbtn-zd.active    {background:#ef4444;color:#fff;box-shadow:0 0 14px rgba(239,68,68,.5)}\n.mbtn-exante{border-color:#10b981;color:#10b981}.mbtn-exante.active{background:#10b981;color:#0d1117;box-shadow:0 0 14px rgba(16,185,129,.5)}\n.mbtn-hybrid{border-color:#818cf8;color:#818cf8}.mbtn-hybrid.active{background:#818cf8;color:#0d1117;box-shadow:0 0 14px rgba(129,140,248,.5)}\n.mbtn-ctrl  {border-color:#9e9b98;color:#6b6966}\n.mbtn-ctrl.active{border-color:#6b6966;color:#6b6966}\n.metrics{display:flex;gap:1.2rem;flex-wrap:wrap;justify-content:center}\n.met{text-align:center;min-width:68px}\n.met-v{font-size:1.35rem;font-style:italic;font-weight:700;line-height:1;transition:color .35s}\n.met-l{font-size:.43rem;letter-spacing:.1em;color:#9e9b98;margin-top:3px;text-transform:uppercase}\n#solar{width:100%;max-width:680px;height:auto;display:block}\n.atk-card{width:100%;max-width:900px;background:#ffffff;border:.5px solid rgba(0,0,0,.1);border-radius:6px;padding:.6rem 1rem;display:flex;gap:.8rem;align-items:center;min-height:48px;transition:border-color .3s}\n.atk-icon{font-size:1.4rem;flex-shrink:0}\n.atk-name{font-size:.76rem;font-weight:700;transition:color .3s}\n.atk-sub{font-size:.47rem;color:#6b6966;line-height:1.5;margin-top:2px}\n.atk-right{margin-left:auto;text-align:right;flex-shrink:0}\n.atk-lat{font-size:1.05rem;font-style:italic;font-weight:700;transition:color .3s}\n.atk-lay{font-size:.43rem;color:#6b6966;margin-top:2px}\n.log-wrap{width:100%;max-width:900px;background:#f0eeeb;border:.5px solid rgba(0,0,0,.1);border-radius:6px;padding:.65rem 1rem;height:200px;overflow-y:auto}\n.log-wrap::-webkit-scrollbar{width:3px}.log-wrap::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:2px}\n.ll{font-size:.54rem;line-height:2;display:flex;gap:.5rem}\n.lt{color:#9e9b98;min-width:60px}.lok{color:#0F6E56;min-width:58px}.lwn{color:#B45309;min-width:58px}.lcr{color:#993C1D;min-width:58px}\n.lm{color:#6b6966}.lip{color:#534AB7;font-weight:700;letter-spacing:.02em}\n.ll-new{animation:fadein .22s ease}\n@keyframes fadein{from{opacity:0;transform:translateX(-5px)}to{opacity:1}}\n.legend{width:100%;max-width:900px;display:flex;gap:1.2rem;flex-wrap:wrap;justify-content:center;padding-top:.2rem}\n.leg{display:flex;align-items:center;gap:.4rem;font-size:.46rem;color:#6b6966}\n.leg-dot{width:10px;height:10px;border-radius:50%;border:2px solid;flex-shrink:0}\n<\/style>\n<\/head>\n<body>\n \n<div class=\"hdr\">\n  <div>\n    <div class=\"hdr-title\" style=\"color:#4b4845\">CORTEX ORIGIN\u2122 \u2014 Architecture solaire \u00b7 Simulation d\u00e9fensive \u00b7 v3.1<\/div>\n    <div class=\"hdr-sub\">Les attaques ne p\u00e9n\u00e8trent jamais la TCB \u2014 elles sont stopp\u00e9es en orbite<\/div>\n  <\/div>\n  <div class=\"hdr-status\">\n    <span class=\"dot\" id=\"sim-dot\" style=\"background:#0F6E56;animation:blink 1.2s ease-in-out infinite\"><\/span>\n    <span id=\"sim-label\" style=\"color:#10b981\">ACTIF<\/span>\n  <\/div>\n<\/div>\n \n<div class=\"mode-bar\">\n  <button class=\"mbtn mbtn-norm   active\" id=\"btn-norm\"   onclick=\"setMode('normal')\">\u26a1 Attaque standard<\/button>\n  <button class=\"mbtn mbtn-zd\"          id=\"btn-zd\"     onclick=\"setMode('zeroday')\">\ud83d\udc80 Zero-Day<\/button>\n  <button class=\"mbtn mbtn-exante\"       id=\"btn-exante\" onclick=\"setMode('exante')\">\u2131 Ex Ante<\/button>\n  <button class=\"mbtn mbtn-hybrid\"       id=\"btn-hybrid\" onclick=\"setMode('hybrid')\">\ud83e\udd16 IA + Humain<\/button>\n  <button class=\"mbtn mbtn-ctrl active\"  id=\"btn-auto\"   onclick=\"toggleAuto()\" style=\"margin-left:.4rem\">\u23f5 Auto<\/button>\n  <button class=\"mbtn mbtn-ctrl\"         onclick=\"simReset()\">\u21ba<\/button>\n<\/div>\n \n<div class=\"metrics\">\n  <div class=\"met\"><div class=\"met-v\" id=\"m-blocked\" style=\"color:#10b981\">0<\/div><div class=\"met-l\">Bloqu\u00e9es<\/div><\/div>\n  <div class=\"met\"><div class=\"met-v\" id=\"m-mode\"    style=\"color:#D97706\">STD<\/div><div class=\"met-l\">Mode<\/div><\/div>\n  <div class=\"met\"><div class=\"met-v\" id=\"m-lat\"     style=\"color:#818cf8\">\u2014<\/div><div class=\"met-l\">Latence<\/div><\/div>\n  <div class=\"met\"><div class=\"met-v\" id=\"m-layer\"   style=\"color:#6b6966\">\u2014<\/div><div class=\"met-l\">Couche<\/div><\/div>\n  <div class=\"met\"><div class=\"met-v\" id=\"m-cwe\" style=\"color:#ef4444\">~940<\/div><div class=\"met-l\">CWE couverts<\/div><\/div>\n<\/div>\n \n<!-- Compteur d'attaques\/seconde -->\n<div style=\"width:100%;max-width:900px;background:#fff;border:.5px solid rgba(0,0,0,.08);border-radius:6px;padding:.7rem 1.2rem;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.8rem\">\n  <div>\n    <div style=\"font-size:.48rem;letter-spacing:.2em;text-transform:uppercase;color:#9e9b98;margin-bottom:.3rem\">Capacit\u00e9 de blocage simultan\u00e9e \u00b7 ARM64 \u00b7 4 c\u0153urs<\/div>\n    <div style=\"display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap\">\n      <span id=\"atk-counter\" style=\"font-family:'JetBrains Mono',monospace;font-size:2.2rem;font-weight:700;font-style:italic;color:#534AB7;transition:color .3s;line-height:1\">0<\/span>\n      <span style=\"font-size:.9rem;color:#9e9b98;font-family:'JetBrains Mono',monospace\">attaques bloqu\u00e9es \/ seconde<\/span>\n    <\/div>\n    <div id=\"atk-counter-sub\" style=\"font-size:.48rem;color:#9e9b98;margin-top:.3rem;font-family:'JetBrains Mono',monospace;letter-spacing:.05em\">\n      Chemin L1b complet \u00b7 2,1 \u00b5s\/d\u00e9cision \u00b7 4 c\u0153urs d\u00e9di\u00e9s TCB\n    <\/div>\n  <\/div>\n  <div style=\"display:flex;gap:1.2rem;flex-wrap:wrap\">\n    <div style=\"text-align:center\">\n      <div style=\"font-family:'JetBrains Mono',monospace;font-size:1rem;font-weight:700;color:#534AB7;font-style:italic\">9,5 M\/s<\/div>\n      <div style=\"font-size:.42rem;color:#9e9b98;text-transform:uppercase;letter-spacing:.08em;margin-top:2px\">seL4 kernel<br>421 ns\/d\u00e9cision<\/div>\n    <\/div>\n    <div style=\"text-align:center\">\n      <div style=\"font-family:'JetBrains Mono',monospace;font-size:1rem;font-weight:700;color:#0F6E56;font-style:italic\">1,9 M\/s<\/div>\n      <div style=\"font-size:.42rem;color:#9e9b98;text-transform:uppercase;letter-spacing:.08em;margin-top:2px\">L1b complet<br>2,1 \u00b5s\/d\u00e9cision<\/div>\n    <\/div>\n    <div style=\"text-align:center\">\n      <div style=\"font-family:'JetBrains Mono',monospace;font-size:1rem;font-weight:700;color:#7c3aed;font-style:italic\">336 M\/s<\/div>\n      <div style=\"font-size:.42rem;color:#9e9b98;text-transform:uppercase;letter-spacing:.08em;margin-top:2px\">CMS MTD hot path<br>2,97 ns\/rotation<\/div>\n    <\/div>\n    <div style=\"text-align:center\">\n      <div style=\"font-family:'JetBrains Mono',monospace;font-size:1rem;font-weight:700;color:#D97706;font-style:italic\">\u00d7100 000<\/div>\n      <div style=\"font-size:.42rem;color:#9e9b98;text-transform:uppercase;letter-spacing:.08em;margin-top:2px\">ratio TCB\/APT IA<br>421 ns vs &lt;50 ms<\/div>\n    <\/div>\n    <div style=\"text-align:center\">\n      <div style=\"font-family:'JetBrains Mono',monospace;font-size:1rem;font-weight:700;color:#993C1D;font-style:italic\">&gt;150 M pps<\/div>\n      <div style=\"font-size:.42rem;color:#9e9b98;text-transform:uppercase;letter-spacing:.08em;margin-top:2px\">DDoS record<br>\u2193 distribu\u00e9 requis<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n \n<svg id=\"solar\" viewBox=\"0 0 700 700\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<rect width=\"700\" height=\"700\" fill=\"#f8f7f5\" rx=\"8\"\/>\n<defs>\n  <filter id=\"gs\"><feGaussianBlur stdDeviation=\"9\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n  <filter id=\"gm\"><feGaussianBlur stdDeviation=\"3\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n  <radialGradient id=\"tcb-g\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n    <stop offset=\"0%\"  stop-color=\"#a5b4fc\"\/>\n    <stop offset=\"50%\" stop-color=\"#4f46e5\"\/>\n    <stop offset=\"100%\"stop-color=\"#1e1b4b\"\/>\n  <\/radialGradient>\n  <radialGradient id=\"halo\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n    <stop offset=\"0%\"  stop-color=\"#4f46e5\" stop-opacity=\".15\"\/>\n    <stop offset=\"100%\"stop-color=\"#4f46e5\" stop-opacity=\"0\"\/>\n  <\/radialGradient>\n<\/defs>\n \n<!-- \u00c9toiles fond -->\n<circle cx=\"60\"  cy=\"55\"  r=\"1\"   fill=\"rgba(0,0,0,.06)\"\/>\n<circle cx=\"630\" cy=\"80\"  r=\"1.2\" fill=\"rgba(0,0,0,.05)\"\/>\n<circle cx=\"20\"  cy=\"390\" r=\".9\"  fill=\"rgba(0,0,0,.06)\"\/>\n<circle cx=\"675\" cy=\"330\" r=\"1\"   fill=\"rgba(0,0,0,.05)\"\/>\n<circle cx=\"140\" cy=\"655\" r=\"1.1\" fill=\"rgba(0,0,0,.05)\"\/>\n<circle cx=\"575\" cy=\"630\" r=\".9\"  fill=\"rgba(0,0,0,.06)\"\/>\n<circle cx=\"680\" cy=\"490\" r=\"1\"   fill=\"rgba(0,0,0,.04)\"\/>\n<circle cx=\"30\"  cy=\"200\" r=\".8\"  fill=\"rgba(0,0,0,.05)\"\/>\n \n<!-- \u2500\u2500 ORBITES \u2500\u2500 -->\n<circle cx=\"350\" cy=\"350\" r=\"308\" fill=\"none\" stroke=\"rgba(153,60,29,.2)\"   stroke-width=\".8\" stroke-dasharray=\"3,9\"\/>\n<circle cx=\"350\" cy=\"350\" r=\"220\" fill=\"none\" stroke=\"rgba(217,119,6,.3)\"   stroke-width=\".8\" stroke-dasharray=\"2,6\"\/>\n<circle cx=\"350\" cy=\"350\" r=\"140\" fill=\"none\" stroke=\"rgba(15,110,86,.2)\" stroke-width=\".8\" stroke-dasharray=\"2,7\"\/>\n<circle cx=\"350\" cy=\"350\" r=\"72\"  fill=\"rgba(79,70,229,.06)\" stroke=\"rgba(83,74,183,.3)\" stroke-width=\".8\"\/>\n \n<!-- \u2500\u2500 ARC EX ANTE gauche \u2500\u2500 -->\n<rect id=\"bg-exante\" x=\"2\" y=\"170\" width=\"96\" height=\"360\" rx=\"5\" fill=\"#065F46\" opacity=\"0\" style=\"transition:opacity .3s\"\/>\n<path id=\"arc-exante\" d=\"M 96 172 A 238 238 0 0 0 96 528\" fill=\"none\" stroke=\"#065F46\" stroke-width=\"4\" opacity=\".5\" stroke-linecap=\"round\" style=\"transition:all .3s\"\/>\n<text transform=\"translate(73,350) rotate(-90)\" text-anchor=\"middle\" font-size=\"7.5\" fill=\"#065F46\" font-weight=\"bold\" letter-spacing=\"2.5\" opacity=\".9\">EX ANTE \u00b7 \u2131 HOL \u00b7 0 CVE<\/text>\n \n<!-- \u2500\u2500 ARC M24 droit \u2500\u2500 -->\n<rect id=\"bg-m24\" x=\"602\" y=\"170\" width=\"96\" height=\"360\" rx=\"5\" fill=\"#534AB7\" opacity=\"0\" style=\"transition:opacity .3s\"\/>\n<path id=\"arc-m24\" d=\"M 604 172 A 238 238 0 0 1 604 528\" fill=\"none\" stroke=\"#4338ca\" stroke-width=\"4\" opacity=\".5\" stroke-linecap=\"round\" style=\"transition:all .3s\"\/>\n<text id=\"txt-m24\" transform=\"translate(627,350) rotate(90)\" text-anchor=\"middle\" font-size=\"7\" fill=\"#3C3489\" font-weight=\"bold\" letter-spacing=\"2\" opacity=\".9\" style=\"transition:all .3s\">M24 OFFLINE\u2122 \u00b7 CBMC 13\/13 \u00b7 halt_path 3,02 ns<\/text>\n \n<!-- \u2500\u2500 WALL-DOME anneau \u2500\u2500 -->\n<circle id=\"wall-ring\" cx=\"350\" cy=\"350\" r=\"220\" fill=\"none\" stroke=\"#D97706\" stroke-width=\"3.5\" opacity=\".28\"\/>\n<g>\n  <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 350 350\" to=\"360 350 350\" dur=\"50s\" repeatCount=\"indefinite\"\/>\n  <circle cx=\"350\" cy=\"130\" r=\"5\"   fill=\"#D97706\" opacity=\".55\"\/>\n  <circle cx=\"506\" cy=\"195\" r=\"3.5\" fill=\"#D97706\" opacity=\".4\"\/>\n  <circle cx=\"570\" cy=\"350\" r=\"5\"   fill=\"#D97706\" opacity=\".55\"\/>\n  <circle cx=\"506\" cy=\"505\" r=\"3.5\" fill=\"#D97706\" opacity=\".4\"\/>\n  <circle cx=\"350\" cy=\"570\" r=\"5\"   fill=\"#D97706\" opacity=\".55\"\/>\n  <circle cx=\"194\" cy=\"505\" r=\"3.5\" fill=\"#D97706\" opacity=\".4\"\/>\n  <circle cx=\"130\" cy=\"350\" r=\"5\"   fill=\"#D97706\" opacity=\".55\"\/>\n  <circle cx=\"194\" cy=\"195\" r=\"3.5\" fill=\"#D97706\" opacity=\".4\"\/>\n<\/g>\n<text x=\"350\" y=\"122\" text-anchor=\"middle\" font-size=\"7.5\" fill=\"#92400E\" font-weight=\"bold\" letter-spacing=\"2\" opacity=\".9\">WALL-DOME\u2122<\/text>\n<text x=\"350\" y=\"132\" text-anchor=\"middle\" font-size=\"5.5\" fill=\"#B45309\" opacity=\".8\">100\/100 \u00b7 15\/15 CWE \u00b7 TNR 100%<\/text>\n \n<!-- \u2500\u2500 TCB SOLEIL \u2500\u2500 -->\n<circle cx=\"350\" cy=\"350\" r=\"100\" fill=\"url(#halo)\"\/>\n<circle cx=\"350\" cy=\"350\" r=\"67\"  fill=\"url(#tcb-g)\" filter=\"url(#gs)\"\/>\n<circle cx=\"350\" cy=\"350\" r=\"67\"  fill=\"none\" stroke=\"rgba(165,180,252,.3)\" stroke-width=\"1.5\"\/>\n<g opacity=\".08\" stroke=\"#818cf8\" stroke-width=\"1\">\n  <line x1=\"350\" y1=\"283\" x2=\"350\" y2=\"262\"\/>\n  <line x1=\"397\" y1=\"303\" x2=\"409\" y2=\"291\"\/>\n  <line x1=\"417\" y1=\"350\" x2=\"438\" y2=\"350\"\/>\n  <line x1=\"397\" y1=\"397\" x2=\"409\" y2=\"409\"\/>\n  <line x1=\"350\" y1=\"417\" x2=\"350\" y2=\"438\"\/>\n  <line x1=\"303\" y1=\"397\" x2=\"291\" y2=\"409\"\/>\n  <line x1=\"283\" y1=\"350\" x2=\"262\" y2=\"350\"\/>\n  <line x1=\"303\" y1=\"303\" x2=\"291\" y2=\"291\"\/>\n<\/g>\n<circle cx=\"350\" cy=\"350\" r=\"67\" fill=\"none\" stroke=\"#818cf8\" stroke-width=\"1.2\" opacity=\".25\">\n  <animate attributeName=\"r\"       from=\"67\" to=\"94\" dur=\"3.5s\" repeatCount=\"indefinite\"\/>\n  <animate attributeName=\"opacity\" from=\".18\" to=\"0\" dur=\"3.5s\" repeatCount=\"indefinite\"\/>\n<\/circle>\n<text x=\"350\" y=\"342\" text-anchor=\"middle\" font-size=\"12\"  fill=\"#1e1b4b\" font-weight=\"bold\">TCB<\/text>\n<text x=\"350\" y=\"356\" text-anchor=\"middle\" font-size=\"8.5\" fill=\"#4338ca\">seL4 EAL7<\/text>\n<text x=\"350\" y=\"368\" text-anchor=\"middle\" font-size=\"6\"   fill=\"rgba(67,56,202,.7)\">PRISM \u00b7 OMEGA<\/text>\n<text x=\"350\" y=\"379\" text-anchor=\"middle\" font-size=\"5.5\" fill=\"rgba(67,56,202,.5)\">421 ns \u00b7 T1..T8<\/text>\n<circle id=\"tf1\" cx=\"350\" cy=\"350\" r=\"67\"  fill=\"none\" stroke=\"#818cf8\" stroke-width=\"5\"  opacity=\"0\" style=\"transition:opacity .08s\"\/>\n<circle id=\"tf2\" cx=\"350\" cy=\"350\" r=\"82\"  fill=\"none\" stroke=\"#4f46e5\" stroke-width=\"3\"  opacity=\"0\" style=\"transition:opacity .14s\"\/>\n \n<!-- \u2500\u2500 MODULES L1b (r=140) \u2014 9 modules dont CMS \u2500\u2500 -->\n<g id=\"mod-walld\"><circle cx=\"350\" cy=\"210\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"350\" y=\"207\" text-anchor=\"middle\" font-size=\"7\" fill=\"#085041\" font-weight=\"bold\">WALL<\/text><text x=\"350\" y=\"217\" text-anchor=\"middle\" font-size=\"5.5\" fill=\"#0F6E56\">DOME<\/text><\/g>\n<g id=\"mod-aegis\"><circle cx=\"449\" cy=\"251\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"449\" y=\"248\" text-anchor=\"middle\" font-size=\"7\" fill=\"#085041\" font-weight=\"bold\">AEGIS<\/text><text x=\"449\" y=\"258\" text-anchor=\"middle\" font-size=\"5\" fill=\"#0F6E56\">94\/100<\/text><\/g>\n<!-- CMS CORTEX MORPHIC SHIELD\u2122 \u2014 NOUVEAU v3.1 \u2014 r=140, angle +15\u00b0 -->\n<g id=\"mod-cms\"><circle cx=\"483\" cy=\"299\" r=\"24\" fill=\"#f3eefe\" stroke=\"#5B2D8E\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"483\" y=\"296\" text-anchor=\"middle\" font-size=\"6\" fill=\"#3D1D6B\" font-weight=\"bold\">CMS\u2122<\/text><text x=\"483\" y=\"306\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#5B2D8E\">MTD 2,97ns<\/text><\/g>\n<g id=\"mod-m09\"><circle cx=\"490\" cy=\"350\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"490\" y=\"347\" text-anchor=\"middle\" font-size=\"7\" fill=\"#085041\" font-weight=\"bold\">M09-CB<\/text><text x=\"490\" y=\"357\" text-anchor=\"middle\" font-size=\"5\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n<g id=\"mod-sent\"><circle cx=\"449\" cy=\"449\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"449\" y=\"446\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#085041\" font-weight=\"bold\">SENTINEL<\/text><text x=\"449\" y=\"456\" text-anchor=\"middle\" font-size=\"5\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n<g id=\"mod-atlas\"><circle cx=\"350\" cy=\"490\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"350\" y=\"487\" text-anchor=\"middle\" font-size=\"7\" fill=\"#085041\" font-weight=\"bold\">ATLAS\u2122<\/text><text x=\"350\" y=\"497\" text-anchor=\"middle\" font-size=\"5\" fill=\"#22c55e\">97\/100<\/text><\/g>\n<g id=\"mod-m11\"><circle cx=\"251\" cy=\"449\" r=\"26\" fill=\"#e8f5ee\" stroke=\"#0F6E56\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"251\" y=\"446\" text-anchor=\"middle\" font-size=\"7\" fill=\"#085041\" font-weight=\"bold\">M11-TL<\/text><text x=\"251\" y=\"456\" text-anchor=\"middle\" font-size=\"5\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n<g id=\"mod-prism\"><circle cx=\"210\" cy=\"350\" r=\"26\" fill=\"#eeedfe\" stroke=\"#818cf8\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"210\" y=\"347\" text-anchor=\"middle\" font-size=\"7\" fill=\"#3C3489\" font-weight=\"bold\">PRISM<\/text><text x=\"210\" y=\"357\" text-anchor=\"middle\" font-size=\"5\" fill=\"#534AB7\">100\/100<\/text><\/g>\n<g id=\"mod-m00\"><circle cx=\"251\" cy=\"251\" r=\"26\" fill=\"#eeedfe\" stroke=\"#818cf8\" stroke-width=\"2.5\" filter=\"url(#gm)\"\/><text x=\"251\" y=\"248\" text-anchor=\"middle\" font-size=\"7\" fill=\"#3C3489\" font-weight=\"bold\">M00<\/text><text x=\"251\" y=\"258\" text-anchor=\"middle\" font-size=\"5\" fill=\"#534AB7\">RoT<\/text><\/g>\n \n<!-- \u2500\u2500 15 CWE p\u00e9riph\u00e9rie (r=308) \u2500\u2500 -->\n<g id=\"cwe-INJECT\"><circle cx=\"350\"  cy=\"42\"  r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"350\"  y=\"39\"  text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">INJECT.<\/text><text x=\"350\"  y=\"49\"  text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">89\u00b778\u00b777<\/text><\/g>\n<g id=\"cwe-MEM\"   ><circle cx=\"476\"  cy=\"68\"  r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"476\"  y=\"65\"  text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">M\u00c9M.\/BUF<\/text><text x=\"476\"  y=\"75\"  text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">119\u00b7787<\/text><\/g>\n<g id=\"cwe-AUTH\"  ><circle cx=\"579\"  cy=\"141\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"579\"  y=\"138\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">AUTH.<\/text><text x=\"579\"  y=\"148\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">287\u00b7522<\/text><\/g>\n<g id=\"cwe-ACCES\" ><circle cx=\"644\"  cy=\"244\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"644\"  y=\"241\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">ACC\u00c8S<\/text><text x=\"644\"  y=\"251\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">269\u00b7732<\/text><\/g>\n<g id=\"cwe-CRYPTO\"><circle cx=\"657\"  cy=\"366\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"657\"  y=\"363\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">CRYPTO<\/text><text x=\"657\"  y=\"373\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">327\u00b7320<\/text><\/g>\n<g id=\"cwe-CONFIG\"><circle cx=\"618\"  cy=\"504\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"618\"  y=\"501\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">CONFIG<\/text><text x=\"618\"  y=\"511\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">16\u00b7276<\/text><\/g>\n<g id=\"cwe-CONC\"  ><circle cx=\"532\"  cy=\"600\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"532\"  y=\"597\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">RACE<\/text><text x=\"532\"  y=\"607\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">362\u00b7366<\/text><\/g>\n<g id=\"cwe-DOS\"   ><circle cx=\"414\"  cy=\"650\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"414\"  y=\"647\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">DoS<\/text><text x=\"414\"  y=\"657\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">400\u00b7770<\/text><\/g>\n<g id=\"cwe-DESER\" ><circle cx=\"286\"  cy=\"650\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"286\"  y=\"647\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">D\u00c9S\u00c9R.<\/text><text x=\"286\"  y=\"657\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">502\u00b7915<\/text><\/g>\n<g id=\"cwe-SC\"    ><circle cx=\"168\"  cy=\"600\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"168\"  y=\"597\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">SUPPLY<\/text><text x=\"168\"  y=\"607\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">1104\u00b7829<\/text><\/g>\n<g id=\"cwe-INFO\"  ><circle cx=\"82\"   cy=\"504\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"82\"   y=\"501\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">INFO<\/text><text x=\"82\"   y=\"511\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">918\u00b7200<\/text><\/g>\n<g id=\"cwe-SIDE\"  ><circle cx=\"43\"   cy=\"366\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"43\"   y=\"363\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">SIDE-CH<\/text><text x=\"43\"   y=\"373\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">208\u00b7385<\/text><\/g>\n<g id=\"cwe-LOG\"   ><circle cx=\"56\"   cy=\"244\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"56\"   y=\"241\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">LOGIQUE<\/text><text x=\"56\"   y=\"251\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">840\u00b7841<\/text><\/g>\n<g id=\"cwe-AI\"    ><circle cx=\"121\"  cy=\"141\" r=\"22\" fill=\"#fff0ec\" stroke=\"#ef4444\" stroke-width=\"2\"\/><text x=\"121\"  y=\"138\" text-anchor=\"middle\" font-size=\"6.5\" fill=\"#7B2800\" font-weight=\"bold\">IA\u00b7ADV.<\/text><text x=\"121\"  y=\"148\" text-anchor=\"middle\" font-size=\"4.5\" fill=\"#993C1D\">20\u00b7345<\/text><\/g>\n<g id=\"cwe-ZD\">\n  <circle cx=\"224\" cy=\"68\" r=\"24\" fill=\"#ffe8e8\" stroke=\"#dc2626\" stroke-width=\"3\"\/>\n  <circle cx=\"224\" cy=\"68\" r=\"24\" fill=\"none\" stroke=\"#dc2626\" stroke-width=\"1.5\" opacity=\".4\">\n    <animate attributeName=\"r\" from=\"24\" to=\"40\" dur=\"1.3s\" repeatCount=\"indefinite\"\/>\n    <animate attributeName=\"opacity\" from=\".4\" to=\"0\" dur=\"1.3s\" repeatCount=\"indefinite\"\/>\n  <\/circle>\n  <text x=\"224\" y=\"65\" text-anchor=\"middle\" font-size=\"7\" fill=\"#7B0000\" font-weight=\"bold\">0-DAY<\/text>\n  <text x=\"224\" y=\"75\" text-anchor=\"middle\" font-size=\"5.5\" fill=\"#993C1D\">CVE: ???<\/text>\n<\/g>\n \n<!-- COUCHE ANIMATION -->\n<g id=\"anim-g\"><\/g>\n<\/svg>\n \n<div class=\"atk-card\" id=\"atk-card\">\n  <span class=\"atk-icon\" id=\"atk-icon\">\u23f3<\/span>\n  <div>\n    <div class=\"atk-name\" id=\"atk-name\" style=\"color:#6b6966\">En attente\u2026<\/div>\n    <div class=\"atk-sub\"  id=\"atk-sub\">Simulation automatique active<\/div>\n  <\/div>\n  <div class=\"atk-right\">\n    <div class=\"atk-lat\" id=\"atk-lat\" style=\"color:#6b6966\">\u2014<\/div>\n    <div class=\"atk-lay\" id=\"atk-lay\">\u2014<\/div>\n  <\/div>\n<\/div>\n \n<div class=\"log-wrap\" id=\"log\">\n  <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">TCB seL4 EAL7 inviolable \u2014 <span class=\"lip\">T1..T8<\/span> \u2014 421 ns \u2014 les attaques s&rsquo;arr\u00eatent en orbite<\/span><\/div>\n  <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">WALL-DOME\u2122 orbite r=220 \u2014 1\u00e8re ligne \u2014 <span class=\"lip\">15\/15 CWE<\/span> couverts<\/span><\/div>\n  <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">CMS MORPHIC SHIELD\u2122 L1b+ \u2014 MTD actif \u2014 <span class=\"lip\">CBMC 60\/60 \u00b7 ~125 Mds+<\/span> \u00b7 2,97 ns hot path<\/span><\/div>\n  <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">EX ANTE actif \u2014 preuves HOL remontantes \u2014 <span class=\"lip\">0 CVE requis<\/span><\/span><\/div>\n<\/div>\n \n<div class=\"legend\">\n  <div class=\"leg\"><span class=\"leg-dot\" style=\"border-color:#ef4444;background:#fff0ec\"><\/span>CWE \/ Zero-Day \u2014 orbite r=308<\/div>\n  <div class=\"leg\"><span class=\"leg-dot\" style=\"border-color:#D97706;background:#fffbe8\"><\/span>WALL-DOME\u2122 \u2014 orbite r=220 \u2014 1\u00e8re ligne<\/div>\n  <div class=\"leg\"><span class=\"leg-dot\" style=\"border-color:#10b981;background:#e8f5ee\"><\/span>Modules L1b \u2014 orbite r=140<\/div>\n  <div class=\"leg\"><span class=\"leg-dot\" style=\"border-color:#5B2D8E;background:#f3eefe\"><\/span>CMS MTD \u2014 L1b+ \u2014 2,97 ns \u2014 v3.1<\/div>\n  <div class=\"leg\"><span class=\"leg-dot\" style=\"border-color:#818cf8;background:#eeedfe\"><\/span>TCB seL4 \u2014 r=67 \u2014 inviolable<\/div>\n<\/div>\n \n<script>\nconst NS='http:\/\/www.w3.org\/2000\/svg', CX=350, CY=350;\nconst R_CWE=308, R_WALL=220, R_L1B=140, R_TCB=72;\n \nconst CWE_IDS=['INJECT','MEM','AUTH','ACCES','CRYPTO','CONFIG','CONC','DOS','DESER','SC','INFO','SIDE','LOG','AI','ZD'];\nconst CWE_POS={};\nCWE_IDS.forEach((id,i)=>{ const a=(-90+i*24)*Math.PI\/180; CWE_POS[id]=[CX+R_CWE*Math.cos(a),CY+R_CWE*Math.sin(a)]; });\n \nfunction onRing(cx,cy,r){ const dx=CX-cx,dy=CY-cy,d=Math.hypot(dx,dy); return [cx+dx*(1-r\/d),cy+dy*(1-r\/d)]; }\n \nconst NORMAL=[\n  {cwe:'INJECT',icon:'\ud83d\udee1',name:'MTD \u2014 Reconnaissance r\u00e9seau bloqu\u00e9e',sub:'CWE-923 \u00b7 CMS CORTEX MORPHIC SHIELD\u2122 \u00b7 Fisher-Yates \u00b7 rotation <30s \u00b7 2,97 ns',\n   blocked:'CMS MORPHIC SHIELD\u2122',mods:['cms'],lat:'2,97 ns',layer:'L1b+ MTD',color:'#7c3aed',stopAt:'WALL',\n   steps:[{d:0,t:'warn',m:'CMS MORPHIC\u2122',l:'Scan r\u00e9seau d\u00e9tect\u00e9 \u00b7 Fisher-Yates MTD \u00b7 rotation IP\/port active'},\n          {d:380,t:'warn',m:'CMS MORPHIC\u2122',l:'CBMC P01-P60 \u00b7 ~125 Mds+ fuzz \u00b7 honeypots TCP \u00b7 +9 pts CEM brut'},\n          {d:750,t:'ok',m:'CMS MORPHIC\u2122',l:'Reconnaissance impossible \u00b7 topologie fant\u00f4me \u00b7 2,97 ns \u00b7 EVAL-016 v5.2'}]},\n  {cwe:'INJECT',icon:'\ud83d\udc89',name:'Injection SQL\/OS',sub:'CWE-089\u00b7078 \u00b7 bloqu\u00e9 \u00e0 l\\'orbite WALL-DOME',\n   blocked:'WALL-DOME\u2122',mods:['walld'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#f97316',stopAt:'WALL',\n   steps:[{d:0,t:'warn',m:'WALL-DOME\u2122',l:'CWE-089 SQL d\u00e9tect\u00e9 en orbite L1b \u2014 payload analys\u00e9'},\n          {d:380,t:'warn',m:'AEGIS\u2122',l:'Pattern injection confirm\u00e9 \u2014 WP goals actifs'},\n          {d:750,t:'ok',m:'WALL-DOME\u2122',l:'Bloqu\u00e9 orbite r=220 \u00b7 h\u00e9ritage seL4 \u2191 \u00b7 2,1 \u00b5s'}]},\n  {cwe:'DOS',icon:'\ud83c\udf0a',name:'DoS flood adaptatif',sub:'CWE-400\u00b7770 \u00b7 bloqu\u00e9 \u00e0 l\\'orbite L1b M09-CB',\n   blocked:'M09 CircuitBreaker',mods:['m09'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#06b6d4',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'M09-CB',l:'CWE-400 saturation \u2014 circuit ouvert \u00b7 9,0 ns mean'},\n          {d:380,t:'warn',m:'AEGIS\u2122',l:'Playbook d\u00e9fensif \u2014 isolation flux suspect'},\n          {d:750,t:'ok',m:'M09-CB',l:'DoS neutralis\u00e9 \u00b7 orbite r=140 \u00b7 CFVL 100\/100'}]},\n  {cwe:'AUTH',icon:'\ud83d\udd11',name:'Brute-force SSH',sub:'CWE-307\u00b7287 \u00b7 SENTINEL orbite L1b',\n   blocked:'SENTINEL + M09-CB',mods:['sent','m09'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#f59e0b',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'SENTINEL',l:'CWE-307 \u2014 8 tentatives\/3s \u00b7 anomalie en orbite'},\n          {d:380,t:'warn',m:'M09-CB',l:'Rate limiting activ\u00e9 \u00b7 9,0 ns kernel'},\n          {d:750,t:'ok',m:'SENTINEL',l:'IP bannie \u00b7 orbite r=140 \u00b7 alerte PRISM'}]},\n  {cwe:'SC',icon:'\ud83d\udd17',name:'Supply Chain compromise',sub:'CWE-1104\u00b7829 \u00b7 ATLAS\u2122 L1b',\n   blocked:'ATLAS\u2122 + OMEGA',mods:['atlas'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#84cc16',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'ATLAS\u2122',l:'CWE-1104 \u2014 composant non-v\u00e9rifi\u00e9 \u00b7 audit CFVL'},\n          {d:380,t:'warn',m:'OMEGA',l:'PolicyForge \u2014 propagation bloqu\u00e9e en orbite'},\n          {d:750,t:'ok',m:'ATLAS\u2122',l:'Supply chain bloqu\u00e9e \u00b7 orbite r=140 \u00b7 97\/100'}]},\n];\n \nconst ZERODAY=[\n  {cwe:'ZD',icon:'\ud83d\udc80',name:'Zero-Day kernel (CVE inconnu)',sub:'0-DAY \u2014 p\u00e9n\u00e8tre jusqu\\'\u00e0 l\\'anneau L1b \u00b7 TCB r\u00e9pond sans CVE',\n   blocked:'seL4 EAL7 ex ante',mods:['m00'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#dc2626',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Zero-Day \u2014 aucun CVE \u00b7 franchit WALL-DOME \u00b7 T1\/T2 actif'},\n          {d:330,t:'warn',m:'M00 RoT',l:'Capability integrity \u2014 escalade impossible \u00b7 2,5 ns'},\n          {d:660,t:'ok',m:'seL4 EAL7',l:'Arr\u00eat\u00e9 orbite L1b \u00b7 classe prouv\u00e9e HOL \u00b7 421 ns \u00b7 0 CVE'}]},\n  {cwe:'MEM',icon:'\ud83d\udcbe',name:'Buffer Overflow 0-day variant',sub:'CWE-119 inconnu \u2014 classe m\u00e9moire T1\/T6',\n   blocked:'seL4 EAL7',mods:['m00'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#b91c1c',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'CWE-119 variant 0-day \u2014 T1\/T6 isolation kernel'},\n          {d:330,t:'warn',m:'M00 RoT',l:'Capability integrity \u00b7 preuve HOL T1\/T6'},\n          {d:660,t:'ok',m:'seL4 EAL7',l:'Classe m\u00e9moire couverte \u00b7 421 ns \u00b7 variante = inexistante'}]},\n  {cwe:'CONC',icon:'\ud83d\udd04',name:'Race Condition 0-day TOCTOU',sub:'CWE-362 futur \u00b7 T3 IPC atomique',\n   blocked:'seL4 EAL7 T3',mods:['prism'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#7c3aed',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Race 0-day \u2014 T3 IPC atomique d\u00e9tect\u00e9 \u00b7 421 ns'},\n          {d:330,t:'warn',m:'PRISM',l:'FSM \u2014 transition \u00e9tat ill\u00e9gitime \u00b7 9,3 ns'},\n          {d:660,t:'ok',m:'seL4 EAL7',l:'Race impossible par construction \u00b7 T3 \u00b7 421 ns'}]},\n];\n \nconst EXANTE=[\n  {cwe:'SIDE',icon:'\u23f1',name:'Side-Channel timing (ex ante)',sub:'CWE-208 \u00b7 TCB \u00e9met la preuve vers l\\'ext\u00e9rieur',\n   blocked:'seL4 EAL7 ex ante',mods:['prism','m00'],lat:'421 ns',layer:'TCB',color:'#0891b2',stopAt:'EXANTE',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'CWE-208 \u2014 classe timing \u00b7 preuve T3 remonte vers orbite'},\n          {d:300,t:'warn',m:'M00 RoT',l:'Uniformit\u00e9 temporelle kernel \u2014 0 fuite \u00b7 421 ns constant'},\n          {d:600,t:'ok',m:'seL4 EAL7',l:'Side-channel impossible \u00b7 preuve HOL remontante \u00b7 421 ns'}]},\n  {cwe:'INFO',icon:'\ud83d\udce1',name:'Non-interference info flow (ex ante)',sub:'CWE-918 \u00b7 T8 HOL \u2014 la TCB prot\u00e8ge avant contact',\n   blocked:'seL4 T8',mods:['prism'],lat:'421 ns',layer:'TCB',color:'#7c3aed',stopAt:'EXANTE',\n   steps:[{d:0,t:'warn',m:'PRISM',l:'CWE-918 \u2014 T8 non-interference \u00b7 preuve remontante'},\n          {d:300,t:'warn',m:'seL4 EAL7',l:'Isolation information flow \u2014 domaines \u00e9tanches'},\n          {d:600,t:'ok',m:'PRISM',l:'0 octet sorti \u00b7 T8 couvre classe enti\u00e8re \u00b7 421 ns'}]},\n  {cwe:'ACCES',icon:'\u2b06',name:'Escalade privil\u00e8ge (CVE futur)',sub:'CWE-269 classe \u00b7 T2 capability \u2014 bloqu\u00e9 avant CVE assign\u00e9',\n   blocked:'seL4 T2',mods:['m00'],lat:'421 ns',layer:'TCB',color:'#059669',stopAt:'EXANTE',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Escalade \u2014 T2 capability \u00b7 preuve remonte vers orbite'},\n          {d:300,t:'warn',m:'M00 RoT',l:'Escalade impossible par construction \u00b7 0 CVE requis'},\n          {d:600,t:'ok',m:'seL4 EAL7',l:'Classe escalade bloqu\u00e9e ex ante \u00b7 T2 HOL \u00b7 421 ns'}]},\n];\n \nconst HYBRID=[\n  {cwe:['INJECT','DOS','MEM','AUTH'],icon:'\ud83e\udd16',\n   name:'APT IA \u2014 4 vecteurs simultan\u00e9s',sub:'Orchestrateur IA \u00b7 <12 ms \u00b7 mutation payload \u00b7 bloqu\u00e9s en orbite',\n   blocked:'WALL-DOME + L1b',mods:['walld','aegis','m09','m00'],lat:'421 ns',layer:'TCB+L1b',color:'#f97316',stopAt:'WALL',\n   steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'APT IA \u2014 4 vecteurs \u00b7 mutation payload \u00b7 <12 ms'},\n          {d:240,t:'warn',m:'WALL-DOME\u2122',l:'Vecteurs 1+2 intercept\u00e9s orbite r=220'},\n          {d:460,t:'warn',m:'M09-CB',l:'Vecteurs 3+4 stopp\u00e9s orbite r=140'},\n          {d:680,t:'ok',m:'TCB',l:'4\/4 bloqu\u00e9s en orbite \u00b7 TCB non touch\u00e9e \u00b7 421 ns'}]},\n  {cwe:['ZD','SC','AI'],icon:'\u26a1',\n   name:'LLM \u2014 Supply chain + Zero-day',sub:'Exploit LLM combin\u00e9 \u00b7 <18 ms \u00b7 bloqu\u00e9 orbite L1b',\n   blocked:'M00 RoT + ATLAS\u2122',mods:['m00','atlas','walld','cms'],lat:'~2,5 ns',layer:'TCB\u2192L1b',color:'#7c3aed',stopAt:'L1B',\n   steps:[{d:0,t:'warn',m:'ATLAS\u2122',l:'LLM exploit \u00b7 supply + 0-day \u00b7 <18 ms \u00b7 analyse'},\n          {d:260,t:'warn',m:'M00 RoT',l:'Boot attestation \u2014 composant non-certifi\u00e9 bloqu\u00e9'},\n          {d:500,t:'warn',m:'seL4 EAL7',l:'Zero-day kernel \u2014 classe T1\/T2 \u00b7 ex ante'},\n          {d:720,t:'ok',m:'TCB',l:'Exploit LLM arr\u00eat\u00e9 orbite L1b \u00b7 TCB inviol\u00e9e'}]},\n  {cwe:['DOS','CONC','CRYPTO','CONFIG'],icon:'\ud83c\udf0a',\n   name:'DDoS adaptatif IA \u2014 1,2M req\/s',sub:'Pattern-switch <5 ms \u00b7 botnet IA \u00b7 stopp\u00e9 WALL-DOME',\n   blocked:'M09-CB + WALL-DOME',mods:['m09','aegis','walld'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#0891b2',stopAt:'WALL',\n   steps:[{d:0,t:'warn',m:'M09-CB',l:'DDoS 1,2M req\/s \u00b7 <5 ms switch \u00b7 circuit ouvert'},\n          {d:240,t:'warn',m:'AEGIS\u2122',l:'Adaptation d\u00e9fensive \u2014 596\/640 WP goals'},\n          {d:460,t:'warn',m:'WALL-DOME\u2122',l:'Vecteurs flood stopp\u00e9s orbite r=220'},\n          {d:680,t:'ok',m:'M09-CB',l:'DDoS neutralis\u00e9 \u00b7 orbite r=220\/140 \u00b7 TCB inviol\u00e9e'}]},\n];\n \nfunction svgEl(tag,attrs,html=''){\n  const e=document.createElementNS(NS,tag);\n  Object.entries(attrs).forEach(([k,v])=>e.setAttribute(k,v));\n  if(html) e.innerHTML=html;\n  return e;\n}\nfunction clearAnim(){ document.getElementById('anim-g').innerHTML=''; }\nfunction ts(){ const n=new Date(); return `${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`; }\nfunction addLog(t,m,msg){\n  const cls=t==='ok'?'lok':t==='warn'?'lwn':'lcr';\n  const lbl=t==='ok'?'[ OK ]':t==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div'); d.className='ll ll-new';\n  d.innerHTML=`<span class=\"lt\">${ts()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"lm\"><span class=\"lip\">${m}<\/span> \u2014 ${msg}<\/span>`;\n  const el=document.getElementById('log');\n  el.appendChild(d);\n  while(el.children.length>35) el.removeChild(el.firstChild);\n  el.scrollTop=el.scrollHeight;\n}\n \nfunction flashMod(id,color){\n  const g=document.getElementById('mod-'+id); if(!g) return;\n  const c=g.querySelector('circle'); if(!c) return;\n  c.style.cssText=`fill:${color}28;stroke:${color};stroke-width:4;filter:drop-shadow(0 0 9px ${color})`;\n  setTimeout(()=>c.style.cssText='',1200);\n}\nfunction flashTCBinner(color){\n  const f1=document.getElementById('tf1'), f2=document.getElementById('tf2');\n  if(f1){f1.setAttribute('stroke',color);f1.style.opacity='1';setTimeout(()=>f1.style.opacity='0',160);}\n  if(f2){f2.setAttribute('stroke',color);f2.style.opacity='1';setTimeout(()=>f2.style.opacity='0',280);}\n}\nfunction flashWall(color){\n  const w=document.getElementById('wall-ring'); if(!w) return;\n  w.setAttribute('stroke',color);\n  w.style.cssText=`opacity:.9;stroke-width:6;filter:drop-shadow(0 0 14px ${color})`;\n  setTimeout(()=>{w.setAttribute('stroke','#D97706');w.style.cssText='opacity:.28;stroke-width:3.5';},600);\n}\n \nfunction activateExAnte(){\n  const arc=document.getElementById('arc-exante');\n  const bg=document.getElementById('bg-exante');\n  if(arc){arc.style.opacity='1';arc.style.strokeWidth='7';arc.setAttribute('stroke','#065F46');arc.style.filter='drop-shadow(0 0 10px #10b981)';}\n  if(bg){bg.style.opacity='.12';}\n  const g=document.getElementById('anim-g');\n  const pth=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','path');\n  pth.setAttribute('d','M 96 172 A 238 238 0 0 0 96 528');\n  pth.setAttribute('fill','none');pth.setAttribute('stroke','#10b981');\n  pth.setAttribute('stroke-width','10');pth.setAttribute('opacity','.8');\n  pth.innerHTML=`<animate attributeName=\"opacity\" from=\".8\" to=\"0\" dur=\"0.6s\" repeatCount=\"3\"\/>\n                 <animate attributeName=\"stroke-width\" from=\"10\" to=\"3\" dur=\"0.6s\" repeatCount=\"3\"\/>`;\n  g.appendChild(pth);\n  setTimeout(()=>{\n    if(arc){arc.style.opacity='.5';arc.style.strokeWidth='4';arc.style.filter='';arc.setAttribute('stroke','#065F46');}\n    if(bg){bg.style.opacity='0';}\n    pth.remove();\n  },1800);\n}\n \nfunction activateM24(){\n  const arc=document.getElementById('arc-m24');\n  const txt=document.getElementById('txt-m24');\n  const bg=document.getElementById('bg-m24');\n  if(arc){arc.style.opacity='1';arc.style.strokeWidth='7';arc.setAttribute('stroke','#534AB7');arc.style.filter='drop-shadow(0 0 10px #818cf8)';}\n  if(txt){txt.style.opacity='1';txt.setAttribute('fill','#1e1b4b');txt.style.fontSize='7px';}\n  if(bg){bg.style.opacity='.1';}\n  const g=document.getElementById('anim-g');\n  const pth=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','path');\n  pth.setAttribute('d','M 604 172 A 238 238 0 0 1 604 528');\n  pth.setAttribute('fill','none');pth.setAttribute('stroke','#818cf8');\n  pth.setAttribute('stroke-width','10');pth.setAttribute('opacity','.8');\n  pth.innerHTML=`<animate attributeName=\"opacity\" from=\".8\" to=\"0\" dur=\"0.6s\" repeatCount=\"3\"\/>\n                 <animate attributeName=\"stroke-width\" from=\"10\" to=\"3\" dur=\"0.6s\" repeatCount=\"3\"\/>`;\n  g.appendChild(pth);\n  setTimeout(()=>{\n    if(arc){arc.style.opacity='.5';arc.style.strokeWidth='4';arc.style.filter='';arc.setAttribute('stroke','#4338ca');}\n    if(txt){txt.style.opacity='.9';txt.setAttribute('fill','#3C3489');txt.style.fontSize='';}\n    if(bg){bg.style.opacity='0';}\n    pth.remove();\n  },1800);\n}\n \nfunction pulseCWE(id,color){\n  const g=document.getElementById('cwe-'+id); if(!g) return;\n  const c=g.querySelector('circle:first-child'); if(!c) return;\n  c.style.cssText=`stroke:${color};stroke-width:3.5;fill:${color}25;filter:drop-shadow(0 0 10px ${color})`;\n  setTimeout(()=>c.style.cssText='',1600);\n}\n \nfunction shoot(x1,y1,x2,y2,color,dur,uid){\n  const g=document.getElementById('anim-g');\n  const dist=Math.hypot(x2-x1,y2-y1);\n  const pid=`pt-${uid}`;\n  g.appendChild(svgEl('line',{x1,y1,x2,y2,stroke:color,'stroke-width':'2','stroke-dasharray':'9 4',opacity:'.65'},\n    `<animate attributeName=\"stroke-dashoffset\" from=\"${dist}\" to=\"0\" dur=\"${dur}ms\" repeatCount=\"indefinite\"\/>`));\n  const ph=svgEl('path',{id:pid,d:`M${x1},${y1} L${x2},${y2}`,fill:'none',stroke:'none'});\n  g.appendChild(ph);\n  g.appendChild(svgEl('circle',{r:'6.5',fill:color,opacity:'.95'},\n    `<animateMotion dur=\"${dur}ms\" repeatCount=\"indefinite\" calcMode=\"linear\"><mpath href=\"#${pid}\"\/><\/animateMotion>`));\n  [0,340,680].forEach((b,i)=>{\n    g.appendChild(svgEl('circle',{cx:x1,cy:y1,r:'11',fill:'none',stroke:color,'stroke-width':String(2.5-i*.7),opacity:String(.65-i*.2)},\n      `<animate attributeName=\"r\" from=\"11\" to=\"${26+i*7}\" dur=\"1s\" begin=\"${b}ms\" repeatCount=\"indefinite\"\/>\n       <animate attributeName=\"opacity\" from=\"${.65-i*.2}\" to=\"0\" dur=\"1s\" begin=\"${b}ms\" repeatCount=\"indefinite\"\/>`));\n  });\n}\n \nfunction impactAt(x,y,color,label){\n  const g=document.getElementById('anim-g');\n  [0,250,500].forEach(delay=>{\n    const r=svgEl('circle',{cx:x,cy:y,r:'8',fill:'none',stroke:color,'stroke-width':'3',opacity:'.9'},\n      `<animate attributeName=\"r\" from=\"8\" to=\"36\" dur=\"0.5s\" begin=\"${delay}ms\" repeatCount=\"1\"\/>\n       <animate attributeName=\"opacity\" from=\".9\" to=\"0\" dur=\"0.5s\" begin=\"${delay}ms\" repeatCount=\"1\"\/>`);\n    g.appendChild(r);\n  });\n  const t=svgEl('text',{x,y:String(Number(y)+10),fill:color,'font-size':'26','text-anchor':'middle','font-weight':'bold',opacity:'1'});\n  t.textContent='\u2298';\n  t.style.cssText='transition:opacity .5s';\n  setTimeout(()=>t.style.opacity='0',1300);\n  g.appendChild(t);\n  if(label){\n    const tl=svgEl('text',{x,y:String(Number(y)-13),fill:color,'font-size':'6.5','text-anchor':'middle','font-family':'monospace','letter-spacing':'1.5',opacity:'.85'});\n    tl.textContent=label;\n    tl.style.cssText='transition:opacity .5s';\n    setTimeout(()=>tl.style.opacity='0',1300);\n    g.appendChild(tl);\n  }\n}\n \nfunction exAnteWaves(targetX,targetY,color){\n  const g=document.getElementById('anim-g');\n  [0,220,440].forEach(delay=>{\n    const w=svgEl('circle',{cx:'350',cy:'350',r:'67',fill:'none',stroke:'#10b981','stroke-width':'2.5',opacity:'.75'},\n      `<animate attributeName=\"r\" from=\"67\" to=\"295\" dur=\"0.6s\" begin=\"${delay}ms\" repeatCount=\"1\"\/>\n       <animate attributeName=\"opacity\" from=\".75\" to=\"0\" dur=\"0.6s\" begin=\"${delay}ms\" repeatCount=\"1\"\/>`);\n    g.appendChild(w);\n  });\n  const t=svgEl('text',{x:'350',y:'354',fill:'#10b981','font-size':'11','text-anchor':'middle','font-weight':'bold',opacity:'0'});\n  t.textContent='\u2131 EX ANTE';\n  t.style.cssText='transition:opacity .25s';\n  g.appendChild(t);\n  setTimeout(()=>t.style.opacity='1', 180);\n  setTimeout(()=>{t.style.transition='opacity .6s';t.style.opacity='0';}, 1000);\n  flashTCBinner(color);\n  const midX=(CX+targetX)\/2, midY=(CY+targetY)\/2;\n  setTimeout(()=>impactAt(midX,midY,color,'EX ANTE'), 380);\n}\n \nfunction runAtk(atk){\n  clearAnim();\n  const cwes=Array.isArray(atk.cwe)?atk.cwe:[atk.cwe];\n  const c=atk.color;\n  const isHybrid=!!atk.hybrid||cwes.length>1;\n  const isExAnte=atk.stopAt==='EXANTE';\n \n  document.getElementById('atk-icon').textContent=atk.icon;\n  const nm=document.getElementById('atk-name'); nm.textContent=atk.name; nm.style.color=c;\n  document.getElementById('atk-sub').textContent=atk.sub;\n  const latEl=document.getElementById('atk-lat'); latEl.textContent=atk.lat;\n  latEl.style.color=atk.layer.includes('TCB')?'#818cf8':'#10b981';\n  document.getElementById('atk-lay').textContent=atk.blocked+' \u00b7 '+atk.layer;\n  document.getElementById('atk-card').style.borderColor=c+'55';\n  document.getElementById('m-lat').textContent=atk.lat;\n  document.getElementById('m-lat').style.color=atk.layer.includes('TCB')?'#818cf8':'#10b981';\n  document.getElementById('m-layer').textContent=atk.layer;\n \n  cwes.forEach(id=>pulseCWE(id,c));\n \n  if(isExAnte){\n    cwes.forEach((cid,i)=>{\n      const [cx,cy]=CWE_POS[cid]||[350,42];\n      const mx=(CX+cx)\/2, my=(CY+cy)\/2;\n      setTimeout(()=>shoot(cx,cy,mx,my,c,400,`ex-${cid}-${i}`), i*60);\n    });\n    setTimeout(()=>{\n      activateExAnte();\n      const [cx,cy]=CWE_POS[cwes[0]]||[350,42];\n      exAnteWaves(cx,cy,c);\n      atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),j*100));\n    }, 300);\n \n  } else if(isHybrid){\n    if(atk.stopAt==='L1B') setTimeout(()=>{ activateExAnte(); activateM24(); }, 100);\n    else setTimeout(()=>activateM24(), 100);\n    cwes.forEach((cid,i)=>{\n      const [cx,cy]=CWE_POS[cid]||[350,42];\n      const [wx,wy]=onRing(cx,cy,R_WALL);\n      setTimeout(()=>shoot(cx,cy,wx,wy,c,480,`hy-${cid}-${i}`),i*90);\n    });\n    setTimeout(()=>{\n      flashWall(c);\n      atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),j*100));\n      flashTCBinner(c);\n    }, 520);\n \n  } else {\n    const [cx,cy]=CWE_POS[cwes[0]]||[350,42];\n    const stopR = atk.stopAt==='WALL'? R_WALL : R_L1B;\n    const [ix,iy]=onRing(cx,cy,stopR);\n    shoot(cx,cy,ix,iy,c,520,'p1');\n \n    if(atk.stopAt==='L1B'){\n      activateM24();\n      setTimeout(()=>{\n        const w=document.getElementById('wall-ring');\n        if(w){w.setAttribute('stroke',c);w.style.opacity='.45';setTimeout(()=>{w.setAttribute('stroke','#D97706');w.style.opacity='.28';},350);}\n      }, 280);\n    }\n \n    atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),380+j*100));\n    if(atk.stopAt==='L1B') setTimeout(()=>activateExAnte(),200);\n    setTimeout(()=>flashTCBinner(c),420);\n    if(atk.stopAt==='WALL') setTimeout(()=>flashWall(c),400);\n  }\n \n  atk.steps.forEach(s=>setTimeout(()=>addLog(s.t,s.m,s.l),s.d));\n \n  const impactDelay=isExAnte?600:isHybrid?600:520;\n  setTimeout(()=>{\n    if(isExAnte) return;\n    if(isHybrid){\n      clearAnim();\n      cwes.slice(0,3).forEach((cid,i)=>{\n        const [cx,cy]=CWE_POS[cid]||[350,42];\n        const [wx,wy]=onRing(cx,cy,R_WALL);\n        setTimeout(()=>impactAt(wx,wy,c,''), i*90);\n      });\n    } else {\n      clearAnim();\n      const [cx,cy]=CWE_POS[Array.isArray(atk.cwe)?atk.cwe[0]:atk.cwe]||[350,42];\n      const stopR=atk.stopAt==='WALL'?R_WALL:R_L1B;\n      const [ix,iy]=onRing(cx,cy,stopR);\n      const label=atk.stopAt==='L1B'&&atk.layer.includes('TCB')?'0-DAY':'BLOQU\u00c9';\n      impactAt(ix,iy,c,label);\n      if(atk.stopAt==='WALL') flashWall(c);\n    }\n    blocked++;\n    const bel=document.getElementById('m-blocked');\n    bel.textContent=blocked; bel.style.color=c;\n    setTimeout(()=>bel.style.color='#10b981',600);\n    pulseCounter();\n  }, impactDelay);\n \n  setTimeout(()=>{\n    clearAnim();\n    document.getElementById('atk-card').style.borderColor='#21262d';\n  }, 2000);\n}\n \nconst MODES={normal:NORMAL,zeroday:ZERODAY,exante:EXANTE,hybrid:HYBRID};\nconst MODE_LABELS={normal:'STD',zeroday:'0-DAY',exante:'\u2131 EX ANTE',hybrid:'IA+HUM'};\nconst MODE_COLORS={normal:'#D97706',zeroday:'#ef4444',exante:'#10b981',hybrid:'#818cf8'};\nconst BTN_MAP={normal:'norm',zeroday:'zd',exante:'exante',hybrid:'hybrid'};\nlet mode='normal', autoOn=true, simTimer=null, blocked=0, simIdx=0;\n \nfunction next(){\n  if(!autoOn) return;\n  const arr=MODES[mode];\n  runAtk(arr[simIdx%arr.length]);\n  simIdx++;\n  simTimer=setTimeout(next, mode==='hybrid'?2900:2500);\n}\n \nfunction setMode(m){\n  if(simTimer) clearTimeout(simTimer);\n  mode=m; simIdx=0;\n  setTimeout(()=>startCounter(m), 50);\n  Object.keys(BTN_MAP).forEach(k=>document.getElementById('btn-'+BTN_MAP[k]).classList.remove('active'));\n  document.getElementById('btn-'+BTN_MAP[m]).classList.add('active');\n  document.getElementById('m-mode').textContent=MODE_LABELS[m];\n  document.getElementById('m-mode').style.color=MODE_COLORS[m];\n  runAtk(MODES[m][0]); simIdx=1;\n  autoOn=true;\n  document.getElementById('btn-auto').classList.add('active');\n  simTimer=setTimeout(next, mode==='hybrid'?2900:2500);\n}\n \nfunction toggleAuto(){\n  const btn=document.getElementById('btn-auto');\n  const dot=document.getElementById('sim-dot');\n  const lbl=document.getElementById('sim-label');\n  if(autoOn){\n    autoOn=false; if(simTimer)clearTimeout(simTimer);\n    btn.classList.remove('active'); btn.textContent='\u23f5 Auto';\n    dot.style.background='#374151'; dot.style.animation='none';\n    lbl.textContent='PAUSE'; lbl.style.color='#4b5563';\n  } else {\n    autoOn=true;\n    btn.classList.add('active');\n    dot.style.background='#10b981'; dot.style.animation='blink 1.2s ease-in-out infinite';\n    lbl.textContent='ACTIF'; lbl.style.color='#10b981';\n    next();\n  }\n}\n \nfunction simReset(){\n  if(simTimer)clearTimeout(simTimer);\n  autoOn=false; simIdx=0; blocked=0; clearAnim();\n  mode='normal';\n  Object.keys(BTN_MAP).forEach(k=>document.getElementById('btn-'+BTN_MAP[k]).classList.remove('active'));\n  document.getElementById('btn-norm').classList.add('active');\n  document.getElementById('m-blocked').textContent='0';\n  document.getElementById('m-mode').textContent='STD'; document.getElementById('m-mode').style.color='#D97706';\n  document.getElementById('m-lat').textContent='\u2014'; document.getElementById('m-layer').textContent='\u2014';\n  document.getElementById('atk-icon').textContent='\u23f3';\n  document.getElementById('atk-name').textContent='R\u00e9initialis\u00e9'; document.getElementById('atk-name').style.color='#6b7280';\n  document.getElementById('atk-sub').textContent='\u2014'; document.getElementById('atk-lat').textContent='\u2014'; document.getElementById('atk-lay').textContent='\u2014';\n  document.getElementById('log').innerHTML='<div class=\"ll\"><span class=\"lt\">--:--.---<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">Syst\u00e8me r\u00e9initialis\u00e9 \u2014 TCB inviol\u00e9e \u2014 attaques stopp\u00e9es en orbite<\/span><\/div>';\n  startCounter('normal');\n  autoOn=true;\n  document.getElementById('btn-auto').classList.add('active');\n  document.getElementById('sim-dot').style.cssText='background:#0F6E56;animation:blink 1.2s ease-in-out infinite';\n  document.getElementById('sim-label').textContent='ACTIF'; document.getElementById('sim-label').style.color='#10b981';\n  setTimeout(next,1000);\n}\n \nsetTimeout(next,1200);\n \nconst RATES = {\n  normal:  { val: 1900000, label: '1,9 M\/s',  color: '#0F6E56', sub: 'Chemin WALL-DOME L1b complet \u00b7 2,1 \u00b5s\/d\u00e9cision \u00b7 4 c\u0153urs' },\n  zeroday: { val: 9500000, label: '9,5 M\/s',  color: '#534AB7', sub: 'Chemin seL4 kernel T1..T8 \u00b7 421 ns\/d\u00e9cision \u00b7 4 c\u0153urs' },\n  exante:  { val: 9500000, label: '9,5 M\/s',  color: '#065F46', sub: 'Preuve HOL remontante \u00b7 classe enti\u00e8re \u00b7 0 CVE \u00b7 421 ns' },\n  hybrid:  { val: 1900000, label: '1,9 M\/s',  color: '#7c3aed', sub: 'Multi-vecteurs simultan\u00e9s \u00b7 L1b + seL4 \u00b7 \u00d7100 000 vs APT IA' },\n};\n \nlet ctrTarget = 1900000, displayVal = 0;\n \nfunction formatCount(n){\n  if(n >= 1000000) return (n\/1000000).toFixed(1).replace('.',',') + ' M';\n  if(n >= 1000)    return (n\/1000).toFixed(0) + ' K';\n  return String(n);\n}\n \nfunction updateCounter(m){\n  const r = RATES[m] || RATES['normal'];\n  ctrTarget = r.val;\n  const el = document.getElementById('atk-counter');\n  const sub = document.getElementById('atk-counter-sub');\n  if(el){ el.style.color = r.color; }\n  if(sub){ sub.textContent = r.sub; }\n}\n \nfunction animCounter(){\n  const el = document.getElementById('atk-counter');\n  if(!el) return;\n  const step = Math.ceil(ctrTarget \/ 60);\n  displayVal = Math.min(displayVal + step, ctrTarget);\n  el.textContent = formatCount(displayVal);\n  if(displayVal < ctrTarget) requestAnimationFrame(animCounter);\n}\n \nfunction startCounter(newMode){\n  displayVal = 0;\n  updateCounter(newMode);\n  requestAnimationFrame(animCounter);\n}\n \nstartCounter('normal');\n \nfunction pulseCounter(){\n  const el=document.getElementById('atk-counter');\n  if(!el) return;\n  el.style.transform='scale(1.08)';\n  el.style.transition='transform .15s ease';\n  setTimeout(()=>{el.style.transform='scale(1)';},300);\n}\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Security Dashboard \u2014 CORTEX ORIGIN\u2122 v7.1<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\n:root{\n  --bg:#f5f4f1;--bg2:#ffffff;--bg3:#f0eeeb;--bg4:#e8e6e1;\n  --border:rgba(0,0,0,0.08);--borderem:rgba(0,0,0,0.15);\n  --text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;\n  --tcb:#534AB7;--tcb-bg:#EEEDFE;--tcb-txt:#3C3489;\n  --sec:#0F6E56;--sec-bg:#E1F5EE;--sec-txt:#085041;\n  --safe:#854F0B;--safe-bg:#FAEEDA;--safe-txt:#633806;\n  --wip:#993C1D;--wip-bg:#FAECE7;--wip-txt:#712B13;\n  --crit:#b91c1c;--crit-bg:#fef2f2;\n  --high:#92400e;--high-bg:#fffbeb;\n  --proof:#534AB7;--proof-bg:#EEEDFE;\n  --r:10px;--r-sm:6px\n}\nbody{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased}\n \n\/* PAGE *\/\n.page{max-width:1120px;margin:0 auto;padding:48px 24px 96px}\n \n\/* HEADER *\/\n.eyebrow{font-size:11px;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--text3);margin-bottom:10px}\nh1{font-size:26px;font-weight:700;color:var(--text);letter-spacing:-.02em;margin-bottom:6px}\n.subline{font-size:13px;color:var(--text2);max-width:580px;margin-bottom:8px}\n.verdict-badge{display:inline-flex;align-items:center;gap:8px;background:var(--wip-bg);color:var(--wip-txt);font-size:12px;font-weight:700;padding:5px 14px;border-radius:20px;margin-bottom:32px}\n \n\/* KPI GRID *\/\n.kpi-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:12px}\n.kpi-grid-2{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:32px}\n.kpi{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:14px 16px;position:relative;overflow:hidden}\n.kpi::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}\n.kpi.k-tnr::before{background:var(--tcb)}\n.kpi.k-sir::before{background:var(--tcb)}\n.kpi.k-dr::before{background:var(--sec)}\n.kpi.k-br::before{background:var(--sec)}\n.kpi.k-mttb::before{background:var(--safe)}\n.kpi.k-mttd::before{background:var(--safe)}\n.kpi.k-mttdp99::before{background:var(--wip)}\n.kpi.k-cem::before{background:var(--tcb)}\n.kpi-lbl{font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin-bottom:5px}\n.kpi-val{font-size:24px;font-weight:700;letter-spacing:-.02em;line-height:1;margin-bottom:3px}\n.kpi-sub{font-size:11px;color:var(--text2)}\n.kpi-formula{font-size:10px;color:var(--text3);margin-top:4px;font-style:italic}\n \n\/* SECTION TITLE *\/\n.sec-title{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin:32px 0 14px;display:flex;align-items:center;gap:12px}\n.sec-title::after{content:'';flex:1;height:.5px;background:var(--border)}\n \n\/* CHART *\/\n.chart-card{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:20px 22px;margin-bottom:10px}\n.chart-legend{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:14px}\n.leg{font-size:11px;color:var(--text2);display:flex;align-items:center;gap:5px}\n.leg-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}\n.chart-wrap{position:relative;width:100%;height:320px}\n.chart-wrap-sm{position:relative;width:100%;height:240px}\n.chart-wrap-radar{position:relative;width:100%;height:420px}\n.p-chart-wrap-radar{position:relative;width:100%;height:260px;margin-bottom:16px}\n.radar-note{font-size:10px;color:var(--text3);margin-top:10px;font-style:italic;text-align:center}\n \n\/* CWE COVERAGE GRID *\/\n.cwe-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:10px}\n.cwe-card{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:14px 14px 12px;position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:center;text-align:center}\n.cwe-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}\n.cwe-card.s-prouve::before{background:var(--tcb)}\n.cwe-card.s-couvert::before{background:var(--sec)}\n.cwe-card.s-marginal::before{background:var(--wip)}\n.cwe-card-id{font-size:11px;font-weight:700;color:var(--text);letter-spacing:.02em;margin-bottom:2px}\n.cwe-card-desc{font-size:10px;color:var(--text2);margin-bottom:8px;line-height:1.3}\n.cwe-sev-badge{font-size:9px;font-weight:700;padding:2px 7px;border-radius:10px;margin-bottom:10px;letter-spacing:.06em;text-transform:uppercase}\n.sev-c{background:var(--crit-bg);color:var(--crit)}\n.sev-h{background:var(--high-bg);color:var(--high)}\n.cwe-donut-wrap{position:relative;width:72px;height:72px;margin:0 auto 10px;flex-shrink:0}\n.cwe-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}\n.cwe-donut-tnr{font-size:13px;font-weight:700;line-height:1;color:var(--text)}\n.cwe-donut-lbl{font-size:8px;color:var(--text3);margin-top:1px;text-transform:uppercase;letter-spacing:.05em}\n.cwe-status{font-size:9px;font-weight:700;padding:2px 8px;border-radius:10px;letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px}\n.st-prouve{background:var(--tcb-bg);color:var(--tcb-txt)}\n.st-couvert{background:var(--sec-bg);color:var(--sec-txt)}\n.st-marginal{background:var(--wip-bg);color:var(--wip-txt)}\n.cwe-mttd{font-size:10px;color:var(--text3)}\n.cwe-mttd strong{color:var(--text2)}\n@media(max-width:900px){.cwe-grid{grid-template-columns:repeat(3,1fr)}}\n@media(max-width:560px){.cwe-grid{grid-template-columns:repeat(2,1fr)}}\n \n\/* CWE MATRIX *\/\n.matrix-wrap{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);overflow:auto;margin-bottom:10px}\n.matrix-table{width:100%;border-collapse:collapse;font-size:11px;min-width:900px}\n.matrix-table th{background:var(--bg3);padding:8px 10px;text-align:left;font-weight:600;color:var(--text2);border-bottom:.5px solid var(--border);white-space:nowrap;position:sticky;top:0;z-index:2}\n.matrix-table th.cwe-col{text-align:center;font-size:10px;letter-spacing:-.01em;min-width:52px;padding:8px 4px}\n.matrix-table td{padding:7px 10px;border-bottom:.5px solid var(--border);vertical-align:middle}\n.matrix-table td.cell{text-align:center;padding:7px 4px}\n.matrix-table tr:hover td{background:var(--bg3)}\n.mod-row-name{font-weight:600;color:var(--text);font-size:12px;white-space:nowrap}\n.layer-tag{font-size:9px;color:var(--text3);font-weight:500;margin-top:1px}\n\/* Cell types *\/\n.c-proof{background:var(--proof-bg);color:var(--proof-txt,#3C3489);font-size:10px;font-weight:700;border-radius:3px;padding:2px 4px;display:inline-block}\n.c-module{background:var(--sec-bg);color:var(--sec-txt);font-size:10px;font-weight:600;border-radius:3px;padding:2px 4px;display:inline-block}\n.c-na{color:var(--text3);font-size:11px}\n.c-empty{color:var(--bg4);font-size:11px}\n\/* \u2500\u2500 MATRIX TABS \u2500\u2500 *\/\n.tab-bar{display:flex;gap:4px;margin-bottom:12px;border-bottom:.5px solid var(--border);padding-bottom:0}\n.tab-btn{font-size:11px;font-weight:600;padding:7px 14px;border:none;background:transparent;cursor:pointer;color:var(--text3);border-bottom:2px solid transparent;margin-bottom:-1px;border-radius:4px 4px 0 0;transition:all .15s}\n.tab-btn:hover{color:var(--text);background:var(--bg3)}\n.tab-btn.active{color:var(--tcb);border-bottom-color:var(--tcb);background:var(--tcb-bg)}\n.tab-panel{display:none}.tab-panel.active{display:block}\n.c-sel4-kernel{background:#1e1a4a;color:#a8a1f0;font-size:10px;font-weight:700;border-radius:3px;padding:2px 5px;display:inline-block;letter-spacing:.02em}\n\/* seL4 inherited badge \u2014 shown in module rows where seL4 covers *\/\n.c-sel4-inherited{background:transparent;color:#9e9b98;font-size:9px;font-weight:500;border-radius:3px;padding:2px 4px;display:inline-block;border:.5px solid rgba(83,74,183,.2);letter-spacing:.01em}\n\/* seL4 kernel row styling *\/\n.sel4-row td{background:#f7f6ff !important;border-bottom:2px solid rgba(83,74,183,.2) !important}\n.sel4-row:hover td{background:#eeecff !important}\n.sel4-row .mod-row-name{color:var(--tcb)}\n.sel4-row .layer-tag{color:var(--tcb-txt);font-weight:600}\n\/* CWE severity header colors *\/\n.sev-crit{color:var(--crit);background:var(--crit-bg)}\n.sev-high{color:var(--high);background:var(--high-bg)}\n \n\/* MODULE GRID *\/\n.mods-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}\n.mod-card{background:var(--bg2);border:.5px solid var(--border);border-left:3px solid transparent;border-radius:var(--r);padding:14px 16px;cursor:pointer;transition:box-shadow .18s,transform .15s,border-color .15s;position:relative}\n.mod-card:hover{box-shadow:0 4px 16px rgba(0,0,0,.08);transform:translateY(-2px);border-color:var(--borderem)}\n.mc-tcb{border-left-color:var(--tcb)}\n.mc-l1b{border-left-color:var(--sec)}\n.mc-na{border-left-color:var(--text3)}\n.mc-head{display:flex;justify-content:space-between;align-items:flex-start;gap:6px;margin-bottom:6px}\n.mc-id{font-size:10px;font-weight:600;letter-spacing:.04em;color:var(--text3)}\n.mc-verdict{font-size:10px;font-weight:700;padding:2px 7px;border-radius:4px;white-space:nowrap}\n.v-prouve{background:var(--sec-bg);color:var(--sec-txt)}\n.v-marg{background:var(--wip-bg);color:var(--wip-txt)}\n.v-na{background:var(--bg3);color:var(--text3)}\n.mc-name{font-size:13px;font-weight:700;color:var(--text);margin-bottom:8px;letter-spacing:-.01em}\n.mc-metrics{display:flex;flex-wrap:wrap;gap:3px 10px;margin-bottom:9px}\n.mc-m{font-size:11px;color:var(--text2)}\n.mc-m strong{color:var(--text);font-weight:600}\n.bar-bg{height:3px;background:var(--bg3);border-radius:2px;overflow:hidden}\n.bar-fg{height:100%;border-radius:2px}\n.hint{position:absolute;bottom:9px;right:12px;font-size:9px;font-weight:700;letter-spacing:.08em;color:var(--text3);opacity:0;transition:opacity .18s;text-transform:uppercase}\n.mod-card:hover .hint{opacity:1}\n \n\/* FILTERS *\/\n.filters{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:16px}\n.fbtn{font-size:12px;font-weight:500;padding:6px 14px;border-radius:20px;border:.5px solid var(--borderem);background:transparent;color:var(--text2);cursor:pointer;transition:all .15s;outline:none}\n.fbtn:hover{background:var(--bg3);color:var(--text)}\n.fbtn.active{background:var(--bg2);color:var(--text);border-color:var(--borderem)}\n.fbtn.f-crit.active{background:var(--crit-bg);color:var(--crit);border-color:rgba(185,28,28,.25)}\n.fbtn.f-high.active{background:var(--high-bg);color:var(--high);border-color:rgba(146,64,14,.25)}\n \n\/* OVERLAY & PANEL *\/\n.overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:900;backdrop-filter:blur(2px)}\n.overlay.open{display:block}\n.panel{position:fixed;top:0;right:-680px;width:min(640px,95vw);height:100vh;background:var(--bg2);border-left:.5px solid var(--borderem);box-shadow:-20px 0 60px rgba(0,0,0,.12);overflow-y:auto;z-index:901;transition:right .3s cubic-bezier(.4,0,.2,1)}\n.panel.open{right:0}\n.panel-hdr{display:flex;align-items:flex-start;justify-content:space-between;padding:22px 26px 18px;border-bottom:.5px solid var(--border);position:sticky;top:0;background:var(--bg2);z-index:2}\n.panel-meta{font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--text3);margin-bottom:4px}\n.panel-name{font-size:20px;font-weight:700;color:var(--text);letter-spacing:-.02em}\n.panel-score-wrap{display:flex;align-items:center;gap:10px;flex-shrink:0}\n.panel-verdict{font-size:12px;font-weight:700;padding:4px 12px;border-radius:20px}\n.panel-close{background:var(--bg3);border:.5px solid var(--border);border-radius:var(--r-sm);color:var(--text2);font-size:18px;width:30px;height:30px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s}\n.panel-close:hover{background:var(--borderem)}\n.panel-body{padding:22px 26px}\n \n\/* Panel KPIs *\/\n.p-kpis{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:20px}\n.p-kpi{background:var(--bg3);border-radius:var(--r-sm);padding:10px 12px}\n.p-kpi-lbl{font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin-bottom:3px}\n.p-kpi-val{font-size:18px;font-weight:700;color:var(--text);letter-spacing:-.02em;line-height:1;margin-bottom:2px}\n.p-kpi-sub{font-size:10px;color:var(--text2)}\n \n\/* Panel tool rows *\/\n.p-sec-lbl{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin:18px 0 10px}\n.tool-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}\n.tool-name{font-size:12px;font-weight:600;color:var(--text);min-width:130px}\n.tool-bar{flex:1;height:5px;background:var(--bg3);border-radius:3px;overflow:hidden}\n.tool-fill{height:100%;border-radius:3px}\n.tool-val{font-size:11px;color:var(--text2);min-width:90px;text-align:right}\n \n\/* Panel CWE list *\/\n.cwe-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px}\n.cwe-chip{font-size:10px;font-weight:700;padding:3px 8px;border-radius:4px;display:flex;align-items:center;gap:4px}\n.chip-proof{background:var(--proof-bg);color:var(--tcb-txt)}\n.chip-module{background:var(--sec-bg);color:var(--sec-txt)}\n \n\/* Panel MTTD chart *\/\n.p-chart-wrap{position:relative;width:100%;height:180px;margin-bottom:16px}\n \n\/* Status cards *\/\n.stat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:16px}\n.stat-card{border:.5px solid var(--border);border-radius:var(--r-sm);padding:10px 12px;display:flex;gap:10px;align-items:flex-start}\n.stat-icon{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0}\n.si-ok{background:var(--sec-bg);color:var(--sec-txt)}\n.si-tcb{background:var(--tcb-bg);color:var(--tcb-txt)}\n.si-warn{background:var(--wip-bg);color:var(--wip-txt)}\n.si-na{background:var(--bg3);color:var(--text3)}\n.stat-title{font-size:12px;font-weight:600;color:var(--text)}\n.stat-sub{font-size:11px;color:var(--text2);margin-top:1px;line-height:1.5}\n \n\/* Disclaimer *\/\n.disclaimer{margin-top:24px;padding:12px 16px;background:var(--bg3);border-radius:var(--r-sm);font-size:11px;color:var(--text3);line-height:1.75;font-style:italic}\n \n@media(max-width:800px){.kpi-grid,.kpi-grid-2{grid-template-columns:repeat(2,1fr)}.mods-grid{grid-template-columns:repeat(2,1fr)}.p-kpis{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:480px){h1{font-size:20px}.mods-grid{grid-template-columns:1fr}.stat-grid{grid-template-columns:1fr}}\n<\/style>\n<\/head>\n<body>\n<div class=\"page\">\n \n  <!-- HEADER -->\n  <div class=\"eyebrow\">Security Evaluation \u00b7 CORTEX ORIGIN\u2122 v7.1<\/div>\n  <h1>CEM Security Dashboard<\/h1>\n  <p class=\"subline\">Architecture deux couches \u2014 seL4 EAL7 + 13 modules CORTEX. 7,1M vecteurs \u00b7 <strong>34 CWE document\u00e9s<\/strong> \u00b7 <strong>22 CWE\/LLM couverts non formalis\u00e9s<\/strong> \u00b7 13 familles de risque \u00b7 MTTD 8,6 \u00b5s \u00b7 TNR 99,8%.<\/p>\n  <div class=\"verdict-badge\">\u2714 CONFORME \u2014 15\/15 CWE mesur\u00e9s avec TNR \u00b7 19 CWE \u00e9tendus couverts \u00b7 13 familles de risque \u00b7 CWE-078 : vecteur r\u00e9seau inexistant (WALL-DOME\u2122 \u2131 + M24 Offline\u2122)<\/div>\n \n  <!-- ARCHITECTURAL CONTEXT NOTE -->\n  <div style=\"background:linear-gradient(135deg,rgba(83,74,183,.06),rgba(15,110,86,.04));border:.5px solid rgba(83,74,183,.18);border-radius:var(--r);padding:13px 18px;margin-bottom:20px;display:flex;align-items:flex-start;gap:12px\">\n    <span style=\"font-size:16px;line-height:1;margin-top:1px\">\ud83d\udee1<\/span>\n    <div style=\"font-size:11px;color:var(--text2);line-height:1.7\">\n      <strong style=\"color:var(--text)\">TNR 99,8%<\/strong> mesur\u00e9 sur vecteurs actifs en environnement instrument\u00e9 \u00b7\n      En conditions op\u00e9rationnelles, l&rsquo;architecture offline (<strong>M24 Offline Controller\u2122<\/strong>) et l&rsquo;isolation r\u00e9seau formellement prouv\u00e9e (<strong>WALL-DOME\u2122 \u2131<\/strong> \u00b7 ProVerif 5\/5 \u00b7 TLA+ 1480 \u00e9tats)\n      rendent la <strong>surface d&rsquo;attaque r\u00e9siduelle th\u00e9orique<\/strong> \u2014 aucun vecteur r\u00e9seau ne peut atteindre le syst\u00e8me sans compromission physique pr\u00e9alable.\n    <\/div>\n  <\/div>\n \n  <!-- SECURITY OBJECTIVE -->\n  <div style=\"margin-bottom:18px;padding:14px 20px;background:linear-gradient(90deg,rgba(83,74,183,.07),rgba(83,74,183,.02));border-left:3px solid var(--tcb);border-radius:0 var(--r) var(--r) 0\">\n    <div style=\"font-size:9px;font-weight:700;color:var(--tcb);text-transform:uppercase;letter-spacing:.1em;margin-bottom:6px\">Security Objective<\/div>\n    <div style=\"font-size:12px;color:var(--text2);line-height:1.7;font-style:italic\">\n      Emp\u00eacher toute action num\u00e9rique non autoris\u00e9e ou non conforme aux politiques d\u00e9finies, et garantir qu&rsquo;une compromission \u00e9ventuelle ne puisse ni se propager ni produire d&rsquo;effet durable sur le syst\u00e8me.\n    <\/div>\n  <\/div>\n \n  <!-- SUMMARY STRIP -->\n  <div style=\"display:flex;flex-wrap:wrap;gap:8px;margin-bottom:18px\">\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--tcb);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">Architecture<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--tcb);line-height:1\">2<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">couches<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--tcb);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">Kernel<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--tcb);line-height:1\">EAL7<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">seL4 Isabelle\/HOL<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--sec);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">Modules<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--sec);line-height:1\">13<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">CORTEX certifi\u00e9s<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--tcb);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">TNR<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--tcb);line-height:1\">99,8%<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">Total Neutralization<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--safe);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">MTTD<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--safe);line-height:1\">8,6 \u00b5s<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">pipeline combin\u00e9<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid var(--sec);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">MTTC<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--sec);line-height:1\">~16 \u00b5s<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">Mean Time To Contain<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid rgba(0,0,0,.15);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">CWE<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--text);line-height:1\">34<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">document\u00e9s + 22 arch.<\/div>\n    <\/div>\n    <div style=\"flex:1;min-width:100px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);border-top:2px solid rgba(0,0,0,.15);padding:10px 14px;text-align:center\">\n      <div style=\"font-size:9px;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px\">Risk families<\/div>\n      <div style=\"font-size:20px;font-weight:700;color:var(--text);line-height:1\">13<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:2px\">MITRE \/ OWASP \/ ICS<\/div>\n    <\/div>\n  <\/div>\n \n  <!-- KPIs ROW 1 -->\n  <div class=\"kpi-grid\">\n    <div class=\"kpi k-tnr\">\n      <div class=\"kpi-lbl\">TNR combin\u00e9e<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--tcb)\">99,8%<\/div>\n      <div class=\"kpi-sub\">Total Neutralization Rate<\/div>\n      <div class=\"kpi-formula\">SIR + (1\u2212SIR) \u00d7 DR<\/div>\n    <\/div>\n    <div class=\"kpi k-sir\">\n      <div class=\"kpi-lbl\">SIR seL4 \u2131<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--tcb)\">65,0%<\/div>\n      <div class=\"kpi-sub\">Structural Immunity Rate<\/div>\n      <div class=\"kpi-formula\">Preuve formelle Isabelle\/HOL<\/div>\n    <\/div>\n    <div class=\"kpi k-dr\">\n      <div class=\"kpi-lbl\">DR modules<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--sec)\">99,5%<\/div>\n      <div class=\"kpi-sub\">Detection Rate (forwarded)<\/div>\n      <div class=\"kpi-formula\">\u2191 99,4% \u2192 99,5% avec M24<\/div>\n    <\/div>\n    <div class=\"kpi k-br\">\n      <div class=\"kpi-lbl\">BR (sur d\u00e9tect\u00e9es)<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--sec)\">90,3%<\/div>\n      <div class=\"kpi-sub\">Block Rate<\/div>\n      <div class=\"kpi-formula\">parmi les menaces d\u00e9tect\u00e9es<\/div>\n    <\/div>\n  <\/div>\n  <!-- KPIs ROW 2 -->\n  <div class=\"kpi-grid-2\">\n    <div class=\"kpi k-mttb\">\n      <div class=\"kpi-lbl\">MTTB seL4<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--safe)\">421 ns<\/div>\n      <div class=\"kpi-sub\">Mean Time To Block<\/div>\n    <\/div>\n    <div class=\"kpi k-mttd\">\n      <div class=\"kpi-lbl\">MTTD combin\u00e9<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--safe)\">8,6 \u00b5s<\/div>\n      <div class=\"kpi-sub\">pipeline reconstitu\u00e9<\/div>\n    <\/div>\n    <div class=\"kpi k-mttdp99\">\n      <div class=\"kpi-lbl\">MTTD p99<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--wip)\">54,64 \u00b5s<\/div>\n      <div class=\"kpi-sub\">percentile 99<\/div>\n    <\/div>\n    <div class=\"kpi k-cem\">\n      <div class=\"kpi-lbl\">CEM Timing<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--tcb)\">18,9\/19<\/div>\n      <div class=\"kpi-sub\">7,1M vecteurs \u00b7 15 CWE \u00b7 13 modules<\/div>\n    <\/div>\n    <div class=\"kpi\" style=\"border-top:2px solid var(--sec)\">\n      <div class=\"kpi-lbl\">MTTC \u2014 Containment<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--sec)\">~16 \u00b5s<\/div>\n      <div class=\"kpi-sub\">Mean Time To Containment<\/div>\n      <div class=\"kpi-formula\">MTTD 8,6 + MTTB 5,2 + HALT 2,1 \u00b5s<\/div>\n    <\/div>\n    <div class=\"kpi\" style=\"border-top:2px solid var(--tcb)\">\n      <div class=\"kpi-lbl\">Network Attack Surface<\/div>\n      <div class=\"kpi-val\" style=\"color:var(--tcb)\">0<\/div>\n      <div class=\"kpi-sub\">vecteur r\u00e9seau direct<\/div>\n      <div class=\"kpi-formula\">Offline + WALL-DOME\u2122 \u2131 + M24<\/div>\n    <\/div>\n  <\/div>\n \n  <!-- ASSURANCE ARGUMENT -->\n  <div class=\"sec-title\">Security Assurance Argument<\/div>\n  <div class=\"chart-card\" style=\"padding:18px 20px 14px\">\n    <div style=\"font-size:11px;color:var(--text2);line-height:1.7;margin-bottom:16px\">\n      La s\u00e9curit\u00e9 de l&rsquo;architecture CORTEX ORIGIN\u2122 repose sur <strong>quatre niveaux d&rsquo;assurance compl\u00e9mentaires<\/strong> \u2014 chacun op\u00e9rant ind\u00e9pendamment et se renfor\u00e7ant mutuellement.\n    <\/div>\n    <div class=\"assurance-grid\">\n      <div class=\"assurance-card\" style=\"border-top:2px solid var(--tcb)\">\n        <div class=\"assurance-num\">1<\/div>\n        <div class=\"assurance-title\">Isolation formelle du socle<\/div>\n        <div class=\"assurance-items\">\n          <div class=\"assurance-item\">Micro-noyau seL4 certifi\u00e9 EAL7<\/div>\n          <div class=\"assurance-item\">Mod\u00e8le de capacit\u00e9s hardware<\/div>\n          <div class=\"assurance-item\">Preuves formelles Isabelle\/HOL<\/div>\n          <div class=\"assurance-item\">M00 Root-of-Trust \u00b7 PRISM<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"assurance-card\" style=\"border-top:2px solid var(--tcb)\">\n        <div class=\"assurance-num\">2<\/div>\n        <div class=\"assurance-title\">Gouvernance d\u00e9cisionnelle ex-ante<\/div>\n        <div class=\"assurance-items\">\n          <div class=\"assurance-item\">OMEGA PolicyForge\u2122 \u2014 policy engine<\/div>\n          <div class=\"assurance-item\">PRISM Audit Chain \u2014 transitions FSM<\/div>\n          <div class=\"assurance-item\">ATLAS\u2122 \u2014 validation structurelle<\/div>\n          <div class=\"assurance-item\">AEGIS\u2122 \u2014 gate d&rsquo;ex\u00e9cution<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"assurance-card\" style=\"border-top:2px solid var(--sec)\">\n        <div class=\"assurance-num\">3<\/div>\n        <div class=\"assurance-title\">D\u00e9tection comportementale<\/div>\n        <div class=\"assurance-items\">\n          <div class=\"assurance-item\">SENTINEL\u2122 \u2014 scoring anomalie<\/div>\n          <div class=\"assurance-item\">CORTEX-SHIELD\u2122 \u2014 filtrage syst\u00e8me<\/div>\n          <div class=\"assurance-item\">MTTD combin\u00e9 8,6 \u00b5s<\/div>\n          <div class=\"assurance-item\">7,1M vecteurs \u00b7 15 CWE mesur\u00e9s<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"assurance-card\" style=\"border-top:2px solid var(--safe)\">\n        <div class=\"assurance-num\">4<\/div>\n        <div class=\"assurance-title\">Confinement et arr\u00eat s\u00e9curis\u00e9<\/div>\n        <div class=\"assurance-items\">\n          <div class=\"assurance-item\">WALL-DOME\u2122 \u2131 \u2014 isolation r\u00e9seau<\/div>\n          <div class=\"assurance-item\">M24 Offline Controller\u2122 \u2014 fail-closed<\/div>\n          <div class=\"assurance-item\">M09-CB CircuitBreaker \u2014 rate limit<\/div>\n          <div class=\"assurance-item\">HALT d\u00e9terministe \u2014 2,1 \u00b5s<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div style=\"font-size:11px;color:var(--text2);line-height:1.7;padding-top:12px;border-top:.5px solid var(--border);font-style:italic\">\n      La combinaison de ces m\u00e9canismes permet de r\u00e9duire fortement la surface d&rsquo;exploitation des attaques, y compris dans des sc\u00e9narios de vuln\u00e9rabilit\u00e9s inconnues (zero-day).\n    <\/div>\n  <\/div>\n \n  <!-- DEFENSE-IN-DEPTH LAYERS -->\n  <div class=\"sec-title\" style=\"margin-top:20px\">Defense-in-Depth Layers<\/div>\n  <div class=\"chart-card\" style=\"padding:16px 20px\">\n    <div class=\"defense-layers\">\n      <div class=\"dl-row\" style=\"background:rgba(83,74,183,.06);border-color:rgba(83,74,183,.2)\">\n        <div class=\"dl-num\" style=\"color:var(--tcb)\">L1<\/div>\n        <div class=\"dl-label\" style=\"color:var(--tcb)\">Hardware \/ Kernel<\/div>\n        <div class=\"dl-modules\">seL4 EAL7 \u00b7 Isabelle\/HOL \u00b7 mod\u00e8le de capacit\u00e9s \u00b7 isolation m\u00e9moire cross-domain \u00b7 421 ns<\/div>\n      <\/div>\n      <div class=\"dl-row\" style=\"background:rgba(83,74,183,.04);border-color:rgba(83,74,183,.15)\">\n        <div class=\"dl-num\" style=\"color:var(--tcb)\">L2<\/div>\n        <div class=\"dl-label\" style=\"color:var(--tcb)\">Root of Trust<\/div>\n        <div class=\"dl-modules\">M00 Root-of-Trust \u00b7 714\/714 WP \u00b7 477 lemmes Isabelle \u00b7 49 Coq \u00b7 seL4 v8<\/div>\n      <\/div>\n      <div class=\"dl-row\" style=\"background:rgba(83,74,183,.03)\">\n        <div class=\"dl-num\" style=\"color:var(--tcb)\">L3<\/div>\n        <div class=\"dl-label\">Policy Governance<\/div>\n        <div class=\"dl-modules\">OMEGA PolicyForge\u2122 \u00b7 PRISM Audit Chain\u2122 \u00b7 281\/281 WP \u00b7 215 lemmes Isabelle \u00b7 0 sorry<\/div>\n      <\/div>\n      <div class=\"dl-row\">\n        <div class=\"dl-num\" style=\"color:var(--safe)\">L4<\/div>\n        <div class=\"dl-label\">Validation &amp; Gating<\/div>\n        <div class=\"dl-modules\">ATLAS\u2122 \u00b7 AEGIS\u2122 \u00b7 validation structurelle \u00b7 gate d&rsquo;ex\u00e9cution ex-ante \u00b7 596\u2013640 WP<\/div>\n      <\/div>\n      <div class=\"dl-row\" style=\"background:rgba(15,110,86,.03)\">\n        <div class=\"dl-num\" style=\"color:var(--sec)\">L5<\/div>\n        <div class=\"dl-label\" style=\"color:var(--sec)\">Behavioural Detection<\/div>\n        <div class=\"dl-modules\">SENTINEL\u2122 \u00b7 CORTEX-SHIELD\u2122 \u00b7 1291 CBMC \u00b7 ~1,9Md fuzzing \u00b7 MTTD 8,6 \u00b5s<\/div>\n      <\/div>\n      <div class=\"dl-row\" style=\"background:rgba(15,110,86,.05);border-color:rgba(15,110,86,.2)\">\n        <div class=\"dl-num\" style=\"color:var(--sec)\">L6<\/div>\n        <div class=\"dl-label\" style=\"color:var(--sec)\">Containment<\/div>\n        <div class=\"dl-modules\">WALL-DOME\u2122 \u2131 ProVerif 5\/5 \u00b7 M24 Offline Controller\u2122 fail-closed \u00b7 M09-CB \u00b7 MTTC ~16 \u00b5s<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n \n \n  <!-- BLOCS AUTONOMES : BENCHMARK \u00b7 TNR \u00b7 CWE 15 \u00b7 CWE 34 \u00b7 FAMILLES -->\n  <div style=\"margin-bottom:20px\">\n<style>\n#cx-b1{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--tcb:#534AB7;--sec:#0F6E56;--warn:#854F0B;--crit:#993C1D;--bg:#f5f4f1;--bg2:#fff;--bg3:#f0eeeb;--text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;--border:rgba(0,0,0,0.08);--r:8px;padding:24px;background:var(--bg);border-radius:var(--r)}\n#cx-b1 *{box-sizing:border-box;margin:0;padding:0}\n#cx-b1 .cx-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);margin-bottom:16px}\n#cx-b1 .cx-legend{display:flex;gap:16px;margin-bottom:12px;flex-wrap:wrap}\n#cx-b1 .cx-leg-item{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text2)}\n#cx-b1 .cx-leg-dot{width:10px;height:10px;border-radius:2px;flex-shrink:0}\n#cx-b1 canvas{display:block;width:100%;max-width:100%}\n#cx-b1 .cx-note{font-size:10px;color:var(--text3);margin-top:10px;line-height:1.5}\n<\/style>\n<div id=\"cx-b1\">\n  <div class=\"cx-title\">Benchmark MTTD \/ MTTB \u2014 13 modules ARM64<\/div>\n  <div class=\"cx-legend\">\n    <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#534AB7\"><\/div>TCB (seL4 \/ M00 \/ M02 \/ M10)<\/div>\n    <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#0F6E56\"><\/div>L1b modules<\/div>\n    <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#854F0B\"><\/div>En cours \/ marginal<\/div>\n  <\/div>\n  <canvas id=\"cx-mttd-canvas\" height=\"320\"><\/canvas>\n  <div class=\"cx-note\">Valeurs en nanosecondes (ns) \u00b7 Plateforme ARM64 \u00b7 mean = m\u00e9diane instrument\u00e9e \u00b7 p99 = 99e percentile sur 10 000 it\u00e9rations<\/div>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded',function(){\n  var BENCH=[\n    {label:'M00 boot',     mean:2.5,  p99:7,   color:'#534AB7'},\n    {label:'M00 halt',     mean:3.8,  p99:25,  color:'#534AB7'},\n    {label:'M02 FSM',      mean:9.3,  p99:150, color:'#534AB7'},\n    {label:'M02 BLP',      mean:4.0,  p99:79,  color:'#534AB7'},\n    {label:'M10 OMEGA',    mean:4.3,  p99:33,  color:'#534AB7'},\n    {label:'M32 WD policy',mean:4.9,  p99:49,  color:'#0F6E56'},\n    {label:'M32 WD halt',  mean:9.1,  p99:64,  color:'#0F6E56'},\n    {label:'AEGIS block',  mean:6.8,  p99:78,  color:'#0F6E56'},\n    {label:'AEGIS allow',  mean:9.4,  p99:204, color:'#0F6E56'},\n    {label:'M26 AVA-CPL',  mean:6.7,  p99:156, color:'#0F6E56'},\n    {label:'ATLAS valid.',  mean:9.6,  p99:12,  color:'#0F6E56'},\n    {label:'ATLAS reject', mean:8.0,  p99:201, color:'#0F6E56'},\n    {label:'M09 CB trip',  mean:9.0,  p99:144, color:'#0F6E56'},\n    {label:'M11 TL verify',mean:17.8, p99:298, color:'#0F6E56'},\n    {label:'SHIELD normal',mean:4.2,  p99:44,  color:'#0F6E56'},\n    {label:'SHIELD block', mean:9.4,  p99:258, color:'#0F6E56'},\n    {label:'M24 halt',     mean:28.1, p99:493, color:'#0F6E56'},\n    {label:'M01 SENTINEL', mean:31.7, p99:366, color:'#854F0B'},\n    {label:'M27 GW route', mean:49.5, p99:910, color:'#993C1D'}\n  ];\n  var cv=document.getElementById('cx-mttd-canvas');\n  if(!cv)return;\n  var dpr=window.devicePixelRatio||1;\n  var W=cv.parentElement.clientWidth||800;\n  var padL=52,padR=16,padT=16,padB=80,barH=320;\n  cv.width=W*dpr; cv.height=barH*dpr;\n  cv.style.width=W+'px'; cv.style.height=barH+'px';\n  var ctx=cv.getContext('2d');\n  ctx.scale(dpr,dpr);\n  var n=BENCH.length;\n  var innerW=W-padL-padR;\n  var grpW=innerW\/n;\n  var bw=Math.max(4,grpW*0.35);\n  var maxV=Math.max.apply(null,BENCH.map(function(d){return d.p99;}));\n  var sc=function(v){return padT+(barH-padT-padB)*(1-v\/maxV);};\n  \/\/ grid\n  ctx.strokeStyle='rgba(0,0,0,0.06)'; ctx.lineWidth=1;\n  [0,200,400,600,800,1000].forEach(function(v){\n    if(v>maxV)return;\n    var y=sc(v);\n    ctx.beginPath();ctx.moveTo(padL,y);ctx.lineTo(W-padR,y);ctx.stroke();\n    ctx.fillStyle='#9e9b98';ctx.font='9px system-ui';ctx.textAlign='right';\n    ctx.fillText(v+'ns',padL-4,y+3);\n  });\n  BENCH.forEach(function(d,i){\n    var cx_=padL+i*grpW+grpW\/2;\n    \/\/ p99 bar (lighter)\n    var p99y=sc(d.p99), barBase=sc(0);\n    ctx.fillStyle=d.color+'44';\n    ctx.fillRect(cx_-bw\/2,p99y,bw,barBase-p99y);\n    \/\/ mean bar\n    var my=sc(d.mean);\n    ctx.fillStyle=d.color;\n    ctx.fillRect(cx_-bw\/2+1,my,bw-2,barBase-my);\n    \/\/ label inclin\u00e9\n    ctx.save();\n    ctx.translate(cx_,barBase+6);\n    ctx.rotate(-Math.PI\/4);\n    ctx.fillStyle='#6b6966';ctx.font='9px system-ui';ctx.textAlign='right';\n    ctx.fillText(d.label,0,0);\n    ctx.restore();\n  });\n});\n<\/script>\n  <\/div>\n \n  <div style=\"margin-bottom:20px\">\n<style>\n#cx-b2{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--tcb:#534AB7;--tcb-bg:#EEEDFE;--sec:#0F6E56;--sec-bg:#E1F5EE;--bg:#f5f4f1;--bg2:#fff;--bg3:#f0eeeb;--text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;--border:rgba(0,0,0,0.08);--r:8px;padding:24px;background:var(--bg);border-radius:var(--r)}\n#cx-b2 *{box-sizing:border-box;margin:0;padding:0}\n#cx-b2 .cx-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);margin-bottom:16px}\n#cx-b2 .cx-row{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap}\n#cx-b2 .cx-donut-wrap{flex:0 0 220px;position:relative;text-align:center}\n#cx-b2 .cx-bar-wrap{flex:1 1 300px}\n#cx-b2 .cx-legend{display:flex;flex-direction:column;gap:8px;margin-top:12px}\n#cx-b2 .cx-leg-item{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--text2);line-height:1.4}\n#cx-b2 .cx-leg-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}\n#cx-b2 .cx-bar-title{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);margin-bottom:10px}\n<\/style>\n<div id=\"cx-b2\">\n  <div class=\"cx-title\">Couverture TNR \u2014 mod\u00e8le \u00e0 trois niveaux<\/div>\n  <div class=\"cx-row\">\n    <div class=\"cx-donut-wrap\">\n      <canvas id=\"cx-donut\" width=\"200\" height=\"200\"><\/canvas>\n      <div class=\"cx-legend\">\n        <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#534AB7\"><\/div><span><strong>seL4 \u2131 formel<\/strong> \u2014 TNR 100% par construction Isabelle\/HOL<\/span><\/div>\n        <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#0F6E56\"><\/div><span><strong>Modules CORTEX<\/strong> \u2014 TNR 100% prouv\u00e9 par \u00e9valuation CFVL<\/span><\/div>\n        <div class=\"cx-leg-item\"><div class=\"cx-leg-dot\" style=\"background:#E1B84A\"><\/div><span><strong>CWE-078<\/strong> : vecteur inexistant \u2014 isolation formelle WALL-DOME\u2122 + M24 Offline Controller\u2122<\/span><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"cx-bar-wrap\">\n      <div class=\"cx-bar-title\">Couverture par s\u00e9v\u00e9rit\u00e9<\/div>\n      <canvas id=\"cx-cwe-bar\" height=\"200\"><\/canvas>\n    <\/div>\n  <\/div>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded',function(){\n  \/\/ Donut TNR 3 niveaux\n  var dv=document.getElementById('cx-donut');\n  if(dv){\n    var dpr=window.devicePixelRatio||1;\n    dv.width=200*dpr;dv.height=200*dpr;\n    dv.style.width='200px';dv.style.height='200px';\n    var dc=dv.getContext('2d');\n    dc.scale(dpr,dpr);\n    var cx=100,cy=100,or=88,ir=58;\n    var slices=[\n      {pct:0.47,color:'#534AB7'},  \/\/ seL4 formel ~47%\n      {pct:0.47,color:'#0F6E56'},  \/\/ modules CFVL ~47%\n      {pct:0.06,color:'#E1B84A'}   \/\/ CWE-078 isol\u00e9 ~6%\n    ];\n    var a=-Math.PI\/2;\n    slices.forEach(function(s){\n      var end=a+s.pct*2*Math.PI;\n      dc.beginPath();dc.moveTo(cx,cy);\n      dc.arc(cx,cy,or,a,end);dc.closePath();\n      dc.fillStyle=s.color;dc.fill();\n      a=end;\n    });\n    \/\/ inner circle\n    dc.beginPath();dc.arc(cx,cy,ir,0,2*Math.PI);\n    dc.fillStyle='#f5f4f1';dc.fill();\n    \/\/ centre texte\n    dc.fillStyle='#1a1a18';dc.font='bold 22px system-ui';dc.textAlign='center';\n    dc.fillText('99,8%',cx,cy-4);\n    dc.fillStyle='#9e9b98';dc.font='10px system-ui';\n    dc.fillText('TNR global',cx,cy+14);\n  }\n  \/\/ Bar chart CRITICAL vs HIGH\n  var bv=document.getElementById('cx-cwe-bar');\n  if(bv){\n    var dpr=window.devicePixelRatio||1;\n    var W=bv.parentElement.clientWidth||400;\n    bv.width=W*dpr;bv.height=200*dpr;\n    bv.style.width=W+'px';bv.style.height='200px';\n    var bc=bv.getContext('2d');\n    bc.scale(dpr,dpr);\n    var cats=[\n      {label:'CRITICAL',total:4,sel4:3,mod:1,color:'#993C1D'},\n      {label:'HIGH',total:11,sel4:3,mod:8,color:'#854F0B'}\n    ];\n    var padL=50,padR=20,padT=20,padB=40;\n    var maxV=12;\n    var barW=(W-padL-padR)\/cats.length;\n    var sc=function(v){return padT+(200-padT-padB)*(1-v\/maxV);};\n    \/\/ grid\n    [0,4,8,12].forEach(function(v){\n      var y=sc(v);\n      bc.strokeStyle='rgba(0,0,0,0.06)';bc.lineWidth=1;\n      bc.beginPath();bc.moveTo(padL,y);bc.lineTo(W-padR,y);bc.stroke();\n      bc.fillStyle='#9e9b98';bc.font='9px system-ui';bc.textAlign='right';\n      bc.fillText(v,padL-4,y+3);\n    });\n    cats.forEach(function(d,i){\n      var bx=padL+i*barW+barW*0.15;\n      var bww=barW*0.7;\n      var base=sc(0);\n      \/\/ seL4 part\n      var s4y=sc(d.sel4);\n      bc.fillStyle='#534AB7';\n      bc.fillRect(bx,s4y,bww\/2-2,base-s4y);\n      \/\/ module part  \n      var my=sc(d.mod);\n      bc.fillStyle='#0F6E56';\n      bc.fillRect(bx+bww\/2+2,my,bww\/2-2,base-my);\n      \/\/ labels\n      bc.fillStyle='#1a1a18';bc.font='bold 11px system-ui';bc.textAlign='center';\n      bc.fillText(d.label,bx+bww\/2,base+16);\n      bc.fillStyle='#6b6966';bc.font='10px system-ui';\n      bc.fillText(d.total+' CWE',bx+bww\/2,base+28);\n    });\n    \/\/ l\u00e9gende bar\n    var ly=200-8;\n    [[' seL4 \u2131','#534AB7'],[' Modules CFVL','#0F6E56']].forEach(function(l,i){\n      bc.fillStyle=l[1];bc.fillRect(padL+i*120,ly-8,8,8);\n      bc.fillStyle='#9e9b98';bc.font='9px system-ui';bc.textAlign='left';\n      bc.fillText(l[0],padL+i*120+11,ly);\n    });\n  }\n});\n<\/script>\n  <\/div>\n \n  <div style=\"margin-bottom:20px\">\n<style>\n#cx-b3{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--tcb:#534AB7;--tcb-bg:#EEEDFE;--sec:#0F6E56;--sec-bg:#E1F5EE;--crit:#993C1D;--crit-bg:#FDF0EE;--high:#854F0B;--high-bg:#FDF6E8;--bg:#f5f4f1;--bg2:#fff;--bg3:#f0eeeb;--text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;--border:rgba(0,0,0,0.08);--r:8px;padding:24px;background:var(--bg);border-radius:var(--r)}\n#cx-b3 *{box-sizing:border-box;margin:0;padding:0}\n#cx-b3 .cx-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);margin-bottom:8px}\n#cx-b3 .cx-subtitle{font-size:12px;color:var(--text2);margin-bottom:16px;line-height:1.5}\n#cx-b3 .cx-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}\n#cx-b3 .cx-cwe-card{background:var(--bg2);border:.5px solid var(--border);border-radius:6px;padding:10px 8px;text-align:center}\n#cx-b3 .cx-cwe-id{font-size:10px;font-weight:700;margin-bottom:4px}\n#cx-b3 .cx-cwe-desc{font-size:9px;color:var(--text2);margin-bottom:8px;line-height:1.3}\n#cx-b3 .cx-badge{display:inline-block;font-size:8px;font-weight:700;padding:2px 6px;border-radius:3px;letter-spacing:.04em;margin-top:4px}\n#cx-b3 .cx-badge-crit{background:var(--crit-bg);color:var(--crit)}\n#cx-b3 .cx-badge-high{background:var(--high-bg);color:var(--high)}\n#cx-b3 .cx-legend{display:flex;gap:12px;flex-wrap:wrap;margin-top:16px;padding-top:12px;border-top:.5px solid var(--border)}\n#cx-b3 .cx-leg{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--text2)}\n#cx-b3 .cx-leg-sq{width:20px;height:12px;border-radius:2px;flex-shrink:0}\n@media(max-width:600px){#cx-b3 .cx-grid{grid-template-columns:repeat(3,1fr)}}\n<\/style>\n<div id=\"cx-b3\">\n  <div class=\"cx-title\">Surface de protection \u2014 15 classes CWE<\/div>\n  <div class=\"cx-subtitle\">Couverture formellement prouv\u00e9e par \u00e9valuation CFVL et v\u00e9rification Isabelle\/HOL seL4<\/div>\n  <div class=\"cx-grid\" id=\"cx-b3-grid\"><\/div>\n  <div class=\"cx-legend\">\n    <div class=\"cx-leg\"><div class=\"cx-leg-sq\" style=\"background:#534AB7\"><\/div>\u2131 kernel \u2014 seL4 Isabelle\/HOL<\/div>\n    <div class=\"cx-leg\"><div class=\"cx-leg-sq\" style=\"background:#0F6E56\"><\/div>\u2191 seL4 \u2014 h\u00e9rit\u00e9 kernel<\/div>\n    <div class=\"cx-leg\"><div class=\"cx-leg-sq\" style=\"background:#43A06B\"><\/div>\u2713 module \u2014 couverture propre<\/div>\n    <div class=\"cx-leg\"><div class=\"cx-leg-sq\" style=\"background:#E1B84A;border:.5px solid rgba(0,0,0,0.1)\"><\/div>Isolation formelle<\/div>\n  <\/div>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded',function(){\n  var CWE_LIST=[\n    {id:'CWE-119',desc:'Buffer Overflow',sev:'CRITICAL',cover:'kernel'},\n    {id:'CWE-416',desc:'Use-After-Free', sev:'CRITICAL',cover:'kernel'},\n    {id:'CWE-787',desc:'OOB Write',      sev:'CRITICAL',cover:'kernel'},\n    {id:'CWE-078',desc:'OS Cmd Inj.',    sev:'CRITICAL',cover:'isolated'},\n    {id:'CWE-190',desc:'Integer Overflow',sev:'HIGH',   cover:'sel4'},\n    {id:'CWE-476',desc:'Null Deref.',    sev:'HIGH',    cover:'sel4'},\n    {id:'CWE-369',desc:'Div by Zero',    sev:'HIGH',    cover:'module'},\n    {id:'CWE-125',desc:'OOB Read',       sev:'HIGH',    cover:'module'},\n    {id:'CWE-362',desc:'Race Condition', sev:'HIGH',    cover:'sel4'},\n    {id:'CWE-327',desc:'Weak Crypto',    sev:'HIGH',    cover:'module'},\n    {id:'CWE-020',desc:'Input Valid.',   sev:'HIGH',    cover:'module'},\n    {id:'CWE-089',desc:'SQL Injection',  sev:'HIGH',    cover:'module'},\n    {id:'CWE-400',desc:'Res. Exhaustion',sev:'HIGH',    cover:'module'},\n    {id:'CWE-502',desc:'Insec. Deserial.',sev:'HIGH',   cover:'module'},\n    {id:'CWE-918',desc:'SSRF',           sev:'HIGH',    cover:'sel4'}\n  ];\n  var coverLabel={\n    'kernel':'\u2131 kernel',\n    'sel4':'\u2191 seL4',\n    'module':'\u2713 module',\n    'isolated':'\u2205 isol\u00e9'\n  };\n  var coverColor={\n    'kernel':'#534AB7','sel4':'#0F6E56','module':'#43A06B','isolated':'#E1B84A'\n  };\n  var grid=document.getElementById('cx-b3-grid');\n  if(!grid)return;\n  CWE_LIST.forEach(function(c){\n    var tnr=c.cover==='kernel'?100:c.cover==='sel4'?100:c.cover==='module'?100:100;\n    var div=document.createElement('div');\n    div.className='cx-cwe-card';\n    \/\/ mini canvas donut\n    var cn=document.createElement('canvas');\n    cn.width=56;cn.height=56;cn.style.width='56px';cn.style.height='56px';\n    div.appendChild(cn);\n    var ctx=cn.getContext('2d');\n    var dpr=window.devicePixelRatio||1;\n    cn.width=56*dpr;cn.height=56*dpr;ctx.scale(dpr,dpr);\n    var cx2=28,cy2=28,or=24,ir=16;\n    \/\/ fond\n    ctx.beginPath();ctx.arc(cx2,cy2,or,0,2*Math.PI);\n    ctx.fillStyle='#f0eeeb';ctx.fill();\n    \/\/ arc couleur\n    ctx.beginPath();\n    ctx.arc(cx2,cy2,or,-Math.PI\/2,-Math.PI\/2+tnr\/100*2*Math.PI);\n    ctx.lineTo(cx2,cy2);ctx.closePath();\n    ctx.fillStyle=coverColor[c.cover]||'#534AB7';ctx.fill();\n    \/\/ inner\n    ctx.beginPath();ctx.arc(cx2,cy2,ir,0,2*Math.PI);\n    ctx.fillStyle='#fff';ctx.fill();\n    \/\/ label cover\n    ctx.fillStyle=coverColor[c.cover]||'#534AB7';\n    ctx.font='bold 7px system-ui';ctx.textAlign='center';\n    ctx.fillText(coverLabel[c.cover],cx2,cy2+3);\n    \/\/ texte\n    var id_div=document.createElement('div');\n    id_div.className='cx-cwe-id';\n    id_div.style.color=coverColor[c.cover]||'#534AB7';\n    id_div.textContent=c.id;\n    div.appendChild(id_div);\n    var desc_div=document.createElement('div');\n    desc_div.className='cx-cwe-desc';\n    desc_div.textContent=c.desc;\n    div.appendChild(desc_div);\n    var badge=document.createElement('span');\n    badge.className='cx-badge '+(c.sev==='CRITICAL'?'cx-badge-crit':'cx-badge-high');\n    badge.textContent=c.sev;\n    div.appendChild(badge);\n    grid.appendChild(div);\n  });\n});\n<\/script>\n  <\/div>\n \n  <div style=\"margin-bottom:20px\">\n<style>\n#cx-mx{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;\n--tcb:#534AB7;--tcb-bg:#EEEDFE;--tcb-txt:#3C3489;\n--sec:#0F6E56;--sec-bg:#E1F5EE;--sec-txt:#085041;\n--crit:#993C1D;--crit-bg:#FDF0EE;\n--high:#854F0B;--high-bg:#FDF6E8;\n--bg:#f5f4f1;--bg2:#fff;--bg3:#f0eeeb;\n--text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;\n--border:rgba(0,0,0,0.08);--borderem:rgba(0,0,0,0.15);\n--r:8px;\npadding:24px;background:var(--bg);border-radius:var(--r)}\n#cx-mx *{box-sizing:border-box;margin:0;padding:0}\n#cx-mx .cx-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);margin-bottom:16px}\n \n\/* KPI row *\/\n#cx-mx .cx-kpis{display:flex;gap:10px;margin-bottom:18px;flex-wrap:wrap}\n#cx-mx .cx-kpi{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:12px 16px;flex:1;min-width:110px}\n#cx-mx .cx-kpi-n{font-size:28px;font-weight:700;letter-spacing:-.03em;line-height:1}\n#cx-mx .cx-kpi-l{font-size:9px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text3);margin-top:4px}\n \n\/* Filters *\/\n#cx-mx .cx-filters{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap;align-items:center}\n#cx-mx .cx-f-label{font-size:10px;color:var(--text3);font-weight:600;margin-right:4px}\n#cx-mx .cx-f{font-size:10px;font-weight:700;padding:4px 11px;border-radius:4px;border:.5px solid var(--border);background:var(--bg2);color:var(--text2);cursor:pointer;letter-spacing:.03em;transition:background .15s}\n#cx-mx .cx-f:hover{background:var(--bg3)}\n#cx-mx .cx-f.active{background:var(--tcb);color:#fff;border-color:var(--tcb)}\n \n\/* Legend *\/\n#cx-mx .cx-legend{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:14px}\n#cx-mx .cx-leg{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--text2)}\n#cx-mx .cx-leg-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:3px;white-space:nowrap}\n \n\/* Table wrapper *\/\n#cx-mx .cx-table-wrap{overflow-x:auto;border:.5px solid var(--borderem);border-radius:var(--r);background:var(--bg2)}\n#cx-mx table{border-collapse:collapse;width:100%;min-width:900px}\n#cx-mx thead th{font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:0;text-align:center;border-right:.5px solid var(--border);position:sticky;top:0;background:var(--bg2);z-index:2}\n#cx-mx thead th:first-child{text-align:left;min-width:175px;position:sticky;left:0;z-index:3;background:var(--bg2);border-right:.5px solid var(--borderem)}\n#cx-mx .th-inner{padding:8px 8px 6px}\n#cx-mx .th-sev{font-size:8px;font-weight:400;margin-top:2px}\n#cx-mx .th-crit{color:var(--crit)}\n#cx-mx .th-high{color:var(--high)}\n#cx-mx tbody tr{border-top:.5px solid var(--border)}\n#cx-mx tbody tr:hover{background:var(--bg3)}\n#cx-mx tbody td{padding:8px 6px;text-align:center;border-right:.5px solid var(--border);font-size:11px;vertical-align:middle}\n#cx-mx tbody td:first-child{text-align:left;padding:8px 12px;position:sticky;left:0;background:var(--bg2);border-right:.5px solid var(--borderem);z-index:1;min-width:175px}\n#cx-mx tbody tr:hover td:first-child{background:var(--bg3)}\n#cx-mx .mod-name{font-size:12px;font-weight:700;color:var(--text)}\n#cx-mx .mod-sub{font-size:9px;color:var(--text3);margin-top:2px;letter-spacing:.02em}\n#cx-mx .mod-sub .dot{display:inline-block;width:5px;height:5px;border-radius:50%;margin-right:4px;vertical-align:middle}\n \n\/* Cells *\/\n#cx-mx .c-kernel{display:inline-block;background:var(--tcb);color:#fff;font-size:8px;font-weight:700;padding:3px 5px;border-radius:3px;white-space:nowrap;line-height:1.2}\n#cx-mx .c-sel4{display:inline-block;background:transparent;color:var(--text3);font-size:9px;font-weight:500;padding:2px 4px;white-space:nowrap}\n#cx-mx .c-module{display:inline-block;background:var(--sec-bg);color:var(--sec-txt);font-size:8px;font-weight:700;padding:3px 5px;border-radius:3px;white-space:nowrap;line-height:1.2}\n#cx-mx .c-pass{display:inline-block;color:var(--text3);font-size:9px;font-style:italic}\n#cx-mx .c-na{color:var(--text3);font-size:11px}\n#cx-mx .c-empty{color:#d4d1cc;font-size:13px}\n<\/style>\n \n<div id=\"cx-mx\">\n  <div class=\"cx-title\">Couverture CWE \u2014 34 classes adress\u00e9es<\/div>\n \n  <div class=\"cx-kpis\">\n    <div class=\"cx-kpi\"><div class=\"cx-kpi-n\" style=\"color:var(--tcb)\">34<\/div><div class=\"cx-kpi-l\">CWE adress\u00e9es<\/div><\/div>\n    <div class=\"cx-kpi\"><div class=\"cx-kpi-n\" style=\"color:var(--sec)\">15<\/div><div class=\"cx-kpi-l\">\u2b24 CWE mesur\u00e9s<\/div><\/div>\n    <div class=\"cx-kpi\"><div class=\"cx-kpi-n\" style=\"color:var(--high)\">10<\/div><div class=\"cx-kpi-l\">+ CWE \u00e9tendus<\/div><\/div>\n    <div class=\"cx-kpi\"><div class=\"cx-kpi-n\" style=\"color:var(--text3)\">9<\/div><div class=\"cx-kpi-l\">+ Supply Chain \u00b7 IA<\/div><\/div>\n  <\/div>\n \n  <div class=\"cx-filters\">\n    <span class=\"cx-f-label\">S\u00e9v\u00e9rit\u00e9 :<\/span>\n    <button class=\"cx-f active\" onclick=\"cxMxFilter(this,'all')\">Toutes s\u00e9v\u00e9rit\u00e9s<\/button>\n    <button class=\"cx-f\" onclick=\"cxMxFilter(this,'CRITICAL')\">CRITICAL<\/button>\n    <button class=\"cx-f\" onclick=\"cxMxFilter(this,'HIGH')\">HIGH<\/button>\n  <\/div>\n \n  <div class=\"cx-legend\">\n    <div class=\"cx-leg\"><span class=\"cx-leg-badge\" style=\"background:var(--tcb);color:#fff\">\u2131 kernel<\/span>seL4 Isabelle\/HOL<\/div>\n    <div class=\"cx-leg\"><span class=\"cx-leg-badge\" style=\"background:transparent;color:var(--text3);border:.5px solid var(--border)\">\u2191 seL4<\/span>h\u00e9rit\u00e9 kernel<\/div>\n    <div class=\"cx-leg\"><span class=\"cx-leg-badge\" style=\"background:var(--sec-bg);color:var(--sec-txt)\">\u2713 module<\/span>couverture propre<\/div>\n    <div class=\"cx-leg\"><span class=\"cx-leg-badge\" style=\"background:transparent;color:var(--text3);font-style:italic;border:.5px solid var(--border)\">pass-through<\/span>isol\u00e9 arch.<\/div>\n    <div class=\"cx-leg\"><span class=\"cx-leg-badge\" style=\"background:transparent;color:#d4d1cc;border:.5px solid var(--border)\">\u2014<\/span>non applicable<\/div>\n  <\/div>\n \n  <div class=\"cx-table-wrap\">\n    <table id=\"cx-mx-table\">\n      <thead id=\"cx-mx-head\"><\/thead>\n      <tbody id=\"cx-mx-body\"><\/tbody>\n    <\/table>\n  <\/div>\n<\/div>\n \n<script>\ndocument.addEventListener('DOMContentLoaded', function(){\n \nvar CWE_LIST = [\n  {id:'CWE-119', desc:'Buffer Overflow',    sev:'CRITICAL'},\n  {id:'CWE-416', desc:'Use-After-Free',     sev:'CRITICAL'},\n  {id:'CWE-787', desc:'OOB Write',          sev:'CRITICAL'},\n  {id:'CWE-078', desc:'OS Cmd Inj.',        sev:'CRITICAL'},\n  {id:'CWE-190', desc:'Integer Overflow',   sev:'HIGH'},\n  {id:'CWE-476', desc:'Null Deref.',        sev:'HIGH'},\n  {id:'CWE-369', desc:'Div by Zero',        sev:'HIGH'},\n  {id:'CWE-125', desc:'OOB Read',           sev:'HIGH'},\n  {id:'CWE-362', desc:'Race Condition',     sev:'HIGH'},\n  {id:'CWE-327', desc:'Weak Crypto',        sev:'HIGH'},\n  {id:'CWE-020', desc:'Input Valid.',       sev:'HIGH'},\n  {id:'CWE-089', desc:'SQL Injection',      sev:'HIGH'},\n  {id:'CWE-400', desc:'Res. Exhaustion',    sev:'HIGH'},\n  {id:'CWE-502', desc:'Insec. Deserial.',   sev:'HIGH'},\n  {id:'CWE-918', desc:'SSRF',              sev:'HIGH'}\n];\n \n\/\/ K=kernel F, S=seL4 inherited, M=module, P=pass-through, N=na, ''=empty\nvar MODS = [\n  {name:'seL4 EAL7',       sub:'KERNEL \u00b7 Isabelle\/HOL \u00b7 ~9 000 LOC \u00b7 BSI-DSZ-CC-0784', layer:'KERNEL', color:'#534AB7',\n   cwe:{'CWE-119':'K','CWE-416':'K','CWE-787':'K','CWE-078':'P','CWE-190':'K','CWE-476':'K','CWE-369':'P','CWE-125':'P','CWE-362':'K','CWE-327':'P','CWE-020':'P','CWE-089':'P','CWE-400':'P','CWE-502':'P','CWE-918':'K'}},\n  {name:'SENTINEL',         sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'M','CWE-190':'','CWE-476':'S','CWE-369':'','CWE-125':'M','CWE-362':'S','CWE-327':'','CWE-020':'M','CWE-089':'M','CWE-400':'M','CWE-502':'M','CWE-918':'S'}},\n  {name:'WALL-DOME',        sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'S','CWE-190':'S','CWE-476':'S','CWE-369':'S','CWE-125':'S','CWE-362':'S','CWE-327':'S','CWE-020':'S','CWE-089':'S','CWE-400':'S','CWE-502':'S','CWE-918':'S'}},\n  {name:'M27-GW',           sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'M','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-362':'','CWE-327':'M','CWE-020':'M','CWE-089':'','CWE-400':'M','CWE-502':'S','CWE-918':''}},\n  {name:'M09-CB',           sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}},\n  {name:'M26-AVA-CPL',      sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-362':'M','CWE-327':'','CWE-020':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}},\n  {name:'M11-TL',           sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-362':'M','CWE-327':'','CWE-020':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}},\n  {name:'ATLAS\u2122',           sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'','CWE-190':'','CWE-476':'S','CWE-369':'','CWE-125':'M','CWE-362':'S','CWE-327':'M','CWE-020':'M','CWE-089':'','CWE-400':'M','CWE-502':'M','CWE-918':'S'}},\n  {name:'AEGIS\u2122',           sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'M','CWE-190':'','CWE-476':'S','CWE-369':'','CWE-125':'M','CWE-362':'S','CWE-327':'M','CWE-020':'M','CWE-089':'','CWE-400':'M','CWE-502':'M','CWE-918':'S'}},\n  {name:'CORTEX-SHIELD',    sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'M','CWE-190':'','CWE-476':'S','CWE-369':'','CWE-125':'M','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-089':'M','CWE-400':'M','CWE-502':'M','CWE-918':'S'}},\n  {name:'M24 Offline\u2122',     sub:'L1b \u00b7 PROUV\u00c9', layer:'L1b', color:'#0F6E56',\n   cwe:{'CWE-119':'S','CWE-416':'S','CWE-787':'S','CWE-078':'S','CWE-190':'S','CWE-476':'S','CWE-369':'S','CWE-125':'S','CWE-362':'S','CWE-327':'S','CWE-020':'S','CWE-089':'S','CWE-400':'S','CWE-502':'S','CWE-918':'S'}},\n  {name:'M00 Root-of-Trust', sub:'TCB \u00b7 PROUV\u00c9', layer:'TCB', color:'#534AB7',\n   cwe:{'CWE-119':'S','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'S','CWE-476':'S','CWE-369':'M','CWE-125':'','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}},\n  {name:'OMEGA PolicyForge', sub:'TCB \u00b7 N\/A', layer:'TCB', color:'#534AB7',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'N','CWE-476':'','CWE-369':'N','CWE-125':'','CWE-362':'','CWE-327':'','CWE-020':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}},\n  {name:'PRISM Audit Chain', sub:'TCB \u00b7 N\/A', layer:'TCB', color:'#534AB7',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-787':'','CWE-078':'','CWE-190':'','CWE-476':'N','CWE-369':'','CWE-125':'','CWE-362':'','CWE-327':'','CWE-020':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''}}\n];\n \nvar currentSev = 'all';\n \nfunction cellHTML(v) {\n  if(v==='K') return '<span class=\"c-kernel\">\u2131 kernel<\/span>';\n  if(v==='S') return '<span class=\"c-sel4\">\u2191 seL4<\/span>';\n  if(v==='M') return '<span class=\"c-module\">\u2713 module<\/span>';\n  if(v==='P') return '<span class=\"c-pass\">pass-through<\/span>';\n  if(v==='N') return '<span class=\"c-na\">\u2205<\/span>';\n  return '<span class=\"c-empty\">\u2014<\/span>';\n}\n \nfunction layerDot(layer) {\n  var colors = {KERNEL:'#534AB7', TCB:'#534AB7', L1b:'#0F6E56'};\n  return colors[layer] || '#9e9b98';\n}\n \nfunction buildTable(sevFilter) {\n  var cols = sevFilter === 'all' ? CWE_LIST : CWE_LIST.filter(function(c){ return c.sev === sevFilter; });\n  var head = document.getElementById('cx-mx-head');\n  var body = document.getElementById('cx-mx-body');\n  if(!head||!body) return;\n \n  \/\/ Header\n  var hrow = '<tr><th><div class=\"th-inner\" style=\"text-align:left\">Module<\/div><\/th>';\n  cols.forEach(function(c){\n    var cls = c.sev==='CRITICAL' ? 'th-crit' : 'th-high';\n    hrow += '<th data-sev=\"'+c.sev+'\"><div class=\"th-inner\">'+c.id+'<div class=\"th-sev '+cls+'\">'+c.desc+'<\/div><\/div><\/th>';\n  });\n  hrow += '<\/tr>';\n  head.innerHTML = hrow;\n \n  \/\/ Body\n  var bhtml = '';\n  MODS.forEach(function(m){\n    bhtml += '<tr>';\n    bhtml += '<td><div class=\"mod-name\">'+m.name+'<\/div><div class=\"mod-sub\"><span class=\"dot\" style=\"background:'+layerDot(m.layer)+'\"><\/span>'+m.sub+'<\/div><\/td>';\n    cols.forEach(function(c){\n      var v = m.cwe[c.id] !== undefined ? m.cwe[c.id] : '';\n      bhtml += '<td>'+cellHTML(v)+'<\/td>';\n    });\n    bhtml += '<\/tr>';\n  });\n  body.innerHTML = bhtml;\n}\n \nwindow.cxMxFilter = function(btn, sev) {\n  document.querySelectorAll('#cx-mx .cx-f').forEach(function(b){ b.classList.remove('active'); });\n  btn.classList.add('active');\n  currentSev = sev;\n  buildTable(sev);\n};\n \nbuildTable('all');\n \n});\n<\/script>\n  <\/div>\n \n  <div style=\"margin-bottom:20px\">\n<style>\n#cx-b5{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--tcb:#534AB7;--tcb-bg:#EEEDFE;--sec:#0F6E56;--sec-bg:#E1F5EE;--bg:#f5f4f1;--bg2:#fff;--bg3:#f0eeeb;--text:#1a1a18;--text2:#6b6966;--text3:#9e9b98;--border:rgba(0,0,0,0.08);--r:8px;padding:24px;background:var(--bg);border-radius:var(--r)}\n#cx-b5 *{box-sizing:border-box;margin:0;padding:0}\n#cx-b5 .cx-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);margin-bottom:6px}\n#cx-b5 .cx-sub{font-size:11px;color:var(--text2);margin-bottom:16px;line-height:1.5}\n#cx-b5 .cx-note{font-size:10px;color:var(--text3);margin-bottom:16px;padding:10px 12px;background:var(--bg3);border-radius:6px;border-left:3px solid var(--tcb);line-height:1.5}\n#cx-b5 table{width:100%;border-collapse:collapse}\n#cx-b5 thead th{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);padding:0 10px 8px;text-align:left;border-bottom:.5px solid var(--border)}\n#cx-b5 tbody tr{border-bottom:.5px solid var(--border)}\n#cx-b5 tbody tr:last-child{border-bottom:none}\n#cx-b5 tbody td{padding:9px 10px;font-size:11px;vertical-align:top}\n#cx-b5 .cx-fam-name{font-weight:700;color:var(--text);margin-bottom:2px}\n#cx-b5 .cx-fam-cwes{font-size:9px;color:var(--text3);font-family:monospace}\n#cx-b5 .cx-fam-mods{font-size:10px;color:var(--text2)}\n#cx-b5 .cx-badge-ok{display:inline-block;font-size:9px;font-weight:700;padding:2px 7px;border-radius:3px;background:var(--sec-bg);color:var(--sec);letter-spacing:.03em}\n#cx-b5 .cx-num{width:28px;height:28px;border-radius:50%;background:var(--tcb-bg);color:var(--tcb);font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n#cx-b5 .cx-row-inner{display:flex;align-items:flex-start;gap:10px}\n<\/style>\n<div id=\"cx-b5\">\n  <div class=\"cx-title\">13 familles de risque adress\u00e9es \u2014 couverture \u00e9tendue<\/div>\n  <div class=\"cx-note\">Au-del\u00e0 des 34 CWE explicitement mesur\u00e9s \u2014 familles identifi\u00e9es dans l&rsquo;audit AVA-VAN-001 v3.0 comme pertinentes pour les syst\u00e8mes souverains IA OIV\/SSR \u00b7 <strong>Couverture architecturale<\/strong> \u2014 non encore formalis\u00e9e CFVL<\/div>\n  <table>\n    <thead><tr>\n      <th style=\"width:32px\">#<\/th>\n      <th>Famille de risque<\/th>\n      <th>CWE associ\u00e9s<\/th>\n      <th>Modules<\/th>\n      <th>Statut<\/th>\n    <\/tr><\/thead>\n    <tbody id=\"cx-b5-body\"><\/tbody>\n  <\/table>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded',function(){\n  var FAMILIES=[\n    {name:'Authentification',          cwes:'287, 306, 307, 522, 798',    modules:'M11, PRISM, OMEGA, M27, AEGIS'},\n    {name:'Contr\u00f4le d\\'acc\u00e8s \/ privil.',cwes:'269, 284, 285, 732',         modules:'M00, PRISM, OMEGA, seL4, M24, WALL-DOME'},\n    {name:'Secrets \/ cl\u00e9s',            cwes:'320, 321, 322',               modules:'M11, M26, OMEGA, PRISM, M27'},\n    {name:'Configuration',             cwes:'16, 276, 1188',               modules:'ATLAS, AEGIS, OMEGA, PRISM, M24, AVA-CPL'},\n    {name:'Logique m\u00e9tier \/ workflow', cwes:'840, 841, 691',               modules:'PRISM, OMEGA, AEGIS, ATLAS, WALL-DOME'},\n    {name:'Cycle de vie \/ \u00e9tats',      cwes:'664, 665, 666, 670',          modules:'PRISM, M00, M24, AEGIS, ATLAS'},\n    {name:'Side-channel timing',       cwes:'203, 208, 385',               modules:'seL4, M00, PRISM, M24, WALL-DOME'},\n    {name:'Audit \/ logs',              cwes:'778, 117, 532',               modules:'PRISM, OMEGA, M24, M27'},\n    {name:'Supply chain',              cwes:'829, 1104, 1357',             modules:'ATLAS, AEGIS, OMEGA, M11, M27'},\n    {name:'Disponibilit\u00e9 avanc\u00e9e',     cwes:'667, 833, 770',               modules:'M09, M24, WALL-DOME, AEGIS, SHIELD, seL4'},\n    {name:'Concurrence avanc\u00e9e',       cwes:'366, 367, 368',               modules:'PRISM, M00, OMEGA, AEGIS, seL4'},\n    {name:'Communication \/ confiance', cwes:'295, 299, 345, 924',          modules:'M11, M27, M26, PRISM, OMEGA'},\n    {name:'Risques IA \/ entr\u00e9es',      cwes:'20, 345, 754',                modules:'SENTINEL, SHIELD, ATLAS, AEGIS, OMEGA, PRISM, M24'}\n  ];\n  var tbody=document.getElementById('cx-b5-body');\n  if(!tbody)return;\n  FAMILIES.forEach(function(f,i){\n    var tr=document.createElement('tr');\n    tr.innerHTML='<td><div style=\"width:24px;height:24px;border-radius:50%;background:#EEEDFE;color:#534AB7;font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center\">'+(i+1)+'<\/div><\/td>'+\n      '<td><div style=\"font-weight:700;color:#1a1a18;font-size:11px;margin-bottom:2px\">'+f.name+'<\/div><\/td>'+\n      '<td><span style=\"font-size:9px;color:#9e9b98;font-family:monospace\">'+f.cwes+'<\/span><\/td>'+\n      '<td><span style=\"font-size:10px;color:#6b6966\">'+f.modules+'<\/span><\/td>'+\n      '<td><span style=\"display:inline-block;font-size:9px;font-weight:700;padding:2px 7px;border-radius:3px;background:#E1F5EE;color:#0F6E56\">Couvert<\/span><\/td>';\n    tbody.appendChild(tr);\n  });\n});\n<\/script>\n  <\/div>\n \n  <!-- CWE COUVERTS NON DOCUMENT\u00c9S -->\n  <div class=\"sec-title\">Couverture architecturale \u2014 non encore formalis\u00e9e CFVL<\/div>\n  <div class=\"chart-card\" style=\"padding:16px 20px\">\n    <div style=\"display:flex;align-items:center;gap:10px;margin-bottom:14px;padding:10px 14px;background:#fffbeb;border:.5px solid #d97706;border-radius:6px\">\n      <span style=\"font-size:15px\">\u26a0\ufe0f<\/span>\n      <div style=\"font-size:11px;color:#92400e;line-height:1.6\">\n        Les classes ci-dessous sont <strong>couvertes par architecture<\/strong> \u2014 leur r\u00e9duction est probable par construction (seL4, modules CORTEX, isolation offline) \u2014 mais <strong>non encore revendiqu\u00e9es formellement dans les rapports CFVL<\/strong>.\n        Un \u00e9valuateur ANSSI\/CESTI les consid\u00e8re comme <em>\u00ab\u00a0couverture probable non d\u00e9montr\u00e9e\u00a0\u00bb<\/em> jusqu&rsquo;\u00e0 documentation explicite.\n        Ces CWE constituent la <strong>feuille de route de documentation prioritaire<\/strong>.\n      <\/div>\n    <\/div>\n    <div id=\"undocTable\"><\/div>\n  <\/div>\n \n  <!-- ACCELERATION FACTOR + ATTACK SURFACE -->\n  <div class=\"sec-title\">Facteur d&rsquo;acc\u00e9l\u00e9ration \u2014 rupture architecturale<\/div>\n  <div class=\"accel-grid\">\n    <div class=\"accel-card\" style=\"border-top:2px solid var(--tcb)\">\n      <div class=\"accel-lbl\">Attack Reaction Time<\/div>\n      <div class=\"accel-val\" style=\"color:var(--tcb)\">~16 \u00b5s<\/div>\n      <div class=\"accel-sub\">d\u00e9tection + blocage + confinement<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:6px\">MTTD 8,6 + MTTB 5,2 + HALT 2,1 \u00b5s<\/div>\n    <\/div>\n    <div class=\"accel-card\" style=\"border-top:2px solid var(--sec)\">\n      <div class=\"accel-lbl\">Acc\u00e9l\u00e9ration vs SOC IA<\/div>\n      <div class=\"accel-val\" style=\"color:var(--sec)\">10<sup style=\"font-size:14px\">7<\/sup>\u00d7<\/div>\n      <div class=\"accel-sub\">SOC IA \u2248 3 min = 180 000 000 \u00b5s<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:6px\">180 000 000 \u00f7 16 \u2248 11 000 000\u00d7<\/div>\n    <\/div>\n    <div class=\"accel-card\" style=\"border-top:2px solid var(--safe)\">\n      <div class=\"accel-lbl\">Acc\u00e9l\u00e9ration vs SOC classique<\/div>\n      <div class=\"accel-val\" style=\"color:var(--safe)\">10<sup style=\"font-size:14px\">7<\/sup>\u00d7<\/div>\n      <div class=\"accel-sub\">SOC classique \u2248 10\u201330 min<\/div>\n      <div style=\"font-size:9px;color:var(--text3);margin-top:6px\">600 000 000 \u00f7 16 \u2248 37 000 000\u00d7<\/div>\n    <\/div>\n  <\/div>\n  <div style=\"font-size:11px;color:var(--text2);line-height:1.7;padding:12px 16px;background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);margin-bottom:18px;font-style:italic\">\n    Les plateformes SOC classiques op\u00e8rent sur des temps d&rsquo;investigation de l&rsquo;ordre de plusieurs minutes.\n    Les campagnes de mesure de CORTEX ORIGIN\u2122 montrent que la cha\u00eene critique de d\u00e9tection, d\u00e9cision et confinement\n    s&rsquo;ex\u00e9cute en quelques dizaines de microsecondes \u2014 <strong>plusieurs ordres de grandeur d&rsquo;acc\u00e9l\u00e9ration<\/strong>\n    par rapport aux approches SOC assist\u00e9es par IA.\n  <\/div>\n \n  <!-- ATTACK SURFACE REDUCTION -->\n  <div class=\"sec-title\">Attack Surface Reduction<\/div>\n  <div class=\"chart-card\" style=\"padding:16px 20px;margin-bottom:16px\">\n    <div style=\"display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px\">\n      <div>\n        <div style=\"font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px\">Reachable Attack Surface<\/div>\n        <div style=\"display:flex;flex-direction:column;gap:7px\">\n          <div style=\"display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--bg3);border-radius:4px\">\n            <span style=\"font-size:11px;color:var(--text2)\">Public network entry points<\/span>\n            <span style=\"font-size:12px;font-weight:700;color:var(--tcb)\">0<\/span>\n          <\/div>\n          <div style=\"display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--bg3);border-radius:4px\">\n            <span style=\"font-size:11px;color:var(--text2)\">External API exposure<\/span>\n            <span style=\"font-size:12px;font-weight:700;color:var(--tcb)\">0<\/span>\n          <\/div>\n          <div style=\"display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--bg3);border-radius:4px\">\n            <span style=\"font-size:11px;color:var(--text2)\">Cloud dependency<\/span>\n            <span style=\"font-size:12px;font-weight:700;color:var(--tcb)\">0<\/span>\n          <\/div>\n          <div style=\"display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--bg3);border-radius:4px\">\n            <span style=\"font-size:11px;color:var(--text2)\">Remote exploit path<\/span>\n            <span style=\"font-size:11px;font-weight:700;color:var(--tcb)\">Physique requis<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n      <div>\n        <div style=\"font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px\">M\u00e9canismes de r\u00e9duction<\/div>\n        <div style=\"display:flex;flex-direction:column;gap:7px\">\n          <div style=\"padding:7px 10px;background:rgba(83,74,183,.06);border-radius:4px;font-size:10px;color:var(--tcb)\"><strong>Offline \/ air-gapped<\/strong> \u2014 M24 Offline Controller\u2122 \u2014 z\u00e9ro connectivit\u00e9 par conception<\/div>\n          <div style=\"padding:7px 10px;background:rgba(83,74,183,.06);border-radius:4px;font-size:10px;color:var(--tcb)\"><strong>WALL-DOME\u2122 \u2131<\/strong> \u2014 isolation r\u00e9seau prouv\u00e9e ProVerif 5\/5 \u00b7 TLA+ 1480 \u00e9tats<\/div>\n          <div style=\"padding:7px 10px;background:rgba(83,74,183,.06);border-radius:4px;font-size:10px;color:var(--tcb)\"><strong>seL4 capability model<\/strong> \u2014 isolation m\u00e9moire cross-domain \u00b7 EAL7<\/div>\n          <div style=\"padding:7px 10px;background:rgba(83,74,183,.06);border-radius:4px;font-size:10px;color:var(--tcb)\"><strong>AEGIS\u2122 gating<\/strong> \u2014 aucune action non autoris\u00e9e ne s&rsquo;ex\u00e9cute<\/div>\n        <\/div>\n        <div style=\"font-size:10px;color:var(--text2);line-height:1.6;margin-top:10px;font-style:italic\">\n          Toute compromission n\u00e9cessite un acc\u00e8s physique pr\u00e9alable \u2014 la surface r\u00e9seau r\u00e9siduelle est <strong>th\u00e9orique<\/strong>.\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- STRATEGIC BLOCKS -->\n  <div class=\"sec-title\">Posture architecturale \u2014 s\u00e9curit\u00e9 ex ante \u00b7 r\u00e9silience zero-day<\/div>\n  <div class=\"strat-grid\">\n \n    <!-- Zero-Day ex ante -->\n    <div class=\"strat-card\" style=\"border-color:rgba(83,74,183,.3);background:rgba(83,74,183,.03)\">\n      <div class=\"strat-card-title\" style=\"color:var(--tcb)\">\ud83d\udee1 Protection Zero-Day \u2014 ex ante<\/div>\n      <div class=\"strat-card-val\" style=\"color:var(--tcb)\">Architecture-based mitigation<\/div>\n      <div class=\"strat-card-body\">\n        Les actions critiques sont <strong>\u00e9valu\u00e9es avant leur ex\u00e9cution<\/strong> par les modules de gouvernance d\u00e9cisionnelle.\n        Cette logique <strong>bloque les attaques avant leur effet<\/strong>, y compris dans des sc\u00e9narios zero-day non r\u00e9pertori\u00e9s.\n      <\/div>\n      <div class=\"strat-card-chain\">\n        <span class=\"strat-chain-item\">OMEGA\u2122 policy ex-ante<\/span>\n        <span class=\"strat-chain-item\">AEGIS\u2122 gate<\/span>\n        <span class=\"strat-chain-item\">ATLAS\u2122 validation<\/span>\n        <span class=\"strat-chain-item\">SENTINEL\u2122 behavioural<\/span>\n        <span class=\"strat-chain-item\">CORTEX-SHIELD\u2122 filter<\/span>\n      <\/div>\n    <\/div>\n \n    <!-- Zero Network Surface -->\n    <div class=\"strat-card\" style=\"border-color:rgba(15,110,86,.3);background:rgba(15,110,86,.03)\">\n      <div class=\"strat-card-title\" style=\"color:var(--sec)\">\ud83d\udd0c Zero Network Attack Surface<\/div>\n      <div class=\"strat-card-val\" style=\"color:var(--sec)\">0 vecteur r\u00e9seau direct<\/div>\n      <div class=\"strat-card-body\">\n        En conditions op\u00e9rationnelles, <strong>aucun vecteur r\u00e9seau<\/strong> ne peut atteindre le syst\u00e8me directement.\n        L&rsquo;isolation est formellement prouv\u00e9e \u2014 pas seulement configur\u00e9e.\n      <\/div>\n      <div class=\"strat-card-chain\">\n        <span class=\"strat-chain-item\">M24 Offline\u2122 \u2014 z\u00e9ro connectivit\u00e9<\/span>\n        <span class=\"strat-chain-item\">WALL-DOME\u2122 \u2131 ProVerif 5\/5<\/span>\n        <span class=\"strat-chain-item\">TLA+ 1480 \u00e9tats<\/span>\n      <\/div>\n    <\/div>\n \n    <!-- Defense-grade assurance -->\n    <div class=\"strat-card\" style=\"border-color:rgba(133,79,11,.3);background:rgba(133,79,11,.03)\">\n      <div class=\"strat-card-title\" style=\"color:var(--safe)\">\ud83c\udfdb Architecture Defense-Grade<\/div>\n      <div class=\"strat-card-val\" style=\"color:var(--safe)\">Haute assurance formelle<\/div>\n      <div class=\"strat-card-body\">\n        Micro-kernel <strong>seL4 EAL7<\/strong> \u00b7 Modules CORTEX trajectoire <strong>EAL6+<\/strong>\n        \u00b7 TRL 6 \u00b7 \u00c9valuation CFVL continue \u00b7 Cible CSPN \/ CC EAL6+\n      <\/div>\n      <div class=\"strat-card-chain\">\n        <span class=\"strat-chain-item\">seL4 EAL7 \u2014 BSI-DSZ-CC-0784<\/span>\n        <span class=\"strat-chain-item\">CFVL 12 \u00e9valuations<\/span>\n        <span class=\"strat-chain-item\">AVA_VAN.5<\/span>\n        <span class=\"strat-chain-item\">TRL 6<\/span>\n        <span class=\"strat-chain-item\">Cible EAL6+<\/span>\n      <\/div>\n      <div style=\"margin-top:10px;padding-top:10px;border-top:.5px solid var(--border)\">\n        <div style=\"font-size:9px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:6px\">Certification Trajectory<\/div>\n        <div style=\"font-size:10px;color:var(--text2);line-height:1.6\">\n          <div>\ud83d\udd35 seL4 kernel \u2014 <strong>EAL7<\/strong> (BSI certifi\u00e9)<\/div>\n          <div>\ud83d\udd35 Modules CORTEX \u2014 trajectoire <strong>EAL6+<\/strong><\/div>\n          <div>\ud83d\udd35 Framework \u00e9valuation \u2014 <strong>CFVL<\/strong> (12\/12 compl\u00e9t\u00e9s)<\/div>\n          <div>\ud83d\udd35 Cible ANSSI \u2014 <strong>CSPN + CC EAL6+<\/strong><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n \n  <\/div>\n \n  <!-- Zero-Day resilience chain -->\n  <div class=\"chart-card\" style=\"padding:14px 20px;margin-bottom:16px\">\n    <div style=\"font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:12px\">Zero-Day Resilience Chain \u2014 r\u00e9ponse automatique en ~16 \u00b5s<\/div>\n    <div style=\"display:flex;align-items:center;flex-wrap:wrap;gap:0\">\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(83,74,183,.08);border-radius:6px;min-width:110px\">\n        <div style=\"font-size:10px;color:var(--tcb);font-weight:700\">ISOLATION<\/div>\n        <div style=\"font-size:11px;color:var(--text2);margin-top:2px\">seL4 \u2131<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">421 ns<\/div>\n      <\/div>\n      <div style=\"font-size:16px;color:var(--border);padding:0 6px\">\u2192<\/div>\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(83,74,183,.08);border-radius:6px;min-width:110px\">\n        <div style=\"font-size:10px;color:var(--tcb);font-weight:700\">EX-ANTE POLICY<\/div>\n        <div style=\"font-size:11px;color:var(--text2);margin-top:2px\">OMEGA + AEGIS<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">avant ex\u00e9cution<\/div>\n      <\/div>\n      <div style=\"font-size:16px;color:var(--border);padding:0 6px\">\u2192<\/div>\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(15,110,86,.08);border-radius:6px;min-width:110px\">\n        <div style=\"font-size:10px;color:var(--sec);font-weight:700\">D\u00c9TECTION<\/div>\n        <div style=\"font-size:11px;color:var(--text2);margin-top:2px\">SENTINEL + SHIELD<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">MTTD 8,6 \u00b5s<\/div>\n      <\/div>\n      <div style=\"font-size:16px;color:var(--border);padding:0 6px\">\u2192<\/div>\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(15,110,86,.08);border-radius:6px;min-width:110px\">\n        <div style=\"font-size:10px;color:var(--sec);font-weight:700\">BLOCAGE<\/div>\n        <div style=\"font-size:11px;color:var(--text2);margin-top:2px\">AEGIS + M09-CB<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">MTTB 5,2 \u00b5s<\/div>\n      <\/div>\n      <div style=\"font-size:16px;color:var(--border);padding:0 6px\">\u2192<\/div>\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(133,79,11,.08);border-radius:6px;min-width:110px\">\n        <div style=\"font-size:10px;color:var(--safe);font-weight:700\">CONFINEMENT<\/div>\n        <div style=\"font-size:11px;color:var(--text2);margin-top:2px\">WALL-DOME + M24<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">HALT 2,1 \u00b5s<\/div>\n      <\/div>\n      <div style=\"font-size:16px;color:var(--border);padding:0 6px\">\u2192<\/div>\n      <div style=\"text-align:center;padding:8px 16px;background:rgba(15,110,86,.12);border-radius:6px;min-width:110px;border:.5px solid rgba(15,110,86,.3)\">\n        <div style=\"font-size:10px;color:var(--sec);font-weight:700\">MTTC TOTAL<\/div>\n        <div style=\"font-size:16px;font-weight:700;color:var(--sec);margin-top:2px\">~16 \u00b5s<\/div>\n        <div style=\"font-size:9px;color:var(--text3)\">contenu et confin\u00e9<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n \n  <!-- CWE coverage vs MITRE -->\n  <div class=\"chart-card\" style=\"padding:14px 20px;margin-bottom:16px\">\n    <div style=\"font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px\">Couverture CWE \u2014 positionnement MITRE<\/div>\n    <div style=\"display:flex;flex-wrap:wrap;gap:20px;align-items:center\">\n      <div style=\"display:flex;flex-direction:column;gap:8px;flex:1;min-width:260px\">\n        <div style=\"display:flex;align-items:center;gap:10px\">\n          <div style=\"font-size:11px;color:var(--text2);min-width:220px\">34 CWE explicitement mesur\u00e9s<\/div>\n          <div style=\"flex:1;background:var(--bg3);border-radius:4px;height:10px;overflow:hidden\"><div style=\"width:46%;height:100%;background:var(--tcb);border-radius:4px\"><\/div><\/div>\n          <div style=\"font-size:11px;font-weight:700;color:var(--tcb);min-width:35px\">46%<\/div>\n        <\/div>\n        <div style=\"display:flex;align-items:center;gap:10px\">\n          <div style=\"font-size:11px;color:var(--text2);min-width:220px\">+ 22 CWE\/LLM couverts par architecture<\/div>\n          <div style=\"flex:1;background:var(--bg3);border-radius:4px;height:10px;overflow:hidden\"><div style=\"width:30%;height:100%;background:rgba(83,74,183,.4);border-radius:4px\"><\/div><\/div>\n          <div style=\"font-size:11px;font-weight:700;color:var(--tcb);min-width:35px\">+30%<\/div>\n        <\/div>\n        <div style=\"display:flex;align-items:center;gap:10px\">\n          <div style=\"font-size:11px;color:var(--text2);min-width:220px\">13 familles de risque MITRE \/ OWASP \/ ICS<\/div>\n          <div style=\"flex:1;background:var(--bg3);border-radius:4px;height:10px;overflow:hidden\"><div style=\"width:76%;height:100%;background:rgba(15,110,86,.5);border-radius:4px\"><\/div><\/div>\n          <div style=\"font-size:11px;font-weight:700;color:var(--sec);min-width:35px\">~76%<\/div>\n        <\/div>\n      <\/div>\n      <div style=\"text-align:center;padding:12px 20px;background:linear-gradient(135deg,rgba(83,74,183,.08),rgba(15,110,86,.06));border-radius:var(--r);border:.5px solid rgba(83,74,183,.2)\">\n        <div style=\"font-size:10px;color:var(--text3);text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px\">Familles MITRE adress\u00e9es<\/div>\n        <div style=\"font-size:32px;font-weight:700;color:var(--tcb);line-height:1\">~65%<\/div>\n        <div style=\"font-size:10px;color:var(--text3);margin-top:4px\">estimation conservatrice<\/div>\n      <\/div>\n    <\/div>\n    <div style=\"font-size:9px;color:var(--text3);margin-top:8px;font-style:italic\">R\u00e9f\u00e9rentiels : MITRE CWE Top 25 2024 \u00b7 OWASP LLM Top 10 2024 \u00b7 ICS\/SCADA \u00b7 AVA-VAN-001 v3.0 \u00b7 couverture estim\u00e9e sur ~74 familles MITRE actives<\/div>\n  <\/div>\n \n  <!-- MODULE CARDS -->\n  <div class=\"sec-title\">R\u00e9sultats par module<\/div>\n  <div class=\"mods-grid\" id=\"modsGrid\"><\/div>\n \n  <!-- STRATEGIC CONCLUSION -->\n  <div style=\"margin-top:24px;padding:20px 24px;background:linear-gradient(135deg,rgba(83,74,183,.05),rgba(15,110,86,.04));border:.5px solid rgba(83,74,183,.2);border-radius:var(--r)\">\n    <div style=\"font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px\">Synth\u00e8se strat\u00e9gique<\/div>\n    <div style=\"font-size:12px;color:var(--text2);line-height:1.8;font-style:italic\">\n      L&rsquo;architecture CORTEX ORIGIN\u2122 ne repose pas uniquement sur la d\u00e9tection d&rsquo;attaques connues.\n      Elle combine <strong style=\"color:var(--tcb)\">isolation formelle<\/strong>,\n      <strong style=\"color:var(--tcb)\">gouvernance ex-ante des actions<\/strong> et\n      <strong style=\"color:var(--sec)\">m\u00e9canismes de confinement automatique<\/strong>\n      afin de r\u00e9duire fortement la surface d&rsquo;exploitation des attaques,\n      y compris dans des sc\u00e9narios zero-day.\n    <\/div>\n    <div style=\"display:flex;flex-wrap:wrap;gap:8px;margin-top:12px\">\n      <span style=\"font-size:10px;font-weight:600;padding:3px 10px;border-radius:10px;background:var(--tcb-bg);color:var(--tcb)\">\u2714 Preuves formelles Isabelle\/HOL<\/span>\n      <span style=\"font-size:10px;font-weight:600;padding:3px 10px;border-radius:10px;background:var(--sec-bg);color:var(--sec)\">\u2714 Benchmarks mesur\u00e9s<\/span>\n      <span style=\"font-size:10px;font-weight:600;padding:3px 10px;border-radius:10px;background:var(--tcb-bg);color:var(--tcb)\">\u2714 Couverture CWE 34+ document\u00e9s<\/span>\n      <span style=\"font-size:10px;font-weight:600;padding:3px 10px;border-radius:10px;background:var(--sec-bg);color:var(--sec)\">\u2714 Architecture souveraine offline<\/span>\n      <span style=\"font-size:10px;font-weight:600;padding:3px 10px;border-radius:10px;background:var(--safe-bg);color:var(--safe)\">\u2714 R\u00e9silience zero-day ex-ante<\/span>\n    <\/div>\n  <\/div>\n \n  <div class=\"disclaimer\">Environnement instrument\u00e9 Apple M-series ARM64 \u00b7 clang -O1 \u00b7 N=1000 \u00b7 batch=10000. MTTD pipeline ~2,1 \u00b5s reconstitu\u00e9 \u2014 consolidation bare-metal seL4 v8 Q3 2026. TNR = SIR + (1\u2212SIR)\u00d7DR = 0,650 + 0,350\u00d70,995 = 0,9983. PRISM FP=100% artefact instrumentation exclu du score DR global.<\/div>\n \n  <div style=\"margin-top:18px;border:.5px solid rgba(83,74,183,.25);border-radius:var(--r);padding:14px 20px;background:rgba(83,74,183,.03);display:flex;align-items:flex-start;gap:14px\">\n    <span style=\"font-size:18px;line-height:1;margin-top:1px\">\ud83d\udd12<\/span>\n    <div>\n      <div style=\"font-size:11px;font-weight:700;color:var(--tcb);letter-spacing:.05em;text-transform:uppercase;margin-bottom:4px\">Restriction de diffusion<\/div>\n      <div style=\"font-size:11px;color:var(--text2);line-height:1.6\">\n        Les m\u00e9triques d\u00e9taill\u00e9es de couverture sont soumises \u00e0 restriction de diffusion conform\u00e9ment aux exigences de confidentialit\u00e9 des clients OIV\/SSR et du cadre ANSSI.\n        Les \u00e9l\u00e9ments pr\u00e9sent\u00e9s ici constituent la surface publiquement communicable.\n      <\/div>\n      <div style=\"font-size:10px;color:var(--text3);margin-top:6px;font-style:italic\">\n        M\u00e9triques compl\u00e8tes disponibles sous NDA dans le cadre d&rsquo;une \u00e9valuation CESTI ou d&rsquo;un engagement contractuel OIV\/SSR\n        \u00b7 <a href=\"mailto:contact@cortexorigin.com\" style=\"color:var(--tcb);text-decoration:none\">contact@cortexorigin.com<\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n \n<!-- OVERLAY + PANEL -->\n<div class=\"overlay\" id=\"overlay\" onclick=\"closePanel()\"><\/div>\n<div class=\"panel\" id=\"panel\">\n  <div class=\"panel-hdr\">\n    <div><div class=\"panel-meta\" id=\"p-meta\"><\/div><div class=\"panel-name\" id=\"p-name\"><\/div><\/div>\n    <div class=\"panel-score-wrap\">\n      <div class=\"panel-verdict\" id=\"p-verdict\"><\/div>\n      <button class=\"panel-close\" onclick=\"closePanel()\">\u00d7<\/button>\n    <\/div>\n  <\/div>\n  <div class=\"panel-body\" id=\"p-body\"><\/div>\n<\/div>\n<script>\n \n \n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   DATA\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n \nvar CWE_LIST = [\n  \/* \u2500\u2500 CRITICAL (4) \u2500\u2500 *\/\n  {id:'CWE-119',label:'CWE-119',desc:'Buffer Overflow',    sev:'CRITICAL'},\n  {id:'CWE-416',label:'CWE-416',desc:'Use-After-Free',     sev:'CRITICAL'},\n  {id:'CWE-787',label:'CWE-787',desc:'OOB Write',          sev:'CRITICAL'},\n  {id:'CWE-078',label:'CWE-078',desc:'OS Cmd Inj.',        sev:'CRITICAL'},\n  \/* \u2500\u2500 HIGH (11) \u2500\u2500 *\/\n  {id:'CWE-190',label:'CWE-190',desc:'Integer Overflow',   sev:'HIGH'},\n  {id:'CWE-476',label:'CWE-476',desc:'Null Deref.',        sev:'HIGH'},\n  {id:'CWE-369',label:'CWE-369',desc:'Div by Zero',        sev:'HIGH'},\n  {id:'CWE-125',label:'CWE-125',desc:'OOB Read',           sev:'HIGH'},\n  {id:'CWE-362',label:'CWE-362',desc:'Race Condition',     sev:'HIGH'},\n  {id:'CWE-327',label:'CWE-327',desc:'Weak Crypto',        sev:'HIGH'},\n  {id:'CWE-020',label:'CWE-020',desc:'Input Valid.',       sev:'HIGH'},\n  {id:'CWE-089',label:'CWE-089',desc:'SQL Injection',      sev:'HIGH'},\n  {id:'CWE-400',label:'CWE-400',desc:'Res. Exhaustion',    sev:'HIGH'},\n  {id:'CWE-502',label:'CWE-502',desc:'Insec. Deserial.',   sev:'HIGH'},\n  {id:'CWE-918',label:'CWE-918',desc:'SSRF',               sev:'HIGH'}\n];\n \n\/\/ Coverage: 'F'=seL4 formal, 'M'=module, 'N'=N\/A, ''=not in scope\nvar MODULES = [\n  {id:'sentinel', name:'SENTINEL', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'67%', mttd:'16.24 \u00b5s', mttb:'421 ns', fp:'0.7%', vectors:'1,200,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'','CWE-476':'F','CWE-369':'','CWE-125':'M','CWE-787':'F','CWE-362':'F','CWE-327':'','CWE-020':'M','CWE-078':'M','CWE-089':'M','CWE-400':'M','CWE-502':'M','CWE-918':'F'},\n   tools:[{n:'CBMC',pct:100,lbl:'1 291 props',c:'#0F6E56'},{n:'Isabelle\/HOL',pct:100,lbl:'22 lemmes \u2014 0 sorry',c:'#534AB7'},{n:'Tests EAL',pct:100,lbl:'220\/220 PASS',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'~1,9 Md \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'12\/15 CWE couverts',s:'5 seL4 \u2131 + 7 modules CORTEX'},{i:'\u2713',cls:'si-ok',t:'1,2M vecteurs test\u00e9s',s:'FP 0.7% \u2014 pr\u00e9cision \u00e9lev\u00e9e'},{i:'\u2713',cls:'si-ok',t:'~1,9 milliard fuzz',s:'0 crash \u00b7 0 hang'},{i:'\u26a0',cls:'si-warn',t:'MTTD mean 16,24 \u00b5s',s:'Latence scoring EVT_INTEGRITY \u2014 boucle data'}]\n  },\n  {id:'walldome', name:'WALL-DOME', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'100%', mttd:'421 ns', mttb:'421 ns', fp:'1.5%', vectors:'600,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'F','CWE-476':'F','CWE-369':'F','CWE-125':'F','CWE-787':'F','CWE-362':'F','CWE-327':'F','CWE-020':'F','CWE-078':'F','CWE-089':'F','CWE-400':'F','CWE-502':'F','CWE-918':'F'},\n   tools:[{n:'Frama-C \/ WP',pct:100,lbl:'156\/156 (100%)',c:'#534AB7'},{n:'CBMC',pct:100,lbl:'231 propri\u00e9t\u00e9s',c:'#0F6E56'},{n:'ProVerif',pct:100,lbl:'5\/5 PASS',c:'#0F6E56'},{n:'Z3 \/ TLA+',pct:100,lbl:'10\/10 \u00b7 1480 \u00e9tats',c:'#0F6E56'},{n:'Why3',pct:100,lbl:'26\/26 PASS',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'25,23 Mds \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2605',cls:'si-tcb',t:'15\/15 CWE \u2014 couverture totale',s:'100% seL4 \u2131 \u2014 immunit\u00e9 structurelle compl\u00e8te'},{i:'\u2713',cls:'si-ok',t:'25,23 milliards fuzz',s:'Campagne la plus longue \u2014 0 crash'},{i:'\u2713',cls:'si-ok',t:'6 outils formels',s:'Record diversit\u00e9 outillage du programme'},{i:'\u2713',cls:'si-ok',t:'TLA+ 1 480 \u00e9tats',s:'Comportement prouv\u00e9 exhaustivement'}]\n  },\n  {id:'m27gw', name:'M27-GW', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'20%', mttd:'9.80 \u00b5s', mttb:'420 ns', fp:'7.1%', vectors:'500,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-078':'M','CWE-089':'M','CWE-400':'','CWE-502':'M','CWE-918':'F'},\n   tools:[{n:'Frama-C \/ WP',pct:97,lbl:'75\/77 (97,4%)',c:'#854F0B'},{n:'Tests fonctionnels',pct:100,lbl:'33\/33 PASS',c:'#0F6E56'},{n:'Tests robustesse',pct:100,lbl:'7\/7 PASS',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'~985M \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2726',cls:'si-tcb',t:'Non-escalade prouv\u00e9e',s:'Aucune interface ne peut \u00e9lever les droits'},{i:'\u2713',cls:'si-ok',t:'FP 7.1% \u2014 th\u00e9orique en op\u00e9rationnel',s:'WALL-DOME\u2122 \u2131 + M24 Offline\u2122 \u2014 aucun vecteur r\u00e9seau entrant'},{i:'\u2713',cls:'si-ok',t:'5\/15 CWE couverts',s:'Focus gateway \u2014 r\u00e9seau'},{i:'\u25b3',cls:'si-warn',t:'M27 p99=910ns',s:'Scan anti-replay O(n) \u2014 born\u00e9 GW_MAX_NONCES=64'}]\n  },\n  {id:'m09cb', name:'M09-CB', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'100%', mttd:'421 ns', mttb:'421 ns', fp:'4.8%', vectors:'100,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'','CWE-020':'','CWE-078':'','CWE-089':'','CWE-400':'M','CWE-502':'','CWE-918':''},\n   tools:[{n:'CBMC',pct:100,lbl:'463 props (100%)',c:'#854F0B'},{n:'Tests',pct:100,lbl:'59\/59 PASS',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'324M \u2014 0 crash',c:'#0F6E56'},{n:'Endurance',pct:100,lbl:'100K cycles',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'CWE-400 Resource Exhaustion',s:'Seul CWE en p\u00e9rim\u00e8tre \u2014 100% couvert'},{i:'\u2713',cls:'si-ok',t:'9\/9 Fault Injection',s:'Propri\u00e9t\u00e9s P1\u2013P8 v\u00e9rifi\u00e9es'},{i:'\u2713',cls:'si-ok',t:'100K cycles endurance',s:'Stabilit\u00e9 long terme valid\u00e9e'},{i:'\u2713',cls:'si-ok',t:'ATE_IND.2 (CESTI)',s:'100%'}]\n  },\n  {id:'m26', name:'M26-AVA-CPL', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'100%', mttd:'420 ns', mttb:'420 ns', fp:'2.7%', vectors:'100,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'M','CWE-020':'','CWE-078':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''},\n   tools:[{n:'Frama-C \/ WP',pct:95,lbl:'267\/282 (94,7%)',c:'#854F0B'},{n:'Isabelle',pct:100,lbl:'100 th\u00e9or\u00e8mes \u2014 0 Admitted',c:'#534AB7'},{n:'Fuzzing',pct:100,lbl:'2,58 Mds \u2014 0 crash',c:'#0F6E56'},{n:'Tests',pct:100,lbl:'161\/161 PASS',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'CWE-327 Weak Crypto',s:'Seul CWE en p\u00e9rim\u00e8tre \u2014 100% couvert'},{i:'\u2713',cls:'si-ok',t:'100 th\u00e9or\u00e8mes Isabelle',s:'0 Admitted \u2014 0 sorry'},{i:'\u2713',cls:'si-ok',t:'2,58 milliards fuzz',s:'0 crash \u2014 robustesse maximale'},{i:'\u2713',cls:'si-ok',t:'Score CFVL 96\/100',s:'2 annotations WP ouvertes'}]\n  },\n  {id:'m11tl', name:'M11-TL', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'100%', mttd:'420 ns', mttb:'420 ns', fp:'0.0%', vectors:'100,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'','CWE-476':'','CWE-369':'','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'M','CWE-020':'','CWE-078':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''},\n   tools:[{n:'Frama-C \/ WP',pct:98,lbl:'373\/379 (98,4%)',c:'#854F0B'},{n:'CBMC',pct:100,lbl:'752 props',c:'#0F6E56'},{n:'Tests',pct:100,lbl:'237\/237 PASS',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'403M \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'CWE-327 Weak Crypto',s:'TrustLink \u2014 cryptographie v\u00e9rifi\u00e9e'},{i:'\u2713',cls:'si-ok',t:'FP 0.0%',s:'Pr\u00e9cision parfaite \u2014 z\u00e9ro faux positif'},{i:'\u2713',cls:'si-ok',t:'752 props CBMC',s:'V\u00e9rification exhaustive des invariants'},{i:'\u2713',cls:'si-ok',t:'Score CFVL 100\/100',s:'ATE_IND.2 (CESTI) \u2014 100 %'}]\n  },\n  {id:'atlas', name:'ATLAS\u2122', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'55%', mttd:'10.9 \u00b5s', mttb:'421 ns', fp:'1.2%', vectors:'1,100,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'','CWE-476':'F','CWE-369':'','CWE-125':'M','CWE-787':'F','CWE-362':'F','CWE-327':'M','CWE-020':'M','CWE-078':'','CWE-089':'','CWE-400':'M','CWE-502':'M','CWE-918':'F'},\n   tools:[{n:'Frama-C \/ WP',pct:100,lbl:'366\/366 (100%)',c:'#534AB7'},{n:'Tests',pct:100,lbl:'89\/89 PASS',c:'#0F6E56'},{n:'TLA+ [A1\u2013A6]',pct:100,lbl:'6 props v\u00e9rifi\u00e9es',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'~17,6 Mds \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'11\/15 CWE couverts',s:'6 seL4 \u2131 + 5 modules CORTEX'},{i:'\u2713',cls:'si-ok',t:'366\/366 WP (100%)',s:'Seul module L1b \u00e0 couverture WP totale'},{i:'\u2713',cls:'si-ok',t:'13 op\u00e9rations interdites bloqu\u00e9es',s:'Contr\u00f4le d\\'acc\u00e8s exhaustif'},{i:'\u2713',cls:'si-ok',t:'Score CFVL 97\/100',s:'Inter-module 23\/26'}]\n  },\n  {id:'aegis', name:'AEGIS\u2122', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'50%', mttd:'7.9 \u00b5s', mttb:'421 ns', fp:'2.8%', vectors:'1,200,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'','CWE-476':'F','CWE-369':'','CWE-125':'M','CWE-787':'F','CWE-362':'F','CWE-327':'M','CWE-020':'M','CWE-078':'M','CWE-089':'','CWE-400':'M','CWE-502':'M','CWE-918':'F'},\n   tools:[{n:'Frama-C \/ WP',pct:93,lbl:'596\/640 (93,1%)',c:'#854F0B'},{n:'Tests',pct:100,lbl:'75\/75 PASS',c:'#0F6E56'},{n:'TLA+ [E1\u2013E8]',pct:100,lbl:'8 props v\u00e9rifi\u00e9es',c:'#0F6E56'},{n:'Fuzzing',pct:100,lbl:'~21,9 Mds \u2014 0 crash',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'12\/15 CWE couverts',s:'6 seL4 \u2131 + 6 modules CORTEX'},{i:'\u2726',cls:'si-tcb',t:'Fail-closed universel',s:'TLA-E1 prouv\u00e9 \u2014 aucun \u00e9tat ouvert en cas d\\'\u00e9chec'},{i:'\u2713',cls:'si-ok',t:'~21,9 milliards fuzz',s:'0 crash \u2014 robustesse maximale'},{i:'\u25b3',cls:'si-warn',t:'44\/640 WP timeout',s:'FNV-1a \u2014 compens\u00e9 ATE 75\/75 + fuzzing'}]\n  },\n  {id:'shield', name:'CORTEX-SHIELD', layer:'L1b', verdict:'PROUV\u00c9', tnr:'99%', sir:'64%', mttd:'11.39 \u00b5s', mttb:'421 ns', fp:'3.0%', vectors:'1,100,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'','CWE-476':'F','CWE-369':'','CWE-125':'M','CWE-787':'F','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-078':'M','CWE-089':'M','CWE-400':'M','CWE-502':'M','CWE-918':'F'},\n   tools:[{n:'Tests',pct:100,lbl:'Normal + block PASS',c:'#0F6E56'},{n:'D\u00e9tection critique',pct:100,lbl:'9.4ns mean',c:'#0F6E56'}],\n   status:[{i:'\u2713',cls:'si-ok',t:'11\/15 CWE couverts',s:'5 seL4 \u2131 + 6 modules CORTEX'},{i:'\u2713',cls:'si-ok',t:'CWE-078 \u2014 vecteur inexistant',s:'Isolation WALL-DOME\u2122 \u2131 + M24 Offline\u2122'},{i:'\u2713',cls:'si-ok',t:'TNR 99%',s:'Couverture quasi-compl\u00e8te'},{i:'\u2713',cls:'si-ok',t:'MTTD nominal 4.2ns',s:'check_anomaly() \u2014 chemin normal ultra-rapide'}]\n  },\n  {id:'m24', name:'M24 Offline\u2122', layer:'L1b', verdict:'PROUV\u00c9', tnr:'100%', sir:'100%', mttd:'2.1 \u00b5s', mttb:'421 ns', fp:'0.0%', vectors:'300,000',\n   cwe:{'CWE-119':'F','CWE-416':'F','CWE-190':'F','CWE-476':'F','CWE-369':'F','CWE-125':'F','CWE-787':'F','CWE-362':'F','CWE-327':'F','CWE-020':'F','CWE-078':'F','CWE-089':'F','CWE-400':'F','CWE-502':'F','CWE-918':'F'},\n   tools:[{n:'CBMC \u00a77',pct:100,lbl:'13\/13 props \u2014 0 failed',c:'#534AB7'},{n:'Fuzzer standalone',pct:100,lbl:'0 crash \u2014 0 hang',c:'#0F6E56'},{n:'HALT d\u00e9terministe',pct:100,lbl:'fail-closed prouv\u00e9',c:'#534AB7'}],\n   status:[{i:'\u2605',cls:'si-tcb',t:'15\/15 CWE \u2014 couverture universelle',s:'Offline total \u2014 HALT d\u00e9terministe post-trigger'},{i:'\u2605',cls:'si-tcb',t:'Bug P-M2 trouv\u00e9 & corrig\u00e9',s:'m24_restore() FAIL-CLOSED \u2014 CBMC proof'},{i:'\u2713',cls:'si-ok',t:'Score CFVL 100\/100',s:'Seul module avec score parfait + bug r\u00e9el corrig\u00e9'},{i:'\u2713',cls:'si-ok',t:'FP 0.0% \u00b7 TNR 100%',s:'Mode offline total \u2014 aucun vecteur r\u00e9seau actif'}]\n  },\n  {id:'m00', name:'M00 Root-of-Trust', layer:'TCB', verdict:'PROUV\u00c9', tnr:'100%', sir:'80%', mttd:'1.45 \u00b5s', mttb:'420 ns', fp:'0.0%', vectors:'500,000',\n   cwe:{'CWE-119':'F','CWE-416':'','CWE-190':'F','CWE-476':'F','CWE-369':'M','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'','CWE-020':'M','CWE-078':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''},\n   tools:[{n:'Frama-C \/ WP',pct:100,lbl:'714\/714 (100%)',c:'#534AB7'},{n:'Isabelle\/HOL',pct:100,lbl:'477 lemmes \u2014 0 sorry',c:'#534AB7'},{n:'Coq \/ Rocq',pct:100,lbl:'49 th\u00e9or\u00e8mes',c:'#534AB7'}],\n   status:[{i:'\u2605',cls:'si-tcb',t:'Module TCB \u2014 Root of Trust',s:'Gate s\u00e9curit\u00e9 \u00b7 initialisation \u00b7 entropie'},{i:'\u2713',cls:'si-ok',t:'714\/714 WP \u2014 record programme',s:'Plus grand DTE de la certification'},{i:'\u2713',cls:'si-ok',t:'5\/15 CWE couverts',s:'P\u00e9rim\u00e8tre TCB \u2014 non IDS applicatif'},{i:'\u2699',cls:'si-warn',t:'libFuzzer 24h en cours',s:'ATE_IND.2 \u2014 85% avancement'}]\n  },\n  {id:'omega', name:'OMEGA PolicyForge', layer:'TCB', verdict:'N\/A', tnr:'100%', sir:'100%', mttd:'420 ns', mttb:'420 ns', fp:'3.6%', vectors:'200,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'N','CWE-476':'','CWE-369':'N','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'','CWE-020':'','CWE-078':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''},\n   tools:[{n:'Frama-C \/ WP',pct:100,lbl:'161\/161 (100%)',c:'#534AB7'},{n:'Isabelle\/HOL',pct:100,lbl:'167 lemmes \u2014 0 sorry',c:'#534AB7'},{n:'Coq \/ Rocq',pct:100,lbl:'12 th\u00e9or\u00e8mes',c:'#534AB7'}],\n   status:[{i:'\u26a0',cls:'si-na',t:'Module politique\/gouvernance',s:'Exclu du score DR global \u2014 r\u00f4le BLP\/MAC'},{i:'\u2713',cls:'si-ok',t:'seL4 \u2131 \u2014 int\u00e9grit\u00e9 domaine',s:'Isolation capability garantie par seL4'},{i:'N',cls:'si-na',t:'2\/15 CWE N\/A par construction',s:'CWE-190 et CWE-369 non applicables'},{i:'\u2713',cls:'si-ok',t:'CFVL-EVAL-001 \u2014 100\/100',s:'DTE v8.0 complet'}]\n  },\n  {id:'prism', name:'PRISM Audit Chain', layer:'TCB', verdict:'N\/A', tnr:'100%', sir:'100%', mttd:'420 ns', mttb:'420 ns', fp:'100%', vectors:'100,000',\n   cwe:{'CWE-119':'','CWE-416':'','CWE-190':'','CWE-476':'N','CWE-369':'','CWE-125':'','CWE-787':'','CWE-362':'','CWE-327':'','CWE-020':'','CWE-078':'','CWE-089':'','CWE-400':'','CWE-502':'','CWE-918':''},\n   tools:[{n:'Isabelle\/HOL',pct:100,lbl:'215 lemmes \u2014 0 sorry',c:'#534AB7'},{n:'Coq \/ Rocq',pct:100,lbl:'23 th\u00e9or\u00e8mes',c:'#534AB7'},{n:'ProVerif',pct:100,lbl:'Non-replay + forward secrecy',c:'#534AB7'}],\n   status:[{i:'\u26a0',cls:'si-na',t:'Journal append-only',s:'FP=100% \u2014 artefact instrumentation (audit-all attendu)'},{i:'N',cls:'si-na',t:'CWE-476 N\/A par construction',s:'Null-page seL4 \u2014 non applicable'},{i:'\u2713',cls:'si-ok',t:'seL4 \u2131 \u2014 int\u00e9grit\u00e9 domaine',s:'Isolation capability seL4'},{i:'\u2713',cls:'si-ok',t:'CFVL-EVAL-002 \u2014 100\/100',s:'DTE complet v4.0'}]\n  }\n];\n \n\/* MTTD bench data *\/\nvar BENCH = [\n  {label:'M00 boot',      mean:2.5,  p50:2,  p99:7,   color:'#534AB7'},\n  {label:'M00 halt',      mean:3.8,  p50:2,  p99:25,  color:'#534AB7'},\n  {label:'M02 FSM',       mean:9.3,  p50:2,  p99:150, color:'#534AB7'},\n  {label:'M02 BLP',       mean:4.0,  p50:2,  p99:79,  color:'#534AB7'},\n  {label:'M10 OMEGA',     mean:4.3,  p50:3,  p99:33,  color:'#534AB7'},\n  {label:'M32 WD policy', mean:4.9,  p50:3,  p99:49,  color:'#0F6E56'},\n  {label:'M32 WD halt',   mean:9.1,  p50:3,  p99:64,  color:'#0F6E56'},\n  {label:'AEGIS block',   mean:6.8,  p50:3,  p99:78,  color:'#0F6E56'},\n  {label:'AEGIS allow',   mean:9.4,  p50:3,  p99:204, color:'#0F6E56'},\n  {label:'M26 AVA-CPL',   mean:6.7,  p50:3,  p99:156, color:'#0F6E56'},\n  {label:'ATLAS valid.',  mean:9.6,  p50:2,  p99:12,  color:'#0F6E56'},\n  {label:'ATLAS reject',  mean:8.0,  p50:3,  p99:201, color:'#0F6E56'},\n  {label:'M09 CB trip',   mean:9.0,  p50:2,  p99:144, color:'#0F6E56'},\n  {label:'M11 TL verify', mean:17.8, p50:7,  p99:298, color:'#0F6E56'},\n  {label:'SHIELD normal', mean:4.2,  p50:3,  p99:44,  color:'#0F6E56'},\n  {label:'SHIELD block',  mean:9.4,  p50:2,  p99:258, color:'#0F6E56'},\n  {label:'M24 halt',      mean:28.1, p50:14, p99:493, color:'#0F6E56'},\n  {label:'M01 SENTINEL',  mean:31.7, p50:16, p99:366, color:'#854F0B'},\n  {label:'M27 GW route',  mean:49.5, p50:21, p99:910, color:'#993C1D'}\n];\n \n\/* seL4 kernel formal coverage \u2014 7\/15 CWE par preuve Isabelle\/HOL *\/\nvar SEL4_CWE = {\n  'CWE-119': {covered:true,  proof:'T1\/T6 \u2014 isolation m\u00e9moire cross-domain \u00b7 421 ns'},\n  'CWE-416': {covered:true,  proof:'T1\/T6 \u2014 aucune frame partag\u00e9e entre domaines \u00b7 421 ns'},\n  'CWE-787': {covered:true,  proof:'T1\/T6 \u2014 \u00e9criture cross-domain impossible \u00b7 421 ns'},\n  'CWE-078': {covered:false, proof:'pass-through \u2014 couche applicative'},\n  'CWE-190': {covered:true,  proof:'T2 \u2014 capability integrity \u2192 escalade impossible \u00b7 421 ns'},\n  'CWE-476': {covered:true,  proof:'T4 \u2014 null page non-mapp\u00e9e \u2192 VM_FAULT \u00b7 421 ns'},\n  'CWE-369': {covered:false, proof:'pass-through \u2014 arithm\u00e9tique applicative intra-domaine'},\n  'CWE-125': {covered:false, proof:'pass-through \u2014 bounds intra-domaine (seL4 ne v\u00e9rifie pas bounds C)'},\n  'CWE-362': {covered:true,  proof:'T3 \u2014 IPC seL4 synchrone et atomique \u00b7 421 ns'},\n  'CWE-327': {covered:false, proof:'pass-through \u2014 cryptographie applicative'},\n  'CWE-020': {covered:false, proof:'pass-through \u2014 validation s\u00e9mantique applicative'},\n  'CWE-089': {covered:false, proof:'pass-through \u2014 couche SQL applicative'},\n  'CWE-400': {covered:false, proof:'pass-through \u2014 M09-CB rate limit applicatif'},\n  'CWE-502': {covered:false, proof:'pass-through \u2014 d\u00e9s\u00e9rialisation applicative'},\n  'CWE-918': {covered:true,  proof:'T8 \u2014 non-interference information flow TCB \u00b7 421 ns'}\n};\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   BUILD MATRIX\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nvar currentSev = 'all';\nfunction buildMatrix(sevFilter) {\n  var cols = sevFilter === 'all' ? CWE_LIST : CWE_LIST.filter(function(c){return c.sev===sevFilter});\n \n  var thead = document.getElementById('matrixHead');\n  var tbody = document.getElementById('matrixBody');\n \n  \/* Header *\/\n  var hrow = '<tr><th style=\"min-width:155px\">Module<\/th>';\n  cols.forEach(function(c){\n    var cls = c.sev==='CRITICAL'?'sev-crit':'sev-high';\n    hrow += '<th class=\"cwe-col '+cls+'\">'+c.label+'<div style=\"font-size:9px;font-weight:400;margin-top:1px\">'+c.desc+'<\/div><\/th>';\n  });\n  hrow += '<\/tr>';\n  thead.innerHTML = hrow;\n \n  var bhtml = '';\n \n  \/* \u2500\u2500 seL4 kernel row (pinned first) \u2500\u2500 *\/\n  bhtml += '<tr class=\"sel4-row\">';\n  bhtml += '<td><div class=\"mod-row-name\">seL4 EAL7<\/div><div class=\"layer-tag\">KERNEL \u00b7 Isabelle\/HOL \u00b7 ~9 000 LOC \u00b7 BSI-DSZ-CC-0784<\/div><\/td>';\n  cols.forEach(function(c){\n    var s = SEL4_CWE[c.id];\n    if(s && s.covered){\n      bhtml += '<td class=\"cell\" title=\"'+s.proof+'\"><span class=\"c-sel4-kernel\">\u2131 kernel<\/span><\/td>';\n    } else {\n      bhtml += '<td class=\"cell\"><span class=\"c-empty\" style=\"color:#c4c0bc;font-size:10px\">pass-through<\/span><\/td>';\n    }\n  });\n  bhtml += '<\/tr>';\n \n  \/* \u2500\u2500 Module rows \u2500\u2500 *\/\n  MODULES.forEach(function(m){\n    bhtml += '<tr style=\"cursor:pointer\" onclick=\"openPanel(\\''+m.id+'\\')\">';\n    bhtml += '<td><div class=\"mod-row-name\">'+m.name+'<\/div><div class=\"layer-tag\">'+m.layer+' \u00b7 '+m.verdict+'<\/div><\/td>';\n    cols.forEach(function(c){\n      var v = m.cwe[c.id]||'';\n      var cell = '';\n      if(v==='F'){\n        \/* seL4 covers this \u2014 show inherited badge, not module badge *\/\n        cell = '<span class=\"c-sel4-inherited\" title=\"Couvert par seL4 kernel \u2014 '+(SEL4_CWE[c.id]&#038;&#038;SEL4_CWE[c.id].proof||'')+'\">\u2191 seL4<\/span>';\n      } else if(v==='M'){\n        cell = '<span class=\"c-module\">\u2713 module<\/span>';\n      } else if(v==='N'){\n        cell = '<span class=\"c-na\">\u2205<\/span>';\n      } else {\n        cell = '<span class=\"c-empty\">\u2014<\/span>';\n      }\n      bhtml += '<td class=\"cell\">'+cell+'<\/td>';\n    });\n    bhtml += '<\/tr>';\n  });\n \n  tbody.innerHTML = bhtml;\n}\n \nwindow.filterCWE = function(sev, btn) {\n  document.querySelectorAll('.fbtn').forEach(function(b){b.classList.remove('active')});\n  btn.classList.add('active');\n  currentSev = sev;\n  buildMatrix(sev);\n};\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   BUILD MODULE CARDS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction buildCards() {\n  var grid = document.getElementById('modsGrid');\n  var html = '';\n  MODULES.forEach(function(m){\n    var layerCls = m.layer==='TCB'?'mc-tcb':'mc-l1b';\n    var verdCls = m.verdict==='PROUV\u00c9'?'v-prouve':m.verdict==='PASS_MARGINAL'?'v-marg':'v-na';\n    var barColor = m.layer==='TCB'?'var(--tcb)':m.verdict==='PROUV\u00c9'?'var(--sec)':'var(--wip)';\n    var cweCount = Object.values(m.cwe).filter(function(v){return v==='F'||v==='M'}).length;\n    html += '<div class=\"mod-card '+layerCls+'\" onclick=\"openPanel(\\''+m.id+'\\')\">';\n    html += '<div class=\"mc-head\"><span class=\"mc-id\">'+m.layer+'<\/span><span class=\"mc-verdict '+verdCls+'\">'+m.verdict+'<\/span><\/div>';\n    html += '<div class=\"mc-name\">'+m.name+'<\/div>';\n    html += '<div class=\"mc-metrics\">';\n    html += '<span class=\"mc-m\"><strong>TNR<\/strong> '+m.tnr+'<\/span>';\n    html += '<span class=\"mc-m\"><strong>SIR<\/strong> '+m.sir+'<\/span>';\n    html += '<span class=\"mc-m\"><strong>MTTD<\/strong> '+m.mttd+'<\/span>';\n    html += '<span class=\"mc-m\"><strong>CWE<\/strong> '+cweCount+'\/15<\/span>';\n    html += '<\/div>';\n    var tnrNum = parseFloat(m.tnr);\n    html += '<div class=\"bar-bg\"><div class=\"bar-fg\" style=\"width:'+tnrNum+'%;background:'+barColor+'\"><\/div><\/div>';\n    html += '<span class=\"hint\">Voir d\u00e9tails \u2197<\/span>';\n    html += '<\/div>';\n  });\n  grid.innerHTML = html;\n}\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   PANEL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nvar panelChart = null;\nvar panelRadarChart = null;\n \nwindow.openPanel = function(id) {\n  var m = MODULES.find(function(x){return x.id===id});\n  if (!m) return;\n \n  document.getElementById('p-meta').textContent = m.layer+' \u00b7 CORTEX ORIGIN\u2122 v7.1';\n  document.getElementById('p-name').textContent = m.name;\n  var vd = document.getElementById('p-verdict');\n  vd.textContent = m.verdict;\n  vd.className = 'panel-verdict '+(m.verdict==='PROUV\u00c9'?'v-prouve':m.verdict==='PASS_MARGINAL'?'v-marg':'v-na');\n \n  var cweProof = Object.values(m.cwe).filter(function(v){return v==='F'}).length;\n  var cweMod   = Object.values(m.cwe).filter(function(v){return v==='M'}).length;\n  var cweTotal = cweProof + cweMod;\n \n  var html = '';\n \n  \/\/ KPIs\n  html += '<div class=\"p-kpis\">';\n  html += kpi3('TNR',m.tnr,'Total Neutralization Rate');\n  html += kpi3('SIR seL4',m.sir,'Structural Immunity');\n  html += kpi3('MTTD',m.mttd,'Mean Time To Detect');\n  html += kpi3('MTTB',m.mttb,'seL4 block time');\n  html += kpi3('FP rate',m.fp,'Faux positifs');\n  html += kpi3('CWE couverts',cweTotal+'\/15',''+cweProof+' seL4 \u2131 + '+cweMod+' modules');\n  html += '<\/div>';\n \n  \/\/ CWE chips\n  html += '<div class=\"p-sec-lbl\">Couverture CWE<\/div>';\n  html += '<div class=\"cwe-chips\">';\n  CWE_LIST.forEach(function(c){\n    var v = m.cwe[c.id]||'';\n    if(v==='F') html += '<span class=\"cwe-chip chip-proof\">\u2131 '+c.label+'<\/span>';\n    else if(v==='M') html += '<span class=\"cwe-chip chip-module\">\u2713 '+c.label+'<\/span>';\n    else if(v==='N') html += '<span class=\"cwe-chip\" style=\"background:var(--bg3);color:var(--text3)\">\u2205 '+c.label+'<\/span>';\n  });\n  html += '<\/div>';\n \n  \/\/ Tools\n  if (m.tools.length) {\n    html += '<div class=\"p-sec-lbl\">Outils de v\u00e9rification<\/div>';\n    m.tools.forEach(function(t){\n      html += '<div class=\"tool-row\"><span class=\"tool-name\">'+t.n+'<\/span>';\n      html += '<div class=\"tool-bar\"><div class=\"tool-fill\" style=\"width:'+t.pct+'%;background:'+t.c+'\"><\/div><\/div>';\n      html += '<span class=\"tool-val\">'+t.lbl+'<\/span><\/div>';\n    });\n  }\n \n  \/\/ Panel radar\n  html += '<div class=\"p-sec-lbl\">Radar couverture d\\'attaque<\/div>';\n  html += '<div class=\"p-chart-wrap-radar\"><canvas id=\"panelRadar\"><\/canvas><\/div>';\n \n  \/\/ MTTD mini chart\n  html += '<div class=\"p-sec-lbl\">Benchmark latence<\/div>';\n  html += '<div class=\"p-chart-wrap\"><canvas id=\"panelChart\"><\/canvas><\/div>';\n \n  \/\/ Status\n  html += '<div class=\"p-sec-lbl\">Propri\u00e9t\u00e9s cl\u00e9s<\/div>';\n  html += '<div class=\"stat-grid\">';\n  m.status.forEach(function(s){\n    html += '<div class=\"stat-card\"><div class=\"stat-icon '+s.cls+'\">'+s.i+'<\/div>';\n    html += '<div><div class=\"stat-title\">'+s.t+'<\/div><div class=\"stat-sub\">'+s.s+'<\/div><\/div><\/div>';\n  });\n  html += '<\/div>';\n \n  document.getElementById('p-body').innerHTML = html;\n \n  \/\/ Mini chart\n  if(panelChart){panelChart.destroy();panelChart=null;}\n  if(panelRadarChart){panelRadarChart.destroy();panelRadarChart=null;}\n  setTimeout(function(){\n    var rcanvas=document.getElementById('panelRadar');\n    if(rcanvas && m){\n      var dpr=window.devicePixelRatio||1, W=rcanvas.offsetWidth||260, H=260;\n      rcanvas.width=W*dpr; rcanvas.height=H*dpr;\n      rcanvas.style.width=W+'px'; rcanvas.style.height=H+'px';\n      var rctx=rcanvas.getContext('2d'); rctx.scale(dpr,dpr);\n      var col=m.layer==='TCB'?'#534AB7':'#0F6E56';\n      var radarData=CWE_LIST.map(function(cw){var v=m.cwe[cw.id]||''; if(v==='F')return 2; if(v==='M')return 1; if(v==='N')return 0.3; return 0;});\n      var n=radarData.length, cx=W\/2, cy=H\/2-8, maxR=Math.min(W,H)\/2-26;\n      rctx.strokeStyle='rgba(0,0,0,0.07)'; rctx.lineWidth=0.5;\n      [1,2].forEach(function(ring){\n        rctx.beginPath();\n        for(var i=0;i<n;i++){var a=-Math.PI\/2+(2*Math.PI*i\/n); var rx=cx+Math.cos(a)*(maxR*ring\/2),ry=cy+Math.sin(a)*(maxR*ring\/2); if(i===0)rctx.moveTo(rx,ry); else rctx.lineTo(rx,ry);}\n        rctx.closePath(); rctx.stroke();\n      });\n      for(var i=0;i<n;i++){var a=-Math.PI\/2+(2*Math.PI*i\/n); rctx.beginPath(); rctx.moveTo(cx,cy); rctx.lineTo(cx+Math.cos(a)*maxR,cy+Math.sin(a)*maxR); rctx.strokeStyle='rgba(0,0,0,0.07)'; rctx.stroke();}\n      rctx.beginPath();\n      for(var i=0;i<n;i++){var a=-Math.PI\/2+(2*Math.PI*i\/n),v=radarData[i]\/2; var rx=cx+Math.cos(a)*maxR*v,ry=cy+Math.sin(a)*maxR*v; if(i===0)rctx.moveTo(rx,ry); else rctx.lineTo(rx,ry);}\n      rctx.closePath();\n      rctx.fillStyle=col==='#534AB7'?'rgba(83,74,183,0.18)':'rgba(15,110,86,0.18)';\n      rctx.strokeStyle=col; rctx.lineWidth=1.5; rctx.fill(); rctx.stroke();\n      for(var i=0;i<n;i++){var a=-Math.PI\/2+(2*Math.PI*i\/n),v=radarData[i]\/2; rctx.beginPath(); rctx.arc(cx+Math.cos(a)*maxR*v,cy+Math.sin(a)*maxR*v,4,0,2*Math.PI); rctx.fillStyle=radarData[i]===2?'#534AB7':radarData[i]===1?'#0F6E56':'#e8e6e1'; rctx.fill();}\n      rctx.fillStyle='#6b6966'; rctx.font='7px system-ui,sans-serif'; rctx.textAlign='center';\n      for(var i=0;i<n;i++){var a=-Math.PI\/2+(2*Math.PI*i\/n); rctx.fillText(CWE_LIST[i].label.replace('CWE-',''),cx+Math.cos(a)*(maxR+14),cy+Math.sin(a)*(maxR+14));}\n    }\n    var canvas=document.getElementById('panelChart');\n    if(canvas &#038;&#038; m){\n      var dpr=window.devicePixelRatio||1, W=canvas.offsetWidth||380, H=120;\n      canvas.width=W*dpr; canvas.height=H*dpr; canvas.style.width=W+'px'; canvas.style.height=H+'px';\n      var pctx=canvas.getContext('2d'); pctx.scale(dpr,dpr);\n      var col=m.layer==='TCB'?'#534AB7':'#0F6E56';\n      var bars=[{label:'MTTB (ns)',val:parseFloat(m.mttb)*1000,color:col},{label:'SIR (%)',val:parseFloat(m.sir),color:'rgba(83,74,183,.7)'},{label:'TNR (%)',val:parseFloat(m.tnr),color:'rgba(15,110,86,.7)'}];\n      var maxV=Math.max.apply(null,bars.map(function(b){return b.val}))||1;\n      var pad={top:10,right:10,bottom:28,left:10}, cW=W-pad.left-pad.right, cH=H-pad.top-pad.bottom, bw=cW\/bars.length;\n      bars.forEach(function(b,i){\n        var bWidth=bw*0.5, bx=pad.left+i*bw+bw*0.25, bh=cH*(b.val\/maxV);\n        pctx.fillStyle=b.color; pctx.beginPath(); pctx.roundRect(bx,pad.top+cH-bh,bWidth,bh,3); pctx.fill();\n        pctx.fillStyle='#9e9b98'; pctx.font='9px system-ui,sans-serif'; pctx.textAlign='center';\n        pctx.fillText(b.label,bx+bWidth\/2,pad.top+cH+12);\n        pctx.fillStyle='#1a1a18'; pctx.font='bold 9px system-ui,sans-serif';\n        pctx.fillText(b.val.toFixed(0),bx+bWidth\/2,pad.top+cH-bh-3);\n      });\n    }\n  },50);\n \n  document.getElementById('panel').classList.add('open');\n  document.getElementById('overlay').classList.add('open');\n  document.body.style.overflow='hidden';\n};\n \nfunction kpi3(lbl,val,sub){\n  return '<div class=\"p-kpi\"><div class=\"p-kpi-lbl\">'+lbl+'<\/div><div class=\"p-kpi-val\">'+val+'<\/div><div class=\"p-kpi-sub\">'+sub+'<\/div><\/div>';\n}\n \nwindow.closePanel = function(){\n  document.getElementById('panel').classList.remove('open');\n  document.getElementById('overlay').classList.remove('open');\n  document.body.style.overflow='';\n};\ndocument.addEventListener('keydown',function(e){if(e.key==='Escape')closePanel();});\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CHARTS\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction hexAlpha(hex,a){\n  var r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);\n  return 'rgba('+r+','+g+','+b+','+a+')';\n}\n \nfunction initCharts(){\n  \/* roundRect polyfill *\/\n  if(!CanvasRenderingContext2D.prototype.roundRect){\n    CanvasRenderingContext2D.prototype.roundRect = function(x,y,w,h,r){\n      if(r>w\/2)r=w\/2; if(r>h\/2)r=h\/2;\n      this.beginPath();\n      this.moveTo(x+r,y);\n      this.lineTo(x+w-r,y); this.arcTo(x+w,y,x+w,y+r,r);\n      this.lineTo(x+w,y+h-r); this.arcTo(x+w,y+h,x+w-r,y+h,r);\n      this.lineTo(x+r,y+h); this.arcTo(x,y+h,x,y+h-r,r);\n      this.lineTo(x,y+r); this.arcTo(x,y,x+r,y,r);\n      this.closePath(); return this;\n    };\n  }\n \n  \/* \u2500\u2500 MTTD BAR CHART (Canvas pur) \u2500\u2500 *\/\n  (function(){\n    var canvas = document.getElementById('mttdChart');\n    if(!canvas) return;\n    var dpr = window.devicePixelRatio||1;\n    var W = canvas.offsetWidth||canvas.parentElement.offsetWidth||700, H = 320;\n    canvas.width = W*dpr; canvas.height = H*dpr;\n    canvas.style.width = W+'px'; canvas.style.height = H+'px';\n    var ctx = canvas.getContext('2d');\n    ctx.scale(dpr,dpr);\n    var pad = {top:20, right:20, bottom:84, left:52};\n    var cW = W-pad.left-pad.right, cH = H-pad.top-pad.bottom;\n    var maxVal = Math.max.apply(null, BENCH.map(function(b){return b.p99}));\n    maxVal = Math.ceil(maxVal\/100)*100 || 100;\n    ctx.strokeStyle='rgba(0,0,0,0.05)'; ctx.lineWidth=1;\n    for(var gi=0;gi<=5;gi++){\n      var gy=pad.top+cH-(gi\/5)*cH;\n      ctx.beginPath(); ctx.moveTo(pad.left,gy); ctx.lineTo(pad.left+cW,gy); ctx.stroke();\n      ctx.fillStyle='#9e9b98'; ctx.font='10px system-ui,sans-serif'; ctx.textAlign='right';\n      ctx.fillText(Math.round((gi\/5)*maxVal)+'ns',pad.left-5,gy+3);\n    }\n    var bw=cW\/BENCH.length;\n    BENCH.forEach(function(b,i){\n      var x=pad.left+i*bw, bWidth=bw*0.36;\n      var xMean=x+bw*0.14, xP99=xMean+bWidth+2;\n      var hP99=(b.p99\/maxVal)*cH, hMean=(b.mean\/maxVal)*cH;\n      ctx.fillStyle=hexAlpha(b.color,0.28);\n      ctx.beginPath(); ctx.roundRect(xP99,pad.top+cH-hP99,bWidth,hP99,3); ctx.fill();\n      ctx.fillStyle=b.color;\n      ctx.beginPath(); ctx.roundRect(xMean,pad.top+cH-hMean,bWidth,hMean,3); ctx.fill();\n      ctx.save();\n      ctx.translate(x+bw\/2,pad.top+cH+8); ctx.rotate(-Math.PI\/4);\n      ctx.fillStyle='#9e9b98'; ctx.font='9px system-ui,sans-serif'; ctx.textAlign='right';\n      ctx.fillText(b.label,0,0); ctx.restore();\n    });\n    ctx.fillStyle='#534AB7'; ctx.fillRect(pad.left,4,10,10);\n    ctx.fillStyle='#6b6966'; ctx.font='10px system-ui,sans-serif'; ctx.textAlign='left';\n    ctx.fillText('mean (ns)',pad.left+14,13);\n    ctx.fillStyle=hexAlpha('#534AB7',0.28); ctx.fillRect(pad.left+80,4,10,10);\n    ctx.fillStyle='#6b6966'; ctx.fillText('p99 (ns)',pad.left+94,13);\n  })();\n \n  \/* \u2500\u2500 LAYER DONUT (Canvas pur) \u2500\u2500 *\/\n  (function(){\n    var canvas=document.getElementById('layerChart');\n    if(!canvas) return;\n    var dpr=window.devicePixelRatio||1;\n    var W=canvas.offsetWidth||canvas.parentElement.offsetWidth||260, H=240;\n    canvas.width=W*dpr; canvas.height=H*dpr;\n    canvas.style.width=W+'px'; canvas.style.height=H+'px';\n    var ctx=canvas.getContext('2d'); ctx.scale(dpr,dpr);\n    var cx=W\/2, cy=H\/2-18, r=82, ri=56;\n    var data=[{val:65,color:'#534AB7',label:'SIR seL4 \\u2131 (65%)'},{val:35,color:'#0F6E56',label:'DR modules (35%)'}];\n    var angle=-Math.PI\/2;\n    data.forEach(function(d){\n      var sweep=(d.val\/100)*2*Math.PI;\n      ctx.beginPath(); ctx.moveTo(cx,cy); ctx.arc(cx,cy,r,angle,angle+sweep); ctx.closePath();\n      ctx.fillStyle=d.color; ctx.fill(); angle+=sweep;\n    });\n    ctx.beginPath(); ctx.arc(cx,cy,ri,0,2*Math.PI); ctx.fillStyle='#ffffff'; ctx.fill();\n    ctx.fillStyle='#1a1a18'; ctx.font='bold 17px system-ui,sans-serif'; ctx.textAlign='center';\n    ctx.fillText('99,8%',cx,cy+5);\n    ctx.fillStyle='#9e9b98'; ctx.font='10px system-ui,sans-serif'; ctx.fillText('TNR global',cx,cy+19);\n    var ly=H-34;\n    data.forEach(function(d,i){\n      var lx=i===0?12:W\/2+8;\n      ctx.fillStyle=d.color; ctx.fillRect(lx,ly,10,10);\n      ctx.fillStyle='#6b6966'; ctx.font='10px system-ui,sans-serif'; ctx.textAlign='left';\n      ctx.fillText(d.label,lx+14,ly+9);\n    });\n  })();\n \n  \/* \u2500\u2500 CWE COUNT BAR (Canvas pur) \u2500\u2500 *\/\n  (function(){\n    var canvas=document.getElementById('cweCountChart');\n    if(!canvas) return;\n    var dpr=window.devicePixelRatio||1;\n    var W=canvas.offsetWidth||260, H=240;\n    canvas.width=W*dpr; canvas.height=H*dpr;\n    canvas.style.width=W+'px'; canvas.style.height=H+'px';\n    var ctx=canvas.getContext('2d'); ctx.scale(dpr,dpr);\n    var cweCounts=CWE_LIST.map(function(c){\n      var proof=0,mod=0;\n      MODULES.forEach(function(m){\n        var v=m.cwe[c.id]||'';\n        if(v==='F')proof++; else if(v==='M')mod++;\n      });\n      return{cwe:c.label.replace('CWE-',''),proof:proof,mod:mod};\n    });\n    var pad={top:20,right:8,bottom:48,left:28};\n    var cW=W-pad.left-pad.right, cH=H-pad.top-pad.bottom;\n    var maxV=Math.max.apply(null,cweCounts.map(function(x){return x.proof+x.mod}))||1;\n    ctx.strokeStyle='rgba(0,0,0,0.05)'; ctx.lineWidth=1;\n    for(var gi=0;gi<=4;gi++){\n      var gy=pad.top+cH-(gi\/4)*cH;\n      ctx.beginPath(); ctx.moveTo(pad.left,gy); ctx.lineTo(pad.left+cW,gy); ctx.stroke();\n      ctx.fillStyle='#9e9b98'; ctx.font='9px system-ui,sans-serif'; ctx.textAlign='right';\n      ctx.fillText(Math.round((gi\/4)*maxV),pad.left-3,gy+3);\n    }\n    var bw=cW\/cweCounts.length;\n    cweCounts.forEach(function(d,i){\n      var x=pad.left+i*bw, bWidth=bw*0.7, xb=x+bw*0.15;\n      var hP=cH*(d.proof\/maxV), hM=cH*(d.mod\/maxV);\n      if(hP>0){ctx.fillStyle='#534AB7'; ctx.beginPath(); ctx.roundRect(xb,pad.top+cH-hP,bWidth,hP,2); ctx.fill();}\n      if(hM>0){ctx.fillStyle='#0F6E56'; ctx.beginPath(); ctx.roundRect(xb,pad.top+cH-hP-hM,bWidth,hM,2); ctx.fill();}\n      ctx.save(); ctx.translate(x+bw\/2,pad.top+cH+6); ctx.rotate(-Math.PI\/4);\n      ctx.fillStyle='#9e9b98'; ctx.font='8px system-ui,sans-serif'; ctx.textAlign='right';\n      ctx.fillText(d.cwe,0,0); ctx.restore();\n    });\n    ctx.fillStyle='#534AB7'; ctx.fillRect(pad.left,5,8,8);\n    ctx.fillStyle='#6b6966'; ctx.font='9px system-ui,sans-serif'; ctx.textAlign='left';\n    ctx.fillText('seL4 \\u2131',pad.left+11,13);\n    ctx.fillStyle='#0F6E56'; ctx.fillRect(pad.left+55,5,8,8);\n    ctx.fillStyle='#6b6966'; ctx.fillText('Module',pad.left+66,13);\n  })();\n \n  \/* \u2500\u2500 15 MINI DONUTS CWE (Canvas pur) \u2500\u2500 *\/\n  (function(){\n    var CWE_DATA={\n      'CWE-119':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'420 ns', colors:['#534AB7','#f0eeeb'],note:'T1\/T6 isolation m\\u00e9moire cross-domain'},\n      'CWE-416':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T1\/T6 aucune frame partag\\u00e9e'},\n      'CWE-787':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T1\/T6 \\u00e9criture cross-domain impossible'},\n      'CWE-078':{tnr:null,verdict:'PROUV\\u00c9', source:'arch',  mttd:'\\u2014',      colors:['#534AB7','#f0eeeb'],note:'WALL-DOME \\u2131 + M24 Offline \\u2014 vecteur inexistant'},\n      'CWE-190':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T2 capability integrity'},\n      'CWE-476':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T4 null page non-mapp\\u00e9e'},\n      'CWE-369':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'420 ns', colors:['#0F6E56','#f0eeeb'],note:'OMEGA P-O4 + AEGIS P-E4'},\n      'CWE-125':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'420 ns', colors:['#0F6E56','#f0eeeb'],note:'ATLAS P-A9 + AEGIS P-E4\/E5'},\n      'CWE-362':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T3 IPC seL4 synchrone'},\n      'CWE-327':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'420 ns', colors:['#0F6E56','#f0eeeb'],note:'M27-GW + ATLAS P-A5\/A6'},\n      'CWE-020':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'24,5 \\u00b5s',colors:['#0F6E56','#f0eeeb'],note:'ATLAS P-A1\/A9 + AEGIS P-E5'},\n      'CWE-089':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'30,7 \\u00b5s',colors:['#0F6E56','#f0eeeb'],note:'M27-GW + SENTINEL + AEGIS'},\n      'CWE-400':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'420 ns', colors:['#0F6E56','#f0eeeb'],note:'M09-CB rate limit'},\n      'CWE-502':{tnr:100,verdict:'COUVERT',source:'modules',mttd:'32,1 \\u00b5s',colors:['#0F6E56','#f0eeeb'],note:'ATLAS P-A9 canonical JSON'},\n      'CWE-918':{tnr:100,verdict:'PROUV\\u00c9', source:'seL4 \\u2131', mttd:'421 ns', colors:['#534AB7','#f0eeeb'],note:'T8 non-interference TCB'}\n    };\n    var grid=document.getElementById('cweGrid');\n    if(!grid) return;\n    var html='';\n    CWE_LIST.forEach(function(c,idx){\n      var d=CWE_DATA[c.id]; if(!d) return;\n      var statusCls=d.verdict==='PROUV\\u00c9'?'s-prouve':d.verdict==='COUVERT'?'s-couvert':'s-marginal';\n      var stBadge  =d.verdict==='PROUV\\u00c9'?'st-prouve':d.verdict==='COUVERT'?'st-couvert':'st-marginal';\n      var sevCls   =c.sev==='CRITICAL'?'sev-c':'sev-h';\n      var isOffline=c.id==='CWE-078';\n      html+='<div class=\"cwe-card '+statusCls+'\">';\n      html+='<div class=\"cwe-card-id\">'+c.label+'<\\\/div>';\n      html+='<div class=\"cwe-card-desc\">'+c.desc+'<\\\/div>';\n      html+='<span class=\"cwe-sev-badge '+sevCls+'\">'+c.sev+'<\\\/span>';\n      html+='<div class=\"cwe-donut-wrap\"><canvas id=\"donut-'+idx+'\" width=\"72\" height=\"72\"><\\\/canvas>';\n      html+='<div class=\"cwe-donut-center\"><div class=\"cwe-donut-tnr\">'+(isOffline?'\\u2205':d.tnr+'%')+'<\\\/div>';\n      html+='<div class=\"cwe-donut-lbl\">'+(isOffline?'vecteur':'TNR')+'<\\\/div><\\\/div><\\\/div>';\n      html+='<div class=\"cwe-status '+stBadge+'\">'+d.verdict+'<\\\/div>';\n      if(isOffline) html+='<div style=\"font-size:9px;color:var(--tcb-txt);background:var(--tcb-bg);border-radius:4px;padding:3px 7px;margin-bottom:5px;line-height:1.4;text-align:center\">WALL-DOME\\u2122 \\u2131 + M24 Offline\\u2122<br>vecteur r\\u00e9seau inexistant<\\\/div>';\n      html+='<div class=\"cwe-mttd\"><strong>MTTD<\\\/strong> '+d.mttd+'<\\\/div>';\n      html+='<\\\/div>';\n    });\n    grid.innerHTML=html;\n    setTimeout(function(){\n      CWE_LIST.forEach(function(c,idx){\n        var d=CWE_DATA[c.id]; if(!d) return;\n        var canvas=document.getElementById('donut-'+idx); if(!canvas) return;\n        var ctx=canvas.getContext('2d');\n        var cx=36,cy=36,r=32,ri=22,isOffline=c.id==='CWE-078';\n        if(isOffline){\n          ctx.beginPath(); ctx.arc(cx,cy,r,0,2*Math.PI); ctx.fillStyle='#e8e4de'; ctx.fill();\n        } else {\n          ctx.beginPath(); ctx.arc(cx,cy,r,0,2*Math.PI); ctx.fillStyle=d.colors[1]; ctx.fill();\n          ctx.beginPath(); ctx.moveTo(cx,cy); ctx.arc(cx,cy,r,-Math.PI\/2,-Math.PI\/2+2*Math.PI); ctx.closePath();\n          ctx.fillStyle=d.colors[0]; ctx.fill();\n        }\n        ctx.beginPath(); ctx.arc(cx,cy,ri,0,2*Math.PI); ctx.fillStyle='#fff'; ctx.fill();\n      });\n    },50);\n  })();\n \n}\n \n \nfunction hexAlpha(hex,a){\n  var r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);\n  return 'rgba('+r+','+g+','+b+','+a+')';\n}\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   TAB SWITCHER\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nwindow.switchTab = function(id, btn){\n  document.querySelectorAll('.tab-panel').forEach(function(p){p.classList.remove('active');});\n  document.querySelectorAll('.tab-btn').forEach(function(b){b.classList.remove('active');});\n  document.getElementById(id).classList.add('active');\n  btn.classList.add('active');\n};\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   MATRIX 2 \u2014 10 CWE \u00c9TENDUS v8\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nvar CWE_EXT = [\n  {id:'CWE-284', label:'CWE-284', desc:'Access Control'},\n  {id:'CWE-287', label:'CWE-287', desc:'Authentication'},\n  {id:'CWE-295', label:'CWE-295', desc:'Cert Valid.'},\n  {id:'CWE-321', label:'CWE-321', desc:'Hard-coded Key'},\n  {id:'CWE-345', label:'CWE-345', desc:'Integrity Check'},\n  {id:'CWE-208', label:'CWE-208', desc:'Timing Side-Ch.'},\n  {id:'CWE-664', label:'CWE-664', desc:'State Mgmt'},\n  {id:'CWE-667', label:'CWE-667', desc:'Lock \/ Race+'},\n  {id:'CWE-840', label:'CWE-840', desc:'Business Logic'},\n  {id:'CWE-778', label:'CWE-778', desc:'Insufficient Log'}\n];\nvar MODS_EXT = [\n  {name:'SENTINEL',      cwe:{'CWE-284':'F','CWE-287':'','CWE-295':'','CWE-321':'','CWE-345':'M','CWE-208':'','CWE-664':'M','CWE-667':'F','CWE-840':'M','CWE-778':'M'}},\n  {name:'WALL-DOME',     cwe:{'CWE-284':'F','CWE-287':'F','CWE-295':'F','CWE-321':'F','CWE-345':'F','CWE-208':'F','CWE-664':'F','CWE-667':'F','CWE-840':'F','CWE-778':'F'}},\n  {name:'OMEGA',         cwe:{'CWE-284':'F','CWE-287':'','CWE-295':'','CWE-321':'N','CWE-345':'','CWE-208':'','CWE-664':'M','CWE-667':'','CWE-840':'M','CWE-778':''}},\n  {name:'PRISM',         cwe:{'CWE-284':'','CWE-287':'','CWE-295':'','CWE-321':'','CWE-345':'','CWE-208':'','CWE-664':'M','CWE-667':'F','CWE-840':'','CWE-778':'M'}},\n  {name:'M00',           cwe:{'CWE-284':'F','CWE-287':'','CWE-295':'','CWE-321':'','CWE-345':'','CWE-208':'F','CWE-664':'F','CWE-667':'','CWE-840':'','CWE-778':''}},\n  {name:'M09-CB',        cwe:{'CWE-284':'','CWE-287':'','CWE-295':'','CWE-321':'','CWE-345':'','CWE-208':'','CWE-664':'M','CWE-667':'','CWE-840':'M','CWE-778':'M'}},\n  {name:'M11-TL',        cwe:{'CWE-284':'','CWE-287':'M','CWE-295':'M','CWE-321':'','CWE-345':'M','CWE-208':'','CWE-664':'','CWE-667':'','CWE-840':'','CWE-778':''}},\n  {name:'M26-AVA-CPL',   cwe:{'CWE-284':'','CWE-287':'','CWE-295':'M','CWE-321':'M','CWE-345':'','CWE-208':'','CWE-664':'','CWE-667':'','CWE-840':'','CWE-778':''}},\n  {name:'M27-GW',        cwe:{'CWE-284':'M','CWE-287':'M','CWE-295':'','CWE-321':'','CWE-345':'M','CWE-208':'','CWE-664':'','CWE-667':'','CWE-840':'','CWE-778':'M'}},\n  {name:'ATLAS\u2122',        cwe:{'CWE-284':'F','CWE-287':'F','CWE-295':'','CWE-321':'','CWE-345':'M','CWE-208':'','CWE-664':'M','CWE-667':'F','CWE-840':'F','CWE-778':''}},\n  {name:'AEGIS\u2122',        cwe:{'CWE-284':'F','CWE-287':'F','CWE-295':'','CWE-321':'','CWE-345':'M','CWE-208':'','CWE-664':'M','CWE-667':'F','CWE-840':'F','CWE-778':''}},\n  {name:'M24 Offline\u2122',  cwe:{'CWE-284':'F','CWE-287':'F','CWE-295':'F','CWE-321':'F','CWE-345':'F','CWE-208':'F','CWE-664':'F','CWE-667':'F','CWE-840':'F','CWE-778':'F'}},\n  {name:'CORTEX-SHIELD', cwe:{'CWE-284':'F','CWE-287':'','CWE-295':'','CWE-321':'','CWE-345':'','CWE-208':'','CWE-664':'M','CWE-667':'','CWE-840':'M','CWE-778':'M'}}\n];\n \nvar CWE_SC = [\n  {id:'CWE-829',  label:'CWE-829',  desc:'Untrusted Source'},\n  {id:'CWE-1104', label:'CWE-1104', desc:'Unsupported Comp.'},\n  {id:'CWE-1357', label:'CWE-1357', desc:'Soft Dependency'},\n  {id:'CWE-754',  label:'CWE-754',  desc:'Unusual Cond.'},\n  {id:'CWE-1188', label:'CWE-1188', desc:'Insecure Init'},\n  {id:'CWE-366',  label:'CWE-366',  desc:'Race in Signal'},\n  {id:'CWE-368',  label:'CWE-368',  desc:'Context Switch'},\n  {id:'CWE-299',  label:'CWE-299',  desc:'Revocation Check'},\n  {id:'CWE-924',  label:'CWE-924',  desc:'Trust Cached Data'}\n];\nvar MODS_SC = [\n  {name:'SENTINEL',      cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'','CWE-754':'M','CWE-1188':'','CWE-366':'F','CWE-368':'','CWE-299':'','CWE-924':''}},\n  {name:'WALL-DOME',     cwe:{'CWE-829':'F','CWE-1104':'F','CWE-1357':'F','CWE-754':'F','CWE-1188':'F','CWE-366':'F','CWE-368':'F','CWE-299':'F','CWE-924':'F'}},\n  {name:'OMEGA',         cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'M','CWE-754':'','CWE-1188':'M','CWE-366':'','CWE-368':'','CWE-299':'','CWE-924':''}},\n  {name:'PRISM',         cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'','CWE-754':'','CWE-1188':'','CWE-366':'F','CWE-368':'F','CWE-299':'','CWE-924':''}},\n  {name:'M00',           cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'','CWE-754':'','CWE-1188':'F','CWE-366':'','CWE-368':'F','CWE-299':'','CWE-924':''}},\n  {name:'M11-TL',        cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'','CWE-754':'','CWE-1188':'','CWE-366':'','CWE-368':'','CWE-299':'M','CWE-924':''}},\n  {name:'M27-GW',        cwe:{'CWE-829':'M','CWE-1104':'','CWE-1357':'','CWE-754':'','CWE-1188':'','CWE-366':'','CWE-368':'','CWE-299':'','CWE-924':'F'}},\n  {name:'ATLAS\u2122',        cwe:{'CWE-829':'M','CWE-1104':'M','CWE-1357':'','CWE-754':'M','CWE-1188':'M','CWE-366':'F','CWE-368':'','CWE-299':'','CWE-924':''}},\n  {name:'AEGIS\u2122',        cwe:{'CWE-829':'M','CWE-1104':'M','CWE-1357':'','CWE-754':'M','CWE-1188':'M','CWE-366':'F','CWE-368':'','CWE-299':'','CWE-924':''}},\n  {name:'M24 Offline\u2122',  cwe:{'CWE-829':'F','CWE-1104':'F','CWE-1357':'F','CWE-754':'F','CWE-1188':'F','CWE-366':'F','CWE-368':'F','CWE-299':'F','CWE-924':'F'}},\n  {name:'CORTEX-SHIELD', cwe:{'CWE-829':'','CWE-1104':'','CWE-1357':'','CWE-754':'M','CWE-1188':'','CWE-366':'','CWE-368':'','CWE-299':'','CWE-924':''}}\n];\n \nfunction buildExtMatrix(tableId, cols, mods){\n  var t = document.getElementById(tableId);\n  if(!t) return;\n  var h = '<thead><tr><th style=\"min-width:155px\">Module<\/th>';\n  cols.forEach(function(c){\n    h += '<th class=\"cwe-col\" style=\"background:var(--high-bg);color:var(--high)\">'+c.label+'<div style=\"font-size:9px;font-weight:400;margin-top:1px\">'+c.desc+'<\/div><\/th>';\n  });\n  h += '<\/tr><\/thead><tbody>';\n  mods.forEach(function(m){\n    h += '<tr><td><div class=\"mod-row-name\">'+m.name+'<\/div><\/td>';\n    cols.forEach(function(c){\n      var v = m.cwe[c.id]||'';\n      var cell = '';\n      if(v==='F')      cell = '<span class=\"c-sel4-inherited\" title=\"seL4 \u2131 formel\">\u2191 seL4<\/span>';\n      else if(v==='M') cell = '<span class=\"c-module\">\u2713 module<\/span>';\n      else if(v==='N') cell = '<span class=\"c-na\">\u2205<\/span>';\n      else             cell = '<span class=\"c-empty\">\u2014<\/span>';\n      h += '<td class=\"cell\">'+cell+'<\/td>';\n    });\n    h += '<\/tr>';\n  });\n  h += '<\/tbody>';\n  t.innerHTML = h;\n}\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   13 FAMILLES DE RISQUE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nvar FAMILIES = [\n  {name:'Authentification',           cwes:'287, 306, 307, 522, 798',                    modules:'M11, PRISM, OMEGA, M27, AEGIS',                    statut:'Couvert'},\n  {name:'Contr\u00f4le d\\'acc\u00e8s \/ privil.', cwes:'269, 284, 285, 732',                         modules:'M00, PRISM, OMEGA, seL4, M24, WALL-DOME',           statut:'Couvert'},\n  {name:'Secrets \/ cl\u00e9s',             cwes:'320, 321, 322',                               modules:'M11, M26, OMEGA, PRISM, M27',                       statut:'Couvert'},\n  {name:'Configuration',              cwes:'16, 276, 1188',                               modules:'ATLAS, AEGIS, OMEGA, PRISM, M24, AVA-CPL',          statut:'Couvert'},\n  {name:'Logique m\u00e9tier \/ workflow',  cwes:'840, 841, 691',                               modules:'PRISM, OMEGA, AEGIS, ATLAS, WALL-DOME',             statut:'Couvert'},\n  {name:'Cycle de vie \/ \u00e9tats',       cwes:'664, 665, 666, 670',                          modules:'PRISM, M00, M24, AEGIS, ATLAS',                     statut:'Couvert'},\n  {name:'Side-channel timing',        cwes:'203, 208, 385',                               modules:'seL4, M00, PRISM, M24, WALL-DOME',                  statut:'Couvert'},\n  {name:'Audit \/ logs',               cwes:'778, 117, 532',                               modules:'PRISM, OMEGA, M24, M27',                            statut:'Couvert'},\n  {name:'Supply chain',               cwes:'829, 1104, 1357',                             modules:'ATLAS, AEGIS, OMEGA, M11, M27',                     statut:'Couvert'},\n  {name:'Disponibilit\u00e9 avanc\u00e9e',      cwes:'667, 833, 770',                               modules:'M09, M24, WALL-DOME, AEGIS, SHIELD, seL4',          statut:'Couvert'},\n  {name:'Concurrence avanc\u00e9e',        cwes:'366, 367, 368',                               modules:'PRISM, M00, OMEGA, AEGIS, seL4',                    statut:'Couvert'},\n  {name:'Communication \/ confiance',  cwes:'295, 299, 345, 924',                          modules:'M11, M27, M26, PRISM, OMEGA',                       statut:'Couvert'},\n  {name:'Risques IA \/ entr\u00e9es',       cwes:'20, 345, 754',                                modules:'SENTINEL, SHIELD, ATLAS, AEGIS, OMEGA, PRISM, M24', statut:'Couvert'}\n];\n \nfunction buildFamilies(){\n  var el = document.getElementById('familiesTable');\n  if(!el) return;\n  var h = '<table class=\"matrix-table\" style=\"min-width:100%\"><thead><tr>';\n  h += '<th style=\"min-width:200px;text-align:left\">Famille de risque<\/th>';\n  h += '<th style=\"min-width:160px;text-align:left\">CWE cl\u00e9s<\/th>';\n  h += '<th style=\"min-width:280px;text-align:left\">Modules CORTEX<\/th>';\n  h += '<th style=\"min-width:90px;text-align:center\">Statut<\/th>';\n  h += '<\/tr><\/thead><tbody>';\n  FAMILIES.forEach(function(f, i){\n    var bg = i%2===0?'':'background:var(--bg3)';\n    h += '<tr style=\"'+bg+'\">';\n    h += '<td style=\"font-weight:600;font-size:12px;color:var(--text)\">'+f.name+'<\/td>';\n    h += '<td style=\"font-size:10px;color:var(--text3);font-family:monospace\">'+f.cwes+'<\/td>';\n    h += '<td style=\"font-size:10px;color:var(--text2)\">'+f.modules+'<\/td>';\n    h += '<td style=\"text-align:center\"><span class=\"c-module\" style=\"font-size:9px\">\u2713 '+f.statut+'<\/span><\/td>';\n    h += '<\/tr>';\n  });\n  h += '<\/tbody><\/table>';\n  el.innerHTML = h;\n}\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CWE COUVERTS \u2014 NON DOCUMENT\u00c9S FORMELLEMENT\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nvar CWE_UNDOC = [\n  \/* MITRE Top 25 \u2014 N1 *\/\n  {id:'CWE-22',  label:'CWE-22',  desc:'Path Traversal',               ref:'MITRE Top 25', confidence:'Probable',   modules:'WALL-DOME\u2122 \u2131 \u00b7 PRISM \u00b7 ATLAS \u00b7 AEGIS \u00b7 seL4', rationale:'Isolation m\u00e9moire seL4 + contr\u00f4le de flux PRISM + validation structurelle ATLAS\/AEGIS'},\n  {id:'CWE-94',  label:'CWE-94',  desc:'Code Injection',               ref:'MITRE Top 25', confidence:'Probable',   modules:'ATLAS \u00b7 AEGIS \u00b7 PRISM \u00b7 OMEGA', rationale:'Architecture compil\u00e9e statiquement \u00b7 pas d\\'interpr\u00e9teur dynamique \u00b7 contr\u00f4le strict des flux'},\n  {id:'CWE-863', label:'CWE-863', desc:'Incorrect Authorization',      ref:'MITRE Top 25', confidence:'Probable',   modules:'PRISM \u00b7 OMEGA \u00b7 M00 \u00b7 seL4', rationale:'PRISM policy enforcement + seL4 capability model + M00 root of trust'},\n  {id:'CWE-311', label:'CWE-311', desc:'Missing Encryption',           ref:'MITRE Top 25', confidence:'Probable',   modules:'M26-AVA-CPL \u00b7 M11-TL \u00b7 PRISM', rationale:'M26 \u00e9valuation cryptographique + M11 TrustLink + PRISM audit chain'},\n  {id:'CWE-319', label:'CWE-319', desc:'Cleartext Transmission',       ref:'MITRE Top 25', confidence:'Probable',   modules:'M11-TL (principal) \u00b7 M26-AVA-CPL \u00b7 PRISM \u00b7 M27-GW', rationale:'M11 TrustLink impose authentification + chiffrement + validation de canal \u00b7 M26 conformit\u00e9 crypto \u00b7 M27 filtrage gateway'},\n  {id:'CWE-326', label:'CWE-326', desc:'Inadequate Encryption Strength',ref:'MITRE Top 25',confidence:'Probable',   modules:'M26-AVA-CPL (principal) \u00b7 M11-TL \u00b7 OMEGA', rationale:'AVA-CPL = module conformit\u00e9 cryptographique \u00b7 M11 validation endpoint \u00b7 OMEGA policy enforcement'},\n  {id:'CWE-330', label:'CWE-330', desc:'Insufficient Randomness',      ref:'MITRE Top 25', confidence:'\u00c0 v\u00e9rifier', modules:'M11-TL \u00b7 M26-AVA-CPL \u00b7 PRISM', rationale:'D\u00e9pend du PRNG utilis\u00e9 \u2014 v\u00e9rification explicite requise avant revendication'},\n  {id:'CWE-693', label:'CWE-693', desc:'Protection Mechanism Failure', ref:'ICS\/SCADA',    confidence:'Fort',       modules:'M24 Offline\u2122 \u00b7 WALL-DOME\u2122 \u2131 \u00b7 M09-CB \u00b7 AEGIS', rationale:'M24 fail-closed d\u00e9terministe + WALL-DOME isolation + M09 CircuitBreaker + AEGIS fail-closed universel'},\n  {id:'CWE-755', label:'CWE-755', desc:'Improper Handling Exceptions',  ref:'ICS\/SCADA',   confidence:'Probable',   modules:'PRISM (principal) \u00b7 M24 Offline\u2122 \u00b7 AEGIS \u00b7 M09-CB', rationale:'PRISM FSM d\u00e9tecte l\\'\u00e9tat exceptionnel \u2192 M24 coupe \u00b7 AEGIS gate bloque \u00b7 M09-CB circuit breaker'},\n  {id:'CWE-921', label:'CWE-921', desc:'Sensitive Data w\/o Access Ctrl',ref:'MITRE',       confidence:'Probable',   modules:'PRISM (principal) \u00b7 OMEGA \u00b7 M00 \u00b7 seL4', rationale:'PRISM + OMEGA contr\u00f4le logique acc\u00e8s donn\u00e9es \u00b7 seL4 isolation m\u00e9moire \u00b7 M00 root of trust'},\n  {id:'CWE-1254',label:'CWE-1254',desc:'Incorrect Comparison Logic',   ref:'ICS\/SCADA',    confidence:'Probable',   modules:'PRISM \u00b7 OMEGA \u00b7 ATLAS', rationale:'PRISM FSM v\u00e9rifi\u00e9 Isabelle\/HOL + OMEGA policy enforcement + ATLAS validation logique'},\n  \/* Exposition d\\'information \u2014 N3 *\/\n  {id:'CWE-200', label:'CWE-200', desc:'Exposure of Sensitive Info',   ref:'MITRE Top 25', confidence:'Probable',   modules:'PRISM (principal) \u00b7 CORTEX-SHIELD \u00b7 M26-AVA-CPL \u00b7 M11-TL', rationale:'PRISM audit chain + CORTEX-SHIELD filtrage + M26 conformit\u00e9 + M11 endpoint'},\n  {id:'CWE-201', label:'CWE-201', desc:'Exposure via Sent Data',       ref:'MITRE Top 25', confidence:'Probable',   modules:'M27-GW (principal) \u00b7 M11-TL \u00b7 PRISM \u00b7 CORTEX-SHIELD', rationale:'M27 gateway filtre donn\u00e9es sortantes \u00b7 M11 validation canal \u00b7 PRISM policy \u00b7 SHIELD filtrage'},\n  {id:'CWE-359', label:'CWE-359', desc:'Private Info Exposure',        ref:'MITRE Top 25', confidence:'Probable',   modules:'PRISM (principal) \u00b7 M11-TL \u00b7 M26-AVA-CPL \u00b7 CORTEX-SHIELD', rationale:'PRISM contr\u00f4le acc\u00e8s donn\u00e9es priv\u00e9es \u00b7 M11 authenticit\u00e9 \u00b7 M26 conformit\u00e9 \u00b7 SHIELD filtrage'},\n  \/* OWASP LLM Top 10 *\/\n  {id:'LLM01',   label:'LLM-01',  desc:'Prompt Injection',             ref:'OWASP LLM',    confidence:'Probable',   modules:'ATLAS \u00b7 AEGIS \u00b7 SENTINEL \u00b7 CORTEX-SHIELD', rationale:'Validation structurelle entr\u00e9es ATLAS + SENTINEL scoring anomalie + AEGIS gate + SHIELD filtrage'},\n  {id:'LLM03',   label:'LLM-03',  desc:'Training Data Poisoning',      ref:'OWASP LLM',    confidence:'Probable',   modules:'ATLAS \u00b7 OMEGA \u00b7 M24 Offline\u2122', rationale:'Architecture offline r\u00e9duit fortement la surface \u00b7 OMEGA policy contr\u00f4le pipeline ML'},\n  {id:'LLM05',   label:'LLM-05',  desc:'Unauthorized Model Behavior',  ref:'OWASP LLM',    confidence:'Probable',   modules:'OMEGA (principal) \u00b7 PRISM \u00b7 AEGIS \u00b7 ATLAS', rationale:'OMEGA = moteur de politique d\u00e9cision \u00b7 AEGIS gate ex\u00e9cution \u00b7 PRISM FSM transitions autoris\u00e9es'},\n  {id:'LLM06',   label:'LLM-06',  desc:'Sensitive Info Disclosure',    ref:'OWASP LLM',    confidence:'Probable',   modules:'PRISM \u00b7 CORTEX-SHIELD \u00b7 ATLAS', rationale:'PRISM audit chain + CORTEX-SHIELD filtrage sorties + ATLAS canonical output'},\n  {id:'LLM07',   label:'LLM-07',  desc:'Unsafe Tool Use',              ref:'OWASP LLM',    confidence:'Probable',   modules:'AEGIS (principal) \u00b7 OMEGA \u00b7 PRISM \u00b7 ATLAS', rationale:'AEGIS gate d\\'ex\u00e9cution bloque appels non autoris\u00e9s \u00b7 OMEGA policy \u00b7 PRISM FSM'},\n  {id:'LLM08',   label:'LLM-08',  desc:'Context Manipulation',         ref:'OWASP LLM',    confidence:'Probable',   modules:'ATLAS (principal) \u00b7 PRISM \u00b7 SENTINEL \u00b7 CORTEX-SHIELD', rationale:'ATLAS valide structures et propositions \u00b7 PRISM coh\u00e9rence contexte \u00b7 SENTINEL d\u00e9tection anomalie'},\n  {id:'LLM09',   label:'LLM-09',  desc:'Adversarial Input \/ Evasion',  ref:'OWASP LLM',    confidence:'Probable',   modules:'SENTINEL (principal) \u00b7 CORTEX-SHIELD \u00b7 ATLAS \u00b7 AEGIS', rationale:'SENTINEL scoring anomalie entr\u00e9es adversariales \u00b7 SHIELD filtrage \u00b7 ATLAS validation \u00b7 AEGIS gate'},\n  {id:'LLM10',   label:'LLM-10',  desc:'Model Theft',                  ref:'OWASP LLM',    confidence:'Fort',       modules:'AEGIS \u00b7 M27-GW \u00b7 PRISM \u00b7 M24 Offline\u2122 \u00b7 WALL-DOME\u2122 \u2131', rationale:'Architecture offline + gating AEGIS + isolation r\u00e9seau WALL-DOME \u2014 extraction via API impossible par construction'}\n];\n \nfunction buildUndocTable(){\n  var el = document.getElementById('undocTable');\n  if(!el) return;\n  var refColors = {'MITRE Top 25':'#1e40af','ICS\/SCADA':'#854F0B','OWASP LLM':'#0F6E56'};\n  var refBg     = {'MITRE Top 25':'#eff6ff','ICS\/SCADA':'var(--safe-bg)','OWASP LLM':'var(--sec-bg)'};\n  var confColors= {'Fort':'#0F6E56','Probable':'#534AB7','\u00c0 v\u00e9rifier':'#993C1D'};\n  var confBg    = {'Fort':'var(--sec-bg)','Probable':'var(--tcb-bg)','\u00c0 v\u00e9rifier':'var(--wip-bg)'};\n \n  var h = '<table class=\"matrix-table\" style=\"min-width:100%\"><thead><tr>';\n  h += '<th style=\"min-width:90px\">CWE \/ ID<\/th>';\n  h += '<th style=\"min-width:170px\">Description<\/th>';\n  h += '<th style=\"min-width:90px;text-align:center\">R\u00e9f\u00e9rentiel<\/th>';\n  h += '<th style=\"min-width:90px;text-align:center\">Confiance<\/th>';\n  h += '<th style=\"min-width:250px\">Modules concern\u00e9s<\/th>';\n  h += '<th style=\"min-width:300px\">Justification architecturale<\/th>';\n  h += '<\/tr><\/thead><tbody>';\n \n  CWE_UNDOC.forEach(function(c, i){\n    var bg = i%2===0?'':'background:var(--bg3)';\n    var rc = refColors[c.ref]||'#6b6966';\n    var rb = refBg[c.ref]||'var(--bg3)';\n    var cc = confColors[c.confidence]||'#6b6966';\n    var cb = confBg[c.confidence]||'var(--bg3)';\n    h += '<tr style=\"'+bg+'\">';\n    h += '<td style=\"font-weight:700;font-size:11px;color:var(--text);font-family:monospace\">'+c.label+'<\/td>';\n    h += '<td style=\"font-size:11px;color:var(--text2)\">'+c.desc+'<\/td>';\n    h += '<td style=\"text-align:center\"><span style=\"font-size:9px;font-weight:700;padding:2px 7px;border-radius:10px;background:'+rb+';color:'+rc+'\">'+c.ref+'<\/span><\/td>';\n    h += '<td style=\"text-align:center\"><span style=\"font-size:9px;font-weight:700;padding:2px 7px;border-radius:10px;background:'+cb+';color:'+cc+'\">'+c.confidence+'<\/span><\/td>';\n    h += '<td style=\"font-size:10px;color:var(--tcb)\">'+c.modules+'<\/td>';\n    h += '<td style=\"font-size:10px;color:var(--text3);font-style:italic\">'+c.rationale+'<\/td>';\n    h += '<\/tr>';\n  });\n  h += '<\/tbody><\/table>';\n  el.innerHTML = h;\n}\n \nwindow.switchTab = function(id, btn){\n  document.querySelectorAll('.tab-panel').forEach(function(p){ p.classList.remove('active'); });\n  document.querySelectorAll('.tab-btn').forEach(function(b){ b.classList.remove('active'); });\n  var el = document.getElementById(id);\n  if(el) el.classList.add('active');\n  if(btn) btn.classList.add('active');\n  if(id === 't2') buildExtMatrix('matrix2', CWE_EXT, MODS_EXT);\n  if(id === 't3') buildExtMatrix('matrix3', CWE_SC, MODS_SC);\n};\n \n\/* \u2500\u2500 INIT \u2500\u2500 *\/\ndocument.addEventListener('DOMContentLoaded', function(){\n  buildMatrix('all');\n  buildCards();\n  buildFamilies();\n  buildUndocTable();\n  (function(){\n    var tries\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Menu Cortex ORIGIN\u2122 CORTEX ORIGIN\u2122 AETZU ARROW AI\u2122 Architecture Socle critique (TCB) CORTEX ORIGIN\u2122 \u2014 Vue d&rsquo;ensemble Cortex Core\u2122 OMEGA\u2122 \u2014 Gouvernance PRISM\u2122 \u2014 Preuve AEGIS\u2122 \u2014 Ex\u00e9cution FULCRUM\u2122 S\u00e9curit\u00e9 &amp; Confinement SENTINEL\u2122 \u2014 S\u00e9curit\u00e9 active WALL-DOME\u2122 \u2014 Confinement CERB\u00c8RE\u2122 Decision Guard\u2122 CMS CORTEX MORPHIC SHIELD\u2122 \u2197 Interface &amp; Orchestration AVA\u2122 &amp; CPL\u2122 \u2014 Interface [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1043","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/comments?post=1043"}],"version-history":[{"count":21,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1043\/revisions"}],"predecessor-version":[{"id":1393,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1043\/revisions\/1393"}],"wp:attachment":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/media?parent=1043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}