Repository navigation
Conversation
…udio Pro canvas A flow can build, pass its tests and still be unreadable in Studio Pro: labels on top of each other, a note line leaving the side that faces away, a decision whose true branch answers "no". mxbuild, check and lint see none of it. - project-bin/mf-canvas-facts.py prints the facts (OVERLAP, LINE, NOTE-SIDE, LEFTWARD, TURN, CAPTION, SENSE), read-only, exit 2 when a flow could not be read. Calibration is from Studio Pro 10.24, not verified on Studio Pro 11. - verify-module.sh runs it per module as an info rung (1c, 14-canvas-facts.log). - install manifest, fixture test on a model mxcli v0.27.0 wrote, V8 in test-verify-module-446.sh, CHANGELOG.
Owner
|
Thanks @saingge, this is a strong instrument. The review found one blocking issue: the "never a gate" rung could still turn a module's verdict INCOMPLETE when Python or the Generated by Claude Code |
MendixMau
added a commit
that referenced
this pull request
Oct 23, 2026
…udio Pro canvas (#551, from #534) project-bin/mf-canvas-facts.py reads microflow and nanoflow units through mxpatch.py and prints one line per readability fact (OVERLAP, LINE, NOTE-SIDE, LEFTWARD, TURN, CAPTION, SENSE); facts, not verdicts, read-only. verify-module.sh runs it per module as an informational rung (1c, 14-canvas-facts.log). Golden input is a captured mxcli v0.27.0 model; field run read 1,588 flows on one Mendix 10.24 app. Calibration from Studio Pro 10.24, not verified on 11. Contributed by @saingge in #534. Review fixes on top: the rung now never gates (kind=note; a missing script, Python or .mpr, an exit 2 or a timeout is an INFO "NOT MEASURED" row and leaves FAULTED alone, pinned by two new V8 cases); citations of the not-yet-existing skills/canvas-readability.md point at the script header; CHANGELOG and the install-manifest comment match. install-manifest keeps both mf-canvas-facts.py and model-scope.py. Review: MERGE-AFTER-FIX — the one blocking finding (an "info" rung that could flip a module verdict to INCOMPLETE) fixed and independently re-reviewed. Security review: safe. Co-authored-by: saingge <262679532+saingge@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Branch
new/canvas-facts, one commit (3edf954) on origin/master 393d253. Lane 3 (direct). First of a stack of three: this PR, thenlearn/canvas-readability(the skill that judges the facts), thenfix/canvas-note-sides(a repair for one fact). Merge in that order.What changed and why
A microflow can build, pass its tests and still be hard to read in Studio Pro: labels on top of each other, a line through an object, a note line that leaves the side facing away from its object, a decision whose true branch answers "no" to its caption. mxbuild,
mxcli checkand lint see none of it.project-bin/mf-canvas-facts.pyreads the microflow and nanoflow units throughmxpatch.py(the toolkit's one BSON reader), draws the boxes, labels, notes and lines the way Studio Pro does, and prints one line per fact: OVERLAP, LINE, NOTE-SIDE, LEFTWARD, TURN, CAPTION, SENSE. It prints facts, not verdicts, and writes nothing. Exit 0 measured, exit 2 could not measure (a named flow that is not there, a unit that does not decode, no model); the flows that did decode are still printed.verify-module.shruns it per module as an information rung (step 1c, log14-canvas-facts.log; master's steps are 0, 0b, 1, 1b and 2 onward, and the logs 09-13, 20-21, 30, 39, 40, 50, 51, so neither collides). A missing script or.mpris a FAULT row that says to runbin/sync-project.sh, never a skip.mf-canvas-facts.pygoes inMXTK_PROJECT_BIN.Calibration (label width about 5.5 units per character, 3 caption lines of about 16 characters on an activity, 2 lines of about 10 on a decision, the side numbering of notes and objects) is from Studio Pro 10.24 screenshots and stored models. It is not verified on Studio Pro 11. The script header says so.
Size: one counted file is the instrument, 391 lines, with its 89-line test; the whole PR is 5 counted files and 517 lines against the 400-line cap. It cannot be split further: a script without its fixture breaks field-proof rule 1, and the verify-module rung is 17 lines that exist only to run it. The judging skill is the next PR in the stack.
Impact
verify-module.sh. It never gates (kindinfo; its exit 2 lands in FAULT like any instrument that could not run). No new human step, no new stage artifact.project-bin/verify-module.sh,bin/lib/install-manifest.sh,CHANGELOG.md. The rung readsmf-canvas-facts.py(this PR),mxpatch.pyandmxunit_bson.py(both already on master) and the project's.mpr(found byfind_mpr, as the catalog step already does). Python viaresolve_py. The routing row and the skill the script header points to are the next PR in the stack. This stack and the model-scope stack both add a line tobin/lib/install-manifest.sh(the sameMXTK_PROJECT_BINlist); whichever merges second keeps both lines.bin/render-routing.sh --checkon base and head: both "Baseline: 75510 words (budget 80000)", every stage line identical.Field evidence
Re-measured 2026-10-21, read-only, by running this script over the app's model at the project commit before its note-line repairs (a
git archivecopy, so nothing in the project was touched). One Mendix 10.24 app, 1,588 flows read in one pass: 36 added or changed by an mxcli-built branch in one module, 1,548 drawn by hand in Studio Pro, 4 touched by the branch elsewhere (in neither group). On the 36: OVERLAP 19, LINE 27, NOTE-SIDE 17, LEFTWARD 3, TURN 4, SENSE 9, CAPTION 148. At the end of the branch, after its repair commits: OVERLAP 3, LINE 7, TURN 4, CAPTION 113, the rest 0. The earlier figures in the commit message (LINE 9, NOTE-SIDE 0) did not reproduce and are replaced. These are one app's counts; the judging skill in the next PR labels them that way.The polarity word list for SENSE had
\bun[a-z]+, which also matched "unit", "unique", "under", "until" and "union", so a caption containing one was read as already negated and SENSE stayed quiet. It is now an explicit set of un- words with a negative sense (unable, unassigned, unavailable, unchanged, unchecked, undefined, unfilled, unfinished, unknown, unmatched, unpaid, unread, unready, unresolved, unsaved, unselected, unsent, unset, unused, unvalidated, unverified). An unlisted un- word now errs towards printing a SENSE prompt, not towards hiding one. The fixture's word-list case gained "Unit found?", "Unique?", "Under limit?" and "Until done?" (must not read as negated) and "Unknown?", "Unsaved?", "Unset?" (must). Positive control: the new case fails (13 of 14) against the previous script. SENSE recount on the same archive: the 36 mxcli-written flows still 9 hits (all real, unchanged); the hand-drawn flows 15 hits became 18, the 3 new ones all being uniqueness captions ("Unique?") over an= emptytest of an existing-record variable, all fine (empty means unique). Every other fact count in the app is unchanged.Checklist
LEAKGUARD_BASE=origin/master, then a read of every added line).test-mf-canvas-facts.sh(new) andtest-verify-module-446.sh(changed, V8 added). T2 is the field run above..mprdump thatmxcli v0.27.0 exec capture-canvas.mdlproduced on a copy of the toolkit's public mxpatch model (fixtures/canvas-facts/CAPTURE.txt). Each fact has a negative control in the same model. The three goldenverify-446/*.summary.tsvwere regenerated by the fixture's ownCAPTURE=mode and gain one INFO row each..mpr, its directory ormprcontents/; the fixture runs the first and the last. The rung passes whateverfind_mprreturns, which is the existing path for single-tree andapp/checkouts. The fixture project is the single-tree shape only.bin/check-portability.shis clean. Not run under Git Bash.CHANGELOG.mdline under## Unreleased, credited.Verification
Run in a worktree at the branch head, macOS, mxcli v0.27.0 was used only to capture the fixture.