Saltar a contenido

BPMN 2.0 coverage matrix — qué soportamos y cuándo

Mapping completo de elementos BPMN 2.0 a fases del MVP. M1 cubre el 80/20 (orchestración de happy path + errors + timers). M2-M4 agregan los elementos avanzados que requieren más complejidad de engine.

Filosofía

  1. Zeebe-compatible subset: cubrimos exactamente lo que Camunda Platform 8 (Zeebe) soporta. No agregamos elementos propios.
  2. Strict execution semantics: si soportamos un elemento, su semántica es exactamente como BPMN 2.0 spec + Zeebe extensions.
  3. Fail-fast en deploy: si el modelo usa un elemento no soportado, falla el deploy con error claro. No "best effort".
  4. Migration path: cada elemento no soportado tiene workaround documentado.

Resumen ejecutivo

Phase Elementos soportados % del BPMN típico cubierto
M1 (3-6 meses) 28 elementos core ~80% de procesos reales
M2 (6-9 meses) +12 elementos (compensación, multi-instance, signals) ~92%
M3 (9-12 meses) +8 elementos (escalation, ad-hoc, etc.) ~98%
M4 (12+ meses) Resto + DMN avanzado 100% Zeebe-equivalente

Activities

Elemento Spec Zeebe support Nuestra fase Notas
Service Task ✅ ✅ M1 Core; job worker pattern
User Task ✅ ✅ M1 Requerido para Tasklist
Receive Task ✅ ✅ M1 Message correlation
Send Task ✅ ✅ M1 Implementado como service task con conector
Script Task ✅ ✅ (FEEL) M2 Inline FEEL/CEL expressions
Business Rule Task ✅ ✅ M2 DMN decision invocation
Manual Task ✅ ⚠️ (no-op) M1 Sin semántica activa; pass-through
Subprocess (embedded) ✅ ✅ M1 Mismo scope de variables
Call Activity ✅ ✅ M1 Sub-proceso independiente
Event Subprocess ✅ ✅ M2 Triggered por eventos boundary
Transaction Subprocess ✅ ❌ NO Zeebe no lo soporta; usar saga pattern
Ad-hoc Subprocess ✅ ✅ M3 Tareas sin orden predefinido

Events

Start Events

Elemento Spec Zeebe Fase Notas
None Start ✅ ✅ M1 Trigger manual o API
Message Start ✅ ✅ M1 Process trigger via publishMessage
Timer Start ✅ ✅ M1 Cron / ISO 8601 / Duration
Conditional Start ✅ ❌ NO No en Zeebe
Signal Start ✅ ✅ M2 Broadcast a múltiples procesos
Error Start (event subprocess) ✅ ✅ M2 Trigger por error
Escalation Start (event sub) ✅ ✅ M3 Trigger por escalation
Compensation Start ✅ ✅ M2 Trigger compensation flow

Intermediate Events

Elemento Spec Zeebe Fase Notas
Message Catch ✅ ✅ M1 Correlated message receipt
Timer ✅ ✅ M1 Duration / Date / Cycle
Signal Catch ✅ ✅ M2 Broadcast subscription
Conditional Catch ✅ ❌ NO Workaround: timer + condition
Link Catch/Throw ✅ ✅ M3 Goto entre elementos (rare)
Compensation Throw ✅ ✅ M2 Trigger compensation
Escalation Throw ✅ ✅ M3 Trigger escalation event
Signal Throw ✅ ✅ M2 Broadcast emit
Error Throw (no end) ✅ ❌ NO Sólo en end events

End Events

Elemento Spec Zeebe Fase Notas
None End ✅ ✅ M1 Termina branch
Error End ✅ ✅ M1 Throw BPMN error
Terminate End ✅ ✅ M1 Termina todo el proceso
Message End ✅ ✅ M1 Emite mensaje al exit
Signal End ✅ ✅ M2 Broadcast al exit
Escalation End ✅ ✅ M3 Escalation event
Compensation End ✅ ✅ M2 Trigger compensation
Cancel End ✅ ❌ NO Sólo en transaction subprocess

Boundary Events

Elemento Spec Zeebe Fase Notas
Timer (interrupting) ✅ ✅ M1 Timeout de task
Timer (non-interrupting) ✅ ✅ M2 Reminder sin cancelar
Message (interrupting) ✅ ✅ M1 Cancel task via message
Message (non-interrupting) ✅ ✅ M2 Side flow paralelo
Error (interrupting) ✅ ✅ M1 BPMN error handler
Signal (interrupting/not) ✅ ✅ M2 Broadcast trigger
Conditional ✅ ❌ NO No en Zeebe
Escalation ✅ ✅ M3 Soft notification
Compensation ✅ ✅ M2 Define compensation handler

Gateways

Elemento Spec Zeebe Fase Notas
Exclusive (XOR) ✅ ✅ M1 If-then-else basado en condición
Parallel (AND) ✅ ✅ M1 Fork / join
Inclusive (OR) ✅ ✅ M2 Multi-condition; sync más complejo
Event-based ✅ ✅ M1 "Espera lo primero que llegue"
Complex ✅ ❌ NO Rara vez usado; no Zeebe
Event-based instantiate ✅ ✅ M3 Start de proceso por evento

Multi-instance

Pattern Spec Zeebe Fase
Sequential MI (activity) ✅ ✅ M2
Parallel MI (activity) ✅ ✅ M2
Sequential MI (subprocess) ✅ ✅ M2
Parallel MI (subprocess) ✅ ✅ M2
Completion condition ✅ ✅ M2
Output collection ✅ ✅ M2

Compensation

Elemento Spec Zeebe Fase Notas
Compensation Boundary ✅ ✅ M2 Define handler
Compensation Throw Event ✅ ✅ M2 Dispara compensación
Compensation Activity ✅ ✅ M2 Service task de compensar
Subprocess compensation ✅ ✅ M2 Compensar dentro de subproc
Process-level compensation ✅ ✅ M2 Throw "all" desde main flow

Ver compensation and bpmn errors para semántica detallada.

DMN (Decision Model and Notation)

Elemento Soporte Fase
Decision Table ✅ M2
Decision Requirements Diagram (DRD) ✅ M2
Literal Expression ✅ M2
Context ✅ M3
List ✅ M3
Relation ✅ M3
Function ✅ M3
Invocation ✅ M3
Hit Policies (UNIQUE, ANY, FIRST, COLLECT, RULE ORDER) ✅ M2
Aggregation (SUM, MIN, MAX, COUNT) ✅ M2

Expression languages

Lang Engine Fase Notas
FEEL (subset Zeebe) feel-scala — Zeebe original
CEL cel-go M1 Default nuestro; ver adr 022 cel for expressions
FEEL-lite shim wrapper sobre CEL M2 Compatibility shim para migración
JavaScript — NO Riesgo de seguridad
Groovy — NO Riesgo de seguridad

Variables y data

Feature Soporte Fase Notas
Process variables (JSON) ✅ M1 Default
Local variables (scope) ✅ M1 Por activity
I/O mapping ✅ M1 Variable transforms en entry/exit
Variable propagation (parent ↔ child subprocess) ✅ M1 Map explícito
Big variables (>32KB) ✅ M2 Postgres TOAST automático
Variable encryption at rest ✅ M3 pgcrypto / KMS

Listeners

Tipo Soporte Fase Notas
Execution listener (start/end) ⚠️ M3 No prioritario; usar boundary events
Task listener ⚠️ M3 Similar

Zeebe deliberadamente no soporta listeners runtime para evitar accidental coupling. Mantenemos esa decisión.

Connectors no son BPMN propiamente; son service tasks con templates. Lista en connector sdk architecture.

Connector Fase
HTTP / REST M1
Email (SMTP) M2
AWS Lambda M2
Kafka publish M2
Webhook (inbound) M3
Database (custom) M3
Slack/Teams M3
OpenAI / LLM M3

Elementos NO soportados (jamás)

Justificación documentada:

Elemento Razón
Transaction Subprocess Zeebe lo eliminó; complejidad sin beneficio; usar saga pattern explícito
Cancel End Event Sólo válido en transaction subprocess
Conditional Start/Catch/Boundary Trigger no-event-driven que requiere polling continuo; mal pattern
Complex Gateway Casi nunca usado; reemplazable con XOR + script
Throw Error (intermediate) Confuso; usar End event
Choreography / Conversation diagrams Modelado, no ejecución

Validación en deploy

El validator (M1) chequea:

✗ Unsupported element: ConditionalStartEvent (id: Event_1)
  Suggestion: use TimerStartEvent + service task with condition check
  Doc: [[wiki/analysis/bpmn-coverage-matrix#conditional-events]]

Tabla de errores estándar:

Error code Descripción
BPMN_UNSUPPORTED_ELEMENT Element type not supported in current phase
BPMN_INVALID_FLOW Sequence flow violation
BPMN_MISSING_PROPERTY Required Zeebe extension missing (e.g., taskType)
BPMN_EXPRESSION_INVALID FEEL/CEL syntax error
BPMN_VARIABLE_NOT_FOUND Referenced variable not in scope

Compatibilidad con BPMN tooling

Tool Compatible Notas
Camunda Modeler ✅ Reusamos directamente (ver adr 008 reuse camunda modeler)
bpmn.io / bpmn-js ✅ Embeddable en nuestras UIs
Camunda 7 Modeler ⚠️ Sintaxis diferente; no compatible directo
Signavio ⚠️ Exporta BPMN estándar; mappings de extensiones perdidos
draw.io BPMN ❌ No produce extensiones runtime válidas

Migration de procesos Camunda 8

Para migrar un BPMN existente:

  1. wf process validate <file> → reporta elementos no soportados.
  2. Refactor manual para alternativas (workarounds documentados).
  3. wf process deploy <file> cuando esté limpio.

Mapping principal: - zeebe:taskDefinition type="..." → mantener idéntico. - feelExpression → convertir a CEL (tooling automático para 90%). - inputMapping/outputMapping → idéntico. - userTask form → JSON Schema en lugar de Camunda Form.

Ver migration from camunda 8.

Roadmap consolidado

M1 (3-6m): Service/User/Receive tasks, XOR/AND gateways, timer/message events
M2 (6-9m): Compensación, multi-instance, signals, DMN, inclusive gateway
M3 (9-12m): Escalation, ad-hoc, link events, business rule task
M4 (12m+): Listeners, advanced connectors, BPMN 2.0 100% Zeebe-equivalente

Referencias