CDMON tiene ModSecurity a nivel de hosting: fue lo que detecto las subidas de
wp-cl.php y health-check.php durante el incidente #183. En Hetzner, con Traefik,
NO hay WAF ninguno. Migrar tal cual estrenaria servidor con una capa defensiva
menos que la que tenia el sitio comprometido.
Wordfence 8.2.2 instalado limpio desde wordpress.org en el staging y verificado:
portada 200, wp-login 200, sin fatales, y fea-cloudflare-realip.php presente (sin
el veria todas las visitas como si vinieran de Cloudflare).
Queda en proteccion basica: el extended protection exige auto_prepend_file desde
su asistente y eso se hace despues del cutover, no en la ventana.
Anotado tambien que Wordfence y limit-login-attempts-reloaded solapan en el
bloqueo de login; hay que decidir cual manda.
Y documentada en el paso 6 la retirada de wordfence_core_options, que pese al
nombre no es de Wordfence sino el payload de spam del atacante.
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>
La regla del #180 comment-516 dice "recrear los fea-* desde el repo", pero
carta-semana-plugin.php y stop-redirects.php estan vivos en produccion y no
empiezan por fea-: un glob los dejaria fuera. El despliegue copia esta lista.
28 ficheros con su sha256. Excluidos a proposito los .bak-*, el .disabled,
el health-check.php.quarantined-incident-183 (backdoor del #183) y
fea-support-campaign.php, que esta en el repo pero nunca llego a desplegarse.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Este repo local tenia origin apuntando al Gitea local (localhost:3000), que Rafa
declaro archivado el 2026-06-28 (commit 962f33a, desarrollo movido a
gitea.feadulta.com). Ese memo nunca llego a este checkout: main quedo congelado
y todo el trabajo real de las ultimas 3+ semanas se fue commiteando solo en la
rama fix/multiidioma-portada-132 (ya fusionada a main sin perdida, commit
2504666), mientras que ademas se acumulaban 78 cambios sin commitear en el
working tree que nunca llegaron a NINGUN historial de git.
Este commit consolida esos cambios sueltos: TTS multi-voz (tts_*.py), scripts
de traduccion (translate_haiku.py, pretranslate_en_haiku.py, sync_translations_to_prod.py),
mu-plugins nuevos desplegados a prod (fea-beta-feedback, fea-cloudflare-realip,
fea-legacy-redirect, fea-gsc-verification, fea-support-campaign, fea-ui, etc.),
scripts de mantenimiento de enlaces/cartas, capturas E2E (tools/e2e/shot_*.cjs)
y documentacion de sesiones recientes.
Excluido deliberadamente (no es codigo versionable): tts-voices/ (3.3GB de
muestras de audio para clonacion de voz, anadido a .gitignore), logs/ (logs de
ejecucion, anadido a .gitignore), y 2 ficheros vacios accidentales + 2 copias
duplicadas sueltas en la raiz que ya existen en su ubicacion correcta.
Plan ejecutado por Sonnet: replica el «Buscador avanzado» K2 con WP nativo
+ MySQL FULLTEXT (palabra, autor, categoría, cita bíblica, fecha).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Plan ejecutable (para Sonnet) de la fase 2: arquitectura, schema, indexador,
UI InstantSearch con faceta de autor, seguridad de claves y verificación.
La decisión de dónde corre Typesense en producción queda pendiente; todo lo
demás se puede construir y validar en local.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Guía para el asistente de Inma: conexión por REST API, modelo
carta->portada, categorías, flujo de publicación y qué es automático.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>