[QA] Proceso de verificación automática del sitio (crawler + i18n + review LLM local) — OSS, coste cero #130
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Labels: area:infra, improvement
Motivación
Tras desplegar el multiidioma (#120), aparecen bugs dispersos (enlaces rotos, páginas que salen en español, redirecciones de idioma incorrectas, layout roto). Hace falta un proceso de verificación automática y repetible que recorra el sitio entero, valide enlaces/idiomas/maquetación y reporte qué no tiene sentido — sin depender de revisión manual.
Principios / restricciones (IMPORTANTES)
google/gemma-4-e4b, endpointhttp://172.19.128.1:1234/v1). Coste cero.Principio de diseño (cómo lo hacen los profesionales)
Separar en capas: lo determinista (barato, exhaustivo, sobre TODOS los enlaces) primero; la IA (cara) solo sobre lo que las capas baratas marcan como sospechoso.
Capa 0 — Crawler de enlaces (determinista, todas las URLs)
Recorre cada URL: status HTTP (200/3xx/4xx/5xx), redirecciones inesperadas (sobre todo cross-idioma:
/en/x/que acaba en/it/x/= bug), enlaces internos rotos, páginas huérfanas, bucles.lychee(Rust, rapidísimo) olinkchecker(Python) para el barrido de status; Playwright (ya instalado entools/e2e) para seguir redirecciones y comparar URL final vs pedida.Capa 1 — Aserciones i18n (determinista, dirigido) — LA DE MÁS ROI
/en/X/sirve un post EN o redirige? Comparar URL final.<html lang>y el selector de idioma son coherentes?lingua-language-detector(Python, muy preciso, offline) olangdetect/fasttext lid.176. Cero coste.Capa 2 — Regresión visual (determinista)
Screenshots por página/idioma + diff de píxeles para detectar roturas de layout (como el multimedia descentrado).
pixelmatch/odiff. Guardar baseline y comparar.Capa 3 — Juicio semántico con LLM local (muestreado / solo sobre flags)
Solo sobre las páginas que la Capa 1 marcó, o una muestra pequeña:
{coherente: bool, idioma_ok: bool, problemas: [...]}(mistraducciones, trozos sin traducir, sin sentido).tools/e2e/ask-vision.js) → «¿se ve bien / algo roto?».Capa 4 — (opcional, futuro) Monitorización programada
Cron local que corre un subconjunto y avisa (Telegram/WhatsApp via Hermes) si hay regresiones. Sin SaaS.
Dónde ejecutar
Contra el LOCAL (
https://farmer.taild3aaf6.ts.net/fea/...), que no tiene Cloudflare bloqueando headless. Verificar AQUÍ antes de desplegar a prod. (Prodwp-nuevo.feadulta.comestá tras Cloudflare → 403 a curl/Playwright; no sirve para crawl headless.)Enumeración de URLs (no crawlear a ciegas)
Generar la lista desde la BD de WordPress (más fiable que el sitemap):
language; 5 idiomas es/en/fr/it/pt).wp_navigationIDs 1 y 26525-26528) y sus URLs.wordpress-mysql,wordpress_db/wordpress_user/wordpress_pass.Recursos existentes a reutilizar
tools/e2e/— Playwright + helper de visiónask-vision.js(Gemma). Verproject-feadulta-e2e/ wikiE2E-Visual-Testing.http://172.19.128.1:1234/v1/chat/completions, modelogoogle/gemma-4-e4b(texto) — multimodal para visión.https://farmer.taild3aaf6.ts.net/fea/{lang}/{slug}/(ES sin prefijo de idioma).Salida esperada
Un informe único (CSV + JSON) por ejecución con, por URL: idioma esperado, status, URL final (¿redirige?), idioma detectado, nº enlaces rotos salientes, flags (
SPANISH_LEAK,CROSS_LANG_REDIRECT,BROKEN_LINK,LAYOUT_DIFF,LLM_FLAGGED). Ordenable por gravedad. Que de un vistazo se vea qué arreglar.Implementación por fases (entregables en
tools/e2e/)Criterios de aceptación
node tools/e2e/<crawler>.js(opython) recorre TODAS las URLs de los 5 idiomas contra el local y genera el informe sin intervención manual.navidad-3→404 antes del fix), redirección cross-idioma (caso slug duplicado/en/colaboradores/→/it/...), y página EN con texto español (caso widget/menú sin traducir).Notas para el implementador (Codex / Minimax)
tools/e2e; Python también disponible en WSL con las libs OSS citadas).READMEentools/e2e/explicando cómo ejecutarlo y cómo leer el informe.