bae1cc949cf31fb355cc9cae387649018c1eb64c
Dos posts sobre el mismo caso se canibalizan en la SERP (2026-07-10: se publicó un segundo Kecksburg con otro ya programado, y había un título casi gemelo del de Malmstrom en la cola). Nueva función pura topic_collision(post, corpus) en seo_rules.py — corpus-aware, fuera de RULES — que dispara por: caso+año compartidos (años < 2020; los de la era de noticias no son identidad de caso), hooks de título ≥70% similares (calibrado: el par nuclear da 0.742, el par legítimo más cercano 0.65), o slugs ≥50% solapados. seo_validate.py obtiene el corpus via ghst-en (--limit all) y lo reporta como grupo topic_collision; --no-collision lo omite para follow-ups intencionados. Calibrado contra los 36 posts reales: dispara solo el duplicado Kecksburg (HIGH) y el par Grusch preview/evento (MED, intencionado). Co-Authored-By: Claude Fable 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%