158b5166a16071325bb3e01f8d77ed5c08565831
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>
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 viaghst-en).seo_validate.py— Tool C: single-post pre-publish validator (seo-checkwraps 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.
Languages
Python
100%