ChemaVXandClaude Opus 5 158b5166a1 hreflang: Grusch apuntaba al artículo equivocado, y el tool no sabía retirar
La pareja decía que «David Grusch at the Capitol» (el acto del 9 de junio de
2026) y «El testimonio de David Grusch» (la comparecencia jurada de julio de
2023) son el mismo artículo en otro idioma. Son dos hechos con tres años de
diferencia. El espejo real es grusch-capitolio-9-junio-2026, publicado un día
después del acto y con extensión pareja.

Se coló porque las 16 parejas se validaron por firma de título, y con casos
históricos el año identifica el hecho, pero con NOTICIAS el mismo protagonista
vuelve. Revisadas a fondo las otras 15 con ese criterio —abriendo los dos
artículos, no comparando títulos—: correctas. Las dos de noticia que quedaban
(222 archivos y la segunda desclasificación) se publicaron el MISMO DÍA en los
dos sitios y con extensión casi idéntica, que es la firma de una pareja real.

Y el arreglo destapó un agujero: `cambios()` solo escribía las parejas del
fichero, así que repuntar una dejaba la anterior declarada por su lado. Se
habría quedado el ES de 2023 señalando a un EN que ya no le señala a él.
`huerfanos()` recorre ahora todo el corpus y retira nuestro bloque de quien ha
dejado de estar en la lista; `desmarca()` quita solo lo nuestro.

Aplicado y verificado en la web pública: 3 posts, las dos páginas de la pareja
nueva declaran las dos versiones y el ES de 2023 se queda sin hreflang, que es
lo correcto porque no hay artículo inglés sobre esa comparecencia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 08:53:58 +00:00

seo-tools

SEO rule engine + tooling for the Ghost blogs (EN: theexclusionzone.com).

  • seo_rules.py — shared rule engine (pure functions, no I/O). Single source of truth for thresholds + checks. Consumed by the auditor, the validator, and (vendored) by ResearchOwl's blog pipeline.
  • seo_audit.py — Tool A: site-wide auditor (reads all published posts via ghst-en).
  • seo_validate.py — Tool C: single-post pre-publish validator (seo-check wraps this).
  • seo_exceptions.py — documented, consciously-accepted waivers (auditor reporting filter).
  • seo_mirror.py — OG/Twitter mirroring helper.
  • phase2_*.py/json — one-off batch helpers (kept for provenance).

No secrets live here. Ghost access is via the ghst-en wrapper (~/.local/bin), which fetches a staff token on demand from the pod and never writes it to disk.

S
Description
No description provided
Readme
683 KiB
Languages
Python 100%