La descripción que nadie escribió
Bing Webmaster Tools marcó “las meta descripciones en muchas páginas son demasiado cortas.” Queja razonable, excepto que cuando de verdad fui a revisar, casi todas las páginas del sitio tenían una descripción específica y de buen tamaño. Posts de blog: 96-185 caracteres. Páginas de apps: parecido. Las únicas dos páginas que no la tenían eran la portada y el índice del blog, que resultan ser las dos páginas más visitadas de todo el sitio.
Ninguna de las dos había puesto nunca una prop description en <Layout>. Ambas caían en silencio al valor por defecto de todo el sitio: “Imperfect Systems - Creator of software, games, and music.” Cincuenta y cuatro caracteres. El fragmento de resultado de cada buscador para la portada, la página donde más gente aterriza primero, había sido la misma oración genérica desde que se lanzó el sitio.
Un arreglo fácil que duplicó su alcance en silencio
El issue tenía como alcance “portada e índice del blog,” en sus versiones singulares. Pero el trabajo de i18n de la portada (tres issues atrás, el mismo día) acababa de agregar las contrapartes en español de esas dos páginas. Mismos componentes, misma prop <Layout>, misma descripción faltante, solo que más nuevas, así que el issue que marcó este bug se abrió antes de que existieran las páginas que también necesitaba cubrir.
Esto se está volviendo un patrón al que hay que prestarle atención: el párrafo del footer que la pasada original de i18n se saltó. El propio logger de Astro sin una cláusula de guarda. Ahora una recomendación de Bing a la que le faltaba la mitad de su alcance real porque el código se movió entre el momento en que se generó la recomendación y el momento en que actué sobre ella. Ninguno de estos es un bug difícil. Todos son “el arreglo se definió contra una foto del código un poco desactualizada,” y el arreglo fue el mismo cada vez: no limitarse a parchear lo que dice el ticket, revisar primero si el mismo tipo de vacío existe en otro lado.
Lo que se agregó
La portada necesitaba texto nuevo, no había nada que reutilizar, así que recibió una descripción fresca en ui.ts, en los dos idiomas. El índice del blog fue distinto: ya tenía una cadena blogIndex.description, mostrada como subtítulo visible en la propia página, solo que nunca conectada a la meta etiqueta real. Reutilizarla significó que las palabras que lee un visitante y las palabras que indexa un buscador son ahora la misma oración, en vez de dos descripciones que con el tiempo podrían distanciarse en silencio. Es más corta que el rango “ideal” de 140-160 caracteres que prefiere Bing, pero es real, específica, y ya verdadera, mejor que una oración más larga inventada solo para llegar a un conteo de caracteres.
Resultados
Revisé las cuatro rutas, /, /es/, /blog/, /es/blog/, de dos formas: curl contra un build de producción, y una pestaña real de Chrome vía Playwright leyendo document.querySelector('meta[name="description"]').content directamente. Las cuatro muestran ahora su descripción real, no el valor genérico por defecto. og:description y la etiqueta de la tarjeta de Twitter también lo reciben gratis, porque están conectadas a la misma prop.
npm run a11y: 12/12, todavía 0 errores. Un cambio de meta etiqueta nunca iba a tocar la accesibilidad, pero la convención propia del proyecto es revisar de todas formas, y es lo bastante barato como para que saltárselo fuera solo superstición.
Lecturas relacionadas
Corrigiendo cuatro pequeñas mentiras en la página de Deep Cut Atlas
Un guion que no coincidía con la tipografía propia de la app, un eslogan que no se entendía, una afirmación de función que la app no puede respaldar, y una barra final faltante en los datos estructurados.
Dándole una cara a cada enlace compartido
Un guard de og:image que nunca se disparaba, un valor por defecto de una línea que lo arregló, una tarjeta de terminal hecha a medida, y una trampa de retina en Chrome headless.
Agregar un tercer idioma rompió cosas que el build nunca podría haber atrapado
Ternarios binarios, un type guard con dos valores fijos, y una etiqueta hreflang en cada página que promete una traducción al portugués que da 404.