Vienes de Bizagi Modeler
Esta guía es para quien ya ha simulado en Bizagi Modeler y abre Lila Modeler por primera vez. Dice dónde está aquí cada cosa que ya conoces, con el vocabulario de Bizagi, para que no tengas que reaprender el flujo antes de sacar tu primer número. Lila es un simulador de eventos discretos para BPMN: un motor, una CLI, un servidor MCP y un editor alrededor. No es una suite de documentación ni de publicación de procesos: Archivo → Exportar documento del proceso escribe un Word (.docx) o un HTML de una página con el diagrama, la documentación de cada elemento y las tablas del escenario y de resultados, pero no hay plantillas de documento. Un proyecto puede contener varios procesos, pero no hay un repositorio compartido entre usuarios. Bizagi Modeler se cita como la referencia y la inspiración de la que este proyecto aprendió el flujo, y como origen de los ejemplos públicos contra los que se valida el motor.
Los cuatro niveles, como seis pasos
Bizagi enseña la simulación en cuatro niveles, cada uno con un tipo de parámetro más. La vista Simulate de Lila tiene seis pasos, nombrados por lo que edita cada uno: Llegadas, Tiempos, Rutas, Recursos, Calendarios y Ejecución. Cada nivel de Bizagi cae así:
| Nivel de Bizagi | Paso de Lila | Qué rellenas |
|---|---|---|
| Process validation | Ejecución (ventana de corrida), Rutas (porcentajes de las compuertas) y Llegadas (max arrival count) | Inicio, duración, réplicas y semilla de la corrida; porcentajes de las compuertas; max arrival count; validación del modelo |
| Time analysis | Tiempos (tiempo de proceso) y Llegadas (intervalo entre llegadas) | Tiempo de proceso por tarea y temporizador; intervalo entre llegadas por evento de inicio; constante o distribución |
| Resource analysis | Recursos | Pools de recursos, disponibilidad, costos y qué tarea usa qué pool |
| Calendar analysis | Calendarios (los calendarios y qué elemento sigue cuál) y Recursos (el calendario de un pool y su capacidad por turno, en el pool) | Calendarios con días predefinidos + franjas desde–hasta y una rejilla semanal, recurso × calendario, capacidad por turno |
Dos cosas funcionan distinto que en Bizagi, y las dos a tu favor:
- No hay interruptor de nivel. Nunca «activas» un nivel. El motor degrada solo: un elemento sin tiempo de proceso tarda cero, una tarea sin recurso tiene capacidad infinita y un pool sin calendario está disponible 24×7. Puedes llenar Recursos y dejar Calendarios vacío para siempre.
- Los pasos son un orden de lectura, no un asistente. Todo vive en un mismo escenario: puedes volver a Tiempos después de Calendarios sin rehacer nada, y la lista de validación del pie del panel está viva en todos los pasos.
Los seis pasos son una barra a todo el ancho de la ventana, justo debajo de la barra superior, junto a
Escenario ▾ (en la ventana desacoplada del panel, una barra compacta arriba). Abre en Tiempos, el paso
en el que estás sobrevive a seleccionar elementos en el lienzo y a correr la simulación, y dos cosas
están en todos los pasos: la lista de validación y Avanzado: JSON del escenario, que es donde se
editan el name del escenario, su description y todo lo que el formulario no dibuja.
Llegadas, Tiempos, Rutas y Recursos listan además los elementos de los que hablan —cada evento de inicio con cada cuánto y cuántos casos crea, cada tarea y temporizador con su tiempo, cada compuerta con su reparto, cada tarea con el pool que toma—, así que «qué falta» es un vistazo y no un recorrido por el diagrama; pulsar una fila selecciona ese elemento en el lienzo. Cada control vive en un solo paso: los pools de recursos (con su calendario y su capacidad por turno) se editan en Recursos, y Calendarios lo dice.
Con una actividad seleccionada en Modelar, el panel de propiedades enseña un bloque Vista rápida · simulación: su distribución de tiempo y su recurso en el escenario activo, y su espera en la última corrida (o sin corrida). Es la espera por recurso, la misma medida que las etiquetas del lienzo, la tabla de Resultados y sus columnas «esperando recurso». Es el p95 de los casos medidos después del calentamiento en la primera réplica, cuando la muestra del log de esa corrida está completa; una corrida más larga (más de 10 000 filas de log en su primera réplica) enseña en su lugar la espera por recurso media de todas las réplicas, y lo dice. Sus enlaces Editar en Tiempos / Editar en Recursos abren ese paso en Simular.
Pantalla por pantalla
La correspondencia campo a campo — Lila ↔ BPSim 2.0 ↔ qbp ↔ Bizagi Modeler — está en una sola tabla
en SCENARIO_FORMAT.md § 8; esta sección es su versión a nivel de pantalla.
Propiedades del escenario
| Bizagi | Lila |
|---|---|
| Scenario name, Description | name / description, en Avanzado: JSON del escenario (el nombre es la cabecera del panel) |
| Start date | Ejecución, run.start (ISO 8601 con offset) |
| Duration | Ejecución, run.duration; se puede dejar vacío y la corrida termina cuando drena el último caso |
| Base time unit, Currency | Ejecución, run.baseTimeUnit, run.currency |
| Replications (solo en what-if) | Ejecución, run.replications — aquí está en cualquier corrida, no solo al comparar |
| — | run.seed y run.warmup, que Bizagi no expone |
Llegadas
| Bizagi | Lila |
|---|---|
| Max arrival count | Llegadas, triggerCount en el evento de inicio |
| Interval / tiempo entre llegadas | Llegadas, interTriggerTimer en el evento de inicio |
| Calendario de llegadas | Calendarios, calendar en el evento de inicio |
Un triggerCount sin intervalo significa que los N casos llegan en t = 0, que es lo que hace el
nivel 1 de Bizagi.
Tiempos y distribuciones
En Lila todos los tiempos van en segundos; no hay selector de unidad por campo. La distribución es un objeto con parámetros con nombre, así que nada depende del orden de los argumentos:
| Bizagi | Lila | Ojo con |
|---|---|---|
| Constant | constant (value) |
|
| Uniform, Triangular | uniform, triangular |
|
| Exponential | exponential (mean) |
es la media, nunca la tasa λ |
| Normal, Truncated normal | normal, truncatedNormal |
normal se trunca en 0 |
| Log normal (el nombre en Bizagi puede variar según la versión) | lognormal (mean, sd) |
de la variable, no de su logaritmo — la misma convención que Bizagi |
| Gamma, Erlang, Weibull, Beta | gamma, erlang, weibull, beta |
en erlang la mean es la total, no la de cada fase |
| Poisson, Binomial | poisson, binomial |
|
| — | user |
puntos empíricos, sin equivalente en Bizagi |
Recursos
| Bizagi | Lila |
|---|---|
| Resource, Name | Recursos, una clave de resources con su name |
| Type (role / equipment) | type |
| Availability | capacity (un entero: cuántas unidades existen) |
| Fixed cost | fixedCost, se cobra una vez por token que toma el recurso |
| Cost per hour | costPerHour, se cobra sobre el tiempo ocupado |
Asignación a las tareas
| Bizagi | Lila |
|---|---|
| Activity resources (el nombre en Bizagi puede variar según la versión) | Recursos, resources[] del elemento seleccionado |
| Quantity | quantity dentro de esa entrada |
| AND / OR | selection: "and" / "or" |
| Fixed cost (de la actividad) | fixedCost del elemento |
| — | Asignar un carril a un pool en una sola acción: todas las tareas del carril reciben el pool con cantidad 1 |
La acción de carril es la entrada más rápida: modela los carriles como roles y una acción por carril sustituye una docena de asignaciones a mano. Para el motor los carriles siguen siendo etiquetas; la acción solo escribe por ti la asignación tarea por tarea.
Calendarios
| Bizagi | Lila |
|---|---|
| Calendars | Calendarios, calendars por clave; la clave default la toma todo pool que no declare el suyo |
| Recurrence + start time + duration | «Lun–Vie / Todos / Fin de semana» o cualquier día + desde–hasta, una entrada de intervals[] por franja, y una rejilla semanal para pintar (24 h, to exclusivo, se admite "24:00") |
| Calendario del recurso | calendar en el pool |
| Tabla «Resource | Morning | Day | Night» | capacity como lista de { calendar, capacity }: un solo pool con capacidad por turno |
| Recurrence: monthly, yearly | «Se repite»: el día N (o el último) del mes, del primer al quinto o el último día de la semana del mes, o una fecha cada año (monthDays, monthWeekdays, dates) |
| Holidays | «Festivos» bajo las franjas: una fecha una vez, o «Cada año» (holidays); cerrado el día entero |
| Recurrencia cada N semanas/meses, horario de verano, zona horaria por calendario | no está en v1: los calendarios conservan el offset de run.start durante toda la corrida |
Sin ningún calendario, todo es 24×7. El tiempo de proceso de una tarea se pausa cuando cierra su
turno y sigue cuando abre; ese tiempo cerrado se reporta aparte como offHoursWait.
Resultados
Las columnas de resultados conservan a propósito los nombres de tabla y de columna de Bizagi, para
que puedas comparar números sin traducir encabezados (el mapa completo está en
RESULTS_FORMAT.md § 10):
| Tabla de Bizagi | Lila |
|---|---|
| Process elements | mismo nombre; Instances started/completed, tiempo mínimo/máximo/medio/total, las mismas cinco columnas «waiting for resource» y el costo fijo total |
| Resources | mismo nombre; Utilization (%), Fixed cost, Unit cost, Total cost — una fila por pool, incluidos los que quedan al 0 % |
| Sequence flows | mismo nombre; instancias completadas por flujo |
| Process (resumen) | tabla propia de Lila (Bizagi no publica una) |
Extras sin columna en Bizagi: p50/p90/p95 del tiempo de ciclo y de la espera, largo medio y máximo de cola por actividad, throughput por hora, costo por caso, ranking de cuellos de botella, registro de eventos por caso y la espera fuera de horario separada de la espera por recurso.
Junto a las tablas, Results dibuja unas pocas gráficas: utilización por recurso, instancias iniciadas por tarea, p50/p90/p95 del tiempo de ciclo y de espera, y un histograma del tiempo de ciclo por caso de la primera réplica. Cada gráfica sale de los mismos números que su tabla y los imprime en sus barras; la tabla sigue siendo la referencia.
| Bizagi | Lila |
|---|---|
| What-if analysis (el nombre en Bizagi puede variar según la versión) | Comparar con… en Resultados, o lila compare: escenarios lado a lado, diferencias marcadas e intervalos de confianza al 95 % cuando hay ≥ 2 réplicas, y gráficas de barras del tiempo de ciclo medio, el costo por caso y la utilización con el delta de cada escenario contra la base |
| Exportar resultados a Excel (el nombre en Bizagi puede variar según la versión) | un CSV por tabla y un .xlsx único (--csv, --xlsx, o los botones de exportar en Results) |
| Publicar en Word / Web | Archivo → Exportar documento del proceso (Word o HTML): portada, diagrama, descripción del proceso, una sección por elemento en orden de flujo agrupada por carril, y después las tablas del escenario y de resultados, con las gráficas de la corrida. Sin plantillas ni campo de tabla de contenido; el panel de navegación de Word lista los títulos |
| Ver moverse los tokens | Tokens sobre el mapa de Resultados (Espacio o ▶) reproducen la réplica 1 de la corrida guardada sobre el diagrama, con contadores por elemento que salen del registro de eventos del propio motor, no de un caminante de juguete. Validar rutas, una herramienta de Modelar, es la animación didáctica de bpmn-js y no lee ningún escenario |
Tres diferencias que vas a notar
1. Tu .bpmn de Bizagi trae el dibujo, no los números. Bizagi Modeler no exporta los parámetros
de simulación: verificado sobre cinco archivos reales, en el namespace bizagi: solo viajan los
colores. Así que importar funciona, y luego los pasos de Simular se vuelven a capturar aquí una vez.
Cuenta unos minutos para eso y usa la acción de carril → pool para que Recursos casi no cueste.
2. Los caminos compartidos se duplican, porque la ramificación es probabilística. En v1 no hay
enrutamiento por datos del caso: conditionExpression se ignora (con aviso W-COND) y conditions
es un campo reservado. Cada flujo de salida de una compuerta lleva un porcentaje. La consecuencia
práctica está en la forma del diagrama: un «rechazar e informar al solicitante» al que pueden
llegar dos compuertas distintas aparece una vez por compuerta, con su propio par de tareas, en
lugar de ser un único nodo compartido al que enrutan los datos. Mira packages/engine/test/fixtures/service-request,
modelado exactamente así.
3. Los recursos no tienen identidad persistente. Un pool es un conteo de unidades intercambiables, no una lista de personas con nombre: «Nurse, capacidad 3» son tres enfermeras anónimas, y un caso que vuelve más tarde no recibe la misma. La utilización, el tiempo ocupado y el costo se reportan por pool. Si necesitas individuos con nombre, modélalos como un pool de capacidad 1 cada uno.
Cuatro cosas menores que conviene saber antes de comparar números contra una corrida de Bizagi:
- Las semillas son deterministas. Mismo escenario y misma semilla, mismo resultado byte a byte: una diferencia entre dos corridas es una diferencia que hiciste tú.
- La utilización se mide sobre la ventana que Lila simuló de verdad (
[warmup, t_stop]), no sobre una duración declarada. A nivel de calendarios eso difiere del denominador de Bizagi por un factor constante; la conversión exacta es la diferencia D7 del checklist. - Un sistema saturado (ρ ≈ 1) no tiene estado estacionario, así que su tiempo de ciclo medio depende del transitorio y dos simuladores correctos pueden discrepar bastante; el mínimo, el máximo y la utilización siguen cuadrando. Es la diferencia D6.
- Una sola corrida tiene ruido. Bizagi publica corridas únicas; las diferencias D2 y D5 son justo eso. Usa 30 réplicas y lee el intervalo de confianza.
Las cuatro están documentadas, con cifras, en el checklist de comportamiento de referencia.
Pruébalo: el ejemplo de nivel 3 publicado por Bizagi
examples/bizagi-levels/level-3 es el «Emergency attendance process» del propio tutorial de nivel 3
de Bizagi, reconstruido archivo por archivo, con las cifras publicadas anotadas en expected.json.
En la app web (build de Pages) o en la app de
escritorio el ejemplo se abre como diagrama más un escenario pegado, porque un proyecto .lila
necesita además un manifiesto que el repositorio no trae para este ejemplo:
- Archivo → Importar BPMN…, elige
examples/bizagi-levels/level-3/model.bpmn. - Ve a Simular, abre Avanzado: JSON del escenario al final del panel, sustituye su texto
por el contenido de
examples/bizagi-levels/level-3/scenario.jsony pulsa Aplicar. - Pon Réplicas en 30 en Ejecución y pulsa Ejecutar simulación.
La misma corrida desde la CLI, desde la raíz del repositorio:
npx lila run \
examples/bizagi-levels/level-3/model.bpmn examples/bizagi-levels/level-3/scenario.json \
--replications 30 --seed 42
En la tabla Resources, la fila Nurse marca una utilización de alrededor del 69,7 %, contra
el 69,75 % que publica Bizagi para esa misma configuración — y los otros cinco pools, los seis
costos y el tiempo de ciclo medio quedan igual de cerca. Qué esperar de cada número, nivel por
nivel, y los cuatro puntos donde los dos motores no coinciden, está en
BIZAGI_PARITY.md.
Bizagi y Bizagi Modeler son marcas de Bizagi. Lila Modeler es un proyecto open source independiente, no afiliado a Bizagi ni respaldado por Bizagi.