Repo: mendixlabs/mxcli
Affects: v0.16.0 (current Latest release, built 2026-07-12)
Mendix: 11.13.0 (reproduced); applies to any project ≥ 11.9
Severity: High — affects every CALL MICROFLOW written from MDL regardless of syntax; both checkers pass, and the app will not boot.
Status of fix: Already fixed in main (253d60d8, 2026-07-29, FINDINGS #39). This report is "please cut a release" — the fix has been sitting unreleased while v0.16.0 remains Latest.
Summary
mxcli v0.16.0 writes workflow call-microflow activities with the on-disk $Type
Workflows$CallMicroflowTask. Mendix 11.9 (WOR-2802) split MicroflowBasedActivity into
CallMicroflowActivity + AIAgentTaskActivity and renamed that $Type to
Workflows$CallMicroflowActivity. Writing the pre-11.9 name into an 11.9+ project produces:
- In Studio Pro: every call-microflow activity renders as a red pin and cannot be
double-clicked or configured. The rest of the workflow (user tasks, outcomes, branching) renders
normally, which makes it look like a modelling mistake rather than a tool defect.
- At runtime: the entire model fails to load —
Failed to load model: ... Class 'Workflows$CallMicroflowTask' could not be found.
This is independent of the WITH clause. It reproduces with a correct short WITH key, with a
fully-qualified key, and with no WITH clause at all. It is a separate defect from the
double-prefixing reported in the companion issue about fully-qualified WITH keys — that one
corrupts the parameter mapping; this one corrupts the activity type. A model can hit both at
once, and fixing only the WITH form leaves the red pin in place.
Why it is easy to miss
Both checkers pass. The commit message for 253d60d8 says so explicitly:
Both checkers passed (mxcli check ✓, mx check → 0 errors), but on an 11.9+ project the
runtime refused to load the ENTIRE model at boot
mx check is a load-and-validate pass, so "0 errors" reads like proof the model is good. It is not
sensitive to this $Type. The only cheap gate that catches it is opening the workflow in Studio
Pro and looking at the activity icons.
We lost roughly a day to this: a six-variant trigger-boundary probe of WITH-clause forms, every
arm graded by mx check, all six "passing" — and all six producing red pins, because the variable
under test was never the one that mattered.
Reproduction
Any workflow with a call-microflow activity, on a project ≥ 11.9:
CREATE WORKFLOW TFC."WF_Probe"
PARAMETER $WorkflowContext: TFC."TFCStub"
BEGIN
CALL MICROFLOW TFC."WF_ACT_TCCopilot_Prefill";
END WORKFLOW;
./mxcli check probe.mdl -p App.mpr --references # => Check passed!
./mxcli exec probe.mdl -p App.mpr # => Created workflow: TFC.WF_Probe
"…/Mendix Studio Pro 11.13.0 Beta.app/Contents/modeler/mx" check App.mpr
# => The app contains: 0 errors.
Then read what was actually stored, rather than trusting either checker:
LC_ALL=C grep -rla "WF_Probe" mprcontents/ # locate the unit
LC_ALL=C strings -n 4 <unit> | grep -oE 'Workflows\$Call[A-Za-z]+'
Actual
Workflows$CallMicroflowTask
Studio Pro shows a red pin for the activity. mendix-runtime aborts model initialization.
Expected
Workflows$CallMicroflowActivity on any project ≥ 11.9 — which is what main now emits.
Controlled A/B — only the binary varied
Same MDL script, same .mpr (an rsync copy of one real project), same gate binary
(Mendix Studio Pro 11.13.0 Beta.app/Contents/modeler/mx). BSON read directly out of
mprcontents/*.mxunit, so these are stored bytes, not a reader's interpretation.
| binary |
stored $Type (×5 activities) |
mx check |
Studio Pro |
v0.16.0 (tagged, 2026-07-12) |
Workflows$CallMicroflowTask |
0 errors |
red pins, not clickable |
504aec67 (main, 2026-07-31) |
Workflows$CallMicroflowActivity |
0 errors |
renders and opens normally |
The 5-activity workflow used here is a rebuild of a production workflow (3 user tasks, nested
Required/WaveOff branching, XPath user targeting). A hand-dragged workflow in the same model
stores CallMicroflowActivity, which is what made the diff obvious — the two units were otherwise
byte-comparable.
Impact
v0.16.0 is tagged Latest; the 2026-08-03 nightly (689e8ce4) is a Pre-release. So on
the current official release, no MDL-authored workflow containing a microflow call is usable on
any supported Mendix version (11.9 and later — i.e. all of them). Since both checkers report
success, users discover this either by opening Studio Pro or by watching the app fail to boot.
The practical consequence downstream is that teams conclude workflow authoring is "Studio-Pro-only"
and adopt a hand-dragging workaround — which is exactly the wrong lesson, since main already
writes this correctly.
Workaround for users on v0.16.0
There is no MDL-level workaround; no WITH form avoids it. Either build from main
(253d60d8 or later), or hand-drag call-microflow activities in Studio Pro.
Recovery from an already-broken model
mxcli reads models the Studio Pro loader rejects, so this is surgical:
./mxcli -p App.mpr -c "DROP WORKFLOW <Module>.<BadWorkflow>"
Then re-create with a fixed binary. Verified here: back to 0 errors, unrelated production
workflow (10 activities / 3 user tasks) untouched.
Suggested docs change
Worth a line in the bundled write-workflows skill: mx check returning 0 errors does not
establish that a workflow's activities are well-formed, and the storage-name class of defect is
only visible in Studio Pro. The skill currently presents mxcli check + mx check as the
validation step before presenting work to a user.
Environment
- mxcli
v0.16.0 (2026-07-12T11:44:17Z) vs main 504aec67 (2026-07-31)
- Mendix Studio Pro 11.13.0 Beta; gated with that bundle's own
mx
- macOS 15 (Darwin 25.5.0), Apple silicon
- A/B run in a throwaway copy in
/tmp; baseline 0 errors before each arm
Repo:
mendixlabs/mxcliAffects:
v0.16.0(current Latest release, built 2026-07-12)Mendix: 11.13.0 (reproduced); applies to any project ≥ 11.9
Severity: High — affects every
CALL MICROFLOWwritten from MDL regardless of syntax; both checkers pass, and the app will not boot.Status of fix: Already fixed in
main(253d60d8, 2026-07-29, FINDINGS #39). This report is "please cut a release" — the fix has been sitting unreleased whilev0.16.0remains Latest.Summary
mxcli
v0.16.0writes workflow call-microflow activities with the on-disk$TypeWorkflows$CallMicroflowTask. Mendix 11.9 (WOR-2802) splitMicroflowBasedActivityintoCallMicroflowActivity+AIAgentTaskActivityand renamed that$TypetoWorkflows$CallMicroflowActivity. Writing the pre-11.9 name into an 11.9+ project produces:double-clicked or configured. The rest of the workflow (user tasks, outcomes, branching) renders
normally, which makes it look like a modelling mistake rather than a tool defect.
Failed to load model: ... Class 'Workflows$CallMicroflowTask' could not be found.This is independent of the
WITHclause. It reproduces with a correct shortWITHkey, with afully-qualified key, and with no
WITHclause at all. It is a separate defect from thedouble-prefixing reported in the companion issue about fully-qualified
WITHkeys — that onecorrupts the parameter mapping; this one corrupts the activity type. A model can hit both at
once, and fixing only the
WITHform leaves the red pin in place.Why it is easy to miss
Both checkers pass. The commit message for
253d60d8says so explicitly:mx checkis a load-and-validate pass, so "0 errors" reads like proof the model is good. It is notsensitive to this
$Type. The only cheap gate that catches it is opening the workflow in StudioPro and looking at the activity icons.
We lost roughly a day to this: a six-variant trigger-boundary probe of
WITH-clause forms, everyarm graded by
mx check, all six "passing" — and all six producing red pins, because the variableunder test was never the one that mattered.
Reproduction
Any workflow with a call-microflow activity, on a project ≥ 11.9:
Then read what was actually stored, rather than trusting either checker:
Actual
Studio Pro shows a red pin for the activity.
mendix-runtimeaborts model initialization.Expected
Workflows$CallMicroflowActivityon any project ≥ 11.9 — which is whatmainnow emits.Controlled A/B — only the binary varied
Same MDL script, same
.mpr(anrsynccopy of one real project), same gate binary(
Mendix Studio Pro 11.13.0 Beta.app/Contents/modeler/mx). BSON read directly out ofmprcontents/*.mxunit, so these are stored bytes, not a reader's interpretation.$Type(×5 activities)mx checkv0.16.0(tagged, 2026-07-12)Workflows$CallMicroflowTask504aec67(main, 2026-07-31)Workflows$CallMicroflowActivityThe 5-activity workflow used here is a rebuild of a production workflow (3 user tasks, nested
Required/WaveOffbranching, XPath user targeting). A hand-dragged workflow in the same modelstores
CallMicroflowActivity, which is what made the diff obvious — the two units were otherwisebyte-comparable.
Impact
v0.16.0is tagged Latest; the2026-08-03nightly (689e8ce4) is a Pre-release. So onthe current official release, no MDL-authored workflow containing a microflow call is usable on
any supported Mendix version (11.9 and later — i.e. all of them). Since both checkers report
success, users discover this either by opening Studio Pro or by watching the app fail to boot.
The practical consequence downstream is that teams conclude workflow authoring is "Studio-Pro-only"
and adopt a hand-dragging workaround — which is exactly the wrong lesson, since
mainalreadywrites this correctly.
Workaround for users on v0.16.0
There is no MDL-level workaround; no
WITHform avoids it. Either build frommain(
253d60d8or later), or hand-drag call-microflow activities in Studio Pro.Recovery from an already-broken model
mxcli reads models the Studio Pro loader rejects, so this is surgical:
./mxcli -p App.mpr -c "DROP WORKFLOW <Module>.<BadWorkflow>"Then re-create with a fixed binary. Verified here: back to
0 errors, unrelated productionworkflow (10 activities / 3 user tasks) untouched.
Suggested docs change
Worth a line in the bundled
write-workflowsskill:mx checkreturning 0 errors does notestablish that a workflow's activities are well-formed, and the storage-name class of defect is
only visible in Studio Pro. The skill currently presents
mxcli check+mx checkas thevalidation step before presenting work to a user.
Environment
v0.16.0 (2026-07-12T11:44:17Z)vsmain504aec67(2026-07-31)mx/tmp; baseline0 errorsbefore each arm