Bandeja de semillas: las ideas que desaparecieron durante una semana
Greenhouse es mi gestor de proyectos creativos, construido alrededor de un período deliberado de incubación de siete días para ideas nuevas. Capturar algo, dejar que repose, volver a eso una vez que tuvo tiempo de demostrar su valor. Ese es todo el sentido del temporizador de madurez.
Salvo que hasta esta semana, “dejar que repose” significaba “desaparecer por completo.” Al capturar una idea, esta desaparecía de la app - ninguna zona, ninguna lista, ni siquiera un comando la devolvía - hasta el séptimo día, cuando reaparecía en la zona “Ripe today” pidiendo una decisión de Vault-o-Work. Durante una semana entera, la app se comportaba como si la idea no existiera.
Esto salió de la misma revisión completa de la app que sacó a la luz el estante de lanzamientos invisible, y fue la brecha más grande entre lo que describe el PRD y lo que la app realmente hace. El motor ya soportaba todo lo necesario - se podía mandar una idea nueva al vault desde el primer día si se conocía el id del ítem - la interfaz simplemente nunca daba una forma de verlo o hacerlo.
La solución, y la restricción que le dio forma
La construcción en sí fue pequeña una vez que vi su forma. La consulta de estado diario del panel ya trae todas las ideas nuevas y filtra las maduras para “Ripe today.” Filtrar en la dirección contraria - las ideas inmaduras - no necesitó ninguna consulta nueva a la base de datos, solo lo inverso de una verificación booleana que ya existía.
La restricción interesante fue qué NO construir. Habría sido fácil agregar un botón de “empezar a trabajar en esto antes de tiempo” - después de todo, el motor no tiene ninguna barrera de madurez en la promoción, nada impide hacerlo mediante un comando directo. Pero eso anula toda la premisa. El período de incubación no es un candado técnico, es una disciplina que se supone que la app ayuda a mantener. Así que la zona de bandeja de semillas muestra la idea, muestra una cuenta regresiva (“Ripens in 4d”), permite mandarla al vault si se cambió de opinión, permite explorar sus archivos - y no ofrece nada más. Sin atajos. La ausencia de un botón es el mecanismo de cumplimiento, no uno deshabilitado.
Para la cuenta regresiva en sí, reproduje un patrón que la app ya tenía por partida doble - “Dormant Nd” para los ítems en el vault, “Released Nd ago” para los ya publicados - ambos calculados en el frontend a partir de una marca de tiempo cruda que entrega el backend. La misma idea aquí, solo que apuntada en la otra dirección: en vez de “cuánto tiempo pasó desde que ocurrió esto,” es “cuánto falta para que esto ocurra.” Un campo nuevo en el payload (matures_at, la marca de tiempo en la que una idea madura), una función de formato ya existente, la misma matemática, con el signo invertido.
Una corrección que le hice a mi propio plan
La descripción original del issue afirmaba que el ayudante de formato de cuenta regresiva era código muerto esperando exactamente esta funcionalidad. No lo era - dos funcionalidades anteriores ya lo estaban usando. Algo menor, pero vale la pena verificarlo antes de construir sobre una suposición que hacía el propio issue: leer el código, no confiar en lo que el ticket recuerda del código.
Verificándolo de verdad
Las pruebas unitarias confirman la lógica de filtrado y la matemática de la marca de tiempo. Pero lo que realmente quería ver era la cuenta regresiva renderizando en una ventana real en ejecución, no en una prueba simulada. Así que compilé la app con su función de automatización WebDriver activada, la lancé contra un vault descartable, y ejecuté el flujo real de Capture: escribí un nombre, envié, vi cómo la zona de bandeja de semillas lo recogía de inmediato con “Ripens in 7d,” confirmé que no había ningún botón de trabajar-en-esto en ninguna parte de la página, luego hice clic en Vault y lo vi desaparecer. Clic real, llamada IPC real, fila real en la base de datos.
Resultado
Toda idea que se captura es visible desde el momento en que existe, durante toda la incubación, sin estar nunca a un clic de saltarse la espera. Para una herramienta cuyo mensaje central es “confiar en el proceso en vez de en la impaciencia,” que se haya cerrado esa brecha se siente como que la app finalmente está a la altura de su propia premisa.
Lecturas relacionadas
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.
Construir la vista de detalle de proyecto para Greenhouse
Si avanzar una etapa cuenta como un toque, qué pasa en la última etapa, y una digresión sobre enfriamiento versus rotación que resultó ser una sola pregunta, no dos.