diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index 178a149f8..a25e72a38 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-04-21T12:30:01.551448", + "generated_at": "2026-04-21T12:35:01.652723", "stats": { "total": 48, "pending": 31, diff --git a/api/em-kpi-cache.json b/api/em-kpi-cache.json index e69de29bb..a1471818a 100644 --- a/api/em-kpi-cache.json +++ b/api/em-kpi-cache.json @@ -0,0 +1,281 @@ +{ + "ts": "2026-04-21T10:35:01+00:00", + "server": "s204", + "s204": { + "load": 1.92, + "uptime": "2026-04-14 11:51:24", + "ram_total_mb": 31335, + "ram_used_mb": 10928, + "ram_free_mb": 20406, + "disk_total": "150G", + "disk_used": "117G", + "disk_free": "28G", + "disk_pct": "82%", + "fpm_workers": 140, + "docker_containers": 19, + "cpu_cores": 8 + }, + "s95": { + "load": 0.22, + "disk_pct": "81%", + "status": "UP", + "ram_total_mb": 15610, + "ram_free_mb": 11880 + }, + "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": 294, + "php_apis": 776, + "wiki_entries": 1988, + "vault_doctrines": 59, + "vault_sessions": 104, + "vault_decisions": 12 + }, + "tools": { + "total": 627, + "registry_version": "?" + }, + "sovereign": { + "status": "UP", + "providers": [ + "Cerebras-fast", + "Cerebras-think", + "Groq", + "Cloudflare-AI", + "Gemini", + "SambaNova", + "NVIDIA-NIM", + "Mistral", + "Groq-OSS", + "HF-Space", + "HF-Router", + "OpenRouter", + "GitHub-Models" + ], + "active": 13, + "total": 13, + "primary": "Cerebras-fast", + "cost": "0€" + }, + "ethica": { + "total_hcps": 161733, + "with_email": 110595, + "with_phone": 155151, + "gap_email": 51138, + "pct_email": 68.4, + "pct_phone": 95.9, + "by_country": [ + { + "country": "DZ", + "hcps": 122337, + "with_email": 78496, + "with_tel": 119396, + "pct_email": 64.2, + "pct_tel": 97.6 + }, + { + "country": "MA", + "hcps": 19723, + "with_email": 15075, + "with_tel": 18737, + "pct_email": 76.4, + "pct_tel": 95 + }, + { + "country": "TN", + "hcps": 17794, + "with_email": 15145, + "with_tel": 17018, + "pct_email": 85.1, + "pct_tel": 95.6 + }, + { + "country": "INTL", + "hcps": 1879, + "with_email": 1879, + "with_tel": 0, + "pct_email": 100, + "pct_tel": 0 + } + ] + }, + "docker": [ + { + "name": "loki", + "status": "Up 4 days", + "ports": "" + }, + { + "name": "listmonk", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "plausible-plausible-1", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "plausible-plausible-db-1", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "plausible-plausible-events-db-1", + "status": "Up 3 days", + "ports": "" + }, + { + "name": "n8n-docker-n8n-1", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "mattermost-docker-mm-db-1", + "status": "Up 5 days", + "ports": "" + }, + { + "name": "mattermost-docker-mattermost-1", + "status": "Up 5 days (healthy)", + "ports": "" + }, + { + "name": "twenty", + "status": "Up 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 34 hours (healthy)", + "ports": "" + }, + { + "name": "vaultwarden", + "status": "Up 6 days (healthy)", + "ports": "" + }, + { + "name": "qdrant", + "status": "Up 6 days", + "ports": "" + } + ], + "crons": { + "active": 35 + }, + "git": { + "head": "7f8887355 auto-sync-1235", + "dirty": 2, + "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": 3763, + "health": { + "score": 5, + "max": 6, + "pct": 83 + }, + "elapsed_ms": 10811 +} \ No newline at end of file diff --git a/api/nonreg-latest.json b/api/nonreg-latest.json index aebce9521..f080e41ef 100644 --- a/api/nonreg-latest.json +++ b/api/nonreg-latest.json @@ -1 +1 @@ -{"ts": "20260421_122748", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 56.6, "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": []} \ No newline at end of file +{"ts": "20260421_123827", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 56.3, "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": []} \ No newline at end of file diff --git a/api/nonreg-report.html b/api/nonreg-report.html index 2493abe48..79aae7851 100644 --- a/api/nonreg-report.html +++ b/api/nonreg-report.html @@ -1 +1 @@ -NR 20260421_122748

WEVAL NonReg v3.2 — 20260421_122748

100%

153/153 PASS | 0 FAIL | 56.6s | 10 couches | 4 machines

TestCoucheStDetail
HomeS204PASS200 22KB
WEVIAS204PASS200 22KB
ManagerS204PASS302 1KB
RadarS204PASS200 60KB
ToolsHubS204PASS302 1KB
MonitorS204PASS302 1KB
HuaweiS204PASS200 43KB
DeerFlowS204PASS200 22KB
CRM-HubS204PASS200 24KB
WV-DashS95-WVPASS301 0KB
WV-AppsS95-WVPASS200 2KB
WV-IAS95-WVPASS200 13KB
WV-ProcS95-WVPASS200 9KB
WV-WidgetS95-WVPASS200 23KB
WV-SentS95-WVPASS200 12KB
WV-CtrlS95-WVPASS200 18KB
WV-BrainS95-WVPASS200 30KB
WV-O365S95-WVPASS200 34KB
WV-DelivS95-WVPASS200 5KB
WV-WarmS95-WVPASS200 7KB
WV-SendS95-WVPASS200 0KB
A-ghost-neS95-ARSPASS200 10KB
A-brain-seS95-ARSPASS200 32KB
A-campaignS95-ARSPASS200 31KB
A-growth-eS95-ARSPASS200 20KB
A-deal-pipS95-ARSPASS200 21KB
A-cloud-prS95-ARSPASS200 18KB
A-cloudflaS95-ARSPASS200 29KB
A-dashboarS95-ARSPASS200 32KB
A-send-pipS95-ARSPASS200 6KB
A-harvest-S95-ARSPASS200 44KB
A-command-S95-ARSPASS200 45KB
A-domain-mS95-ARSPASS200 40KB
A-ceo-dashS95-ARSPASS200 23KB
A-reputatiS95-ARSPASS200 38KB
A-newslettS95-ARSPASS200 29KB
A-trackingS95-ARSPASS200 21KB
A-self-heaS95-ARSPASS200 42KB
iResp-RootS95-iRPASS200
EthicaINFRAPASS302 0KB
ConsentINFRAPASS200 9KB
TwentyINFRAPASS200 2KB
n8nINFRAPASS200 16KB
MMINFRAPASS200 681KB
WEVIAAPIPASSJSON 53B
ManifestAPIPASSJSON 2906B
HealthAPIPASSJSON 952B
AEGISAPIPASSJSON 424B
AE-ScAPIPASSJSON 98B
AE-PolAPIPASSJSON 244B
SSAPIPASSJSON 269B
SS-SAPIPASSJSON 313B
SS-RAPIPASSJSON 137B
AIOSAPIPASSJSON 254B
AI-AgAPIPASSJSON 348B
AI-KAPIPASSJSON 281B
OClawAPIPASSJSON 391B
PromAPIPASSJSON 123B
SMemAPIPASSJSON 196B
MstrAPIPASSJSON 211B
DifyAPIPASSJSON 479B
EvoAPIPASSJSON 143B
APcsAPIPASSJSON 125B
GooseAPIPASSJSON 177B
BrUseAPIPASSJSON 24B
EthPAPIPASSJSON 78B
RtrAPIPASSJSON 189B
NR-JSONAPIPASSJSON 774B
CRMAPIPASSJSON 25B
LvMetAPIPASSJSON 74B
MonDshAPIPASSJSON 1508B
IP-WVSECPASSClean
IP-WASECPASSClean
IP-CRMSECPASSClean
NucleiSECPASS0 finds
KumoMTAS95-BKPASSactive
PMTAS95-BKPASS2 procs (senders standby)
EthDBS95-BKPASS161733 ct
SendDBS95-BKPASS3097643 ct
S95-DskS95-BKPASS81%
DockerS95-BKPASSactive
WhatsAppC2-APIPASSJSON 352B
WA-HookC2-APIPASS403
SpamScoreC2-APIPASS200
WEVADS-IAC2-SPAPASS200 13KB
BlacklistC2-WVPASS200 2KB
WorldDashC2-WVPASS200 15KB
SeedsC2-WVPASS200 1058KB
NR-APIC2-APIPASSJSON 719B
SSO-blade-centSSOPASS200
SSO-blade-ai.hSSOPASS200
SSO-claude-monSSOPASS200
SSO-crons-moniSSOPASS200
SSO-monitoringSSOPASS200
SSO-openclaw.hSSOPASS200
SSO-crm.htmlSSOPASS200
SSO-world-map-SSOPASS200
B2B-LeadsDATAPASS2088 leads
LinkedInDATAPASS2343 profiles
Ethica-DZDATAPASS122337 HCPs
Ethica-MADATAPASS19723 HCPs
Ethica-TNDATAPASS17794 HCPs
Ethica-CronsCRONSPASS17 cron entries (crontab-based)
Ethica-ScriptsCRONSPASS15 scripts
Blade-APIBLADEPASSJSON 295B
Blade-BrainBLADEPASS18B
Blade-AIBLADEPASS302
Blade-CtrBLADEPASS302
Sentinel-PS1BLADEPASS200 16KB
Life-APILIFEPASS50B
Life-AppLIFEPASS200 62KB
Life-HTMLLIFEPASS200 24KB
Blade-TGBLADEPASS11B
Blade-MMBLADEPASS108B
WEVIA-ChatFUNCPASSCerebras-fast 173ch
Life-ChatFUNCPASS36ch
Ethica-ChatFUNCPASS223ch
Monitor-UPFUNCPASS11 services UP
Ollama-LiveFUNCPASS7 models
Arsenal-HPFUNCPASS1378 screens
Ethica-HCPsFUNCPASS161733 HCPs
SSO-BladeSSOPASS302
SSO-MonitorSSOPASS302
SSO-CCSSOPASS302
SSO-NRSSOPASS302
SSO-MTSSOPASS302
SSO-OpsSSOPASS302
SSO-ToolsSSOPASS302
SSO-AppsSSOPASS302
SSO-OClawSSOPASS302
SSO-CRMSSOPASS200
SSO-WkspSSOPASS200
SSO-LifeSSOPASS200
SSO-MegaSSOPASS302
Sub-CRMSSOPASS200
Sub-n8nSSOPASS200
Sub-MMSSOPASS200
Sub-DeerSSOPASS200
DF-Title01AVRPASSTWENTY!
CyberMon01AVRPASS200
Plausible01AVRPASSpresent
Plaus-Blog01AVRPASSpresent
Caps1001AVRPASS10/10
OSS-Disc01AVRPASS200 9921B
EthFeed01AVRPASS161733 HCPs 20 feed
BladeAPI01AVRPASS200 295B
CC-SSO01AVRPASS302
HealthCk01AVRPASSexists
Bench-LB-DictSTRUCTPASStype=list len=39
Bench-LB-ScoresSTRUCTPASSval_type=dict
Bench-EcoSTRUCTPASSscore=80
Bench-AIsSTRUCTPASScount=39
CronStatusSTRUCTPASS10 active 5 disabled
\ No newline at end of file +NR 20260421_123827

WEVAL NonReg v3.2 — 20260421_123827

100%

153/153 PASS | 0 FAIL | 56.3s | 10 couches | 4 machines

TestCoucheStDetail
HomeS204PASS200 22KB
WEVIAS204PASS200 22KB
ManagerS204PASS302 1KB
RadarS204PASS200 60KB
ToolsHubS204PASS302 1KB
MonitorS204PASS302 1KB
HuaweiS204PASS200 43KB
DeerFlowS204PASS200 22KB
CRM-HubS204PASS200 24KB
WV-DashS95-WVPASS301 0KB
WV-AppsS95-WVPASS200 2KB
WV-IAS95-WVPASS200 13KB
WV-ProcS95-WVPASS200 9KB
WV-WidgetS95-WVPASS200 23KB
WV-SentS95-WVPASS200 12KB
WV-CtrlS95-WVPASS200 18KB
WV-BrainS95-WVPASS200 30KB
WV-O365S95-WVPASS200 34KB
WV-DelivS95-WVPASS200 5KB
WV-WarmS95-WVPASS200 7KB
WV-SendS95-WVPASS200 0KB
A-ghost-neS95-ARSPASS200 10KB
A-brain-seS95-ARSPASS200 32KB
A-campaignS95-ARSPASS200 31KB
A-growth-eS95-ARSPASS200 20KB
A-deal-pipS95-ARSPASS200 21KB
A-cloud-prS95-ARSPASS200 18KB
A-cloudflaS95-ARSPASS200 29KB
A-dashboarS95-ARSPASS200 32KB
A-send-pipS95-ARSPASS200 6KB
A-harvest-S95-ARSPASS200 44KB
A-command-S95-ARSPASS200 45KB
A-domain-mS95-ARSPASS200 40KB
A-ceo-dashS95-ARSPASS200 23KB
A-reputatiS95-ARSPASS200 38KB
A-newslettS95-ARSPASS200 29KB
A-trackingS95-ARSPASS200 21KB
A-self-heaS95-ARSPASS200 42KB
iResp-RootS95-iRPASS200
EthicaINFRAPASS302 0KB
ConsentINFRAPASS200 9KB
TwentyINFRAPASS200 2KB
n8nINFRAPASS200 16KB
MMINFRAPASS200 681KB
WEVIAAPIPASSJSON 53B
ManifestAPIPASSJSON 2906B
HealthAPIPASSJSON 952B
AEGISAPIPASSJSON 424B
AE-ScAPIPASSJSON 98B
AE-PolAPIPASSJSON 244B
SSAPIPASSJSON 269B
SS-SAPIPASSJSON 313B
SS-RAPIPASSJSON 137B
AIOSAPIPASSJSON 254B
AI-AgAPIPASSJSON 348B
AI-KAPIPASSJSON 281B
OClawAPIPASSJSON 391B
PromAPIPASSJSON 123B
SMemAPIPASSJSON 196B
MstrAPIPASSJSON 211B
DifyAPIPASSJSON 479B
EvoAPIPASSJSON 143B
APcsAPIPASSJSON 125B
GooseAPIPASSJSON 177B
BrUseAPIPASSJSON 24B
EthPAPIPASSJSON 78B
RtrAPIPASSJSON 189B
NR-JSONAPIPASSJSON 774B
CRMAPIPASSJSON 25B
LvMetAPIPASSJSON 76B
MonDshAPIPASSJSON 1510B
IP-WVSECPASSClean
IP-WASECPASSClean
IP-CRMSECPASSClean
NucleiSECPASS0 finds
KumoMTAS95-BKPASSactive
PMTAS95-BKPASS2 procs (senders standby)
EthDBS95-BKPASS161733 ct
SendDBS95-BKPASS3097643 ct
S95-DskS95-BKPASS81%
DockerS95-BKPASSactive
WhatsAppC2-APIPASSJSON 352B
WA-HookC2-APIPASS403
SpamScoreC2-APIPASS200
WEVADS-IAC2-SPAPASS200 13KB
BlacklistC2-WVPASS200 2KB
WorldDashC2-WVPASS200 15KB
SeedsC2-WVPASS200 1058KB
NR-APIC2-APIPASSJSON 719B
SSO-blade-centSSOPASS200
SSO-blade-ai.hSSOPASS200
SSO-claude-monSSOPASS200
SSO-crons-moniSSOPASS200
SSO-monitoringSSOPASS200
SSO-openclaw.hSSOPASS200
SSO-crm.htmlSSOPASS200
SSO-world-map-SSOPASS200
B2B-LeadsDATAPASS2088 leads
LinkedInDATAPASS2343 profiles
Ethica-DZDATAPASS122337 HCPs
Ethica-MADATAPASS19723 HCPs
Ethica-TNDATAPASS17794 HCPs
Ethica-CronsCRONSPASS17 cron entries (crontab-based)
Ethica-ScriptsCRONSPASS15 scripts
Blade-APIBLADEPASSJSON 295B
Blade-BrainBLADEPASS18B
Blade-AIBLADEPASS302
Blade-CtrBLADEPASS302
Sentinel-PS1BLADEPASS200 16KB
Life-APILIFEPASS50B
Life-AppLIFEPASS200 62KB
Life-HTMLLIFEPASS200 24KB
Blade-TGBLADEPASS11B
Blade-MMBLADEPASS108B
WEVIA-ChatFUNCPASSCerebras-fast 85ch
Life-ChatFUNCPASS36ch
Ethica-ChatFUNCPASS180ch
Monitor-UPFUNCPASS11 services UP
Ollama-LiveFUNCPASS7 models
Arsenal-HPFUNCPASS1378 screens
Ethica-HCPsFUNCPASS161733 HCPs
SSO-BladeSSOPASS302
SSO-MonitorSSOPASS302
SSO-CCSSOPASS302
SSO-NRSSOPASS302
SSO-MTSSOPASS302
SSO-OpsSSOPASS302
SSO-ToolsSSOPASS302
SSO-AppsSSOPASS302
SSO-OClawSSOPASS302
SSO-CRMSSOPASS200
SSO-WkspSSOPASS200
SSO-LifeSSOPASS200
SSO-MegaSSOPASS302
Sub-CRMSSOPASS200
Sub-n8nSSOPASS200
Sub-MMSSOPASS200
Sub-DeerSSOPASS200
DF-Title01AVRPASSTWENTY!
CyberMon01AVRPASS200
Plausible01AVRPASSpresent
Plaus-Blog01AVRPASSpresent
Caps1001AVRPASS10/10
OSS-Disc01AVRPASS200 9921B
EthFeed01AVRPASS161733 HCPs 20 feed
BladeAPI01AVRPASS200 295B
CC-SSO01AVRPASS302
HealthCk01AVRPASSexists
Bench-LB-DictSTRUCTPASStype=list len=39
Bench-LB-ScoresSTRUCTPASSval_type=dict
Bench-EcoSTRUCTPASSscore=80
Bench-AIsSTRUCTPASScount=39
CronStatusSTRUCTPASS10 active 5 disabled
\ No newline at end of file diff --git a/api/scripts/fpm-saturation-guard.sh b/api/scripts/fpm-saturation-guard.sh index 684b54848..616bee6d6 100755 --- a/api/scripts/fpm-saturation-guard.sh +++ b/api/scripts/fpm-saturation-guard.sh @@ -1,23 +1,41 @@ #!/bin/bash -# V124 FPM Saturation Guard - detection + alerte only (NO auto-restart) +# V124 FPM Saturation Guard v2 - detection + alerte multi-pool (NO auto-restart) # Doctrine 24: monitor saturation pattern V9.67 recurrent 11:00 UTC -# Writes to /tmp/fpm-saturation-history.json for trend analysis +# Aggregates all FPM pools (php7.4/8.4/8.5) for global pressure view HISTORY=/tmp/fpm-saturation-history.json MAX_HISTORY=288 # 24h at 5min interval ALERT_THRESHOLD_PCT=85 # Alert if saturation >= 85% -# Get current FPM state (via netstat + ps) -ACTIVE=$(ps -ef | grep "php-fpm: pool" | grep -v grep | wc -l) -MAX_CHILDREN=$(grep -E "^pm.max_children" /etc/php/*/fpm/pool.d/*.conf 2>/dev/null | head -1 | awk "{print \$NF}") -MAX_CHILDREN=${MAX_CHILDREN:-150} -CONNECTIONS=$(ss -ant 2>/dev/null | grep -c ":443") +# Get total max_children across all active pools +TOTAL_MAX=0 +for conf in /etc/php/*/fpm/pool.d/*.conf; do + [ -f "$conf" ] || continue + v=$(grep -E "^pm.max_children" "$conf" 2>/dev/null | awk "{print \$NF}") + [ -n "$v" ] && TOTAL_MAX=$(( TOTAL_MAX + v )) +done +[ $TOTAL_MAX -eq 0 ] && TOTAL_MAX=150 # Fallback -SAT_PCT=$(( ACTIVE * 100 / MAX_CHILDREN )) +# Get total active FPM workers (exclude master processes) +TOTAL_ACTIVE=$(ps -ef | grep "php-fpm: pool" | grep -v grep | wc -l) + +# Get main pool (php8.5/www) state for detail +MAIN_MAX=$(grep -E "^pm.max_children" /etc/php/8.5/fpm/pool.d/www.conf 2>/dev/null | awk "{print \$NF}") +MAIN_MAX=${MAIN_MAX:-150} +MAIN_ACTIVE=$(ps -ef | grep "php-fpm: pool www$" | grep -v grep | wc -l) + +CONNECTIONS=$(ss -ant 2>/dev/null | grep -c ":443") LOAD1=$(cut -d" " -f1 /proc/loadavg) TS=$(date +%s) TSISO=$(date -Iseconds) +# Calculate saturation (main pool focus since it handles the principal traffic) +if [ $MAIN_MAX -gt 0 ]; then + SAT_PCT=$(( MAIN_ACTIVE * 100 / MAIN_MAX )) +else + SAT_PCT=0 +fi + # Determine status STATUS="healthy" if [ $SAT_PCT -ge $ALERT_THRESHOLD_PCT ]; then @@ -27,15 +45,14 @@ elif [ $SAT_PCT -ge 70 ]; then fi # Output compact single line -echo "sat_pct=$SAT_PCT active=$ACTIVE max=$MAX_CHILDREN load1=$LOAD1 conn=$CONNECTIONS status=$STATUS ts=$TSISO" +echo "sat_pct=$SAT_PCT main=$MAIN_ACTIVE/$MAIN_MAX total=$TOTAL_ACTIVE/$TOTAL_MAX load1=$LOAD1 conn=$CONNECTIONS status=$STATUS ts=$TSISO" # Append to history (keep last 288 entries = 24h) -ENTRY="{\"ts\":$TS,\"iso\":\"$TSISO\",\"sat_pct\":$SAT_PCT,\"active\":$ACTIVE,\"max\":$MAX_CHILDREN,\"load1\":$LOAD1,\"conn\":$CONNECTIONS,\"status\":\"$STATUS\"}" +ENTRY="{\"ts\":$TS,\"iso\":\"$TSISO\",\"sat_pct\":$SAT_PCT,\"main_active\":$MAIN_ACTIVE,\"main_max\":$MAIN_MAX,\"total_active\":$TOTAL_ACTIVE,\"total_max\":$TOTAL_MAX,\"load1\":$LOAD1,\"conn\":$CONNECTIONS,\"status\":\"$STATUS\"}" if [ -f "$HISTORY" ]; then - # Append + trim via python python3 -c " -import json, sys +import json try: h = json.load(open('$HISTORY')) if not isinstance(h, list): h = [] @@ -48,9 +65,9 @@ else echo "[$ENTRY]" > "$HISTORY" fi -# If SATURATED, also log to syslog for trace +# If SATURATED, log to syslog for trace if [ "$STATUS" = "SATURATED" ]; then - logger -t "fpm-saturation-guard" "SATURATED sat_pct=$SAT_PCT active=$ACTIVE/$MAX_CHILDREN load=$LOAD1" + logger -t "fpm-saturation-guard" "SATURATED sat_pct=$SAT_PCT main=$MAIN_ACTIVE/$MAIN_MAX load=$LOAD1" fi exit 0 diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 19fc15dac..1b779f512 100644 --- a/api/v83-business-kpi-latest.json +++ b/api/v83-business-kpi-latest.json @@ -1,12 +1,12 @@ { "ok": true, "version": "V83-business-kpi", - "ts": "2026-04-21T10:34:02+00:00", + "ts": "2026-04-21T10:38:40+00:00", "summary": { "total_categories": 8, "total_kpis": 64, - "ok": 39, - "warn": 25, + "ok": 40, + "warn": 24, "fail": 0, "wire_needed": 0, "data_completeness_pct": 100 diff --git a/api/wevia-autonomous.php b/api/wevia-autonomous.php index 7e983d03b..9e30df4b6 100644 --- a/api/wevia-autonomous.php +++ b/api/wevia-autonomous.php @@ -91,6 +91,7 @@ if ($__fp_input && isset($__fp_input["message"])) { "token_health" => ["cmd"=>"bash /var/www/html/api/scripts/token-health-monitor.sh 2>/dev/null", "default"=>true, "timeout"=>35], "infra_health_report" => ["cmd"=>"bash /var/www/html/api/scripts/infra-health-report.sh 2>/dev/null", "keywords"=>["infra","health","report","bilan infra","sante","global status"], "timeout"=>45], "kpi_unified" => ["cmd"=>"curl -sk --max-time 5 \"http://127.0.0.1/api/kpi-unified.php\" -H \"Host: weval-consulting.com\" 2>/dev/null | jq -r \".providers.total, .agents.active, .skills.count, .nonreg.total, .orphans.count, .docker.running\" | paste -sd \"|\"", "keywords"=>["kpi","unified","consolidation","single source","tableau bord","dashboard"], "timeout"=>8], + "fpm_saturation" => ["cmd"=>"bash /var/www/html/api/scripts/fpm-saturation-guard.sh 2>/dev/null | head -1", "keywords"=>["fpm","saturation","workers","pool","charge","sature"], "timeout"=>10], "screens_s204" => ["cmd"=>"echo 'S204_HTML='$(find /var/www/html -maxdepth 3 -name '*.html' 2>/dev/null | wc -l)' S204_PHP='$(find /var/www/html -maxdepth 3 -name '*.php' 2>/dev/null | wc -l)' API='$(ls /var/www/html/api/*.php 2>/dev/null | wc -l)", "keywords"=>["screen","ecran","\xc3\xa9cran","page"], "timeout"=>15], "screens_s95" => ["cmd"=>"sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"echo ARSENAL=\\$(find /opt/wevads-arsenal/public -maxdepth 2 -name '*.html' 2>/dev/null | wc -l)' WEVADS_HTML='\\$(find /var/www -maxdepth 3 -name '*.html' 2>/dev/null | wc -l)\" 2>&1 | tail -3", "keywords"=>["screen","ecran","\xc3\xa9cran","page","s95","arsenal"], "timeout"=>20], "gpus" => ["cmd"=>"nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo 'no GPU'; sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo 'no GPU s95'\" 2>&1 | tail -3", "keywords"=>["gpu","nvidia","blade","cuda"], "timeout"=>15], diff --git a/infra-tour-2s-5c-blade.html b/infra-tour-2s-5c-blade.html index 11a73b908..08d362587 100644 --- a/infra-tour-2s-5c-blade.html +++ b/infra-tour-2s-5c-blade.html @@ -114,4 +114,6 @@ body{margin:0;background:#0a0e1a;color:#e2e8f0;font-family:-apple-system,Nunito,
Généré V9.20 · 2026-04-20 · WEVIA-FIRST doctrine strict · SOT ethica_total=161726 live
+ + diff --git a/orphans-hub.html b/orphans-hub.html index 1443365b3..e51c62b34 100644 --- a/orphans-hub.html +++ b/orphans-hub.html @@ -229,4 +229,59 @@ h1{background:linear-gradient(135deg,#10b981,#06b6d4);-webkit-background-clip:te Paperclip Dashboard File attachment pipeline +
🔮 WePredict
+ + + + + +
+

Pages productives additionnelles (42)

+

Scan doctrine 103 - 2026-04-21 - pages non ref auparavant

+
+
admin-saas.html
WEVAL Enterprise — AI Operations Command Center - 27KB
+
admin.html
WEVAL Admin - 53KB
+
agents-fleet.html
WEVAL Agents Fleet - 21KB
+
agents-goodjob.html
WEVAL Enterprise - 70KB
+
agents-hd.html
WEVAL — Agents Command - 20KB
+
agents-hub.html
Agents Hub — WEVAL - 11KB
+
agents-ia.html
WEVIA — Agents IA Autonomes - 21KB
+
agents-valuechain.html
WEVAL Value Chain — Agents - 24KB
+
booking.html
Prendre rendez-vous — WEVAL Consulting - 11KB
+
claude-monitor.html
Claude Sync Monitor - 18KB
+
command-center.html
WEVAL Command Center - 58KB
+
crons-monitor.html
WEVAL — Infrastructure & Crons Monitor - 23KB
+
cyber-monitor.html
WEVAL Cyber Monitor - 8KB
+
director-center.html
WEVIA Director — Autonomous Center - 31KB
+
director-chat.html
WEVIA Director — Command - 28KB
+
email-hub.html
Email MTA Hub — WEVAL - 17KB
+
ethica-hcp-manager.html
Ethica HCP Manager - 9KB
+
ethica-monitor.html
Ethica — Validation Monitor - 19KB
+
ethica-pipeline.html
Ethica — Pipeline E2E & Performance - 29KB
+
google-hub.html
Google Workspace Hub — WEVAL - 16KB
+
gpu-hub.html
GPU Free Hub — WEVAL - 18KB
+
keys-hub.html
API Keys Hub — WEVAL - 18KB
+
l99-brain.html
L99 Brain — Sovereign AI - 23KB
+
l99.html
WEVAL L99 Command Center - 21KB
+
living-proof.html
Living Proof · Video Scenario Testing · WEVAL - 21KB
+
medreach-dashboard.html
MedReach — Reach Report HCP Maghreb - 22KB
+
namecheap-hub.html
Domains Hub — WEVAL - 15KB
+
nl-autowire-status.html
NL-AutoWire Status — WEVAL Sovereign IA - 12KB
+
ops-center.html
WEVAL OPS - 86KB
+
oss-discovery.html
WEVAL — OSS Discovery - 31KB
+
realtime-monitor.html
WEVAL Realtime Monitor v3 - 25KB
+
security-dashboard.html
WEVAL Security Scanner — Secret Detection - 17KB
+
sovereign-claude.html
Sovereign Claude - 21KB
+
toolhub.html
WEVIA — ToolHub - 23KB
+
value-chain.html
WEVIA — Value Chain - 10KB
+
value-stream.html
WEVIA — Value Stream - 10KB
+
visual-management.html
Visual Management · WEVAL Consulting - 21KB
+
wevads-hub.html
WEVADS Hub — WEVAL - 11KB
+
wevia-business-visual-studio.html
🎬 WEVIA Business Visual Studio · Test Video Management - 21KB
+
wevia-hub.html
WEVIA Hub — WEVAL - 11KB
+
wiki.html
WEVIA — Wiki - 47KB
+
wtp-login.html
WEVAL — Login direct (bypass SSO) - 10KB
+
+
+ \ No newline at end of file diff --git a/oss-discovery-v77.html b/oss-discovery-v77.html index 0b7443bae..7151bdd6a 100644 --- a/oss-discovery-v77.html +++ b/oss-discovery-v77.html @@ -317,5 +317,7 @@ load(); setInterval(load, 60000); + + diff --git a/test-wevia-e2e-live.html b/test-wevia-e2e-live.html index 42f5d4395..a4ce998b4 100644 --- a/test-wevia-e2e-live.html +++ b/test-wevia-e2e-live.html @@ -214,4 +214,6 @@ runAll(); + + diff --git a/v78-real-wire.html b/v78-real-wire.html index 7299a3a19..187bd8405 100644 --- a/v78-real-wire.html +++ b/v78-real-wire.html @@ -103,5 +103,7 @@ async function load() { load(); setInterval(load, 60000); + + diff --git a/v82-unified-status.html b/v82-unified-status.html index dc6519ea7..54f4524ad 100644 --- a/v82-unified-status.html +++ b/v82-unified-status.html @@ -210,5 +210,7 @@ function renderRecent() { load(); setInterval(load, 15000); + + diff --git a/wepredict.html b/wepredict.html index a7c2e9d99..285a4e635 100644 --- a/wepredict.html +++ b/wepredict.html @@ -274,5 +274,15 @@ render(); loadFooter(); + + + + + diff --git a/weval-ops-screens.html b/weval-ops-screens.html index 4f1e3138b..ab5e2fbe9 100644 --- a/weval-ops-screens.html +++ b/weval-ops-screens.html @@ -663,4 +663,6 @@ updateHealthSummary = function(){ + + diff --git a/wevia-demo-autonomous.html b/wevia-demo-autonomous.html index 635ef8537..35c87ffdd 100644 --- a/wevia-demo-autonomous.html +++ b/wevia-demo-autonomous.html @@ -124,6 +124,8 @@ + + ``` diff --git a/wiki/doctrine-103-orphans-consolidation.md b/wiki/doctrine-103-orphans-consolidation.md new file mode 100644 index 000000000..63d350bac --- /dev/null +++ b/wiki/doctrine-103-orphans-consolidation.md @@ -0,0 +1,101 @@ +# Doctrine 103 - Rapport orphelins et consolidation WTP + +Date: 2026-04-21 Total pages HTML: 294 Linked from 3 entry points: 63 Orphans: 231 + +## Classification orphelins + +### legacy (19 pages) + +- `admin-v2.html` +- `dormant-dashboard-v2.html` +- `enterprise-complete-v73.html` +- `l99-v2.html` +- `linkedin-automation-v96.html` +- `linkedin-control-v97.html` +- `linkedin-control-v98.html` +- `nonreg-old-v2.html` +- `nonreg-old.html` +- `realtime-monitor-v3.html` +- `test-wevia-exhaustive-v3.html` +- `weval-arena-v2.html` +- `wevia-apple-v3.html` +- `wevia-em-big4-v2.html` +- `wevia-em-linkedin-carousel-v3.html` +- ... +4 more + +### test_demo (3 pages) + +- `test-vm-widget.html` +- `test-wevia-e2e-live.html` +- `wevia-demo-autonomous.html` + +### variants (13 pages) + +- `agents-goodjob.html` (70.0 KB) +- `agents-3d.html` (28.4 KB) +- `admin-saas.html` (26.6 KB) +- `agents-iso3d.html` (25.9 KB) +- `agents-final.html` (24.4 KB) +- `agents-hd2.html` (24.4 KB) +- `agents-valuechain.html` (23.9 KB) +- `agents-ia.html` (21.0 KB) +- `agents-fleet.html` (20.5 KB) +- `agents-hd.html` (19.8 KB) +- `agents-alive.html` (16.7 KB) +- `agents-hub.html` (11.1 KB) +- `agents-unified-registry.html` (9.6 KB) + +### fragments_iframes (10 pages) + +- `all-screens-live.html` +- `droid-terminal.html` +- `googlecba1a80ba979325c.html` +- `office-workflow.html` +- `sessions-monitor.html` +- `vsm-pipelines.html` +- `wevia-admin.html` +- `wevia-control-center.html` +- `wevia-dashboard.html` +- `wevia-monitor.html` + +### productive (186 pages) + +- `weval-ops-screens.html` (660.5 KB) +- `wevia-training.html` (231.6 KB) +- `wevia.html` (157.2 KB) +- `ops-center.html` (86.4 KB) +- `cron-control.html` (86.0 KB) +- `technology-radar.html` (67.0 KB) +- `deepseek.html` (66.4 KB) +- `command-center.html` (57.9 KB) +- `use-cases.html` (56.8 KB) +- `intents-registry.html` (55.5 KB) +- `admin.html` (53.1 KB) +- `wiki.html` (46.6 KB) +- `faq-techniques.html` (44.0 KB) +- `ia-registre.html` (43.5 KB) +- `weval-master-inventory.html` (40.1 KB) +- `growth-engine.html` (38.2 KB) +- `weval-enterprise-management.html` (36.6 KB) +- `office-app.html` (34.5 KB) +- `erp-gap-fill.html` (34.5 KB) +- `blade-ai.html` (33.7 KB) +- `acquired-dashboard.html` (33.4 KB) +- `enterprise-management.html` (32.5 KB) +- `huawei-cloud.html` (31.8 KB) +- `director-center.html` (30.8 KB) +- `oss-discovery.html` (30.8 KB) +- `droid-terminal-hidden.html` (29.9 KB) +- `wevia-erp-unified.html` (29.5 KB) +- `dormant-dashboard.html` (29.4 KB) +- `ethica-pipeline.html` (29.2 KB) +- `value-stream-mapping.html` (28.8 KB) + +## Action items +- productive : ajouter au WTP/wevia-master.html/all-ia-hub.html via section approprie +- legacy : marquer archive, deprecate banner, garder pour reference +- test_demo : garder dans wiki-exploration, ne pas exposer en prod +- variants : choisir canonical, redirect autres vers canonical +- fragments_iframes : normal, inclus dans pages parent + +## Principe : RIEN SUPPRIMER, tout preserver, lier pour accessibilite \ No newline at end of file