diff --git a/CHANGELOG.md b/CHANGELOG.md index 43c5c4f0..b277702a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are. Named m ## Unreleased +- learn(inbox, pending-github-issues): **ten field-note drops from the Decompose/Rehost lab runs, and one not-filed draft of 53 mxcli 0.26 defects for mendixlabs/mxcli** (split from [#293](https://github.com/MendixMau/mxcli-project-toolkit/pull/293), 5/6). `contrib/inbox/2026-10-1{2,3}-*.md`: increments 1–8 of the split-a-monolith runs on a public Marketplace template (FSM 9.24.2), the native-module bug hunt, and the GenAI Showcase regeneration (0.26.0 and the 2026-10-13 nightly); each now has the template's front matter and is at most 600 words. `bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md`: the U1–U53 table the inbox drops refer to, marked DRAFT — NOT FILED, to be split into one issue per defect and retested before anything is posted. No BUG numbers assigned; triage promotes. — MendixMau, Decompose/Rehost lab runs 2026-10-12/13 - learn(decompose): **three on-demand skills for working from an existing Mendix app (split from #293, 4/6).** `decompose-app.md` covers splitting a monolith into several apps: choosing the cut on business fit and coupling, a gated target architecture, cut order by dependency direction, moving each slice by MPK, ledgering every crossing edge, and reporting the level the slice reached (build-green, seam-live or strangled). `rehost-app.md` covers regenerating a whole `.mpr` into a fresh app with `pipelines/mendix-mpr/` and reading the fidelity ledger; done means build-green with named hand-offs plus journey parity. `mendix-service-seam.md` collects OData/REST patterns between two Mendix apps: keys, machine-role auth measured 200/401/404, error handlers, external-entity limits, stub replacement and cross-app joins. Each pattern is paired with the verbatim failure it prevents. Routing rows are written as trigger conditions; all three are `ondemand`, so the baseline stays at 75,038 words. Citations of unreviewed inbox notes and uncommitted run captures are replaced by the fact and its field run. `architecture-blueprint.md` and `learned-constants-and-secrets.md` gain one pointer each. `decompose-app.md` names `bin/cut-score.sh` and `bin/cut-ledger.sh`, which arrive in their own split PRs. Field runs on public apps: a field-service template (Mendix 9.24) in eight increments up to a strangled slice; a GenAI showcase app and a banking sample for rehost. — MendixMau - new(pipelines): **`pipelines/mendix-mpr/` — the Rehost extractor for an existing Mendix app (split from #293, 3/6).** `rehost-extract.sh` describes each own module with mxcli, reorders the statements so callees come first, replays them into a fresh target `.mpr` of the same Mendix version (deferring and retrying what `check`/`exec` refuse, never dropping a module), and writes a fidelity ledger with one row per source document and the denominator in its header; `export-module-mpk.py` writes a module package from an MPR v1 app with secrets scrubbed, for Mendix 9 sources whose `mx` cannot export. Code only, no samples; the script now runs without bash-4 features. Added to CLAUDE.md's Pipelines table. Field runs on public apps: a banking sample (Mendix 11.13, 155 documents) rehosted build-green, 154/155 identical; a GenAI showcase app (Mendix 11.12, 2776 documents) landed 36/36 modules but is not build-green (42 × CE1613); module packages from a field-service template (Mendix 9.24) installed into 10.24 and 11.13. macOS and the two-tree layout not verified. — MendixMau - new(pipelines): **`pipelines/mendix-mpr/` — the Rehost extractor for an existing Mendix app (split from #293, 3/6).** `rehost-extract.sh` describes each own module with mxcli, reorders the statements so callees come first, replays them into a fresh target `.mpr` of the same Mendix version (deferring and retrying what `check`/`exec` refuse, never dropping a module), and writes a fidelity ledger with one row per source document and the denominator in its header; `export-module-mpk.py` writes a module package from an MPR v1 app for Mendix 9 sources whose `mx` cannot export; by default it empties demo users, user roles, admin password, per-configuration constant values, database credentials, certificates and navigation profiles in the project documents, while the module's own units (constant default values included) are copied byte for byte; any unknown `--` option is refused (exit 2). Code only, no samples; the script now runs without bash-4 features. After review: module constants' default values still travel in the package by default — the path the field runs installed — and a new `--scrub-constant-defaults` empties them and prints how many (unverified in Studio Pro: no package built with it has been installed and checked yet); the README states exactly what is and is not scrubbed; both scripts refuse source == output/target (exit 2) before writing; the own-module parse moved to `lib/own-modules.awk` and no longer assumes a fixed number of lead lines, with a fixture over verbatim `list modules` captures (`test-rehost-list-modules.sh`, 5 checks; the old script fails 2). Added to CLAUDE.md's Pipelines table. Field runs on public apps: a banking sample (Mendix 11.13, 155 documents) rehosted build-green, 154/155 identical; a GenAI showcase app (Mendix 11.12, 2776 documents) landed 36/36 modules but is not build-green (42 × CE1613); module packages from a field-service template (Mendix 9.24), exported on the default path (constant defaults copied), installed into 10.24 and 11.13. macOS and the two-tree layout not verified. — MendixMau diff --git a/bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md b/bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md new file mode 100644 index 00000000..925f0c52 --- /dev/null +++ b/bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md @@ -0,0 +1,931 @@ +Repo: mendixlabs/mxcli +Source: #293 lab notes (Decompose/Rehost lab runs, 2026-10-12/13); minimal repros in `pipelines/mendix-mpr/samples/fsm-template-9.24.2/native-bughunt/` +Status: **DRAFT — NOT FILED.** No issue has been opened and nothing has been posted anywhere. One multi-defect report for triage: before filing, split it into one issue per U-id (`skills/upstream-feedback.md` §4–§5), search upstream for duplicates, and retest on the current mxcli release (the 2026-10-13 nightly already fixed some, e.g. U5). + +--- everything above this line is stripped before filing --- + +# mxcli upstream bug report — draft, 2026-10-12 + +- **mxcli version:** 0.26.0 (2026-10-11), Linux cloud container, no Studio Pro +- **Apps used:** a public Marketplace template (FSM) 9.24.2 (and 10.24 / 11.13.0 conversions of it); mendix/genai-showcase-app 11.12.0; a public mxcli banking sample app 11.13.0 +- **Date:** 2026-10-12 +- **Source:** field notes of one day of round-trip runs; every verbatim message was copied from a capture. Paths are written `/`; repro files cited by repo-relative path. +- **Severity:** *blocks round-trip* = describe output rejected by check/exec, or data loss; *silent drift* = passes but wrong; *usability*. +- **Occurrences** are counts as the source notes state them (error lines, documents, modules or reports); "not counted" means the notes give none. +- **Ledger:** `BUG-n` is given only where `bin/bug-lookup.sh` found a related entry; none is an exact duplicate. + +## Summary + +| id | title | group | severity | occurrences | +|---|---|---|---|---| +| U1 | describe prints a nanoflow data source/action without its argument mapping | Describe output rejected by mxcli itself | blocks round-trip | 70 | +| U2 | describe emits `content { }` for native pluggable-widget child slots that are named `template` | Describe output rejected by mxcli itself | blocks round-trip | 35 | +| U3 | describe entity emits `index ( desc);` with no column | Describe output rejected by mxcli itself | blocks round-trip | 25 | +| U4 | legacy widgets (Forms$DataGrid) have no headless route to the React client; describe prints no data source or columns | Widgets and native | blocks round-trip | 22 x CE0582 | +| U5 | rules cannot be described or created | Describe omits or truncates | blocks round-trip | 14 rules, 8 flows deferred | +| U6 | describe loses or never emits the data view a widget sat in | Describe output rejected by mxcli itself | blocks round-trip | 12 | +| U7 | Java/JS action type parameters are not expressible: describe emits a form check refuses or exec writes entity `.Entity` | Describe output rejected by mxcli itself | blocks round-trip | about 9 | +| U8 | message definitions cannot be expressed; export mappings built on them fail | Describe omits or truncates | blocks round-trip | 4 x CE1613 | +| U9 | describe emits catalog order; exec and check refuse forward and cross-module references, so mutual recursion cannot be created | Check/exec semantics | blocks round-trip | 4 reports | +| U10 | ContentParams parameters are described as `$obj/Attr` paths, which check refuses | Describe output rejected by mxcli itself | blocks round-trip | 3 | +| U11 | three more describe outputs check cannot parse: import-mapping `root (Wrapper)`, dynamic-text `decimalPrecision: -1`, `DecimalPrecision` -1 | Describe output rejected by mxcli itself | blocks round-trip | 3 | +| U12 | exec is not atomic after the pre-check passes | Check/exec semantics | blocks round-trip | 3 | +| U13 | a grant naming an association member is refused when it precedes the association | Check/exec semantics | blocks round-trip | 3 | +| U14 | microflows and nanoflows cannot be created or altered in a 9.x project | Mendix 9.x project support | blocks round-trip | 3 reports | +| U15 | Layout placeholders inside a pluggable widget's child slot are not seen: `declares no placeholders at all` | Describe output rejected by mxcli itself | blocks round-trip | 2 | +| U16 | describe of Java action puts the parameter separator after the `--` comment | Describe output rejected by mxcli itself | blocks round-trip | 1 run | +| U17 | describe of a microflow emits a variable use check calls undeclared | Describe output rejected by mxcli itself | blocks round-trip | 1 | +| U18 | describe of a merge/decision cannot be re-created (#923): WARNING lines, layout drift | Describe output rejected by mxcli itself | blocks round-trip | 1 | +| U19 | describe emits a selection data source naming a widget it did not emit | Describe output rejected by mxcli itself | blocks round-trip | 1 | +| U20 | create refuses an enum split with more than 16 branches that describe produced | Describe output rejected by mxcli itself | blocks round-trip | 1 | +| U21 | lint MDL-REST04 flags a valid authentication microflow | Describe output rejected by mxcli itself | blocks round-trip | 1 | +| U22 | exec writes an import-mapping microflow with a null entity and the `.mpr` can no longer be loaded | Check/exec semantics | blocks round-trip | 1 | +| U23 | a microflow created before a Java action of the same name fails with a misleading error | Check/exec semantics | blocks round-trip | 1 | +| U24 | exec's reference pre-check does not see an image collection created earlier in the same script | Check/exec semantics | blocks round-trip | 1 | +| U25 | `marketplace install --file` of a 10.x package into 11.x does not warn that its pages will fail | Marketplace and project setup | silent drift | 22 x CE0582 | +| U26 | combo box in association mode bound to a param-bound snippet widget passes check and exec, then fails CE7007 | Widgets and native | silent drift | 9 x CE7007 | +| U27 | `describe module ... with all` omits whole document types | Describe omits or truncates | silent drift | 4 reports | +| U28 | check accepts `change $E (...)` / `$E = empty` where `$E` comes from `retrieve ... limit 1` (a list under mdl 1); mx check then fails, and a splice does not clear it | Check/exec semantics | silent drift | 4 x CE1613 | +| U29 | published OData `expose ("Description")` stores the quotes in the attribute name | OData/REST authoring | silent drift | 4 x CE1613 | +| U30 | mxcli-written Data grid 2 fails CE0463 on a 10.x target until `fix widgets` | Widgets and native | silent drift | 3 reports | +| U31 | `describe module ... with all` truncates at 10 000 lines without a warning | Describe omits or truncates | silent drift | 2 | +| U32 | published OData with no KEY, or a KEY on an attribute without a unique rule, passes check | OData/REST authoring | silent drift | 2 | +| U33 | `fix design-properties` may reorder or mis-map design properties (`'Make card': on` where the source began with `'Spacing bottom'`) | Widgets and native | silent drift | 2 documents | +| U34 | describe userrole drops `CheckSecurity: false` | Describe omits or truncates | silent drift | 1 | +| U35 | describe of a doc comment loses a markdown `* ` bullet | Describe omits or truncates | silent drift | 1 | +| U36 | describe javascript action keeps EXTRA CODE only as a comment; re-running `create or modify` overwrites a hand-restored `.js` | Describe omits or truncates | silent drift | 1 | +| U37 | sort on an inherited attribute is written against the specialization | Check/exec semantics | silent drift | 1 | +| U38 | set-mode `check` prints "Check passed!" after an earlier failure in the same invocation | Check/exec semantics | silent drift | 1 | +| U39 | `create external entities from M.Client into M` names entities after the entity set, not the entity type | OData/REST authoring | silent drift | 1 | +| U40 | `mxcli new --version 10.24.0` ships a layout that cannot build and still exits 0 | Marketplace and project setup | silent drift | 1 | +| U41 | check is not version-aware: it passes scripts that exec then refuses for a version reason | Mendix 9.x project support | usability | 2 | +| U42 | `mxcli describe module ` subcommand emits only the module and its roles | Describe omits or truncates | usability | 1 | +| U43 | `RETURNS Boolean AS $Closed` does not declare `$Closed`; both obvious forms are refused with confusing messages | Check/exec semantics | usability | 1 | +| U44 | `mxcli run --local` cannot run a Mendix 9 app | Mendix 9.x project support | usability | 1 | +| U45 | `alter settings runtime ( JavaVersion: '17' )` on a 9.x model prints `Unchanged model settings` | Mendix 9.x project support | usability | 1 | +| U46 | mxcli cannot create a native navigation profile | Widgets and native | usability | 1 | +| U47 | combo box bound to an association through the attribute key passes check, exec refuses | Widgets and native | usability | 1 | +| U48 | `marketplace update` leaves CE0463 widget errors, neither runs nor mentions `mx update-widgets`, and warns on a corrupt zip | Marketplace and project setup | usability | 1 | +| U49 | `marketplace update --to` refuses without `--force`, citing local edits nobody made | Marketplace and project setup | usability | 1 | +| U50 | no headless update for a marketplace module already in the project | Marketplace and project setup | usability | 1 | +| U51 | `marketplace download --output ` fails; only a file path works | Marketplace and project setup | usability | 1 | +| U52 | commands without `-p` silently pick a stray `.mpr` in the working directory | CLI usability | usability | 1 | +| U53 | System Java actions are unknown to mxcli | CLI usability | usability | 1 | + +Totals: 53 distinct defects — 24 blocks round-trip, 16 silent drift, 13 usability. + +## Describe output rejected by mxcli itself + +### U1 — describe prints a nanoflow data source/action without its argument mapping + +- **Command / document type:** `describe page` / `describe snippet` (native Repeater, nanoflow action) +- **Severity:** blocks round-trip +- **Verbatim error:** `widget 'repeater4': nanoflow data source NativeMobileForm.DS_GetInstanceNativePictureImage has no argument for parameter 'NativeInstanceItem' — Mendix rejects this with CE1571.` (also `nanoflow action ... (Action:) has no argument for parameter(s) ...`) +- **Seen:** FSM template: NativeMobile, NativeMobileForm, NativeMobilePart, NativeMobileRelated, NativeMobileAsset, NativeMobileTimeRegistration, NativeNote. — occurrences: 70 (bughunt; 7 native modules) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe emits the parameter mapping the source page holds. Actual: call printed with no arguments. Either the mapping is lost on describe (silent drift if check were lenient) or the page stored none (unverified which). + +**Repro** + +```mdl +-- not isolated (needs a nanoflow, blocked by the 9.x entry U14); the source excerpt is third-party model content and is not shipped +-- describe prints: repeater repeater4 (DataSource: nanoflow NativeMobileForm.DS_GetInstanceNativePictureImage) +-- check then refuses its own output (CE1571, parameter NativeInstanceItem) +``` + +### U2 — describe emits `content { }` for native pluggable-widget child slots that are named `template` + +- **Command / document type:** `describe page`, `describe layout`, `describe snippet` (native Repeater, SafeAreaView) +- **Severity:** blocks round-trip +- **Verbatim error:** `` `content` is not a container of `repeater` — it declares: template [MDL-WIDGET26] `` and `` `content` is not a container of `safeareaview` ``; exec: `content needs a name` +- **Seen:** FSM template: NativeNote, NativeMobile (page Login), NativeMobileForm, NativeMobileRelated, NativeMobileAsset, NativeMobilePart, NativeMobileTimeRegistration. — occurrences: 35 (32 Repeater + 2 SafeAreaView in bughunt; 1 report in increment 3) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe names the slot as the widget declares it (`template`). Actual: `content`; after `widget init` the slot is `template content { }` and exec then refuses the layout with `declares no placeholder at all` (see the placeholder entry). + +**Repro** + +```mdl +-- pipelines/mendix-mpr/samples/fsm-template-9.24.2/native-bughunt/D2-page-repeater-content.mdl (needs com.mendix.widget.native.Repeater.mpk in widgets/ and `mxcli widget init`) +create module Repro; +create or modify persistent entity Repro.E ( Name: String(200) ); +create or modify page Repro.P1 (Title: 'P1', Layout: Atlas_Core.Atlas_Default) { + placeholder Main { + repeater repeater1 (DataSource: database from Repro.E) { + content { + container container2 ( ) { + } + } + } + } +} +``` + +### U3 — describe entity emits `index ( desc);` with no column + +- **Command / document type:** `describe entity` (also `describe module ... with all`) +- **Severity:** blocks round-trip +- **Verbatim error:** `statement N: index on unknown attribute 'desc'` (describe printed `index ( desc);`) +- **Seen:** FSM template: NativeTechnician, NativeReason, NativeMobileWarehouse, NativeMobile, NativeMobilePart, NativeMobileForm, NativeMobileTimeRegistration, NativeNote, NativeMobileAsset, NativeMobileRelated (every entity module except NativeModelCheck/NativeRestAPI). — occurrences: 25 (23 in bughunt, 1 each in increments 3 and 5) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe emits the indexed column(s), or omits the index. Actual: an index with an empty column list; check rejects it, and every flow, page and grant naming the entity cascades (NativeReason: 3 of 45 statements clean in check, 37 rejected). + +**Repro** + +```mdl +-- pipelines/mendix-mpr/samples/fsm-template-9.24.2/native-bughunt/D1-index-empty-column.mdl (isolated, fresh 9.24.2 app) +create module Repro; +create or modify persistent entity Repro.E ( + Name: String(200), + ChangedDate: AutoChangedDate +) +index ( desc); +``` + +### U6 — describe loses or never emits the data view a widget sat in + +- **Command / document type:** `describe page` +- **Severity:** blocks round-trip +- **Verbatim error:** `widget 'textBox1': Attribute 'Search' is bound but there is no enclosing data container providing entity context` (also datePicker1..4 `Start`/`End`); increment 2: `argument Task: $Task cannot be stored — widget actionButton17 is not inside a data view` [MDL-PAGEARG01] +- **Seen:** FSM template: NativeMobileTimeRegistration, NativeMobileAsset, NativeMobileRelated; genai-showcase-app (a ConversationalUI page). — occurrences: 12 (11 in bughunt, 1 in increment 2) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: the enclosing data container is emitted. Actual: widget emitted bare; check rejects. + +**Repro** (not reduced) + +Not reduced (describe any page whose input widgets sit in a data view the source holds; which side drops it is unverified). + +### U7 — Java/JS action type parameters are not expressible: describe emits a form check refuses or exec writes entity `.Entity` + +- **Command / document type:** `describe javascript action`, `describe java action`, then `check`/`exec` +- **Severity:** blocks round-trip +- **Verbatim error:** JS: `line 13427:67 mismatched input '<' expecting {FOLDER, '('}` (describe prints `Name(Entity: "Entity" not null, ...)`). Java: describe prints `MxObject: "Entity"` with no declaration; mxbuild: `Property 'Entity' of Java action parameter 'MxObject': The selected entity '.Entity' no longer exists.` Caller side: `Entity: entity ` is an entity-type parameter and mx check gives CE0115. +- **Seen:** mendix/genai-showcase-app (GenAICommons, 7 build errors); FSM template (NativeMobile, NativeNote). — occurrences: about 9 (D10 x1, increment 3 x1 JS, 7 build errors for Java in increment 2) +- **Toolkit workaround:** none +- **Existing ledger entry:** BUG-87 (describe drops the type-parameter name, related), BUG-61 (CALL JAVA ACTION with typed parameters, related) +- **Expected vs actual:** Expected: an object-of-type-parameter parameter has an MDL form that round-trips. Actual: none exists; `Entity: Entity` resolves to entity `.Entity`. + +**Repro** + +```sh +mxcli -p .mpr -c "describe java action GenAICommons.ChunkCollection_AddKnowledgeBaseChunk" # then exec the output, then mx check +# JS: describe a native JS action with a type parameter and `check` the output (not reduced) +``` + +### U10 — ContentParams parameters are described as `$obj/Attr` paths, which check refuses + +- **Command / document type:** `describe snippet`/`describe page` (dynamic text) +- **Severity:** blocks round-trip +- **Verbatim error:** `dynamictext "text42": ContentParams parameter {1} is written as "$currentObject/NotResolvedReason" — a template parameter is evaluated against the widget's own context object`; increment 2: `ContentParams parameter {1} is written as "$ChatContext/Topic"` [MDL-WIDGET24] +- **Seen:** FSM template: NativeMobileRelated; genai-showcase-app. — occurrences: 3 (bughunt 2, increment 2 1) +- **Toolkit workaround:** none +- **Existing ledger entry:** BUG-23 (the `$currentObject/` prefix resolving as a literal, related) +- **Expected vs actual:** Expected: describe emits a form check accepts. Actual: describe and check disagree. + +**Repro** (not reduced) + +Not reduced. + +### U11 — three more describe outputs check cannot parse: import-mapping `root (Wrapper)`, dynamic-text `decimalPrecision: -1`, `DecimalPrecision` -1 + +- **Command / document type:** `describe import mapping`, `describe snippet` +- **Severity:** blocks round-trip +- **Verbatim error:** `line 342:59 extraneous input '('`; `ContentParams: ({1} = ToolName format (decimalPrecision: -1))` -> `no viable alternative`; `DecimalPrecision must be a non-negative integer, got &{-1}` [MDL-WIDGET18] +- **Seen:** genai-showcase-app. — occurrences: 3 (increment 2, seen not isolated) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe output parses. Actual: rejected. + +**Repro** (not reduced) + +Not reduced; seen, not isolated. + +### U15 — Layout placeholders inside a pluggable widget's child slot are not seen: `declares no placeholders at all` + +- **Command / document type:** `describe layout`, then `exec`/`check` +- **Severity:** blocks round-trip +- **Verbatim error:** `layout 'ConversationalUI.Layout_MasterBase' declares no placeholders at all` [MDL081]; increment 3 after `widget init`: `declares no placeholder at all` +- **Seen:** genai-showcase-app (ConversationalUI); FSM template (NativeMobile layout with SafeAreaView). — occurrences: 2 (increment 2 and increment 3) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: placeholders nested in widget slots count. Actual: the layout is refused. + +**Repro** (not reduced) + +Not reduced (any layout whose placeholder sits inside a pluggable widget slot). + +### U16 — describe of Java action puts the parameter separator after the `--` comment + +- **Command / document type:** `describe java action` +- **Severity:** blocks round-trip +- **Verbatim error:** `Name: String not null -- This sets the Name of the tool...,` then check: `line 255:4 mismatched input 'Name' expecting ')'` +- **Seen:** genai-showcase-app (GenAICommons). — occurrences: 1 run (not counted) +- **Toolkit workaround:** `lib/fix-describe-output.py` +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: the comma precedes the comment. Actual: the comma lands inside the comment, so the next parameter is a syntax error. + +**Repro** + +```sh +mxcli -p .mpr -c "describe java action GenAICommons." > a.mdl && mxcli check a.mdl -p .mpr +``` + +### U17 — describe of a microflow emits a variable use check calls undeclared + +- **Command / document type:** `describe microflow`, then `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** `microflow 'GenAICommons.Span_CalculateSumDurationUntilExecution' has validation errors: - variable 'SumDuration' is not declared` +- **Seen:** genai-showcase-app (GenAICommons). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: output re-executes. Actual: refused. + +**Repro** (not reduced) + +Not reduced: `describe microflow GenAICommons.Span_CalculateSumDurationUntilExecution`, exec the output. + +### U18 — describe of a merge/decision cannot be re-created (#923): WARNING lines, layout drift + +- **Command / document type:** `describe microflow` +- **Severity:** blocks round-trip +- **Verbatim error:** `merge shared1: nothing joins it.` [MDL-FLOW02]; target describe drifts: `'@curve(from: (15, 0), to: (-30, 0))' -> "@caption 'empty'"` +- **Seen:** genai-showcase-app. — occurrences: 1 +- **Toolkit workaround:** `lib/compare-mdl.py` rates #923 warnings `not-expressible` +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: merges and decisions round-trip. Actual: warning plus layout drift. + +**Repro** (not reduced) + +Not reduced: describe any flow with a shared merge. + +### U19 — describe emits a selection data source naming a widget it did not emit + +- **Command / document type:** `describe page` +- **Severity:** blocks round-trip +- **Verbatim error:** `widget 'dataView1': selection DataSource references 'grid1' but no widget with that name exists on this page` +- **Seen:** FSM template: NativeModelCheck. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: the referenced widget is emitted. Actual: dangling reference. + +**Repro** (not reduced) + +Not reduced. + +### U20 — create refuses an enum split with more than 16 branches that describe produced + +- **Command / document type:** `describe microflow` then `check` +- **Severity:** blocks round-trip +- **Verbatim error:** `enum split has 28 branches; at most 16 branches are supported` (`NativeModelCheck_Process`) +- **Seen:** FSM template: NativeModelCheck. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe and create agree on the limit (or the limit is lifted). Actual: a Studio Pro-valid flow cannot be re-created. + +**Repro** (not reduced) + +Not reduced: a microflow with a 28-case enumeration split. + +### U21 — lint MDL-REST04 flags a valid authentication microflow + +- **Command / document type:** `check` (lint) +- **Severity:** blocks round-trip +- **Verbatim error:** `MDL-REST04: authentication microflow ... has parameter $Token, which Mendix does not supply to an authentication microflow ... (CE0336)` +- **Seen:** FSM template: NativeRestAPI. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: valid source passes. Actual: lint error on describe output of a Studio Pro-valid microflow. + +**Repro** (not reduced) + +Not reduced. + +## Describe omits or truncates + +### U5 — rules cannot be described or created + +- **Command / document type:** `describe rule`, `exec` of a decision that calls a rule +- **Severity:** blocks round-trip +- **Verbatim error:** `Unknown type: rule`; exec: `if condition calls 'PgVectorKnowledgeBase.Rule_DatabaseConfiguration_IsConfigured(...)', which is not a rule in this project` +- **Seen:** genai-showcase-app (PgVectorKnowledgeBase and others). — occurrences: 14 rules, 8 flows deferred (increment 2) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: rules are describable and creatable. Actual: refused; flows calling them cannot be created. + +**Repro** + +```sh +mxcli -p .mpr -c "show rules" # lists 14 +mxcli -p .mpr -c "describe rule PgVectorKnowledgeBase.Rule_DatabaseConfiguration_IsConfigured" +``` + +### U8 — message definitions cannot be expressed; export mappings built on them fail + +- **Command / document type:** `exec` of an export mapping +- **Severity:** blocks round-trip +- **Verbatim error:** `Error: export mapping GenAICommons.EM_Reference: message definition "GenAICommons.MD_Reference.Reference" not found — this project has no message definitions` (mxbuild: CE1613 `The selected export mapping '...' no longer exists`) +- **Seen:** genai-showcase-app (GenAICommons). — occurrences: 4 x CE1613 (increment 2) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: message definitions describable and creatable. Actual: no way to create one. + +**Repro** (not reduced) + +Not reduced: exec any export mapping built on a message definition. + +### U27 — `describe module ... with all` omits whole document types + +- **Command / document type:** `describe module with all` +- **Severity:** silent drift +- **Verbatim error:** No error. Output silently lacks nanoflows, snippets, JS actions, JSON structures, import/export mappings, task queues, image collections and some pages. +- **Seen:** genai-showcase-app (AgentCommons, 10 of 22 pages), FSM template (NativeNote 35 nanoflows, all 12 Native modules), banking sample (MyFirstModule.Images). — occurrences: 4 reports (increments 1, 2, 3 and bughunt; 10 of 22 pages missing in AgentCommons, 35 nanoflows in NativeNote) +- **Toolkit workaround:** `rehost-extract.sh` project-tree fill-in (recovered all 1142 FSM documents) +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: every describable document in the module. Actual: a subset; nothing says so. + +**Repro** + +```sh +mxcli -p .mpr -c "describe module AgentCommons with all" # compare against: mxcli project-tree --json, module AgentCommons +``` + +### U31 — `describe module ... with all` truncates at 10 000 lines without a warning + +- **Command / document type:** `mxcli -c "describe module M with all"` +- **Severity:** silent drift +- **Verbatim error:** None: output stops in the middle of a statement. +- **Seen:** genai-showcase-app (AgentCommons); FSM template (NativeMobile ends mid-statement). — occurrences: 2 (increment 2, bughunt) +- **Toolkit workaround:** `rehost-extract.sh` `describe_module()` drops the incomplete last statement and describes the rest one by one +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: whole module or an explicit truncation message. Actual: silent cut. + +**Repro** + +```sh +mxcli -p .mpr -c "describe module AgentCommons with all" | wc -l # 10000, last statement incomplete +``` + +### U34 — describe userrole drops `CheckSecurity: false` + +- **Command / document type:** `describe user role` +- **Severity:** silent drift +- **Verbatim error:** None: replaying the output re-creates the role with the default. +- **Seen:** banking sample (Banking). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** BUG-144 (create user role writes no CheckSecurity, related) +- **Expected vs actual:** Expected: the property is emitted. Actual: silent security change on replay. + +**Repro** (not reduced) + +Not reduced: describe a role with CheckSecurity false, replay. + +### U35 — describe of a doc comment loses a markdown `* ` bullet + +- **Command / document type:** `describe` (documentation text) +- **Severity:** silent drift +- **Verbatim error:** None (the one drift row of 155 on the banking round trip). +- **Seen:** banking sample. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: text preserved. Actual: bullet lost. + +**Repro** (not reduced) + +Not reduced. + +### U36 — describe javascript action keeps EXTRA CODE only as a comment; re-running `create or modify` overwrites a hand-restored `.js` + +- **Command / document type:** `describe javascript action`, `create or modify javascript action` +- **Severity:** silent drift +- **Verbatim error:** None: the generated file lacks the source's EXTRA CODE import (describe prints `-- EXTRA CODE:` as a comment). +- **Seen:** FSM template (NativeNote). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: EXTRA CODE round-trips and is not overwritten. Actual: lost on re-create. + +**Repro** (not reduced) + +Not reduced. + +### U42 — `mxcli describe module ` subcommand emits only the module and its roles + +- **Command / document type:** `mxcli describe module` +- **Severity:** usability +- **Verbatim error:** None. Help says "Describe a module (all contents)"; output is `mdl 1; create or modify module Banking; create or modify module role ...`, same for `--mdl 0` and `--format json`. +- **Seen:** banking sample (Banking). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: all contents or help text that says otherwise. Actual: module and roles only. + +**Repro** + +```sh +mxcli describe module Banking -p .mpr # module + roles only +mxcli -p .mpr -c "describe module Banking with all" # the real emitter, documented only in `mxcli changelog` +``` + +## Check/exec semantics (atomicity, forward refs, check passes but exec refuses) + +### U9 — describe emits catalog order; exec and check refuse forward and cross-module references, so mutual recursion cannot be created + +- **Command / document type:** `describe module ... with all`, `check`, `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** `MDL-ORDER01 ... references microflow Banking.SUB_SeedBillers before it is created (statement 145)` x14; `Refusing to execute: 14 unresolved reference(s). Nothing was written.`; `references microflow X before it is created (statement 240), and the project does not have it`; `child entity module not found: NativeMobilePart`; `microflow not found: NativeReason.` +- **Seen:** banking sample (Banking); genai-showcase-app (GenAICommons); FSM template (NativeMobileWarehouse, NativeModelCheck, NativeNote, NativeMobileTimeRegistration, NativeMobileForm, NativeMobilePart). — occurrences: 4 reports (increment 1: 14 x ORDER01; increment 2: statement 240; bughunt: 6 modules; increment 3) +- **Toolkit workaround:** `pipelines/mendix-mpr/lib/topo-order-mdl.py` (cannot order an entity whose after-commit microflow takes the entity) +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: emit in dependency order (mxcli knows `callers`/`callees`), and allow a create-stub-then-modify pass for cycles. Actual: output refused by its own check. + +**Repro** (not reduced) + +Not reduced: describe any module with a flow that calls a later flow; mutual recursion GenAICommons.Response_CallRecursively <-> ChatCompletions_WithHistory. + +### U12 — exec is not atomic after the pre-check passes + +- **Command / document type:** `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** Increment 3: a widget-build error left 18 earlier statements written. Increment 4: the drop + create that `MDL-V1-REBUILD` recommends ran the `drop`, then failed on the `create`; mx check: 2 x CE1613. Bughunt: exec reached only the module level. +- **Seen:** FSM template (NativeNote, seam probe). — occurrences: 3 (increments 3 and 4, bughunt; 18 statements left written) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: all-or-nothing (`Refusing to execute ... Nothing was written.` is the right behaviour for the pre-check and should extend to write-time errors). Actual: partial writes; the dropped flow is gone. + +**Repro** + +```sh +# not reduced: any script where statement N fails at write time +create or modify microflow M.A () begin return; end; -- on a 9.x model this succeeds as a check, fails at exec +drop microflow M.A; +create or modify microflow M.A () begin return; end; +``` + +### U13 — a grant naming an association member is refused when it precedes the association + +- **Command / document type:** `describe module`, `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** `Error: entity EchoConnector.Credentials has no member(s) Credentials_Configuration; grant only names members of the entity`; `entity NativeNote.NativeImage has no member(s) NativeImage_NativeNote` +- **Seen:** genai-showcase-app (EchoConnector); FSM template (NativeNote). — occurrences: 3 (increment 2, increment 3 note, bughunt) +- **Toolkit workaround:** topo-order-mdl.py makes grants their own units after the associations +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: describe emits grants after associations, or exec resolves later members. Actual: refused. + +**Repro** (not reduced) + +Not reduced: describe order of the EchoConnector module. + +### U22 — exec writes an import-mapping microflow with a null entity and the `.mpr` can no longer be loaded + +- **Command / document type:** `exec` (microflow with `import from mapping`) +- **Severity:** blocks round-trip +- **Verbatim error:** mx check: `System.ArgumentNullException: Value cannot be null. (Parameter 'value') at Mendix.Modeler.DataTypes.EntityType.set_EntityId` — "An error occurred when trying to set the 'Entity' property of a Object type in a Microflow with ID ...". A plain re-`create or modify` is refused with `MDL-V1-REBUILD`. +- **Seen:** genai-showcase-app (Embeddings_SemanticSearch). — occurrences: 1 +- **Toolkit workaround:** `drop microflow X;` plus the same `create or modify microflow X` in one script once the mapping exists +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: refuse the unresolved mapping. Actual: the project is written unloadable (data loss). + +**Repro** (not reduced) + +Not reduced: exec Embeddings_SemanticSearch.Book_CreateDatasetIfNeeded before IM_SemanticSearch_Books exists (cause is a hypothesis). + +### U23 — a microflow created before a Java action of the same name fails with a misleading error + +- **Command / document type:** `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** `warning: could not look up Java action ... java action not found` then `Error: failed to create microflow: refusing to write unit ...: attribute reference not qualified` +- **Seen:** genai-showcase-app (GenAICommons). — occurrences: 1 +- **Toolkit workaround:** topo-order-mdl.py orders the Java/JS action first +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a clear order error. Actual: an unrelated-looking attribute error. + +**Repro** (not reduced) + +Not reduced: exec GenAICommons.ConsumedKnowledgeBase_GetCollectionOptions (the flow) before the Java action of the same name. + +### U24 — exec's reference pre-check does not see an image collection created earlier in the same script + +- **Command / document type:** `exec` +- **Severity:** blocks round-trip +- **Verbatim error:** `unknown image collection "FSM_Specific.Material_Design_Icons"` (whole script refused) +- **Seen:** FSM template (NativeNote). — occurrences: 1 (plus 1 unconfirmed) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: earlier statements count. Actual: refused. A same-text `image collection not found` was seen against an empty scratch app (missing dependency, not re-tested). + +**Repro** (not reduced) + +Not reduced: `create image collection M.Icons ...` followed by a page that uses it, one script. + +### U28 — check accepts `change $E (...)` / `$E = empty` where `$E` comes from `retrieve ... limit 1` (a list under mdl 1); mx check then fails, and a splice does not clear it + +- **Command / document type:** `check`, `create or modify` +- **Severity:** silent drift +- **Verbatim error:** mx check: `CE1613 "The selected attribute 'List of M.Ent.Attr' no longer exists."` After changing `limit 1` to `first`, `create or modify` reports `spliced: 1 replaced` and describe shows `first`, but mx check keeps the 4 CE1613; only drop + create clears them. +- **Seen:** FSM template (seam probe, 10.24 copy). — occurrences: 4 x CE1613 (increment 4) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: check flags a list used as an object, and a spliced flow is rebuilt. Actual: both pass; the model keeps the stale reference. + +**Repro** + +```mdl +retrieve $E from M.Ent limit 1; +change $E ( Attr = 'x' ); +``` + +### U37 — sort on an inherited attribute is written against the specialization + +- **Command / document type:** `exec` (sort list operation) +- **Severity:** silent drift +- **Verbatim error:** mx check: `CE1613 "The selected attribute 'Embeddings_SemanticSearch.BookChunk.Similarity' no longer exists." at List operation activity 'Sort'` +- **Seen:** genai-showcase-app (Embeddings_SemanticSearch.DS_Query_GetBookChunks). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: attribute qualified against the entity that owns it. Actual: wrong qualification; source and target describe are identical, so a describe-only comparison calls it identical. + +**Repro** + +```mdl +-- BookChunk extends GenAICommons.KnowledgeBaseChunk (Similarity is on the generalization) +$L = sort $BookChunkList by Similarity desc; +``` + +### U38 — set-mode `check` prints "Check passed!" after an earlier failure in the same invocation + +- **Command / document type:** `mxcli check` (set mode) +- **Severity:** silent drift +- **Verbatim error:** `Check passed!` printed after an earlier failure line. +- **Seen:** banking sample. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a final verdict that reflects the failure. Actual: contradictory final line. + +**Repro** (not reduced) + +Not reduced. + +### U43 — `RETURNS Boolean AS $Closed` does not declare `$Closed`; both obvious forms are refused with confusing messages + +- **Command / document type:** `check` +- **Severity:** usability +- **Verbatim error:** `$Closed = true;` -> "a reassignment says 'set' under mdl 1"; `SET $Closed = true;` -> "variable 'Closed' is not declared" +- **Seen:** banking sample. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: the return variable is declared, or the message says `DECLARE $Closed Boolean = false;` is needed first. Actual: the two messages contradict. + +**Repro** + +```mdl +create or modify microflow M.F () returns Boolean as $Closed +begin + $Closed = true; + return $Closed; +end; +``` + +## Mendix 9.x project support + +### U14 — microflows and nanoflows cannot be created or altered in a 9.x project + +- **Command / document type:** `create microflow`, `create nanoflow`, `alter microflow` +- **Severity:** blocks round-trip +- **Verbatim error:** `Error: failed to create microflow: unit 91c57c83-...: this Mendix 9.24.2 project cannot store Microflows$Microflow.StableId (Mendix 10.2.0+); Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+): the properties did not exist yet in this version, and Studio Pro cannot open a document that holds one.` Nanoflow: `CreateNanoflow: insert: ... cannot store Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+)`. `alter microflow` adding an activity: `cannot store Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+)`. +- **Seen:** FSM template 9.24.2 (every module with a flow; NativeRestAPI 4 of 4). — occurrences: 3 reports (increment 4 x2 including alter, bughunt: 100% of flows tried) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: the writer omits properties the version lacks (the refusal itself is correct and safe). Actual: no microflow or nanoflow can be written to 9.x, so no seam or round-trip work on the monolith can follow. + +**Repro** + +```mdl +-- pipelines/mendix-mpr/samples/fsm-template-9.24.2/native-bughunt/D3-nanoflow-9242-sequenceflow-casevalues.mdl (fresh `mxcli new Scratch --version 9.24.2 --theme none --skip-init`) +create module Repro; +create or modify microflow Repro.MF_Min () +begin + return; +end; +create or modify nanoflow Repro.NF_Min () +begin + return; +end; +``` + +### U41 — check is not version-aware: it passes scripts that exec then refuses for a version reason + +- **Command / document type:** `check` vs `exec` on a 9.x project +- **Severity:** usability +- **Verbatim error:** check: `Check passed!`; exec: the StableId/CaseValues refusal above. +- **Seen:** FSM template (seam probe). — occurrences: 2 (increment 4) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: check reports the version limit. Actual: late failure. + +**Repro** (not reduced) + +Same as the entry above: `mxcli -p <9.24.mpr> -c "create microflow M.X () begin return; end;"` + +### U44 — `mxcli run --local` cannot run a Mendix 9 app + +- **Command / document type:** `mxcli run --local` +- **Severity:** usability +- **Verbatim error:** mxbuild 9.24's Gradle 7.6: `Unsupported class file major version 65` (mxcli resolves JDK 21 even with JAVA_HOME set to 17) +- **Seen:** FSM template 9.24.2. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a JDK the model version supports, or a clear message. Actual: a Gradle stack error; a 9.x model has no JavaVersion setting to steer it. + +**Repro** + +```sh +JAVA_HOME= mxcli run --local --db-type hsqldb -p <9.24 app> +``` + +### U45 — `alter settings runtime ( JavaVersion: '17' )` on a 9.x model prints `Unchanged model settings` + +- **Command / document type:** `alter settings` +- **Severity:** usability +- **Verbatim error:** `Unchanged model settings` (no hint the property does not exist in that version) +- **Seen:** FSM template 9.24.2. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: "property not available in Mendix 9.24.2". Actual: looks like a no-op success. + +**Repro** + +```mdl +alter settings runtime ( JavaVersion: '17' ); +``` + +## OData/REST authoring + +### U29 — published OData `expose ("Description")` stores the quotes in the attribute name + +- **Command / document type:** `create published odata service ... expose` +- **Severity:** silent drift +- **Verbatim error:** `CE1613 "The selected attribute 'AssetManagement.Asset."Description"' no longer exists."` (x4) +- **Seen:** AssetsApp slice (AssetManagement). — occurrences: 4 x CE1613 (increment 5; captures 24, 26) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: quotes are syntax, not part of the name. Actual: the stored attribute name includes quotes; check and exec pass. + +**Repro** (not reduced) + +Not reduced: quote a keyword-named attribute in an expose list. + +### U32 — published OData with no KEY, or a KEY on an attribute without a unique rule, passes check + +- **Command / document type:** `create published odata service` +- **Severity:** silent drift +- **Verbatim error:** mx check: `CE6585 "Published entity '...' must have a key defined."`; `CE6624 "Add a unique validation rule ..."` +- **Seen:** AssetsApp slice (AssetManagement). — occurrences: 2 (increment 5) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: check flags both. Actual: late mx check failure. + +**Repro** (not reduced) + +Not reduced: a published entity with no `KEY`; a `KEY` on an attribute with no unique validation rule. + +### U39 — `create external entities from M.Client into M` names entities after the entity set, not the entity type + +- **Command / document type:** `create external entities` +- **Severity:** silent drift +- **Verbatim error:** Later scripts fail with "entity does not exist" (`M.Parts` created, `M.Part` expected as Studio Pro does). +- **Seen:** AssetsApp slice (client of the Assets seam). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: entity type name. Actual: entity set name. + +**Repro** (not reduced) + +Not reduced. + +## Widgets and native + +### U4 — legacy widgets (Forms$DataGrid) have no headless route to the React client; describe prints no data source or columns + +- **Command / document type:** `describe page` +- **Severity:** blocks round-trip +- **Verbatim error:** `-- Forms$DataGrid (grid1) -- NOT re-executable` (no datasource/columns/buttons) +- **Seen:** FSM template 10.24 copy (AssetsApp slice). — occurrences: 22 x CE0582 (increment 5) +- **Toolkit workaround:** `mxcli bson dump` + `slice-assets/tools/legacy-extract.py` + `gen-widgets.py` -> `alter page ... replace ... with { datagrid ... }` +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: enough detail to recreate as Data grid 2. Actual: placeholder comment only. + +**Repro** (not reduced) + +Not reduced: describe any page holding a legacy Data grid. + +### U26 — combo box in association mode bound to a param-bound snippet widget passes check and exec, then fails CE7007 + +- **Command / document type:** `create/alter snippet` (combobox) +- **Severity:** silent drift +- **Verbatim error:** `CE7007 "Selected value is not valid for entity 'Asset_Customer/Customer'. Please select the value again."` (x9) +- **Seen:** AssetsApp slice (Snippet in AssetManagement). — occurrences: 9 x CE7007 (increment 5) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: check demands a data container. Actual: wrapping in `dataview (DataSource: $Param)` clears it. + +**Repro** + +```mdl +-- replace a param-bound legacy reference selector in a snippet: +combobox x (Association: M.A, DataSource: database M.E, CaptionAttribute: Attr) -- no data container +``` + +### U30 — mxcli-written Data grid 2 fails CE0463 on a 10.x target until `fix widgets` + +- **Command / document type:** `create page` / `marketplace update`, then mxbuild +- **Severity:** silent drift +- **Verbatim error:** `CE0463 "The definition of this widget has changed. Update this widget..."` +- **Seen:** banking sample (10.24 target); FSM template 10.24 copies. — occurrences: 3 reports (increment 1: 15 units on 10.24; increment 4: 27 x; increment 5) +- **Toolkit workaround:** `mxcli fix widgets -p .mpr` after any page exec on a 10.x target +- **Existing ledger entry:** BUG-101 (Gallery CE0463, related) +- **Expected vs actual:** Expected: widget written against the definition the project carries (DataWidgets 2.31.0 / 2.5.6 on 10.24). Actual: newer definition. + +**Repro** (not reduced) + +Not reduced: `create page` with a datagrid on a `mxcli new --version 10.24.0` project, then `mx check`. + +### U33 — `fix design-properties` may reorder or mis-map design properties (`'Make card': on` where the source began with `'Spacing bottom'`) + +- **Command / document type:** `mxcli fix design-properties` +- **Severity:** silent drift +- **Verbatim error:** None. +- **Seen:** AssetsApp slice (AssetManagement.Snippet_Asset_Notes, WarehouseManagement.Warehouse_View). — occurrences: 2 documents (unverified) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: source order and values kept. Actual: possibly changed. + +**Repro** (not reduced) + +Not reduced; unverified. + +### U46 — mxcli cannot create a native navigation profile + +- **Command / document type:** `create or replace navigation NativePhone` +- **Severity:** usability +- **Verbatim error:** "a web profile's home is a page or a microflow" +- **Seen:** FSM template (NativeNote slice). — occurrences: 1 +- **Toolkit workaround:** `mx create-project` from the Blank Native starter +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a native profile. Actual: refused; a native slice needs the Blank Native Mobile App starter (Marketplace 109511) via `mx create-project`. + +**Repro** + +```mdl +create or replace navigation NativePhone ( ... ); -- not reduced +``` + +### U47 — combo box bound to an association through the attribute key passes check, exec refuses + +- **Command / document type:** `alter snippet ... replace ... with { combobox }` +- **Severity:** usability +- **Verbatim error:** check: `Check passed!`; exec: `property attributeEnumeration binds Asset_Customer, which is an association ... not an attribute` +- **Seen:** AssetsApp slice. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: check refuses. Actual: only exec does (exec is correct). + +**Repro** + +```mdl +alter snippet M.S { replace with { + combobox x (Attribute: $Asset.Asset_Customer, CaptionAttribute: CustomerManagement.Customer.CustomerName) +} }; +``` + +## Marketplace and project setup + +### U25 — `marketplace install --file` of a 10.x package into 11.x does not warn that its pages will fail + +- **Command / document type:** `marketplace install --file` +- **Severity:** silent drift +- **Verbatim error:** `CE0582` on 22 legacy-widget pages after install +- **Seen:** AssetsApp slice (11.13.0). — occurrences: 22 x CE0582 (increment 5) +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a warning at install. Actual: silent until mxbuild. + +**Repro** (not reduced) + +Not reduced: install a 10.x package holding legacy widgets into an 11.x app. + +### U40 — `mxcli new --version 10.24.0` ships a layout that cannot build and still exits 0 + +- **Command / document type:** `mxcli new --version 10.24.0` +- **Severity:** silent drift +- **Verbatim error:** mxbuild step 6/7 ends `BUILD FAILED`; `new` prints "Project created" and exits 0 (`App_Default` uses Atlas design properties `Flex container`, `Align items Y`, `Disable row wrap`, `Grow / shrink (self)` unknown to the bundled Atlas_Core 3.17.0) +- **Seen:** scratch app on 10.24.0 (decompose fixture). — occurrences: 1 +- **Toolkit workaround:** `ALTER PAGES SET LAYOUT = Atlas_Core.Atlas_Default WHERE LAYOUT = MyFirstModule.App_Default; DROP LAYOUT MyFirstModule.App_Default;` +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: non-zero exit or a matching layout. Actual: success message on a project that cannot build (fine on 11.13.0). + +**Repro** + +```sh +mxcli new Scratch --version 10.24.0 --theme none --skip-init +``` + +### U48 — `marketplace update` leaves CE0463 widget errors, neither runs nor mentions `mx update-widgets`, and warns on a corrupt zip + +- **Command / document type:** `marketplace update` +- **Severity:** usability +- **Verbatim error:** `skipping com.mendix.widget.web.PopupMenu.mpk: package.xml: zip: checksum error`; 27 x CE0463 afterwards +- **Seen:** FSM template (seam probe, 10.24 copy). — occurrences: 1 (27 x CE0463) +- **Toolkit workaround:** `mx update-widgets ` +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: update widgets or say to. Actual: silent. + +**Repro** (not reduced) + +Not reduced. + +### U49 — `marketplace update --to` refuses without `--force`, citing local edits nobody made + +- **Command / document type:** `marketplace update 109515 --to 5.2.1` +- **Severity:** usability +- **Verbatim error:** refusal reporting local edits in JavaScript actions `Wait`, `Vibrate` (likely conversion noise) +- **Seen:** FSM template 10.24 copy. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: no phantom diff. Actual: forced override needed. + +**Repro** (not reduced) + +Not reduced: run on a freshly `mx convert`ed 10.24 copy. + +### U50 — no headless update for a marketplace module already in the project + +- **Command / document type:** `marketplace install`, `mxcli new` +- **Severity:** usability +- **Verbatim error:** `marketplace install` of a present module is "NOT done automatically"; `mxcli new --version 11.12.0` ships Administration 4.3.2 while the source has 4.5.0 +- **Seen:** genai-showcase-app. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: an update path. Actual: hand-off to Studio Pro. + +**Repro** + +```sh +mxcli new X --version 11.12.0 && mxcli marketplace install --version 4.5.0 -p X/X.mpr +``` + +### U51 — `marketplace download --output ` fails; only a file path works + +- **Command / document type:** `marketplace download` +- **Severity:** usability +- **Verbatim error:** `rename ... file exists` +- **Seen:** banking sample. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: a directory is accepted, or a clear message. Actual: rename error. + +**Repro** + +```sh +mxcli marketplace download --output +``` + +## CLI usability + +### U52 — commands without `-p` silently pick a stray `.mpr` in the working directory + +- **Command / document type:** any command without `-p` +- **Severity:** usability +- **Verbatim error:** Only a `Using project: ...` notice. +- **Seen:** FSM template (increment 3). — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: refuse or ask. Actual: acts on whichever `.mpr` is present. + +**Repro** + +```sh +cd && mxcli describe module M +``` + +### U53 — System Java actions are unknown to mxcli + +- **Command / document type:** `exec` of a flow calling `System.VerifyPassword` +- **Severity:** usability +- **Verbatim error:** `warning: could not look up Java action System.VerifyPassword` +- **Seen:** genai-showcase-app. — occurrences: 1 +- **Toolkit workaround:** none +- **Existing ledger entry:** none found +- **Expected vs actual:** Expected: system actions known. Actual: warning on a valid call. + +**Repro** (not reduced) + +Not reduced. + +## Not mxcli (Mendix platform tools) + +Reported here only so maintainers do not chase them; report to Mendix. + +- `mx module-import` refuses a package built with 9.x in 11.x: `The package could not be imported, because it was created with version 9.24.2 of Mendix Studio Pro. Please open it in any version in the range from 10.21.0 to 10.24.99 first.` (exit 117; surfaced through `mxcli marketplace install 220472 --version 3.4.1`; genai-showcase-app). +- `mx update-widgets fsm.mpr` with a relative path: `System.ArgumentNullException: Value cannot be null. (Parameter 'path')`; an absolute path works (FSM template, 10.24). +- `mx create-project` 11.13 with a relative `--output-dir`: `System.UriFormatException` (FSM template, NativeNote slice). diff --git a/contrib/inbox/2026-10-12-decompose-rehost-increment-1-mxcli-findings.md b/contrib/inbox/2026-10-12-decompose-rehost-increment-1-mxcli-findings.md new file mode 100644 index 00000000..567207e6 --- /dev/null +++ b/contrib/inbox/2026-10-12-decompose-rehost-increment-1-mxcli-findings.md @@ -0,0 +1,32 @@ +# mxcli findings — Decompose/Rehost increment 1 (banking sample round trip, 10.24 fixture) + +**From:** MendixMau — toolkit lab runs for the Decompose/Rehost plan (split from #293): increment 1a (Rehost, a public mxcli banking sample app, Mendix 11.13.0) and 1b (Decompose fixture, Mendix 10.24.0) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** verbatim captures in the lab trees (not shipped); each item quotes the message seen. mxcli v0.26.0 (2026-10-11), Linux cloud container, no Studio Pro. +**Proposed target:** `bug-logs/mxcli-bugs.md` (items 1–8), `skills/learned-mdl-preflight.md` (items 9–11), toolkit scripts (12–14) + +--- + +## mxcli defects and doc gaps (upstream candidates) + +1. **`mxcli describe module ` (subcommand) emits only the module and its roles.** Output is `create or modify module Banking; create or modify module role …` and nothing else, for `--mdl 0` and `--format json` too. The whole-module emitter is the MDL statement `describe module with all`, reachable only via `-c` and documented only in `mxcli changelog`. +2. **`describe module … with all` emits flows in catalog order, and `check` refuses its own output:** 14× `MDL-ORDER01 … references microflow Banking.SUB_SeedBillers before it is created (statement 145)`; exec then `Refusing to execute: 14 unresolved reference(s). Nothing was written.` (correct). mxcli knows the call graph and could emit in call order. Workaround: a topological reorder script (Rehost pipeline). +3. **`with all` omits image collections.** `MyFirstModule.Images` is `describable` in `project-tree --json` and `describe imagecollection` emits it; the module emitter leaves it out. +4. **`describe userrole` drops `CheckSecurity: false`.** Replaying the output re-creates the role with the default: a silent security change. +5. **`describe` of a doc comment loses a markdown `* ` bullet** (the one drift row of 155 on the banking round trip). +6. **Set-mode `check` prints "Check passed!" after an earlier failure in the same invocation.** +7. **`mxcli new --version 10.24.0` ships a layout that cannot build.** `App_Default` uses Atlas design properties (`Flex container`, `Align items Y`, …) the bundled Atlas_Core 3.17.0 does not know; mxbuild ends `BUILD FAILED`, yet `new` prints "Project created" and exits 0. Workaround: `ALTER PAGES SET LAYOUT = Atlas_Core.Atlas_Default WHERE LAYOUT = MyFirstModule.App_Default; DROP LAYOUT MyFirstModule.App_Default;`. 11.13.0 is fine. +8. **CE0463 on every mxcli-written DATAGRID on a 10.24 target** ("The definition of this widget has changed…"): mxcli writes Data grid 2 against a newer DataWidgets definition than the scaffold's 2.31.0. `mxcli fix widgets -p .mpr` resolves it (15 units). Rule for 10.x targets: `fix widgets` after any page exec, before mxbuild. `bin/bug-lookup.sh CE0463` returns nothing for this today. + +## MDL learnings (preflight candidates) + +9. **CRLF inside string literals is load-bearing.** Studio Pro stores annotation text with `\r\n`; `describe` emits it verbatim; a tool that rewrites it as `\n` changes the flow, and `check` says `this change cannot be spliced into the stored flow: the free annotations change … [MDL-V1-REBUILD]`. Byte-preserving I/O only (`newline=''`). +10. **`RETURNS Boolean AS $Closed` does not declare `$Closed`.** `$Closed = true;` → "a reassignment says 'set' under mdl 1"; `SET $Closed = true;` → "variable 'Closed' is not declared". Write `DECLARE $Closed Boolean = false;` first. +11. **`LOG INFO NODE 'Util' $Message;` is not grammar.** Write `LOG INFO NODE 'Util' '{1}' WITH ({1} = $Message);`; wrap a non-String argument (`toString($Count)`). + +## Toolkit items (ours) + +12. `project-bin/app-facts.sh` hard-requires the `sqlite3` CLI for seven one-column guard queries, while the facts come from Python's `sqlite3` module. The CLI is not installable in the cloud container (`Unable to locate package sqlite3`). Route the guards through `$PY`. (#293 carried a fix.) +13. `project-bin/app-facts.sh` joins `refs` to `objects` by qualified name, so attribute-level refs (`member`, `xpath`) never reach `dependencies.json`. +14. `mxcli marketplace download --output` takes a file path; a directory fails with `rename … file exists`. diff --git a/contrib/inbox/2026-10-12-increment-3-nativenote-findings.md b/contrib/inbox/2026-10-12-increment-3-nativenote-findings.md new file mode 100644 index 00000000..9803b4ee --- /dev/null +++ b/contrib/inbox/2026-10-12-increment-3-nativenote-findings.md @@ -0,0 +1,33 @@ +# mxcli findings — increment 3, NativeNote slice (FSM 9.24.2 -> Mendix 11.13.0), 2026-10-12 + +**From:** MendixMau — toolkit lab run, Decompose increment 3 (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM 9.24.2), NativeNote slice moved into Mendix 11.13.0; captures not committed (lab run, #293). mxcli v0.26.0, Linux cloud container, no Studio Pro. +**Proposed target:** `bug-logs/mxcli-bugs.md`; last bullet to the Rehost pipeline's topo-order script + +--- + +- `describe javascript action` with a type parameter emits `Name(Entity: "Entity" not null, …)`, + which `check` refuses (`mismatched input '<' expecting {FOLDER, '('}`). An *object of type parameter* + parameter is not expressible: `Entity: Entity` resolves to entity `.Entity`; `Entity: entity ` + is an entity-type parameter and the caller then fails mx check CE0115. +- `describe layout` of a native layout with SafeAreaView emits `content { … }`; exec: `content needs a + name`. After `mxcli widget init` the slot is `template content { … }`, and exec refuses the layout: + `declares no placeholder at all` — placeholders inside a pluggable widget's child slot are not seen. +- exec's reference pre-check does not see an image collection created earlier in the same script + (`unknown image collection "FSM_Specific.Material_Design_Icons"`), refusing the whole script. +- exec is not atomic after the pre-check: a widget-build error left 18 earlier statements written. +- Re-running `create or modify javascript action` overwrites a hand-restored `.js`; the generated file + lacks the source's EXTRA CODE import, which describe emits only as a `-- EXTRA CODE:` comment. +- mxcli cannot create a native navigation profile (`create or replace navigation NativePhone` → "a web + profile's home is a page or a microflow"); a native slice needs the Blank Native Mobile App starter + (Marketplace 109511) via `mx create-project` instead of `mxcli new`. +- Commands without `-p` silently pick a stray `.mpr` in the working directory (`Using project: …`). +- `describe module … with all` omits all nanoflows (35 in NativeNote) — as in increment 2. +- Observed, untested: `describe entity` emitted `index ( desc);` (empty column) for + `NativeTechnician.NativeTechnician`. +- Not mxcli: `mx create-project` 11.13 with a relative `--output-dir` → `System.UriFormatException`. +- Toolkit: `pipelines/mendix-mpr/lib/topo-order-mdl.py` cannot order an entity whose after-commit + microflow takes the entity, nor an entity grant naming an association created later — candidates + for the extractor once its current run is finished. diff --git a/contrib/inbox/2026-10-12-increment-4-seam-probe-findings.md b/contrib/inbox/2026-10-12-increment-4-seam-probe-findings.md new file mode 100644 index 00000000..cd561dc4 --- /dev/null +++ b/contrib/inbox/2026-10-12-increment-4-seam-probe-findings.md @@ -0,0 +1,47 @@ +# mxcli and runtime findings — increment 4, seam probe (FSM monolith -> NativeNote slice, Mendix 11.13.0), 2026-10-12 + +**From:** MendixMau — toolkit lab run, Decompose increment 4 (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM) monolith → NativeNote slice (Mendix 11.13.0) over published REST; captures not committed (lab run, #293). mxcli v0.26.0, Linux cloud container, no Studio Pro. +**Proposed target:** `bug-logs/mxcli-bugs.md`; runtime bullets to `skills/mendix-service-seam.md` or a `learned-*` skill + +--- + +- `mxcli run --local` cannot run a Mendix 9 app. It resolves JDK 21 even with JAVA_HOME set to 17, + and mxbuild 9.24's Gradle 7.6 fails: `Unsupported class file major version 65`. A 9.x model has no + JavaVersion setting to steer it. Repro: `JAVA_HOME= mxcli run --local --db-type hsqldb -p <9.24 app>`. +- A microflow cannot be created in a 9.x project: + `this Mendix 9.24.2 project cannot store Microflows$Microflow.StableId (Mendix 10.2.0+); Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+)`. + Repro: `mxcli -p <9.24.mpr> -c "create microflow M.X () begin return; end;"`. Blocks any monolith-side + seam authoring on 9.x. +- `alter microflow` that adds an activity in a 9.x project is refused: `cannot store Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+)`. +- `mxcli check` passes scripts that exec then refuses for a version reason, and exec is not atomic. The + drop + create that `MDL-V1-REBUILD` recommends ran the `drop` and then failed on the `create`. The flow + was deleted, and `mx check` reported 2 × CE1613. +- `mxcli check` accepts `change $E (…)` and `$E = empty` when `$E` comes from `retrieve … limit 1`, which + is a list under `mdl 1`. `mx check` then reports + `CE1613 "The selected attribute 'List of M.Ent.Attr' no longer exists."` (4 ×). +- After `limit 1` is changed to `first`, `create or modify` reports `spliced: 1 replaced` and describe + shows `first`, but `mx check` keeps the 4 CE1613. Only drop + create clears them. +- `alter settings runtime ( JavaVersion: '17' )` on a 9.x model prints `Unchanged model settings`. It + does not say the property does not exist in that version. +- `marketplace update` leaves 27 × CE0463 (widget definitions changed) and does not run or mention + `mx update-widgets`. It also warns + `skipping com.mendix.widget.web.PopupMenu.mpk: package.xml: zip: checksum error`. +- Runtime: the Mendix 9.24.2 runtime boots headless on Linux. + - It needs Java 11; 17 is refused with `Incompatible java version: 17.0.20.1 … Java 11 is required.` + - The launcher needs `MX_INSTALL_PATH`, or it fails with `Error finding mx install path.` + - Every constant must be passed in `update_configuration`, or it fails on `MendixSSO.TokenEncryptionKey`. + - Start takes 10 s on an empty HSQLDB (2378 DDL commands). + - mxbuild 9.24 builds with `--java-home=`. +- Runtime: a REST call from 10.24 to 11.13 works with nothing tied to a Mendix version. + `create published rest service` with primitive microflow parameters, called by + `call rest service post … returns String`, needed no mappings. +- Converted 10.24 copy: getting it to boot needed one-time fixes nobody had measured: + - 2 marketplace updates; + - `mx update-widgets`; + - 1 XPath (CE0161 on a widget mxcli cannot author); + - JavaVersion 21; + - custom index.html removed; + - 3 Java edits: `final` generated parameters in DeepClone, and `rollbackTransAction` → `rollbackTransaction`. diff --git a/contrib/inbox/2026-10-12-increment-5-web-assets-findings.md b/contrib/inbox/2026-10-12-increment-5-web-assets-findings.md new file mode 100644 index 00000000..11dc76a1 --- /dev/null +++ b/contrib/inbox/2026-10-12-increment-5-web-assets-findings.md @@ -0,0 +1,39 @@ +# mxcli findings — increment 5, web slice Assets & Parts (FSM 9.24.2 -> AssetsApp 11.13.0, monolith on 10.24), 2026-10-12 + +**From:** MendixMau — toolkit lab run, Decompose increment 5 (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM 9.24.2), web slice Assets & Parts into Mendix 11.13.0, monolith copy on 10.24; captures not committed (lab run, #293). Numbered captures and tools cited below were not shipped. mxcli v0.26.0, Linux cloud container, no Studio Pro. +**Proposed target:** `bug-logs/mxcli-bugs.md` + +--- + +- `mxcli check` passes a combo box bound to an association through the attribute key, exec refuses it: + `combobox x (Attribute: $Asset.Asset_Customer, CaptionAttribute: CustomerManagement.Customer.CustomerName)` -> + check `Check passed!`, exec `property attributeEnumeration binds Asset_Customer, which is an association … not an attribute`. + Repro: that line in `alter snippet M.S { replace with { … } };` (captures/13). +- A combo box in association mode (`Association: M.A, DataSource: database M.E, CaptionAttribute: Attr`) on a widget bound + straight to a snippet parameter (no data container) passes check and exec; `mx check` then gives + `CE7007 "Selected value is not valid for entity 'Asset_Customer/Customer'. Please select the value again."` (x9). + Wrapping it in `dataview (DataSource: $Param)` clears it. Repro: replace a param-bound legacy reference selector. +- Published OData `expose ("Description")` stores the quotes: `CE1613 "The selected attribute 'AssetManagement.Asset."Description"' no longer exists."` (x4). + Repro: any keyword-named attribute quoted in an expose list (captures/24, 26). +- Published OData with no `KEY` passes `mxcli check`; `mx check` then `CE6585 "Published entity '…' must have a key defined."`. + A `KEY` on an attribute without a unique validation rule also passes check, then `CE6624 "Add a unique validation rule …"`. +- `create external entities from M.Client into M` names the entities after the entity set (`M.Parts`), not the entity type + (`M.Part`) as Studio Pro does; scripts written against the type name fail with "entity does not exist". +- `describe entity` emits `index ( desc);` with no column (`NativeMobileAsset.NativeAsset`, FSM 10.24 copy) — confirms + increment 3's "possible" item. +- Legacy widgets have no headless conversion route to the React client (the only client on Mendix 11): `describe` prints + `-- Forms$DataGrid (grid1) -- NOT re-executable` with no datasource/columns/buttons, and `marketplace install --file` of a + 10.x package into 11.x does not warn that its pages will fail `CE0582` (x22 here). Workaround used: `mxcli bson dump` + + `slice-assets/tools/legacy-extract.py` + `gen-widgets.py` -> `alter page … replace … with { datagrid … }`. +- A Data grid 2 written by `create page` on a 10.24 project (DataWidgets 2.5.6) fails `CE0463` until `mxcli fix widgets`. +- `marketplace update 109515 --to 5.2.1` on a freshly `mx convert`ed 10.24 copy refuses without `--force`, reporting local edits + in JavaScript actions (`Wait`, `Vibrate`) nobody made (likely conversion noise). +- Mendix platform tool (`mx` 10.24, not mxcli): `mx update-widgets fsm.mpr` (relative) -> `System.ArgumentNullException: Value cannot be null. (Parameter 'path')`; + absolute path works. Same class as `mx create-project` relative `--output-dir`. +- Possible, unverified: `mxcli fix design-properties` left `'Make card': on` where the source began with `'Spacing bottom'` + (`AssetManagement.Snippet_Asset_Notes`, `WarehouseManagement.Warehouse_View`) — reorder or wrong mapping. +- Measured, not a defect: a local -> external association (`TicketManagement.Ticket` -> external `AssetsSeam.Assets`) passes + `mx check` 0 on 10.24 (captures/35) — so monolith-owned associations into a slice's entities are not a platform blocker. diff --git a/contrib/inbox/2026-10-12-increment-6-core-services-findings.md b/contrib/inbox/2026-10-12-increment-6-core-services-findings.md new file mode 100644 index 00000000..365c62fa --- /dev/null +++ b/contrib/inbox/2026-10-12-increment-6-core-services-findings.md @@ -0,0 +1,47 @@ +# Increment 6 (Decompose, core services) — new mxcli 0.26.0 defects + +**From:** MendixMau — toolkit lab run, Decompose increment 6, core services (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM), monolith 10.24 publishing its core to the 11.13 Assets slice; captures not committed (lab run, #293). Numbered captures and `.mdl` files cited below were not shipped. mxcli v0.26.0. +**Proposed target:** `bug-logs/mxcli-bugs.md` + +--- + +1. **`check --references` ignores attributes added earlier in the same script.** `alter entity M.E add attribute P: + AutoNumber default 1;`, then a microflow `retrieve $X from M.E where [P = $v] first;`, then `mxcli check s.mdl -p app.mpr + --references` → `the constraint names "P", which is neither an attribute nor an association of it — mxbuild rejects + the constraint (CE0161 …)`. exec and `mx check` are fine (captures 01, 02). +2. **`drop entity` silently removes cross-module associations to the entity, and their member rights elsewhere.** Repro: + entity `B.T`, association `A.X_T from A.X to B.T` (declared in A), `drop entity B.T`. The drop prints only `Dropped + entity: B.T`, and then `describe association A.X_T` gives `Error: association not found`. The member rights on `A.X`'s + access rules go too (capture 05; `slice-core-external.mdl` header). +3. **A dropped owner-Both association leaves a hidden MemberAccess on the other entity's access rules.** Repro: + association `C.S_A from C.S to A.A owner Both`, `drop association C.S_A` → `mx check` `CE1613 "The selected + association 'C.S_A' no longer exists." at Access rule of entity 'A.A'`. `describe entity A.A` does not show the + member, and `revoke all on entity A.A from R;` + `grant …` does not remove it. Workaround: create an association + of that name from a throw-away entity in module C, then drop it (`slice-core-fix2.mdl`, capture 12). +4. **Consumed OData: a headers microflow given as `ConfigurationMicroflow:` is CE6808 on 11.13, and the slot cannot be + cleared.** `create consumed odata service … ConfigurationMicroflow: microflow M.Headers` (returns `List of + System.HttpHeader`) passes on 10.24 and gives `CE6808 "The microflow that configures a consumed OData service + should return a System.ConsumedODataConfiguration"` on 11.13. After that: `alter … set (HeadersMicroflow: …)` adds + the headers slot and keeps the configuration slot; `create or modify` with only `HeadersMicroflow:` → + `Unchanged OData client`; a real configuration microflow → `CE1135` (URL in constant and microflow), and + `ServiceUrl` cannot be removed (CE6825 guard). Only `drop consumed odata service` + create works (capture 12). +5. **`set (ConfigurationMicroflow: none)` stores a microflow named `none`** (also `empty`). `describe` then shows + `ConfigurationMicroflow: microflow none`, and `mx check` 11.13 crashes with a stack trace ending `at + Mendix.MxToolset.MxToolset.ProcessArguments(String[] commandLineArgs) in Mendix.MxToolset\MxToolset.cs:line 113`. +6. **`check` passes, exec refuses the same statement (MDL-V1-REBUILD), mid-script.** `create or modify microflow + AssetManagement.Asset_DeleteRosters` (body `retrieve $RosterList …; delete $RosterList` replaced by a call) → `check`: + `Check passed!`; exec: `this change cannot be spliced into the stored flow: alter microflow …: replace $RosterList: + $RosterList is still used by: delete $RosterList refresh`. `check` did flag 5 other flows of the same script for + the same rule. Earlier statements stay applied (capture 07). +7. **`create external entities` creates navigation associations only within the target module, silently.** Creating + `Ticket` into module T and `MonoAsset` into module C gives no `Ticket_Asset` and no warning. Creating the same entity + set into a second module passes mxcli and fails `mx check` `CE6609 "External entity with the same remote source + already exists."` (captures 05, 08, 09). +8. **`describe consumed odata service` shows an absolute local path:** `MetadataUrl: 'core-metadata.xml'` describes as + `MetadataUrl: 'file:////web-assets/AssetsApp/core-metadata.xml'`. It is unclear whether the model stores it; if + it does, it leaks a machine path to Team Server. + +Confirmed again: increment 5 defect 1 (combo box `Attribute:` on an association passes `check`, exec refuses), capture 07. diff --git a/contrib/inbox/2026-10-12-increment-7-strangled-findings.md b/contrib/inbox/2026-10-12-increment-7-strangled-findings.md new file mode 100644 index 00000000..d246d3f8 --- /dev/null +++ b/contrib/inbox/2026-10-12-increment-7-strangled-findings.md @@ -0,0 +1,46 @@ +# Increment 7 (Decompose, strangled) — new mxcli 0.26.0 findings + +**From:** MendixMau — toolkit lab run, Decompose increment 7, strangled (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM), monolith 10.24 copy (MPR v1) with the Assets modules deleted, slice AssetsApp 11.13 (MPR v2); captures not committed (lab run, #293). Tools and captures cited below were not shipped. mxcli v0.26.0. +**Proposed target:** `bug-logs/mxcli-bugs.md`; platform bullets to `skills/mendix-service-seam.md` + +--- + +New defects only; increment 6 #2 and #3 were confirmed again. + +1. **`move entity` leaves qualified names inside XPath/expression text unchanged.** By-name references are rewritten + ("Updated references in 38 document(s)"), but 62 strings in 24 units still named `AssetManagement.Asset…` + (e.g. `[TicketManagement.Ticket_Asset/AssetManagement.Asset/AssetManagement.Asset_Technician_Preferred/…]`). + Repro: a flow with `retrieve … where [X.R/M.E/Attr = $v]`; `move entity M.E to N;`; `describe` the flow → still `M.E`; + `mx check` → CE1613/CE0161 once `M` is dropped. Workaround: BSON string rewrite (`tools/bson-rename.py`). +2. **Published OData: an inherited attribute of a specialization is stored under the specialization.** `publish entity + Part.UsedPart … expose (PublicID (KEY), SystemID …)` (both on `Part.SelectedPart`) → `[CE1613] "The selected attribute + 'Part.UsedPart.PublicID' no longer exists." at Published attribute PublicID from entity Part.UsedPart`. The qualified + form `Part.SelectedPart.PublicID as 'PublicID'` is a parse error (`mismatched input '.' expecting {',', ')'}`). + Workaround: an own AutoNumber key on each specialization. +3. **`alter snippet/page … { drop w; }` cannot find a widget nested inside a legacy widget**, although `describe` lists it: + `Error: failed to resolve snippet target: widget "referenceSetSelector2" not found` + (`Technician.Snippet_Technician_DataTabs`). The whole script stops there. Workaround: BSON array-element removal. +4. **`grant read (…) on entity E to R where [xpath]` adds a second access rule when R already has one**; the old rule + (and the CE1613 it carried) stays. `describe entity` afterwards shows two `grant … to CustomerManagement.ViewMy` lines. + Expected: replace, or refuse with a hint to `revoke` first. +5. **A consumed OData service's cached `$metadata` cannot be refreshed.** After the metadata file changed, + `create or modify external entities from S into M entities (…)` → `4 updated`, but no new attribute appears. + No refresh statement exists. Workaround: `drop consumed odata service` + `create` (external entities survive). +6. **describe → drop + create of an unchanged microflow broke a decision.** `Scheduler.PlannerContext_GetWorkOrders` + (316 lines): afterwards `[CE0117] "Error(s) in expression." at Decision 'User is SDE?'`; the described decision line is + byte-identical before and after. Restored the original unit. +7. **describe output not re-executable:** `Synchronization.OfflineTicketAction_Validate` → + `microflow returns Boolean but not all code paths have a return statement [MDL003]` (case + merges). +8. **`mxcli oql --json` returns numbers as strings** (`[{"Amount":"10"}]`), so `=== 10` fails in journeys. + +Platform behaviour worth a learned-* line (not mxcli): +- a local entity's XPath cannot compare its local → external association with an object: `[TicketManagement.Ticket_Asset = $Asset]` + → CE0161; nor can an external entity be retrieved by its reverse association (`[M.Inventory_Part = $Inventory]` → CE0161); +- an AutoNumber key on a page-created entity fails at commit without read access: `Failed to commit: Value of auto-number + attribute 'PublicID' not available, could be caused by insufficient access rights to serialize the mendix object to the client`; +- trial licence: a consumer's OData calls got `The OData endpoint returned 402 Payment Required` once machine sessions accumulated; +- an external entity republished in a published OData service passes `mx check` and answers 404 at runtime; +- DataGrid 2 authored by mxcli on 10.24 is CE0463 until `mxcli fix widgets`. diff --git a/contrib/inbox/2026-10-12-native-mxcli-bughunt.md b/contrib/inbox/2026-10-12-native-mxcli-bughunt.md new file mode 100644 index 00000000..7cdf96f8 --- /dev/null +++ b/contrib/inbox/2026-10-12-native-mxcli-bughunt.md @@ -0,0 +1,30 @@ +# mxcli v0.26.0 defects on native-mobile documents — FSM template round trip + +**From:** MendixMau — toolkit lab run, native-module bug hunt (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM, Mendix 9.24.2), its 12 own `Native*` modules (1142 documents, all described). Method: `describe module with all` plus the `project-tree` fill-in → `mxcli check -p ` with a quarantine loop (every error below is mxcli rejecting mxcli's own output) → `exec` into a source copy with the 12 modules dropped. Minimal repros D1–D3: `pipelines/mendix-mpr/samples/fsm-template-9.24.2/native-bughunt/`. Counts are error lines across all quarantine rounds. +**Proposed target:** `bug-logs/mxcli-bugs.md`; upstream drafts in `bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md` (U-ids) + +--- + +## Defects + +- **D3 (confirmed), blocks round trip.** No microflow or nanoflow can be written to a 9.24.2 project: `this Mendix 9.24.2 project cannot store Microflows$Microflow.StableId (Mendix 10.2.0+); Microflows$SequenceFlow.CaseValues (Mendix 10.15.0+)`. An empty `create or modify microflow Repro.MF_Min () begin return; end;` fails on a fresh 9.24.2 app (`D3-…mdl`). 100% of flows tried. +- **D1 (new), blocks.** `describe entity` prints `index ( desc);` (no column); check: `index on unknown attribute 'desc'`. 23 errors in 10 modules; everything naming the entity cascades (NativeReason: 3 of 45 statements clean in check, 37 rejected). Repro `D1-…mdl`. +- **D2 (new), blocks.** Native Repeater: `` `content` is not a container of `repeater` — it declares: template [MDL-WIDGET26] ``. 32 errors, 7 modules. Repro `D2-…mdl` (needs the Repeater `.mpk` + `mxcli widget init`). Same family as SafeAreaView (D11). +- **D4 (new), blocks or drifts.** `nanoflow data source … has no argument for parameter 'NativeInstanceItem' — Mendix rejects this with CE1571` (also nanoflow actions). describe prints the call without the parameter mapping. 70 errors, 7 modules. Not isolated (blocked by D3). +- **D5 (new).** `Attribute 'Search' is bound but there is no enclosing data container providing entity context` (also date pickers). describe loses or never emits the data view; unverified which. 11. +- **D6 (new).** `ContentParams parameter {1} is written as "$currentObject/NotResolvedReason"`. 2. +- **D7 (new).** `selection DataSource references 'grid1' but no widget with that name exists on this page` — describe names a widget it did not emit. 1. +- **D8 (new).** `enum split has 28 branches; at most 16 branches are supported` — a create limit describe does not respect. 1. +- **D9 (new).** Lint `MDL-REST04: authentication microflow … has parameter $Token, which Mendix does not supply … (CE0336)` on valid source. 1. +- **D10–D14 (confirmed).** JS action type parameter `Name(…)` → `mismatched input '<'`; SafeAreaView `content` slot; `with all` omits nanoflows, snippets and JS actions and truncates at 10 000 lines; exec refuses forward and cross-module references and a grant before its association, and is not atomic; image collection not found (seen only against an empty scratch app, not re-tested). + +Cosmetic, not counted: the `commit` default-events notice and `Wrap dataview … in layoutgrid` hints. + +## Per module (summary) + +1201 `create` statements across the 12 modules: 441 clean in check, 702 rejected (root cause or cascade of D1, D2, D4–D9). Executed into the 9.24.2 target: only modules, roles and 3 NativeRestAPI constants. Exec blockers: D3 (every flow) and D13 (cross-module references, grant before association). Largest: NativeMobile 461 statements, 308 rejected; NativeMobilePart 156/99; NativeMobileForm 104/62. Missing dependencies: 0. + +Not tested, because D3 and D13 stop exec first: target `describe` versus source `describe`. Re-run once D3 is fixed, or against an 11.x target (the native modules then need the Blank Native Mobile starter), to expose the next layer. diff --git a/contrib/inbox/2026-10-12-rehost-increment-2-genai-mxcli-findings.md b/contrib/inbox/2026-10-12-rehost-increment-2-genai-mxcli-findings.md new file mode 100644 index 00000000..41d54f10 --- /dev/null +++ b/contrib/inbox/2026-10-12-rehost-increment-2-genai-mxcli-findings.md @@ -0,0 +1,39 @@ +# mxcli v0.26.0 defects found regenerating the GenAI Showcase App (Rehost increment 2) + +**From:** MendixMau — Rehost increment 2 on mendix/genai-showcase-app (MIT) (split from #293) +**Date:** 2026-10-12 +**Kind:** bug +**Field evidence:** captures not committed (lab run, #293); Mendix 11.12.0 source, 36 modules regenerated into `mxcli new --version 11.12.0`; Linux container, no Studio Pro +**Proposed target:** `bug-logs/mxcli-bugs.md` (one BUG-n each); upstream drafts in `bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md`; extractor items to `pipelines/mendix-mpr/` + +--- + +Format: defect — verbatim message — repro — workaround. + +## mxcli defects + +- **`-c describe module … with all` truncates at 10 000 lines, silently**, mid-statement (AgentCommons). Workaround: drop the incomplete statement, describe the missing documents one by one. +- **`with all` leaves document types out**: nanoflows, snippets, JS actions, JSON structures, mappings, task queues, image collections, some pages (10 of 22 in AgentCommons). Workaround: `project-tree` fill-in. +- **`describe java action` puts the parameter separator after the `--` comment**: `Name: String not null -- This sets the Name…,` → `mismatched input 'Name' expecting ')'`. +- **A microflow created before a Java action of the same name**: `refusing to write unit …: attribute reference not qualified`. Workaround: create the action first. +- **A grant naming an association member before the association exists**: `entity EchoConnector.Credentials has no member(s) Credentials_Configuration`. Workaround: order grants after associations. +- **Message definitions cannot be expressed**: `message definition "GenAICommons.MD_Reference.Reference" not found — this project has no message definitions` → 4 × CE1613 at mxbuild. No workaround. +- **A Mendix 9-built MPK cannot be installed into 11**: `mx module-import failed: exit status 117` / `created with version 9.24.2 … open it in any version in the range from 10.21.0 to 10.24.99 first`. Workaround: regenerate from source. +- **The source's stamped marketplace version is gone**: `version "1.5.1" not found`; oldest listed is 3.0.0. +- **No headless update for a module already present**; `mxcli new --version 11.12.0` ships Administration 4.3.2, source has 4.5.0. +- **#923 (known): merges and decisions** describe with WARNING lines and layout drift. +- **NEW — `import from mapping` result written with a null entity; the `.mpr` no longer loads**: `System.ArgumentNullException … EntityType.set_EntityId`. Seen when the flow ran ahead of its import mapping (cause is a hypothesis). Workaround: `drop microflow` + `create or modify` in one script once the mapping exists. +- **NEW — Java action type parameter described as `MxObject: "Entity"`; exec writes entity `.Entity`**: `The selected entity '.Entity' no longer exists.` (7 build errors). JS actions too. +- **NEW — sort on an inherited attribute written against the specialization**: `CE1613 "The selected attribute '…BookChunk.Similarity' no longer exists."`; describe is identical, so a describe-only check misses it. +- **NEW — rules cannot be described or created**: `describe rule …` → `Unknown type: rule`; `show rules` lists 14. 8 flows deferred. +- **NEW — describe emits MDL its own `check` rejects** (30 documents): MDL-WIDGET24 ContentParams `$ChatContext/Topic`; MDL-FLOW02 `merge shared1: nothing joins it`; MDL081 layout without placeholders; MDL-WIDGET18 `DecimalPrecision … &{-1}`; MDL-PAGEARG01 button outside a data view. +- **NEW — forward references refused inside one script, so mutual recursion cannot be created**: `references microflow X before it is created`. Hypothesis: create-stub-then-modify. +- **NEW — describe output fails validation**: `variable 'SumDuration' is not declared`. +- **Seen, not isolated:** System Java actions unknown to mxcli; mapping `root (Wrapper)` → `extraneous input '('`; `format (decimalPrecision: -1)` → `no viable alternative`. + +## Toolkit (extractor) items + +- `lib/quarantine-mdl.py` does not map lint-form errors and trusts mxcli's `statement N:`, which differs from `lib/mdlsplit.py` (e.g. 48 vs 49). +- `rehost-extract.sh` `check_exec`: when nothing can be quarantined, the rest is neither executed nor deferred (run 4 lost 7 modules, 1040 statements). +- The deferred comment nests on every retry; the `never executed` count is 7× too high. +- The ledger denominator does not count rules. diff --git a/contrib/inbox/2026-10-13-genai-nightly-findings.md b/contrib/inbox/2026-10-13-genai-nightly-findings.md new file mode 100644 index 00000000..fc32992a --- /dev/null +++ b/contrib/inbox/2026-10-13-genai-nightly-findings.md @@ -0,0 +1,21 @@ +# mxcli nightly defects found regenerating the GenAI Showcase App (Rehost, nightly re-run) + +**From:** MendixMau — Rehost increment 2 nightly re-run on mendix/genai-showcase-app (MIT) (split from #293) +**Date:** 2026-10-13 +**Kind:** bug +**Field evidence:** captures not committed (lab run, #293). mxcli `nightly-80-gbd45c47e`, Mendix 11.12.0, 36 modules regenerated into `mxcli new --version 11.12.0` with 5 marketplace modules installed. +**Proposed target:** `bug-logs/mxcli-bugs.md` (one BUG-n each), upstream issues. None is among U1–U53 of `bug-logs/pending-github-issues/2026-10-12-mxcli-0.26-round-trip-report.md` unless a U-id is named. + +--- + +Format: defect — verbatim message — repro — workaround. + +- **N-1. `project-tree --json` omits rules and message definition collections.** Both describe on the nightly (U5 fixed), but a tree-driven extractor never emits them. Repro: `-c "show rules"` lists 9 `Rule_` documents; `project-tree --json | grep -c Rule_` prints 0. Effect: 5 × CE1613 for export mappings on message definitions (`message definition "GenAICommons.MD_Reference.Reference" not found`) and flows calling rules fail validation (`… which is not a rule in this project`). Workaround: none yet; an extractor could add `show rules ` to its fill-in. +- **N-2. exec stores a ContentParams association path as a raw string in `AttributeRef.Attribute`; the model then cannot load.** check passes, exec says `Created snippet AgentCommons.Snippet_Output_List`, then `mx check` and mxbuild stop with `System.ArgumentNullException: Value cannot be null. (Parameter 'value')` ("…set the 'Attribute' property of a Attribute in a Snippet…"). Describe line: `ContentParams: ({1} = $currentObject/AgentCommons.Value_Variable/AgentCommons.Variable/Key)`; without `$currentObject/` it is just as unloadable. The source stores `AttributeRef` null. Related to U10, but this association-path form gets through check. Workaround: fix by hand. +- **N-3. check and exec accept an import or export mapping whose entity does not exist.** `Created import mapping ExampleMicroflows.IM_Ticket` while `ExampleMicroflows.Ticket` was absent; `mx check`: 16 × `[CE1613] "The selected attribute 'ExampleMicroflows.Ticket.Identifier' no longer exists."`. Expected: refuse, as for a microflow parameter of a missing entity. +- **N-4. (likely) A pluggable widget attribute bound to an outer data context loses that context.** `markdown markdownViewer3 (stringAttribute: SystemPrompt, …)` inside `dataview dataView7 (DataSource: microflow ConversationalUI.DS_CopyHelper_Create)` is bound to the innermost entity: `[CE1613] "… 'ConversationalUI.CopyHelper.SystemPrompt' no longer exists."` (3). The source BSON binding is not read yet; confirm first. +- **N-5. describe emits a snippet call without the `Params:` its snippet requires.** exec: `snippet AgentCommons.Snippet_Agent_SelectVersion requires parameter $Agent — add Params: (Agent = $)…`; `AgentCommons.Version_Overview` never lands (4 × CE1613 at callers). Maybe U6's family. +- **N-6. exec errors that do not name the failing statement.** `failed to build snippet: … AgentCommons.MCP is not a specialization of AgentCommons.Tool…` names no snippet and no statement number, so a resume loop cannot place it; the toolkit falls back to one statement per process (320 statements of ConversationalUI). Expected: `statement N:` as `--continue-on-error` already prints. +- **N-7. Building blocks describe as comments only.** `describe buildingblock ConversationalUI.ConversationStarter` prints `-- Building Block: …` and no `create`. 4 `not-emitted` ledger rows. + +Still open, re-seen: U7 (type parameter → `.Entity`, now 14 build errors), U18 (#923 decisions, 3 rows), U23 (`attribute reference not qualified`), U31 (`with all` stdout still ends at 10 001 lines). diff --git a/contrib/inbox/2026-10-13-increment-8-dispatch-findings.md b/contrib/inbox/2026-10-13-increment-8-dispatch-findings.md new file mode 100644 index 00000000..8cbd6c9d --- /dev/null +++ b/contrib/inbox/2026-10-13-increment-8-dispatch-findings.md @@ -0,0 +1,51 @@ +# Increment 8 (Decompose, Dispatch & Workforce) — new mxcli 0.26.0 findings + +**From:** MendixMau — toolkit lab run, Decompose increment 8, Dispatch & Workforce (split from #293) +**Date:** 2026-10-13 +**Kind:** bug +**Field evidence:** a public Marketplace template (FSM), monolith 10.24 copy (MPR v1), slice DispatchApp 11.13 (MPR v2); captures not committed (lab run, #293). mxcli v0.26.0. +**Proposed target:** `bug-logs/mxcli-bugs.md`; platform bullets to `skills/mendix-service-seam.md` + +--- + +New defects only; known ones are listed at the end. + +1. **describe page → create refuses its own output (ContentParams path).** `describe page Scheduler.PageContext_View` + prints `ContentParams: ({1} = $currentObject/FilterCaption)`; exec of that output refuses: + `dynamictext "text7": ContentParams parameter {1} is written as "$currentObject/FilterCaption" — a template parameter is + evaluated against the widget's own context object, so it takes the attribute name …`. Workaround: `{1} = FilterCaption`. +2. **describe page → create resolves a nested visibility rule against the wrong entity.** Same page, after its + `TicketManagement.WorkOrder` became an external entity: `Error: failed to build page: failed to build widget: dynamictext + text14: Visible: Status in (…): Scheduler.PlannerContext_WorkOrder_Selected has no attribute Status`. The statement before + it in the script (a microflow) was already written. Workaround: `alter page … { set (Visible: …) on text14; }` instead of + re-creating the page. +3. **exec pre-check does not see what an earlier statement of the same script created** — variant of mendixlabs/mxcli#1061 + (queues): an attribute added by `alter entity M.E add attribute if not exists PublicID: AutoNumber default 1;` → + `retrieve from TicketManagement.Appointment: the constraint names "PublicID", which is neither an attribute nor an + association of it`; entities from `create external entities …` → `page 'DispatchSeam.Appointments_FromCore' has + reference errors: - entity not found: DispatchSeam.Appointment`. Both scripts are valid; `--no-check` applies them. +4. **A rule-based decision describes as `if not(Rule(...)) then`.** drop + create then writes an expression split, and an + expression cannot call a rule: `[CE0117] "Error(s) in expression." at Decision 'User is SDE?'` + (`Scheduler.PlannerContext_GetWorkOrders`). This is the root cause of increment 7 inbox #6. Workaround: inline the + rule's test (`retrieve $R from System.UserRole where [id = '[%UserRole_ServiceDeskEmployee%]'][System.UserRoles = $currentUser] first;` + then `if $R = empty then`). +5. **`alter microflow X { insert before return true begin … end; };` is not idempotent.** Each re-run of the script inserts + the call again (3 runs → 3 calls in `General.ASU_General`). Expected: refuse, or report that the activity is present. + +Platform behaviour worth a learned-* line (not mxcli): +- external entities: an XPath on an attribute not published **Filterable** fails as a bare `CE0161 "Error(s) in XPath + constraint."` (30 probe microflows to find it); sorting needs **Sortable** (`CE7247 "Cannot sort on attribute + 'PlannedWorkStart' because it does not support sorting."`); a navigation is published on its owner only, so a reverse + traversal is CE0161 and a gallery over one is `CE8812 "Entity 'TicketManagement.WorkOrder' has no association + 'TicketManagement.Appointment_WorkOrder'."`; +- enumerations as Strings (P8) also break enum visibility rules: `CE0749 "The selected value 'Status' is not of type Boolean or Enumeration."`; +- `on error without rollback` inside a loop: `CE0644 "Error handling type must be 'Rollback' inside a looped activity."`; +- `mx check` text output has no document names; `mx check -j out.json` has them (`locations[].document-name`); +- Mendix 11 Java API vs 10.24 user code: `context()` → `getContext()`, `Core.isSubClassOf(String,String)` gone + (`Core.getMetaObject(type).isSubClassOf(…)`), proxy parameters need `getMendixObject()`; +- a legacy `Forms$Table` hides its children from describe and `replace` (`widget "referenceSetSelector1" not found`): + replace the table. + +Known, seen again: BUG-87 (`entity <>`), bare `TypeParameter` Java action parameter (CE1613 `'.TypeParameter'`), +`format (decimalPrecision: -1)` not re-parsable, increment 7 #3 (nested widget not found) and #5 (consumed-service +metadata not refreshable: `0 created, 0 updated, 9 skipped`), non-atomic exec.