estado: cerrar los siete puntos ciegos del vigilante, y pasarlo a diario
Recuento de los fallos de esta semana: diecisiete. Ni uno solo fue un caso que
el vigilante juzgara mal — los diecisiete estaban en sitios donde el vigilante
no mira. Eso es una buena noticia: los puntos ciegos son enumerables y el
juicio equivocado no.
Lo que no miraba nadie, con el fallo real que lo motiva:
tags 5 duplicados vivieron TRES SEMANAS repartiendo 7 posts entre dos
archivos flacos, los dos ofrecidos a Google en sitemap-tags.xml
páginas todas las reglas eran de posts; /about no tiene metas en ninguno
de los dos sitios
<head> el EN emite DOS Article con titulares distintos, y sigue con
twitter:site=@ghost y article:publisher=facebook.com/ghost
robots.txt el bloque «Cloudflare Managed» apareció solo en el EN y nadie lo
decidió; cambia sin pasar por git
hreflang lo comprobaba SOLO seo_audit.py, que NO TIENE TIMER
hub se publicó una vez y se pudrió: «31 casos» con 33
programados check_rules hace `if status != "published": continue`, así que un
programado con la meta mal es invisible hasta el día DESPUÉS de
publicarse — cuando ya lo ha visto Google
Decisiones:
- módulo aparte y no dentro de seo_watch.py (ya pasa de 500 líneas), pero
colgando del MISMO vigilante: una huella por sitio y un solo aviso. Dos
notificadores compitiendo es como se deja de leer un informe
- robots.txt se compara contra una INSTANTÁNEA versionada. Sin una foto
contra la que comparar, un cambio que nadie hizo es invisible para siempre
- un chequeo que revienta se convierte en HALLAZGO, no tumba a los demás. Lo
peligroso de un vigilante no es que falle: es que falle y parezca limpio
- og_*/twitter_* vacíos en una PÁGINA quedan fuera por COMPROBACIÓN, no por
comodidad: Ghost los deriva de las metas al renderizar, verificado sobre el
HTML público del hub ES. Avisar de eso sería mandar a arreglar algo que ya
está bien
Timer semanal → DIARIO. Con 2 posts/semana más programados y deriva de tema y
robots, el lunes dejaba hasta seis días de exposición. No añade ruido: solo
avisa si hay hallazgos Y han cambiado, así que un día limpio no manda nada.
8 tests, cada uno la cicatriz de un fallo real, incluidos los dos que hacen
creíble a un vigilante: que DETECTA la avería (probado con deriva simulada de
robots) y que un chequeo roto se oye.
Primera ejecución real: 8 hallazgos, todos preexistentes, 32 s.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+22
@@ -128,6 +128,28 @@ def slugs_del_curado(secciones):
|
||||
|
||||
# ─────────────────────────────── la revisión ───────────────────────────────
|
||||
|
||||
def problemas_de(site):
|
||||
"""[líneas] con lo que no cuadra. Sin imprimir: lo consume seo_estado.py,
|
||||
que es quien lo mete en el vigilante semanal."""
|
||||
cab, secciones = lee_curado(site)
|
||||
posts = fetch_posts(SITES[site]["cli"])
|
||||
pub = {p["slug"] for p in posts if p.get("status") == "published"}
|
||||
prog = {p["slug"] for p in posts if p.get("status") == "scheduled"}
|
||||
en_indice = slugs_del_curado(secciones)
|
||||
out = []
|
||||
for s in sorted({s for s in en_indice if en_indice.count(s) > 1}):
|
||||
out.append(f"repetido en el índice: {s}")
|
||||
for s in sorted(s for s in en_indice if s in prog):
|
||||
out.append(f"PREMATURO (aún no publicado, daría 404): {s}")
|
||||
for s in sorted(s for s in en_indice if s not in pub and s not in prog):
|
||||
out.append(f"apunta a un post que no existe: {s}")
|
||||
for s in sorted(pub - set(en_indice) - set(cab["EXCLUIDOS"])):
|
||||
out.append(f"publicado FUERA del índice: {s}")
|
||||
for s in sorted(x for x in cab["EXCLUIDOS"] if x not in pub and x not in prog):
|
||||
out.append(f"EXCLUIDO que ya no existe, quita la línea: {s}")
|
||||
return out
|
||||
|
||||
|
||||
def revisa_site(site):
|
||||
cab, secciones = lee_curado(site)
|
||||
posts = fetch_posts(SITES[site]["cli"])
|
||||
|
||||
Reference in New Issue
Block a user