Saltar al contenido
Development

Rutas de bitácora filtradas por proyecto, y la sesión concurrente que apareció sin avisar

Por Victor Da Luz
astrogitdev-logsite

Dos de los enlaces “Seguir en la bitácora” de esta portada mentían. Deep Cut Atlas y Greenhouse tenían cada uno una tarjeta que apuntaba a /blog, el feed completo sin filtrar, nada específico de ese proyecto. Todavía no existía ningún filtrado al cual apuntarlos, así que ese era el estado honesto de las cosas, pero no era uno bueno.

Antes de construir nada se revisó qué existía en realidad. @vdaluz/astro-blog, el paquete de componentes compartido del que dependen tanto este sitio como vdaluz.com, no tenía ninguna lógica de filtrado en ningún lado: sin rutas de etiquetas, sin componentes de filtro. Las páginas de blog propias de vdaluz.com tenían la misma forma plana y sin filtrar. Y la taxonomía que haría falta para impulsar el filtrado era escasa, pocas de las publicaciones existentes se etiquetaban de forma consistente por proyecto. Construir un filtro y apuntar la portada hacia él arriesgaba simplemente cambiar “va al lugar equivocado” por “va a un lugar deslucido.”

Dónde vive la pieza reutilizable

El filtrado en sí se dividió limpiamente siguiendo una línea que el paquete ya había trazado para el puntaje de publicaciones relacionadas: una función pura más un pequeño componente de presentación, con la ruta de página real quedando local a cada sitio. filterPostsByTag() y un componente de chips TagFilterNav se publicaron en @vdaluz/astro-blog v0.6.0. Pagination, ya presente en el paquete, no necesitó ningún cambio, solo toma una prop base de ruta y renderiza a partir de cualquier objeto de página que reciba, así que una ruta filtrada ya era compatible con él.

La ruta en sí, /blog/project/[project], vive aquí, duplicada para la división de idioma es/ que tiene este sitio. Filtra a través de la nueva función del paquete, cae de vuelta a un mensaje real de “todavía no hay entradas” en vez de una página en blanco, y una pequeña barra de navegación permite saltar entre proyectos.

Probarlo significó publicar algo de verdad

Un filtro con casi nada que filtrar demuestra poco. Así que la solución incluyó escribir y publicar una bitácora de origen apropiada para cada uno de los dos proyectos detrás de los enlaces rotos: la de Deep Cut Atlas (configurar el archivo de instrucciones del agente del proyecto antes de que existiera una sola línea de Swift) y la de Greenhouse (un motor de reglas en Rust escrito antes de la interfaz, antes incluso de que el toolchain estuviera instalado en la máquina que lo construía). Ambas se basaron en el historial real del repositorio y los issues del proyecto, no inventadas, y ambas pasaron por el mismo filtro de verificación de hechos que cualquier otra publicación antes de salir.

Ver las páginas filtradas renderizando esas publicaciones en vivo, chips, paginación y todo, fue la verificación real. Que la compilación local pase no es lo mismo.

La parte que no se esperaba

A mitad de la publicación del tercero de cuatro PRs pequeños, mi herramienta marcó que un archivo recién confirmado se veía revertido en el árbol de trabajo. No lo estaba, el commit seguía intacto. Lo que en realidad había pasado: otra sesión, trabajando en un issue completamente distinto en el mismo repositorio, había hecho checkout de su propia rama en el mismo directorio de trabajo. Este repositorio no usa worktrees por convención, bajo la teoría de que no corre sesiones concurrentes. Esa teoría estaba equivocada justo en ese momento.

Lo interesante no fue la confusión de archivos, fue que la rama con checkout había cambiado por debajo, no solo archivos individuales. Al intentar fusionar mi propio PR ya verificado, el control de permisos de mi herramienta bloqueó la llamada: la rama local ya no coincidía con el PR que se estaba fusionando, y marcó ese desajuste como un riesgo real en vez de dejarlo pasar. Tenía razón en hacerlo. Esperé a que la otra sesión terminara antes de fusionar.

Después lo documenté como un patrón en la base de conocimiento. Tercera instancia confirmada del mismo problema de fondo en mis repositorios: una rama es solo un puntero, no un directorio aislado, y “no corremos sesiones concurrentes” es una convención, no una garantía.

Lecturas relacionadas

Development

El CTA que apuntaba al dev log equivocado

El único llamado a la acción de la página de Deep Cut Atlas enlazaba al blog completo sin filtrar, un enlace que funcionaba, devolvía 200, y en silencio mandó a todos al lugar equivocado durante semanas.

Leer