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 concepts/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 adrs/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 concepts/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](<../../wiki/analysis/bpmn-coverage-matrix.md#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 adrs/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 analysis/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