Skip to content

Sync ako/mxcli: test --reuse-build and --watch recovery (#1783, #1787); Go 1.27.4 for GO-2026-6859; page round-trip fixes - #1816

Merged
ako merged 17 commits into
mendixlabs:mainfrom
ako:main
Nov 11, 2026
Merged

ako merged 17 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: 10 commits since #1806 — #1783 and #1787 as submitted, a Go toolchain bump for a new advisory, and page round-trip fixes.

mxcli test: #1783 and #1787 (by @MendixMau)

Both PRs are included at their submitted heads, so merging this with a merge commit marks them merged.

Security: Go toolchain 1.27.4

govulncheck fails every build on 1.27.3: GO-2026-6859, a net/http MaxBytesReader header race, fixed in 1.27.4. The advisory is new, so upstream main fails the same scan; on 1.27.4 govulncheck reports nothing reached.

Pages: an unchanged page's round trip writes nothing

describe → exec rewrote Studio Pro pages that had not changed:

  • A check box's label position, a radio button group's orientation and a show-page button's close count had no MDL spelling, so the default overwrote the stored value: a label after the control became Default, every radio group became horizontal, and a show-page button stopped closing its page. mx check stayed green. New: checkbox … LabelPosition: Default|BeforeControl|AfterControl, radiobuttons … RenderHorizontal: true|false, and show page … with (NumberOfPagesToClose: n); describe prints each when it differs from the default.
  • Stored formatting and keys are kept: a DynamicClasses or XPathConstraint that differs only in whitespace outside its string literals, an enumeration condition's values in their stored order, and the null SourceVariable key on Forms$AssociationSource (Studio Pro writes it on 40 of 40). A system member a specialisation inherits resolves to the entity that stores it.

8 WorkflowCommons snippets now round-trip exactly and leave the round-trip suite's allowlist

MendixMau and others added 17 commits November 9, 2026 20:06
…ests and mxcli are unchanged

A local test run injects the test microflows, builds with mxbuild and boots.
For an unchanged project, unchanged test files and an unchanged mxcli the
injected model is the same as last time, so the deployment left in
<project>/deployment is already the build this run would produce.

The key is a content hash, never a timestamp: every file of the project
folder (minus output/cache dirs), the generated endpoint and test microflow
text, the mxcli executable and the mxbuild override. The record also pins
the identity of deployment/model/model.mdp, so a build made by anything else
in that folder (run --local, mxbuild by hand) is never taken for ours. Any
doubt means a normal build.
…stale-model refusal

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
 #1782)

mxbuild rewrites theme-cache/web/theme.compiled.css on every build with a
non-deterministic cache-busting query string on each font/asset url(), even
with zero theme or model changes. Without this exclusion the hash key never
repeats across two separate 'mxcli test' invocations on any app using the
Atlas Core theme, so --reuse-build silently rebuilt every time and never
paid for itself. Found by running --reuse-build twice in a row against a
real app and seeing it rebuild both times; re-verified after the fix (reuse
hit: 12.15s vs ~60-67s miss).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…m IO_PathNotFound, headless test runs)

Rebuild in the test runner's app called serve.Build directly, so the recovery that run --local --watch has never ran for test --watch: the second build of a serve process fails on regenerated pages (mxbuild 11.15 macOS reports IO_PathNotFound_Path, not the English text) and every later change reported 'could not be applied'. Route through serveRecovery, match the key form, and skip the web/dist completeness restart (headless) .

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 191261bcfa68e22f6915084f0553880d08cecbff)

(refs #1786)
…OS/Linux key-form failure

Two gaps in existing coverage for the test --watch build-recovery fix:
- serveRecovery.headless must skip the prebuilt-bundle restart entirely
  (only a browser-facing client cares about a lost dist/pages).
- missingClientDirs must recognize mxbuild's resource-key form of the
  same failure (IO_PathNotFound_Path, measured on 11.15.0 macOS) as well
  as the English-text form, including when the directory exists but the
  specific file mxbuild wants does not.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…very merges

- Drop the dead `reuseKey` variable in runEndpoint, and put the capture
  comment back above the capture it describes (the abandoned-endpoint
  removal from #2119 had landed between them).
- --reuse-build skips .git and node_modules at any depth, not only at
  the top: tooling state, never a build input (test added, with a control).
- CHANGELOG entries for mendixlabs#1783 and #1787, and a line for
  --reuse-build in running-tests.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
…show page close count (#2106)

None of the three had an MDL spelling, so describe page -> exec of a Studio
Pro page wrote the default over the stored value: a check box's label after
the control became Default, every radio button group became horizontal
(RenderDirection was read by the writer but never set), and a show page
button stopped closing the page it came from. mx check stayed green.

checkbox takes LabelPosition: Default|BeforeControl|AfterControl,
radiobuttons RenderHorizontal: true|false, and show page
with (NumberOfPagesToClose: n), which needs a number in actionSettingV3.
describe prints each when it differs from the default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
govulncheck fails every build on 1.27.3: a net/http MaxBytesReader header
race (GO-2026-6859), fixed in 1.27.4. The advisory is new, so main fails
the same scan; govulncheck on 1.27.4 reports 0 vulnerabilities reached.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
Integrate mendixlabs#1787 (test --watch recovery) and #1783 (test --reuse-build)
…state (#2106)

describe page -> exec rewrote 8 FactoryManagement pages that had not
changed. CarryUnexpressed now keeps a stored DynamicClasses or
XPathConstraint (as it did an Expression) when only whitespace outside its
string literals differs, and an enumeration condition's values in their
stored order when each keeps its flag. The writer stores the null
SourceVariable key on Forms$AssociationSource, as Studio Pro does on 40 of
40, and a system member a specialization inherits resolves to the entity
that stores it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
fix(pages): keep a check box's label position, radio orientation and show page close count (#2106)
#2106)

The TestApp round-trip harness reports these snippets no longer break
getput and putget with this branch's carries and writer fixes; the
allowlist may only shrink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82ttaGzay5CwiC2V7cf
fix(pages): keep stored formatting and keys a page round trip cannot state (#2106)
@ako
ako merged commit d74ecd4 into mendixlabs:main Nov 11, 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.

feat: mxcli test --reuse-build — skip injection and mxbuild when nothing changed

3 participants