docs(wiki): digest the cmd/mxcli findings into five bug-pattern pages - #357
Merged
Merged
Conversation
87 of the 95 cmd/mxcli findings (92%) now belong to a named class. This is the tooling surface rather than the model, and the classes look nothing like the executor's. - test-runner-cannot-fail (14). The one class whose cost is confidence rather than debugging time. `@expect 1 = 2` passed; `@verify` was parsed and read by nothing but --list; --require-assertions exited 0 on a suite that asserted nothing. The mechanism is silent ABSENCE — an annotation parsed into a field no consumer reads — amplified by two result-assembly paths. The remedies that held are structural: fail closed on an annotation that cannot be honoured, one constructor and one pre-run verdict function, each pinned to a single call site. - local-loop-silence (16). The warm loop orchestrates mxbuild, a JVM, a bundler, PostgreSQL and a browser, so the thing that breaks is not the thing that reports: a missing client bundle answers HTTP 200, a dead runtime leaves the CLI spinning, and the log being captured is not the log the user needs. - styling-compiles-to-nothing (11). Nothing validates CSS. Location decides whether SCSS compiles at all, an unrecognised token is indistinguishable from a design never applied, and contrast is a correctness property no check measures. - package-operations-damage (11). Handing the project to tools mxcli does not control, and being told it went fine — the MPR v2 to v1 collapse reporting 0 errors is the worst of them. - cli-contract-defects (14). The class with no Mendix document in it. It matters disproportionately because agents take the tool's word: help that teaches unparseable syntax, an unqualified "Check passed!" that resolved nothing, a flag that parses and does nothing. Every sources: path and [[wiki-link]] verified before committing. Seed table extended and five rows appended to SYNC_LOG.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 1, 2026
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.
Stacked on #356 (shared seed table and
SYNC_LOG.md) — retarget tomainonce that merges.87 of the 95
cmd/mxclifindings (92%) now belong to a named class. This is the tooling surface rather than the model, and the classes look nothing like the executor's.mxcli testreporting PASS for what did not hold, run, or get evaluatedThe one that deserves its own paragraph
A test runner that cannot fail is worse than no test runner, because a real suite gets written against it and believed.
@expect 1 = 2passed.@verify— the annotation covering the harder half of Mendix testing, where a microflow's only observable effect is rows written — was parsed and read by nothing but--list.--require-assertionsexited 0 on a suite where nothing asserted. A test with both@throwsand@expectreported two assertions and made one.Every other class in this wiki costs a debugging session. This one spends confidence that was never earned.
The mechanism is silent absence, not silent breakage: an annotation parsed into a struct field that no consumer reads.
grep -n '\.Verify'over the package was the whole diagnosis, and the parse succeeding is what made it invisible —--listprinted the annotation back, so the feature looked wired. Amplified by two result-assembly paths (after-startup runner and HTTP endpoint), which is [[duplicate-resolver-drift]] landing where its consequence is a false pass.The remedies that held are structural: fail closed (an annotation that claims to assert and cannot be honoured is an error, and the test does not run), one constructor and one pre-run verdict function, each pinned by a test asserting it is the only call site.
Cross-area link
styling-compiles-to-nothingandrewrite-drops-unauthored-stateturn out to be the same guard in two materials — the theme writer fences a digest-marked region in files the project owns and refuses a block a human edited, which is ADR-0005's guard-don't-drop applied to files instead of BSON. Its failure mode is the mirror image: a project that has silently taken ownership of a file, reported asskippedforever after.Contract
Per
maintain-wiki.md:title/category/last-synced/sourceson every page, a Do not duplicate guardrail, concept-first prose. Everysources:path and every[[wiki-link]]verified before committing. Seed table extended by five rows; five rows appended toSYNC_LOG.md.Where the digest stands
mdl/executorcmd/mxclimdl/backendmdl/grammarmdl/visitor🤖 Generated with Claude Code