diff --git a/agents-valuechain.html b/agents-valuechain.html
index 89ac89893..e5178aaf1 100644
--- a/agents-valuechain.html
+++ b/agents-valuechain.html
@@ -131,7 +131,22 @@ h1 span{background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-bac
}
-
Architecture
Director
diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json
index 72c133db0..de366a8da 100644
--- a/api/blade-actions-surfaced.json
+++ b/api/blade-actions-surfaced.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-04-21T12:45:01.635556",
+ "generated_at": "2026-04-21T12:50:01.777469",
"stats": {
"total": 48,
"pending": 31,
diff --git a/api/blade-tasks/dynamic-1776768522.json b/api/blade-tasks/dynamic-1776768522.json
new file mode 100644
index 000000000..391509705
--- /dev/null
+++ b/api/blade-tasks/dynamic-1776768522.json
@@ -0,0 +1 @@
+{"id":"dynamic-1776768522","type":"dynamic_wire","msg":"multiagent playwright e2e run test suite selenium chrome scan screenshot test pages principales wtp wevia-master wevia-orchestrator all-ia-hub video capture si possible","created":"2026-04-21T12:48:42+02:00","status":"pending"}
diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json
index c1443b450..e2883b277 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-21T10:45:17+00:00",
+ "ts": "2026-04-21T10:49:06+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,
diff --git a/api/v_opus_video_20260421-124902/1ce561fa4d1def77244d020f4eed82dd.webm b/api/v_opus_video_20260421-124902/1ce561fa4d1def77244d020f4eed82dd.webm
new file mode 100644
index 000000000..1b5348e0d
Binary files /dev/null and b/api/v_opus_video_20260421-124902/1ce561fa4d1def77244d020f4eed82dd.webm differ
diff --git a/api/v_opus_video_20260421-124902/29cb27afa89fb0a8c5877fe75f6a723c.webm b/api/v_opus_video_20260421-124902/29cb27afa89fb0a8c5877fe75f6a723c.webm
new file mode 100644
index 000000000..c15295515
Binary files /dev/null and b/api/v_opus_video_20260421-124902/29cb27afa89fb0a8c5877fe75f6a723c.webm differ
diff --git a/api/v_opus_video_20260421-124902/88edcd7ef0732d3c692592338f68c608.webm b/api/v_opus_video_20260421-124902/88edcd7ef0732d3c692592338f68c608.webm
new file mode 100644
index 000000000..5fa394ee4
Binary files /dev/null and b/api/v_opus_video_20260421-124902/88edcd7ef0732d3c692592338f68c608.webm differ
diff --git a/api/v_opus_video_20260421-124902/d45a98b0e2d0b5429d42d3589251960a.webm b/api/v_opus_video_20260421-124902/d45a98b0e2d0b5429d42d3589251960a.webm
new file mode 100644
index 000000000..16dd9cfe1
Binary files /dev/null and b/api/v_opus_video_20260421-124902/d45a98b0e2d0b5429d42d3589251960a.webm differ
diff --git a/api/v_opus_video_20260421-124902/hub.png b/api/v_opus_video_20260421-124902/hub.png
new file mode 100644
index 000000000..2e4f3c611
Binary files /dev/null and b/api/v_opus_video_20260421-124902/hub.png differ
diff --git a/api/v_opus_video_20260421-124902/report.json b/api/v_opus_video_20260421-124902/report.json
new file mode 100644
index 000000000..a72faed15
--- /dev/null
+++ b/api/v_opus_video_20260421-124902/report.json
@@ -0,0 +1,75 @@
+{
+ "ts": "20260421-124902",
+ "out_dir": "/var/www/html/api/v_opus_video_20260421-124902",
+ "pages_tested": 4,
+ "passed": 3,
+ "failed": 1,
+ "videos": [
+ "d45a98b0e2d0b5429d42d3589251960a.webm",
+ "1ce561fa4d1def77244d020f4eed82dd.webm",
+ "29cb27afa89fb0a8c5877fe75f6a723c.webm",
+ "88edcd7ef0732d3c692592338f68c608.webm"
+ ],
+ "results": [
+ {
+ "name": "wtp",
+ "url": "https://weval-consulting.com/weval-technology-platform.html",
+ "http": 200,
+ "screenshot": "v_opus_video_20260421-124902/wtp.png",
+ "screenshot_size": 43210,
+ "title": "WEVAL \u2014 Connexion",
+ "body_length": 192,
+ "assertions": {
+ "WEVAL Technology Platform": false,
+ "ERP": false
+ },
+ "pass": false,
+ "console_errors": []
+ },
+ {
+ "name": "hub",
+ "url": "https://weval-consulting.com/all-ia-hub.html",
+ "http": 200,
+ "screenshot": "v_opus_video_20260421-124902/hub.png",
+ "screenshot_size": 89829,
+ "title": "All-IA Hub \u2014 Remplacement Claude Code + Opus (Souverain)",
+ "body_length": 888,
+ "assertions": {
+ "All-IA": true,
+ "Hub": true
+ },
+ "pass": true,
+ "console_errors": []
+ },
+ {
+ "name": "truth",
+ "url": "https://weval-consulting.com/wevia-unified-hub.html",
+ "http": 200,
+ "screenshot": "v_opus_video_20260421-124902/truth.png",
+ "screenshot_size": 241424,
+ "title": "WEVIA Unified Hub v2 \u00b7 tout d\u00e9dupliqu\u00e9",
+ "body_length": 1835,
+ "assertions": {
+ "Unified": true,
+ "Hub": true
+ },
+ "pass": true,
+ "console_errors": []
+ },
+ {
+ "name": "wepredict",
+ "url": "https://weval-consulting.com/wepredict.html",
+ "http": 200,
+ "screenshot": "v_opus_video_20260421-124902/wepredict.png",
+ "screenshot_size": 369818,
+ "title": "WePredict Cockpit \u00b7 15 D\u00e9partements \u00d7 4 Niveaux \u00b7 WEVAL Technology Platform",
+ "body_length": 4479,
+ "assertions": {
+ "WePredict": true,
+ "WEVAL": true
+ },
+ "pass": true,
+ "console_errors": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/api/v_opus_video_20260421-124902/truth.png b/api/v_opus_video_20260421-124902/truth.png
new file mode 100644
index 000000000..c11895dd0
Binary files /dev/null and b/api/v_opus_video_20260421-124902/truth.png differ
diff --git a/api/v_opus_video_20260421-124902/wepredict.png b/api/v_opus_video_20260421-124902/wepredict.png
new file mode 100644
index 000000000..428396516
Binary files /dev/null and b/api/v_opus_video_20260421-124902/wepredict.png differ
diff --git a/api/v_opus_video_20260421-124902/wtp.png b/api/v_opus_video_20260421-124902/wtp.png
new file mode 100644
index 000000000..fa3c93351
Binary files /dev/null and b/api/v_opus_video_20260421-124902/wtp.png differ
diff --git a/api/v_video_test_20260421-124734/video_test_report.json b/api/v_video_test_20260421-124734/video_test_report.json
new file mode 100644
index 000000000..663316dc6
--- /dev/null
+++ b/api/v_video_test_20260421-124734/video_test_report.json
@@ -0,0 +1,62 @@
+{
+ "ts": "20260421-124734",
+ "tested": 7,
+ "results": [
+ {
+ "name": "weval-technology-platform",
+ "url": "https://weval-consulting.com/weval-technology-platform.html",
+ "http": "200",
+ "size": 212158,
+ "has_script": true,
+ "title": "WEVAL Technology Platform \u2014 All-in-One ERP Portal"
+ },
+ {
+ "name": "wevia-master",
+ "url": "https://weval-consulting.com/wevia-master.html",
+ "http": "302",
+ "size": 1821,
+ "has_script": true,
+ "title": "302 Found"
+ },
+ {
+ "name": "all-ia-hub",
+ "url": "https://weval-consulting.com/all-ia-hub.html",
+ "http": "200",
+ "size": 73464,
+ "has_script": true,
+ "title": "All-IA Hub \u2014 Remplacement Claude Code + Opus (Souverain)"
+ },
+ {
+ "name": "wevia-admin",
+ "url": "https://weval-consulting.com/wevia-ia/wevia-admin.php",
+ "http": "200",
+ "size": 3510,
+ "has_script": true,
+ "title": "WEVIA Admin \u2014 Login"
+ },
+ {
+ "name": "wevia-orchestrator",
+ "url": "https://weval-consulting.com/wevia-orchestrator.html",
+ "http": "302",
+ "size": 1821,
+ "has_script": true,
+ "title": "302 Found"
+ },
+ {
+ "name": "wevcode",
+ "url": "https://weval-consulting.com/wevcode.html",
+ "http": "302",
+ "size": 1821,
+ "has_script": true,
+ "title": "302 Found"
+ },
+ {
+ "name": "wevia-unified-hub",
+ "url": "https://weval-consulting.com/wevia-unified-hub.html",
+ "http": "200",
+ "size": 31119,
+ "has_script": true,
+ "title": "WEVIA Unified Hub v2 \u00b7 tout d\u00e9dupliqu\u00e9"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/wiki/doctrine-104-roadmap-findings.md b/wiki/doctrine-104-roadmap-findings.md
new file mode 100644
index 000000000..718d62a72
--- /dev/null
+++ b/wiki/doctrine-104-roadmap-findings.md
@@ -0,0 +1,49 @@
+# Doctrine 104 — Roadmap consolidation - 3 findings resolus + 1 en attente
+
+**Date:** 2026-04-21
+**Session:** continuation stabilisation polish post-doctrines 101/102/103
+
+## Findings investigations techniques
+
+### Finding #1 : L99 "4 fails PLAYWRIGHT-VISUAL" (stats 20/24)
+
+**Diagnostic :** lecture de `/var/www/html/api/l99-analysis.json` (2KB, 5 keys: scans/stats/engine/total/timestamp). **Zero fail dans le fichier source** (`fail_count` = 0). Les 4 fails apparaissent uniquement dans l'endpoint `/api/l99-api.php?action=stats` qui est un agregateur cache live base sur plusieurs sources (l99-analysis + l99-deep-scan 29KB + l99-autonomous-report + l99-deep-test-result). Les 4 fails sont calcules a partir d'un scope agrege distinct du `results` endpoint (2026-04-20 snapshot).
+
+**Conclusion :** PAS UN BUG — juste 2 endpoints avec scope different (`stats` = agregation live, `results` = snapshot du dernier run). Le score reel ne degrade pas 153/153 NonReg. Aucune action requise.
+
+### Finding #2 : Dispatcher "match naïf 1er mot-clé"
+
+**Diagnostic :** lecture de `/var/www/html/api/wevia-master-api.php` lignes L109-L157. Le stub-dispatcher implemente DEJA :
+- L120 : skip triggers < 5 chars (filtre noise)
+- L125 : `if ($__sd_match && mb_strlen($__sd_trg_lc) > $__sd_best_len)` → retient le match le PLUS LONG
+- L135 : `usort($__sd_scored, function($a,$b){return $b['len'] - $a['len'];})` → sort descending par longueur
+
+**Conclusion :** PAS UN BUG dispatcher — le scoring pondere par longueur EXISTE deja. Le probleme apparent "authentik matche au lieu de fix_login_ux" venait du fait que `fix_login_ux` n'etait pas un trigger dans le stub-list (liste hardcoded) mais dans `priority-intents-nl.json`. Or `nl-priority` engine tourne AVANT le stub (verifie dans les response logs : `provider: nl-priority`), donc les intents wires via JSON passent en priorite. Aucune action requise.
+
+### Finding #3 : Fragments HTML sans ``
+
+**Diagnostic :** 6 pages sans `` et sans `` : `droid-terminal.html`, `office-workflow.html`, `test-wevia-exhaustive-v3.html`, `sessions-monitor.html`, `all-screens-live.html`, `vsm-pipelines.html`.
+
+**Conclusion :** INTENTIONNEL — ce sont des fragments HTML inclus via `