2e552232f3d664adbc6d1bb591d7b81cad9f8071
Los 18 waivers del ES salían como "waived: None": la línea que imprime el motivo llamaba a accepted_reason sin el sitio, así que lo buscaba en el diccionario del EN. El waiver se aplicaba bien —eso sí pasaba el sitio—, pero el informe salía mudo justo donde tiene que justificarse, que es el único propósito de esa sección. Y si algún día vuelve a no haber motivo, ahora lo dice: un waiver sin razón documentada es un fallo, no un hueco que rellenar con None.
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%