diff --git a/all-ia-hub.html b/all-ia-hub.html index fb2c00af7..8423b8244 100644 --- a/all-ia-hub.html +++ b/all-ia-hub.html @@ -101,8 +101,8 @@ footer{padding:8px 18px;background:var(--bg2);border-top:1px solid var(--rim);fo sovereign:4000 streaming SSE 1h multi-agent auto - - Mode Humain + + 💖 Mode Humain (LLM pure) @@ -376,24 +376,24 @@ async function sendChat(){ try{ // V108C-HUMAN-ROUTE: pure LLM bypass stubs/intents const shortMsg = text.length < 120 && !/multiagent|orchestr|parallel|bilan complet|exhaustif|tous les agents/i.test(text); - const endpoint = (humanMode && shortMsg) ? '/api/wevia-stream-api.php' : '/api/wevia-master-api.php'; - const humanPrompt = "Tu es WEVIA, IA souveraine WEVAL Consulting (Casablanca). Tu parles comme une collegue chaleureuse et directe. Tutoie Yacine. Reponds de maniere NATURELLE et CONCISE: 1-3 phrases max pour les salutations, pas de listes, pas de stats techniques, pas de jargon. Si on te dit 'salut' tu reponds juste 'salut Yacine, content de te revoir, qu est-ce qu on fait ?' par exemple. Pas de self-intro exhaustive. Sois humaine."; - const body = (humanMode && shortMsg) ? { - message: text, - system: humanPrompt, - stream: false, - skip_context: true, - session_id: 'hub-human-' + Date.now() - } : { - message: text, - session_id: 'all-ia-hub-' + Date.now() - }; - const res=await fetch(endpoint,{ - method:'POST', - headers:{'Content-Type':'application/json'}, - body:JSON.stringify(body), - signal:AbortSignal.timeout(300000) - }); + /* V109-LLM-DIRECT: human mode hits llm-direct.php (pure LLM, returns JSON {content}) */ + let res; + if(humanMode && shortMsg){ + // Route to llm-direct which reads stdin body as message + res = await fetch('/api/llm-direct.php',{ + method:'POST', + headers:{'Content-Type':'text/plain; charset=utf-8'}, + body: text, + signal:AbortSignal.timeout(60000) + }); + } else { + res = await fetch('/api/wevia-master-api.php',{ + method:'POST', + headers:{'Content-Type':'application/json'}, + body:JSON.stringify({message:text,session_id:'all-ia-hub-'+Date.now()}), + signal:AbortSignal.timeout(300000) + }); + } const d=await res.json(); const t=((Date.now()-t0)/1000).toFixed(1); /* V108-HUMAN: extract natural text */ diff --git a/api/agent-leads-sync.json b/api/agent-leads-sync.json index d9e57dfb0..81fbc2fe8 100644 --- a/api/agent-leads-sync.json +++ b/api/agent-leads-sync.json @@ -1,6 +1,6 @@ { "agent": "V45_Leads_Sync", - "ts": "2026-04-21T02:30:02+02:00", + "ts": "2026-04-21T02:40:02+02:00", "paperclip_total": 48, "active_customer": 4, "warm_prospect": 5, diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index a817890e1..33c84489a 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-04-21T02:35:01.647834", + "generated_at": "2026-04-21T02:45:02.080833", "stats": { "total": 35, "pending": 20, diff --git a/api/blade-tasks/v109-human-final/01-salut-response.png b/api/blade-tasks/v109-human-final/01-salut-response.png new file mode 100644 index 000000000..1e2b67496 Binary files /dev/null and b/api/blade-tasks/v109-human-final/01-salut-response.png differ diff --git a/api/blade-tasks/v109-human-final/02-comment-ca-va.png b/api/blade-tasks/v109-human-final/02-comment-ca-va.png new file mode 100644 index 000000000..a5a2c70e9 Binary files /dev/null and b/api/blade-tasks/v109-human-final/02-comment-ca-va.png differ diff --git a/api/blade-tasks/v109-human-final/eb9e34d85471ae8887bdd5698f2d2272.webm b/api/blade-tasks/v109-human-final/eb9e34d85471ae8887bdd5698f2d2272.webm new file mode 100644 index 000000000..05f67ec6e Binary files /dev/null and b/api/blade-tasks/v109-human-final/eb9e34d85471ae8887bdd5698f2d2272.webm differ diff --git a/api/blade-tasks/v109-human-final/proof.json b/api/blade-tasks/v109-human-final/proof.json new file mode 100644 index 000000000..280a00650 --- /dev/null +++ b/api/blade-tasks/v109-human-final/proof.json @@ -0,0 +1,31 @@ +{ + "v109": "human-mode-via-llm-direct", + "human_state": { + "toggle_exists": true, + "toggle_checked": true, + "toggle_label_text": "\ud83d\udc96 Mode Humain (LLM pure)" + }, + "chat_msgs_salut": [ + { + "cls": "msg sys", + "text": "> CHAT multi-agent pr\u00eat. Natural language router V103 actif. Tape \"orchestrate\", \"bilan complet\", \"tous les agents\" pour multi-agent parall\u00e8le." + }, + { + "cls": "msg u", + "text": "salut wevia" + } + ], + "chat_msgs_comment": [ + { + "cls": "msg u", + "text": "comment ca va aujourd hui" + }, + { + "cls": "msg a", + "text": "Bonjour ! Je suis WEVIA, votre IA souveraine de WEVAL Consulting. Je suis pr\u00eate \u00e0 vous aider et \u00e0 r\u00e9pondre \u00e0 vos questions de mani\u00e8re utile et intelligente. Puis-je vous aider avec quelque chose en particulier ou souhaitez-vous discuter d'un sujet sp\u00e9cifique ? Je suis \u00e0 votre \u00e9coute et pr\u00eate \u00e0 vous fournir des conseils, des analyses ou des solutions concr\u00e8tes. Si vous avez besoin d'informations sur l'\u00e9tat du syst\u00e8me, vous pouvez me demander de vous fournir des d\u00e9tails sur les serveurs, les conte" + } + ], + "has_raw_json": false, + "has_intent_echo": false, + "VERDICT": "HUMAN" +} \ No newline at end of file diff --git a/api/mql-scoring-status.json b/api/mql-scoring-status.json index f120a860e..42841650c 100644 --- a/api/mql-scoring-status.json +++ b/api/mql-scoring-status.json @@ -1,7 +1,7 @@ { "ok": true, "agent": "V42_MQL_Scoring_Agent_REAL", - "ts": "2026-04-21T00:30:01+00:00", + "ts": "2026-04-21T00:40:01+00:00", "status": "DEPLOYED_AUTO", "deployed": true, "algorithm": "weighted_behavioral_signals", diff --git a/api/nonreg-latest.json b/api/nonreg-latest.json index a217430e4..5234c6d1c 100644 --- a/api/nonreg-latest.json +++ b/api/nonreg-latest.json @@ -1 +1 @@ -{"ts": "20260421_022822", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 56.7, "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_024322", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 57.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 c01ce27da..08e0fdbfc 100644 --- a/api/nonreg-report.html +++ b/api/nonreg-report.html @@ -1 +1 @@ -NR 20260421_022822

WEVAL NonReg v3.2 — 20260421_022822

100%

153/153 PASS | 0 FAIL | 56.7s | 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-iRPASS301
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 121B
SMemAPIPASSJSON 196B
MstrAPIPASSJSON 211B
DifyAPIPASSJSON 479B
EvoAPIPASSJSON 143B
APcsAPIPASSJSON 125B
GooseAPIPASSJSON 177B
BrUseAPIPASSJSON 24B
EthPAPIPASSJSON 78B
RtrAPIPASSJSON 189B
NR-JSONAPIPASSJSON 774B
CRMAPIPASSJSON 25B
LvMetAPIPASSJSON 86B
MonDshAPIPASSJSON 1521B
IP-WVSECPASSClean
IP-WASECPASSClean
IP-CRMSECPASSClean
NucleiSECPASS0 finds
KumoMTAS95-BKPASSactive
PMTAS95-BKPASS2 procs (senders standby)
EthDBS95-BKPASS161730 ct
SendDBS95-BKPASS3097496 ct
S95-DskS95-BKPASS82%
DockerS95-BKPASSactive
WhatsAppC2-APIPASSJSON 351B
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-LeadsDATAPASS2055 leads
LinkedInDATAPASS2308 profiles
Ethica-DZDATAPASS122337 HCPs
Ethica-MADATAPASS19720 HCPs
Ethica-TNDATAPASS17794 HCPs
Ethica-CronsCRONSPASS17 cron entries (crontab-based)
Ethica-ScriptsCRONSPASS15 scripts
Blade-APIBLADEPASSJSON 296B
Blade-BrainBLADEPASS18B
Blade-AIBLADEPASS302
Blade-CtrBLADEPASS302
Sentinel-PS1BLADEPASS200 16KB
Life-APILIFEPASS50B
Life-AppLIFEPASS200 62KB
Life-HTMLLIFEPASS200 24KB
Blade-TGBLADEPASS11B
Blade-MMBLADEPASS108B
WEVIA-ChatFUNCPASSCerebras-fast 218ch
Life-ChatFUNCPASS36ch
Ethica-ChatFUNCPASS106ch
Monitor-UPFUNCPASS11 services UP
Ollama-LiveFUNCPASS7 models
Arsenal-HPFUNCPASS1378 screens
Ethica-HCPsFUNCPASS161730 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
EthFeed01AVRPASS161730 HCPs 20 feed
BladeAPI01AVRPASS200 296B
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_024322

WEVAL NonReg v3.2 — 20260421_024322

100%

153/153 PASS | 0 FAIL | 57.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-iRPASS301
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 121B
SMemAPIPASSJSON 196B
MstrAPIPASSJSON 211B
DifyAPIPASSJSON 479B
EvoAPIPASSJSON 143B
APcsAPIPASSJSON 125B
GooseAPIPASSJSON 177B
BrUseAPIPASSJSON 24B
EthPAPIPASSJSON 78B
RtrAPIPASSJSON 189B
NR-JSONAPIPASSJSON 1330B
CRMAPIPASSJSON 25B
LvMetAPIPASSJSON 86B
MonDshAPIPASSJSON 1519B
IP-WVSECPASSClean
IP-WASECPASSClean
IP-CRMSECPASSClean
NucleiSECPASS0 finds
KumoMTAS95-BKPASSactive
PMTAS95-BKPASS2 procs (senders standby)
EthDBS95-BKPASS161730 ct
SendDBS95-BKPASS3097496 ct
S95-DskS95-BKPASS82%
DockerS95-BKPASSactive
WhatsAppC2-APIPASSJSON 351B
WA-HookC2-APIPASS403
SpamScoreC2-APIPASS200
WEVADS-IAC2-SPAPASS200 13KB
BlacklistC2-WVPASS200 2KB
WorldDashC2-WVPASS200 15KB
SeedsC2-WVPASS200 1058KB
NR-APIC2-APIPASSJSON 1203B
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-LeadsDATAPASS2055 leads
LinkedInDATAPASS2308 profiles
Ethica-DZDATAPASS122337 HCPs
Ethica-MADATAPASS19720 HCPs
Ethica-TNDATAPASS17794 HCPs
Ethica-CronsCRONSPASS17 cron entries (crontab-based)
Ethica-ScriptsCRONSPASS15 scripts
Blade-APIBLADEPASSJSON 296B
Blade-BrainBLADEPASS18B
Blade-AIBLADEPASS302
Blade-CtrBLADEPASS302
Sentinel-PS1BLADEPASS200 16KB
Life-APILIFEPASS50B
Life-AppLIFEPASS200 62KB
Life-HTMLLIFEPASS200 24KB
Blade-TGBLADEPASS11B
Blade-MMBLADEPASS108B
WEVIA-ChatFUNCPASSCerebras-fast 229ch
Life-ChatFUNCPASS36ch
Ethica-ChatFUNCPASS270ch
Monitor-UPFUNCPASS11 services UP
Ollama-LiveFUNCPASS7 models
Arsenal-HPFUNCPASS1378 screens
Ethica-HCPsFUNCPASS161730 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
EthFeed01AVRPASS161730 HCPs 20 feed
BladeAPI01AVRPASS200 296B
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/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 5cedb8221..566806708 100644 --- a/api/v83-business-kpi-latest.json +++ b/api/v83-business-kpi-latest.json @@ -1,7 +1,7 @@ { "ok": true, "version": "V83-business-kpi", - "ts": "2026-04-21T00:39:34+00:00", + "ts": "2026-04-21T00:44:02+00:00", "summary": { "total_categories": 8, "total_kpis": 64, diff --git a/api/wevia-v83-business-kpi.php b/api/wevia-v83-business-kpi.php index 137e983a3..a0e46a470 100644 --- a/api/wevia-v83-business-kpi.php +++ b/api/wevia-v83-business-kpi.php @@ -232,7 +232,7 @@ $kpis = [ ["id" => "wtp_modules_erp", "label" => "WTP ERP modules (point entrée unique)", "value" => 16, "unit" => "modules", "target" => 16, "trend" => "live", "status" => "ok", "source" => "TREE.modules count", "drill" => "/weval-technology-platform.html"], ["id" => "wtp_submodules", "label" => "Submodules navigables depuis WTP", "value" => safe_int('curl -sk --max-time 3 "http://127.0.0.1/api/weval-technology-platform-api.php?lite=1" -H "Host: weval-consulting.com" 2>/dev/null | grep -o submodules | wc -l'), "unit" => "submodules", "target" => 150, "trend" => "live", "status" => "ok", "source" => "TREE.modules.*.submodules", "drill" => "All ERP subsections"], ["id" => "pages_total_s204", "label" => "Total HTML pages S204", "value" => safe_int("find /var/www/html -maxdepth 1 -name '*.html' 2>/dev/null | grep -vE '\\.(bak|gold|bk_|pre-)' | wc -l"), "unit" => "pages", "target" => 300, "trend" => "live", "status" => "ok", "source" => "find /var/www/html", "drill" => "All navigable pages"], - ["id" => "tools_exec_ratio", "label" => "Tools exec-able ratio (V97)", "value" => safe_int('jq "[.tools[] | select(.exec==true)] | length * 100 / ([.tools] | length)" /var/www/html/api/wevia-tool-registry.json 2>/dev/null | cut -d. -f1'), "unit" => "percent", "target" => 50, "trend" => "live", "status" => "warn", "source" => "wevia-tool-registry.json", "drill" => "V97 Zero Dormant 258 activated"], + ["id" => "tools_exec_ratio", "label" => "Tools exec-able ratio (V97)", "value" => safe_int('jq "([.tools[] | select(.exec==true)] | length) * 100 / (.tools | length)" /var/www/html/api/wevia-tool-registry.json 2>/dev/null | cut -d. -f1'), "unit" => "percent", "target" => 50, "trend" => "live", "status" => "warn", "source" => "wevia-tool-registry.json", "drill" => "V97 Zero Dormant 258 activated"], ["id" => "l99_score", "label" => "L99 NonReg score (health)", "value" => safe_int("jq -r '.score // 0' /var/www/html/api/nonreg-latest.json 2>/dev/null"), "unit" => "percent", "target" => 100, "trend" => "live", "status" => "ok", "source" => "nonreg-latest.json", "drill" => "153/153 PASS maintained"] ] ]