Skip to content

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 valid namespace attribute and a unique id

2) Decision IDs and references

  • โœ… Every <decision> element must have a unique id attribute
  • โœ… <requiredDecision href="#..."> must reference the id of another <decision> in the same <definitions>, not its name
  • โœ… <informationRequirement> elements need their own unique id attribute
  • โœ… Avoid duplicate id values anywhere in the document โ€” even across <dmndi:DMNDI> elements
  • โœ… Decision-table clause elements need id too โ€” <input>, <output>, <rule>, <inputEntry> and <outputEntry>. The DMN 1.3 XSD marks these optional, but Operaton's transformer rejects the file at deploy with DMN-02011. Flagged as BIZ-010โ€“BIZ-014 since v2026.07.1; a Camunda Modeler resave usually adds them

3) FEEL expressions

  • โœ… Use not(x) โ€” not not 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 / or in 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 evaluate endpoint 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 โ€” Integer vs Double differences 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 = false is safer than not(x) when x can 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> dmnElementRef must 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's camunda:decisionRef resolves 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:decisionRefTenantId to an EL expression evaluating to null: ${null}. A literal empty string is silently ignored
  • โœ… A BPMN deployment's tenant comes from POST /deployment/create's tenant-id field โ€” 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 โ€ฆ:

  1. Verify DMN namespace and version (DMN 1.1 vs 1.3)
  2. Check for broken href="#..." references โ€” the target id must exist
  3. Check FEEL parsing: not x vs not(x), unary test and/or vs Boolean and/or
  4. Temporarily remove <dmndi:DMNDI> to rule it out
  5. Inspect Operaton server logs immediately after ENGINE-22004 for 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