ChemaVX cffd174d4a hreflang: convertirlo en regla del auditor y en paso del remate
Hasta ahora el hreflang era un estado —puesto una vez a mano— y no una
regla. Un slug que cambiara habría dejado el enlace apuntando al artículo
viejo sin que nada avisara.

El auditor gana dos reglas: hreflang.missing (pareja declarada sin bloque)
y hreflang.stale (bloque que ya no coincide con la pareja). Viven en
seo_hreflang y no en seo_rules porque necesitan hreflang-parejas.md, que es
una decisión editorial curada; el motor sigue sin saber que hay parejas.

Probadas en los cinco estados, no solo en el feliz: dispara sin bloque,
dispara con el bloque apuntando a un slug viejo, y se calla cuando está
correcto, cuando el post no es de ninguna pareja y cuando aún es borrador.

Y el remate gana el paso 3c: buscar el espejo en el otro idioma y dejarlo
en el informe. Con la advertencia explícita de decidir por TÍTULO y no por
vector, y las dos reglas duras — solo espejos publicados, y uno a uno.
2026-07-28 07:39:45 +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%