Skip to content

Sync ako/mxcli: run --watch builds incrementally again; page round-trip fixes; workflow sub-process System members - #1825

Merged
ako merged 18 commits into
mendixlabs:mainfrom
ako:main
Nov 12, 2026
Merged

ako merged 18 commits into
mendixlabs:mainfrom
ako:main

Conversation

@ako

@ako ako commented Nov 11, 2026

Copy link
Copy Markdown
Collaborator

Syncs ako/mxcli:main into upstream: 7 commits since #1824 — run --local --watch builds incrementally again on Mendix versions that bundle the client themselves, and page round-trip fixes.

run --local --watch: incremental builds

  • mxbuild's client source is kept between builds. On Mendix versions that bundle the client themselves, a build in an mxbuild --serve process deletes the client source it wrote, so the next build bundled a client without pages. The watch loop answered every change with a fresh serve process and a cold build: 20–22 s for a microflow edit, 25–28 s plus a runtime restart for a page edit, on a blank 11.16.0 app. The source is now copied aside during a build and put back before the next, so an incremental build takes about 2 s and a page edit is a reload. The full build stays as the fallback when the bundle is still incomplete, the bundler fails on kept source, or a page's source was missed.
  • On Windows, the copies are read with FILE_SHARE_DELETE so a copy in progress doesn't fail mxbuild's own cleanup; if a build still fails because deployment/web was in use, the keep is dropped for the run and the build retried.

Pages: a describe → exec round trip writes what it read

  • A binding read through an outer data view is kept. Studio Pro stores it as the data-view pair (Widget + PageParameter, with association steps for a path); describe printed the bare name and the rewrite resolved it against the nearest data view (CE7247, or "has no attribute"). $dvOuter.Attr and $dvOuter/Assoc/Attr — the spelling input widgets already had — now work on a pluggable widget's attribute property and in Visible: … in (…), through one resolver for check, describe and exec. Six affected pages now report Unchanged; a fresh page with the three forms builds with mx check 0 errors on 11.16.
  • check accepts the container names Studio Pro stores in a selectable grid's column ($grid1, its selection), a grid's control bar inside a data view ($dataView3, the outer container) and a combo box's option content ($dataView2). describe → exec was refused on its own output (MDL-BUTTON02, MDL-PAGEARG01) although the stored pages build.
  • The workflow sub-process members are in mxcli's System module (System.WorkflowSubProcess, WorkflowSubProcessDefinition, their associations and WorkflowSubProcessState), measured from an 11.14.0 model.mdp and present from 11.8.0 (measured per version). A binding over them was stored as an expression (CE0117). System entities and enumerations gain an introducing version, and version-aware paths filter on it.

7 WorkflowCommons documents leave the round-trip suite's allowlist

claude and others added 18 commits November 11, 2026 19:19
mxcli's System module (extracted from 11.6.4) had no System.WorkflowSubProcess,
System.WorkflowSubProcessDefinition, their associations or
System.WorkflowSubProcessState. A binding over
System.WorkflowActivityRecord_WorkflowSubProcess could not resolve and was
stored as an expression, so describe -> exec of TestApp's
WorkflowCommons.Snip_WorkflowActivityRecord_Header failed mx check with
CE0117 "Error(s) in expression." at text4.

- Attributes, types and String lengths are measured from the System domain
  model in the model.mdp of an 11.14.0 deploy build. The golden lengths table
  was regenerated with -update; all 115 existing rows matched.
- The introducing version is measured from Mendix.Modeler.Core.dll per
  version, with a control name present in every version: absent in 11.6.0
  and 11.7.0, present from 11.8.0.
- SystemEntityDef and SystemEnumDef gain Introduced. Version-aware paths (the
  backend's System domain model and enumeration list) filter on it, and an
  association is dropped when either end is absent, as runtime-only ends
  already were. Version-blind lists keep describing the current platform.
- The system-module skill documents the new entities and enumeration.
- TestApp's roundtrip allowlist loses Snip_WorkflowActivityRecord_Header.

Measured on 11.14.0: that snippet now round-trips unchanged with mx check 0
errors (was CE0117). The bug-test script is 0 errors; the main binary gives
2x CE0117.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82rmxc4mZcUDT8ePYWM
TestTestAppRoundTrip reports six WorkflowCommons documents built on the
workflow sub-process members as no longer breaking exec:
WorkflowDefinition_View, WorkflowSubProcess_View,
Snip_WorkflowSubProcess_Details, Snip_WorkflowSubProcess_IncompatibleWarning,
Snip_WorkflowSubProcess_State and Snip_Workflow_SubProcessDetails. The
allowlist may only shrink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82rmxc4mZcUDT8ePYWM
A test calling a microflow with Apply entity access = Yes failed CE0114
at build and MDL-SEC22 at check: the endpoint test microflows, the
legacy MxTest.TestRunner and the MxTest.Check_* wrappers were written
without the setting. They now apply it, as RegisterEndpoint already did
(#1654); CE0114 has one direction, so an applying caller may call both.

An applying flow may not read $latestError/Message (CE0150), so the
runner's verdict and @throws handlers pass $latestError to a generated
non-applying helper, MxTest.Test_ErrorMessage, each into its own
variable. It carries the generated prefix, so every discovery and
cleanup path removes it; the legacy cleanup drops it explicitly, and a
build error in it is attributed to mxcli.

A test whose own handler reads $latestError/... keeps a non-applying
caller, so it builds as before. Tests run in a system context, so
nothing changes at run time.

Measured on 11.12.1 at security Off and Production; end to end with
--local, --legacy-runner and a pre-existing MxTest module.

Closes #2100. Refs mendixlabs#1805.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
Add the workflow sub-process members to the System module
…, control bars and combo box options (#2109)

describe page -> exec of four FactoryManagement pages was refused on its own
output (MDL-BUTTON02, MDL-PAGEARG01), although the stored pages build:

- a show page in a selectable data grid's column passing `$grid1`: the
  grid's selection, stored as Variable {Widget: grid1} as from its control
  bar (MxModelReflection.MxObjectType_Select);
- `$dataView3` from the control bar (filters placeholder) of a grid inside
  dataView3: the bar sits inside the grid, so dataView3 is an outer
  container there (OIDC.OIDC_Client_NewEdit);
- `$dataView2` in a combo box's option content: the option is the combo
  box's own context (AgentCommons.Version_NewEdit).

The check walk and the show page argument context model the three, and
the engine enters a data widget through the same constructor
(enteringDataWidgetOf), so check and exec agree. Re-measured on 11.16:
the control-bar case builds with 0 errors in the variable form written
since #2095; two older tests are updated with that evidence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
Studio Pro stores a binding to an outer data view's object with the
data-view pair SourceVariable {Widget, PageParameter}, with association
steps for a path. describe printed the bare qualified name, and the rewrite
read it against the nearest data view: CE7247 on five ConversationalUI
markdown viewers, "TraceView has no attribute HasError" on Trace_Details.

`$dvOuter.Attr` and `$dvOuter/Assoc/Attr`, the spelling input widgets
already had (#826, #833), now work on a pluggable widget's attribute
property and in `Visible: … in (…)`: one resolver (namedObjectVariable)
for check, describe and exec, MDL-WIDGET34 accepting an enclosing data
view, the rooted path accepted in the form the parser produces, and
WidgetObjectBuilder.SetAttributeWithSteps to store the steps. All six
pages report Unchanged page; a fresh page with the three forms builds with
mx check 0 errors on 11.16.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
On Mendix versions that bundle the client themselves, a build in an
mxbuild --serve process deletes the client source it wrote, so the next
build bundles a client without pages. The watch loop answered every
change with a fresh serve process and a cold build: 20-22 s for a
microflow edit and 25-28 s plus a runtime restart for a page edit on a
blank 11.16.0 app.

The source is now copied aside while a build runs and put back before
the next. The incremental build then takes about 2 s and a page edit is
a reload. The full build stays as the fallback when the bundle is still
incomplete, the bundler fails on kept source, or a page's source was
missed.

Closes #2150

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82sKAKMxKadjp4EraKh
Windows refuses to delete a file another process has open. The copies of
the client source are now read with FILE_SHARE_DELETE, so a copy in
progress does not fail mxbuild's own cleanup. If a build still fails
because deployment/web was in use, the keep is given up for the run and
the build is run again, which leaves the full rebuild per change.

Refs #2150

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82sKAKMxKadjp4EraKh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
fix(pages): container names in item slots (#2109) and bindings through an outer data view (#2107)
fix(run): keep mxbuild's client source so --watch builds incrementally
fix(test): generated test callers apply entity access
@ako
ako merged commit 141980c into mendixlabs:main Nov 12, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants