diff --git a/seo_exceptions.py b/seo_exceptions.py index 2ff468d..aef7930 100644 --- a/seo_exceptions.py +++ b/seo_exceptions.py @@ -96,7 +96,33 @@ EXCEPTIONS = { # arrastra backlog: 28 posts sin alt-text, 27 con enlazado flojo. Es deuda # acumulada por no haberse revisado nunca, NO regresión — se irá waiveando o # arreglando post a post, con la misma vara de medir que el EN. - "es": {}, + "es": { + "internal_links": { + "roswell-1947-preguntas-sin-respuesta-78-anos": + "1 enlace (→ el Roswell de mayo, sobre «Ese relato ya lo cubrimos», " + "que es exactamente lo que dice la prosa). No hay 2ª entidad honesta: " + "el artículo solo nombra a Marcel, el Proyecto Mogul y Walter Haut, y " + "ninguno tiene artículo propio. (Revisado 2026-07-21.)", + }, + # Los dos Roswell del ES comparten caso y año, así que topic.collision va a + # seguir avisando siempre. Se resolvió por la vía que propone la propia regla + # ("retitle to a distinct angle" + "interlink deliberately"), no fusionando: + # el de mayo es el relato de referencia (2.278 palabras, 3 clics / 152 impr.) + # y el de julio cubre otra cosa — el vídeo de 2025 de los Archivos Nacionales, + # el diario de Marcel y la confesión póstuma de Haut. El 2026-07-21 el de julio + # se retituló a su ángulo real (dejó de presentarse como "Roswell 1947: El + # Accidente OVNI...") y se enlazaron entre sí en ambos sentidos. + "topic": { + "roswell-1947-el-misterio-que-cambio-la-historia-de-la-ufologia": + "Complementario, no duplicado: es el relato de referencia y enlaza al " + "de julio como «las preguntas que 78 años no han resuelto». " + "(Decidido 2026-07-21 con datos de Search Console.)", + "roswell-1947-preguntas-sin-respuesta-78-anos": + "Complementario, no duplicado: retitulado a su ángulo propio (el vídeo " + "y el diario) y enlaza al de mayo sobre «Ese relato ya lo cubrimos». " + "(Decidido 2026-07-21 con datos de Search Console.)", + }, + }, } @@ -117,11 +143,18 @@ def accepted_reason(rule, slug, site="en"): def collisions(): - """Slugs waiveados en más de un sitio. Debe estar SIEMPRE vacío: si algo - aparece aquí, hay una excepción ambigua que revisar a mano.""" + """Slugs waiveados en más de un SITIO. Debe estar SIEMPRE vacío: si algo + aparece aquí, hay una excepción ambigua que revisar a mano. + + Cuenta una vez por sitio, no por familia de reglas: un mismo post puede + tener waivers en varias familias del mismo blog sin que eso sea ambiguo + (el par Roswell del ES está waiveado en `internal_links` y en `topic`). + """ from collections import Counter c = Counter() for fams in EXCEPTIONS.values(): + site_slugs = set() for slugs in fams.values(): - c.update(slugs.keys()) + site_slugs.update(slugs.keys()) + c.update(site_slugs) return sorted(s for s, n in c.items() if n > 1)