hreflang: curadas las 5 parejas de agosto, y el aviso que no se podía atender

El NIVEL C decía «nada convincente» en belgium, jal-1628 y libro azul, pero eso
era del escáner de vectores: el espejo ES existe y está en la cola de agosto,
no publicado cuando se escaneó. Abiertos los dos lados de cada uno:

  SÍ  Bélgica 89-90    mismas noches (Eupen, 30/31-mar), Petit-Rechain, SOBEPS
  SÍ  JAL 1628         mismo vuelo del 17-nov-86, Terauchi, Callahan y la FAA
  SÍ  Libro Azul       mismo programa y mismas cifras (12.618 / 701)
  SÍ  Colares 1977     misma isla, Operação Prato, testimonio de Hollanda
  SÍ  Teherán 1976     misma madrugada, los dos F-4, el documento de la DIA
  NO  bases nucleares  el EN son DOS casos (Malmstrom y Rendlesham); el ES es la
                       apertura de PURSUE y CINCO bases. Solo comparten Malmstrom

Libro Azul es el que enseña dónde está la línea: los apartados NO coinciden y
aun así es SÍ, porque el SUJETO de los dos es el mismo programa histórico. En
AARO el sujeto del ES era la confrontación con Grusch, y por eso es NO. Y las
bases nucleares traen la lección de AARO repetida: coincidían hasta en el
recuento —1.264 palabras exactas los dos— y no son el mismo artículo. Un número
que cuadra no es prueba de equivalencia.

Declararlas destapó un falso positivo: `violaciones()` solo miraba que ESTE
lado estuviera publicado, así que los tres EN ya publicados con el ES aún
programado salieron como hreflang.missing, recetando un `aplicar` que se niega
—y con razón— porque apuntaría a una URL que no existe. Ahora exige los dos
lados publicados. Un aviso que no se puede atender es ruido, y el ruido acaba
con que nadie mire el informe.

Auditores 42 y 40 limpios, seo-watch sin hallazgos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-07-29 09:04:32 +00:00
co-authored by Claude Opus 5
parent 2ec9b228f0
commit f4121d11bb
2 changed files with 90 additions and 6 deletions
+68 -6
View File
@@ -214,20 +214,40 @@ sim 0.746
sim 0.714
EN belgium-1989-1990-nato-fighters-ufo-wave
Belgium 19891990: When NATO Fighter Jets Chased Ghosts
ES (nada convincente; lo más cercano: el-incidente-ovni-de-rendlesham-forest-1980-el-caso-)
decision: NO
ES oleada-belga-1989-1990-f-16-triangulo
Oleada belga 1989-1990: los F-16 que persiguieron un triángulo silencioso
NOTA (2026-07-29): los vectores dijeron «nada convincente» porque el espejo ES no
estaba PUBLICADO al escanear — está en la cola de agosto. Curado a mano abriendo
los dos: misma oleada, mismas noches (29-nov-1989 en Eupen, 30/31-mar-1990 con los F-16),
mismo fraude de Petit-Rechain y el mismo SOBEPS. ES publica el 4 de agosto.
Entra cuando se publiquen los dos lados; hasta entonces el tool lo salta solo
(«un hreflang a una URL futura es un 404») y el auditor no lo pide.
decision: SI
sim 0.709
EN jal-1628-alaska-1986-ufo-radar-encounter
JAL 1628: The Best-Documented UFO Encounter in Aviation History
ES (nada convincente; lo más cercano: eeuu-desclasifica-162-archivos-secretos-sobre-ovnis-)
decision: NO
ES jal-1628-1986-alaska-luces-radar
JAL 1628: el Boeing 747 y las luces que lo siguieron sobre Alaska en 1986
NOTA (2026-07-29): «nada convincente» era del escáner, porque el ES estaba PROGRAMADO,
no publicado. Abiertos los dos: mismo vuelo del 17-nov-1986, mismo 747 de carga con
vino francés, mismo Terauchi y mismo John Callahan salvando los documentos de la FAA.
ES publica el 25 de agosto.
decision: SI
sim 0.705
EN project-blue-book-declassified-ufo-files
Project Blue Book: 12,618 Sightings, 701 Unsolved, and a Program That Was Told to Stop
ES (nada convincente; lo más cercano: eeuu-desclasifica-162-archivos-secretos-sobre-ovnis-)
decision: NO
ES proyecto-libro-azul-701-casos-sin-explicar
Proyecto Libro Azul: 12.618 casos OVNI y 701 que nadie pudo explicar
NOTA (2026-07-29): mismo programa, mismas cifras en el titular (12.618 y 701), 1.726 y
1.723 palabras. Los apartados NO coinciden —el EN va por Arnold, el Informe Especial
14 y el Panel Robertson; el ES por Sign y Grudge, Hynek y cómo consultar los archivos
hoy— y aun así es SÍ: el ES no es traducción del EN por convención de la casa, y el
SUJETO de los dos artículos es el mismo programa histórico. Es la diferencia con AARO,
donde el sujeto del ES era la confrontación con Grusch y no los hallazgos de AARO.
ES publica el 10 de agosto.
decision: SI
sim 0.701
EN americas-secret-psychic-spy-program-declassified-documents-reveal-project-stargates-extraordinary-history
@@ -298,3 +318,45 @@ sim 0.645
La Noche del Misterio en Trans-en-Provence: El Caso OVNI Mejor Documentado de la Histo
vaticano-extraterrestres-iglesia-catolica
El Vaticano y los Extraterrestres: Una Iglesia Abierta al Misterio del Cosmos
==========================================================================
## NIVEL D — parejas de AGOSTO, curadas a mano el 2026-07-29
==========================================================================
Los dos lados están escritos pero alguno aún no se ha publicado. No hay nada
que hacer hasta entonces: el tool las salta solo («un hreflang a una URL futura
es un 404») y el auditor no las pide mientras estén programadas. En cuanto
salgan las dos, `python3 seo_hreflang.py aplicar`.
sim n/a colares 1977
EN colares-1977-brazil-air-force-ufo-investigation
Colares 1977: Brazil's Most Documented UFO Investigation
ES colares-1977-operacion-prato-chupa-chupa
Colares 1977: cuando la Fuerza Aérea de Brasil investigó el chupa-chupa
NOTA: mismo caso, misma isla del delta amazónico, misma Operação Prato y el mismo
testimonio tardío de Hollanda. Los DOS se publican el 24 de agosto.
decision: SI
sim n/a teherán 1976
EN tehran-1976-iranian-f4-ufo-incident
Tehran 1976: The UFO That Disabled Two Fighter Jets
ES teheran-1976-cazas-f-4-ovni
Teherán 1976: los cazas F-4 que se quedaron sin sistemas ante un OVNI
NOTA: misma madrugada del 19-sep-1976, los mismos dos F-4 Phantom, el mismo fallo de
armamento y el mismo documento de la DIA. ES sale el 17 de agosto y EN el 27: la
pareja no se puede declarar hasta el 27.
decision: SI
sim n/a bases nucleares
EN uap-nuclear-bases-six-decades-incursions
Nuclear Bases and UAP: Six Decades of Documented Incursions
ES archivos-pursue-uap-bases-nucleares-desclasificado
Los Archivos PURSUE y las bases nucleares: lo que el Gobierno acaba de confirmar
NOTA: parecían pareja hasta por el recuento —1.264 palabras EXACTAS los dos— y no lo
son. El EN se construye sobre DOS casos, Malmstrom y Rendlesham, con la explicación
del Pentágono de 2025, y cierra en «dos casos, dos preguntas». El ES se construye
sobre la apertura de archivos PURSUE y recorre CINCO bases: Malmstrom, Minot,
Vandenberg, Loring y el lado soviético. Solo comparten Malmstrom. Mismo tema,
artículos distintos — y la coincidencia de longitud enseña lo mismo que la de fecha
en AARO: un número que cuadra no es prueba de equivalencia.
decision: NO
+22
View File
@@ -161,6 +161,18 @@ def cambios():
return plan + huerfanos(parejas), avisos, parejas
_PUB_OTRO = {}
def publicados(site):
"""Slugs publicados del OTRO sitio, cacheado. Hace falta para no cantar una
violación que no se puede arreglar (ver `violaciones`)."""
if site not in _PUB_OTRO:
_PUB_OTRO[site] = {s for s, p in trae(site, None).items()
if p.get("status") == "published"}
return _PUB_OTRO[site]
def violaciones(post, site, parejas=None):
"""Regla para el auditor: una pareja declarada que NO lo tiene puesto.
@@ -171,6 +183,13 @@ def violaciones(post, site, parejas=None):
No basta con que exista el bloque: se comprueba que las URLs sean las de ESTA
pareja. Si un slug cambia, el hreflang se queda apuntando al viejo y esto es
lo único que lo cazaría.
Hacen falta los DOS lados publicados, no solo este. Al curar las parejas de
agosto (2026-07-29) quedaron tres EN ya publicados emparejados con un ES aún
programado, y el auditor cantó tres violaciones con una receta que no las
arreglaba: `aplicar` se niega, y con razón, porque el hreflang apuntaría a
una URL que todavía no existe. Un aviso que no se puede atender es ruido, y
el ruido acaba con que nadie mire el informe.
"""
import seo_rules as R
if parejas is None:
@@ -181,6 +200,9 @@ def violaciones(post, site, parejas=None):
return []
if post.get("status") != "published":
return []
otro_site = "es" if site == "en" else "en"
if (par[1] if site == "en" else par[0]) not in publicados(otro_site):
return []
cabeza = post.get("codeinjection_head") or ""
esperado = bloque(*par)
if esperado in cabeza: