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
- Zeebe-compatible subset: cubrimos exactamente lo que Camunda Platform 8 (Zeebe) soporta. No agregamos elementos propios.
- Strict execution semantics: si soportamos un elemento, su semántica es exactamente como BPMN 2.0 spec + Zeebe extensions.
- Fail-fast en deploy: si el modelo usa un elemento no soportado, falla el deploy con error claro. No "best effort".
- 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 |
| 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 (catálogo)
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 |
| 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:
wf process validate <file> → reporta elementos no soportados.
- Refactor manual para alternativas (workarounds documentados).
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