Files
html/api/verify5.js
Opus 5ee3643a83
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
phase60 doctrine 202 WEVIA GEMINI UX APPLY BATCH - 5 products pages with premium CSS + chat NL intent
Batch apply 5 products pages with Gemini premium CSS:
- leadforge (phase 59) size 40588 -> 52279 css 9424
- academy size 27264 -> 38428 css 9241
- consulting size 21628 -> 30061 css 8433
- ai-sdr size 18264 -> 29446 css ~11K
- arsenal size 37333 -> 47227 css ~9.9K

All 5 pages:
- APPLIED marker DOCTRINE-201-GEMINI-APPLY present idempotent
- HTTP 200 confirmed
- Playwright audit POST-apply: tr:0 br:0 ALL 5 pages = 0 REGRESSION

Intent chat NL stub deployed:
- /var/www/html/api/wired-pending/intent-opus4-wevia_gemini_ux_apply.php
- 10 triggers: gemini ux apply, apply ux gemini, refais ux apply, applique ux gemini, etc.
- Extracts page name from NL via regex then calls handler with apply mode
- status EXECUTED priority P1

auditai page failed (rate limit Gemini, retry later)

Architecture WEVIA chat NL -> Gemini premium UX:
- Yacine says chat: apply ux gemini <page>
- WEVIA routes to intent-opus4-wevia_gemini_ux_apply
- Calls wevia-gemini-ux-apply.sh <page> apply
- Pipeline: Playwright shot -> Gemini CSS gen -> Parser -> GOLD backup -> Inject -> verify
- Returns proof URL + applied:true + sizes

Cumul:
- 59 tags Opus
- 41 doctrines (146-202)
- 428 pages UX doctrine 60 + 5 pages CSS Gemini APPLIED
- NR 153/153 invariant 60 phases

Scalable: mm pattern peut appliquer sur toutes 428 pages batch.
2026-04-24 17:30:36 +02:00

40 lines
1.6 KiB
JavaScript

const { chromium } = require("playwright");
(async () => {
const PAGES = ["leadforge","academy","consulting","ai-sdr","arsenal"];
const browser = await chromium.launch({ headless: true, args: ["--no-sandbox","--disable-gpu","--disable-dev-shm-usage"] });
const results = [];
for (const name of PAGES) {
let ctx;
try {
ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
const pg = await ctx.newPage();
await pg.goto("https://weval-consulting.com/products/" + name + ".html", { waitUntil: "domcontentloaded", timeout: 15000 });
await pg.waitForTimeout(2500);
const r = await pg.evaluate(() => {
const fn = (x1,y1,x2,y2) => {
const all = document.querySelectorAll("button,.btn,.toggle,.tab,[class*=btn],.chip,.badge,.fab");
let n = 0;
for (const el of all) {
const r = el.getBoundingClientRect();
if (r.width<2 || r.height<2) continue;
const pos = getComputedStyle(el).position;
if (pos !== "fixed" && pos !== "absolute") continue;
const cx=r.x+r.width/2, cy=r.y+r.height/2;
if (cx>=x1 && cx<=x2 && cy>=y1 && cy<=y2) n++;
}
return n;
};
return { tr: fn(1040,0,1440,400), br: fn(1040,500,1440,900) };
});
results.push({ p: name, tr: r.tr, br: r.br });
await pg.close();
await ctx.close();
} catch (e) {
results.push({ p: name, err: e.message.slice(0,60) });
try { await ctx.close(); } catch {}
}
}
await browser.close();
console.log(JSON.stringify({ results }));
})();