Rescue-or-Keep: construyendo la zona de bóveda para Greenhouse
Greenhouse nunca borra nada. Archivar un proyecto en la bóveda debería sentirse como un acto positivo y reversible, semillas dormidas, no un fracaso, y el ritual diario saca a la luz el elemento dormido más antiguo y pregunta: ¿rescatarlo, o dejarlo en paz? Antes de este issue, nada de eso tenía interfaz. Se podía archivar algo en la bóveda y simplemente… se quedaba ahí. No había forma de ver qué había en la bóveda, no había forma de sacar algo de vuelta, y archivar ni siquiera movía los archivos del elemento a ningún lado, así que “explorar la bóveda” habría abierto una carpeta vacía.
Las dos decisiones
Había dos cosas por resolver antes de poder escribir código, y ambas eran decisiones de criterio genuinas, no opciones obvias por defecto.
Primero: ¿archivar en la bóveda debería reubicar la carpeta del proyecto en un directorio real 90-vault/, o simplemente cambiar una marca de estado y dejar los archivos donde estaban? Por defecto habría optado por dejarlos en su lugar, cambio más chico, menos radio de impacto. Pero cada otra transición de estado en esta app (promover, avanzar una etapa, mover entre etapas) ya reubica la carpeta como parte del cambio. Ganó la consistencia, así que archivar en la bóveda ahora sí mueve los archivos a la bóveda, y rescatar los devuelve a donde sea que vinieron, la etapa anterior de un proyecto activo, o la carpeta de ideas si nunca fue promovido.
Segundo: ¿qué hace realmente “Keep Vaulted”? Mi primer instinto fue llamar de nuevo al mismo comando de vault, ya que volver a archivar algo que ya está archivado suena a no-op. No lo es. La revisión diaria elige el único elemento más dormido ordenando por la fecha en que fue archivado. Llamar a vault de nuevo reinicia ese timestamp a este momento, lo que significa que el elemento que se acaba de decidir dejar en paz desaparece en silencio de la revisión durante lo que dure la ventana de maduración de la bóveda. Por suerte detecté esto antes de escribir código, al rastrear realmente qué significaría “no-op” para el orden de clasificación. Keep Vaulted terminó siendo una decisión puramente local, una marca de “descartado en esta sesión” sin ninguna llamada al backend. El elemento vuelve mañana, ya que en realidad nada cambió en él.
Lo que me sorprendió
El casi-error con “Keep Vaulted” fue la parte más interesante de esta sesión. Es el tipo de bug que nunca aparecería en una prueba manual rápida, ya que un solo clic se ve idéntico sin importar si reinicia el timestamp o no, y solo saldría a la luz días o semanas después como “por qué esta cosa que dejé archivada nunca volvió a aparecer para revisión.” Lo documenté como una nota aparte, porque la forma del error se generaliza: cada vez que una acción de “saltar” o “descartar” considera llamar al mismo comando que produjo el estado actual, conviene revisar si ese comando escribe un timestamp por el que se ordena otra cosa.
Cómo quedó
Rescue restaura un elemento a donde sea que estuviera, activo en su etapa anterior, o de vuelta a una idea nueva, y reubica su carpeta para que coincida. Una nueva vista de exploración de la bóveda lista todo lo que está actualmente dormido, cada uno con su propio botón de Rescue, siguiendo el mismo patrón de navegación de ventana completa que la vista de detalle del proyecto estableció hace unos días. Un indicador “Vault: N items” hace que la bóveda sea descubrible desde el dashboard en vez de quedar escondida detrás de una sola tarjeta de revisión. Todo esto verificado con pruebas unitarias, pruebas de componentes, un chequeo de accesibilidad, y un recorrido real con WebDriver que confirmó que la carpeta realmente se movió en el disco, no solo que cambió una fila en la base de datos.
Lecturas relacionadas
Bandeja de semillas: las ideas que desaparecieron durante una semana
Capturar una idea en Greenhouse hacía que desapareciera por completo hasta el séptimo día. La solución fue una zona con cuenta regresiva - y la disciplina de no agregar un botón para saltársela.
Estante de cosecha: darle a los elementos publicados de Greenhouse un lugar donde caer
Publicar un proyecto era de solo escritura: la base de datos estampaba un timestamp, una rama de la insignia nunca podía renderizar, y toda la recompensa del pipeline era invisible.
El callback que no podía decir qué había pasado
Arreglar un error de actualización del panel expuso un segundo error escondido en el mismo componente compartido, y un tercer error que resultó no existir.