Lila Modeler v1.0.0-beta.26 EN GitHub
Docs›Guías›Paridad con Bizagi

Reference behaviour checklist (Bizagi Modeler public docs)

Fuente: LILA_MODELER_ESTRUCTURA.md, sección 3 ("Checklist de paridad con Bizagi"; ahí «paridad» es el criterio interno de aceptación, no el posicionamiento público). Esta tabla es una copia de esa sección con una columna Estado añadida para seguimiento de implementación; el contenido de las columnas Capacidad/Bizagi/Lila/Hito es el mismo que en el documento de estructura, que sigue siendo la fuente de verdad — ante cualquier discrepancia entre este archivo y LILA_MODELER_ESTRUCTURA.md, gana el documento de estructura y este archivo se corrige para reflejarlo, nunca al revés.

Fuente de la comparación original: ayuda oficial de Bizagi (niveles 1–4, escenarios, elementos no soportados), verificada el 2026-09-03. Bizagi no expone "4 niveles" en el motor: son qué parámetros están rellenos. Lila no reproduce los niveles como concepto de producto; el motor degrada: sin recursos ⇒ capacidad infinita, sin calendario ⇒ 24×7. Bizagi Modeler se cita aquí solo como referencia técnica e inspiración: este documento no plantea paridad de producto ni una alternativa comercial, solo un criterio interno de validación numérica (#289).

Estado refleja el estado de implementación en el repositorio, no el de este documento. Se actualiza fila por fila conforme cada capacidad queda implementada y probada (ver la prueba de aceptación del hito correspondiente en la sección 7 de LILA_MODELER_ESTRUCTURA.md), y lleva entre paréntesis los tickets que la cierran.

El comportamiento de referencia numérico, es decir la validación contra las corridas publicadas por Bizagi Modeler, se comprueba en packages/engine/test/bizagi-parity.test.ts (LILA-044), que simula los cuatro ejemplos de examples/bizagi-levels y compara cada número que expected.json cita de la página oficial con tolerancia ±5 %. Lo que hoy no cuadra está en la sección Diferencias documentadas del final, con su causa y su número: ninguna de esas diferencias se ha cerrado ajustando un parámetro del escenario publicado.

Este archivo es una referencia técnica interna y conserva su nombre histórico (BIZAGI_PARITY.md, bizagi-parity.test.ts) por continuidad con el código y los tickets que lo citan; no implica una promesa pública de paridad con Bizagi Modeler.

Capacidad Bizagi Lila Hito Estado
Start/End none, task (todas las variantes), sequence flow ✓ ✓ M1 Implementado (LILA-018, LILA-021, LILA-026)
Exclusive gateway con % por flujo (reparto equitativo por defecto) ✓ ✓ M1 Implementado (LILA-026); paridad verificada en el nivel 1 (test)
Inclusive gateway con % independientes ✓ ✓ M1 Implementado (LILA-026)
Parallel gateway fork/join ✓ ✓ M1 Implementado (LILA-026); paridad verificada en la rama Red de los niveles 2–4
Subproceso embebido (aplanado); reusable = tarea con tiempo global ✓ ✓ M1 Implementado (LILA-019)
Timer intermedio como retardo ✓ ✓ M1 Implementado (LILA-026)
Llegadas: max arrival count + intervalo (constante o distribución) ✓ ✓ M1 Implementado (LILA-026). triggerCount sin interTriggerTimer = N llegadas en t = 0, como el nivel 1 de Bizagi (R-ARR-1, LILA-186); ver diferencia D1
Processing time por tarea/evento, constante o distribución ✓ ✓ M1 Implementado (LILA-026); paridad verificada en el nivel 2
Distribuciones: las 13 de BPSim 2.0 + constante + empírica ✓ (subconjunto no documentado) ✓ todas M1 Implementado (LILA-025)
Escenario: nombre, descripción, autor, versión, inicio, duración, unidad de tiempo, moneda, replicaciones, semilla ✓ ✓ (+ warmup, extends) M1 Implementado (LILA-013, LILA-014)
Parada: duración o max arrival count, lo primero ✓ ✓ M1 Implementado (LILA-026); paridad verificada (la corrida oficial drena sus 2017 casos, ver D4)
Recursos: tipo rol/equipo, disponibilidad, costo fijo por token, costo por hora ✓ ✓ M2 Implementado (LILA-033); paridad verificada en el nivel 3 (test): utilización y costo de los seis recursos, en las dos corridas publicadas (3 y 2 enfermeras), todos dentro del ±5 % desde que D8 quedó resuelta
Asignación a tarea: uno o varios recursos, cantidad, AND / OR ✓ ✓ M2 Implementado (LILA-034, LILA-035)
Costo fijo por actividad ✓ ✓ M2 Implementado (LILA-036); paridad verificada en el nivel 3 (8057,6 contra 8063, −0,07 %). El 8063 no lo publica ninguna tabla: se deriva de los fixedCost por tarea del enunciado y de los conteos de instancias publicados (2·2017 + 1·2017 + 1·1006 + 1·1006), y el test lo declara así
Salidas por elemento: started, completed, tiempo min/max/avg/total, espera min/max/avg/std/total, costo fijo ✓ ✓ mismos nombres de columna M2 Implementado (LILA-036); nombres de columna revisados contra RESULTS_FORMAT.md. La paridad numérica que hay probada es la del proceso y la de los recursos del nivel 3 (ver D6 para el caso saturado); las columnas por elemento no están ancladas fila por fila
Salidas por recurso: utilización %, costo fijo, costo unitario, costo total ✓ ✓ M2 Implementado (LILA-036); paridad verificada en el nivel 3, las seis filas de la tabla publicada (p. ej. nurse 69,65 % contra 69,75 %)
Calendarios: recurrencia, hora de inicio, duración, vigencia; matriz recurso × calendario con calendario por defecto ✓ ✓ recurrencia semanal, mensual (día N del mes, o del primer al quinto/último día de la semana) y anual (fecha fija), más festivos (#82, R-CAL-12 … R-CAL-14). No cubierto: recurrencia «cada N semanas/meses», un rango de vigencia del calendario y la zona horaria propia con DST (timezone sigue reservado; R-CAL-15) M3 Implementado (LILA-040, LILA-041, LILA-164, #82). LILA-164 añadió la capacidad por turno dentro de un mismo pool (capacity: [{calendar, capacity}], R-CAL-11): con ella el nivel 4 cuadra —ciclo medio, utilización y costo de los seis recursos— salvo el denominador de la utilización, que sigue vivo como D7 y tiene conversión exacta
What-if: varios escenarios, lado a lado, diferencias resaltadas ✓ ✓ (lila compare) M3 Implementado (LILA-038, LILA-047)
Replicaciones (recomiendan 30) ✓ solo en what-if ✓ siempre, con IC 95 % M2 Implementado (LILA-027)
Export de resultados Excel CSV y XLSX M2 Implementado (LILA-037, LILA-046, #322)
Importar .bpmn exportado por Bizagi — ✓ solo diagrama: Bizagi no exporta parámetros de simulación (verificado en 5 archivos reales, solo colores en bizagi:) M0 Implementado (LILA-020)
Modelador y entregables
Varios procesos en un mismo proyecto, con una call activity que abre otro diagrama ✓ un proyecto guarda varios diagramas; un subproceso reusable (call activity) referencia otro diagrama, abierto desde una ventana de navegación sobre la jerarquía del modelo ✓ repositorio v2 (#498): pestañas del lienzo, una por proceso, guardadas juntas en el mismo proyecto; doble clic sobre una call activity cuyo calledElement coincide con el id BPMN de otro proceso lo abre con una miga «Volver a …», y doble clic sobre un subproceso colapsado hace drill-down en el sitio. Un proyecto de un solo proceso sigue guardando byte a byte en el formato v1 que abre la app de la beta.14 M5 Implementado (#511, #498, #461)
Atributos extendidos definidos una vez por tipo de elemento y rellenados en cada elemento ✓ una pestaña de «Atributos extendidos» por elemento, compartida por todos los elementos de ese tipo, varios tipos de dato (incluida una tabla), exportable para reusarla en otros modelos ✓ definiciones de texto/número/lista/fecha por tipo de elemento (appliesTo), editadas en Propiedades y listadas bajo cada elemento en el documento del proceso; renombrar, retipar o borrar una definición que ya tiene valores pregunta antes, y nunca pierde un valor en silencio M5 Implementado (#513, #509)
Gráficas junto a las tablas de resultados ✗ la vista de Resultados es una tabla; «Export to Excel» transfiere esa misma grilla. (Los tipos de gráfica de Bizagi —línea/columna/pastel— son del Graphical Analysis/BAM del Work Portal, aparte, no de la vista de simulación del Modeler) ✓ gráficas de barras bajo las tablas de Elementos del proceso, Recursos y Proceso en Resultados, en Comparar, y rasterizadas en el documento del proceso; cada barra repite el texto y el valor de su celda, y a los datos faltantes les toca una nota en vez de una gráfica en cero M5 Implementado (#512, #460)
Publicar el proceso como documento (Word / HTML) ✓ «Publish to Word» (también PDF, Excel, MediaWiki, SharePoint): elige qué diagramas y elementos incluir, tres plantillas integradas (Aspose, Bizagi, Modeler) o una plantilla de Word propia ✓ Archivo → Exportar documento del proceso (Word .docx o HTML): portada, diagrama, descripción del proceso, una sección por elemento en orden de flujo agrupada por carril, y luego las tablas del escenario y de resultados con las gráficas de la corrida. Sin plantillas ni campo de tabla de contenido M5 Implementado (#454)
Exportar el diagrama como imagen e imprimirlo ✓ Export → Image en PNG, SVG o JPG (no PDF directo; PDF es un formato de Publish; el export a Visio va aparte) ✓ Archivo → Exportar como SVG… / PNG… / PDF… e Imprimir (⌘P/Ctrl+P); SVG conserva los colores del tema sobre su lienzo, PNG/PDF/impresión usan papel blanco con trazos negros, conservando los colores por elemento M5 Implementado (#451)
Extras que Bizagi no da
p50/p90/p95 de ciclo y espera ✗ ✓ M2 Implementado (LILA-028)
Longitud de cola media/máx por actividad ✗ ✓ M2 Implementado (LILA-036)
Throughput por hora, costo por caso ✗ ✓ M2 Implementado (LILA-028)
Ranking de cuellos de botella ✗ ✓ M2 Implementado (LILA-036)
Event log por caso (CSV; XES después) ✗ ✓ M2 Implementado (LILA-037)
Espera fuera de horario separada de espera por recurso ✗ (queja: "poca granularidad") ✓ M3 Implementado (LILA-041); fue justo la métrica que delató la mitad de D7 que cerró LILA-164 (el workaround de pools por turno creaba una offHoursWait que Bizagi no tiene; hoy vale 0 en las cuatro tareas del nivel 4)
Determinismo por semilla, byte a byte parcial ✓ M1 Implementado (LILA-030, LILA-039, LILA-043)
macOS / Windows / Linux / navegador ✗ (4.3 sigue Windows-only, sin editor web) parcial: web y macOS probados; Windows y Linux construidos por CI, sin probar M5 Implementado: app web (probada en Chrome; Safari pendiente) y beta de macOS (probada). El instalador de Windows se adjunta a la beta pero está sin firmar y no se ha probado en una máquina Windows real; el AppImage de Linux lo construye CI, sin probar y no adjunto (estado por plataforma)
Importar parámetros del escenario desde Excel/CSV, revisados antes de aplicar nada ✗ (el Modeler exporta la grilla de resultados a Excel; no se encontró en la documentación pública un camino de vuelta hacia los parámetros de simulación) ✓ descarga una plantilla ya rellena, importa un Excel/CSV equivalente, revisa el reporte campo por campo (filas sin coincidencia/ambiguas y valores inválidos señalados), y luego aplica o deshace M5 Implementado (#514, #449)
Después
Animación con contadores en vivo ✓ ✓ los tokens sobre el mapa de Resultados reproducen el log de eventos con contadores por elemento; token-simulation (MIT) conserva la parte didáctica — Implementado (#331)
Start quantity / completion quantity ✓ reservado — No planificado (v1)
Temporizador de borde interruptor sobre una tarea ✓ ✓ — Implementado (#81, primera tajada: SEMANTICS.md R-BND-1…9)
Temporizador de borde no interruptor sobre una tarea ✓ ✓ — Implementado (#81, segunda tajada: SEMANTICS.md R-BND-10…14)
Event-based gateway (ramas de tiempo y de mensaje) ✓ ✓ — Implementado (#81, tercera rebanada: SEMANTICS.md R-EVG-1…7)
Message/signal/link events sueltos, boundary events que no son de tiempo, boundary events sobre un subproceso, event-based gateway paralelo o que instancia parcial error de validación explícito hasta que un usuario lo pida — No planificado (v1)
Parámetros desde event logs (Bizagi 4.0 process mining) ✓ fase minería (proceso Python separado) — No planificado (v1)
No (Bizagi tampoco los simula)
Multi-instancia, complex gateway, choreography/conversation, transaccional, ad-hoc; leer .bpm propietario ✗ ✗ — Fuera de alcance

Diferencias documentadas (LILA-044, corregidas en LILA-187)

packages/engine/test/bizagi-parity.test.ts simula examples/bizagi-levels/level-{1..4} tal cual están committeados y compara, con tolerancia ±5 %, cada número que su expected.json cita de la página oficial. Hasta LILA-187 el test tenía dos mitades —las réplicas publicadas, que no cuadraban, y la misma comparación sobre un fixture aparte con la topología del diagrama oficial— porque LILA-044 tenía prohibido tocar los ejemplos. LILA-187 llevó esa topología, las probabilidades del gateway y las llegadas constantes a los propios model.bpmn y scenario.json, así que la segunda mitad y su fixture desaparecieron: hoy hay una sola tabla.

Cada fila del test asegura de qué lado de la tolerancia está su número. Si una fila cambia de lado, el test se pone rojo y hay que actualizar el test y esta sección a la vez.

Resultado

Medido con 30 replicaciones en el test (los scenario.json publicados siguen en 1: las replicaciones son una técnica de medición del test, no un parámetro de los ejemplos).

Nivel Número publicado Lila Causa
1 1000 tokens creados y completados 1000 (0 %) —
1 rama Red (50 %) = 483 498,9 (+3,3 %) —
1 rama Yellow (30 %) = 315 298,1 (−5,4 %) D2
1 rama Green (20 %) = 202 203,0 (+0,5 %) —
1 ramas contra 1000 × p (500 / 300 / 200) −0,23 % / −0,63 % / +1,52 % —
2 2017 instancias iniciadas y completadas 2017 (0 %) —
2 ciclo mín 16 min 16 min (0 %) —
2 ciclo máx 33 min 33 min (0 %) —
2 ciclo medio 25 min 3 s 25 min 4 s (+0,06 %) —
3 ciclo mín 16 min (3 enf.) 16 min (0 %) —
3 ciclo máx 35 min (3 enf.) 33,1 min (−5,3 %) D5
3 ciclo medio 25 min 15 s (3 enf.) 25 min 4 s (−0,74 %) —
3 utilización Call center agent 39,91 % (3 enf.) 39,91 % (−0,01 %) —
3 utilización Nurse 69,75 % (3 enf.) 69,65 % (−0,14 %) —
3 utilización Ambulance 49,76 % (3 enf.) 49,63 % (−0,27 %) —
3 utilización Quick attention vehicle 21,40 % (3 enf.) 20,95 % (−2,09 %) —
3 utilización Basic ambulance 19,44 % (3 enf.) 20,21 % (+3,96 %) —
3 utilización Receptionist 19,91 % (3 enf.) 19,85 % (−0,30 %) —
3 utilización Call center agent 38,09 % (2 enf.) 38,09 % (+0,01 %) —
3 utilización Nurse 99,85 % (2 enf.) 99,72 % (−0,13 %) —
3 utilización Ambulance 47,49 % (2 enf.) 47,36 % (−0,27 %) —
3 utilización Quick attention vehicle 20,42 % (2 enf.) 20,01 % (−2,03 %) —
3 utilización Basic ambulance 18,55 % (2 enf.) 19,29 % (+4,01 %) —
3 utilización Receptionist 19,00 % (2 enf.) 18,95 % (−0,29 %) —
3 ciclo mín 16 min (2 enf.) 16,07 min (+0,42 %) —
3 ciclo máx 10 h 57 min (2 enf.) 665,8 min (+1,34 %) —
3 ciclo medio 3 h 39 min 38 s (2 enf.) 271,3 min (+23,5 %) D6
3 costo fijo de actividades 8063 (derivado, no publicado) 8057,6 (−0,07 %) —
3 costo Call center agent 6051 6051,0 (0 %) —
3 costo Nurse 15 115 15 101,5 (−0,09 %) —
3 costo Ambulance 30 314,13 30 232,8 (−0,27 %) —
3 costo Receptionist 3018 3009,9 (−0,27 %) —
3 costo Quick attention vehicle 11 139,86 10 907,9 (−2,08 %) —
3 costo Basic ambulance 9844,65 10 234,6 (+3,96 %) —
3 los seis costos, corrida de 2 enfermeras los mismos valores y los mismos desvíos (el costo no depende de la capacidad) —
4 2017 instancias iniciadas y completadas 2017 (0 %) —
4 ciclo medio 25 min 26 s (1526 s) 1521,5 s (−0,30 %) —
4 offHoursWait de las 4 tareas con recurso por turno 0 en las cuatro —
4 utilización Call center agent 11,21 % 11,21 % (−0,04 %) D7 (denominador convertido)
4 utilización Nurse 16,21 % 16,30 % (+0,54 %) D7 (denominador convertido)
4 utilización Ambulance 11,49 % 11,61 % (+1,06 %) D7 (denominador convertido)
4 utilización Quick Attention Vehicle 7,55 % 7,35 % (−2,60 %) D7 (denominador convertido)
4 utilización Basic Ambulance 5,60 % 5,67 % (+1,33 %) D7 (denominador convertido)
4 utilización Receptionist 6,90 % 6,97 % (+0,98 %) D7 (denominador convertido)
4 costo Call center agent 6051 6051,0 (0 %) —
4 costo Nurse 15 050 15 101,5 (+0,34 %) —
4 costo Ambulance 29 922,4 30 232,8 (+1,04 %) —
4 costo Quick Attention Vehicle 11 193,94 10 907,9 (−2,56 %) —
4 costo Basic Ambulance 10 095,15 10 234,6 (+1,38 %) —
4 costo Receptionist 2979 3009,9 (+1,04 %) —
4 Arrive BA espera máx 15 min (900 s) 970 s (+7,78 %) D7 (residuo)
4 Arrive BA espera media 0,74 min (44,4 s) 33,5 s (−24,5 %) D7 (residuo)

Los niveles 1, 2 y 3 cuadran dentro del ±5 % salvo tres residuos documentados: D2 (nivel 1, rama Yellow contra la corrida única de Bizagi) y D5 y D6 (nivel 3). El nivel 4 cuadra desde LILA-164 en ciclo, utilización y costo de los seis recursos; le quedan dos residuos: las dos esperas de Arrive at patient place BA y —para las utilizaciones— la conversión de denominador, las dos mitades de lo que hoy es D7. Las diferencias vivas hoy son, por tanto, D2, D5, D6 y D7; D1, D3, D4 y D8 quedaron resueltas en LILA-186/187.

Las utilizaciones del nivel 4 son las convertidas al denominador de Bizagi. Sin convertir, Lila publica sobre su ventana de medida [warmup, t_stop] = 10 862 min: 44,75 % · 64,82 % · 46,18 % · 29,79 % · 22,24 % · 27,36 %, en el mismo orden. Son los mismos segundos ocupados divididos por otro denominador; la fórmula está en D7.

Causas

D1 — triggerCount sin interTriggerTimer (resuelta en LILA-186). Era un hueco del contrato de Lila, no un desajuste con Bizagi: R-ARR-1 solo generaba casos en un start con interTriggerTimer, así que el nivel 1 (max arrival count 1000 y ningún campo de tiempo, porque el nivel 1 no los habilita) salía con cero llegadas y el aviso W-START-SIN-LLEGADAS. R-ARR-1 dice ahora que triggerCount sin interTriggerTimer equivale al default constant 0, es decir N llegadas en t = 0, que es lo que hace Bizagi. El aviso queda para el start que no declara ninguno de los dos campos.

D2 — la rama del 30 % contra una corrida única de Bizagi. Los tres conteos publicados (483 + 315 + 202) son una sola corrida de 1000 tokens; el 315 se desvía por sí mismo un +5 % de su propia probabilidad configurada (30 %). Contra 1000 × p, que es lo que de verdad valida el nivel 1, las tres ramas cuadran (−0,23 %, −0,63 %, +1,52 %). Anotado además: level-1/expected.json etiquetaba los tres conteos como green/yellow/red al revés (corregido en LILA-187). La prosa de la página solo da la suma «(483+315+202)», pero la tabla de resultados que la acompaña (processvalidation42.png) los publica fila por fila: «Red Triage end 483 · Yellow Triage end 315 · Green Triage end 202». La corrida rota (processvalidation43.png) confirma la lectura: «Red Triage end 1006 · Yellow Triage end 311 · Green Triage end 186», y el 1006 solo puede ser la rama del Parallel Gateway sin convergencia.

D3 — la topología reconstruida de los niveles 2–4 no era la del diagrama oficial (resuelta en LILA-187). examples/bizagi-levels/level-{2,3,4}/model.bpmn reconstruía el «Emergency attendance process» como siete tareas en secuencia con un XOR de vehículo al final. El diagrama de la página (simulationexample2.png, el mismo proceso en los cuatro niveles), que es el que reproducen hoy los cuatro model.bpmn, es:

Recieve Emergency Report (4 min) → Classify Triage (5 min) → XOR "Triage type"
  ├ Red    50 % → AND ( Manage patient entry 11 min ‖ Pick up patient 20 min ) → Authorize Entry 4 min → fin
  ├ Yellow 30 % → Arrive at patient place QAV  7 min → fin
  └ Green  20 % → Arrive at patient place BA  10 min → fin

Consecuencias medidas: con la secuencia hay un solo camino de 51–54 min (contra 16 / 33 / 25 min publicados) y la enfermera consume 16 min por caso en vez de 10,5 (5 min siempre + 11 min solo en el 50 % Red), o sea 3,2 enfermeras de carga contra 2,1 — por eso satura al 99,9 % con tres, cuando Bizagi publica 69,75 %. Con la topología oficial los tres números del nivel 2 salen exactos y la utilización de los seis recursos del nivel 3 cuadra dentro del 4 %. Era una errata de la réplica (LILA-010), no del motor: LILA-187 la corrigió en model.bpmn y añadió al escenario las probabilidades del gateway Triage type publicadas en prosa en level_1_example.htm.

D4 — llegadas constantes y drenado (resuelta en LILA-187). La corrida publicada (processvalidation47.png) trae exactamente 2017 instancias iniciadas y 2017 completadas (10080 / 5 + 1), con Duration 030,00:00:00 en la cabecera del informe: 30 días de reloj para una semana de llegadas, o sea que Bizagi dejó drenar la corrida: imposible con un Poisson de media 5 min, y prueba de que el ejemplo usó el control de intervalo constante de 5 min, no la distribución exponencial que declara el escenario publicado. Además Bizagi drena la corrida (0 casos en vuelo) mientras el escenario publicado corta a la semana y deja casos en vuelo que, por LILA-036, no entran en las medias. Con interTriggerTimer constante de 300 s, triggerCount 2017 y sin duration (R-ARR-3: la corrida acaba al vaciarse el heap) —que es lo que declaran hoy los scenario.json de los niveles 2, 3 y 4— Lila reproduce las 2017 instancias y el denominador de utilización de Bizagi: callCenterAgent sale 39,91 % contra 39,91 % publicado.

D5 — el máximo del nivel 3 con 3 enfermeras (−5,3 %). Bizagi publica 35 min = los 33 min del camino Red más 2 min de espera de enfermera que en su corrida cayeron en el camino crítico. En la nuestra la espera máxima de Classify Triage es de segundos y el máximo se queda en los 33 min del camino puro. Es la cola de la distribución de un único máximo, no una diferencia de definición: la media cuadra al 0,74 % y la utilización al 0,14 %.

D6 — el caso saturado del nivel 3 (2 enfermeras), media +23,5 %. Con 2 enfermeras el sistema está por encima de su capacidad (ρ ≈ 1,05) y la cola crece durante toda la corrida, así que la media depende de la forma del transitorio, no del estado estacionario. Mínimo (+0,4 %), máximo (+1,3 %) y utilización (−0,13 %) cuadran; la media no, porque en Bizagi la razón media/máximo de la espera vale 0,40 y en Lila 0,49 — es decir, la cola de Bizagi crece sublinealmente y la de Lila linealmente, que es lo que produce una acumulación de trabajo constante desde t = 0. Sin la corrida original de Bizagi no se puede ir más allá; queda como el único residuo del nivel 3.

D7 — el nivel 4: resuelta la capacidad por turno (LILA-164), vivo el denominador de la utilización. Bizagi hace variar la plantilla por turno (2 / 2 / 1 agentes de call center, etc.) sin que el recurso deje de existir: los tres turnos cubren las 24 h y no hay tiempo cerrado.

Lo que cerró LILA-164. Hasta entonces SCENARIO_FORMAT.md v1 no admitía eso y la réplica lo modelaba con tres pools —uno por turno, cada uno con su calendar— seleccionados con selection: "or". El efecto colateral estaba medido: el calendario efectivo de la tarea pasaba a ser el del turno concedido (R-CAL-4), el trabajo se pausaba al cerrar el turno y aparecía una offHoursWait de 59,7 min por caso que bajo la semántica de Bizagi tiene que ser 0; el ciclo medio salía a 84,4 min (+232 %), y la utilización y el costo se publicaban por turno en vez de por rol. R-CAL-11 (resources[pool].capacity: [{ calendar, capacity }], docs/SEMANTICS.md § 12) es un solo pool por rol con la tabla «Resource | Morning shift | Day shift | Night shift» de la página tramo a tramo, y con ella:

  • offHoursWait = 0 en las cuatro tareas con recurso por turno (la unión de los tres turnos es un 24×7): era el desvío entero;
  • ciclo medio 1521,5 s contra los 1526 s publicados (−0,30 %);
  • utilización y costo se reportan por rol, seis filas, las de Bizagi, y los doce números caen dentro del ±5 % (peor caso −2,60 %, Quick Attention Vehicle);
  • Arrive at patient place BA vuelve a hacer cola (máx 970 s) porque la capacidad baja a 1 en el turno de tarde; con la capacidad fija del nivel 3 era exactamente 0.

Lo que sigue vivo: el denominador. En el nivel 4 Bizagi divide por la duración declarada del escenario (43 200 min = los 30 días del campo Duration del informe), no por el instante de fin de corrida (≈ 10 862 min) que sí usa en el nivel 3 y que es lo que fija R-CAL-9. Son 4,0× de diferencia. Es una decisión de contrato, no un bug, y Lila no cambia de denominador: mantiene [warmup, t_stop], que es la ventana en la que de verdad midió. La conversión es exacta sobre busyTime:

util_bizagi = busyTime / Σᵢ (capacityᵢ × openTimeᵢ sobre la duración declarada)
            = util_lila × ventana_lila / duración_declarada

y con los tres turnos de 8 h ese sumatorio vale (Σᵢ capacityᵢ / 3) × 43 200 min, que es literalmente la cuenta publicada: Call center agent 8068 min / ((2+2+1)/3 × 43 200 min) = 11,21 %, exacta al segundo decimal en los seis recursos contra calendaranalysis2.png.

Aplicada, las seis filas cuadran holgadamente (la tabla de arriba): −0,04 % · +0,54 % · +1,06 % · −2,60 % · +1,33 % · +0,98 %. La segunda forma —la regla de tres util_lila × ventana / duración declarada— es la versión de bolsillo y solo coincide del todo cuando la ventana cubre un número entero de periodos del patrón de turnos; aquí no lo cubre (la corrida se agota a los 10 862 min, 7,54 días) y el sesgo del corte a media franja llega al 1,8 % en quickAttentionVehicle, el rol cuyo turno de tarde vale el doble que los otros dos. El test comprueba las dos y acota esa diferencia al 3 %: es el error de la regla de tres, no del motor.

Residuo: las dos esperas de Arrive at patient place BA. Máximo 970 s contra 900 s publicados (+7,8 %) y media 33,5 s contra 44,4 s (−24,5 %). Son de una corrida única de Bizagi sobre un pool al 5,6 % de utilización, donde solo hay cola cuando dos casos coinciden en el turno de tarde (una sola ambulancia básica); el reparto por rama de esa corrida tampoco es el nuestro (Bizagi 403 instancias BA, Lila 409). Es ruido de la corrida de referencia, del mismo tipo que D2, y no se relaja la tolerancia por él.

Nota de mapeo (corregida en LILA-187). expected.json llamaba waitTimeSeconds a lo que la tabla de Bizagi titula «Min./Max./Avg. time» del proceso. Esa columna es tiempo de ciclo (procesamiento + espera), y su equivalente en Lila es process.cycleTime, no process.waitTime (que es solo resourceWait + offHoursWait y en el nivel 2, sin recursos, vale 0 por R-DEG-1). El campo se llama hoy cycleTimeSeconds en los cuatro expected.json.

D8 — los dos vehículos están cruzados en la tabla de requerimientos de la página (resuelta en LILA-187). La tabla «Activity | Resource | Quantity» del nivel 3 asigna «Arrive at patient place QAV → Basic ambulance» y «Arrive at patient place BA → Quick attention vehicle», y la réplica lo reproducía verbatim. Los carriles del diagrama y los resultados publicados dicen lo contrario: en resourcesanalysis3.png Quick Attention Vehicle sale al 21,40 %, que es 618 × 7 min / (2 × 10 108 min) — la tarea QAV — y Basic Ambulance al 19,44 % = 393 × 10 min / (2 × 10 108 min) — la tarea BA. Con esa lectura los seis denominadores dan el mismo instante de fin de corrida (10 108 min con 3 enfermeras, 10 591 con 2), lo que confirma a la vez la fórmula busy / (capacidad × t_fin) y el cruce.

Para la utilización el cruce solo intercambia dos etiquetas, porque los dos pools tienen capacidad 2. Para el costo no: los precios difieren (25 y 0,3 /h contra 18 y 0,22 /h), así que con el cruce la réplica cobraba la tarea QAV a 25/token en vez de 18 y la tarea BA a 18 en vez de 25 (medido entonces: +36,0 % y −25,1 %). LILA-187 puso en scenario.json la asignación que cuadra con los costos publicados, y los dos costos pasan a −2,08 % y +3,96 %.


Ver también: docs/es/COMING-FROM-BIZAGI.md (la guía de usuario para quien llega desde Bizagi Modeler: los cuatro niveles como pasos de Simular, el mapa pantalla por pantalla y estas diferencias en lenguaje llano).

Ver también: docs/RESULTS_FORMAT.md (definición de las columnas de salida mencionadas en "Salidas por elemento"/"Salidas por recurso"), docs/BPMN_EXTENSION.md (namespace lila: e ids), docs/DECISIONS.md (ADR que sustentan estas decisiones) y BACKLOG.md (desglose en tickets por hito).

✎ Editar esta páginaPara v1.0.0-beta.26