auto(enrich): paperclip-hub doctrine 60 via cascade async
66
api/batch-enrich-async.sh
Executable file
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
# Doctrine 169: Cron batch async enrichment - traite 1 page à la fois en fond
|
||||
# Evite les 502 (pas de charge sur CX endpoint)
|
||||
# Reprend où il s'est arrêté (idempotent via marker DOCTRINE-60-UX-ENRICH)
|
||||
|
||||
LOG=/var/log/batch-enrich-async.log
|
||||
QUEUE_FILE=/tmp/ux-enrich-queue.txt
|
||||
|
||||
# Build queue si inexistante
|
||||
if [ ! -f "$QUEUE_FILE" ]; then
|
||||
cat > "$QUEUE_FILE" << 'EOF'
|
||||
infra-monitor
|
||||
n8n-hub
|
||||
paperclip-hub
|
||||
qdrant-hub
|
||||
hetzner-hub
|
||||
docker-hub
|
||||
github-hub
|
||||
blade-center
|
||||
token-health-dashboard
|
||||
learning-dashboard
|
||||
cyber-monitor
|
||||
dormant-dashboard-v2
|
||||
huggingface-hub
|
||||
deepseek-hub
|
||||
universal-integration-hub
|
||||
qa-hub
|
||||
wevia-ops-hub
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Lock (1 instance max)
|
||||
LOCK=/tmp/batch-enrich.lock
|
||||
[ -f "$LOCK" ] && exit 0
|
||||
touch "$LOCK"
|
||||
trap "rm -f $LOCK" EXIT
|
||||
|
||||
# Take first non-enriched from queue
|
||||
NEXT=""
|
||||
while IFS= read -r HUB; do
|
||||
[ -z "$HUB" ] && continue
|
||||
F="/var/www/html/${HUB}.html"
|
||||
if [ -f "$F" ] && ! grep -q "DOCTRINE-60-UX-ENRICH" "$F" 2>/dev/null; then
|
||||
NEXT="$HUB"
|
||||
break
|
||||
fi
|
||||
done < "$QUEUE_FILE"
|
||||
|
||||
if [ -z "$NEXT" ]; then
|
||||
echo "$(date -Iseconds) ALL_DONE" >> "$LOG"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Execute cascade
|
||||
echo "$(date -Iseconds) START $NEXT" >> "$LOG"
|
||||
RESULT=$(/var/www/html/api/enrich-hub-cascade.sh "$NEXT" 2>&1 | tail -1)
|
||||
echo "$(date -Iseconds) $NEXT → $RESULT" >> "$LOG"
|
||||
|
||||
# Auto-commit si enriched
|
||||
if echo "$RESULT" | grep -q '"ok":true'; then
|
||||
cd /var/www/html
|
||||
sudo -u www-data git add -A >> "$LOG" 2>&1
|
||||
sudo -u www-data git commit -m "auto(enrich): $NEXT doctrine 60 via cascade async" >> "$LOG" 2>&1 || true
|
||||
fi
|
||||
|
||||
echo "$(date -Iseconds) END $NEXT" >> "$LOG"
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-24T11:00:03.217950",
|
||||
"generated_at": "2026-04-24T11:05:01.921500",
|
||||
"stats": {
|
||||
"total": 50,
|
||||
"pending": 24,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-24T09:01:31+00:00",
|
||||
"ts": "2026-04-24T09:05:47+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
"ok": 63,
|
||||
"warn": 1,
|
||||
"ok": 64,
|
||||
"warn": 0,
|
||||
"fail": 0,
|
||||
"wire_needed": 0,
|
||||
"data_completeness_pct": 100
|
||||
|
||||
@@ -12,7 +12,47 @@ h1{color:#06b6d4;font-size:32px;margin-bottom:10px}
|
||||
.metric{font-size:28px;font-weight:900;color:#10b981}
|
||||
.label{color:#94a3b8;font-size:12px;margin-top:4px}
|
||||
.ok{color:#10b981}.warn{color:#f59e0b}.err{color:#ef4444}
|
||||
</style></head>
|
||||
</style><!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-110246 --><style id="doctrine60-ux-infra-monitor">
|
||||
body::before {
|
||||
content: '';
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: radial-gradient(ellipse at center, rgba(0,0,0,0.12) 0%, rgba(0,0,0,0) 70%);
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.card, .btn, .kpi, .panel {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.enter-stagger {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.6; }
|
||||
}
|
||||
.pulse, .active, .live-indicator, .online {
|
||||
animation: pulse 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.modal, .chat, .speech, .overlay {
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>🖥️ WEVIA Infrastructure Monitor</h1>
|
||||
<div class="subtitle">Sovereign AI platform real-time health</div>
|
||||
@@ -110,4 +150,18 @@ load();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>
|
||||
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-infra-monitor">
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry, index) => {
|
||||
if (entry.isIntersecting) {
|
||||
setTimeout(() => {
|
||||
entry.target.classList.add('enter-stagger');
|
||||
}, index * 80);
|
||||
}
|
||||
});
|
||||
}, { threshold: 0.1 });
|
||||
|
||||
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => observer.observe(el));
|
||||
|
||||
</script>
|
||||
</body></html>
|
||||
56
n8n-hub.html
@@ -9,7 +9,47 @@
|
||||
.card:hover{border-color:#ff6d5a;transform:translateY(-2px)}
|
||||
.card h3{color:#ff6d5a;margin-bottom:6px;font-size:15px}.card p{color:#94a3b8;font-size:12px;line-height:1.4}
|
||||
.dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#22c55e;margin-right:4px}
|
||||
</style></head><body>
|
||||
</style><!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-110343 --><style id="doctrine60-ux-n8n-hub">
|
||||
body::before {
|
||||
content: '';
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: radial-gradient(ellipse at center, rgba(0,0,0,0.12) 0%, rgba(0,0,0,0) 70%);
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.card, .btn, .kpi, .panel {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.enter-stagger {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.6; }
|
||||
}
|
||||
.pulse, .active, .live-indicator, .online {
|
||||
animation: pulse 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.modal, .chat, .speech, .overlay {
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
</style>
|
||||
</head><body>
|
||||
<div class="hdr"><h1>⚡ WEVIA n8n Hub</h1><span class="badge">SOVEREIGN</span></div>
|
||||
<div class="grid"><div class="card"><h3><span class="dot"></span>Workflows</h3><p>5 workflows automatisés</p></div><div class="card"><h3><span class="dot"></span>Triggers</h3><p>Webhooks, cron, events</p></div><div class="card"><h3><span class="dot"></span>Integrations</h3><p>Email, Slack, API custom</p></div><div class="card"><h3><span class="dot"></span>Monitoring</h3><p>Uptime Kuma intégré</p></div></div>
|
||||
<div style="padding:20px;text-align:center;color:#475569;font-size:11px">WEVIA {title} Hub — Sovereign Infrastructure</div>
|
||||
@@ -101,4 +141,18 @@
|
||||
<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>
|
||||
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-n8n-hub">
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry, index) => {
|
||||
if (entry.isIntersecting) {
|
||||
setTimeout(() => {
|
||||
entry.target.classList.add('enter-stagger');
|
||||
}, index * 80);
|
||||
}
|
||||
});
|
||||
}, { threshold: 0.1 });
|
||||
|
||||
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => observer.observe(el));
|
||||
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -9,7 +9,47 @@
|
||||
.card:hover{border-color:#f59e0b;transform:translateY(-2px)}
|
||||
.card h3{color:#f59e0b;margin-bottom:6px;font-size:15px}.card p{color:#94a3b8;font-size:12px;line-height:1.4}
|
||||
.dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#22c55e;margin-right:4px}
|
||||
</style></head><body>
|
||||
</style><!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-110734 --><style id="doctrine60-ux-paperclip-hub">
|
||||
body::before {
|
||||
content: '';
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: radial-gradient(circle, rgba(0,0,0,0.12), transparent 70%);
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.card, .btn, .kpi, .panel {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.enter-stagger {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.6; }
|
||||
}
|
||||
.pulse, .active, .live-indicator, .online {
|
||||
animation: pulse 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.modal, .chat, .speech, .overlay {
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
</style>
|
||||
</head><body>
|
||||
<div class="hdr"><h1>📎 WEVIA Paperclip Hub</h1><span class="badge">SOVEREIGN</span></div>
|
||||
<div class="grid"><div class="card"><h3><span class="dot"></span>669 Agents Fleet</h3><p>Task management autonome</p></div><div class="card"><h3><span class="dot"></span>11 Projets</h3><p>WEVIA Router, L99, Ethica...</p></div><div class="card"><h3><span class="dot"></span>902 Skills</h3><p>Compétences injectées</p></div><div class="card"><h3><span class="dot"></span>Auto-Run</h3><p>Cron trigger */4h</p></div></div>
|
||||
<div style="padding:20px;text-align:center;color:#475569;font-size:11px">WEVIA {title} Hub — Sovereign Infrastructure</div>
|
||||
@@ -101,4 +141,20 @@
|
||||
<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>
|
||||
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-paperclip-hub">
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry, index) => {
|
||||
if (entry.isIntersecting) {
|
||||
setTimeout(() => {
|
||||
entry.target.classList.add('enter-stagger');
|
||||
}, index * 80);
|
||||
}
|
||||
});
|
||||
}, { threshold: 0.1 });
|
||||
|
||||
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => {
|
||||
observer.observe(el);
|
||||
});
|
||||
|
||||
</script>
|
||||
</body></html>
|
||||
BIN
proofs/overlap-advisor.png
Normal file
|
After Width: | Height: | Size: 3.6 MiB |
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1005 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 977 KiB After Width: | Height: | Size: 978 KiB |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"wave": 305,
|
||||
"timestamp": "2026-04-24T09:01:48.875Z",
|
||||
"timestamp": "2026-04-24T09:03:55.898Z",
|
||||
"hubs": [
|
||||
{
|
||||
"hub": "paperclip-dashboard.html",
|
||||
@@ -23,71 +23,61 @@
|
||||
},
|
||||
"has_gemini_v2": true
|
||||
},
|
||||
"artifacts": {},
|
||||
"artifacts": {
|
||||
"screenshot": "/proofs/playwright-gemini-v5-w305/paperclip-dashboard_html.png",
|
||||
"hover": "/proofs/playwright-gemini-v5-w305/paperclip-dashboard_html_hover.png",
|
||||
"video": "/proofs/playwright-gemini-v5-w305/paperclip-dashboard_html.webm"
|
||||
},
|
||||
"http_status": 200,
|
||||
"status": "ERROR",
|
||||
"error": "page.screenshot: Timeout 30000ms exceeded.\nCall log:\n - taking page screenshot\n - waiting for fonts to load...\n - fonts loaded\n"
|
||||
"status": "PASS"
|
||||
},
|
||||
{
|
||||
"hub": "deerflow-hub.html",
|
||||
"url": "https://weval-consulting.com/deerflow-hub.html",
|
||||
"auth_required": false,
|
||||
"checks": {},
|
||||
"artifacts": {},
|
||||
"status": "ERROR",
|
||||
"error": "page.goto: Timeout 25000ms exceeded.\nCall log:\n - navigating to \"https://weval-consulting.com/deerflow-hub.html?cb=1777021357515\", waiting until \"domcontentloaded\"\n"
|
||||
"checks": {
|
||||
"overlap": {
|
||||
"top_right_count": 0,
|
||||
"bottom_right_count": 0,
|
||||
"top_right": [],
|
||||
"bottom_right": []
|
||||
},
|
||||
"no_overlap_tr": true,
|
||||
"no_overlap_br": true,
|
||||
"gemini_markers": {
|
||||
"geEntrance": true,
|
||||
"gePulse": true,
|
||||
"geAmbient": true,
|
||||
"geShimmer": true
|
||||
},
|
||||
"has_gemini_v2": true
|
||||
},
|
||||
"artifacts": {
|
||||
"screenshot": "/proofs/playwright-gemini-v5-w305/deerflow-hub_html.png",
|
||||
"hover": "/proofs/playwright-gemini-v5-w305/deerflow-hub_html_hover.png",
|
||||
"video": "/proofs/playwright-gemini-v5-w305/deerflow-hub_html.webm"
|
||||
},
|
||||
"http_status": 200,
|
||||
"status": "PASS"
|
||||
},
|
||||
{
|
||||
"hub": "ai-hub.html",
|
||||
"url": "https://weval-consulting.com/ai-hub.html",
|
||||
"auth_required": false,
|
||||
"checks": {
|
||||
"overlap": {
|
||||
"top_right_count": 0,
|
||||
"bottom_right_count": 0,
|
||||
"top_right": [],
|
||||
"bottom_right": []
|
||||
},
|
||||
"no_overlap_tr": true,
|
||||
"no_overlap_br": true,
|
||||
"gemini_markers": {
|
||||
"geEntrance": true,
|
||||
"gePulse": true,
|
||||
"geAmbient": true,
|
||||
"geShimmer": true
|
||||
},
|
||||
"has_gemini_v2": true
|
||||
},
|
||||
"checks": {},
|
||||
"artifacts": {},
|
||||
"http_status": 200,
|
||||
"status": "ERROR",
|
||||
"error": "page.screenshot: Timeout 30000ms exceeded.\nCall log:\n - taking page screenshot\n - waiting for fonts to load...\n - fonts loaded\n"
|
||||
"error": "page.waitForTimeout: Target page, context or browser has been closed"
|
||||
},
|
||||
{
|
||||
"hub": "wevia-multiagent-dashboard.html",
|
||||
"url": "https://weval-consulting.com/wevia-multiagent-dashboard.html",
|
||||
"auth_required": false,
|
||||
"checks": {
|
||||
"overlap": {
|
||||
"top_right_count": 0,
|
||||
"bottom_right_count": 0,
|
||||
"top_right": [],
|
||||
"bottom_right": []
|
||||
},
|
||||
"no_overlap_tr": true,
|
||||
"no_overlap_br": true,
|
||||
"gemini_markers": {
|
||||
"geEntrance": true,
|
||||
"gePulse": true,
|
||||
"geAmbient": true,
|
||||
"geShimmer": true
|
||||
},
|
||||
"has_gemini_v2": true
|
||||
},
|
||||
"checks": {},
|
||||
"artifacts": {},
|
||||
"http_status": 200,
|
||||
"status": "ERROR",
|
||||
"error": "page.screenshot: Target page, context or browser has been closed\nCall log:\n - taking page screenshot\n - waiting for fonts to load...\n - fonts loaded\n"
|
||||
"error": "browser.newContext: Target page, context or browser has been closed\nBrowser logs:\n\n<launching> /var/www/.cache/ms-playwright/chromium_headless_shell-1217/chrome-headless-shell-linux64/chrome-headless-shell --disable-field-trial-config --disable-background-networking --disable-background-timer-thrott"
|
||||
},
|
||||
{
|
||||
"hub": "brain-council.html",
|
||||
@@ -128,7 +118,7 @@
|
||||
],
|
||||
"summary": {
|
||||
"total": 8,
|
||||
"passed": 0,
|
||||
"failed": 8
|
||||
"passed": 2,
|
||||
"failed": 6
|
||||
}
|
||||
}
|
||||