Compare commits

...

37 Commits

Author SHA1 Message Date
opus
2c6887fbac auto-sync via WEVIA git_sync_all intent 2026-04-21T15:40:30+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:40:30 +02:00
opus
10fcacfae9 auto-sync-1540 2026-04-21 15:40:02 +02:00
Opus Wire
f0093d794c fix(public-P3-P4-sanitize): 12 replacements sur 5 pages vitrine
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Remediation P3/P4 audit confidentialite:
- landing-industrie/banque/retail: providers Ollama on-prem → WEVIA Engine (3 edits)
- register.html: retrait options select TN Tunisie + DZ Algerie (2 edits)
- pitch.html: 13 providers → cascade souveraine multi-modeles

Doctrine respectee:
- MENA generique au lieu de TN/DZ specifiques (Ethica)
- WEVIA Engine au lieu de Ollama/Qdrant/Cerebras/Groq (sanitizer)
- Langage qualitatif au lieu de metriques exactes

Pages inchangees (deja clean ou audit OK):
- 5 pages behind auth (deja protegees)
- index, solutions, booking, contact (deja audit clean)
- Majorite SEO pages (contenu commercial OK)

Zero regression · GOLD backups horodates
Total: 12 edits · 5 pages cleanees · doctrine public stricte
2026-04-21 15:38:57 +02:00
opus
7d7c76f4e3 wave(209): duplicates registry API + WTP duplicates section + 30d KPI history
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:37:01 +02:00
opus
0340b97465 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:35:28+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:35:28 +02:00
opus
284dcaaf12 auto-sync-1535 2026-04-21 15:35:01 +02:00
opus
48d793ea5f auto-sync via WEVIA git_sync_all intent 2026-04-21T15:34:28+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:34:28 +02:00
opus
3f8cdb2ef7 AUTO-BACKUP 20260421-1530
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:30:04 +02:00
opus
5060064915 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:28:07+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:28:07 +02:00
Opus Wire
fea12bfe2d feat(wiki-agents-archi-flatten): 28 wiki-items mainte​nant siblings en grid full-width
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
User feedback: Agents-Archi content confine a gauche, veut pleine largeur ecran

CAUSE RACINE:
Les 28 wiki-items etaient chain-nested (poupees russes):
<div card1>
  <div card2>
    <div card3>
      ... 28 niveaux deep
Un seul enfant direct visible par le grid → 1 colonne seulement

FIX:
1. Regex split au boundary <div class=card wiki-item
2. Pour chaque card: count divs open/close, normalize a balanced
3. Re-assemble en flat list (28 siblings au meme niveau)
4. CSS grid: repeat(auto-fill, minmax(280px, 1fr))
5. Result: 4-5 colonnes desktop, 2-3 tablet, 1 mobile

VALIDATION:
- 28 card starts detected via regex (avant = 1 chain)
- 28 cards normalisees (divs re-balanced per card)
- Direct children in wtp-aa-content: 1 → 28
- Global divs: 335/335 diff=0 (structure healing)
- Zero donnee perdue (tous les 28 items preserves)

UX:
- Grid responsive auto-fill 280px min
- Toute la largeur ecran utilisee
- Cards uniformement distribuees
- Breakpoints: 1100px (2 col), 700px (1 col)

File 105027 → 105048 (+21 bytes · flatten presque neutre)
2026-04-21 15:27:39 +02:00
opus
a3812924ac auto-sync-1525 2026-04-21 15:25:01 +02:00
opus
511b5dcb6f auto-sync via WEVIA git_sync_all intent 2026-04-21T15:24:47+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:24:48 +02:00
opus
a0bc39a72a wave(207): WTP orphans wiring (contact+solutions) + PHP by-ref dedup fix
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:22:57 +02:00
Opus Wire
e9e7432e0f feat(wiki-agents-archi-full-width): deplace Agents-Archi en timeline full-width bas
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
User feedback: Agents-Archi 3D encombrait la grille row 3 col 4 (27 entrees nested)
Demande: mettre en vertical sous les autres blocs

Fix:
- Extract state-machine balanced div (11915 bytes, 28 nested wiki-items)
- Remove from original position (row 3 col 4 grid)
- Re-insert en FULL-WIDTH bas de page (avant polish bar)
- Layout timeline multi-colonnes CSS: columns: 3 280px
- break-inside: avoid pour pas couper les cards entre colonnes
- Responsive: 3 cols desktop, 2 tablet, 1 mobile

UX:
- Header premium: h2 Orbitron 900 purple + badge 28 entrees + btn Reduire
- Collapsible: max-height 220px avec fade gradient si reduit
- Background gradient violet-cyan sur la card parent
- Colonne rules 1px subtile (separation visuelle)

STRUCTURE HEALING:
- Divs balance etait -3 (broken) → maintenant 335/335 = 0 (perfect)
- La card mal-nested est extraite proprement via state machine
- Zero donnees perdues (GOLD backup + 28 items preserves)

File 102427 → 105027 (+2600 bytes)
2026-04-21 15:22:17 +02:00
opus
ac3e7ea87a auto-sync via WEVIA git_sync_all intent 2026-04-21T15:20:14+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:20:14 +02:00
opus
b321756af5 auto-sync-1520 2026-04-21 15:20:02 +02:00
opus
dc3941434d auto-sync via WEVIA git_sync_all intent 2026-04-21T15:17:42+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:17:42 +02:00
opus
f20173cdb9 auto-sync-1515 2026-04-21 15:15:01 +02:00
Opus Wire
61d9db4939 feat(wiki-agents-archi-UX): fix encombrement + scroll intelligent
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
User feedback: Agents-Archi 3D card encombrée (57+ wiki-items nested)
Screenshot: colonne très longue empilant tous les appends

APPROCHE SAFE (no DOM restructure):
1. CSS block wtp-nest-fix-v2:
   - wiki-item (même nested) : width 100 pct, box-sizing, word-break normal
   - h2 imbriqués : font 13px, line-height 1.35, color cyan 22d3ee
   - border-left violet pour wiki-items nested (visual hierarchy)
   - min-width 0 sur parent divs (empêche shrink narrow column)

2. JS helper wtp-agents-archi-scroll:
   - Détecte cards contenant >3 wiki-items OU label Agents-Archi
   - Applique max-height:520px + overflow-y:auto
   - Ajoute badge purple N entrées dans h2

Résultat:
- Agents-Archi 3D n est plus encombrée (scroll interne)
- Chaque wiki-item nested est visuellement distingué (violet border-left)
- Badge live indique le count
- Zero DOM restructure (aucun risque casse)
- GOLD backup /opt/wevads/vault/gold_wiki_CSS_NEST_*.html

File size 90445 -> 94199 (+3754)
2026-04-21 15:13:04 +02:00
opus
c964348b63 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:11:53+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:11:53 +02:00
opus
2a09be9693 auto-sync-1510 2026-04-21 15:10:02 +02:00
opus
d220b73d79 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:09:41+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:09:41 +02:00
Opus Wire
27cbf333a0 fix(wiki-nesting-ROOT-CAUSE): banner Cartographie non-fermé → wiki dans banner
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
CAUSE RACINE IDENTIFIÉE:
Le banner position:fixed bottom:20px right:20px (Cartographie live)
navait PAS de </div> fermant après </a>.
Résultat: TOUTES les cards wiki étaient rendues DEDANS le banner.
-> narrow column (12-18px padding du banner)
-> text stacké verticalement 1 mot/ligne
-> vast black space left/center (banner bottom-right only)

FIX appliqué:
1. Fermeture du div banner: </a>[]</div> (insertion balise)
2. Ajout bouton X close sur le banner:
   - button aria-label Fermer
   - onclick display:none + localStorage persist
   - design cercle rouge rgba(239,68,68) premium
3. Banner id=wtp-carto-banner pour ciblage futur
4. Auto-hide si localStorage wtp-carto-banner-hidden=1

RESOLUTION doctrine user:
- PAS DE CHEVAUCHEMENT:  banner is now a small button not a container
- X SUPPRIMER SUR BANNER:  cercle × rouge ajouté
- IMBRICATION WIKI:  causa racine éliminée (était le banner non-fermé)

Zero régression · GOLD backup /opt/wevads/vault/gold_wiki_NEST_FIX_*.html
File size 90445 → 91083 (+638 bytes)
2026-04-21 15:07:07 +02:00
opus
1db9357827 auto-sync via WEVIA git_sync_all intent 2026-04-21T15:06:09+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:06:09 +02:00
opus
9b19a9c38e AUTO-BACKUP 20260421-1505
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:05:02 +02:00
Opus Wire
f3fd9ba47c feat(wiki-ux-polish-v1): sticky search + filter chips + counter + back-to-top
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
UX premium polish for wiki.html after layout fix:

NEW FEATURES:
- Sticky search bar (raccourci clavier /)
  * Live instant filter with 150ms debounce
  * Touches all .wiki-item and .card elements
- Filter chips: Tout / 7 jours / 30 jours / Anciens
  * Date extraction from card text (regex YYYY-MM-DD or DD/MM)
  * Active state visuel (couleur cyan)
- Counter live Showing X / Y entries
- Back-to-top floating button (visible > 400px scroll)
- Keyboard shortcuts:
  * / focus search
  * Esc clear search

UX:
- Sticky bar glassmorphism (backdrop-filter blur)
- Gradient background linear cyan-purple
- Smooth transitions 0.15s
- Accessibility: aria-label on button

Zero régression (only adds above </body>, does not touch existing content)
GOLD backup: /opt/wevads/vault/gold_wiki_UX_POLISH_*.html
File size 84772 → 90445 (+5673 bytes)
2026-04-21 15:02:12 +02:00
opus
8e376aae26 wave(205): artifact preview inline renderer + V2 for wevia.html public
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:00:58 +02:00
opus
420536a079 AUTO-BACKUP 20260421-1500
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 15:00:04 +02:00
opus
d5edaa769c auto-sync via WEVIA git_sync_all intent 2026-04-21T14:56:43+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 14:56:43 +02:00
opus
f48750ef02 auto-sync-1455 2026-04-21 14:55:01 +02:00
opus
649ed5bcd3 wave(204): global sanitizer ob_start + 7 handlers moved to /api/ root
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 14:53:21 +02:00
Opus Wire
f83e6cc27a fix(pricing-behind-auth): pricing.html moved behind auth per user request
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
- Old public location removed (try_files without auth)
- New auth_request /auth/check location added
- External test: HTTP 302 -> /login?r=/pricing.html
- Same pattern as the 4 previous pages (P0/P1/P2)

5 pages confidentielles totales derrière auth:
- faq-techniques.html (P0)
- wepredict.html (P1)
- faq-knowledge-base.html (P1)
- landing-ocp.html (P2)
- pricing.html (user explicit)

Zero regression · Zero ecrasement · GOLD backup in vault
2026-04-21 14:51:43 +02:00
opus
bddae53af1 AUTO-BACKUP 20260421-1450 2026-04-21 14:50:03 +02:00
opus
609c0ee30f auto-sync via WEVIA git_sync_all intent 2026-04-21T14:49:42+02:00
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 14:49:42 +02:00
Opus Wire
89352f6fac fix(public-audit-P0-P1-P2): 4 pages confidential moved behind auth
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Decision user post-audit: put 4 pages behind auth_request /auth/check

Patched pages:
- faq-techniques.html (already auth - no change)
- wepredict.html (NEW AUTH - was public HTTP 200)
- faq-knowledge-base.html (already auth - no change)
- landing-ocp.html (NEW AUTH - was public HTTP 200)

Nginx config /etc/nginx/sites-enabled/weval-consulting:
- Added 2 location blocks with auth_request
- nginx -t PASS · systemctl reload nginx OK
- External test all 4: HTTP 302 redirect to /login?r=...
- chattr +i restored on nginx config

Audit revealed 220 leaks on 34/38 public pages (8 categories).
User selected behind-auth strategy for these 4 highest-risk pages.

Zero regression · Zero ecrasement · GOLD nginx config in vault
Doctrine saved: /opt/obsidian-vault/doctrines/pages-behind-auth.md
2026-04-21 14:45:47 +02:00
opus
dca26169f5 auto-sync-1445 2026-04-21 14:45:02 +02:00
opus
74a822544e wiki(wave-202-203): add entry Master scan_file autonomy + WEVIA Public SSE
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
2026-04-21 14:45:00 +02:00
456 changed files with 11782 additions and 505 deletions

View File

@@ -112,5 +112,6 @@
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -132,5 +132,6 @@ footer a:hover{color:var(--cy)}
</div>
<div>© 2026 WEVAL Consulting · Casablanca · Paris · Tous droits réservés</div>
</footer>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -773,5 +773,6 @@ setInterval(load, 60000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t32b4) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -398,5 +398,6 @@ setTimeout(tick,1500);setInterval(tick,30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -397,5 +397,6 @@ setTimeout(tick,1500);setInterval(tick,30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -954,4 +954,5 @@ renderAlerts();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t32b4) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -611,5 +611,6 @@ load();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t32b4) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -519,5 +519,6 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -430,5 +430,6 @@ requestAnimationFrame(frame);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -1507,5 +1507,6 @@ window.addEventListener('resize',function(){cam.aspect=innerWidth/innerHeight;ca
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr tour29) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -344,5 +344,6 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -408,5 +408,6 @@ setInterval(load, 30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -907,4 +907,5 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr tour30) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -488,5 +488,6 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -344,5 +344,6 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -152,4 +152,5 @@
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -393,4 +393,5 @@ setInterval(loadMetrics,30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -458,5 +458,6 @@ requestAnimationFrame(loop);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -137,4 +137,5 @@ td{padding:10px 8px;border-bottom:1px solid #1e293b;color:#cbd5e1}
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -505,5 +505,6 @@ render();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b5) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -207,5 +207,6 @@ load();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -179,4 +179,5 @@ h2{padding:12px 40px 0;font-size:15px;color:#0ea5e9;text-transform:uppercase;let
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -1323,6 +1323,6 @@ setInterval(refreshStats,60000);
<span id="v142-ollama"></span>
<span style="margin-left:auto;color:#00d4b4;font-size:9px"><a href="/wevia-unified-hub.html" style="color:inherit;text-decoration:none" title="Truth Hub">Truth &rarr;</a></span>
</div>
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776774935" defer></script>
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -112,4 +112,5 @@ p.sub{color:#64748b;margin-bottom:32px;font-size:14px}
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>

View File

@@ -249,5 +249,6 @@ loadStatus();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t31b3) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_Disk_Monitor",
"ts": "2026-04-21T14:30:02+02:00",
"ts": "2026-04-21T15:30:02+02:00",
"disk_pct": 82,
"disk_free_gb": 27,
"growth_per_day_gb": 1.5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_Risk_Escalation",
"ts": "2026-04-21T14:30:03+02:00",
"ts": "2026-04-21T15:30:03+02:00",
"dg_alerts_active": 7,
"wevia_life_stats_preview": "{
"ok": true,

View File

@@ -1,12 +1,12 @@
{
"agent": "V41_Feature_Adoption_Tracker",
"ts": "2026-04-21T14:00:02+02:00",
"ts": "2026-04-21T15:00:02+02:00",
"features_tracked": 15,
"features_used_24h": 10,
"adoption_pct": 66,
"chat_queries_last_1k_log": 82,
"wtp_views_last_1k_log": 0,
"dg_views_last_1k_log": 0,
"features_used_24h": 12,
"adoption_pct": 80,
"chat_queries_last_1k_log": 2,
"wtp_views_last_1k_log": 27,
"dg_views_last_1k_log": 2,
"skill_runs_last_1k_log": 0,
"recommendation": "UX onboarding tour for unused features",
"cron_schedule": "hourly",

View File

@@ -1,6 +1,6 @@
{
"agent": "V45_Leads_Sync",
"ts": "2026-04-21T14:30:03+02:00",
"ts": "2026-04-21T15:40:02+02:00",
"paperclip_total": 48,
"active_customer": 4,
"warm_prospect": 5,

View File

@@ -1,6 +1,6 @@
{
"agent": "V41_MQL_Scoring",
"ts": "2026-04-21T14:00:03+02:00",
"ts": "2026-04-21T15:00:03+02:00",
"leads_total": 48,
"mql_current": 16,
"sql_current": 6,

View File

@@ -1,6 +1,6 @@
{
"agent": "V54_Risk_Monitor_Live",
"ts": "2026-04-21T14:30:03+02:00",
"ts": "2026-04-21T15:30:03+02:00",
"critical_risks": {
"RW01_pipeline_vide": {
"pipeline_keur": 0,
@@ -22,7 +22,7 @@
},
"RW12_burnout": {
"agents_cron_active": 15,
"load_5min": "5.22",
"load_5min": "3.41",
"automation_coverage_pct": 70,
"residual_risk_pct": 60,
"trend": "V52_goldratt_options_active"

14
api/ambre-adg-diag.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
header("Content-Type: application/json");
$f = "/var/www/html/api/ambre-early-doc-gen.php";
$out = ["size"=>@filesize($f)];
$lint = @shell_exec("php8.4 -l $f 2>&1");
$out["lint"] = trim($lint);
// Try to eval the file with mock $_mam set
$_mam = "Genere un PDF sur: test";
ob_start();
$rr = @include $f;
$out["include_ok"] = $rr !== false;
$out["stray_output"] = ob_get_clean();
// If exited, ob would have file_gen response. Otherwise, fall through
echo json_encode($out);

88
api/ambre-doc-gen.php Normal file
View File

@@ -0,0 +1,88 @@
<?php
/**
* ambre-doc-gen.php · AMBRE · real file generation via pandoc
* Usage: POST {type: pdf|docx|pptx|html, title: "...", content: "markdown..."}
* Output: {ok:true, url:"/generated/xxx.ext", size:B, type:..., ts:...}
* Doctrine: zero fake (réelle génération), zero écrasement (unique timestamp per file)
*/
header("Content-Type: application/json");
// === Input parsing ===
$raw = file_get_contents("php://input");
$in = json_decode($raw, true);
if (!$in && !empty($_POST)) $in = $_POST;
$type = strtolower(trim($in["type"] ?? "pdf"));
$title = trim($in["title"] ?? "Document WEVIA");
$content = $in["content"] ?? "";
if (!$content) {
http_response_code(400);
echo json_encode(["ok"=>false, "error"=>"content required"]);
exit;
}
// === Type validation ===
$allowed = ["pdf","docx","pptx","html","odt","epub"];
if (!in_array($type, $allowed)) {
http_response_code(400);
echo json_encode(["ok"=>false, "error"=>"invalid type", "allowed"=>$allowed]);
exit;
}
// === Prepare output dir ===
$outdir = "/var/www/html/generated";
if (!is_dir($outdir)) @mkdir($outdir, 0755, true);
$ts = date("Ymd-His");
$rand = substr(md5(random_bytes(8)), 0, 6);
$safe_title = preg_replace("/[^a-zA-Z0-9\-_]/", "-", substr($title, 0, 40));
$basename = "wevia-{$safe_title}-{$ts}-{$rand}";
$md_path = "$outdir/$basename.md";
$out_path = "$outdir/$basename.$type";
// === Write markdown input ===
$md_content = "# $title\n\n" . $content;
file_put_contents($md_path, $md_content);
// === Generate via pandoc ===
$start = microtime(true);
if ($type === "pdf") {
// Use wkhtmltopdf via pandoc for better rendering
$cmd = "pandoc " . escapeshellarg($md_path) . " --pdf-engine=wkhtmltopdf -o " . escapeshellarg($out_path) . " 2>&1";
} else if ($type === "pptx" || $type === "docx" || $type === "odt" || $type === "html" || $type === "epub") {
$cmd = "pandoc " . escapeshellarg($md_path) . " -o " . escapeshellarg($out_path) . " 2>&1";
}
$cmd_output = @shell_exec("timeout 30 $cmd");
$elapsed = round((microtime(true) - $start) * 1000);
// === Check result ===
if (!file_exists($out_path) || filesize($out_path) === 0) {
@unlink($md_path);
echo json_encode([
"ok" => false,
"error" => "pandoc failed",
"pandoc_output" => $cmd_output,
"cmd" => $cmd,
"elapsed_ms" => $elapsed,
]);
exit;
}
$size = filesize($out_path);
$url = "/generated/$basename.$type";
// Keep md source for provenance
echo json_encode([
"ok" => true,
"url" => $url,
"full_url" => "https://weval-consulting.com$url",
"size" => $size,
"size_human" => $size > 1024 ? round($size/1024, 1) . "KB" : "$size B",
"type" => $type,
"title" => $title,
"elapsed_ms" => $elapsed,
"md_source" => "/generated/$basename.md",
"ts" => date("c"),
"engine" => $type === "pdf" ? "pandoc+wkhtmltopdf" : "pandoc",
], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

View File

@@ -0,0 +1,80 @@
<?php
/**
* ambre-early-doc-gen.php · AMBRE v3 · priority intercept PDF/DOCX/PPTX + Mermaid + Excel
* Reads POST body directly · intercepts BEFORE master-api main flow.
*/
static $__ad_already = false;
if ($__ad_already) return;
$__ad_already = true;
$__ad_raw = @file_get_contents("php://input");
if (!$__ad_raw) return;
$__ad_body = @json_decode($__ad_raw, true);
$__ad_msg_in = $__ad_body["message"] ?? "";
if (!$__ad_msg_in) return;
$__ad_msg = trim($__ad_msg_in);
// ===== HANDLER 1: File generation PDF/DOCX/PPTX/XLSX =====
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:un|une|des|le|la)?\s*(pdf|pptx?|powerpoint|docx?|word|excel|xlsx?|pr[eé]sentation|presentation|document|tableau)[^:]*(?::|sur)\s*(.+)$/iu", $__ad_msg, $__ad_m)) {
$__raw_type = mb_strtolower($__ad_m[1]);
$__topic = trim($__ad_m[2]);
$__type_map = [
"pdf"=>"pdf","pptx"=>"pptx","ppt"=>"pptx","powerpoint"=>"pptx",
"presentation"=>"pptx","présentation"=>"pptx",
"docx"=>"docx","doc"=>"docx","word"=>"docx","document"=>"docx",
"xlsx"=>"xlsx","excel"=>"xlsx","tableau"=>"xlsx",
];
$__type = $__type_map[$__raw_type] ?? "pdf";
$__pandoc_type = ($__type === "xlsx") ? "docx" : $__type;
$__url = "http://127.0.0.1/api/ambre-gen-pipeline.php?type=" . urlencode($__pandoc_type) . "&topic=" . urlencode($__topic);
$__ctx = stream_context_create(["http"=>["timeout"=>75,"method"=>"GET","header"=>"Host: weval-consulting.com\r\n"]]);
$__out = @file_get_contents($__url, false, $__ctx);
if ($__out && strlen($__out) > 50) {
header("Content-Type: application/json; charset=utf-8");
echo json_encode([
"response"=>$__out,"executed"=>true,"provider"=>"ambre-doc-gen-v3",
"intent"=>"file_generation_real","type"=>$__type,"topic"=>$__topic,
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
exit;
}
}
// ===== HANDLER 2: Mermaid schema with VALID syntax =====
if (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eé]ma|mermaid|diagramme|flowchart).*(?::|pour|sur)\s*(.+)$/iu", $__ad_msg, $__mm)) {
$__topic = trim($__mm[2]);
// Strict system prompt forcing valid mermaid syntax
$__sys = "Tu es un générateur de diagrammes Mermaid. Réponds UNIQUEMENT avec du code mermaid valide, pas de markdown, pas de backticks, pas de commentaire. Commence obligatoirement par \"flowchart TD\" ou \"graph TD\". Syntaxe : A[Label] --> B[Label]. JAMAIS de caractères spéciaux hors A-Z 0-9 espaces. MAX 12 nodes.";
$__user = "Génère un flowchart mermaid simple et VALIDE pour: $__topic";
$__llm = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
"http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n",
"content"=>json_encode(["model"=>"fast","messages"=>[
["role"=>"system","content"=>$__sys],
["role"=>"user","content"=>$__user],
],"max_tokens"=>400,"temperature"=>0.1]),
"timeout"=>20]
]));
$__llmd = @json_decode($__llm,true);
$__mmd = $__llmd["choices"][0]["message"]["content"] ?? "";
// Strip markdown backticks if present
$__mmd = preg_replace("/```(?:mermaid)?\n?|```/","",$__mmd);
$__mmd = trim($__mmd);
// Validate basics
if (!preg_match("/^(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram)/i", $__mmd)) {
$__mmd = "flowchart TD\n" . $__mmd;
}
header("Content-Type: application/json; charset=utf-8");
echo json_encode([
"response"=>"🧩 Schéma Mermaid pour: $__topic\n\n".chr(96).chr(96).chr(96)."mermaid\n$__mmd\n".chr(96).chr(96).chr(96),
"executed"=>true,"provider"=>"ambre-doc-gen-v3","intent"=>"mermaid_valid",
"topic"=>$__topic,
], JSON_UNESCAPED_UNICODE);
exit;
}
// fall through to main flow

View File

@@ -0,0 +1,80 @@
<?php
/**
* ambre-gen-pipeline.php · AMBRE · pipeline complet chat → LLM markdown → pandoc file
* Usage: GET ?type=pdf|docx|pptx&topic=... (from chat intent cmd)
* Output: text response with file URL embedded
*/
header("Content-Type: text/plain; charset=utf-8");
$type = strtolower(trim($_GET["type"] ?? "pdf"));
$topic = trim($_GET["topic"] ?? "");
if (!$topic) { echo "❌ topic required"; exit; }
$allowed = ["pdf","docx","pptx","html","epub"];
if (!in_array($type, $allowed)) { echo "❌ type invalide, allowed: " . implode("|", $allowed); exit; }
// === 1. Call LLM to generate clean markdown ===
$sys_prompt = "Tu es un generateur de contenu professionnel. Réponds UNIQUEMENT en markdown pur, pas de preambule, pas de meta-commentaire. Pour les PPTX, utilise # pour chaque slide title. Français par défaut.";
$user_prompt = match($type) {
"pdf" => "Génère un document PDF professionnel, structuré, complet (2-3 pages) sur: $topic. Titres, sections, bullets.",
"docx" => "Génère un document Word professionnel, structuré sur: $topic. Titres, sections, tableaux si pertinent.",
"pptx" => "Génère une présentation de 5-7 slides sur: $topic. Chaque slide commence par # (titre slide). Bullets concises.",
"html" => "Génère un document HTML propre sur: $topic.",
default => "Génère un document sur: $topic.",
};
$llm_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\n",
"content" => json_encode([
"model" => "fast",
"messages" => [
["role"=>"system", "content"=>$sys_prompt],
["role"=>"user", "content"=>$user_prompt],
],
"max_tokens" => 2500,
"temperature" => 0.5,
"stream" => false,
]),
"timeout" => 30,
],
]));
$llm_d = @json_decode($llm_raw, true);
$md_content = $llm_d["choices"][0]["message"]["content"] ?? "";
if (!$md_content) { echo "❌ LLM failed to generate content"; exit; }
// === 2. Call ambre-doc-gen to create the file ===
$title = substr($topic, 0, 60);
$gen_ctx = stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\n",
"content" => json_encode([
"type" => $type,
"title" => $title,
"content" => $md_content,
]),
"timeout" => 45,
],
]);
$gen_raw = @file_get_contents("http://127.0.0.1/api/ambre-doc-gen.php", false, $gen_ctx);
$gen_d = @json_decode($gen_raw, true);
if (!$gen_d || empty($gen_d["ok"])) {
echo "❌ Generation failed: " . ($gen_d["error"] ?? "unknown") . "\n";
echo "MD content was: " . substr($md_content, 0, 200);
exit;
}
// === 3. Output rich response ===
$icon = match($type) { "pdf"=>"📄", "docx"=>"📝", "pptx"=>"🎯", "html"=>"🌐", default=>"📎" };
echo "$icon **$title** généré\n\n";
echo "🔗 Télécharger: " . $gen_d["full_url"] . "\n";
echo "📦 Taille: " . $gen_d["size_human"] . " · ⚙️ " . $gen_d["elapsed_ms"] . "ms · engine: " . $gen_d["engine"] . "\n\n";
echo "---\n\nAperçu contenu:\n\n";
echo substr($md_content, 0, 800);
if (strlen($md_content) > 800) echo "\n\n... [document complet dans le fichier]";

45
api/ambre-libs-check.php Normal file
View File

@@ -0,0 +1,45 @@
<?php
/**
* ambre-libs-check.php · REAL shell check des libs disponibles pour file generation
*/
header("Content-Type: application/json");
$out = ["ok"=>true, "ts"=>date("c"), "s204"=>[]];
// Shell binary checks
foreach (["pandoc","wkhtmltopdf","libreoffice","soffice","unoconv","markdown","gs"] as $cmd) {
$p = @trim(shell_exec("which $cmd 2>/dev/null"));
$out["s204"]["bin_$cmd"] = $p ?: "NOT FOUND";
}
// Composer autoload paths (commonly in /var/www/html/vendor or /opt/wevia-brain/vendor)
foreach (["/var/www/html/vendor/autoload.php","/opt/wevia-brain/vendor/autoload.php","/var/www/weval/vendor/autoload.php","/opt/weval-l99/vendor/autoload.php"] as $autoload) {
if (file_exists($autoload)) {
$out["s204"]["composer_$autoload"] = "EXISTS";
}
}
// Scan vendor folder for specific packages
foreach (["/var/www/html/vendor","/opt/wevia-brain/vendor","/var/www/weval/vendor"] as $vendor_dir) {
if (is_dir($vendor_dir)) {
foreach (["dompdf","phpoffice","mpdf","tcpdf","phpspreadsheet","phppresentation","phpword"] as $pkg) {
$found = @shell_exec("find $vendor_dir -maxdepth 3 -type d -iname "*$pkg*" 2>/dev/null | head -3");
if (trim($found)) $out["s204"]["pkg_$pkg"] = trim($found);
}
}
}
// PHP extensions
$ext_list = get_loaded_extensions();
foreach (["gd","imagick","zip","mbstring","xml","curl","openssl"] as $ext) {
$out["s204"]["ext_$ext"] = in_array($ext, $ext_list) ? "YES" : "NO";
}
// Check /var/www/html/generated directory
$out["s204"]["generated_dir"] = is_dir("/var/www/html/generated") ? "EXISTS" : "MISSING";
if (is_dir("/var/www/html/generated")) {
$files = glob("/var/www/html/generated/*");
$out["s204"]["generated_count"] = count($files);
$out["s204"]["generated_sample"] = array_slice(array_map("basename", $files), 0, 5);
}
echo json_encode($out, JSON_PRETTY_PRINT);

33
api/ambre-list-stubs.php Normal file
View File

@@ -0,0 +1,33 @@
<?php
/**
* ambre-list-stubs.php · listing wired-pending stubs related to capabilities
*/
header("Content-Type: application/json");
$dir = "/var/www/html/api/wired-pending";
$files = glob("$dir/intent-opus4-*.php") ?: [];
$kw = $_GET["kw"] ?? "";
$out = ["count"=>count($files), "matches"=>[]];
foreach ($files as $f) {
$name = basename($f, ".php");
$short = str_replace("intent-opus4-", "", $name);
if ($kw && stripos($short, $kw) === false) continue;
// Read metadata if array stub
ob_start();
$info = @include $f;
@ob_end_clean();
$meta = [
"name" => $short,
"size" => filesize($f),
"mtime" => gmdate("c", filemtime($f)),
];
if (is_array($info)) {
$meta["triggers"] = $info["triggers"] ?? [];
$meta["status"] = $info["status"] ?? "?";
$meta["cmd"] = $info["cmd"] ?? "?";
} else {
$meta["type"] = "direct-exec";
}
$out["matches"][] = $meta;
}
$out["matches_count"] = count($out["matches"]);
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

30
api/ambre-logo-finder.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
header("Content-Type: application/json");
$out = [];
$targets = [
"/var/www/html/solution",
"/var/www/html/solutions",
"/var/www/html/assets",
"/var/www/html/wevia-ia",
"/var/www/html/img",
"/var/www/html/images",
"/var/www/html/static",
"/var/www/html",
];
foreach ($targets as $t) {
if (!is_dir($t)) { $out[$t] = "MISSING"; continue; }
$logos = @glob("$t/*logo*wevia*") ?: [];
$logos = array_merge($logos, @glob("$t/*wevia*logo*") ?: []);
$logos = array_merge($logos, @glob("$t/logo-wevia*") ?: []);
$logos = array_merge($logos, @glob("$t/wevia-logo*") ?: []);
// Also direct files
foreach (["logo.svg","logo.png","wevia.svg","wevia.png","logo-wevia.svg","logo-wevia.png"] as $name) {
if (file_exists("$t/$name")) $logos[] = "$t/$name";
}
if ($logos) $out[$t] = array_map(function($p){return ["path"=>$p,"size"=>@filesize($p)];}, array_unique($logos));
}
// Also check /solution* root-level
$root = @shell_exec("ls -d /solution* /var/www/html/solution* 2>/dev/null");
if ($root) $out["solution_roots"] = trim($root);
echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

View File

@@ -1,5 +1,5 @@
{
"generated": "2026-04-21 12:30:02",
"generated": "2026-04-21 13:30:02",
"version": "1.0",
"servers": [
{
@@ -10,7 +10,7 @@
"ssh": 49222,
"disk_pct": 82,
"disk_avail": "27G",
"uptime": "up 1 week, 2 hours, 38 minutes",
"uptime": "up 1 week, 3 hours, 38 minutes",
"nginx": "active",
"php_fpm": "active",
"php_version": "8.5.5"
@@ -116,7 +116,7 @@
},
{
"name": "uptime-kuma",
"status": "Up 36 hours (healthy)",
"status": "Up 37 hours (healthy)",
"ports": ""
},
{
@@ -277,7 +277,7 @@
"screens": {
"s204_html": 315,
"s204_products": 104,
"s204_api_php": 783,
"s204_api_php": 800,
"s204_wevia_php": 34,
"s95_arsenal_html": 1377,
"s95_arsenal_api": 377
@@ -301,7 +301,7 @@
"langfuse"
],
"key_tables": {
"kb_learnings": 5543,
"kb_learnings": 5545,
"kb_documents": 0,
"ethica_medecins": 50004,
"enterprise_agents": 0
@@ -601,7 +601,7 @@
]
},
"wiki": {
"total_entries": 5543,
"total_entries": 5545,
"categories": [
{
"category": "AUTO-FIX",
@@ -609,7 +609,7 @@
},
{
"category": "TOPOLOGY",
"cnt": "1214"
"cnt": "1216"
},
{
"category": "DISCOVERY",
@@ -1706,13 +1706,13 @@
}
},
"cortex": {
"fast_lines": 3652,
"fast_lines": 3681,
"router_lines": 6152,
"router_functions": 17,
"today_requests": 5,
"today_cost": 0,
"avg_latency_ms": 2389,
"top_provider": "cerebras",
"top_provider": "WEVIA Engine",
"providers_used": 2
},
"optimizations": {
@@ -1826,7 +1826,7 @@
"name": "CORTEX Smart Router",
"status": "active",
"desc": "T0 Ollama → T1 Free APIs → T2 Fallbacks",
"routes": 3652
"routes": 3681
},
{
"name": "RAG Ingest",
@@ -1945,7 +1945,7 @@
}
]
},
"scan_time_ms": 1610,
"scan_time_ms": 3257,
"gaps": [],
"score": 100,
"automation": {

View File

@@ -0,0 +1,24 @@
<?php
// V38 Opus - WEVIA Master FULL AUTONOMY dashboard intent
// Doctrine 7+64+12
return [
"name" => "autonomy_full_dashboard",
"triggers" => [
"autonomy full",
"autonomie full",
"autonomy master",
"autonomie master",
"autonomy dashboard",
"autonomie dashboard",
"full autonomie",
"wevia autonomie complete",
"wevia autonomy complete",
"etat global autonomie",
"autonomy global",
],
"cmd" => "curl -s http://127.0.0.1/api/wevia-autonomy-dashboard.php",
"status" => "EXECUTED",
"created_at" => "2026-04-20T14:10:00+00:00",
"source" => "opus-v38-autonomy-full",
"description" => "V38 Unified autonomy dashboard: 19 automations + autonomy_score + crons + L99 + services + blade + alerts - one shot verdict FULL_AUTONOMOUS or DEGRADED",
];

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-21T14:40:01.150350",
"generated_at": "2026-04-21T15:40:01.408799",
"stats": {
"total": 48,
"pending": 31,

View File

@@ -1,8 +1,8 @@
{
"status": "ALIVE",
"ts": "2026-04-21T14:30:01.933472",
"last_heartbeat": "2026-04-21T14:30:01.933472",
"last_heartbeat_ts_epoch": 1776774601,
"ts": "2026-04-21T15:30:02.364453",
"last_heartbeat": "2026-04-21T15:30:02.364453",
"last_heartbeat_ts_epoch": 1776778202,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",

View File

@@ -0,0 +1 @@
{"id":"dynamic-1776776450","type":"dynamic_wire","msg":"multiagent playwright screenshot wikihtml after ux fix - verify grid columns work not 1 word per line","created":"2026-04-21T15:00:50+02:00","status":"pending"}

View File

@@ -0,0 +1,99 @@
<?php
// Wave 209 · /api/duplicates-registry.php
// Duplicate screens registry. Non-destructive audit: returns groups with
// canonical file + legacy candidates + recommendations. Zero delete.
@require_once __DIR__ . '/wevia-sanitizer-guard.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$DOCROOT = '/var/www/html';
$pages = array_filter(scandir($DOCROOT), function($f) use ($DOCROOT) {
return substr($f, -5) === '.html' && is_file("$DOCROOT/$f");
});
// Normalize base name (strip version/legacy/saas suffixes)
$base_groups = [];
foreach ($pages as $p) {
$base = substr($p, 0, -5);
$base = preg_replace('/-v\d+$|-new$|-legacy$|-old$|\d{8,14}$|-saas$|-v\d+-\w+$/', '', $base);
$base = preg_replace('/-pre-\w+$/', '', $base);
$base_groups[$base][] = $p;
}
// Duplicates only
$dups = [];
$total_dups = 0;
foreach ($base_groups as $base => $files) {
if (count($files) < 2) continue;
// Determine canonical = file with cleanest name (shortest), fall back to newest
usort($files, function($a, $b) use ($DOCROOT) {
// Prefer files without -v / -legacy / -old / -saas suffixes
$has_suffix_a = preg_match('/-v\d+|-legacy|-old|-saas|-new/', $a);
$has_suffix_b = preg_match('/-v\d+|-legacy|-old|-saas|-new/', $b);
if ($has_suffix_a !== $has_suffix_b) return $has_suffix_a - $has_suffix_b;
// Then prefer shorter name
if (strlen($a) !== strlen($b)) return strlen($a) - strlen($b);
// Then newest mtime
return filemtime("$DOCROOT/$b") - filemtime("$DOCROOT/$a");
});
$canonical = $files[0];
$legacy = array_slice($files, 1);
$entries = [];
foreach ($files as $f) {
$path = "$DOCROOT/$f";
$size = filesize($path);
$entries[] = [
'file' => $f,
'size_bytes' => $size,
'last_modified' => date('c', filemtime($path)),
'is_canonical' => $f === $canonical,
'url' => "/$f"
];
}
// Size similarity between canonical and legacy
$can_size = filesize("$DOCROOT/$canonical");
$close_copies = [];
foreach ($legacy as $l) {
$l_size = filesize("$DOCROOT/$l");
if ($can_size > 0 && abs($can_size - $l_size) / max($can_size, $l_size) < 0.1) {
$close_copies[] = $l;
}
}
$recommendation = count($close_copies) > 0
? 'Archive legacy copies (add HTTP 301 to canonical) - content quasi-identical'
: 'Keep for now - legacy has distinct content, verify if still referenced';
$dups[] = [
'base' => $base,
'count' => count($files),
'canonical' => $canonical,
'canonical_url' => "/$canonical",
'legacy_files' => $legacy,
'close_copies' => $close_copies,
'recommendation' => $recommendation,
'files' => $entries
];
$total_dups += count($legacy);
}
// Sort by count desc
usort($dups, function($a, $b) { return $b['count'] - $a['count']; });
$out = [
'ok' => true,
'ts' => date('c'),
'total_pages' => count($pages),
'total_duplicate_groups' => count($dups),
'total_legacy_files' => $total_dups,
'total_close_copies' => array_sum(array_map(function($g){ return count($g['close_copies']); }, $dups)),
'groups' => $dups,
'version' => 'wave-209',
'doctrine' => 'non-destructive · document canonical + legacy · zero delete'
];
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

View File

@@ -0,0 +1,281 @@
{
"ts": "2026-04-21T13:40:01+00:00",
"server": "s204",
"s204": {
"load": 1.1,
"uptime": "2026-04-14 11:51:24",
"ram_total_mb": 31335,
"ram_used_mb": 11420,
"ram_free_mb": 19914,
"disk_total": "150G",
"disk_used": "117G",
"disk_free": "27G",
"disk_pct": "82%",
"fpm_workers": 141,
"docker_containers": 19,
"cpu_cores": 8
},
"s95": {
"load": 0.39,
"disk_pct": "81%",
"status": "UP",
"ram_total_mb": 15610,
"ram_free_mb": 11965
},
"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": 315,
"php_apis": 802,
"wiki_entries": 1988,
"vault_doctrines": 72,
"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": 110609,
"with_phone": 155151,
"gap_email": 51124,
"pct_email": 68.4,
"pct_phone": 95.9,
"by_country": [
{
"country": "DZ",
"hcps": 122337,
"with_email": 78506,
"with_tel": 119396,
"pct_email": 64.2,
"pct_tel": 97.6
},
{
"country": "MA",
"hcps": 19723,
"with_email": 15077,
"with_tel": 18737,
"pct_email": 76.4,
"pct_tel": 95
},
{
"country": "TN",
"hcps": 17794,
"with_email": 15147,
"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 5 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 5 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 38 hours (healthy)",
"ports": ""
},
{
"name": "vaultwarden",
"status": "Up 6 days (healthy)",
"ports": ""
},
{
"name": "qdrant",
"status": "Up 6 days",
"ports": ""
}
],
"crons": {
"active": 35
},
"git": {
"head": "10fcacfae auto-sync-1540",
"dirty": 4,
"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": 3823,
"health": {
"score": 5,
"max": 6,
"pct": 83
},
"elapsed_ms": 11343
}

38
api/file_dump.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
/**
* intent-opus4-file_dump.php
* AMBRE session · chunked file reader · offset + length
* Invocation: /api/opus-arch-generic.php?tool=file_dump&path=X&offset=0&length=10000
*/
header("Content-Type: application/json");
$target = $_GET["path"] ?? "";
$offset = (int)($_GET["offset"] ?? 0);
$length = min((int)($_GET["length"] ?? 8000), 50000);
$real = realpath($target);
$allowed = ["/var/www/html/", "/opt/wevads/", "/opt/weval-l99/"];
$ok = false;
foreach ($allowed as $root) {
if ($real && strpos($real, $root) === 0) { $ok = true; break; }
}
if (!$ok || !file_exists($real)) {
echo json_encode(["ok"=>false, "error"=>"path denied or not found", "path"=>$target]);
exit;
}
$fh = fopen($real, "r");
fseek($fh, $offset);
$chunk = fread($fh, $length);
fclose($fh);
echo json_encode([
"ok" => true,
"path" => $real,
"offset" => $offset,
"length" => strlen($chunk),
"total" => filesize($real),
"eof" => ($offset + strlen($chunk)) >= filesize($real),
"content" => $chunk,
"source" => "intent-opus4-file_dump.php · ambre · honest chunked read",
]);

View File

@@ -0,0 +1,8 @@
{
"ts": "2026-04-21T15:05:33+02:00",
"scanned": 2050,
"misplaced_count": 0,
"misplaced": [
],
"source": "wevia-handlers-detector.sh · wave 206 · nightly 03:15"
}

View File

@@ -1,27 +1,27 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-21T12:40:01+00:00",
"ts": "2026-04-21T13:40:01+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",
"signals_tracked": {
"wtp_engagement": 100,
"wtp_engagement": 72,
"chat_engagement": 0,
"roi_tool": 0,
"email_opened": 0
},
"avg_score": 25,
"avg_score": 18,
"mql_threshold": 50,
"sql_threshold": 75,
"leads_captured": 48,
"mql_auto_scored": 20,
"mql_auto_scored": 19,
"sql_auto_scored": 8,
"mql_auto_pct": 41,
"mql_auto_pct": 40,
"improvement_vs_manual": {
"before_manual_pct": 33.3,
"after_auto_pct": 41,
"delta": 7.700000000000003
"after_auto_pct": 40,
"delta": 6.700000000000003
},
"paperclip_db_ok": true,
"paperclip_tables": 1,

View File

@@ -1 +1 @@
{"ts": "20260421_141112", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 32.8, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
{"ts": "20260421_152221", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 32.4, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.213074"
"discovered": "2026-04-21T15:00:03.854616"
},
{
"name": "wevia-brain",
@@ -23,7 +23,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.363681"
"discovered": "2026-04-21T15:00:03.953944"
},
{
"name": "skills",
@@ -36,7 +36,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.112938"
"discovered": "2026-04-21T15:00:03.643144"
},
{
"name": "everything-claude-code",
@@ -49,7 +49,7 @@
"has_docker": false,
"wired": true,
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
"discovered": "2026-04-21T14:00:03.387830"
"discovered": "2026-04-21T15:00:02.718244"
},
{
"name": "open-webui-fresh",
@@ -62,7 +62,7 @@
"has_docker": true,
"wired": true,
"description": "# Open WebUI 👋 ![GitHub stars](https://img.shields.io/github/stars/open-webui/open-webui?style=social) ![GitHub forks](https://img.shields.io/github/",
"discovered": "2026-04-21T14:00:03.915324"
"discovered": "2026-04-21T15:00:03.151526"
},
{
"name": "weval-nonreg",
@@ -75,7 +75,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.234801"
"discovered": "2026-04-21T15:00:03.880964"
},
{
"name": "activepieces",
@@ -88,7 +88,7 @@
"has_docker": true,
"wired": true,
"description": " <h1 align=\"center\"> <a target=\"_blank\" href=\"https://activepieces.com\" > <img align=\"center\" alt=\"Activepieces\" src=\"http",
"discovered": "2026-04-21T14:00:03.193636"
"discovered": "2026-04-21T15:00:02.339291"
},
{
"name": "oh-my-claudecode",
@@ -101,7 +101,7 @@
"has_docker": false,
"wired": true,
"description": "English | [한국어](README.ko.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
"discovered": "2026-04-21T14:00:03.859357"
"discovered": "2026-04-21T15:00:03.134159"
},
{
"name": "mxyhi_ok-skills",
@@ -114,7 +114,7 @@
"has_docker": false,
"wired": true,
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
"discovered": "2026-04-21T14:00:03.816980"
"discovered": "2026-04-21T15:00:03.064635"
},
{
"name": "SuperClaude_Framework",
@@ -127,7 +127,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [![Run in Smithery](https://smithery.ai/badge/skills/SuperClaude-Org)](https://smithery.ai/skills?ns=",
"discovered": "2026-04-21T14:00:03.175977"
"discovered": "2026-04-21T15:00:02.325731"
},
{
"name": "paperclip-weval",
@@ -140,7 +140,7 @@
"has_docker": true,
"wired": true,
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
"discovered": "2026-04-21T14:00:03.997967"
"discovered": "2026-04-21T15:00:03.175618"
},
{
"name": "vllm",
@@ -153,7 +153,7 @@
"has_docker": false,
"wired": true,
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
"discovered": "2026-04-21T14:00:04.151555"
"discovered": "2026-04-21T15:00:03.801695"
},
{
"name": "deer-flow",
@@ -166,7 +166,7 @@
"has_docker": false,
"wired": true,
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [![Python](https:",
"discovered": "2026-04-21T14:00:03.383651"
"discovered": "2026-04-21T15:00:02.698669"
},
{
"name": "system-prompts-ai",
@@ -179,7 +179,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> Support my work here: <a href=\"https://bags.fm/DEffWzJyaFRNyA4ogUox631hfHuv3KLeCcpBh2ipBAGS\">Bags.fm</a> • <a href=\"https://",
"discovered": "2026-04-21T14:00:04.122765"
"discovered": "2026-04-21T15:00:03.738096"
},
{
"name": "librechat",
@@ -192,7 +192,7 @@
"has_docker": true,
"wired": true,
"description": "<p align=\"center\"> <a href=\"https://librechat.ai\"> <img src=\"client/public/assets/logo.svg\" height=\"256\"> </a> <h1 align=\"center\"> <a hr",
"discovered": "2026-04-21T14:00:03.498913"
"discovered": "2026-04-21T15:00:02.854603"
},
{
"name": "listmonk",
@@ -205,7 +205,7 @@
"has_docker": true,
"wired": true,
"description": "<a href=\"https://zerodha.tech\"><img src=\"https://zerodha.tech/static/images/github-badge.svg\" align=\"right\" /></a> [![listmonk-logo](https://user-ima",
"discovered": "2026-04-21T14:00:03.525174"
"discovered": "2026-04-21T15:00:02.856857"
},
{
"name": "claw-code",
@@ -218,7 +218,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> <img src=\"https://github.com/2214962083/2214962083/assets/34775414/a48b745f-c803-4884-95a8-26c63f7f5b53\" alt=\"icon\"/> <h1 align=",
"discovered": "2026-04-21T14:00:03.374274"
"discovered": "2026-04-21T15:00:02.643927"
},
{
"name": "rnd-edict",
@@ -231,7 +231,7 @@
"has_docker": true,
"wired": true,
"description": "<h1 align=\"center\">⚔️ 三省六部 · Edict</h1> <p align=\"center\"> <strong>我用 1300 年前的帝国制度,重新设计了 AI 多 Agent 协作架构。<br>结果发现,古人比现代 AI 框架更懂分权制衡。</strong> </p> ",
"discovered": "2026-04-21T14:00:04.106781"
"discovered": "2026-04-21T15:00:03.559505"
},
{
"name": "anythingllm",
@@ -244,7 +244,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <p align=\"center\"> <a href=\"https://anythingllm.com\"><img src=\"https://github.com/Mintplex-Labs/anything-llm/blob/master/",
"discovered": "2026-04-21T14:00:03.245202"
"discovered": "2026-04-21T15:00:02.374925"
},
{
"name": "modelscope-hub",
@@ -257,7 +257,7 @@
"has_docker": false,
"wired": true,
"description": " <p align=\"center\"> <br> <img src=\"https://modelscope.oss-cn-beijing.aliyuncs.com/modelscope.gif\" width=\"400\"/> <br> <p> <div align=\"cent",
"discovered": "2026-04-21T14:00:03.766340"
"discovered": "2026-04-21T15:00:03.033735"
},
{
"name": "antigravity-awesome-skills",
@@ -270,7 +270,7 @@
"has_docker": false,
"wired": true,
"description": "<!-- registry-sync: version=9.4.0; skills=1340; stars=28867; updated_at=2026-03-31T16:30:41+00:00 --> # 🌌 Antigravity Awesome Skills: 1,340+ Agentic S",
"discovered": "2026-04-21T14:00:03.243098"
"discovered": "2026-04-21T15:00:02.357675"
},
{
"name": "deepagent",
@@ -283,7 +283,7 @@
"has_docker": false,
"wired": true,
"description": "# DeepAgents 기반 Research Multi Agent System Agent 2.0 Paradigm 을 잘 구현하는 DeepAgent 를 활용해서, FileSystem 기반 Context Engineering 을 원활히 수행하는 Research 용 Mul",
"discovered": "2026-04-21T14:00:03.380556"
"discovered": "2026-04-21T15:00:02.686301"
},
{
"name": "whisper.cpp",
@@ -296,7 +296,7 @@
"has_docker": false,
"wired": true,
"description": "# whisper.cpp ![whisper.cpp](https://user-images.githubusercontent.com/1991296/235238348-05d0f6a4-da44-4900-a1de-d0707e75b763.jpeg) [![Actions Statu",
"discovered": "2026-04-21T14:00:04.376118"
"discovered": "2026-04-21T15:00:03.968655"
},
{
"name": "rnd-astron-agent",
@@ -309,7 +309,7 @@
"has_docker": false,
"wired": true,
"description": "[![Astron_Readme](./docs/imgs/Astron_Readme.png)](https://agent.xfyun.cn) <div align=\"center\"> [![License](https://img.shields.io/badge/license-apac",
"discovered": "2026-04-21T14:00:04.104461"
"discovered": "2026-04-21T15:00:03.519656"
},
{
"name": "sovereign-api",
@@ -322,7 +322,20 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.117393"
"discovered": "2026-04-21T15:00:03.674879"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 22,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T15:00:03.894035"
},
{
"name": "autogen",
@@ -335,20 +348,7 @@
"has_docker": false,
"wired": true,
"description": "<a name=\"readme-top\"></a> <div align=\"center\"> <img src=\"https://microsoft.github.io/autogen/0.2/img/ag.svg\" alt=\"AutoGen Logo\" width=\"100\"> [![Twit",
"discovered": "2026-04-21T14:00:03.296519"
},
{
"name": "weval-ops",
"path": "/opt/weval-ops",
"files": 21,
"has_readme": false,
"has_skill": false,
"has_python": true,
"has_node": false,
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.248160"
"discovered": "2026-04-21T15:00:02.424100"
},
{
"name": "HolyClaude",
@@ -361,7 +361,7 @@
"has_docker": true,
"wired": true,
"description": "🌍 **English** | [Español](docs/translations/README.es.md) | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
"discovered": "2026-04-21T14:00:03.037170"
"discovered": "2026-04-21T15:00:02.307800"
},
{
"name": "aios",
@@ -374,7 +374,7 @@
"has_docker": true,
"wired": true,
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
"discovered": "2026-04-21T14:00:03.216248"
"discovered": "2026-04-21T15:00:02.348350"
},
{
"name": "rnd-agent-framework",
@@ -387,7 +387,7 @@
"has_docker": false,
"wired": true,
"description": "![Microsoft Agent Framework](docs/assets/readme-banner.png) # Welcome to Microsoft Agent Framework! [![Microsoft Foundry Discord](https://dcbadge.li",
"discovered": "2026-04-21T14:00:04.099224"
"discovered": "2026-04-21T15:00:03.399770"
},
{
"name": "awesome-claude-code-toolkit",
@@ -400,7 +400,7 @@
"has_docker": false,
"wired": true,
"description": "# Claude Code Toolkit **The most comprehensive toolkit for Claude Code -- 135 agents, 35 curated skills (+400,000 via [SkillKit](https://agenstskills",
"discovered": "2026-04-21T14:00:03.331940"
"discovered": "2026-04-21T15:00:02.553790"
},
{
"name": "mirofish",
@@ -413,7 +413,7 @@
"has_docker": true,
"wired": true,
"description": "<div align=\"center\"> <img src=\"./static/image/MiroFish_logo_compressed.jpeg\" alt=\"MiroFish Logo\" width=\"75%\"/> <a href=\"https://trendshift.io/reposi",
"discovered": "2026-04-21T14:00:03.725986"
"discovered": "2026-04-21T15:00:03.007195"
},
{
"name": "claude-mem",
@@ -426,7 +426,7 @@
"has_docker": false,
"wired": true,
"description": "# claude-code-auto-memory **Your CLAUDE.md, always in sync.** Minimal tokens. Zero config. Just works. A Claude Code plugin that watches what Claude",
"discovered": "2026-04-21T14:00:03.360460"
"discovered": "2026-04-21T15:00:02.556587"
},
{
"name": "huggingface-skills",
@@ -439,7 +439,7 @@
"has_docker": false,
"wired": true,
"description": "# Hugging Face Skills Hugging Face Skills are definitions for AI/ML tasks like dataset creation, model training, and evaluation. They are interoperab",
"discovered": "2026-04-21T14:00:03.392343"
"discovered": "2026-04-21T15:00:02.848022"
},
{
"name": "wevads",
@@ -452,7 +452,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.172973"
"discovered": "2026-04-21T15:00:03.829046"
},
{
"name": "supermemory",
@@ -465,7 +465,7 @@
"has_docker": false,
"wired": true,
"description": "<p align=\"center\"> <picture> <source srcset=\"apps/web/public/logo-fullmark.svg\" media=\"(prefers-color-scheme: dark)\"> <source srcset=\"apps/w",
"discovered": "2026-04-21T14:00:04.119479"
"discovered": "2026-04-21T15:00:03.704424"
},
{
"name": "fmgapp",
@@ -478,7 +478,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.390235"
"discovered": "2026-04-21T15:00:02.807652"
},
{
"name": "obsidian-vault",
@@ -491,7 +491,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.819123"
"discovered": "2026-04-21T15:00:03.084629"
},
{
"name": "rnd-agents",
@@ -504,7 +504,7 @@
"has_docker": false,
"wired": true,
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
"discovered": "2026-04-21T14:00:04.101557"
"discovered": "2026-04-21T15:00:03.472268"
},
{
"name": "FrancyJGLisboa_agent-skill-creator",
@@ -517,7 +517,7 @@
"has_docker": false,
"wired": true,
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
"discovered": "2026-04-21T14:00:03.004284"
"discovered": "2026-04-21T15:00:02.260139"
},
{
"name": "skillsmith",
@@ -530,7 +530,7 @@
"has_docker": false,
"wired": true,
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
"discovered": "2026-04-21T14:00:04.115356"
"discovered": "2026-04-21T15:00:03.661748"
},
{
"name": "awesome-agent-skills",
@@ -543,7 +543,7 @@
"has_docker": false,
"wired": true,
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
"discovered": "2026-04-21T14:00:03.315079"
"discovered": "2026-04-21T15:00:02.508609"
},
{
"name": "paperclip-skills",
@@ -556,7 +556,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.925295"
"discovered": "2026-04-21T15:00:03.153575"
},
{
"name": "jzOcb_writing-style-skill",
@@ -569,7 +569,7 @@
"has_docker": false,
"wired": true,
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
"discovered": "2026-04-21T14:00:03.432992"
"discovered": "2026-04-21T15:00:02.850217"
},
{
"name": "qdrant-data",
@@ -582,7 +582,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.057153"
"discovered": "2026-04-21T15:00:03.296808"
},
{
"name": "wazuh",
@@ -595,7 +595,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.170973"
"discovered": "2026-04-21T15:00:03.815902"
},
{
"name": "plausible",
@@ -608,7 +608,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.024996"
"discovered": "2026-04-21T15:00:03.229857"
},
{
"name": "pmta",
@@ -621,7 +621,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.031069"
"discovered": "2026-04-21T15:00:03.250756"
},
{
"name": "render-configs",
@@ -634,7 +634,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.093043"
"discovered": "2026-04-21T15:00:03.354310"
},
{
"name": "searxng",
@@ -647,7 +647,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.110665"
"discovered": "2026-04-21T15:00:03.608100"
},
{
"name": "weval-guardian",
@@ -660,7 +660,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.197346"
"discovered": "2026-04-21T15:00:03.845315"
},
{
"name": "weval-litellm",
@@ -673,7 +673,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.218750"
"discovered": "2026-04-21T15:00:03.865731"
},
{
"name": "weval-security",
@@ -686,7 +686,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.331517"
"discovered": "2026-04-21T15:00:03.930563"
},
{
"name": "archive",
@@ -699,7 +699,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.270004"
"discovered": "2026-04-21T15:00:02.391402"
},
{
"name": "loki",
@@ -712,7 +712,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.684678"
"discovered": "2026-04-21T15:00:02.900227"
},
{
"name": "ruflo",
@@ -725,7 +725,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.108782"
"discovered": "2026-04-21T15:00:03.579813"
},
{
"name": "twenty",
@@ -738,7 +738,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.136242"
"discovered": "2026-04-21T15:00:03.742361"
},
{
"name": "weval-crewai",
@@ -751,7 +751,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.183317"
"discovered": "2026-04-21T15:00:03.837298"
},
{
"name": "weval-plugins",
@@ -764,7 +764,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.277251"
"discovered": "2026-04-21T15:00:03.896211"
},
{
"name": "weval-radar",
@@ -777,7 +777,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.279435"
"discovered": "2026-04-21T15:00:03.911292"
},
{
"name": "weval-scrapy",
@@ -790,7 +790,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.305366"
"discovered": "2026-04-21T15:00:03.925391"
},
{
"name": "langfuse",
@@ -803,7 +803,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.461582"
"discovered": "2026-04-21T15:00:02.852309"
},
{
"name": "litellm",
@@ -816,7 +816,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.606159"
"discovered": "2026-04-21T15:00:02.859023"
},
{
"name": "mattermost-docker",
@@ -829,7 +829,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.723871"
"discovered": "2026-04-21T15:00:02.902358"
},
{
"name": "prometheus",
@@ -842,7 +842,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.055076"
"discovered": "2026-04-21T15:00:03.269652"
},
{
"name": "twenty-compose",
@@ -855,7 +855,7 @@
"has_docker": true,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.142240"
"discovered": "2026-04-21T15:00:03.772465"
},
{
"name": "weval-ux",
@@ -868,7 +868,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.335363"
"discovered": "2026-04-21T15:00:03.938236"
},
{
"name": "wevia-integrity",
@@ -881,7 +881,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.374041"
"discovered": "2026-04-21T15:00:03.961488"
},
{
"name": "DiffusionDB",
@@ -894,7 +894,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:02.973185"
"discovered": "2026-04-21T15:00:02.244817"
},
{
"name": "LTX-Video",
@@ -907,7 +907,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.123354"
"discovered": "2026-04-21T15:00:02.313417"
},
{
"name": "localai",
@@ -920,7 +920,7 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:03.608249"
"discovered": "2026-04-21T15:00:02.861061"
},
{
"name": "wevia-finetune",
@@ -933,6 +933,6 @@
"has_docker": false,
"wired": true,
"description": "",
"discovered": "2026-04-21T14:00:04.369762"
"discovered": "2026-04-21T15:00:03.959419"
}
]

View File

@@ -80,6 +80,17 @@ if (!is_array($data) || empty($data)) {
$o['category'] = $cat;
$o['wire_suggestion'] = $sug;
}
unset($o); // WAVE 207 fix PHP by-ref leak
// WAVE 207 dedup by file name (defensive)
$seen = [];
$unique = [];
foreach ($orphans as $o2) {
if (!isset($seen[$o2['file']])) {
$seen[$o2['file']] = 1;
$unique[] = $o2;
}
}
$orphans = $unique;
// Count by category
$by_cat = [];

116
api/pol.f64_nt6c.tmp Normal file
View File

@@ -0,0 +1,116 @@
<?php
/**
* Pages orphans list API V96.19
* User WTP shows "54 pages orphelines détectées. Voir la liste"
* But no API existed to return structured list with wire suggestions
*
* Endpoint: /api/pages-orphans-list.php
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
*/
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$DOCROOT = '/var/www/html';
// Read pages-index.php output if exists, else scan directly
$orphans_file = "$DOCROOT/api/orphans-json.json";
$data = @json_decode(@file_get_contents($orphans_file), true);
if (!is_array($data) || empty($data)) {
// Fallback scan: find .html files not referenced from index.html or WTP
$all_html = glob("$DOCROOT/*.html");
$referenced = [];
$anchor_files = [
'index.html', 'weval-technology-platform.html', 'wtp.html',
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
];
foreach ($anchor_files as $af) {
$af_path = "$DOCROOT/$af";
if (file_exists($af_path)) {
$content = file_get_contents($af_path);
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
foreach ($matches[1] as $m) $referenced[$m] = true;
}
}
}
$orphans = [];
foreach ($all_html as $path) {
$name = basename($path);
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
if (preg_match("/^\\./", $name)) continue; // hidden
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
if (!isset($referenced[$name])) {
$orphans[] = [
'file' => $name,
'size_bytes' => filesize($path),
'last_modified' => date('c', filemtime($path)),
'age_days' => round((time() - filemtime($path)) / 86400),
];
}
}
// Enrich with category + suggestion
$categorize = function($name) {
$n = strtolower($name);
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
return ['other', 'Manual review - may be archived'];
};
foreach ($orphans as &$o) {
list($cat, $sug) = $categorize($o['file']);
$o['category'] = $cat;
$o['wire_suggestion'] = $sug;
}
unset($o); // WAVE 207 · fix PHP reference-leak after by-ref foreach
// WAVE 207 · dedupe by file name (defensive)
$seen_files = [];
$orphans_unique = [];
foreach ($orphans as $o) {
if (!isset($seen_files[$o['file']])) {
$seen_files[$o['file']] = true;
$orphans_unique[] = $o;
}
}
$orphans = $orphans_unique;
// Count by category
$by_cat = [];
foreach ($orphans as $o) {
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
}
arsort($by_cat);
$data = [
'total_html_pages' => count($all_html),
'referenced' => count($referenced),
'orphans_count' => count($orphans),
'orphans' => $orphans,
'by_category' => $by_cat,
'scan_anchors' => $anchor_files,
];
}
$data['v'] = 'V96.19-pages-orphans-opus';
$data['ts'] = date('c');
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

116
api/pol.u2ejw4rb.tmp Normal file
View File

@@ -0,0 +1,116 @@
<?php
/**
* Pages orphans list API V96.19
* User WTP shows "54 pages orphelines détectées. Voir la liste"
* But no API existed to return structured list with wire suggestions
*
* Endpoint: /api/pages-orphans-list.php
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
*/
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$DOCROOT = '/var/www/html';
// Read pages-index.php output if exists, else scan directly
$orphans_file = "$DOCROOT/api/orphans-json.json";
$data = @json_decode(@file_get_contents($orphans_file), true);
if (!is_array($data) || empty($data)) {
// Fallback scan: find .html files not referenced from index.html or WTP
$all_html = glob("$DOCROOT/*.html");
$referenced = [];
$anchor_files = [
'index.html', 'weval-technology-platform.html', 'wtp.html',
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
];
foreach ($anchor_files as $af) {
$af_path = "$DOCROOT/$af";
if (file_exists($af_path)) {
$content = file_get_contents($af_path);
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
foreach ($matches[1] as $m) $referenced[$m] = true;
}
}
}
$orphans = [];
foreach ($all_html as $path) {
$name = basename($path);
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
if (preg_match("/^\\./", $name)) continue; // hidden
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
if (!isset($referenced[$name])) {
$orphans[] = [
'file' => $name,
'size_bytes' => filesize($path),
'last_modified' => date('c', filemtime($path)),
'age_days' => round((time() - filemtime($path)) / 86400),
];
}
}
// Enrich with category + suggestion
$categorize = function($name) {
$n = strtolower($name);
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
return ['other', 'Manual review - may be archived'];
};
foreach ($orphans as &$o) {
list($cat, $sug) = $categorize($o['file']);
$o['category'] = $cat;
$o['wire_suggestion'] = $sug;
}
unset($o); // WAVE 207 · fix PHP reference-leak after by-ref foreach
// WAVE 207 · dedupe by file name (defensive)
$seen_files = [];
$orphans_unique = [];
foreach ($orphans as $o) {
if (!isset($seen_files[$o['file']])) {
$seen_files[$o['file']] = true;
$orphans_unique[] = $o;
}
}
$orphans = $orphans_unique;
// Count by category
$by_cat = [];
foreach ($orphans as $o) {
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
}
arsort($by_cat);
$data = [
'total_html_pages' => count($all_html),
'referenced' => count($referenced),
'orphans_count' => count($orphans),
'orphans' => $orphans,
'by_category' => $by_cat,
'scan_anchors' => $anchor_files,
];
}
$data['v'] = 'V96.19-pages-orphans-opus';
$data['ts'] = date('c');
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

116
api/pol.wuom3ayj.tmp Normal file
View File

@@ -0,0 +1,116 @@
<?php
/**
* Pages orphans list API V96.19
* User WTP shows "54 pages orphelines détectées. Voir la liste"
* But no API existed to return structured list with wire suggestions
*
* Endpoint: /api/pages-orphans-list.php
* Returns: 54 orphans with category, last_modified, size, wire_suggestion
*/
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$DOCROOT = '/var/www/html';
// Read pages-index.php output if exists, else scan directly
$orphans_file = "$DOCROOT/api/orphans-json.json";
$data = @json_decode(@file_get_contents($orphans_file), true);
if (!is_array($data) || empty($data)) {
// Fallback scan: find .html files not referenced from index.html or WTP
$all_html = glob("$DOCROOT/*.html");
$referenced = [];
$anchor_files = [
'index.html', 'weval-technology-platform.html', 'wtp.html',
'admin-v2.html', 'admin.html', 'architecture.html', 'dg-command-center.html',
'enterprise-model.html', 'wevia-master.html', 'tools-hub.html', 'apps.html',
'agents-archi.html', 'nonreg.html', 'portal.html', 'portal-executive.html',
'lean6sigma-dashboard.html', 'cartographie-screens.html', 'pages-index.html',
'unified-hub.html', 'wevia-autonomy-dashboard.html', 'enterprise.html',
'ethica-hub.html', 'cloudflare-hub.html', 'huawei-cloud.html', 'orphans-hub.html', 'go-100pct.html',
'wevia-backoffice.html', 'wevia-business-visual-studio.html',
];
foreach ($anchor_files as $af) {
$af_path = "$DOCROOT/$af";
if (file_exists($af_path)) {
$content = file_get_contents($af_path);
if (preg_match_all('/href="\/?([a-z0-9_\-\xc0-\xff%]+\.html)"/iu', $content, $matches)) {
foreach ($matches[1] as $m) $referenced[$m] = true;
}
}
}
$orphans = [];
foreach ($all_html as $path) {
$name = basename($path);
// V96.21 filter out backup/gold files (legitimate archives, not real orphans)
if (preg_match("/\\.(gold|backup|bak|orig|pre-|\\.pre-|\\.GOLD-)/i", $name)) continue;
if (preg_match("/^\\./", $name)) continue; // hidden
if (preg_match("/(\\d{8}|\\d{14})\\.html$/", $name)) continue; // date-stamped backups
if (!isset($referenced[$name])) {
$orphans[] = [
'file' => $name,
'size_bytes' => filesize($path),
'last_modified' => date('c', filemtime($path)),
'age_days' => round((time() - filemtime($path)) / 86400),
];
}
}
// Enrich with category + suggestion
$categorize = function($name) {
$n = strtolower($name);
if (strpos($n, 'ethica') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'wevia') !== false) return ['ai', 'Add link in WTP Intelligence IA module'];
if (strpos($n, 'wevads') !== false) return ['marketing', 'Add link in WTP Marketing & Email module'];
if (strpos($n, 'sap') !== false || strpos($n, 'vistex') !== false) return ['erp', 'Add link in WTP ERP Integrations module'];
if (strpos($n, 'huawei') !== false || strpos($n, 'cloud') !== false) return ['cloud', 'Add link in WTP Operations & Infra module'];
if (strpos($n, 'agent') !== false) return ['ai', 'Add link in WTP Intelligence IA / RH & Talent'];
if (strpos($n, 'test') !== false || strpos($n, 'demo') !== false) return ['dev', 'Archive to /tests/ or /demos/ folder'];
if (strpos($n, 'admin') !== false || strpos($n, 'dashboard') !== false) return ['operations', 'Add to WTP Operations & Infra'];
if (strpos($n, 'security') !== false || strpos($n, 'gdpr') !== false) return ['security', 'Add to WTP Security & Compliance'];
if (strpos($n, 'consent') !== false || strpos($n, 'privacy') !== false) return ['legal', 'Link from footer legal/privacy'];
if (strpos($n, 'ia') !== false || strpos($n, '-ai') !== false) return ['ai', 'Add link in WTP Intelligence IA'];
if (strpos($n, 'landing') !== false || strpos($n, 'nearshore') !== false) return ['marketing-landing', 'Verify SEO referenced, else add to sitemap'];
return ['other', 'Manual review - may be archived'];
};
foreach ($orphans as &$o) {
list($cat, $sug) = $categorize($o['file']);
$o['category'] = $cat;
$o['wire_suggestion'] = $sug;
}
unset($o); // WAVE 207 fix PHP by-ref leak
// WAVE 207 dedup by file name (defensive)
$seen = [];
$unique = [];
foreach ($orphans as $o2) {
if (!isset($seen[$o2['file']])) {
$seen[$o2['file']] = 1;
$unique[] = $o2;
}
}
$orphans = $unique;
// Count by category
$by_cat = [];
foreach ($orphans as $o) {
$by_cat[$o['category']] = ($by_cat[$o['category']] ?? 0) + 1;
}
arsort($by_cat);
$data = [
'total_html_pages' => count($all_html),
'referenced' => count($referenced),
'orphans_count' => count($orphans),
'orphans' => $orphans,
'by_category' => $by_cat,
'scan_anchors' => $anchor_files,
];
}
$data['v'] = 'V96.19-pages-orphans-opus';
$data['ts'] = date('c');
$data['note'] = 'Scan files in /var/www/html/*.html not referenced from index/WTP. Wire suggestions provided per file.';
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

View File

@@ -0,0 +1,65 @@
<?php
/**
* intent-opus4-read_truth_registry.php
* AMBRE session · 2026-04-21
* Ferme gap autonomie : remplace LLM fallback qui hallucinait "Yacine Khaled"
* quand on demandait /api/wevia-truth-registry.json.
* Doctrine #4 ZERO FAKE DATA — retourne les scalaires du vrai registry.
* Invocation : /api/opus-arch-generic.php?tool=read_truth_registry
*/
header('Content-Type: application/json');
$candidates = [
'/var/www/html/api/wevia-truth-registry.json',
'/var/www/html/api/truth-registry.json',
'/opt/wevads/vault/wevia-truth-registry.json',
];
$path = null;
foreach ($candidates as $c) {
if (file_exists($c)) { $path = $c; break; }
}
if (!$path) {
echo json_encode(['ok'=>false, 'error'=>'truth registry not found', 'tried'=>$candidates]);
exit;
}
$raw = file_get_contents($path);
$data = json_decode($raw, true);
if (!is_array($data)) {
echo json_encode(['ok'=>false, 'error'=>'invalid JSON', 'path'=>$path]);
exit;
}
// Extract scalars (flat values) + count nested arrays
$scalars = [];
$nested = [];
foreach ($data as $k => $v) {
if (is_array($v) || is_object($v)) {
$nested[$k] = is_array($v) ? count($v) : 'object';
} else {
$scalars[$k] = $v;
}
}
// Pick the 10 most relevant headline metrics if they exist
$headlines = [];
foreach ([
'agents_count','agents_total','intents_count','tools_count','providers_count',
'skills_total','brains_count','doctrines_count','dashboards_count',
'nonreg_score','l99_score','autonomy_level','autonomy_score',
'ethica_hcps_total','pages_count','apis_count','crons_count','built_at','last_update'
] as $key) {
if (isset($data[$key]) && !is_array($data[$key])) {
$headlines[$key] = $data[$key];
}
}
echo json_encode([
'ok' => true,
'path' => $path,
'bytes' => strlen($raw),
'headlines' => $headlines,
'scalars' => $scalars,
'nested' => $nested,
'source' => 'intent-opus4-read_truth_registry.php · ambre · doctrine#4 honest · no hallucination',
], JSON_PRETTY_PRINT);

63
api/scan_file_handler.php Normal file
View File

@@ -0,0 +1,63 @@
<?php
/**
* intent-opus4-scan_file.php
* AMBRE session · 2026-04-21
* Ferme gap autonomie : remplace LLM fallback hallucination quand on demande
* l'état d'un fichier (wtp_state, wepredict_state, etc.).
* Doctrine #4 ZERO FAKE DATA — retourne uniquement les faits stat+md5+version.
* Invocation : /api/opus-arch-generic.php?tool=scan_file&path=/var/www/html/xxx.html
*/
header('Content-Type: application/json');
$target = $_GET['path'] ?? '/var/www/html/wepredict.html';
// Whitelist sécurité : ne lit que sous /var/www/html ou /opt/wevads
$real = realpath($target);
$allowed = ['/var/www/html/', '/opt/wevads/', '/opt/weval-l99/'];
$ok_root = false;
foreach ($allowed as $root) {
if ($real && strpos($real, $root) === 0) { $ok_root = true; break; }
}
if (!$ok_root) {
echo json_encode(['ok'=>false, 'error'=>'path outside allowed roots', 'path'=>$target]);
exit;
}
if (!file_exists($real)) {
echo json_encode(['ok'=>false, 'error'=>'file not found', 'path'=>$target]);
exit;
}
$stat = stat($real);
$md5 = md5_file($real);
$content = file_get_contents($real);
// Version extraction patterns (HTML, PHP, JS)
$version = 'unknown';
foreach ([
'/data-version="([^"]+)"/',
'/"wevia-version"\s+content="([^"]+)"/',
'/@version\s+([^\s\*]+)/',
'/VERSION\s*=\s*[\'"]([^\'"]+)/',
] as $pat) {
if (preg_match($pat, $content, $m)) { $version = $m[1]; break; }
}
// Detect live URL if under /var/www/html
$url = null;
if (strpos($real, '/var/www/html/') === 0) {
$rel = substr($real, strlen('/var/www/html/'));
$url = 'https://weval-consulting.com/' . $rel;
}
echo json_encode([
'ok' => true,
'path' => $real,
'url' => $url,
'size' => $stat['size'],
'size_kb' => round($stat['size'] / 1024, 1),
'mtime' => date('c', $stat['mtime']),
'md5' => $md5,
'version' => $version,
'lines' => substr_count($content, "\n"),
'source' => 'intent-opus4-scan_file.php · ambre · doctrine#4 honest',
], JSON_PRETTY_PRINT);

View File

@@ -33,4 +33,4 @@ if (!$path) {
// Delegate to scan_file with extracted path
$_GET['path'] = $path;
include __DIR__ . '/wired-pending/intent-opus4-scan_file.php';
include __DIR__ . '/scan_file_handler.php';

View File

@@ -1,5 +1,5 @@
{
"timestamp": "2026-04-21T14:30:12",
"timestamp": "2026-04-21T15:30:11",
"features": {
"total": 36,
"pass": 35
@@ -13,7 +13,7 @@
"score": 97.2,
"log": [
"=== UX AGENT v1.0 ===",
"Time: 2026-04-21 14:30:02",
"Time: 2026-04-21 15:30:02",
" core: 4/4",
" layout: 3/4",
" interaction: 6/6",

View File

@@ -0,0 +1,29 @@
<?php
return [
'name' => 'v79_pages_registry',
'triggers' => [
'pages index',
'referentiel pages',
'referentiel des pages',
'ou sont les pages',
'ou sont les orphelins',
'combien d orphelins',
'orphelins pages',
'audit orphelins',
'toutes les pages',
'liste des pages',
'index pages',
'relie toutes les pages',
'archi des pages',
'v79',
'pages registry',
'tous les hubs',
'liste des hubs',
'combien de hubs',
],
'cmd' => "echo '=== V79 PAGES REGISTRY · référentiel unifié ===' && curl -sk --max-time 3 'http://127.0.0.1:5890/api/wevia-pages-registry.php?action=summary' -H 'Host: weval-consulting.com' 2>/dev/null && echo && echo '=== Index navigable: https://weval-consulting.com/pages-index.html ==='",
'status' => 'EXECUTED',
'created_at' => '2026-04-19T14:37:00+00:00',
'source' => 'opus-yacine-v79',
'description' => 'Référentiel unifié de toutes les pages avec détection orphelins et index navigable'
];

View File

@@ -0,0 +1,24 @@
<?php
return [
'name' => 'v81_rescue_orphelins',
'triggers' => [
'rescue orphelins',
'rescuer les orphelins',
'sauver les orphelins',
'orphelins par classe',
'liste orphelins detaillee',
'v81',
'comment relier orphelins',
'ou rescuer orphelins',
'orphelins sauvetage',
'open drawer archi',
'archi complete',
'drawer wtp',
'wtp drawer',
],
'cmd' => 'bash /var/www/html/api/v76-scripts/v81-orphans-rescue.sh',
'status' => 'EXECUTED',
'created_at' => '2026-04-19T17:10:00+00:00',
'source' => 'opus-yacine-v81',
'description' => 'Liste orphelins par classe + accès rescue depuis WTP drawer',
];

24
api/v82_point_entree.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
return [
'name' => 'v82_point_entree',
'triggers' => [
'point d entree',
'ou est le point d entree',
'par ou commencer',
'ou je clique',
'je me perds',
'commence par ou',
'ou est tout',
'point entree unique',
'wtp point entree',
'acces archi',
'comment naviguer',
'ou trouver tout',
'v82 consolidator',
],
'cmd' => 'bash /var/www/html/api/v76-scripts/v82-point-entree.sh',
'status' => 'EXECUTED',
'created_at' => '2026-04-19T17:20:00+00:00',
'source' => 'opus-yacine-v82',
'description' => 'WTP = point entrée UNIQUE · explique accès drawer + sidebar + chat',
];

View File

@@ -1,12 +1,12 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-21T12:37:22+00:00",
"ts": "2026-04-21T13:40:17+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,
"ok": 41,
"warn": 20,
"ok": 42,
"warn": 19,
"fail": 0,
"wire_needed": 3,
"data_completeness_pct": 95.3

View File

@@ -0,0 +1,24 @@
<?php
return [
'name' => 'v83_autonomie_status',
'triggers' => [
'autonomie status',
'statut autonomie',
'etat autonomie',
'ou en est autonomie',
'verif deploiements',
'v91 v92 v93 statut',
'audit reel autonomie',
'autonomie reelle',
'quoi de neuf autonomie',
'combien autonomie',
'score autonomie',
'v83 hub',
'autonomie wevia',
],
'cmd' => 'bash /var/www/html/api/v76-scripts/v83-autonomie-status.sh',
'status' => 'EXECUTED',
'created_at' => '2026-04-19T17:30:00+00:00',
'source' => 'opus-yacine-v83',
'description' => 'Teste live V91 Safe Write + V92/V93 Decisions + D93 KPI + V81 feed + V84 cron',
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1,312 @@
{
"ts": "20260421-152121",
"pages_tested": 30,
"pages_ok": 29,
"pages_with_overlaps": 1,
"pages_error": 0,
"total_overlaps": 1,
"total_x_buttons": 148,
"doctrine_loaded_count": 30,
"results": [
{
"name": "wevia-erp-unified",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "WEVIA ERP \u00b7 Source unique v\u00e9rit\u00e9 \u00b7 Tableau bord premium",
"bodyLen": 4166
},
{
"name": "wepredict",
"http": 200,
"fixed": 2,
"overlaps": 0,
"xBtns": 64,
"doctrine": true,
"title": "WePredict Cockpit \u00b7 V146 \u00b7 WEVAL ecosystem",
"bodyLen": 9397
},
{
"name": "weval-technology-platform",
"http": 200,
"fixed": 6,
"overlaps": 1,
"xBtns": 4,
"doctrine": true,
"title": "WEVAL Technology Platform \u2014 All-in-One ERP Portal",
"bodyLen": 15931
},
{
"name": "wevia-master",
"http": 200,
"fixed": 1,
"overlaps": 0,
"xBtns": 1,
"doctrine": true,
"title": "WEVIA Master AI",
"bodyLen": 974
},
{
"name": "all-ia-hub",
"http": 200,
"fixed": 2,
"overlaps": 0,
"xBtns": 0,
"doctrine": true,
"title": "All-IA Hub \u2014 Remplacement Claude Code + Opus (Souverain)",
"bodyLen": 902
},
{
"name": "wevia-orchestrator",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 1,
"doctrine": true,
"title": "WEVIA \u2014 Orchestrator GODMODE",
"bodyLen": 36233
},
{
"name": "wevcode",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "WEVCODE \u2014 Sovereign Coding Agent",
"bodyLen": 436
},
{
"name": "wevia-unified-hub",
"http": 200,
"fixed": 4,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "WEVIA Unified Hub v2 \u00b7 tout d\u00e9dupliqu\u00e9",
"bodyLen": 1934
},
{
"name": "wevia-training",
"http": 200,
"fixed": 5,
"overlaps": 0,
"xBtns": 5,
"doctrine": true,
"title": "WEVIA Master Control Center \u2014 Training Auto + Brain Monitor",
"bodyLen": 2892
},
{
"name": "wiki",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "WEVIA \u2014 Wiki",
"bodyLen": 32181
},
{
"name": "cartographie-screens",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 1,
"doctrine": true,
"title": "WEVADS Cartographie Exhaustive Ecrans - 3914",
"bodyLen": 25625
},
{
"name": "orphans-hub",
"http": 200,
"fixed": 4,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "\ud83d\udcc7 Orphans Hub \u00b7 All pages wired",
"bodyLen": 9675
},
{
"name": "admin",
"http": 200,
"fixed": 5,
"overlaps": 0,
"xBtns": 4,
"doctrine": true,
"title": "WEVAL Admin",
"bodyLen": 8067
},
{
"name": "agents-archi",
"http": 200,
"fixed": 12,
"overlaps": 0,
"xBtns": 12,
"doctrine": true,
"title": "WEVIA \u2014 Architecture Agents IA 3D",
"bodyLen": 3649
},
{
"name": "director-center",
"http": 200,
"fixed": 5,
"overlaps": 0,
"xBtns": 6,
"doctrine": true,
"title": "WEVIA Director \u2014 Autonomous Center",
"bodyLen": 2131
},
{
"name": "tools-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "WEVAL Tools Hub \u2014 \u00c9cosyst\u00e8me Souverain",
"bodyLen": 11188
},
{
"name": "enterprise-model",
"http": 200,
"fixed": 5,
"overlaps": 0,
"xBtns": 6,
"doctrine": true,
"title": "WEVAL Enterprise Model",
"bodyLen": 512
},
{
"name": "wevia-backoffice",
"http": 200,
"fixed": 2,
"overlaps": 0,
"xBtns": 1,
"doctrine": true,
"title": "WEVAL \u00b7 WEVIA Backoffice",
"bodyLen": 206
},
{
"name": "dg-command-center",
"http": 200,
"fixed": 2,
"overlaps": 0,
"xBtns": 1,
"doctrine": true,
"title": "WEVAL \u00b7 DG Command Center \u2014 Real-time Pilotage",
"bodyLen": 4371
},
{
"name": "dmaic-tracker-NEW",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "DMAIC Tracker NEW \u2014 WEVAL Lean 6\u03c3",
"bodyLen": 1271
},
{
"name": "ethica-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "Ethica Hub \u2014 WEVAL",
"bodyLen": 2985
},
{
"name": "wevads-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "WEVADS Hub \u2014 WEVAL",
"bodyLen": 808
},
{
"name": "agents-hub",
"http": 200,
"fixed": 4,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "Agents Hub \u2014 WEVAL",
"bodyLen": 959
},
{
"name": "email-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "Email MTA Hub \u2014 WEVAL",
"bodyLen": 1918
},
{
"name": "anthropic-hub",
"http": 200,
"fixed": 4,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "Anthropic Hub \u2014 WEVAL",
"bodyLen": 627
},
{
"name": "cloudflare-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "Cloudflare Hub \u2014 WEVAL",
"bodyLen": 2041
},
{
"name": "office-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "Office 365 Hub \u2014 WEVAL",
"bodyLen": 2162
},
{
"name": "gpu-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 2,
"doctrine": true,
"title": "GPU Free Hub \u2014 WEVAL",
"bodyLen": 2245
},
{
"name": "monitoring-hub",
"http": 200,
"fixed": 3,
"overlaps": 0,
"xBtns": 3,
"doctrine": true,
"title": "Monitoring Hub \u2014 WEVAL",
"bodyLen": 1948
},
{
"name": "security-hub",
"http": 200,
"fixed": 4,
"overlaps": 0,
"xBtns": 4,
"doctrine": true,
"title": "Security Hub \u2014 WEVAL",
"bodyLen": 944
}
]
}

View File

@@ -0,0 +1,178 @@
{
"ts": "20260421-150832",
"results": [
{
"name": "wevia-erp-unified",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 2,
"doctrine": true
},
{
"name": "wepredict",
"http": 200,
"fixed": 2,
"overlaps": [],
"x_buttons": 64,
"doctrine": true
},
{
"name": "weval-technology-platform",
"http": 200,
"fixed": 6,
"overlaps": [
{
"a": "v80-drawer",
"b": "v80-header"
}
],
"x_buttons": 4,
"doctrine": true
},
{
"name": "wevia-master",
"http": 200,
"fixed": 1,
"overlaps": [],
"x_buttons": 1,
"doctrine": true
},
{
"name": "all-ia-hub",
"http": 200,
"fixed": 2,
"overlaps": [],
"x_buttons": 0,
"doctrine": true
},
{
"name": "wevia-orchestrator",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 1,
"doctrine": true
},
{
"name": "wevcode",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 2,
"doctrine": true
},
{
"name": "wevia-unified-hub",
"http": 200,
"fixed": 4,
"overlaps": [],
"x_buttons": 2,
"doctrine": true
},
{
"name": "wevia-training",
"http": 200,
"fixed": 5,
"overlaps": [],
"x_buttons": 5,
"doctrine": true
},
{
"name": "wiki",
"http": 200,
"fixed": 4,
"overlaps": [
{
"a": "wtp-carto-banner",
"b": "opus-honest-badge"
}
],
"x_buttons": 0,
"doctrine": false
},
{
"name": "cartographie-screens",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 1,
"doctrine": true
},
{
"name": "orphans-hub",
"http": 200,
"fixed": 4,
"overlaps": [],
"x_buttons": 3,
"doctrine": true
},
{
"name": "admin",
"http": 200,
"fixed": 5,
"overlaps": [],
"x_buttons": 4,
"doctrine": true
},
{
"name": "agents-archi",
"http": 200,
"fixed": 13,
"overlaps": [],
"x_buttons": 12,
"doctrine": true
},
{
"name": "director-center",
"http": 200,
"fixed": 5,
"overlaps": [],
"x_buttons": 6,
"doctrine": true
},
{
"name": "tools-hub",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 3,
"doctrine": true
},
{
"name": "enterprise-model",
"http": 200,
"fixed": 5,
"overlaps": [],
"x_buttons": 6,
"doctrine": true
},
{
"name": "wevia-backoffice",
"http": 200,
"fixed": 2,
"overlaps": [],
"x_buttons": 1,
"doctrine": true
},
{
"name": "dg-command-center",
"http": 200,
"fixed": 2,
"overlaps": [],
"x_buttons": 1,
"doctrine": true
},
{
"name": "dmaic-tracker-NEW",
"http": 200,
"fixed": 3,
"overlaps": [],
"x_buttons": 2,
"doctrine": true
}
],
"total_overlaps": 2,
"pages_ok": 18,
"total_x_buttons": 120
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -0,0 +1,485 @@
{
"ts": "20260421-144621",
"out_dir": "/var/www/html/api/v_opus_overlap_20260421-144621",
"results": [
{
"name": "wepredict",
"url": "https://weval-consulting.com/wepredict.html",
"http": 200,
"fixed_count": 2,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "NAV",
"id": "",
"cls": "xnav",
"text": "\u2190 WTP\n /\n All-IA\n /\n Arena\n /\n WEV",
"x": 0,
"y": 0,
"w": 1920,
"h": 64,
"zIndex": "50",
"position": "sticky"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 74,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
}
]
},
{
"name": "wtp",
"url": "https://weval-consulting.com/weval-technology-platform.html",
"error": "Page.goto: Timeout 25000ms exceeded.\nCall log:\n - navigating to \"https://weval-consulting.com/weval-technology-platform.html\", waiting until \"network"
},
{
"name": "master",
"url": "https://weval-consulting.com/wevia-master.html",
"http": 200,
"fixed_count": 1,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "DIV",
"id": "opus-xlinks",
"cls": "",
"text": "WTP\n IA Hub\n Orch\n WevCode\n Arena\n\n ",
"x": 1528,
"y": 12,
"w": 380,
"h": 58,
"zIndex": "9998",
"position": "fixed"
}
]
},
{
"name": "all-ia-hub",
"url": "https://weval-consulting.com/all-ia-hub.html",
"http": 200,
"fixed_count": 2,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "A",
"id": "opus-droid-link",
"cls": "",
"text": "Droid",
"x": 1834,
"y": 1030,
"w": 66,
"h": 30,
"zIndex": "9997",
"position": "fixed"
},
{
"tag": "DIV",
"id": "v142-footer",
"cls": "",
"text": "A+ 100%\n L99 304/304\n Tools 158\n Dock",
"x": 0,
"y": 1062,
"w": 1920,
"h": 18,
"zIndex": "40",
"position": "fixed"
}
]
},
{
"name": "orchestrator",
"url": "https://weval-consulting.com/wevia-orchestrator.html",
"http": 200,
"fixed_count": 3,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 78,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "A",
"id": "opus-droid-link",
"cls": "",
"text": "Droid",
"x": 1839,
"y": 1029,
"w": 61,
"h": 31,
"zIndex": "9997",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtp-udock",
"cls": "",
"text": "WTPIA HubMasterOrchWevCodeArenaDroidAdmi",
"x": 1488,
"y": 12,
"w": 420,
"h": 56,
"zIndex": "9998",
"position": "fixed"
}
]
},
{
"name": "training",
"url": "https://weval-consulting.com/wevia-training.html",
"http": 200,
"fixed_count": 6,
"overlaps_count": 1,
"overlaps": [
{
"a": "wtpEnrichBanner",
"b": "opus-honest-badge",
"overlap_area": 2388,
"ratio": "1.00"
}
],
"fixed_preview": [
{
"tag": "DIV",
"id": "",
"cls": "topbar",
"text": "WEVIA Master Control CenterV77 \u00b7 Trainin",
"x": 0,
"y": 0,
"w": 1920,
"h": 107,
"zIndex": "100",
"position": "sticky"
},
{
"tag": "DIV",
"id": "wtpGapFillBanner",
"cls": "wtp-gapfill-banner",
"text": "\ud83c\udfaf WEVAL Agents Gap-Fill ERP\n23 gaps\nSAP",
"x": 0,
"y": 1038,
"w": 1920,
"h": 42,
"zIndex": "99999",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtpEnrichBanner",
"cls": "wtp-enrich-banner",
"text": "\ud83c\udfdb\ufe0f Enterprise Model 16 depts\n \ud83c\udd95 Meeti",
"x": 0,
"y": 1090,
"w": 1908,
"h": 20,
"zIndex": "9999",
"position": "fixed"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 190,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtp-udock",
"cls": "",
"text": "WTPIA HubMasterOrchWevCodeArenaDroidAdmi",
"x": 1488,
"y": 117,
"w": 420,
"h": 63,
"zIndex": "9998",
"position": "fixed"
},
{
"tag": "DIV",
"id": "opus-honest-badge",
"cls": "",
"text": "\u2713 NR 199/201 \u00b7 not-6sigma live\u00d7",
"x": 1709,
"y": 1090,
"w": 199,
"h": 12,
"zIndex": "99993",
"position": "fixed"
}
]
},
{
"name": "wiki",
"url": "https://weval-consulting.com/wiki.html",
"http": 200,
"fixed_count": 3,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "DIV",
"id": "",
"cls": "",
"text": "\ud83d\uddfa Cartographie live\n511 UP / 0 Lent / 0",
"x": 1036,
"y": 53,
"w": 864,
"h": 1007,
"zIndex": "9999",
"position": "fixed"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 10,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "DIV",
"id": "opus-honest-badge",
"cls": "",
"text": "\u2713 NR 199/201 \u00b7 not-6sigma live\u00d7",
"x": 1709,
"y": 1070,
"w": 199,
"h": 12,
"zIndex": "99993",
"position": "fixed"
}
]
},
{
"name": "unified-hub",
"url": "https://weval-consulting.com/wevia-unified-hub.html",
"http": 200,
"fixed_count": 4,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "ASIDE",
"id": "",
"cls": "sidebar",
"text": "\ud83c\udfe0 ERP Pivots\n \n \ud83c\udfe0 WTP\n \ud83c\udf08",
"x": 0,
"y": 0,
"w": 240,
"h": 1080,
"zIndex": "auto",
"position": "sticky"
},
{
"tag": "A",
"id": "opus-droid-link",
"cls": "",
"text": "Droid",
"x": 1839,
"y": 1026,
"w": 61,
"h": 34,
"zIndex": "9997",
"position": "fixed"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 85,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtp-udock",
"cls": "",
"text": "WTPIA HubMasterOrchWevCodeArenaDroidAdmi",
"x": 1488,
"y": 12,
"w": 420,
"h": 63,
"zIndex": "9998",
"position": "fixed"
}
]
},
{
"name": "cartographie",
"url": "https://weval-consulting.com/cartographie-screens.html",
"http": 200,
"fixed_count": 3,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "BUTTON",
"id": "",
"cls": "preview-toggle",
"text": "Previews: ON",
"x": 16,
"y": 16,
"w": 103,
"h": 28,
"zIndex": "1000",
"position": "fixed"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 85,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtp-udock",
"cls": "",
"text": "WTPIA HubMasterOrchWevCodeArenaDroidAdmi",
"x": 1488,
"y": 12,
"w": 420,
"h": 63,
"zIndex": "9998",
"position": "fixed"
}
]
},
{
"name": "orphans-hub",
"url": "https://weval-consulting.com/orphans-hub.html",
"http": 200,
"fixed_count": 4,
"overlaps_count": 0,
"overlaps": [],
"fixed_preview": [
{
"tag": "DIV",
"id": "orphans-premium-toolbar",
"cls": "",
"text": "248 pages\n \n ToutWEVIA & IAOpsBusiness",
"x": 260,
"y": 30,
"w": 1400,
"h": 59,
"zIndex": "9000",
"position": "sticky"
},
{
"tag": "DIV",
"id": "",
"cls": "",
"text": "\ud83d\udd2e WePredict\u00d7",
"x": 1797,
"y": 980,
"w": 103,
"h": 30,
"zIndex": "9997",
"position": "fixed"
},
{
"tag": "A",
"id": "weval-gl",
"cls": "",
"text": "Logout",
"x": 1848,
"y": 78,
"w": 60,
"h": 25,
"zIndex": "99990",
"position": "fixed"
},
{
"tag": "DIV",
"id": "wtp-udock",
"cls": "",
"text": "WTPIA HubMasterOrchWevCodeArenaDroidAdmi",
"x": 1488,
"y": 99,
"w": 420,
"h": 57,
"zIndex": "9998",
"position": "fixed"
}
]
}
],
"videos": [
"16d53400609be8e81038ee49d7ba254f.webm",
"19063ce98f8bcd78ad77808ab4692f30.webm",
"37f086e86ed3836e523527596aaf74e1.webm",
"3b933fd3e8f4b656d3f2c43344e4eae7.webm",
"82f281972dde42cf79bd168d9ae1f27c.webm",
"84d278138814697a6be956e2e65c544b.webm",
"940057562877f4db9284191411190d78.webm",
"9a891a82e957277d8a742630667f0a62.webm",
"a4ec1672aa54ae8b977f7895e3192985.webm",
"ac3ea8750633fc56549e1e5d136396aa.webm"
],
"screenshots": [
"all-ia-hub_01_normal.png",
"all-ia-hub_02_topright.png",
"all-ia-hub_03_botleft.png",
"cartographie_01_normal.png",
"cartographie_02_topright.png",
"cartographie_03_botleft.png",
"master_01_normal.png",
"master_02_topright.png",
"master_03_botleft.png",
"orchestrator_01_normal.png",
"orchestrator_02_topright.png",
"orchestrator_03_botleft.png",
"orphans-hub_01_normal.png",
"orphans-hub_02_topright.png",
"orphans-hub_03_botleft.png",
"training_01_normal.png",
"training_02_topright.png",
"training_03_botleft.png",
"unified-hub_01_normal.png",
"unified-hub_02_topright.png",
"unified-hub_03_botleft.png",
"wepredict_01_normal.png",
"wepredict_02_topright.png",
"wepredict_03_botleft.png",
"wiki_01_normal.png",
"wiki_02_topright.png",
"wiki_03_botleft.png"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Some files were not shown because too many files have changed in this diff Show More