diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c18daa0..d21c0c2a 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 +- fix(doctor, exec, page-scope, rehost, wf-add-path-terminators, module-close): **mxcli v0.29 compatibility, and doctor advises the latest mxcli**: on v0.29.0 (which `--install` fetches by default) four instruments read new output wrong. (1) `fix property-sets` prints `MIXED` rows and exits 1: doctor reported "could not classify" (rc 4, shown as info by sync) — now result `mixed`, a WARN naming the rows and saying the repair cannot clear them; (2) the repair also exits 1 while a MIXED name remains, so `--fix-property-sets` rolled back a repair that had landed — the apply step now passes when only MIXED is left (FAILED still fails); (3) `fix hashes` now verifies MPR v1 with new text, which exec.sh read as an error, so every `--patch` on a Mendix < 10.18 project went unverified — both v1 forms are read; (4) since v0.28 `SHOW MODULES` / `list modules` write `Protected AddOn|Solution` in Source, so a first-party module set to Protected dropped out of page-scope (FAULT, 0 modules) and out of the rehost module list — the export level no longer counts as an origin. `wf-add-path-terminators.py` refuses below Mendix 10.21 (the terminator type does not exist there; written in, the project will not load), module-close notes that v0.29 `docker check` checks the stored project (a CE0463 it now reports is real), and the stale "stay on v0.24" pin advice is replaced. **New:** the normal doctor run compares the project mxcli with the latest release (redirect of the asset URL, 5 s, nothing downloaded): WARN with release link and upgrade path when behind, a note when `MXCLI_VERSION` pins it, one quiet note offline, never a FAIL; `MXTK_NO_LATEST_CHECK=1` skips it. Golden input captured from the real v0.28.0/v0.29.0 binaries on the mxpatch fixture model and mutated copies (CAPTURE files); against master the new cases fail (exec-hash-verify 4, property-sets 7, mxpatch 1, page-scope-protected 3, rehost-list-modules 1, doctor-mxcli-latest 8). Field run: page-scope and doctor against real v0.29.0/v0.28.0 binaries in a cloud session — mxcli v0.29 audit (2026-10-30) - fix(skills): **skill text no longer tells agents that mxcli v0.25–v0.29 cannot do things it now does**: STOP 21 said `ALTER NAVIGATION` does not exist and restatement is the only write — it now points at `alter navigation`/`alter menu` (v0.28, mendixlabs/mxcli#1522) and in-loop `alter microflow`/`replace body of` (v0.29, ako/mxcli#1693), keeping its describe-first rule; STOP 1b now writes the bare `Editable: ` (v0.25) and limits the quoted-form trap to mxcli < v0.28 (#1567); `learned-mdl-cannot-express.md` marks file upload (`filemanager`, v0.27), tab `Badge:` (v0.29), app title (v0.29), role visibility `Visible: roles(…)` (v0.27) and `sidebartoggle` (v0.28) buildable from their version; four `learned-detection-gaps.md` rows (terminators, `if` without `else` in a handler, `Class` on a snippet call, property sets below 10.24.24) and `platform-link.md` now name the mxcli version that fixed them; three passages no longer assume mxcli auto-creates `.User` (gone since v0.27, #1474). `mdl-scan` STOP-1 now also catches the bare `Visible:/Editable: ` form inside a customContent column (it matched only `[`), since STOP 1b now recommends that form. Nothing deleted: old-version guidance stays, version-gated, because nothing was re-probed. Baseline 64,193 → 64,252 words. Source: mxcli v0.29 compatibility audit 2026-10-30 - fix(wire-company-brain): **re-wiring a company brain works on macOS, and a rewrite that fails no longer reports "Updated"**: the block was handed to awk as `-v blk=…`, which BSD awk (macOS) refuses when the value holds a newline, so every re-run (a moved brain, a changed block) left the files untouched while printing `Updated: … rewritten in place`; the block now goes through the environment (`ENVIRON["BLK"]`), and a failed rewrite or append prints `FAILED: …`, leaves the file alone and is not counted. Pinned by `tests/wave2/test-company-brain.sh` T2c (a stub awk with BSD's `-v` rule; 4 of its 5 checks fail on 2ba8158) — reported in #598 from a field-run project, macOS 26 / BSD awk 20200816 - fix(doctor, sync-project, speed-setup): **doctor says when the speed fixes never reached a project**: `bin/exec.sh`, `bin/_common.sh` or `bin/lint-gate.sh` without the 2026-10-29 speed code (marker per file) gives a Machine health warning "speed fixes not active", and the Recommended fix leads with the exact `sync-project.sh --upgrade-bin ...` command (exec.sh always with its `_common.sh`; each copy backed up) before any other advice, because every other number measures the old scripts; `sync-project.sh` names the speed fixes on a hand-edited exec.sh / _common.sh that has the exit-code fix but not the speed work; `skills/speed-setup.md` has Claude show each local edit in one line and ask before replacing. Field: an English colleague's ExpenseTracker analysis after the toolkit update still showed a full mxbuild on every change (45.5 min, 57% of all exec time) with 15 drifted scripts in bin/; reproduced here with the real pre-#587 exec.sh / _common.sh / lint-gate.sh — doctor names all three, sync names exec.sh and refreshes the two unedited ones — Maurits (mauritscgvisser) diff --git a/bin/doctor.sh b/bin/doctor.sh index 4601ae8d..562dc366 100755 --- a/bin/doctor.sh +++ b/bin/doctor.sh @@ -83,7 +83,18 @@ set -u # script and the repair inherits exec.sh's snapshot, mxbuild gate and restore. if [ "${2:-}" = "--property-sets-apply-step" ]; then { [ -n "${3:-}" ] && [ -x "$3" ]; } || { echo "--property-sets-apply-step: no runnable mxcli given" >&2; exit 2; } - exec "$3" fix property-sets -p "$1" + # mxcli v0.29.0+ also exits 1 while a MIXED name remains (cmd_fix_property_sets.go: "Exits 1 + # when a unit could not be repaired, when a MIXED name remains"), even when every repair it made + # landed. mxcli leaves MIXED units untouched, so that exit is not a failed repair: report 0 and + # let the gate decide, else exec.sh --patch rolls the good repairs back. FAILED still exits 1. + _psa_o="$("$3" fix property-sets -p "$1" 2>&1)"; _psa_r=$? + printf '%s\n' "$_psa_o" + if [ "$_psa_r" -eq 1 ] && printf '%s\n' "$_psa_o" | grep -q '^ MIXED ' \ + && ! printf '%s\n' "$_psa_o" | grep -qE '^ FAILED |could not be normalized'; then + echo "(exit 1 was for the MIXED name(s) above only — mxcli leaves those as they are; the repair stands)" + exit 0 + fi + exit "$_psa_r" fi TOOLKIT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" @@ -201,6 +212,10 @@ probe_runs() { # What the dry-run prints and how it exits is mxcli's cmd/mxcli/cmd_fix_property_sets.go at # v0.26.0: exit 0 = nothing to do; exit 1 = a ` NEEDS ` or ` FAILED ` row per unit, OR an # error such as "project not found" (both exit 1, so the rows decide, never the code alone). +# v0.29.0 adds ` MIXED ` rows (ako/mxcli#1505): a property name some elements of a type carry and +# others lack — Mendix's merge engine cannot compare those revisions, and mxcli leaves them alone +# (no measured value fills them). Exit 1 with only MIXED rows is result "mixed": a merge hazard +# the repair cannot clear, reported, never "could not classify" (captured 2026-10-30). # Anything else is "could not classify", never clean. Support is read from `mxcli fix --help` # listing the subcommand: `mxcli fix property-sets --help` exits 0 on v0.24/v0.25 too (cobra # prints the parent's help for an unknown subcommand), so it cannot be the probe. Golden @@ -209,7 +224,7 @@ probe_runs() { # The result is recorded in /.claude/.property-sets-receipt (machine-local, like the # doctor receipt): line 1 "