# tools/e2e — Suite E2E económica en tokens Pipeline de revisión visual/funcional con coste mínimo en tokens de Claude. Diseño 3-tier: | Tier | Quién | Coste tokens Claude | |---|---|---| | 1 — Programático | Playwright local | **0** | | 2 — LLM local vision | Gemma 4 vision en LM Studio | 0 | | 3 — Claude | Lee `report.md` (texto) | Mínimo | Issue de diseño: rafa/feadulta#37. ## Setup ```bash cd tools/e2e npm install # instala playwright 1.58.2 (reaprovecha browsers ya en ~/.cache/ms-playwright/) ``` ## Uso — Tier 1 (sin LLM) ```bash # Suite completa node run.js feadulta # Una sola URL por slug node run.js feadulta home-es # Subconjunto node run.js feadulta --only=home-es,effa-hub,carta-semana ``` Genera por cada pasada: ``` out/// report.json # datos crudos report.md # tabla legible .png # screenshot full-page por URL out//latest -> # symlink al último run ``` Métricas por URL: HTTP status, console errors/warnings, page errors, requests fallidas (≥400), `` con `naturalWidth==0`, ``, `<h1>`, word count, tiempo de carga. Severity: - `OK` — sin problemas detectados - `WARN` — imágenes rotas, requests 4xx, console errors - `FAIL` — HTTP ≥ 400 o error de navegación ## Uso — Tier 2 (vision Gemma 4) ```bash # Pregunta ad hoc sobre una captura node ask-vision.js out/feadulta/latest/post-tolle-44247.png \ "¿Se ve la foto de Eckhart Tolle? ¿Hay placeholders rotos?" # Auto: pasa cada captura WARN/FAIL a la vision y escribe vision.md node ask-vision.js --auto out/feadulta/latest ``` Variables de entorno (opcionales): - `LMSTUDIO_URL` — default `http://172.19.128.1:1234/v1` (gateway WSL→Windows) - `LMSTUDIO_MODEL` — default `google/gemma-4-e4b` - `MAX_TOKENS` — default 800 - `TEMPERATURE` — default 0.2 Requisito: LM Studio cargado con un modelo multimodal y escuchando en `0.0.0.0:1234`. ## Añadir un sitio Crear `sites/<nombre>.json`: ```json { "name": "ytsummaries", "baseUrl": "https://farmer.taild3aaf6.ts.net", "viewport": { "width": 1366, "height": 900 }, "timeoutMs": 30000, "userAgent": "ytsummaries-e2e/0.1", "urls": [ { "slug": "home", "path": "/yt/" }, { "slug": "admin", "path": "/yt/wp-admin/" } ] } ``` `baseUrl + path` se concatena tal cual. Ejecutar con `node run.js ytsummaries`. ## Diseño - **Sin LLM por defecto:** los checks deterministas (HTTP/console/`naturalWidth`) cubren los fallos reales. - **Vision bajo demanda:** Gemma 4 solo entra cuando hace falta opinar sobre maquetación o cuando Tier 1 marca algo raro. - **Claude solo lee texto:** `report.md` cabe en ~10 KB. Las PNG no entran al contexto salvo que el usuario lo pida. - **Stateless:** cada pasada vive en su propia carpeta timestamp. `latest` es symlink. - **Reutilizable:** el runner no sabe nada de feadulta; solo conoce el formato `sites/<x>.json`. ## Limitaciones conocidas - Gemma 4 a veces escribe razonamiento antes de la respuesta final. `ask-vision.js` intenta extraer "Final Answer:" o la primera etiqueta `[OK]/[WARN]/[FAIL]`. - No hay comparación con baseline aún. El runner solo describe el estado actual. Snapshot/pHash es trivial de añadir cuando se quiera detección de regresiones contra una pasada anterior. - Playwright 1.58.2 está pineado para reaprovechar los browsers ya cacheados (`chromium_headless_shell-1208`). Subir a 1.60+ requiere `npx playwright install`.