diff --git a/api/agent-leads-sync.json b/api/agent-leads-sync.json index 2ba34ee23..99bb1511c 100644 --- a/api/agent-leads-sync.json +++ b/api/agent-leads-sync.json @@ -1,6 +1,6 @@ { "agent": "V45_Leads_Sync", - "ts": "2026-04-22T10:30:03+02:00", + "ts": "2026-04-22T10:40:02+02:00", "paperclip_total": 48, "active_customer": 4, "warm_prospect": 5, diff --git a/api/ambre-export-v50.php b/api/ambre-export-v50.php new file mode 100644 index 000000000..0bab2ef16 --- /dev/null +++ b/api/ambre-export-v50.php @@ -0,0 +1,11 @@ +[]]; +foreach (glob("$src/v50-*.png") as $s) { + $bn = "wevia-v50-shield-" . basename($s); + @copy($s, "$dst/$bn"); + $out["copied"][] = "/generated/$bn"; +} +echo json_encode($out, JSON_UNESCAPED_SLASHES); diff --git a/api/ambre-pw-tests/output/results.json b/api/ambre-pw-tests/output/results.json index dd641a03d..33491e2b4 100644 --- a/api/ambre-pw-tests/output/results.json +++ b/api/ambre-pw-tests/output/results.json @@ -59,13 +59,13 @@ }, "suites": [ { - "title": "v49-leaks.spec.js", - "file": "v49-leaks.spec.js", + "title": "v50-shield.spec.js", + "file": "v50-shield.spec.js", "column": 0, "line": 0, "specs": [ { - "title": "V49 · Scan public leaks on / and /wevia.html", + "title": "V50 · PROOF shield removes leaks on public pages", "ok": true, "tags": [], "tests": [ @@ -80,30 +80,33 @@ "workerIndex": 0, "parallelIndex": 0, "status": "passed", - "duration": 12412, + "duration": 14583, "errors": [], "stdout": [ { - "text": "ROOT / leaks: [\n {\n \"id\": \"opus-udrill\",\n \"tag\": \"div\",\n \"text\": \"\",\n \"position\": \"fixed\",\n \"visible\": false\n },\n {\n \"id\": \"opus-udrill-in\",\n \"tag\": \"div\",\n \"text\": \"\",\n \"position\": \"static\",\n \"visible\": false\n },\n {\n \"id\": \"opus-dashboard-entry\",\n \"tag\": \"div\",\n \"text\": \"📊\\nDashboards\",\n \"position\": \"fixed\",\n \"visible\": false\n },\n {\n \"id\": \"opus-dashboard-link\",\n \"tag\": \"a\",\n \"text\": \"📊\\nDashboards\",\n \"position\": \"static\",\n \"visible\": true\n }\n]\n" + "text": "ROOT / state: {\n \"size\": 92741,\n \"has_claude_pattern\": false,\n \"has_wtp_dock_visible\": false,\n \"has_dashboards_fixed\": false,\n \"shield_loaded\": true,\n \"visible_fixed_internal\": 0\n}\n" }, { - "text": "\nWEVIA public leaks: {\n \"elements\": [\n {\n \"id\": \"opus-udrill\",\n \"tag\": \"div\",\n \"text\": \"\",\n \"visible\": false\n },\n {\n \"id\": \"opus-udrill-in\",\n \"tag\": \"div\",\n \"text\": \"\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-style\",\n \"tag\": \"style\",\n \"text\": \"\\n#opus-pattern-badge{position:fixed;bottom:20px;right:20px;z-index:99990;\\n background:linear-gradient(135deg,#06b6d4,#8b5cf6);color:#fff;\\n padding:10px 16px;border-radius:20px;font:700 0.78rem -appl\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-badge\",\n \"tag\": \"div\",\n \"text\": \"🧠\\nClaude Pattern\\n×\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-modal\",\n \"tag\": \"div\",\n \"text\": \"\\n \\n ×\\n 🧠 Claude Pattern · 7 phases REAL (SSE live)\\n Backend: wevia · anti-hallucination · langue naturelle\\n \\n ▶ Lancer (SSE stream)\\n \\n \\n\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-box\",\n \"tag\": \"div\",\n \"text\": \"\\n ×\\n 🧠 Claude Pattern · 7 phases REAL (SSE live)\\n Backend: wevia · anti-hallucination · langue naturelle\\n \\n ▶ Lancer (SSE stream)\\n \\n \",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-close\",\n \"tag\": \"button\",\n \"text\": \"×\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-bot\",\n \"tag\": \"b\",\n \"text\": \"wevia\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-input\",\n \"tag\": \"input\",\n \"text\": \"\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-run\",\n \"tag\": \"button\",\n \"text\": \"▶ Lancer (SSE stream)\",\n \"visible\": false\n },\n {\n \"id\": \"opus-pattern-output\",\n \"tag\": \"div\",\n \"text\": \"\",\n \"visible\": false\n }\n ],\n \"has_claude_pattern_visible\": true,\n \"has_admin_droid\": false\n}\n" + "text": "\nWEVIA /wevia.html state: {\n \"has_claude_pattern_text\": true,\n \"opus_pattern_badge_visible\": false,\n \"opus_pattern_style_present\": false,\n \"shield_loaded\": true\n}\n" + }, + { + "text": "\nShield logs: [\n \u001b[32m'[ambre-confidential-shield] active on public page: /'\u001b[39m,\n \u001b[32m'[ambre-confidential-shield] active on public page: /wevia.html'\u001b[39m\n]\n" } ], "stderr": [], "retry": 0, - "startTime": "2026-04-22T08:38:00.522Z", + "startTime": "2026-04-22T08:40:54.061Z", "annotations": [], "attachments": [ { "name": "screenshot", "contentType": "image/png", - "path": "/var/www/html/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/test-finished-1.png" + "path": "/var/www/html/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/test-finished-1.png" }, { "name": "video", "contentType": "video/webm", - "path": "/var/www/html/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/video.webm" + "path": "/var/www/html/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/video.webm" } ] } @@ -111,8 +114,8 @@ "status": "expected" } ], - "id": "1d078d0a0c1e48dab484-6744feaa8020affef2db", - "file": "v49-leaks.spec.js", + "id": "c4437ee0b3e93e42f44a-f31147eb9ccc1a4424da", + "file": "v50-shield.spec.js", "line": 3, "column": 1 } @@ -121,8 +124,8 @@ ], "errors": [], "stats": { - "startTime": "2026-04-22T08:37:59.940Z", - "duration": 13140.461, + "startTime": "2026-04-22T08:40:53.293Z", + "duration": 15561.267, "expected": 1, "skipped": 0, "unexpected": 0, diff --git a/api/ambre-pw-tests/output/v49-01-root.png b/api/ambre-pw-tests/output/v49-01-root.png deleted file mode 100644 index 6ecc1f124..000000000 Binary files a/api/ambre-pw-tests/output/v49-01-root.png and /dev/null differ diff --git a/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/video.webm b/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/video.webm deleted file mode 100644 index a2756b3a8..000000000 Binary files a/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/video.webm and /dev/null differ diff --git a/api/ambre-pw-tests/output/v50-01-root.png b/api/ambre-pw-tests/output/v50-01-root.png new file mode 100644 index 000000000..b58cf5948 Binary files /dev/null and b/api/ambre-pw-tests/output/v50-01-root.png differ diff --git a/api/ambre-pw-tests/output/v49-02-wevia.png b/api/ambre-pw-tests/output/v50-02-wevia.png similarity index 57% rename from api/ambre-pw-tests/output/v49-02-wevia.png rename to api/ambre-pw-tests/output/v50-02-wevia.png index f71878316..9878100de 100644 Binary files a/api/ambre-pw-tests/output/v49-02-wevia.png and b/api/ambre-pw-tests/output/v50-02-wevia.png differ diff --git a/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/test-finished-1.png b/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/test-finished-1.png similarity index 57% rename from api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/test-finished-1.png rename to api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/test-finished-1.png index f71878316..9878100de 100644 Binary files a/api/ambre-pw-tests/output/v49-leaks-V49-·-Scan-public-leaks-on-and-wevia-html-chromium/test-finished-1.png and b/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/test-finished-1.png differ diff --git a/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/video.webm b/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/video.webm new file mode 100644 index 000000000..ff039f4ba Binary files /dev/null and b/api/ambre-pw-tests/output/v50-shield-V50-·-PROOF-shield-removes-leaks-on-public-pages-chromium/video.webm differ diff --git a/api/ambre-pw-tests/tests/v49-leaks.spec.js b/api/ambre-pw-tests/tests/v49-leaks.spec.js deleted file mode 100644 index b2d9724b4..000000000 --- a/api/ambre-pw-tests/tests/v49-leaks.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -const { test } = require("@playwright/test"); - -test("V49 · Scan public leaks on / and /wevia.html", async ({ page }) => { - test.setTimeout(60000); - - // Scan / - await page.goto("/?cb=" + Date.now()); - await page.waitForLoadState("networkidle"); - await page.waitForTimeout(3000); - - const rootLeaks = await page.evaluate(() => { - const ids = Array.from(document.querySelectorAll('[id*="opus"], [id*="pattern"], [id*="dock"], [id*="xlinks"], [id*="xnav"]')); - return ids.map(el => ({ - id: el.id, - tag: el.tagName.toLowerCase(), - text: (el.innerText || "").substring(0, 200), - position: window.getComputedStyle(el).position, - visible: el.offsetParent !== null, - })); - }); - console.log("ROOT / leaks:", JSON.stringify(rootLeaks, null, 2)); - await page.screenshot({ path: "output/v49-01-root.png", fullPage: false }); - - // Scan /wevia.html - await page.goto("/wevia.html?cb=" + Date.now()); - await page.waitForLoadState("networkidle"); - await page.waitForTimeout(3000); - - const weviaLeaks = await page.evaluate(() => { - const ids = Array.from(document.querySelectorAll('[id*="opus"], [id*="pattern"], [id*="dock"], [id*="xlinks"], [id*="xnav"], [id*="udock"]')); - const out = ids.map(el => ({ - id: el.id, - tag: el.tagName.toLowerCase(), - text: (el.innerText || "").substring(0, 200), - visible: el.offsetParent !== null, - })); - // Also look for "Claude Pattern" text anywhere visible - const bodyText = document.body.innerText; - const has_claude_p = /Claude\s*Pattern/i.test(bodyText); - const has_admin_badge = /\bAdmin\b/i.test(bodyText) && /\bDroid\b/i.test(bodyText); - return { elements: out, has_claude_pattern_visible: has_claude_p, has_admin_droid: has_admin_badge }; - }); - console.log("\nWEVIA public leaks:", JSON.stringify(weviaLeaks, null, 2)); - await page.screenshot({ path: "output/v49-02-wevia.png", fullPage: false }); -}); diff --git a/api/ambre-pw-tests/tests/v50-shield.spec.js b/api/ambre-pw-tests/tests/v50-shield.spec.js new file mode 100644 index 000000000..75bc6ad20 --- /dev/null +++ b/api/ambre-pw-tests/tests/v50-shield.spec.js @@ -0,0 +1,51 @@ +const { test } = require("@playwright/test"); + +test("V50 · PROOF shield removes leaks on public pages", async ({ page }) => { + test.setTimeout(60000); + const logs = []; + page.on("console", m => logs.push(m.text().substring(0, 150))); + + // Test / + await page.goto("/?cb=" + Date.now()); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(3500); + + const rootState = await page.evaluate(() => { + const bodyText = document.body.innerText; + return { + size: document.body.innerHTML.length, + has_claude_pattern: /Claude\s*Pattern/i.test(bodyText), + has_wtp_dock_visible: Array.from(document.querySelectorAll('[id*="dock"], [id*="xlinks"], [id*="xnav"]')).some(el => el.offsetParent !== null && /wtp|droid|admin/i.test(el.innerText)), + has_dashboards_fixed: Array.from(document.querySelectorAll('#opus-dashboard-link, [id*="dashboard-entry"]')).some(el => el.offsetParent !== null), + shield_loaded: !!document.getElementById('ambre-confidential-shield'), + visible_fixed_internal: Array.from(document.querySelectorAll('a[href*="weval-technology-platform"], a[href*="wevia-master"], a[href*="all-ia-hub"]')) + .filter(a => { + var s = window.getComputedStyle(a); + return s.position === 'fixed' && a.offsetParent !== null; + }).length, + }; + }); + console.log("ROOT / state:", JSON.stringify(rootState, null, 2)); + await page.screenshot({ path: "output/v50-01-root.png", fullPage: false }); + + // Test /wevia.html + await page.goto("/wevia.html?cb=" + Date.now()); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(3500); + + const weviaState = await page.evaluate(() => { + const bodyText = document.body.innerText; + return { + has_claude_pattern_text: /Claude\s*Pattern/i.test(bodyText), + opus_pattern_badge_visible: (function(){ var el = document.getElementById('opus-pattern-badge'); return el ? el.offsetParent !== null : false; })(), + opus_pattern_style_present: !!document.getElementById('opus-pattern-style'), + shield_loaded: !!document.getElementById('ambre-confidential-shield'), + }; + }); + console.log("\nWEVIA /wevia.html state:", JSON.stringify(weviaState, null, 2)); + await page.screenshot({ path: "output/v50-02-wevia.png", fullPage: false }); + + // Shield console logs + const shieldLogs = logs.filter(l => l.includes('shield')); + console.log("\nShield logs:", shieldLogs); +}); diff --git a/api/ambre-pw-v50-deploy.php b/api/ambre-pw-v50-deploy.php new file mode 100644 index 000000000..88c835449 --- /dev/null +++ b/api/ambre-pw-v50-deploy.php @@ -0,0 +1,7 @@ + $written]); diff --git a/api/mql-scoring-status.json b/api/mql-scoring-status.json index 8c2856b9b..0f44e7160 100644 --- a/api/mql-scoring-status.json +++ b/api/mql-scoring-status.json @@ -1,27 +1,27 @@ { "ok": true, "agent": "V42_MQL_Scoring_Agent_REAL", - "ts": "2026-04-22T08:30:02+00:00", + "ts": "2026-04-22T08:40:01+00:00", "status": "DEPLOYED_AUTO", "deployed": true, "algorithm": "weighted_behavioral_signals", "signals_tracked": { - "wtp_engagement": 8, + "wtp_engagement": 100, "chat_engagement": 0, "roi_tool": 0, "email_opened": 0 }, - "avg_score": 2, + "avg_score": 25, "mql_threshold": 50, "sql_threshold": 75, "leads_captured": 48, - "mql_auto_scored": 17, - "sql_auto_scored": 7, - "mql_auto_pct": 36, + "mql_auto_scored": 20, + "sql_auto_scored": 8, + "mql_auto_pct": 41, "improvement_vs_manual": { "before_manual_pct": 33.3, - "after_auto_pct": 36, - "delta": 2.700000000000003 + "after_auto_pct": 41, + "delta": 7.700000000000003 }, "paperclip_db_ok": true, "paperclip_tables": 2, diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 6538e0f50..b69ea6e83 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-22T08:39:55+00:00", + "ts": "2026-04-22T08:44:49+00:00", "summary": { "total_categories": 8, "total_kpis": 64, diff --git a/generated/wevia-v50-shield-v50-01-root.png b/generated/wevia-v50-shield-v50-01-root.png new file mode 100644 index 000000000..b58cf5948 Binary files /dev/null and b/generated/wevia-v50-shield-v50-01-root.png differ diff --git a/generated/wevia-v50-shield-v50-02-wevia.png b/generated/wevia-v50-shield-v50-02-wevia.png new file mode 100644 index 000000000..9878100de Binary files /dev/null and b/generated/wevia-v50-shield-v50-02-wevia.png differ