Operaton DMN Compatibility Checklist¶
A practical checklist for authoring DMN files that deploy and execute correctly in Operaton (the open-source Camunda 7 CE fork). Work through this list when a DMN fails to deploy or produces unexpected results.
1) Namespace and DMN version¶
- โ
Use DMN 1.3 namespace:
xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" - โ Avoid DMN 1.1 namespace โ Operaton supports 1.1 but behaviour may differ for newer features
- โ
Verify
<definitions>has a validnamespaceattribute and a uniqueid
2) Decision IDs and references¶
- โ
Every
<decision>element must have a uniqueidattribute - โ
<requiredDecision href="#...">must reference theidof another<decision>in the same<definitions>, not itsname - โ
<informationRequirement>elements need their own uniqueidattribute - โ
Avoid duplicate
idvalues anywhere in the document โ even across<dmndi:DMNDI>elements - โ
Decision-table clause elements need
idtoo โ<input>,<output>,<rule>,<inputEntry>and<outputEntry>. The DMN 1.3 XSD marks these optional, but Operaton's transformer rejects the file at deploy withDMN-02011. Flagged asBIZ-010โBIZ-014since v2026.07.1; a Camunda Modeler resave usually adds them
3) FEEL expressions¶
- โ
Use
not(x)โ notnot x(the latter is a unary test, not a negation function) - โ
Unary test intervals:
[a..b),(a..b],[a..b]โ parentheses for exclusive bounds - โ
and/orin unary tests refer to multiple unary conditions on the same input โ do not use them as Boolean operators in FEEL expressions - โ
String literals must use double quotes:
"active", not'active' - โ
Date literals:
date("2026-01-01"), not bare strings - โ
Test FEEL expressions in isolation with the Operaton REST API
evaluateendpoint before deploying a full DRD
4) Variable naming and types¶
- โ Use simple variable names (letters, digits, underscore). Avoid spaces and punctuation in variable names referenced by FEEL.
- โ
In FEEL, reference runtime variables (the
<variable name="...">) rather than element IDs - โ
Keep numeric types consistent โ
IntegervsDoubledifferences between request and DMN declaration cause runtime type errors
5) Null / missing inputs¶
If a required input may be absent, Operaton may throw a runtime error rather than producing a null output.
- โ
Use null-safe FEEL where inputs may be missing:
x = falseis safer thannot(x)whenxcan be null - โ
Use
if x = null then โฆ else โฆfor optional inputs - โ
For optional inputs, provide defaults in FEEL expressions:
if medischeVerklaring = true then true else missendeMaand = false
6) DMNDI (diagram section)¶
The engine ignores the <dmndi:DMNDI> block for execution, but the Operaton Modeler and UI use it for rendering.
- โ
Avoid multiple DI elements referencing the same
dmnElementRef - โ
<dmndi:DMNEdge>dmnElementRefmust reference an<informationRequirement>ID, not a<decision>ID - โ
If deployment fails and you cannot isolate the cause, temporarily remove the entire
<dmndi:DMNDI>โฆ</dmndi:DMNDI>block, deploy without it, and re-add once the execution logic is confirmed working
6b) Tenancy¶
- โ
A
businessRuleTask'scamunda:decisionRefresolves against a decision definition under the exact same tenant-id as the calling process instance. There is no fallback to a shared, untenanted decision even when one exists โ confirmed empirically against a live engine - โ
To call a genuinely shared, untenanted decision from a tenant-scoped process, set
camunda:decisionRefTenantIdto an EL expression evaluating to null:${null}. A literal empty string is silently ignored - โ
A BPMN deployment's tenant comes from
POST /deployment/create'stenant-idfield โ which the BPMN Modeler now always sends, since organization became mandatory at deploy time in v2026.08.1
7) Operaton-specific extensions¶
- โ
If Operaton enforces history cleanup TTL, set
camunda:historyTimeToLive="..."on<decision>elements (or configure a global default in the engine) - โ
Keep extension namespaces consistent:
xmlns:camunda="http://camunda.org/schema/1.0/dmn"
8) Deployment debugging workflow¶
If you see ENGINE-22004 Unable to transform DMN resource โฆ:
- Verify DMN namespace and version (DMN 1.1 vs 1.3)
- Check for broken
href="#..."references โ the targetidmust exist - Check FEEL parsing:
not xvsnot(x), unary testand/orvs Booleanand/or - Temporarily remove
<dmndi:DMNDI>to rule it out - Inspect Operaton server logs immediately after
ENGINE-22004for the underlying parse error โ the 22004 message is a wrapper; the actual cause is one line below it
9) Testing strategy¶
- โ Test leaf decisions first (single-input literal expressions) before testing a full DRD
- โ When testing a decision that depends on others, provide the full upstream input set โ unless you have made all inputs null-safe
- โ Maintain one "superset" JSON payload covering all possible inputs for the chain, usable for quick regression testing across DMN versions