9e3dfc1039f3329f7be9fbc9e5082f5e53fb6d91
Embebe los 80 artículos de los dos blogs con bge-m3 (ya cargado en ollama, 100% GPU) y sobre los vectores contesta dos cosas: a qué artículos publicados conviene enlazar desde uno nuevo, y qué pares compiten por la misma búsqueda. Nunca escribe en el blog: imprime. Quien escribe el enlace es seo_link.py, y publicar lo decide Jose. Decisiones que no son de adorno: - NUNCA se cruzan los dos sitios. bge-m3 es multilingüe y da 0,966 entre un artículo y su traducción (medido): cruzarlos marcaría todo el espejo ES↔EN como canibalización, justo lo contrario de la verdad. - Endpoint de ollama por la ClusterIP del Service, no por la IP del pod (que cambia en cada reinicio) ni por el Ingress (está tras Authentik). El host la alcanza por kube-proxy, sin NodePort ni tocar la red. - Sin keep_alive en las peticiones: bge-m3 es de producción (lo usa researchowl) y mandar keep_alive:0 lo desalojaría, cobrándole a otro la recarga. - Umbral 0,78 calibrado contra el corpus real, no a ojo: el reparto no es igual en los dos sitios (ES mediana 0,58 / p99 0,75; EN 0,64 / 0,80). Absoluto y no percentil, porque un umbral relativo siempre encuentra "el 1% más parecido" aunque no haya problema, y un vigilante que siempre avisa no sirve. - Se mira qué enlaces EXISTEN ya en el cuerpo, y en qué DIRECCIÓN. Sugerir un enlace que ya está es ruido; y decir "se enlazan entre sí" cuando el enlace va en un solo sentido es mentir sobre lo único accionable. Caché en ~/.local/state/seo-semantic/, re-embebe solo lo que cambia (hash del texto). Corpus vía fetch_corpus de seo_link, que ya trae la guarda de corpus truncado. 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%