Cómo creé El Gremio
Planificar un sprint como una partida medieval: héroes con rol, nivel y skills, tareas como monstruos, planning poker con dados y un oráculo que pronostica con Monte Carlo. Todo en el navegador.
6 min de lectura
- SvelteKit
- Estimación
- UX
En este artículo
Las reuniones de planificación suelen ser la parte menos querida del sprint. Una planilla, números que nadie se cree y la pregunta de siempre: «¿alcanzamos?». Quería una herramienta que hiciera esa conversación más honesta y, de paso, más entretenida. Así nació El Gremio: un estimador de tareas donde el equipo es un gremio de héroes y el backlog, un mapa lleno de monstruos.
#La metáfora primero
Antes de escribir código definí el vocabulario, porque de eso depende que el juego se entienda sin manual:
- Héroes: cada persona del equipo. Su clase es su rol (Guerrero backend, Arquera frontend, Mago datos e IA, Clérigo QA, Paladín DevOps y Bardo producto o diseño), su nivel del 1 al 10 refleja la seniority y sus skills son tecnologías con 1 a 5 estrellas.
- Campañas, misiones y monstruos: épicas, historias de usuario y tareas. Cada monstruo tiene un tipo según el trabajo que pide (un dragón de datos, un gólem de backend) y una dificultad en puntos, marcada con un sello de cera.
- Stamina: la capacidad de cada héroe en el sprint, según su disponibilidad.
- Niebla: la incertidumbre. Aparece cuando alguien enfrenta un monstruo con skills que no domina.
- El oráculo: el pronóstico.
La metáfora no es decoración: cada palabra corresponde a un concepto real de planificación, solo que dicho de una forma que invita a jugar.
#De puntos a horas
La dificultad se estima en puntos (Fibonacci: 1, 2, 3, 5, 8, 13), pero las horas dependen de quién enfrenta la tarea. La fórmula es un producto de factores:
const hours = points * HOURS_PER_POINT * levelFactor(level) * classFactor(heroClass, taskType) * skillFactor;- Nivel: un nivel 6 es la referencia (factor 1). Un aprendiz de nivel 1 tarda 1,6 veces más; una leyenda de nivel 10, 0,78 veces.
- Afinidad de clase: si la clase coincide con el tipo de tarea, factor 1; si es afín (un guerrero backend con una tarea de datos), 1,3; si no tiene relación, 1,7.
- Skills: el promedio del dominio de cada skill requerida. Cinco estrellas bajan el tiempo; no tener la skill lo sube un 50%.
Todos los factores viven en un solo archivo de catálogo. Si mi equipo real funciona distinto, ajusto un número y no toco la lógica.
#La niebla: estimar la incertidumbre, no solo el tiempo
Una estimación de un solo número miente por omisión. Por eso cada tarea tiene un rango, y su ancho crece con lo que no sabemos:
- Base de ±25%.
- +15% por cada skill que el héroe domina con una estrella o menos.
- +10% si la clase no es la del tipo de tarea, +10% si el héroe es nivel 3 o menos.
- +20% si el monstruo es de 13 puntos: un jefe final que conviene dividir.
El rango es asimétrico a propósito: las tareas rara vez terminan mucho antes de lo previsto, pero sí pueden alargarse bastante.
#El oráculo: 2000 expediciones simuladas
Con los rangos, el pronóstico sale de una simulación Monte Carlo. En cada una de las 2000 corridas, cada tarea toma un valor al azar de su distribución triangular (mínimo, más probable, máximo), cada héroe avanza por sus tareas en paralelo con los demás y la expedición termina cuando termina el último.
function triangular(r: number, min: number, mode: number, max: number) {
const f = (mode - min) / (max - min);
return r < f
? min + Math.sqrt(r * (max - min) * (mode - min))
: max - Math.sqrt((1 - r) * (max - min) * (max - mode));
}El resultado no es «terminamos el día 8», sino «50% de probabilidad en 6,9 días, 85% en 8,2 y un 100% de terminar dentro del sprint». Esa frase cambia la conversación: ya no discutimos un número, sino cuánto riesgo estamos dispuestos a asumir.
Un detalle que me costó notar: con un generador aleatorio normal, los porcentajes cambiaban levemente con cada clic y parecía que la página temblaba. Usé un generador con semilla fija (mulberry32), así el mismo plan siempre da el mismo pronóstico.
#Planning poker con dados
Para fijar la dificultad, cada héroe elige su carta en secreto y se revelan todas juntas, como en el planning poker clásico. Si los votos van de 2 a 8, el juego no promedia en silencio: pide que expliquen su carta quien votó más alto y quien votó más bajo. Ese desacuerdo casi siempre esconde algo que alguien sabe y el resto no.
#Los presagios
Además del pronóstico, el oráculo revisa el plan y avisa:
- Héroes sobrecargados (más del 110% de su stamina) o con capacidad de sobra.
- Skills que nadie del gremio domina: niebla sobre todo el equipo.
- Factor bus: conocimiento que está en una sola persona.
- Monstruos sin héroe, jefes de 13 puntos y votos muy dispares.
Y si hay tareas sin asignar, el consejo del gremio las reparte: ordena los monstruos de mayor a menor y le da cada uno al héroe que terminaría antes en proporción a su capacidad, penalizando la niebla.
#Sin servidor, pero compartible
Todo corre en el navegador y la partida se guarda en localStorage. Para compartirla sin base de datos, la partida completa viaja dentro del enlace: se serializa a JSON, se comprime con la API nativa CompressionStream y se codifica en el fragmento de la URL (#p=…). Como el fragmento nunca se envía al servidor, nadie más que quien tiene el enlace ve el plan. Una partida de ejemplo con cinco héroes y ocho tareas cabe en unos 1300 caracteres.
También se puede exportar como pergamino en Markdown, con las tareas como checklist, listo para pegar en Jira, GitHub o Notion.
#Pergamino y accesibilidad
Visualmente quise que se sintiera como un mapa de papel: superficies de pergamino con textura, tinta oscura, sellos de cera para la dificultad y la tipografía Cinzel para los títulos. El pergamino usa colores fijos, así que se ve igual en modo claro y oscuro.
Arrastrar un héroe hasta un monstruo es la forma divertida de asignar, pero no puede ser la única: cada tarea tiene un selector de héroe, los formularios funcionan con teclado y la ruta de la expedición (un Gantt por héroe) tiene una versión en texto para lectores de pantalla.
#Lo que aprendí
Una buena metáfora hace que la gente participe en algo que normalmente evita. Pero lo que de verdad aporta valor es lo de fondo: estimar con rangos, hacer visible la incertidumbre y hablar de probabilidades en vez de promesas. El Gremio sigue en construcción; si lo pruebas con tu equipo, me encantaría saber qué monstruos encontraron.