Skip to content

docs(wiki): digest the cmd/mxcli findings into five bug-pattern pages - #357

Merged
ako merged 1 commit into
docs/bug-patterns-executorfrom
docs/bug-patterns-cmd-mxcli
Sep 1, 2026
Merged

docs(wiki): digest the cmd/mxcli findings into five bug-pattern pages#357
ako merged 1 commit into
docs/bug-patterns-executorfrom
docs/bug-patterns-cmd-mxcli

Conversation

@ako

@ako ako commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Stacked on #356 (shared seed table and SYNC_LOG.md) — retarget to main once that merges.

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.

page findings thesis
test-runner-cannot-fail 14 mxcli test reporting PASS for what did not hold, run, or get evaluated
local-loop-silence 16 the thing that breaks is not the thing that reports
styling-compiles-to-nothing 11 nothing validates CSS
package-operations-damage 11 handing the project to tools mxcli does not control, and being told it went fine
cli-contract-defects 14 the class with no Mendix document in it

The 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 = 2 passed. @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-assertions exited 0 on a suite where nothing asserted. A test with both @throws and @expect reported 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 — --list printed 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-nothing and rewrite-drops-unauthored-state turn 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 as skipped forever after.

Contract

Per maintain-wiki.md: title / category / last-synced / sources on every page, a Do not duplicate guardrail, concept-first prose. Every sources: path and every [[wiki-link]] verified before committing. Seed table extended by five rows; five rows appended to SYNC_LOG.md.

Where the digest stands

area findings covered
mdl/executor 248 83%
cmd/mxcli 95 92%
mdl/backend 83
mdl/grammar 53
mdl/visitor 28

🤖 Generated with Claude Code

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>
@ako
ako merged commit bcdcbeb into docs/bug-patterns-executor Sep 1, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant