fix(seo): el canónico del ES es el APEX, no www
Build & Deploy ResearchOwl / build-and-push (push) Successful in 10s

Cada enlace interno que el generador escribía en un borrador español apuntaba
a www.zonadeexclusion.com y se comía un 301. El canónico de los dos blogs está
INVERTIDO —EN es www, ES es el apex—, la misma inversión que provocó el 522 y
de la que ya avisa el wrapper ghst-es.

No es teórico: el enlace www suelto que apareció en los-villares salió de aquí.
El corpus ES está limpio hoy, pero el próximo /generate con enlaces lo habría
reintroducido. Nada río abajo lo paraba: seo_watch solo ve el enlace DESPUÉS de
publicar, y ningún test cubría el host.

Añado los dos tests que faltaban, uno por idioma, para fijar la inversión. El
del ES falla contra el valor viejo con el href entero en el mensaje.

Sin tocar rules.py, así que el vendor-sync sigue en verde. Queda documentado el
matiz que este cambio NO arregla: rules.internal_links cuenta cero enlaces en
ES bajo cualquiera de los dos hosts, porque ese módulo está clavado al host EN
(se vendoriza byte a byte y la CI lo verifica). Inofensivo hoy —
internal_links.too_few no bloquea en borrador.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-07-21 15:47:39 +00:00
co-authored by Claude Opus 4.8
parent 496212661b
commit 6029bebae5
2 changed files with 43 additions and 5 deletions
+27 -1
View File
@@ -1,4 +1,5 @@
from src.seo.autofill import ALLOWED_TAGS, DEFAULT_TAG, _coerce, _system_prompt
from src.seo.autofill import (ALLOWED_TAGS, DEFAULT_TAG, _coerce, _system_prompt,
insert_internal_links)
BASE = {
"meta_title": "t",
@@ -81,3 +82,28 @@ def test_collision_note_is_markdown_safe():
def test_slugify_title():
assert _slugify_title("USS Russell 2019: The Pyramid UAP!") == "uss-russell-2019-the-pyramid-uap"
# --- canonical host per language -------------------------------------------
# EN canonicalizes on www, ES on the APEX. They are INVERTED, and the ES entry
# said "www." until 2026-07-21, so every internal link written into a Spanish
# draft ate a 301. Nothing caught it: no test covered the host, and seo_watch
# only sees a link once the post is published. These two pin it.
def test_internal_link_uses_es_apex_canonical():
html = "<p>El caso de Manises sigue abierto.</p>"
out, pairs = insert_internal_links(
html, [{"phrase": "Manises", "slug": "manises-1979"}],
[{"slug": "manises-1979", "title": "Manises"}], "es")
assert 'href="https://zonadeexclusion.com/manises-1979/"' in out
assert "www.zonadeexclusion.com" not in out
assert len(pairs) == 1
def test_internal_link_uses_en_www_canonical():
html = "<p>The Roswell debris was recovered.</p>"
out, pairs = insert_internal_links(
html, [{"phrase": "Roswell", "slug": "roswell-1947"}],
[{"slug": "roswell-1947", "title": "Roswell"}], "en")
assert 'href="https://www.theexclusionzone.com/roswell-1947/"' in out
assert len(pairs) == 1