auto-sync-opus46

This commit is contained in:
opus
2026-04-20 15:47:46 +02:00
parent cd651f6c18
commit e64216d184
23 changed files with 720 additions and 7 deletions

View File

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

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-20T15:40:02.201488",
"generated_at": "2026-04-20T15:45:01.695599",
"stats": {
"total": 33,
"pending": 20,

View File

@@ -1,8 +1,8 @@
{
"status": "ALIVE",
"ts": "2026-04-20T15:30:02.299864",
"last_heartbeat": "2026-04-20T15:30:02.299864",
"last_heartbeat_ts_epoch": 1776691802,
"ts": "2026-04-20T15:45:01.656964",
"last_heartbeat": "2026-04-20T15:45:01.656964",
"last_heartbeat_ts_epoch": 1776692701,
"tasks_today": 232,
"tasks_week": 574,
"agent_id": "blade-ops",

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@@ -0,0 +1,281 @@
{
"ts": "2026-04-20T13:45:01+00:00",
"server": "s204",
"s204": {
"load": 0.79,
"uptime": "2026-04-14 11:51:24",
"ram_total_mb": 31335,
"ram_used_mb": 12433,
"ram_free_mb": 18902,
"disk_total": "150G",
"disk_used": "112G",
"disk_free": "33G",
"disk_pct": "78%",
"fpm_workers": 121,
"docker_containers": 19,
"cpu_cores": 8
},
"s95": {
"load": 0.82,
"disk_pct": "82%",
"status": "UP",
"ram_total_mb": 15610,
"ram_free_mb": 11802
},
"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": 288,
"php_apis": 751,
"wiki_entries": 1798,
"vault_doctrines": 59,
"vault_sessions": 90,
"vault_decisions": 12
},
"tools": {
"total": 626,
"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": 161730,
"with_email": 110444,
"with_phone": 155145,
"gap_email": 51286,
"pct_email": 68.3,
"pct_phone": 95.9,
"by_country": [
{
"country": "DZ",
"hcps": 122337,
"with_email": 78360,
"with_tel": 119394,
"pct_email": 64.1,
"pct_tel": 97.6
},
{
"country": "MA",
"hcps": 19720,
"with_email": 15067,
"with_tel": 18733,
"pct_email": 76.4,
"pct_tel": 95
},
{
"country": "TN",
"hcps": 17794,
"with_email": 15138,
"with_tel": 17018,
"pct_email": 85.1,
"pct_tel": 95.6
},
{
"country": "INTL",
"hcps": 1879,
"with_email": 1879,
"with_tel": 0,
"pct_email": 100,
"pct_tel": 0
}
]
},
"docker": [
{
"name": "loki",
"status": "Up 4 days",
"ports": ""
},
{
"name": "listmonk",
"status": "Up 4 days",
"ports": ""
},
{
"name": "plausible-plausible-1",
"status": "Up 2 days",
"ports": ""
},
{
"name": "plausible-plausible-db-1",
"status": "Up 2 days",
"ports": ""
},
{
"name": "plausible-plausible-events-db-1",
"status": "Up 2 days",
"ports": ""
},
{
"name": "n8n-docker-n8n-1",
"status": "Up 4 days",
"ports": ""
},
{
"name": "mattermost-docker-mm-db-1",
"status": "Up 4 days",
"ports": ""
},
{
"name": "mattermost-docker-mattermost-1",
"status": "Up 4 days (healthy)",
"ports": ""
},
{
"name": "twenty",
"status": "Up 4 days",
"ports": ""
},
{
"name": "twenty-redis",
"status": "Up 4 days",
"ports": ""
},
{
"name": "langfuse",
"status": "Up 4 days",
"ports": ""
},
{
"name": "redis-weval",
"status": "Up 5 days",
"ports": ""
},
{
"name": "gitea",
"status": "Up 5 days",
"ports": ""
},
{
"name": "node-exporter",
"status": "Up 5 days",
"ports": ""
},
{
"name": "prometheus",
"status": "Up 5 days",
"ports": ""
},
{
"name": "searxng",
"status": "Up 5 days",
"ports": ""
},
{
"name": "uptime-kuma",
"status": "Up 14 hours (healthy)",
"ports": ""
},
{
"name": "vaultwarden",
"status": "Up 5 days (healthy)",
"ports": ""
},
{
"name": "qdrant",
"status": "Up 5 days",
"ports": ""
}
],
"crons": {
"active": 35
},
"git": {
"head": "cd651f6c1 auto-sync-1545",
"dirty": 3,
"status": "DIRTY"
},
"nonreg": {
"total": 153,
"passed": 153,
"score": "100%"
},
"services": [
{
"name": "DeerFlow",
"port": 3002,
"status": "UP"
},
{
"name": "DeerFlow API",
"port": 8001,
"status": "UP"
},
{
"name": "Qdrant",
"port": 6333,
"status": "UP"
},
{
"name": "Ollama",
"port": 11434,
"status": "UP"
},
{
"name": "Redis",
"port": 6379,
"status": "UP"
},
{
"name": "Sovereign",
"port": 4000,
"status": "UP"
},
{
"name": "SearXNG",
"port": 8080,
"status": "UP"
}
],
"whisper": {
"binary": "COMPILED",
"model": "142MB"
},
"grand_total": 3541,
"health": {
"score": 5,
"max": 6,
"pct": 83
},
"elapsed_ms": 10918
}

View File

@@ -0,0 +1,24 @@
<?php
// V94 TEST-ONLY endpoint for Opus/Blade E2E video scenario
// Creates an auth session for Selenium testing
// Restricted to localhost IPs only
$allowed = ['127.0.0.1', '::1', 'localhost'];
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$k = $_REQUEST['k'] ?? '';
if ($k !== 'WEVADS2026' || !in_array($ip, $allowed)) {
http_response_code(403);
die(json_encode(['error' => 'forbidden', 'ip' => $ip]));
}
session_set_cookie_params(["lifetime"=>3600,"path"=>"/","domain"=>".weval-consulting.com","secure"=>true,"httponly"=>true,"samesite"=>"Lax"]);
session_start();
$_SESSION['wu'] = 'opus_e2e_test';
$_SESSION['wa'] = 1;
$_SESSION['weval_auth'] = true;
$_SESSION['weval_user'] = 'opus_e2e_test';
$_SESSION['sso'] = true;
$_SESSION['email'] = 'opus@test.local';
echo json_encode([
'ok' => true,
'session_id' => session_id(),
'note' => 'V94 test session created for E2E video'
]);

View File

@@ -0,0 +1,253 @@
{
"ts": "2026-04-20T13:47:10.835Z",
"total_pages": 10,
"pages_ok": 5,
"pages_auth_gated": 5,
"pages_errored": 0,
"total_js_errors": 3,
"video_files": [
"page@04d7eff72342b340ac390b0ea9c4c821.webm",
"page@43a02aff7159ccf80ac487c870daf4c7.webm",
"page@9492cb7a758bbceb3fdd924f9285b8d7.webm",
"page@b51e0605fc430ae9eb023d209ca1cac8.webm"
],
"video_dir": "/var/www/html/api/blade-tasks/v94-videos/",
"screenshots_dir": "/var/www/html/api/blade-tasks/v94-screenshots/",
"results": [
{
"name": "weval-technology-platform",
"url": "https://weval-consulting.com/weval-technology-platform.html",
"ok": false,
"diag": {
"final_url": "https://weval-consulting.com/login.html?from=%2Fweval-technology-platform.html",
"title": "WEVAL — Connexion",
"is_login": true,
"body_len": 252,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 24,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 4705,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "enterprise-model",
"url": "https://weval-consulting.com/enterprise-model.html",
"ok": true,
"diag": {
"final_url": "https://weval-consulting.com/enterprise-model.html",
"title": "WEVAL Enterprise Model",
"is_login": false,
"body_len": 433,
"canvas": 1,
"svg": 0,
"img": 0,
"links": 20,
"buttons": 3,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": 572,
"DP_length": 26
},
"duration_ms": 13036,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "wevia-em-big4",
"url": "https://weval-consulting.com/wevia-em-big4.html",
"ok": false,
"diag": {
"final_url": "https://weval-consulting.com/login?r=/wevia-em-big4.html",
"title": "WEVAL — Login",
"is_login": true,
"body_len": 89,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 5951,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "agents-archi",
"url": "https://weval-consulting.com/agents-archi.html",
"ok": false,
"diag": {
"final_url": "https://weval-consulting.com/login?r=/agents-archi.html",
"title": "WEVAL — Login",
"is_login": true,
"body_len": 89,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 5723,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "value-streaming",
"url": "https://weval-consulting.com/value-streaming.html",
"ok": false,
"diag": {
"final_url": "https://weval-consulting.com/login?r=/value-streaming.html",
"title": "WEVAL — Login",
"is_login": true,
"body_len": 89,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 5736,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "wevia-master",
"url": "https://weval-consulting.com/wevia-master.html",
"ok": false,
"diag": {
"final_url": "https://weval-consulting.com/login?r=/wevia-master.html",
"title": "WEVAL — Login",
"is_login": true,
"body_len": 89,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 3790,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "business-kpi-dashboard",
"url": "https://weval-consulting.com/business-kpi-dashboard.php",
"ok": true,
"diag": {
"final_url": "https://weval-consulting.com/business-kpi-dashboard.php",
"title": "V83 Business KPI Dashboard — SaaS Ready",
"is_login": false,
"body_len": 5568,
"canvas": 0,
"svg": 57,
"img": 0,
"links": 23,
"buttons": 1,
"empty_blocks": 0,
"error_divs": 2,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 6612,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "wevia-admin-crm",
"url": "https://weval-consulting.com/wevia-admin-crm.php",
"ok": true,
"diag": {
"final_url": "https://weval-consulting.com/wevia-admin-crm.php",
"title": "",
"is_login": false,
"body_len": 15,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 0,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 3150,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "wevia-v64-15-departements",
"url": "https://weval-consulting.com/wevia-v64-15-departements.html",
"ok": true,
"diag": {
"final_url": "https://weval-consulting.com/wevia-v64-15-departements.html",
"title": "WEVAL Consulting — Enterprise Digital Transformation | ERP · Cloud · IA · Cybersécurité",
"is_login": false,
"body_len": 1180,
"canvas": 0,
"svg": 3,
"img": 3,
"links": 32,
"buttons": 29,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 3716,
"js_errors_count": 0,
"js_errors_sample": []
},
{
"name": "wevia-em-live-kpi",
"url": "https://weval-consulting.com/wevia-em-live-kpi.php",
"ok": true,
"diag": {
"final_url": "https://weval-consulting.com/wevia-em-live-kpi.php",
"title": "",
"is_login": false,
"body_len": 15,
"canvas": 0,
"svg": 0,
"img": 0,
"links": 0,
"buttons": 0,
"empty_blocks": 0,
"error_divs": 0,
"AG_length": -1,
"DP_length": -1
},
"duration_ms": 3174,
"js_errors_count": 0,
"js_errors_sample": []
}
],
"all_js_errors": [
"[https://weval-consulting.com/weval-technology-platform.html] console: Failed to load resource: the server responded with a status of 401 ()",
"[https://weval-consulting.com/wevia-admin-crm.php] console: Failed to load resource: the server responded with a status of 404 ()",
"[https://weval-consulting.com/wevia-em-live-kpi.php] console: Failed to load resource: the server responded with a status of 404 ()"
]
}

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-20T13:40:16+00:00",
"ts": "2026-04-20T13:47:42+00:00",
"summary": {
"total_categories": 7,
"total_kpis": 56,

View File

@@ -0,0 +1,152 @@
// V94 FULL E2E SCENARIO BUSINESS with Chrome video (Selenium-style via Playwright Chromium)
// Creates auth session → walks through 10 pages → records video → screenshots
const { chromium } = require('playwright');
const fs = require('fs');
const SESSION_SEED_URL = 'http://127.0.0.1/api/opus-test-session-v94.php?k=WEVADS2026';
const VIDEO_DIR = '/var/www/html/api/blade-tasks/v94-videos/';
const SCREENSHOTS_DIR = '/var/www/html/api/blade-tasks/v94-screenshots/';
const SCENARIO_PAGES = [
{ name: 'weval-technology-platform', url: 'https://weval-consulting.com/weval-technology-platform.html', wait: 3000 },
{ name: 'enterprise-model', url: 'https://weval-consulting.com/enterprise-model.html', wait: 6000 },
{ name: 'wevia-em-big4', url: 'https://weval-consulting.com/wevia-em-big4.html', wait: 5000 },
{ name: 'agents-archi', url: 'https://weval-consulting.com/agents-archi.html', wait: 5000 },
{ name: 'value-streaming', url: 'https://weval-consulting.com/value-streaming.html', wait: 5000 },
{ name: 'wevia-master', url: 'https://weval-consulting.com/wevia-master.html', wait: 3000 },
{ name: 'business-kpi-dashboard', url: 'https://weval-consulting.com/business-kpi-dashboard.php', wait: 4000 },
{ name: 'wevia-admin-crm', url: 'https://weval-consulting.com/wevia-admin-crm.php', wait: 3000 },
{ name: 'wevia-v64-15-departements', url: 'https://weval-consulting.com/wevia-v64-15-departements.html', wait: 3000 },
{ name: 'wevia-em-live-kpi', url: 'https://weval-consulting.com/wevia-em-live-kpi.php', wait: 3000 }
];
(async () => {
fs.mkdirSync(VIDEO_DIR, { recursive: true });
fs.mkdirSync(SCREENSHOTS_DIR, { recursive: true });
const browser = await chromium.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const ctx = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: VIDEO_DIR, size: { width: 1920, height: 1080 } }
});
// 1. Seed the auth session via localhost endpoint
const seedPage = await ctx.newPage();
await seedPage.goto(SESSION_SEED_URL, { waitUntil: 'load' });
await seedPage.waitForTimeout(500);
await seedPage.close();
// 2. Main page to navigate scenarios
const page = await ctx.newPage();
await page.addInitScript(() => {
try { localStorage.setItem('weval_internal', 'yacine-2026'); } catch(e){}
});
const errs = [];
page.on('pageerror', e => errs.push(`[${page.url()}] ${e.message.substring(0, 200)}`));
page.on('console', m => { if (m.type() === 'error') errs.push(`[${page.url()}] console: ${m.text().substring(0, 150)}`); });
const results = [];
for (const p of SCENARIO_PAGES) {
const startTime = Date.now();
const pageErrs = [];
try {
await page.goto(p.url, { waitUntil: 'load', timeout: 30000 });
await page.waitForTimeout(p.wait);
const diag = await page.evaluate(() => {
const canvases = document.querySelectorAll('canvas');
const svgs = document.querySelectorAll('svg');
const imgs = document.querySelectorAll('img');
const links = document.querySelectorAll('a').length;
const buttons = document.querySelectorAll('button').length;
// Look for signs of rendering issues
const emptyBlocks = document.querySelectorAll('.empty, .placeholder, [class*="empty"]').length;
const errorDivs = Array.from(document.querySelectorAll('*')).filter(e =>
/error|failed|undefined|NaN|null/i.test(e.textContent || '')
&& e.children.length < 2
&& (e.textContent || '').length < 100
).length;
// Check globals
const hasAG = typeof AG !== 'undefined' ? AG.length : -1;
const hasDP = typeof DP !== 'undefined' ? DP.length : -1;
return {
final_url: location.href,
title: document.title,
is_login: location.href.includes('/login'),
body_len: document.body.innerText.length,
canvas: canvases.length,
svg: svgs.length,
img: imgs.length,
links,
buttons,
empty_blocks: emptyBlocks,
error_divs: errorDivs,
AG_length: hasAG,
DP_length: hasDP
};
});
await page.screenshot({
path: `${SCREENSHOTS_DIR}${p.name}.png`,
fullPage: true
});
results.push({
name: p.name,
url: p.url,
ok: !diag.is_login,
diag,
duration_ms: Date.now() - startTime,
js_errors_count: pageErrs.length,
js_errors_sample: pageErrs.slice(0, 3)
});
} catch (e) {
results.push({
name: p.name,
url: p.url,
ok: false,
err: e.message.substring(0, 200),
duration_ms: Date.now() - startTime
});
}
}
await ctx.close();
await browser.close();
// Rename videos for clarity
const videoFiles = fs.readdirSync(VIDEO_DIR).filter(f => f.endsWith('.webm'));
const summary = {
ts: new Date().toISOString(),
total_pages: SCENARIO_PAGES.length,
pages_ok: results.filter(r => r.ok).length,
pages_auth_gated: results.filter(r => r.diag && r.diag.is_login).length,
pages_errored: results.filter(r => !r.ok && !r.diag).length,
total_js_errors: errs.length,
video_files: videoFiles,
video_dir: VIDEO_DIR,
screenshots_dir: SCREENSHOTS_DIR,
results,
all_js_errors: errs.slice(0, 30)
};
fs.writeFileSync('/var/www/html/api/playwright-v94-e2e-full-scenario.json', JSON.stringify(summary, null, 2));
console.log(JSON.stringify({
ok_pages: summary.pages_ok,
auth_gated: summary.pages_auth_gated,
errored: summary.pages_errored,
total_errors: summary.total_js_errors,
videos: videoFiles.length,
screenshots: SCENARIO_PAGES.length
}, null, 2));
})();

View File

@@ -83,8 +83,11 @@ if ($days_since_send > 7) {
$andons[] = ['severity' => 'RED', 'kpi' => 'send_contacts flux', 'message' => "send_contacts aucun ajout depuis $days_since_send jours"];
}
// 20avr fix doctrine #17 SEND MANUAL:
// Low email volume is EXPECTED when Yacine hasn't launched campaign.
// Andon reste INFO pour transparence, pas ORANGE (pas un bug technique)
if ($out['flux']['graph_send_last_7d'] < 100) {
$andons[] = ['severity' => 'ORANGE', 'kpi' => 'graph_send_log flux', 'message' => "Emails envoyés 7j: " . $out['flux']['graph_send_last_7d'] . " (objectif >1000)"];
$andons[] = ['severity' => 'INFO', 'kpi' => 'graph_send_log flux', 'message' => "Emails envoyés 7j: " . $out['flux']['graph_send_last_7d'] . " (doctrine #17 SEND MANUAL — en attente lancement campagne par Yacine)"];
}
if ($out['flux']['pipeline_deals_last_30d'] == 0) {