Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
610ccc9
fix(executor): a flow's call to itself resolves to the statement (#843)
ako Sep 30, 2026
c777e60
fix(mfmutator): add a stated nanoflow return variable the stored docu…
ako Sep 30, 2026
7aa06b2
fix(visitor): `date` is a deprecated alias of DateTime again, fmt --u…
ako Sep 30, 2026
6e24689
feat(upgrade): fmt --upgrade -p pins a stored commit's `without event…
ako Sep 30, 2026
2a444f5
fix(security): a revoke+grant run that nets to nothing writes nothing…
ako Sep 30, 2026
bfc099c
docs: #872 grant runs are judged by their net result — changelog, int…
ako Sep 30, 2026
f4988d7
fix(flow-modify): create or modify can change an activity's notes (#859)
ako Sep 30, 2026
ad54c40
fix(flow-modify): a bare on error rollback matches its stored activit…
ako Sep 30, 2026
4f2ab8a
test(flow-modify): re-annotation, rollback and PedApp nanoflows under…
ako Sep 30, 2026
efe220c
docs: #859 notes and rollback in create or modify — changelog, findin…
ako Sep 30, 2026
ae406d6
fix(describe): print a Show Page title override (#869)
ako Sep 30, 2026
9a47fdf
fix(flow): a call web service re-run writes nothing (#861)
ako Sep 30, 2026
dba9090
fix(xpath): a module-qualified attribute is stored as the attribute (…
ako Sep 30, 2026
cbd240a
test(modelsdk): a SOAP call without the writer's keys keeps its raw f…
ako Sep 30, 2026
f415ad1
fix(executor): a grant run whose flush fails after a failed statement…
ako Sep 30, 2026
247874e
Merge pull request #884 from mendixlabs/main
ako Sep 30, 2026
a16fa40
fix(xpath): an unplaced three-part name no longer fails silently (#874)
ako Sep 30, 2026
2d47f3d
test(flow-modify): cover the drop path of #859 notes — an annotated a…
ako Sep 30, 2026
d71b3a8
Merge remote-tracking branch 'origin/main' into c14-882
ako Sep 30, 2026
b4d3ba5
Merge branch 'c14-882' into c14-881
ako Sep 30, 2026
58e128b
Merge branch 'c14-881' into c14-878
ako Sep 30, 2026
2ffda76
Merge branch 'c14-878' into c14-879
ako Sep 30, 2026
1175bcc
Merge branch 'c14-879' into c14-880
ako Sep 30, 2026
e2010a1
Merge branch 'c14-880' into c14-883
ako Sep 30, 2026
b6fe887
Merge pull request #882 from ako/fix/xpath-qualified-attr-viewentity-…
ako Sep 30, 2026
c779cec
Merge pull request #881 from ako/fix/security-view-entity-idempotency
ako Sep 30, 2026
7e34d67
Merge pull request #878 from ako/fix/upgrade-date-alias-commit-pin
ako Sep 30, 2026
52f9160
Merge pull request #879 from ako/fix/843-recursive-and-nanoflow-retur…
ako Sep 30, 2026
394e68b
Merge pull request #880 from ako/fix/869-861-describe-title-webservice
ako Sep 30, 2026
33d4df5
Merge pull request #883 from ako/fix/859-annotations-strings-rollback
ako Sep 30, 2026
6316614
fix(flow-modify): a spliced member is written qualified — bare names …
ako Oct 1, 2026
c2ea31d
Merge pull request #891 from ako/fix/885-splice-change-qualified-members
ako Oct 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .claude/skills/fix-issue/findings/mdl-backend.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,4 @@
{"area": "mdl/backend", "date": "2026-09-29", "symptom": "ALTER ASSOCIATION / CREATE OR MODIFY ASSOCIATION / RENAME / mxcli layout on a Studio Pro module turns every API-exported entity in the module Hidden and rewrites every entity's access rules (50 of 93 elements in TestApp WorkflowCommons changed for a no-op write); ALTER ENTITY and MOVE ENTITY reset the target's (and its attributes') export level the same way. mx check stays clean (#801)", "cause": "entityToGen / attributeToGen / assocToGen SET ExportLevel \"Hidden\", and a property the rebuild sets is dirty and wins over the carried raw bytes; UpdateDomainModel rebuilt every entity and association, not only the one named. Member-access writers set only the reference in use, while Studio Pro writes both Attribute and Association keys (the unused one as \"\"), so every rebuilt rule differed from its stored self", "file": "mdl/backend/modelsdk/domainmodel_carry.go", "fix": "UpdateDomainModel passes an entity/association through as its stored element when the semantic model equals the stored one read back (entityUnchanged/assocUnchanged, ID- and nil/empty-insensitive semanticEqual). Rebuilds of existing entities (UpdateEntity, UpdateDomainModel, MoveEntity) go through carryStoredEntity: raw + child identity + stored ExportLevel (entity and carried attributes) + unchanged access rules substituted by the stored element, changed ones keep $ID/caption/documentation. carryStoredAssociation: raw + ExportLevel + unchanged delete behaviour. DomainModels$MemberAccess registers EmptyStringFields Attribute/Association", "insight": "A raw carry only preserves what the converter does NOT set; every constant a converter writes (here ExportLevel \"Hidden\") is still reset on the carried element, so audit the converter's Set* constants, not only unmodelled keys. The whole-list rebuild shape needs an 'unchanged -> pass the stored element' short-circuit or its blast radius is the unit. Invisible on mxcli-authored content, where the stored value IS the constant: TestApp is the only fixture with API entities (WorkflowCommons) and has no API attribute, so the attribute case was set up on top of it. The roundtrip harness had 87 getput entries (#721 B and TestApp associations) that were this bug", "refs": ["ako/mxcli#801", "ako/mxcli#721"], "test": "TestIssue801_UpdateDomainModelChangesOnlyTheAlteredElement, TestIssue801_OtherEntityRebuildsKeepExportLevel"}
{"area": "mdl/backend", "date": "2026-09-29", "symptom": "describe -> exec, CREATE OR MODIFY or an ALTER that rebuilds the document turns an API-exported document Hidden: enumerations, pages, layouts, rules, view-entity OQL source documents, import/export mappings, JSON structures, published and consumed REST services, scheduled events, workflows, database connections, business event services, data transformers, queues, regular expressions and agent-editor documents. The run reports success, mx check is clean; the module's public surface silently shrinks. A workflow's own `export level API` clause was a no-op on create and on rewrite.", "cause": "Each rewrite converter builds a fresh document and writes ExportLevel as a constant (\"Hidden\"), or passes the semantic model's value where the executor itself filled in \"Hidden\" (mappings, database connection, business events), and the unit is replaced wholesale. MDL has no export-level spelling for most of these kinds, so describe cannot print it and the executed script cannot restore it. workflowToGen ignored wf.ExportLevel entirely. The round-trip harness could not see it: every document in TestApp and PedApp is Hidden, the constant itself.", "file": "mdl/backend/modelsdk/export_level_carry.go", "fix": "One byte-level carry, keepStoredExportLevel(unitID, contents): replaces only the top-level ExportLevel element of the freshly encoded rewrite with the stored value, copying every other element verbatim, and never adds the key. Wired into every Update path that writes ExportLevel (UpdateEnumeration/Rule/Layout/ImportMapping/ExportMapping/JsonStructure/PublishedRestService/ConsumedRestService/DataTransformer/DatabaseConnection/BusinessEventService, writeCustomBlob update, WriteViewEntitySourceDocument update; page via carryStoredPageHeader). Kinds with an MDL spelling (workflow, scheduled event, queue, regular expression) use keepStoredExportLevelUnlessSet: an authored level wins. workflowToGen now writes orDefault(wf.ExportLevel, \"Hidden\").", "insight": "A fixture-driven round trip is blind to any constant that happens to equal every fixture value: 775 TestApp documents round-tripped while 10 kinds hid API documents. Set the subject to the non-default value first (here: patch ExportLevel to API on the working copy) and run both the plain describe output and an edited one, because an elided unchanged write passes a converter that still writes the constant. Carrying at the encoded-bytes level covers gen-typed, newElem-built and hand-serialized writers with one helper, where a gen setter per converter would have needed three mechanisms.", "refs": ["ako/mxcli#816", "ako/mxcli#801", "ako/mxcli#812"], "test": "mdl/backend/modelsdk/issue816_export_level_test.go (TestUpdatePaths_KeepStoredExportLevel, 18 kinds); mdl/roundtrip/export_level_test.go (TestTestAppExportLevelSurvivesRoundTrip, -tags integration)"}
{"date": "2026-09-30", "area": "mdl/backend", "symptom": "ako/mxcli#859 review of PR #864: after the built comparison landed, changing or adding `show page M.P with title = 'X'` in a `create or modify microflow` reported \"Unchanged microflow\" and wrote nothing, under mdl 0 and mdl 1 (main spliced it). Nothing warned.", "cause": "builtAsStored compares the declared flow and the stored flow both READ BACK through the codec, so any property the reader drops compares equal whatever either side holds. The ShowFormAction reader never read FormSettings.TitleOverride. Probing encode(built) against encode(readback(built)) over mdl-examples found the reader also dropped ExclusiveSplit/LoopedActivity ErrorHandlingType and a REST call's bound output variable (ResultHandling.ResultVariableName -> RestCallAction.OutputVariable), plus CallWebServiceAction (#861). Before the built comparison such a loss was a visible phantom re-splice; after it, a silently dropped edit.", "fix": "ReadBackMicroflow/ReadBackNanoflow re-encode what they read back and refuse (error -> statement diff, the pre-#859 path) when it is not the document first written, $IDs aside (sameWritten). The reader now reads TitleOverride, the split's and loop's ErrorHandlingType, and a bound REST call's OutputVariable, so those flows keep matching.", "insight": "A comparison made on both sides through the same lossy reader cannot see what the reader loses; the lost property becomes a change that is never written. When equality is decided after a decode, prove the decode lossless for the value at hand (write it again and compare bytes) and fall back when it is not. The probe that found the fields: diff encode(x) with encode(decode(encode(x))) over every mdl-examples flow.", "issue": "ako/mxcli#859", "file": "mdl/backend/modelsdk/microflow_readback.go, mdl/backend/modelsdk/microflow_read_actions.go, mdl/backend/modelsdk/microflow.go, mdl/roundtrip/flow_idempotent_shapes_test.go"}
{"date": "2026-09-30", "area": "mdl/backend", "symptom": "ako/mxcli#843 (rehearsal M2): under mdl 1, `create or modify nanoflow … returns Boolean as $Done` over a nanoflow stored without a return variable refuses \"the stored document has no ReturnVariableName property … set it in Studio Pro\"; the same statement on a microflow reports \"set: ReturnVariableName\".", "cause": "mfmutator.SetHeader refuses any stated header key the stored document lacks (a key the project version does not declare makes the document unopenable). mxcli's nanoflow writer omits ReturnVariableName when the statement has no `as $Var`, while the microflow writer always writes it on 10+, so only nanoflows hit the refusal.", "fix": "Optional mfmutator.PropertyDeclarer on Deps; the codec deps answer from the metamodel version data (type, then Microflows$MicroflowBase; ReturnVariableName is 10.12+) against the project version, and SetHeader inserts the key after its predecessor in the encoder's order. No answer (MCP, unknown version) keeps the refusal.", "insight": "A refusal keyed on 'the stored document lacks the key' conflates 'this version has no such property' with 'the writer left it out'; the metamodel version data separates the two. Studio Pro 11 stores ReturnVariableName on every nanoflow (PedApp: 13 of 13), so adding it matches what Studio Pro writes.", "issue": "ako/mxcli#843", "file": "mdl/backend/mfmutator/header.go"}
Loading
Loading