Tarjeta de la skill markeup-seo del sistema MarkeUP

SEO on-page

SEO on-page: auditar title y description con markeup-seo

La skill markeup-seo revisa el SEO del post: un title de 50 a 75 caracteres con la palabra clave al frente, una description de 140 a 200 sacada del cuerpo y sin títulos repetidos en el vault.

Admin4 de octubre de 2026, 18:118 min de lectura

La skill markeup-seo —«Audita el SEO on-page y la metadata de un post Astro»— es una de las habilidades que el sistema MarkeUP tiene escritas para Hermes Agent y para Cline. Esta página es su ficha pública: lo que sabe hacer, cuándo se usa y qué comandos ejecuta.

Es el texto que ve el buscador antes de entrar: la skill lo mide, lo compara con el resto del vault y propone correcciones.

El texto de la sección «Instrucciones del canon» está transcrito del fichero fuente —que se escribe sin tildes por convención de su propio gate—, así que es exactamente lo que lee el agente cuando le pides algo. La cabecera y esta entradilla sí están redactadas para leerlas.

DatoValor
Skillmarkeup-seo
ResponsabilidadAudita el SEO on-page y la metadata de un post Astro.
Versión1.3.0
Autoríauriszarernesto-blip · licencia MIT
Plataformaslinux · macos
Tags del canonseo · astro · metadata · og · canonical · markeup
Skills relacionadasmarkeup-context · markeup-frontmatter · markeup-content
Fuente~/.hermes/skills/markeup/markeup-seo/SKILL.md

Responsabilidad unica: auditar y corregir el SEO on-page y la metadata de un post. Trabaja sobre el frontmatter generado por markeup-frontmatter; no lo sustituye.

  • Al final del pipeline, antes de publicar.
  • Para revisar un post ya existente.
  • Cuando un post no aparece indexado o su CTR es bajo.

Primero lee markeup-context, rules/seo-spec.md (autoridad SEO) y rules/style-guide.md (sección SEO On-Page).

Estos criterios son vinculantes (acordados el 2026-09-24, revisados a la baja el 2026-09-25). El gate ejecutable es npm run validate:seo.

Severidad: modelo de 2 niveles (desde el 2026-09-25). Solo bloquea —ERROR, exit 1— lo que rompe el sitio o la URL: title/description/slug/categories ausentes, categoría inventada, fecha no interpretable, title duplicado, title que no arranca por la clave del concept y title/description fuera del rango duro. Todo lo demás —salirse del rango recomendado, fillers, ganchos retóricos, descripciones parecidas (Jaccard ≥ 0.5), concept largo, tags fuera de 2-6— es AVISO: se reporta y no bloquea la publicación. --strict convierte los avisos en fallo (sirve para perseguir 0 avisos, no para decidir si se publica).

ReglaDetalle
title50-75 caracteres (duro 40-90: fuera de ahí sí es ERROR). Lo lee el buscador (<title>, og:title, twitter:title, schema.org). No lleva `
description140-200 caracteres y ≥12 palabras (duro 100-260). Se extrae del cuerpo: nada inventado
Orden de trabajocuerpo → description → title (el título se deriva de la description)
Palabra clave al frenteLa palabra con más carga del concept abre el title: El Aura → «Aura: …». 19 excepciones documentadas en scripts/mjs/lib/seo-key.mjs (KEY_EXCEPCIONES)
concept intactoNunca se renombra para cuadrar el SEO (decisión del propietario)
Keyword en los primeros 155 caracteres de la descriptionGoogle trunca por anchura: lo accesorio se pierde, la keyword no
Fillers prohibidosclaves, origen y beneficios, beneficios, guía completa, exploración detallada, descubre, explora, adéntrate, sumérgete, el mundo de, todo lo que necesitas, en este artículo, aprende a
Ganchos retóricos prohibidos al inicio«Sin…», «Ni…», «No…», «Más allá de…», «Frente a…», «Lejos de…»
Sin canibalizaciónNingún title repetido; ninguna description con Jaccard ≥ 0.5 respecto a otra
Sin títulos provisionalesUn title con sufijo tipo `

cd ~/markeup
npm run seo:brief -- --slug <slug>     # 1. brief: concept, clave, tags, H2, intro, cuerpo
# 2. redactar description (140-200) -> title (50-75) desde el cuerpo
# 3. anadir/editar la entrada en scripts/data/seo-meta.json
npm run seo:apply -- --apply           # 4. aplica SOLO title y description (idempotente)
npm run validate:seo                   # 5. GATE: exit 1 solo si hay ERROR (los avisos no bloquean)
npm run validate:frontmatter           # 6. los 22 campos (4 duros) + concept <= 60 (aviso)

scripts/data/seo-meta.json es la fuente de verdad revisable: { slug, key, title, description }. El aplicador nunca toca concept, slug, aliases ni el cuerpo: solo las dos líneas title: y description:.

#CampoCriterioVerificacion
1title50-75 caracteres, palabra clave al inicio, estilo fraseContar caracteres
2slugCorto, descriptivo, con guiones, sin acentos ni .mdRegex ^[a-z0-9-]+$
3description140-200 caracteres, con palabra clave, atractiva para CTRContar caracteres
4Primer parrafoContiene la palabra clave principalLectura
5HeadingsSin H1 en el cuerpo (lo aporta la plantilla desde title); H2 para secciones; sin saltosLeer estructura
6tags2-6, minusculas, con guiones, sin tildes, no redundantesContra vault-index.md
7imageExiste el archivo en src/content/posts/img/<slug>.webpls
8imageAltDescriptivo, con palabra clave si es naturalLectura
9canonicalUrlVacio si es original; con URL si es sindicadoComprobar origen
10aliases2-3 variantes; ademas son destinos de wikilinkComprobar unicidad
11noIndexfalse salvo que no deba indexarseBoolean
12hideTOCfalse si el post tiene estructura de headingsBoolean
13hideCoverImagefalse si hay imagen de portadaBoolean
14featuredtrue solo si es destacado (max 3-5 en el vault)Contar en el vault

title        : 50-75 caracteres (duro 40-90: fuera de ahi, ERROR)
description  : 140-200 caracteres, >=12 palabras (duro 100-260: fuera de ahi, ERROR)
concept      : <= 60 caracteres (etiqueta corta de tarjeta y grafo)
slug         : <= 80 caracteres, <= 3 palabras recomendado

Dentro del rango recomendado no hay nada que corregir. Por debajo de 140 la description desaprovecha el snippet y por encima de 200 el buscador la trunca: en ambos casos es AVISO, no un bloqueo. Los limites viven en scripts/mjs/lib/frontmatter-spec.mjs (LIMITES), la misma fuente que usa npm run validate:frontmatter.

Los aliases del frontmatter cumplen doble funcion:

  1. SEO/busqueda: variantes del titulo que ayudan a encontrar la nota.
  2. Destinos de wikilink: el linter scripts/mjs/validate-wikilinks.mjs los indexa como slugs validos, de modo que [[variante-del-titulo|texto]] resuelve a este post.

Por eso deben ser unicos y no colisionar con otros slugs o aliases del vault.

CasoValor
Contenido originalvacio (canonicalUrl:)
Migrado de un blog antiguo / sindicadoURL absoluta de la fuente original

El schema acepta null, "" o ausencia y los normaliza a undefined.

  • Archivo fisico: src/content/posts/img/<slug>.webp.
  • Referencia en frontmatter: /img/<slug>.webp.
  • Sin imagen: /img/placeholder.webp + imageAlt generico pero util.
  • imageAlt debe describir la imagen, no repetir el titulo.

FlagDefaultCuando cambiarlo
noIndexfalsetrue solo para paginas que no deben indexarse
hideTOCfalsetrue en posts muy cortos sin headings
hideCoverImagefalsetrue si no quieres portada
featuredfalsetrue solo para 3-5 posts destacados del vault

showTOC existe en el schema pero es legado: no lo generes ni lo audites.

SEO AUDIT - <slug>

✅ OK
  title        62 caracteres, palabra clave al inicio
  slug         el-aura (valido, 2 palabras)

⚠️  AVISO (no bloquea la publicacion)
  description  132 caracteres (recomendado 140-200)
    -> Actual: "El aura es un concepto central de la bioenergetica."
    -> Sugerida (148): "El aura, ese campo sutil que la bioenergetica describe..."
  image        /img/el-aura.webp no existe en public/img/
    -> Accion: subir la imagen o usar /img/placeholder.webp

❌ ERROR (bloquea)
  title        no arranca por la clave del `concept` ("Aura")
    -> Accion: reescribir el `title` empezando por "Aura:" y dejar el `concept` intacto

Ordena siempre: ERROR primero, luego AVISO y por ultimo OK. Solo un ERROR bloquea la publicacion; un aviso se anota y se sigue (con --strict deja de ser aviso).

  • Obsidian: informe completo en bloque plegable > [!warning].
  • Telegram: solo los campos con problema y la sugerencia. Maximo 10 lineas.
  • VS Code / Cline: informe + diff del frontmatter corregido.
  • Hermes CLI: informe + aplicar correcciones si el usuario lo pide.

  • references/seo-checklist.md - checklist ampliado con ejemplos.
  • rules/style-guide.md - seccion SEO On-Page (autoridad del vault).
  • markeup-frontmatter - genera los campos que aqui se auditan.

¿Quieres saber cómo se piden estas cosas? La guía completa está en skills de Hermes Agent, con la chuleta de objetivos y los casos paso a paso.

SEO on-page

Explora las ramas del artículo

Compartir este artículo

Posts que enlazan a este artículo

Skills para Hermes Agent