Commit Graph
4 Commits
Author SHA1 Message Date
ChemaVXandClaude Opus 5 8b81ef87e4 seo: arreglar la capitalización ES en el ORIGEN, y el motor apuntando al blog malo
Build & Deploy ResearchOwl / build-and-push (push) Successful in 9s
Capa 1 del plan del 2026-07-29: lo que se arregla en el generador se arregla
una vez; lo que se arregla con un vigilante es trabajo para siempre.

1) MAYÚSCULA DE ORACIÓN EN ES. El prompt no decía nada de capitalización, solo
   «write in SPANISH». Un modelo entrenado en inglés escribe Title Case en
   cuanto le pides un «SEO title»: por eso hubo que corregir a mano NOVENTA Y
   UN campos del blog ES.

   Va en el prompt y NO en un validador, y esto es una decisión medida, no una
   comodidad. Distinguir «Lo que Revelan» (mal) de «el Roswell de Pennsylvania»
   (bien) exige saber qué palabra es nombre propio. Probé dos detectores
   deterministas contra el corpus real antes de escribir ninguno:
     - por proporción de palabras capitalizadas: 100% de falsos positivos en
       títulos densos en topónimos («Kecksburg 1965: el Roswell de Pennsylvania»
       da 2/2)
     - por vocabulario en minúscula del corpus: se deja LA MITAD de los malos
       («Ocultan» nunca aparece en minúscula) y marca «Proyecto Libro Azul» y
       «Ejército del Aire» como si fueran errores
   Un gate que rechaza borradores válidos es peor que la avería. La red debajo
   sigue siendo seo_watch.check_title_case, que sí tiene el corpus delante y
   desde hoy corre a diario.

2) EL ARTÍCULO, COMO DATO. Va entre <ARTICLE>…</ARTICLE> y los dos prompts
   declaran que lo de dentro no son instrucciones. El cuerpo se redacta a
   partir de fuentes scrapeadas: una página con «ignore previous instructions»
   entraba en el mensaje sin que nadie lo mirara.

3) EL MOTOR APUNTABA AL BLOG EQUIVOCADO. El comentario de autofill decía que
   rules contaba CERO enlaces internos en ES por estar clavado al host del EN,
   y que no se podía arreglar por el vendorizado byte a byte. Ya se puede: el
   canónico ganó usar_sitio() y el vendorizado se resincronizó — llevaba
   desfasado desde el 21-jul, o sea que la CI habría fallado en el próximo
   build. _check_con_sitio() apunta el motor al idioma correcto y RESTAURA el
   global, con la condición de carrera documentada por si algún día se
   paraleliza la generación.

6 tests nuevos (30 en total). Lo que NO se puede verificar aquí: que el prompt
funcione de verdad. Eso solo lo dice el primer borrador ES que genere, y quien
lo va a comprobar es el vigilante diario.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 17:28:56 +00:00
ChemaVX 2af654d344 vendor: sincroniza el motor SEO (stopwords ES + tokenizador sin acentos)
Build & Deploy ResearchOwl / build-and-push (push) Successful in 1m9s
make sync-seo tras chemavx-seo-tools 31c9d3e. Solo afecta a topic_collision;
las RULES de check_post no usan el tokenizador. Los 9 tests de seo pasan.
2026-07-21 07:15:45 +00:00
ChemaVXandClaude Fable 5 0e9a2e5b36 chore(seo): sync vendored seo_rules — check de colisión de tema
Build & Deploy ResearchOwl / build-and-push (push) Successful in 6s
Re-copia del canónico (chemavx-seo-tools bae1cc9) vía make sync-seo:
añade topic_collision(post, corpus) — detección de posts que se
canibalizan (caso+año, hooks ≥70%, slugs ≥50%). Aditivo: el autofill
del bot no lo usa aún; disponible para integrarlo en /generate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:10:34 +00:00
ChemaVXandClaude Opus 4.8 89aa8d6030 Vendor shared SEO rule engine + CI drift guard (no pipeline wiring yet)
src/seo/rules.py is a byte-for-byte copy of the canonical seo_rules.py
(git.chemavx.xyz/chemavx/chemavx-seo-tools). CI step "Verify vendored SEO engine"
clones the canonical and fails the build on any divergence; `make sync-seo` /
`make check-seo-sync` cover the local-canonical workflow. Nothing imports this in
a runtime path yet — generate_seo_fields integration comes next behind SEO_AUTOFILL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 08:17:37 +00:00