⚡ WEVIA Master Streaming
fetch+getReader() + AbortSignal.timeout(3600000ms). Pattern identique Claude Code SDK. SSE parsing 5 types événements.
@@ -278,6 +308,41 @@ document.querySelectorAll('#code-modes .mode').forEach(m=>m.addEventListener('cl
codeMode=m.dataset.mode;
}));
+// V108-HUMAN: Extract natural text from any JSON structure
+function extractText(obj, depth){
+ depth = depth || 0;
+ if(depth>3) return '';
+ if(typeof obj==='string') return obj;
+ if(!obj || typeof obj!=='object') return '';
+ var keys=['content','response','text','answer','message','output','reply','result','code'];
+ for(var i=0;i
10) return vals[j]; }
+ return '';
+}
+
+// V108-HUMAN: Humanize robotic output
+function humanize(txt){
+ if(!txt) return '';
+ if(typeof txt!=='string') txt=String(txt);
+ txt=txt.trim();
+ // Strip wrapping quotes
+ if(txt.length>1 && txt[0]==='"' && txt[txt.length-1]==='"'){
+ try{ txt=JSON.parse(txt); }catch(e){}
+ }
+ // Unescape common sequences
+ txt=txt.replace(/\\n/g,'\n').replace(/\\t/g,'\t').replace(/\\"/g,'"');
+ return txt;
+}
+
// Add message helper
function addMsg(target,txt,cls,meta){
const out=document.getElementById(target);
@@ -307,7 +372,11 @@ async function sendChat(){
});
const d=await res.json();
const t=((Date.now()-t0)/1000).toFixed(1);
- addMsg('out-chat',d.response||JSON.stringify(d),'a',(d.provider||'?')+' · '+t+'s'+(d.agents_count?' · '+d.agents_count+' agents':''));
+ /* V108-HUMAN: extract natural text */
+ let txt=d.content||d.response||d.text||d.answer||d.message||d.output||d.reply||'';
+ if(!txt && typeof d==='object'){ txt=extractText(d); }
+ if(!txt) txt=JSON.stringify(d,null,2);
+ addMsg('out-chat',humanize(txt),'a',(d.provider||d.tool||'?')+' · '+t+'s'+(d.agents_count?' · '+d.agents_count+' agents':''));
}catch(e){
addMsg('out-chat','Error: '+e.message,'a','error');
}
@@ -332,8 +401,10 @@ async function sendCode(){
});
const d=await res.json();
const t=((Date.now()-t0)/1000).toFixed(1);
- const out=d.result||d.response||d.text||d.output||JSON.stringify(d);
- addMsg('out-code',out,'a',codeMode+' · '+t+'s');
+ let out=d.content||d.result||d.response||d.text||d.answer||d.output||d.code||'';
+ if(!out && typeof d==='object'){ out=extractText(d); }
+ if(!out) out=JSON.stringify(d,null,2);
+ addMsg('out-code',humanize(out),'a',codeMode+' · '+(d.model||d.provider||'sovereign')+' · '+t+'s');
}catch(e){
addMsg('out-code','Error: '+e.message,'a','error');
}
@@ -358,8 +429,10 @@ async function sendArena(){
});
const d=await res.json();
const t=((Date.now()-t0)/1000).toFixed(1);
- const out=d.response||d.result||d.text||JSON.stringify(d);
- addMsg('out-arena',out,'a',(d.provider||'auto')+' · '+t+'s');
+ let out=d.content||d.response||d.result||d.text||d.answer||d.output||'';
+ if(!out && typeof d==='object'){ out=extractText(d); }
+ if(!out) out=JSON.stringify(d,null,2);
+ addMsg('out-arena',humanize(out),'a',(d.provider||d.model||'auto')+' · '+t+'s');
}catch(e){
// Fallback: try master API
try{
diff --git a/api/architecture-scan.json b/api/architecture-scan.json
index e69de29bb..c88f929ab 100644
--- a/api/architecture-scan.json
+++ b/api/architecture-scan.json
@@ -0,0 +1,1956 @@
+{
+ "generated": "2026-04-21 00:30:01",
+ "version": "1.0",
+ "servers": [
+ {
+ "id": "S204",
+ "ip": "204.168.152.13",
+ "private": "10.1.0.2",
+ "role": "PRIMARY",
+ "ssh": 49222,
+ "disk_pct": 79,
+ "disk_avail": "32G",
+ "uptime": "up 6 days, 14 hours, 38 minutes",
+ "nginx": "active",
+ "php_fpm": "active",
+ "php_version": "8.5.5"
+ },
+ {
+ "id": "S95",
+ "ip": "95.216.167.89",
+ "private": "10.1.0.3",
+ "role": "WEVADS Arsenal",
+ "ssh": 22,
+ "disk_pct": 82,
+ "disk_avail": "27G",
+ "sentinel": 1
+ },
+ {
+ "id": "S151",
+ "ip": "151.80.235.110",
+ "private": null,
+ "role": "DR\/Tracking OVH",
+ "ssh": 22
+ }
+ ],
+ "docker": [
+ {
+ "name": "loki",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "listmonk",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "plausible-plausible-1",
+ "status": "Up 3 days",
+ "ports": ""
+ },
+ {
+ "name": "plausible-plausible-db-1",
+ "status": "Up 3 days",
+ "ports": ""
+ },
+ {
+ "name": "plausible-plausible-events-db-1",
+ "status": "Up 3 days",
+ "ports": ""
+ },
+ {
+ "name": "n8n-docker-n8n-1",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "mattermost-docker-mm-db-1",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "mattermost-docker-mattermost-1",
+ "status": "Up 4 days (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "twenty",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "twenty-redis",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "langfuse",
+ "status": "Up 5 days",
+ "ports": ""
+ },
+ {
+ "name": "redis-weval",
+ "status": "Up 6 days",
+ "ports": ""
+ },
+ {
+ "name": "gitea",
+ "status": "Up 6 days",
+ "ports": ""
+ },
+ {
+ "name": "node-exporter",
+ "status": "Up 6 days",
+ "ports": ""
+ },
+ {
+ "name": "prometheus",
+ "status": "Up 6 days",
+ "ports": ""
+ },
+ {
+ "name": "searxng",
+ "status": "Up 6 days",
+ "ports": ""
+ },
+ {
+ "name": "uptime-kuma",
+ "status": "Up 24 hours (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "vaultwarden",
+ "status": "Up 6 days (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "qdrant",
+ "status": "Up 6 days",
+ "ports": ""
+ }
+ ],
+ "domains": [
+ {
+ "file": "analytics.weval-consulting.com",
+ "server_names": [
+ "analytics.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "arsenal.weval-consulting.com",
+ "server_names": [
+ "arsenal.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "code-weval",
+ "server_names": [
+ "code.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "crm.weval-consulting.com",
+ "server_names": [
+ "crm.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "ethica",
+ "server_names": [
+ "ethica.wevup.app",
+ "consent.wevup.app"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "git.weval-consulting.com",
+ "server_names": [
+ "git.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "langfuse.weval-consulting.com",
+ "server_names": [
+ "langfuse.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "mirofish.weval-consulting.com",
+ "server_names": [
+ "mirofish.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "mm.weval-consulting.com",
+ "server_names": [
+ "mm.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "monitor.weval-consulting.com",
+ "server_names": [
+ "monitor.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "n8n.weval-consulting.com",
+ "server_names": [
+ "n8n.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "paperclip.weval-consulting.com",
+ "server_names": [
+ "paperclip.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "wevads.weval-consulting.com",
+ "server_names": [
+ "wevads.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ },
+ {
+ "file": "weval-consulting",
+ "server_names": [
+ "weval-consulting.com",
+ "www.weval-consulting.com"
+ ],
+ "ssl": true,
+ "php-session": false,
+ "php-session_paths": false,
+ "auth_complete": false
+ }
+ ],
+ "screens": {
+ "s204_html": 293,
+ "s204_products": 104,
+ "s204_api_php": 765,
+ "s204_wevia_php": 23,
+ "s95_arsenal_html": 1377,
+ "s95_arsenal_api": 377
+ },
+ "auth": {
+ "system": "PHP Session Auth",
+ "authentik": "REMOVED",
+ "pass": 24,
+ "fail": 0
+ },
+ "databases": {
+ "s204": [
+ "postgres",
+ "adx_system",
+ "wevia_db",
+ "twenty_db",
+ "mattermost_db",
+ "deerflow",
+ "nocodb",
+ "paperclip",
+ "langfuse"
+ ],
+ "key_tables": {
+ "kb_learnings": 5518,
+ "kb_documents": 0,
+ "ethica_medecins": 50004,
+ "enterprise_agents": 0
+ }
+ },
+ "ollama": [
+ {
+ "name": "weval-brain-v4:latest",
+ "family": "qwen3",
+ "params": "4.0B",
+ "quant": "Q4_K_M",
+ "size_gb": 2.5
+ },
+ {
+ "name": "llama3.2:latest",
+ "family": "llama",
+ "params": "3.2B",
+ "quant": "Q4_K_M",
+ "size_gb": 2
+ },
+ {
+ "name": "nomic-embed-text:latest",
+ "family": "nomic-bert",
+ "params": "137M",
+ "quant": "F16",
+ "size_gb": 0.3
+ },
+ {
+ "name": "weval-brain-v3:latest",
+ "family": "qwen3",
+ "params": "4.0B",
+ "quant": "Q4_K_M",
+ "size_gb": 2.5
+ },
+ {
+ "name": "nomic-embed-text:v1.5",
+ "family": "nomic-bert",
+ "params": "137M",
+ "quant": "F16",
+ "size_gb": 0.3
+ },
+ {
+ "name": "qwen3:4b",
+ "family": "qwen3",
+ "params": "4.0B",
+ "quant": "Q4_K_M",
+ "size_gb": 2.5
+ },
+ {
+ "name": "all-minilm:latest",
+ "family": "bert",
+ "params": "23M",
+ "quant": "F16",
+ "size_gb": 0
+ }
+ ],
+ "qdrant": [
+ {
+ "name": "weval_skills",
+ "vectors": 19089
+ },
+ {
+ "name": "wevia_graph",
+ "vectors": 3
+ },
+ {
+ "name": "weval_intents_memory",
+ "vectors": 50
+ },
+ {
+ "name": "obsidian_vault",
+ "vectors": 46
+ },
+ {
+ "name": "kb_bpmn_flows",
+ "vectors": 7
+ },
+ {
+ "name": "kb_ethica_pharma",
+ "vectors": 16
+ },
+ {
+ "name": "kb_consulting_strategy",
+ "vectors": 6
+ },
+ {
+ "name": "wevia_learnings",
+ "vectors": 1736
+ },
+ {
+ "name": "wevia_brain_knowledge",
+ "vectors": 294
+ },
+ {
+ "name": "kb_vsm_best_practices",
+ "vectors": 7
+ },
+ {
+ "name": "kb_bpmn_patterns",
+ "vectors": 7
+ },
+ {
+ "name": "kb_dmaic_playbooks",
+ "vectors": 7
+ },
+ {
+ "name": "kb_wevads_deliv",
+ "vectors": 6
+ },
+ {
+ "name": "wevia_memory_768",
+ "vectors": 82
+ },
+ {
+ "name": "wevia_kb_768",
+ "vectors": 255
+ },
+ {
+ "name": "weval_agents_registry",
+ "vectors": 50
+ },
+ {
+ "name": "wevia_kb",
+ "vectors": 386
+ },
+ {
+ "name": "wevia_memory",
+ "vectors": 48
+ },
+ {
+ "name": "kb_lean6sigma",
+ "vectors": 10
+ }
+ ],
+ "ai_providers": [
+ {
+ "name": "Cerebras",
+ "model": "Qwen-235B",
+ "tier": "T1",
+ "status": "active"
+ },
+ {
+ "name": "Groq",
+ "model": "Llama-4-Scout",
+ "tier": "T1",
+ "status": "active"
+ },
+ {
+ "name": "SambaNova",
+ "model": "Llama-3.3-70B",
+ "tier": "T1",
+ "status": "active"
+ },
+ {
+ "name": "NVIDIA NIM",
+ "model": "Llama-3.1-70B",
+ "tier": "T1",
+ "status": "active"
+ },
+ {
+ "name": "Together",
+ "model": "Qwen-2.5-72B",
+ "tier": "T1",
+ "status": "active"
+ },
+ {
+ "name": "Mistral",
+ "model": "Mistral-Small",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "Cohere",
+ "model": "Command-R+",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "Gemini",
+ "model": "Gemini-2.0-Flash",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "DeepSeek",
+ "model": "DeepSeek-Chat",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "OpenRouter",
+ "model": "Multi",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "Alibaba",
+ "model": "Qwen-Max",
+ "tier": "T2",
+ "status": "active"
+ },
+ {
+ "name": "HuggingFace",
+ "model": "Inference",
+ "tier": "T3",
+ "status": "active"
+ },
+ {
+ "name": "Replicate",
+ "model": "Multi",
+ "tier": "T3",
+ "status": "active"
+ },
+ {
+ "name": "ZhiPu",
+ "model": "GLM-4",
+ "tier": "T3",
+ "status": "active"
+ },
+ {
+ "name": "Ollama Local",
+ "model": "weval-brain-v3",
+ "tier": "T0",
+ "status": "active"
+ }
+ ],
+ "crons": {
+ "s204_root": 0,
+ "s204_www": 35,
+ "s204_total": 35,
+ "key_crons": [
+ {
+ "name": "L99 Master",
+ "freq": "*\/30",
+ "target": "l99-master.py"
+ },
+ {
+ "name": "Autonomous Engine",
+ "freq": "*\/5",
+ "target": "wevia-master-autonomous"
+ },
+ {
+ "name": "L99 Pipeline",
+ "freq": "*\/15",
+ "target": "l99-pipeline.py"
+ },
+ {
+ "name": "L99 Alive",
+ "freq": "*\/10",
+ "target": "l99-alive.py"
+ },
+ {
+ "name": "Infra Guardian",
+ "freq": "*\/5",
+ "target": "infra-guardian.sh"
+ },
+ {
+ "name": "Blade Watchdog",
+ "freq": "*\/5",
+ "target": "blade-watchdog.php"
+ },
+ {
+ "name": "RAG Ingest",
+ "freq": "*\/30",
+ "target": "wevia-rag-ingest.sh"
+ },
+ {
+ "name": "Blade Orchestrator",
+ "freq": "*\/30",
+ "target": "blade-orchestrator.sh"
+ },
+ {
+ "name": "WEVIA Dream",
+ "freq": "*\/30",
+ "target": "wevia-dream-cron.php"
+ },
+ {
+ "name": "Port Protection",
+ "freq": "*\/5",
+ "target": "port-protection"
+ },
+ {
+ "name": "Watchdog",
+ "freq": "*\/3",
+ "target": "weval-watchdog.php"
+ },
+ {
+ "name": "Ethica Enrich",
+ "freq": "daily 01h",
+ "target": "ethica-enrich-v4.py"
+ },
+ {
+ "name": "Daily Brief",
+ "freq": "daily 07h",
+ "target": "weval-daily-brief.py"
+ }
+ ]
+ },
+ "wiki": {
+ "total_entries": 5518,
+ "categories": [
+ {
+ "category": "AUTO-FIX",
+ "cnt": "2972"
+ },
+ {
+ "category": "TOPOLOGY",
+ "cnt": "1190"
+ },
+ {
+ "category": "DISCOVERY",
+ "cnt": "610"
+ },
+ {
+ "category": "SYSTEMATIC",
+ "cnt": "204"
+ },
+ {
+ "category": "L99-FULLSCAN",
+ "cnt": "80"
+ },
+ {
+ "category": "INFRA",
+ "cnt": "74"
+ },
+ {
+ "category": "CONTROL-TOWER",
+ "cnt": "42"
+ },
+ {
+ "category": "ALERT",
+ "cnt": "34"
+ },
+ {
+ "category": "AGENT",
+ "cnt": "20"
+ },
+ {
+ "category": "L99-SCAN",
+ "cnt": "12"
+ },
+ {
+ "category": "FIX",
+ "cnt": "10"
+ },
+ {
+ "category": "FLEET",
+ "cnt": "8"
+ },
+ {
+ "category": "MASTER-INTENT",
+ "cnt": "6"
+ },
+ {
+ "category": "SESSION-5AVR",
+ "cnt": "5"
+ },
+ {
+ "category": "Maroc",
+ "cnt": "5"
+ },
+ {
+ "category": "Analyse",
+ "cnt": "5"
+ },
+ {
+ "category": "AUTH",
+ "cnt": "5"
+ },
+ {
+ "category": "claude_2026",
+ "cnt": "4"
+ },
+ {
+ "category": "SERVICES",
+ "cnt": "4"
+ },
+ {
+ "category": "WEVAL Consulting",
+ "cnt": "4"
+ },
+ {
+ "category": "Intelligence Artificielle",
+ "cnt": "3"
+ },
+ {
+ "category": "PARADIGM",
+ "cnt": "3"
+ },
+ {
+ "category": "INTEGRATION",
+ "cnt": "3"
+ },
+ {
+ "category": "FIX-CRITIQUE",
+ "cnt": "3"
+ },
+ {
+ "category": "Voici",
+ "cnt": "2"
+ },
+ {
+ "category": "Vous",
+ "cnt": "2"
+ },
+ {
+ "category": "Pouvez",
+ "cnt": "2"
+ },
+ {
+ "category": "Image",
+ "cnt": "2"
+ },
+ {
+ "category": "Contexte",
+ "cnt": "2"
+ },
+ {
+ "category": "L99-EXHAUSTIVE",
+ "cnt": "2"
+ },
+ {
+ "category": "L99-GAP",
+ "cnt": "2"
+ },
+ {
+ "category": "WEVAL Consulting Casablanca",
+ "cnt": "2"
+ },
+ {
+ "category": "Test",
+ "cnt": "2"
+ },
+ {
+ "category": "Salut",
+ "cnt": "2"
+ },
+ {
+ "category": "L99-E2E",
+ "cnt": "2"
+ },
+ {
+ "category": "Document",
+ "cnt": "2"
+ },
+ {
+ "category": "PROVIDERS",
+ "cnt": "2"
+ },
+ {
+ "category": "Bien",
+ "cnt": "2"
+ },
+ {
+ "category": "WEVIA",
+ "cnt": "2"
+ },
+ {
+ "category": "Diagramme",
+ "cnt": "2"
+ },
+ {
+ "category": "Comparaison",
+ "cnt": "2"
+ },
+ {
+ "category": "L99-MEGA",
+ "cnt": "2"
+ },
+ {
+ "category": "QUALITY",
+ "cnt": "2"
+ },
+ {
+ "category": "Cependant",
+ "cnt": "2"
+ },
+ {
+ "category": "MONITORING",
+ "cnt": "2"
+ },
+ {
+ "category": "L99",
+ "cnt": "2"
+ },
+ {
+ "category": "Introduction",
+ "cnt": "2"
+ },
+ {
+ "category": "Pour",
+ "cnt": "2"
+ },
+ {
+ "category": "Casablanca",
+ "cnt": "2"
+ },
+ {
+ "category": "Pourriez",
+ "cnt": "2"
+ },
+ {
+ "category": "Vistex BTP Signavio",
+ "cnt": "1"
+ },
+ {
+ "category": "Conduite",
+ "cnt": "1"
+ },
+ {
+ "category": "DMAIC",
+ "cnt": "1"
+ },
+ {
+ "category": "Industrie",
+ "cnt": "1"
+ },
+ {
+ "category": "Proposition",
+ "cnt": "1"
+ },
+ {
+ "category": "Accueil\nBienvenue",
+ "cnt": "1"
+ },
+ {
+ "category": "Logo",
+ "cnt": "1"
+ },
+ {
+ "category": "SAP ECC",
+ "cnt": "1"
+ },
+ {
+ "category": "Votre",
+ "cnt": "1"
+ },
+ {
+ "category": "Probl",
+ "cnt": "1"
+ },
+ {
+ "category": "ANTI-REGRESSION",
+ "cnt": "1"
+ },
+ {
+ "category": "Explique",
+ "cnt": "1"
+ },
+ {
+ "category": "Zero Trust",
+ "cnt": "1"
+ },
+ {
+ "category": "Augmented Generation",
+ "cnt": "1"
+ },
+ {
+ "category": "RLHF",
+ "cnt": "1"
+ },
+ {
+ "category": "Service",
+ "cnt": "1"
+ },
+ {
+ "category": "Transformer",
+ "cnt": "1"
+ },
+ {
+ "category": "Bonjour Bonjour",
+ "cnt": "1"
+ },
+ {
+ "category": "Transformation",
+ "cnt": "1"
+ },
+ {
+ "category": "Audit",
+ "cnt": "1"
+ },
+ {
+ "category": "WEVAL",
+ "cnt": "1"
+ },
+ {
+ "category": "Strat",
+ "cnt": "1"
+ },
+ {
+ "category": "Maghreb",
+ "cnt": "1"
+ },
+ {
+ "category": "ERP SAP",
+ "cnt": "1"
+ },
+ {
+ "category": "Quelle",
+ "cnt": "1"
+ },
+ {
+ "category": "Oracle",
+ "cnt": "1"
+ },
+ {
+ "category": "Data",
+ "cnt": "1"
+ },
+ {
+ "category": "Donn",
+ "cnt": "1"
+ },
+ {
+ "category": "Quel",
+ "cnt": "1"
+ },
+ {
+ "category": "Syst",
+ "cnt": "1"
+ },
+ {
+ "category": "Ahmed",
+ "cnt": "1"
+ },
+ {
+ "category": "UiPath",
+ "cnt": "1"
+ },
+ {
+ "category": "Niveau PhD",
+ "cnt": "1"
+ },
+ {
+ "category": "CLEANUP",
+ "cnt": "1"
+ },
+ {
+ "category": "Notre",
+ "cnt": "1"
+ },
+ {
+ "category": "TOUTES",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc DDMRP OTIF",
+ "cnt": "1"
+ },
+ {
+ "category": "Crit",
+ "cnt": "1"
+ },
+ {
+ "category": "SAP Vistex Revenue Management",
+ "cnt": "1"
+ },
+ {
+ "category": "Fine",
+ "cnt": "1"
+ },
+ {
+ "category": "Compare AWS Azure GCP",
+ "cnt": "1"
+ },
+ {
+ "category": "Healthcare",
+ "cnt": "1"
+ },
+ {
+ "category": "BLADE",
+ "cnt": "1"
+ },
+ {
+ "category": "Plan",
+ "cnt": "1"
+ },
+ {
+ "category": "Conseil",
+ "cnt": "1"
+ },
+ {
+ "category": "Nous",
+ "cnt": "1"
+ },
+ {
+ "category": "Zero Trust SOC SIEM",
+ "cnt": "1"
+ },
+ {
+ "category": "Amazon Web Services",
+ "cnt": "1"
+ },
+ {
+ "category": "Retiens",
+ "cnt": "1"
+ },
+ {
+ "category": "Diff",
+ "cnt": "1"
+ },
+ {
+ "category": "QDRANT",
+ "cnt": "1"
+ },
+ {
+ "category": "MITRE ATT",
+ "cnt": "1"
+ },
+ {
+ "category": "FMCG",
+ "cnt": "1"
+ },
+ {
+ "category": "Supply",
+ "cnt": "1"
+ },
+ {
+ "category": "Exercice",
+ "cnt": "1"
+ },
+ {
+ "category": "Redige",
+ "cnt": "1"
+ },
+ {
+ "category": "Supply Chain",
+ "cnt": "1"
+ },
+ {
+ "category": "Quels",
+ "cnt": "1"
+ },
+ {
+ "category": "Propose",
+ "cnt": "1"
+ },
+ {
+ "category": "Plateforme",
+ "cnt": "1"
+ },
+ {
+ "category": "Cyber",
+ "cnt": "1"
+ },
+ {
+ "category": "Tableau",
+ "cnt": "1"
+ },
+ {
+ "category": "Migration SAP",
+ "cnt": "1"
+ },
+ {
+ "category": "AUTH-AGENT",
+ "cnt": "1"
+ },
+ {
+ "category": "Fais",
+ "cnt": "1"
+ },
+ {
+ "category": "Iran",
+ "cnt": "1"
+ },
+ {
+ "category": "OLLAMA",
+ "cnt": "1"
+ },
+ {
+ "category": "Reessayez",
+ "cnt": "1"
+ },
+ {
+ "category": "MORNE WEVAL",
+ "cnt": "1"
+ },
+ {
+ "category": "Analyse SWOT",
+ "cnt": "1"
+ },
+ {
+ "category": "SAP Vistex",
+ "cnt": "1"
+ },
+ {
+ "category": "IoT WMS",
+ "cnt": "1"
+ },
+ {
+ "category": "Industry",
+ "cnt": "1"
+ },
+ {
+ "category": "What",
+ "cnt": "1"
+ },
+ {
+ "category": "Strategie",
+ "cnt": "1"
+ },
+ {
+ "category": "Rappelle",
+ "cnt": "1"
+ },
+ {
+ "category": "DMAIC Six Sigma",
+ "cnt": "1"
+ },
+ {
+ "category": "Avantages",
+ "cnt": "1"
+ },
+ {
+ "category": "Explique RLHF",
+ "cnt": "1"
+ },
+ {
+ "category": "Huawei Cloud",
+ "cnt": "1"
+ },
+ {
+ "category": "PMO SAFe",
+ "cnt": "1"
+ },
+ {
+ "category": "Migration SAP ECC",
+ "cnt": "1"
+ },
+ {
+ "category": "team_work",
+ "cnt": "1"
+ },
+ {
+ "category": "Bonjour Pr",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc DDMRP OTIF WMS TMS",
+ "cnt": "1"
+ },
+ {
+ "category": "Architecture",
+ "cnt": "1"
+ },
+ {
+ "category": "Framework NIST",
+ "cnt": "1"
+ },
+ {
+ "category": "Automatiser",
+ "cnt": "1"
+ },
+ {
+ "category": "Compare RLHF DPO Constitutional AI",
+ "cnt": "1"
+ },
+ {
+ "category": "Genere",
+ "cnt": "1"
+ },
+ {
+ "category": "Elle",
+ "cnt": "1"
+ },
+ {
+ "category": "Constitutional AI",
+ "cnt": "1"
+ },
+ {
+ "category": "Brownfield",
+ "cnt": "1"
+ },
+ {
+ "category": "Confirmation",
+ "cnt": "1"
+ },
+ {
+ "category": "Architecture IA",
+ "cnt": "1"
+ },
+ {
+ "category": "KPIs",
+ "cnt": "1"
+ },
+ {
+ "category": "Quelles",
+ "cnt": "1"
+ },
+ {
+ "category": "SWOT",
+ "cnt": "1"
+ },
+ {
+ "category": "Comparons",
+ "cnt": "1"
+ },
+ {
+ "category": "Services",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc TMA",
+ "cnt": "1"
+ },
+ {
+ "category": "Contraintes",
+ "cnt": "1"
+ },
+ {
+ "category": "Intelligence",
+ "cnt": "1"
+ },
+ {
+ "category": "Donne",
+ "cnt": "1"
+ },
+ {
+ "category": "Vistex",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc CMI",
+ "cnt": "1"
+ },
+ {
+ "category": "Audite",
+ "cnt": "1"
+ },
+ {
+ "category": "Aide",
+ "cnt": "1"
+ },
+ {
+ "category": "DKIM DMARC",
+ "cnt": "1"
+ },
+ {
+ "category": "Zero Trust SOC",
+ "cnt": "1"
+ },
+ {
+ "category": "Bonjour Yacine",
+ "cnt": "1"
+ },
+ {
+ "category": "Workshop",
+ "cnt": "1"
+ },
+ {
+ "category": "Compare RLHF DPO GRPO Constitutional AI",
+ "cnt": "1"
+ },
+ {
+ "category": "Comparatif ERP PME",
+ "cnt": "1"
+ },
+ {
+ "category": "Programme",
+ "cnt": "1"
+ },
+ {
+ "category": "SAP MM",
+ "cnt": "1"
+ },
+ {
+ "category": "Phases",
+ "cnt": "1"
+ },
+ {
+ "category": "Autres",
+ "cnt": "1"
+ },
+ {
+ "category": "FHIR",
+ "cnt": "1"
+ },
+ {
+ "category": "SESSION-7AVR",
+ "cnt": "1"
+ },
+ {
+ "category": "FHIR IA",
+ "cnt": "1"
+ },
+ {
+ "category": "MLOps",
+ "cnt": "1"
+ },
+ {
+ "category": "MIROFISH",
+ "cnt": "1"
+ },
+ {
+ "category": "Ecris",
+ "cnt": "1"
+ },
+ {
+ "category": "Suite",
+ "cnt": "1"
+ },
+ {
+ "category": "Nearshore",
+ "cnt": "1"
+ },
+ {
+ "category": "Bienvenue",
+ "cnt": "1"
+ },
+ {
+ "category": "Retrieval",
+ "cnt": "1"
+ },
+ {
+ "category": "KYC BAM",
+ "cnt": "1"
+ },
+ {
+ "category": "Afrique",
+ "cnt": "1"
+ },
+ {
+ "category": "Dans",
+ "cnt": "1"
+ },
+ {
+ "category": "Azure",
+ "cnt": "1"
+ },
+ {
+ "category": "Budget",
+ "cnt": "1"
+ },
+ {
+ "category": "INSTRUCTION SYSTEME",
+ "cnt": "1"
+ },
+ {
+ "category": "CNDP",
+ "cnt": "1"
+ },
+ {
+ "category": "Compare",
+ "cnt": "1"
+ },
+ {
+ "category": "HubSpot",
+ "cnt": "1"
+ },
+ {
+ "category": "Control",
+ "cnt": "1"
+ },
+ {
+ "category": "SESSION-6AVR",
+ "cnt": "1"
+ },
+ {
+ "category": "Bonjour Salut",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc KPIs OTIF",
+ "cnt": "1"
+ },
+ {
+ "category": "Vistex SAP",
+ "cnt": "1"
+ },
+ {
+ "category": "Traduis",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc IoT WMS",
+ "cnt": "1"
+ },
+ {
+ "category": "SaaS",
+ "cnt": "1"
+ },
+ {
+ "category": "CODE BLOCK",
+ "cnt": "1"
+ },
+ {
+ "category": "Cahier",
+ "cnt": "1"
+ },
+ {
+ "category": "Maroc FHIR",
+ "cnt": "1"
+ },
+ {
+ "category": "DESIGN",
+ "cnt": "1"
+ },
+ {
+ "category": "Compare RLHF",
+ "cnt": "1"
+ },
+ {
+ "category": "Dynamics",
+ "cnt": "1"
+ },
+ {
+ "category": "Python",
+ "cnt": "1"
+ },
+ {
+ "category": "FORMAT OBLIGATOIRE",
+ "cnt": "1"
+ },
+ {
+ "category": "SAP ERP",
+ "cnt": "1"
+ },
+ {
+ "category": "INFRA-SESSION",
+ "cnt": "1"
+ },
+ {
+ "category": "Cette",
+ "cnt": "1"
+ },
+ {
+ "category": "OWASP Top",
+ "cnt": "1"
+ },
+ {
+ "category": "Logo Weval",
+ "cnt": "1"
+ },
+ {
+ "category": "ADKAR",
+ "cnt": "1"
+ },
+ {
+ "category": "GENERAL",
+ "cnt": "1"
+ }
+ ],
+ "qdrant_vectors": 386
+ },
+ "applications": [
+ {
+ "name": "WEVIA Chatbot",
+ "type": "AI",
+ "url": "\/wevia",
+ "port": null,
+ "server": "S204",
+ "auth": "public"
+ },
+ {
+ "name": "WEVIA Admin",
+ "type": "Admin",
+ "url": "\/wevia-admin",
+ "port": null,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "WEVIA Life",
+ "type": "Email AI",
+ "url": "\/products\/wevialife-app.html",
+ "port": null,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Workspace",
+ "type": "Hub",
+ "url": "\/products\/workspace.html",
+ "port": null,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Arsenal\/WEVADS",
+ "type": "Email Marketing",
+ "url": "wevads.weval-consulting.com",
+ "port": 5890,
+ "server": "S95",
+ "auth": "php-session"
+ },
+ {
+ "name": "ADX\/iResponse",
+ "type": "Email Platform",
+ "url": "wevads.weval-consulting.com",
+ "port": 5821,
+ "server": "S95",
+ "auth": "iResponse"
+ },
+ {
+ "name": "Ethica HCP",
+ "type": "Healthcare B2B",
+ "url": "consent.wevup.app",
+ "port": null,
+ "server": "S204",
+ "auth": "ethica-auth"
+ },
+ {
+ "name": "CRM (Twenty)",
+ "type": "CRM",
+ "url": "crm.weval-consulting.com",
+ "port": 3000,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Mattermost",
+ "type": "Chat",
+ "url": "mm.weval-consulting.com",
+ "port": 8065,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "n8n",
+ "type": "Automation",
+ "url": "n8n.weval-consulting.com",
+ "port": 5678,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Uptime Kuma",
+ "type": "Monitoring",
+ "url": "monitor.weval-consulting.com",
+ "port": 3001,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Plausible",
+ "type": "Analytics",
+ "url": "analytics.weval-consulting.com",
+ "port": 8000,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "DeerFlow",
+ "type": "AI Research",
+ "url": "deerflow.weval-consulting.com",
+ "port": 2024,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "SearXNG",
+ "type": "Search",
+ "url": null,
+ "port": 8888,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "Qdrant",
+ "type": "Vector DB",
+ "url": null,
+ "port": 6333,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "Ollama",
+ "type": "LLM Runtime",
+ "url": null,
+ "port": 11434,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "Flowise",
+ "type": "AI Flow",
+ "url": null,
+ "port": 3088,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "MiroFish",
+ "type": "AI Agent",
+ "url": "mirofish.weval-consulting.com",
+ "port": 3050,
+ "server": "S204",
+ "auth": "php-session"
+ },
+ {
+ "name": "Open WebUI",
+ "type": "LLM UI",
+ "url": null,
+ "port": 3002,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "Vaultwarden",
+ "type": "Passwords",
+ "url": null,
+ "port": 8222,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "Prometheus",
+ "type": "Metrics",
+ "url": null,
+ "port": 9000,
+ "server": "S204",
+ "auth": "internal"
+ },
+ {
+ "name": "PMTA",
+ "type": "MTA",
+ "url": null,
+ "port": 25,
+ "server": "S95",
+ "auth": "internal"
+ },
+ {
+ "name": "KumoMTA",
+ "type": "MTA",
+ "url": null,
+ "port": 8010,
+ "server": "S95",
+ "auth": "internal"
+ },
+ {
+ "name": "Sentinel",
+ "type": "Orchestrator",
+ "url": null,
+ "port": 5890,
+ "server": "S95",
+ "auth": "internal"
+ }
+ ],
+ "cloud": [
+ {
+ "provider": "Hetzner",
+ "role": "S204+S95",
+ "type": "Bare Metal",
+ "region": "Germany"
+ },
+ {
+ "provider": "OVH",
+ "role": "S151 DR\/Tracking",
+ "type": "VPS",
+ "region": "France"
+ },
+ {
+ "provider": "Cloudflare",
+ "role": "CDN+DNS+WAF",
+ "type": "SaaS",
+ "region": "Global"
+ },
+ {
+ "provider": "Huawei Cloud",
+ "role": "Partner Certifié",
+ "type": "IaaS",
+ "region": "MENA"
+ },
+ {
+ "provider": "Scaleway",
+ "role": "GPU Inference",
+ "type": "IaaS",
+ "region": "France"
+ }
+ ],
+ "partnerships": [
+ "SAP Gold Partner",
+ "Huawei Cloud",
+ "Vistex",
+ "IQVIA",
+ "Scaleway"
+ ],
+ "ux_agent": {
+ "pass": 3,
+ "fail": 0,
+ "warn": 0,
+ "total": 3,
+ "timestamp": "",
+ "gauge_health_center": "X=0px Y=0px",
+ "gauge_auto_center": "X=0px Y=0px",
+ "design_tokens": {
+ "bg": "#09090b",
+ "card": "#18181b",
+ "font": "Inter"
+ }
+ },
+ "l99": {
+ "master": {
+ "total": 93,
+ "pass": 89,
+ "fail": 2,
+ "timestamp": "2026-04-07T01:32:48.454012"
+ },
+ "auth": {
+ "pass": 24,
+ "fail": 0
+ }
+ },
+ "cortex": {
+ "fast_lines": 3620,
+ "router_lines": 6152,
+ "router_functions": 17,
+ "today_requests": 0,
+ "today_cost": 0,
+ "avg_latency_ms": 0,
+ "top_provider": "N\/A",
+ "providers_used": 0
+ },
+ "optimizations": {
+ "recent_commits": [],
+ "auto_fixes": [
+ {
+ "fact": "AUTONOMY 19Apr 18:50: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 20:50:05.112821"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 18:45: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 20:45:05.896272"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 18:40: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 20:40:05.29453"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 18:35: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 20:35:06.160485"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 18:30: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 20:30:07.536885"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 17:30: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 19:30:06.670863"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 17:25: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 19:25:05.927364"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 17:20: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 19:20:05.814206"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 17:15: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 19:15:05.697284"
+ },
+ {
+ "fact": "AUTONOMY 19Apr 17:10: 1 fixes. Disk light cleanup 85%",
+ "created_at": "2026-04-19 19:10:05.683959"
+ }
+ ],
+ "architecture_decisions": [
+ {
+ "fact": "Crons: root=51 www-data=55 cron.d=72 total=178",
+ "created_at": "2026-04-13 00:30:48.940882"
+ },
+ {
+ "fact": "Crons: root=51 www-data=55 cron.d=70 total=176",
+ "created_at": "2026-04-12 20:30:07.357094"
+ },
+ {
+ "fact": "Crons: root=51 www-data=55 cron.d=70 total=176",
+ "created_at": "2026-04-12 18:30:05.962933"
+ },
+ {
+ "fact": "Crons: root=51 www-data=55 cron.d=70 total=176",
+ "created_at": "2026-04-12 16:30:13.56815"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 14:30:11.101941"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 12:30:08.795912"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 10:30:04.181935"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 08:30:04.196728"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 06:30:04.792965"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 04:30:06.68899"
+ },
+ {
+ "fact": "Crons: root=51 www-data=57 cron.d=70 total=178",
+ "created_at": "2026-04-12 02:30:07.207832"
+ },
+ {
+ "fact": "Crons: root=51 www-data=54 cron.d=69 total=174",
+ "created_at": "2026-04-12 00:30:13.084556"
+ },
+ {
+ "fact": "Crons: root=50 www-data=52 cron.d=69 total=171",
+ "created_at": "2026-04-11 22:30:07.088896"
+ },
+ {
+ "fact": "Crons: root=50 www-data=52 cron.d=69 total=171",
+ "created_at": "2026-04-11 20:30:08.94444"
+ },
+ {
+ "fact": "Crons: root=50 www-data=48 cron.d=69 total=167",
+ "created_at": "2026-04-11 18:30:04.55611"
+ }
+ ],
+ "pipelines": [
+ {
+ "name": "CORTEX Smart Router",
+ "status": "active",
+ "desc": "T0 Ollama → T1 Free APIs → T2 Fallbacks",
+ "routes": 3620
+ },
+ {
+ "name": "RAG Ingest",
+ "status": "active",
+ "desc": "Cron *\/30 → Qdrant semantic indexing",
+ "freq": "*\/30"
+ },
+ {
+ "name": "L99 Quality Gate",
+ "status": "active",
+ "desc": "253+ tests, 28 auth tests",
+ "freq": "*\/30"
+ },
+ {
+ "name": "Blade Orchestrator",
+ "status": "active",
+ "desc": "GPU polling + model sync",
+ "freq": "*\/30"
+ },
+ {
+ "name": "Infra Guardian",
+ "status": "active",
+ "desc": "Auto-restart nginx\/php\/docker",
+ "freq": "*\/5"
+ },
+ {
+ "name": "Ethica Scraper Pipeline",
+ "status": "active",
+ "desc": "4 spiders, RichScraper, SearXNG",
+ "freq": "daily"
+ },
+ {
+ "name": "WEVIA Dream",
+ "status": "active",
+ "desc": "Background learning + dataset enrichment",
+ "freq": "*\/30"
+ },
+ {
+ "name": "Daily Brief",
+ "status": "active",
+ "desc": "Morning synthesis → Mattermost",
+ "freq": "daily 07h"
+ },
+ {
+ "name": "Architecture Scanner",
+ "status": "active",
+ "desc": "This page — auto-scan + recommendations",
+ "freq": "*\/30"
+ }
+ ],
+ "agents_deployed": [
+ {
+ "name": "Monitor Agent",
+ "role": "Watches all services, auto-restarts",
+ "status": "active"
+ },
+ {
+ "name": "DevOps Agent",
+ "role": "Git sync, deployment, rollback",
+ "status": "active"
+ },
+ {
+ "name": "Ethica Agent",
+ "role": "HCP scraping, validation, enrichment",
+ "status": "active"
+ },
+ {
+ "name": "Security Agent",
+ "role": "Key rotation, secret scan, vulnerability check",
+ "status": "active"
+ },
+ {
+ "name": "Blade Agent",
+ "role": "GPU orchestration, model management",
+ "status": "active"
+ },
+ {
+ "name": "Dream Agent",
+ "role": "Background learning, dataset generation",
+ "status": "active"
+ },
+ {
+ "name": "RAG Agent",
+ "role": "Knowledge ingestion, vector indexing",
+ "status": "active"
+ },
+ {
+ "name": "Quality Agent",
+ "role": "L99 NonReg, regression detection",
+ "status": "active"
+ }
+ ]
+ },
+ "mirofish": {
+ "status": "active",
+ "reports": 0,
+ "bridge": "\/api\/mirofish-bridge.php"
+ },
+ "recommendations": {
+ "score": 100,
+ "total": 1,
+ "critical": 0,
+ "warning": 0,
+ "info": 0,
+ "opportunity": 1,
+ "auto_fixed": 0,
+ "fixes_log": [],
+ "recommendations": [
+ {
+ "severity": "opportunity",
+ "category": "SCALABILITY",
+ "title": "Qdrant: 22,105 vecteurs",
+ "detail": "Volume vectoriel croissant. Planifier sharding ou migration vers cluster Qdrant.",
+ "action": "opportunity",
+ "fix_cmd": ""
+ }
+ ]
+ },
+ "scan_time_ms": 3085,
+ "gaps": [],
+ "score": 100,
+ "automation": {
+ "coverage": 100,
+ "steps": 30,
+ "total": 30
+ }
+}
\ No newline at end of file
diff --git a/api/playwright-v99/01-home.png b/api/playwright-v99/01-home.png
new file mode 100644
index 000000000..344925a2e
Binary files /dev/null and b/api/playwright-v99/01-home.png differ
diff --git a/api/playwright-v99/02-knowledge.png b/api/playwright-v99/02-knowledge.png
new file mode 100644
index 000000000..c04bc2d57
Binary files /dev/null and b/api/playwright-v99/02-knowledge.png differ
diff --git a/api/playwright-v99/results.json b/api/playwright-v99/results.json
new file mode 100644
index 000000000..02c103d54
--- /dev/null
+++ b/api/playwright-v99/results.json
@@ -0,0 +1,30 @@
+{
+ "tests": [
+ {
+ "test": "api_v99_kpis",
+ "status": "PASS",
+ "orphans_count": 9,
+ "rescued": 11,
+ "hub": 183
+ },
+ {
+ "test": "wtp_loaded",
+ "status": "PASS"
+ },
+ {
+ "test": "knowledge_has_orphans_rescue",
+ "status": "PASS"
+ },
+ {
+ "test": "orphan_pages_accessible",
+ "status": "PASS",
+ "count": 7
+ }
+ ],
+ "summary": {
+ "pass": 4,
+ "fail": 0,
+ "total": 4
+ },
+ "ts": "2026-04-21T00:30:29.627Z"
+}
\ No newline at end of file
diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json
index c0f8029c1..5290720e2 100644
--- a/api/v83-business-kpi-latest.json
+++ b/api/v83-business-kpi-latest.json
@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
- "ts": "2026-04-21T00:29:02+00:00",
+ "ts": "2026-04-21T00:34:02+00:00",
"summary": {
"total_categories": 7,
"total_kpis": 56,
diff --git a/cartographie-screens.html b/cartographie-screens.html
index f000bdd69..aaf5ac505 100644
--- a/cartographie-screens.html
+++ b/cartographie-screens.html
@@ -70,7 +70,7 @@ select{padding:10px;background:#0a0e27;color:#fff;border:1px solid #3d4476;borde
@@ -89,8 +89,8 @@ select{padding:10px;background:#0a0e27;color:#fff;border:1px solid #3d4476;borde
+
+
+
+
+
+