Skip to content

fix: address merged microflow review followups#408

Open
hjotha wants to merge 6 commits intomendixlabs:mainfrom
hjotha:submit/merged-pr-review-followups
Open

fix: address merged microflow review followups#408
hjotha wants to merge 6 commits intomendixlabs:mainfrom
hjotha:submit/merged-pr-review-followups

Conversation

@hjotha
Copy link
Copy Markdown
Contributor

@hjotha hjotha commented Apr 30, 2026

Summary

This PR collects follow-ups from reviews on already-merged microflow roundtrip PRs so the actionable feedback does not get lost.

Fixes:

  • Stop manual while true detection from treating continue inside a nested loop as a continue for the outer loop.
  • Mark add $Item to $List and remove $Item from $List target lists as list consumers so owner-both reverse retrieves keep the correct source form.
  • Set nanoflow return-value render context on the direct describe nanoflow path so value-returning nanoflows do not emit bare return; for empty EndEvents.

Review follow-up coverage:

  • Add writer coverage that commit actions always serialize default ErrorHandlingType.
  • Fix the EndEvent empty-return writer test to exercise the actual empty string case.
  • Add a negative regression assertion for non-empty change-object refresh inference.
  • Add download-file formatter coverage for the no-browser flag case.
  • Tighten reverse-association compact XPath name validation and make the owner-both condition explicit.
  • Document MXCLI_EXEC_TIMEOUT in the quick reference.

Closes #404.
Closes #405.
Closes #406.

Tests

  • make build
  • make test
  • make lint-go

@github-actions
Copy link
Copy Markdown

AI Code Review

Critical Issues

None found.

Moderate Issues

None found.

Minor Issues

  • In mdl/executor/cmd_microflows_builder_control.go, the comment for containsContinueForCurrentLoop says it "mirrors containsBreakForCurrentLoop" but the implementation differs slightly (it returns early for LoopStmt/WhileStmt cases while the break version doesn't). This is actually correct behavior since continues in nested loops should not propagate outward, but the comment could be clearer about why the implementations differ.

What Looks Good

Recommendation

Approve. The PR correctly implements focused bug fixes with appropriate test coverage and documentation updates. The changes are minimal, targeted, and maintain code quality standards. Minor comment clarification suggested but not blocking.


Automated review via OpenRouter (Nemotron Super 120B) — workflow source

@hjotha hjotha force-pushed the submit/merged-pr-review-followups branch from 7a08d1b to 3e8d0a6 Compare April 30, 2026 07:42
@github-actions
Copy link
Copy Markdown

AI Code Review

Critical Issues

None found.

Moderate Issues

None found.

Minor Issues

None found.

What Looks Good

Recommendation

Approve. This PR consists of well-targeted bug fixes and test improvements for previously merged microflow/nanoflow functionality. Each change addresses a specific reported issue with appropriate test coverage, and the code quality is maintained throughout. As these are follow-ups to already-merged work and don't introduce new MDL syntax, they appropriately bypass the full-stack consistency requirements for new features while still maintaining the project's standards for bug fixes and test coverage.


Automated review via OpenRouter (Nemotron Super 120B) — workflow source

hjothamendix and others added 4 commits May 2, 2026 12:00
Symptom: all open PRs against main failed the shared build-and-test job in
make test-integration, even when their local build/test/lint validation passed.
The failures reproduced on origin/main, so they were baseline CI instability
rather than PR-specific regressions.

Root cause: TestWatcherDebounce could allow stale timer callbacks to send an
extra message under slow scheduling, nanoflow integration fixtures used MDL
syntax that no longer matched the grammar, and the doctype mx-check harness did
not classify known page/nanoflow showcase consistency errors as expected
limitations.

Fix: guard watcher debounce callbacks with a generation counter, tighten the
watcher burst test, update nanoflow fixtures to current MDL syntax, and extend
the known consistency-error allowlist for showcase-only limitations.

Tests: make build
Tests: go test ./cmd/mxcli/tui -run TestWatcherDebounce -count=20 -v
Tests: ./bin/mxcli check mdl-examples/doctype-tests/02b-nanoflow-examples.mdl
Tests: go test -tags integration -count=1 -timeout 30m ./mdl/executor -run 'TestRoundtripNanoflow_(Loop|EnumParameter|Annotations)|TestMxCheck_DoctypeScripts/02b-nanoflow-examples.mdl|TestMxCheck_DoctypeScripts/03-page-examples.mdl' -v
Tests: make test
Tests: make lint-go
Tests: make test-integration
1. Manual while-true detection over-triggered when the only continue lived
   inside a nested loop. The continue scan crossed loop boundaries while the
   break scan did not, so the outer while could be rebuilt as a manual
   back-edge. Stop the continue scan at nested loops and add a regression test.

2. Owner-both reverse retrieves feeding add/remove-to-list were still treated
   as object-only consumers. The list pre-scan ignored AddToListStmt and
   RemoveFromListStmt target lists, so AssociationRetrieveSource could be
   suppressed. Track those list consumers and add coverage for the helper.

3. Direct nanoflow describe did not set the return-value render context used
   by EndEvent formatting. Thread the wrapped nanoflow return type through the
   formatter so value-returning nanoflows do not emit bare return; for empty
   EndEvents.

Also folds in low-risk review followups: commit-action writer coverage,
change-object refresh negative coverage, download-file formatter coverage,
reverse-retrieve name validation tightening, and documentation for
MXCLI_EXEC_TIMEOUT.

Tests: make build
Tests: make test
Tests: make lint-go

Closes mendixlabs#404.
Closes mendixlabs#405.
Closes mendixlabs#406.
formatAction emitted `$Var = call microflow/nanoflow/java/javascript/external`
whenever the action's ResultVariableName/OutputVariableName was
non-empty, ignoring UseReturnVariable. Studio Pro stores the
variable name as a UI fallback even when UseReturnVariable=false
(the action discards its return), so re-exec of described MDL
introduced phantom output variable declarations.

Symptom: microflows with two call actions pointing at the same
sub-microflow/Java action, both with UseReturnVariable=false but
both carrying the same ResultVariableName, round-tripped as two
declarations of the same output variable, triggering CE0111
"Duplicate variable name" in Studio Pro.

Fix: emit the `$Var = ` prefix only when UseReturnVariable is true.
Applies to MicroflowCallAction, NanoflowCallAction, JavaActionCallAction,
JavaScriptActionCallAction, and CallExternalAction.

Existing tests that relied on the old behavior now set UseReturnVariable
explicitly — they were exercising the wrong BSON shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hjotha hjotha force-pushed the submit/merged-pr-review-followups branch from 23019b5 to 22b7936 Compare May 2, 2026 10:04
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 2, 2026

AI Code Review

Critical Issues

None found.

Moderate Issues

None found.

Minor Issues

  • In mdl/executor/roundtrip_nanoflow_test.go, the parameter type notation was changed from ($Color: + testModule + .NfColor) to ($Color: Enum + testModule + .NfColor). Parameters in MDL don't use the : Enum syntax - this should likely be just ($Color: + testModule + .NfColor) or if it's specifically testing enum parameters, it should follow the correct MDL syntax for enum parameters (which would still not include the word "Enum" in the type annotation).

  • The doctype test file mdl-examples/doctype-tests/02b-nanoflow-examples.mdl was significantly simplified, removing many examples that demonstrated important nanoflow features. While streamlining tests can be good, we should ensure essential nanoflow features are still covered. The current version covers basics but misses some intermediate patterns.

What Looks Good

  • The watcher debounce fix using sync/atomic properly addresses potential race conditions in rapid file change scenarios.
  • The manual while true detection fix correctly handles nested loops by distinguishing continues in inner vs outer loops.
  • The list consumer marking for add/remove statements properly tracks target lists as inputs, fixing the owner-both reverse retrieve issue.
  • The nanoflow describe context fix ensures return-value nanoflows don't emit bare return; statements.
  • Test coverage is improved with new test files for the specific bugs fixed (Manual while-true detection over-triggers when continue lives only inside nested loop body #404, Reverse retrieve incorrectly classified when output feeds add/remove-from-list statements #405) and enhanced existing tests.
  • Documentation for MXCLI_EXEC_TIMEOUT was added to the quick reference as requested.
  • The commit action test verifies the default ErrorHandlingType is properly serialized.
  • The download-file test covers the no-browser flag case.
  • XPath validation was tightened to reject more invalid patterns.
  • All changes are focused, well-tested, and address specific issues identified in previous review cycles.

Recommendation

Approve with minor noted issues (the parameter type syntax in the nanoflow test should be corrected). The PR successfully addresses the review follow-ups from merged microflow roundtrip PRs and improves test coverage and robustness.


Automated review via OpenRouter (Nemotron Super 120B) — workflow source

@hjotha
Copy link
Copy Markdown
Contributor Author

hjotha commented May 2, 2026

CI stabilization note: merged #412 into this branch so it uses the same integration-CI baseline as the rest of the active PR set.

Symptom: CI failed in TestMxCheck_DoctypeScripts/empty_java_action_argument.mdl because a Java action declared as RETURNS Void was written as an entity return type named .void, and Studio Pro reported CE1613.

Root cause: the generic data-type visitor treats bare qualified names as entity/enumeration references. Java action return types reused that generic path, so the explicit Void spelling became a qualified name instead of ast.TypeVoid.

Fix: add a Java-action return-type wrapper that maps unqualified Void to ast.TypeVoid while leaving generic data-type parsing unchanged for parameters and attributes.

Tests: added visitor coverage for explicit RETURNS Void; verified mxcli check for the doctype fixture and the targeted integration subtest that failed in GitHub Actions.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 2, 2026

AI Code Review

Review Summary

Critical Issues

None found.

Moderate Issues

None found.

Minor Issues

None found.

What Looks Good

Recommendation

Approve - The PR consists of well-targeted bug fixes with appropriate test coverage and documentation updates. All changes are minor improvements that address specific issues without introducing new functionality or breaking existing patterns. The PR successfully resolves the stated follow-up items from merged microflow PRs.


Automated review via OpenRouter (Nemotron Super 120B) — workflow source

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants