Despues del cutover, la suite no servia para verificar www.feadulta.com: el WAF
de Cloudflare devuelve 403 a las IPs desde las que corremos (la de Rafa y la del
propio Hetzner), asi que por el dominio real no se comprueba nada.
run.js acepta ahora hostResolverRules en el JSON del sitio y se lo pasa a
Chromium como --host-resolver-rules. El navegador va directo al origen con el
Host correcto, que es justo lo que queremos comprobar: lo que hemos cambiado es
el origen, no Cloudflare.
Se anade sites/www.json con las 11 URLs de produccion. Resultado del 3-ago tras
el cutover: 11 de 11 en 200. Los WARN que salen son dos falsos positivos, ambos
comprobados:
- la baliza de GA4 aborta al cerrar la pagina en headless, y de paso confirma
que GA4 dispara desde el servidor nuevo con el G-6RT9ZRS4LW correcto.
- la "imagen rota" es un img con src vacio que crea el lazy-loader en tiempo de
ejecucion. En el HTML no existe en ninguno de los dos servidores, y el numero
de imagenes es identico entre Hetzner y CDMON (4 y 4 en las entradas, 1.253 y
1.253 en el listado de autores).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
El runner necesita el array 'urls'; el fichero solo tenia baseUrl. Se anaden 11
targets: portadas de los 5 idiomas, carta de la semana, un articulo, evangelio
del dia, buscador, wp-admin y wp-login.
Resultado de la corrida contra nuevo.feadulta.com: los 6 puntos en verde
(5 idiomas 200, carta de la semana con sus enlaces, permalink de articulo,
buscador con 7.344 resultados para "evangelio", wp-admin/wp-login, y CERO
errores PHP en el HTML). Los WARN son imagenes que aun no habian llegado por el
rsync en curso, no fallos de la migracion.
Nota para no volver a asustarse: 6.195 guid de adjuntos apuntan al WordPress
local (IP de Tailscale). Es cosmetico: el guid no sirve imagenes. Lo que las
sirve es _wp_attached_file, y las 7.755 son rutas relativas, 0 absolutas, con
upload_path y upload_url_path vacias.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Con los tiempos REALES medidos en el ensayo del 31-jul, no estimados:
dump 25s + subida 74s + saneo 2s + import 107s = camino critico ~3min30s.
- docs/cutover/RUNBOOK-cutover-wordpress.md: los pasos en orden, copiables, con
el rollback y los tres verdes obligatorios previos (freeze, CDMON vivo, modo
SSL de la zona).
- scripts/cutover/post-import-seguridad.sh: rota la contrasena de los 6
administradores (las lee del .env del perfil, nunca van en el repo), retira el
rol a pabloarias/josek/andrey y limpia los cron huerfanos de Yoast y WP
Profile Builder. Es un script y no una tarea manual porque el dump revive esas
cuentas en CADA import.
- tools/e2e/sites/nuevo.json: la suite toma el host de un JSON, asi que apuntarla
al staging es anadir un fichero.
Hallazgo del ensayo: el origen es MariaDB 11.8.6 y el destino MySQL 8.4.10; el
dump trae 20 tablas con collations uca1400_* que MySQL rechaza. El saneo las
mapea antes de importar. Sin ese paso, el import aborta.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- scripts/fix_image_paths.php: reescribe src/href "images/..." en wp_posts
a "/fea/wp-content/uploads/..." cuando el fichero existe en uploads.
Cubre comillas dobles/simples, urldecode antes de chequear filesystem.
Resuelto contra issue #34 (458 posts, 465 refs) y completado con #36
(124 posts, 128 refs tras recuperar 127 assets del backup producción).
- tools/e2e/: pipeline 3-tier para validar WP local con coste mínimo en
tokens de Claude — Playwright (Tier 1, deterministas) + Gemma 4 vision
en LM Studio (Tier 2, bajo demanda) + Claude solo lee report.md.
Issue de diseño #37, suite inicial en sites/feadulta.json (13 URLs).
- .gitignore: excluir tools/e2e/node_modules y out/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>