c4dba06fb167f9dd42f394694c665d4598014a60
Cierra las 3 incidencias restantes de internal_links.too_few. Ninguno de los tres nombra en su prosa una entidad con artículo propio (criterio de siempre: entidad nombrada en el texto, no afinidad temática): - tassili-najjer: arqueología sahariana, autocontenida. - missing-scientists: trata de la cadena mediática, no de casos UAP. - grusch-capitol-june-9 (adelanto): además lleva canonical_url a la investigación completa, así que sus señales se consolidan allí; forzar enlaces en un preview superado no aporta. El cuarto caso (roswell-341) SÍ tenía enlace honesto y se aplicó: 'the Air Force's official Roswell explanation' → roswell-1947-ufo-incident. Nota técnica: ese post usa nodos lexical nativos (no bloques HTML como Wilson-Davis), así que hubo que partir el nodo de texto e insertar un nodo 'link' con el mismo esquema que el enlace preexistente. Con esto el auditor queda a CERO violaciones accionables (venía de 20), lo que hace que cualquier aviso futuro de seo_watch signifique algo de verdad. Co-Authored-By: Claude Opus 4.8 <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%