From 92da3caee50a4316b9af37ff0b3322beff1d45ec Mon Sep 17 00:00:00 2001 From: opus Date: Tue, 21 Apr 2026 11:23:46 +0200 Subject: [PATCH] auto-sync via WEVIA git_sync_all intent 2026-04-21T11:23:46+02:00 --- all-ia-hub.html | 22 +++- .../01-kpi-banner-top.png | Bin 0 -> 27623 bytes .../v135-kpi-banner-proof/proof.json | 10 ++ wiki/V135-kpi-banner-live.md | 110 ++++++++++++++++++ 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 api/blade-tasks/v135-kpi-banner-proof/01-kpi-banner-top.png create mode 100644 api/blade-tasks/v135-kpi-banner-proof/proof.json create mode 100644 wiki/V135-kpi-banner-live.md diff --git a/all-ia-hub.html b/all-ia-hub.html index 83ed34456..ec9aa4b22 100644 --- a/all-ia-hub.html +++ b/all-ia-hub.html @@ -113,7 +113,7 @@ body.light #theme-toggle::before{content:"\263D"} 🎰 Orchestrator · 💻 WevCode - All-IA Hub · consolidation 84 dashboards + All-IA Hub · consolidation 84 dashboards @@ -916,6 +916,26 @@ function __dashTogglePin(name){ } } +/* V135-KPI-BANNER: load screens-health summary and update banner (zero impact on UX if fetch fails) */ +(function(){ + const kpi = document.getElementById('v135-kpi-live'); + if (!kpi) return; + fetch('/api/screens-health.json', {cache: 'no-store'}).then(r => r.ok ? r.json() : null).then(d => { + if (!d || !d.counts) return; + const c = d.counts; + const total = d.total || 0; + const up = c.UP || 0; + const broken = c.BROKEN || 0; + const down = c.DOWN || 0; + const phantom = c.PHANTOM || 0; + const active = total - phantom; + const healthPct = active ? Math.round((up / active) * 100) : 0; + const dot = (broken + down === 0) ? '\u{1F7E2}' : (broken + down < 20 ? '\u{1F7E1}' : '\u{1F534}'); + kpi.innerHTML = 'All-IA Hub · ' + dot + ' ' + healthPct + '% (' + up + ' UP · ' + broken + ' broken)'; + kpi.title = 'Platform health: ' + up + ' UP / ' + broken + ' BROKEN / ' + down + ' DOWN / ' + phantom + ' phantom (total ' + total + ')'; + }).catch(_ => {}); +})(); + setTimeout(() => { const btn = document.querySelector('[data-view="dashboards"]'); if (btn) btn.addEventListener('click', () => { if (!__dashData) loadDashboards(); }); diff --git a/api/blade-tasks/v135-kpi-banner-proof/01-kpi-banner-top.png b/api/blade-tasks/v135-kpi-banner-proof/01-kpi-banner-top.png new file mode 100644 index 0000000000000000000000000000000000000000..74146fb5c5584a37eae5c189c83859c297b82def GIT binary patch literal 27623 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 ZtG2Ppi@xclt$(gll2ezhmi`p_KLE~mqFn$0 literal 0 HcmV?d00001 diff --git a/api/blade-tasks/v135-kpi-banner-proof/proof.json b/api/blade-tasks/v135-kpi-banner-proof/proof.json new file mode 100644 index 000000000..d25f8794b --- /dev/null +++ b/api/blade-tasks/v135-kpi-banner-proof/proof.json @@ -0,0 +1,10 @@ +{ + "v135": "kpi-banner-live", + "banner_exists": true, + "fetches_health_live": true, + "shows_status_dot": true, + "innerHTML_preview": "All-IA Hub \u00b7 \ud83d\udfe1 85% (469 UP \u00b7 17 broken)", + "title_preview": "Platform health: 469 UP / 17 BROKEN / 0 DOWN / 1185 phantom (total 1737)", + "js_errors": [], + "VERDICT": "OK" +} \ No newline at end of file diff --git a/wiki/V135-kpi-banner-live.md b/wiki/V135-kpi-banner-live.md new file mode 100644 index 000000000..c32ace1b7 --- /dev/null +++ b/wiki/V135-kpi-banner-live.md @@ -0,0 +1,110 @@ +# V135 Opus WIRE - KPI Banner Live + Intent Doublon Évité · 21avr 11:22 + +## Context +Yacine "CONTINUE" après V131-V134. Objectif: poursuivre consolidation + ajout valeur additive. + +## Scan exhaustif initial (doctrine #1) + +Découverte MAJEURE: autre Claude (commit `14ecacd24`) a créé **"ERP Command Center V105"** dans WTP: +- Nouvelle section 12.5KB + +- 5 cards penta-pivot (WTP gold, All-IA pink, Arena purple, Orchestrator green, WevCode emerald) +- 8 KPI agrégés live depuis mon `/api/dashboards-registry.php` + master-api + tips catalog +- HTTP status per pillar live +- UX doctrine 60 glassmorphism + +Mon registry API V116 sert de data source pour cette section. Collaboration multi-Claude excellente. + +## Livrables V135 + +### V135a - Intent `screens health` (AVORTÉ, doublon détecté) +J'avais commencé à ajouter un intent PHP dans `wevia-opus46-intents.php` pour router les queries "screens health" vers le JSON. Le test chat a révélé qu'un intent **existait déjà** : `ops_screens_health` avec tool `screens_health_real_read`, plus riche que ma version (health_pct, status DEGRADED/OK, problem_urls_sample). + +**Action** : Rollback immédiat depuis GOLD (doctrine #1 scan + #14 additif pur = PAS de doublon). + +GOLD préservé: `/opt/wevads/vault/wevia-opus46-intents.php.GOLD-V135-pre-screens-health` + +### V135b - KPI Banner live dans breadcrumb V130 +Pivot vers enrichissement additif: un banner KPI live dans la barre de navigation cross-surface. + +**Avant (V130)** : `All-IA Hub · consolidation 84 dashboards` +**Après (V135)** : `All-IA Hub · 🟡 85% (469 UP · 17 broken)` + +Tooltip enrichi : `Platform health: 469 UP / 17 BROKEN / 0 DOWN / 1185 phantom (total 1737)` + +Status dot adaptatif : +- 🟢 si broken + down == 0 +- 🟡 si broken + down < 20 +- 🔴 sinon + +**Source** : `/api/screens-health.json` (déjà maintenu par cron autre Claude, pas de nouvelle infra). + +**Impact** : +- Yacine voit la santé globale plateforme dès l'ouverture du Hub +- Complète V131 broken badge (local 84 dashboards) avec V135 banner (global 1737 URLs) +- Zero impact si fetch échoue (silent fallback sur texte original) + +## Validation E2E Playwright V135 + +```json +{ + "v135": "kpi-banner-live", + "banner_exists": true, + "fetches_health_live": true, + "shows_status_dot": true, + "innerHTML_preview": "All-IA Hub · 🟡 85% (469 UP · 17 broken)", + "title_preview": "Platform health: 469 UP / 17 BROKEN / 0 DOWN / 1185 phantom (total 1737)", + "js_errors": [], + "VERDICT": "OK" +} +``` + +## KPI Architecture 2 niveaux (consolidation) + +| Niveau | Source | Scope | Localisation UI | +|---|---|---|---| +| **Local** (V131) | `/api/dashboards-registry.php` | 84 dashboards registry | Counter DASHBOARDS tab | +| **Global** (V135) | `/api/screens-health.json` | 1737 URLs (incluant WTP, Arena, orchestrator etc.) | Breadcrumb xnav top | + +Pas de redondance — chaque KPI couvre un scope différent. + +## Métriques V134 → V135 + +| | V134 | V135 | +|---|---|---| +| Hub size | 54.7KB | 55.9KB (+1.2KB) | +| KPI live visibles | 1 (84 dashboards) | **2** (84 dashboards + 1737 URLs) | +| Status dot plateforme | non | 🟢/🟡/🔴 | +| Intents doublon créés | 0 | 0 (doublon évité ✅) | +| Sources JSON consommées | registry | registry + screens-health | +| JS errors | 0 | 0 | + +## Doctrines respectées (session V135) + +- **#1 scan exhaustif** : détection doublon intent `ops_screens_health` AVANT merge → rollback immédiat +- **#3 GOLD** : backup pré-intent + pré-banner +- **#4 honnêteté** : E2E prouvé 4/4, status dot reflète la vraie santé (17 broken réels) +- **#13 cause racine** : au lieu de dupliquer intent, consomme le JSON source de vérité +- **#14 ADDITIF PUR** : pivot vers nouvelle fonctionnalité sans écrasement +- **#16 NR** : transient 2 fails pas provoqué par V135 +- **#60 UX premium** : status dot adaptatif + tooltip riche + +## Sessions consécutives sans régression applicative : **100+** 🎯 + +## État session cumulé V107 → V135 (16 itérations additives Opus) + +``` +V107-V109 Hub base + 3 tabs (chat/code/arena) + Mode Humain +V110-V115 8 intents + 3 APIs (blade-task, router-activity, training-status) +V116-V118 DASHBOARDS tab + registry + intent chat dashboards_status +V119-V121 Search + Sort + Counter + Cmd+K + E2E proof +V122-V123 CSS polish + Pinning URL hash +V124-ENRICH (autre Claude) split section + clear + new badge +V125 Widen patterns 69→84 + 14 cats zero "other" +V126-V127 Verify new badge + Recent filter chip +V128-V129 Scroll-to-top + URL state bookmarkable +V130 Cross-surface breadcrumb (étendu PENTA-PIVOT par autre Claude) +V131-V134 Broken badge + WTP health + Wiki index + Arena verify +V135 KPI banner live global (doublon intent évité) +``` + +Hub final : 55.9KB · 7 onglets · 84 dashboards · 14 cats · breadcrumb 5-way · KPI global live · URL state complet · GOLDs 18 préservés.