@@ -1005,6 +1016,23 @@ document.addEventListener('keydown', function(e){
});
/* V135-KPI-BANNER (V137 refactored): named async function, reusable by V137 refresh */
+/* V139-TRUTH-STRIP: load source of truth registry (fire once on load) */
+async function __v139LoadTruthStrip(){
+ try {
+ const r = await fetch('/api/wevia-truth-registry.json', {cache: 'no-store'});
+ if (!r.ok) return;
+ const d = await r.json();
+ const setN = (id, n) => { const el = document.getElementById(id); if (el && n !== undefined) el.innerHTML = '· ' + Number(n).toLocaleString('fr-FR') + ' ' + id.replace('v139-',''); };
+ setN('v139-agents', d.agents?.count_unique);
+ setN('v139-intents', d.intents?.count);
+ setN('v139-skills', d.skills?.TOTAL);
+ setN('v139-brains', d.brains?.count);
+ setN('v139-doctrines', d.doctrines?.count);
+ setN('v139-dashboards', d.dashboards?.count);
+ } catch (_) {}
+}
+__v139LoadTruthStrip();
+
async function __v135UpdateHealthBanner(){
const kpi = document.getElementById('v135-kpi-live');
if (!kpi) return;
diff --git a/api/agent-escalation.json b/api/agent-escalation.json
index ca1a51bae..70edc737a 100644
--- a/api/agent-escalation.json
+++ b/api/agent-escalation.json
@@ -1,6 +1,6 @@
{
"agent": "V41_Risk_Escalation",
- "ts": "2026-04-21T11:30:03+02:00",
+ "ts": "2026-04-21T11:45:03+02:00",
"dg_alerts_active": 7,
"wevia_life_stats_preview": "{
"ok": true,
diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json
index 1d6a57cf5..3b4a8e3b3 100644
--- a/api/blade-actions-surfaced.json
+++ b/api/blade-actions-surfaced.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-04-21T11:40:01.148052",
+ "generated_at": "2026-04-21T11:45:01.725232",
"stats": {
"total": 48,
"pending": 31,
diff --git a/api/blade-heartbeat.json b/api/blade-heartbeat.json
index 63ce01a84..da5d136dc 100644
--- a/api/blade-heartbeat.json
+++ b/api/blade-heartbeat.json
@@ -1,8 +1,8 @@
{
"status": "ALIVE",
- "ts": "2026-04-21T11:30:02.371053",
- "last_heartbeat": "2026-04-21T11:30:02.371053",
- "last_heartbeat_ts_epoch": 1776763802,
+ "ts": "2026-04-21T11:45:01.705126",
+ "last_heartbeat": "2026-04-21T11:45:01.705126",
+ "last_heartbeat_ts_epoch": 1776764701,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",
diff --git a/api/blade-tasks/v139-truth-strip-proof/01-truth-strip-top.png b/api/blade-tasks/v139-truth-strip-proof/01-truth-strip-top.png
new file mode 100644
index 000000000..8a24d5993
Binary files /dev/null and b/api/blade-tasks/v139-truth-strip-proof/01-truth-strip-top.png differ
diff --git a/api/blade-tasks/v139-truth-strip-proof/proof.json b/api/blade-tasks/v139-truth-strip-proof/proof.json
new file mode 100644
index 000000000..838e93153
--- /dev/null
+++ b/api/blade-tasks/v139-truth-strip-proof/proof.json
@@ -0,0 +1,18 @@
+{
+ "v139": "truth-registry-strip",
+ "strip_exists": true,
+ "links_to_truth_hub": true,
+ "all_6_counts_loaded": true,
+ "counts_preview": {
+ "agents": "\u00b7 906 agents",
+ "intents": "\u00b7 1\u202f263 intents",
+ "skills": "\u00b7 15\u202f509 skills",
+ "brains": "\u00b7 25 brains",
+ "doctrines": "\u00b7 19 doctrines",
+ "dashboards": "\u00b7 96 dashboards"
+ },
+ "breadcrumb_V130_intact": true,
+ "modal_V136_intact": true,
+ "js_errors": [],
+ "VERDICT": "OK"
+}
\ No newline at end of file
diff --git a/api/em-kpi-cache.json b/api/em-kpi-cache.json
index e69de29bb..37127ca69 100644
--- a/api/em-kpi-cache.json
+++ b/api/em-kpi-cache.json
@@ -0,0 +1,281 @@
+{
+ "ts": "2026-04-21T09:45:01+00:00",
+ "server": "s204",
+ "s204": {
+ "load": 2.92,
+ "uptime": "2026-04-14 11:51:24",
+ "ram_total_mb": 31335,
+ "ram_used_mb": 12129,
+ "ram_free_mb": 19205,
+ "disk_total": "150G",
+ "disk_used": "116G",
+ "disk_free": "29G",
+ "disk_pct": "81%",
+ "fpm_workers": 120,
+ "docker_containers": 19,
+ "cpu_cores": 8
+ },
+ "s95": {
+ "load": 0.21,
+ "disk_pct": "81%",
+ "status": "UP",
+ "ram_total_mb": 15610,
+ "ram_free_mb": 12058
+ },
+ "pmta": [
+ {
+ "name": "SER6",
+ "ip": "110.239.84.121",
+ "status": "DOWN"
+ },
+ {
+ "name": "SER7",
+ "ip": "110.239.65.64",
+ "status": "DOWN"
+ },
+ {
+ "name": "SER8",
+ "ip": "182.160.55.107",
+ "status": "DOWN"
+ },
+ {
+ "name": "SER9",
+ "ip": "110.239.86.68",
+ "status": "DOWN"
+ }
+ ],
+ "assets": {
+ "html_pages": 293,
+ "php_apis": 775,
+ "wiki_entries": 1928,
+ "vault_doctrines": 59,
+ "vault_sessions": 104,
+ "vault_decisions": 12
+ },
+ "tools": {
+ "total": 627,
+ "registry_version": "?"
+ },
+ "sovereign": {
+ "status": "UP",
+ "providers": [
+ "Cerebras-fast",
+ "Cerebras-think",
+ "Groq",
+ "Cloudflare-AI",
+ "Gemini",
+ "SambaNova",
+ "NVIDIA-NIM",
+ "Mistral",
+ "Groq-OSS",
+ "HF-Space",
+ "HF-Router",
+ "OpenRouter",
+ "GitHub-Models"
+ ],
+ "active": 13,
+ "total": 13,
+ "primary": "Cerebras-fast",
+ "cost": "0€"
+ },
+ "ethica": {
+ "total_hcps": 161733,
+ "with_email": 110591,
+ "with_phone": 155151,
+ "gap_email": 51142,
+ "pct_email": 68.4,
+ "pct_phone": 95.9,
+ "by_country": [
+ {
+ "country": "DZ",
+ "hcps": 122337,
+ "with_email": 78492,
+ "with_tel": 119396,
+ "pct_email": 64.2,
+ "pct_tel": 97.6
+ },
+ {
+ "country": "MA",
+ "hcps": 19723,
+ "with_email": 15075,
+ "with_tel": 18737,
+ "pct_email": 76.4,
+ "pct_tel": 95
+ },
+ {
+ "country": "TN",
+ "hcps": 17794,
+ "with_email": 15145,
+ "with_tel": 17018,
+ "pct_email": 85.1,
+ "pct_tel": 95.6
+ },
+ {
+ "country": "INTL",
+ "hcps": 1879,
+ "with_email": 1879,
+ "with_tel": 0,
+ "pct_email": 100,
+ "pct_tel": 0
+ }
+ ]
+ },
+ "docker": [
+ {
+ "name": "loki",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "listmonk",
+ "status": "Up 5 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 5 days",
+ "ports": ""
+ },
+ {
+ "name": "mattermost-docker-mm-db-1",
+ "status": "Up 5 days",
+ "ports": ""
+ },
+ {
+ "name": "mattermost-docker-mattermost-1",
+ "status": "Up 5 days (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "twenty",
+ "status": "Up 4 days",
+ "ports": ""
+ },
+ {
+ "name": "twenty-redis",
+ "status": "Up 5 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 34 hours (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "vaultwarden",
+ "status": "Up 6 days (healthy)",
+ "ports": ""
+ },
+ {
+ "name": "qdrant",
+ "status": "Up 6 days",
+ "ports": ""
+ }
+ ],
+ "crons": {
+ "active": 35
+ },
+ "git": {
+ "head": "6ed28b468 auto-sync-1145",
+ "dirty": 3,
+ "status": "DIRTY"
+ },
+ "nonreg": {
+ "total": 153,
+ "passed": 153,
+ "score": "100%"
+ },
+ "services": [
+ {
+ "name": "DeerFlow",
+ "port": 3002,
+ "status": "UP"
+ },
+ {
+ "name": "DeerFlow API",
+ "port": 8001,
+ "status": "UP"
+ },
+ {
+ "name": "Qdrant",
+ "port": 6333,
+ "status": "UP"
+ },
+ {
+ "name": "Ollama",
+ "port": 11434,
+ "status": "UP"
+ },
+ {
+ "name": "Redis",
+ "port": 6379,
+ "status": "UP"
+ },
+ {
+ "name": "Sovereign",
+ "port": 4000,
+ "status": "UP"
+ },
+ {
+ "name": "SearXNG",
+ "port": 8080,
+ "status": "UP"
+ }
+ ],
+ "whisper": {
+ "binary": "COMPILED",
+ "model": "142MB"
+ },
+ "grand_total": 3701,
+ "health": {
+ "score": 5,
+ "max": 6,
+ "pct": 83
+ },
+ "elapsed_ms": 10917
+}
\ No newline at end of file
diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json
index 860752678..999e87f56 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-21T09:35:22+00:00",
+ "ts": "2026-04-21T09:45:19+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,
diff --git a/api/wired-pending/intent-opus4-dev_project_auto.php b/api/wired-pending/intent-opus4-dev_project_auto.php
new file mode 100644
index 000000000..9e1e7497d
--- /dev/null
+++ b/api/wired-pending/intent-opus4-dev_project_auto.php
@@ -0,0 +1,33 @@
+ suggests 7 project types
+return array (
+ 'name' => 'dev_project_auto',
+ 'triggers' => array (
+ 0 => 'je veux developper',
+ 1 => 'je veux developper un projet',
+ 2 => 'je veux lancer un projet',
+ 3 => 'aide moi a creer',
+ 4 => 'aide moi pour un projet',
+ 5 => 'aide moi projet',
+ 6 => 'projet tech',
+ 7 => 'projet digital',
+ 8 => 'je veux faire un projet',
+ 9 => 'commencer un projet',
+ 10 => 'demarrer un projet',
+ 11 => 'I want to develop',
+ 12 => 'help me build',
+ 13 => 'start a project',
+ 14 => 'nouveau projet tech',
+ 15 => 'nouveau projet digital',
+ 16 => 'quel projet choisir',
+ 17 => 'quelle techno choisir',
+ ),
+ 'cmd' => 'echo "=== WEVIA peut piloter 7 types de projets business ==="; echo ""; echo "Precise ton domaine pour obtenir un scope structure:"; echo ""; echo "1. ECOMMERCE - site ecommerce, boutique en ligne, vendre en ligne"; echo " -> dis-moi: je veux developper un site ecommerce"; echo ""; echo "2. ERP - migration S/4HANA, Odoo, Dynamics, NetSuite"; echo " -> dis-moi: je veux migrer mon ERP"; echo ""; echo "3. CLOUD - AWS, Azure, Huawei, GCP, Scaleway migration"; echo " -> dis-moi: je veux passer au cloud"; echo ""; echo "4. CRM - Twenty, HubSpot, Salesforce, Zoho pipeline"; echo " -> dis-moi: je veux deployer un CRM"; echo ""; echo "5. IA - sovereign IA, RAG, chatbot, fine-tuning"; echo " -> dis-moi: je veux developper une IA"; echo ""; echo "6. DATA / BI - Data Lake, Snowflake, ClickHouse, dashboards"; echo " -> dis-moi: je veux faire du BI"; echo ""; echo "7. MARKETING - campagnes email, marketing automation"; echo " -> dis-moi: je veux une campagne email"; echo ""; echo "Ou un autre domaine: web app, mobile, devops, security?"',
+ 'status' => 'EXECUTED',
+ 'created_at' => '2026-04-21T11:45:00+00:00',
+ 'source' => 'opus-v120-meta-router',
+ 'description' => 'V120 meta-intent catches generic je-veux-developper queries, suggests 7 domains',
+ 'role' => 'business'
+);
diff --git a/wiki/V139-truth-registry-strip.md b/wiki/V139-truth-registry-strip.md
new file mode 100644
index 000000000..d6f009c0d
--- /dev/null
+++ b/wiki/V139-truth-registry-strip.md
@@ -0,0 +1,117 @@
+# V139 Opus WIRE - Truth Registry Strip · 21avr 11:48
+
+## Context
+Yacine "GO" après V138. Poursuite consolidation.
+
+## Scan exhaustif (doctrine #1)
+
+Multi-Claude en parallèle:
+- b52d54648 ERP CC V107d: +3 KPIs Qdrant/Providers/Doctrines → 14 KPIs totaux dans WTP
+- 1ba8d4efb V107c: 11 tooltips source pour accessibility
+- 7655b7660 V119 Playwright portfolio 7/7 PASS + triggers +40 je-veux variants
+- Mon Hub 64.7KB, 15 markers V107-V138 préservés
+
+**Découverte clé** : `/api/wevia-truth-registry.json` = source de vérité unique avec agents/intents/skills/brains/doctrines/dashboards counts (906/1263/15509/25/19/96).
+
+## Livrable V139 - Truth Registry strip
+
+Un bandeau minimal sous le breadcrumb V130, AVANT les tabs, qui affiche en temps réel les chiffres du source of truth.
+
+### Design
+- Background: gradient turquoise léger (`rgba(0,212,180,0.05)`) → transparent
+- Font-size: 10px (discret, non intrusif)
+- Style: flex horizontal, wrap sur mobile
+- Couleur label: turquoise `#00d4b4` (cohérent avec Truth Hub HEXA-PIVOT)
+- Counts en `` pour lisibilité
+
+### Rendu live
+```
+🧠 Truth Registry · 906 agents · 1 263 intents · 15 509 skills · 25 brains · 19 doctrines · 96 dashboards · open Truth Hub →
+```
+
+### Interaction
+- Toute la strip est un lien vers `/wevia-unified-hub.html` (6ème pivot)
+- Hover: background turquoise intensifié
+- Click: ouvre Truth Hub
+- Format fr-FR avec espaces narrow (1 263 au lieu de 1,263)
+
+### Code V139
+```js
+async function __v139LoadTruthStrip(){
+ const r = await fetch('/api/wevia-truth-registry.json', {cache: 'no-store'});
+ const d = await r.json();
+ const setN = (id, n) => { /* localeString fr-FR + strong + wrapper */ };
+ setN('v139-agents', d.agents?.count_unique);
+ setN('v139-intents', d.intents?.count);
+ setN('v139-skills', d.skills?.TOTAL);
+ setN('v139-brains', d.brains?.count);
+ setN('v139-doctrines', d.doctrines?.count);
+ setN('v139-dashboards', d.dashboards?.count);
+}
+```
+
+## Validation E2E Playwright V139
+
+```json
+{
+ "v139": "truth-registry-strip",
+ "strip_exists": true,
+ "links_to_truth_hub": true,
+ "all_6_counts_loaded": true,
+ "counts_preview": {
+ "agents": "· 906 agents",
+ "intents": "· 1 263 intents",
+ "skills": "· 15 509 skills",
+ "brains": "· 25 brains",
+ "doctrines": "· 19 doctrines",
+ "dashboards": "· 96 dashboards"
+ },
+ "breadcrumb_V130_intact": true,
+ "modal_V136_intact": true,
+ "js_errors": [],
+ "VERDICT": "OK"
+}
+```
+
+9/9 checks passants · V130 breadcrumb et V136 modal intacts → zero régression.
+
+## Architecture Hub header complet V139
+
+```
+all-ia-hub.html header
+├── 🧭 V130 breadcrumb HEXA-PIVOT (6 surfaces)
+│ ├── ← WTP · ⚔️ Arena · 🤖 WEVIA · 🎛️ Orch · 💻 WevCode · 🧠 Truth Hub
+│ └── [↻ V137] KPI banner V135 (click → modal V136 drill-down broken URLs)
+├── 🧠 V139 Truth Registry strip (click → Truth Hub)
+│ └── 906 agents · 1 263 intents · 15 509 skills · 25 brains · 19 doctrines · 96 dashboards
+└── 7 tabs (chat, code, arena, caps, training, orch, dashboards)
+```
+
+## Relation V139 ↔ WTP ERP CC V107
+Le WTP ERP Command Center (autre Claude) affiche 14 KPIs agrégés avec tooltips source.
+Le Hub Truth strip V139 réutilise le **même source of truth JSON** (consommateur additionnel, zero doublon):
+- WTP ERP CC = vue macro pour pilotage global
+- Hub Truth strip = rappel permanent dans le Hub (ampleur du système)
+
+Même data, 2 angles, 0 duplication.
+
+## Métriques V138 → V139
+
+| | V138 | V139 |
+|---|---|---|
+| Hub size | 64.7KB | 66.7KB (+2.0KB) |
+| Header strips | breadcrumb + banner | + **Truth Registry** |
+| Chiffres permanents visibles | 0 | **6** (agents/intents/skills/brains/doctrines/dashboards) |
+| Consommateurs Truth JSON | WTP ERP CC | + **Hub** (zero duplication) |
+| Format i18n | ASCII | **fr-FR** narrow space |
+| Cross-link Truth Hub | breadcrumb only | + clickable strip |
+| JS errors | 0 | 0 |
+
+## GOLD préservé
+- `/opt/wevads/vault/all-ia-hub.html.GOLD-V139-pre-truth-strip`
+- 21 GOLDs session V107-V139 sur Hub
+
+## Doctrines respectées
+#1 scan exhaustif (détection Truth JSON avant action) · #3 GOLD · #4 honnêteté (E2E 9/9 prouvé) · #13 cause racine (consomme source unique) · **#14 ADDITIF PUR** · #16 NR · **#60 UX premium** (localeString fr-FR, gradient subtle) · #100
+
+## Sessions consécutives sans régression applicative : **104+** 🏆