Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e87f935
Merge pull request #496 from ako/claude/gracious-planck-3h1lwi
ako Sep 17, 2026
48421a1
fix(microflows): carry the deep-link URL across a rewrite (#1120)
claude Sep 17, 2026
2ee8d83
Align default agent behaviour with the bootstrap procedure
claude Sep 17, 2026
e60dcf1
fix(run-local): start mxbuild --serve from the resolved binary, not t…
claude Sep 17, 2026
4992ee9
fix(run): register --mxbuild-path on run, as its own errors advertise
claude Sep 17, 2026
18306e5
fix(microflows): carry the export level across a rewrite (#1120 follo…
claude Sep 17, 2026
15825d0
fix(versions): page parameters are 9.4, not 11.0
claude Sep 17, 2026
b1860eb
fix(catalog): emit a publish edge from a published REST operation
claude Sep 17, 2026
60af71d
catalog: index entity event handlers and emit the `event` reference edge
claude Sep 17, 2026
29cc3c0
fix(microflows): carry the concurrency settings across a rewrite (#11…
claude Sep 17, 2026
a82e40a
catalog: pin the stored spelling of the rollback event
claude Sep 17, 2026
608e4c1
test(microflows): verify the carries end to end against mxbuild 11.6.6
claude Sep 17, 2026
ae6fb39
fix(run-local): support classic-client apps (OptimizedClient = No)
claude Sep 17, 2026
0c576e6
fix(setup): resolve Mendix 9/10 versions to their CDN build number
claude Sep 17, 2026
80a11fe
Merge pull request #497 from ako/claude/confident-hawking-40n69f
ako Sep 17, 2026
de68728
Merge pull request #498 from ako/claude/nice-goodall-ft9xwr
ako Sep 17, 2026
241b7b2
Merge pull request #499 from ako/claude/issue-1127-bnxk4q
ako Sep 17, 2026
2268471
Merge remote-tracking branch 'origin/main' into claude/clever-edison-…
claude Sep 17, 2026
8effd2e
Merge pull request #500 from ako/claude/clever-edison-axloot
ako Sep 17, 2026
c1e2103
Merge pull request #501 from ako/claude/compassionate-ramanujan-tr79mp
ako Sep 17, 2026
9564e72
Merge branch 'main' into claude/stoic-cerf-fwe8s4
ako Sep 17, 2026
94566e5
Merge pull request #502 from ako/claude/stoic-cerf-fwe8s4
ako Sep 17, 2026
ad9c8ef
Merge branch 'mendixlabs:main' into main
ako Sep 17, 2026
1db507c
docs(skills): route fix-issue, and add the two rules #1121 paid for
claude Sep 17, 2026
5351edc
docs(skills): sweep sdk/mpr out of the instructional layer
claude Sep 17, 2026
b108b19
Merge pull request #504 from ako/claude/compassionate-ramanujan-tr79mp
ako Sep 17, 2026
aa6b0b3
Merge branch 'main' into main
ako Sep 17, 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
88 changes: 88 additions & 0 deletions .claude/commands/mxcli-dev/fix-issue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
description: Diagnose and fix a reported bug, with the evidence bar the PR checklist expects
---

# /mxcli-dev:fix-issue — Fix a Reported Bug

Work a bug report end to end: match it against what has already been seen, fix it,
and prove the fix with evidence a reviewer can check.

Read [`.claude/skills/fix-issue.md`](../../skills/fix-issue.md) first — it holds the
findings-lookup mechanics and the two rules that are easiest to skip. This command
is the order to do things in.

`$ARGUMENTS` is the issue number or a description of the symptom.

## Steps

1. **Read the issue in full**, including comments. Quote the reported symptom
verbatim somewhere — it is what the test has to reproduce, and paraphrasing it
is how a fix ends up addressing a different bug.

2. **Match the failure class**, then the instance:
- `docs-wiki/bug-patterns/` for the class (small, read it)
- `grep -il '<CE code or keyword>' .claude/skills/fix-issue/findings/*.jsonl`
for the instance

A pattern-page miss means "not yet digested", never "not seen before".

3. **Establish the version facts before theorising**, if the report involves one.
The arbiter for a metamodel property is the Mendix Model SDK's own
`StructureVersionInfo` (`npm pack mendixmodelsdk`, then grep `src/gen/*.js` for
the type) — not release notes, and not a number already written down in this
repo. mendixlabs/mxcli#1121 was a floor copied from a proposal's illustrative
sample output that nobody had ever measured.

4. **Write the failing test first**, at the layer the symptom lives in. Table of
layer → package is in the skill.

5. **Prove the test detects the bug.** Revert the fix, or stub the guard, and
confirm it fails *with the reported symptom*. Put the control's output in the PR.
A test that has only ever run against fixed code has not been shown to detect
anything.

6. **Run the real thing when the argument calls for it.** Required when the fix's
justification asserts what a Mendix tool accepts or rejects — a version guard, a
refusal, anything resting on "mxbuild would catch this". Also when the symptom is
a property of the running app (`verify-in-runtime.md`). Cheapest form:

```bash
mxcli new <Name> --version <full version> --theme none --layout none --skip-init
mxcli exec <repro>.mdl -p <Name>.mpr
mxcli docker check -p <Name>.mpr # and again with the fault forced back in
mxcli run --local -p <Name>.mpr # when it has to render
```

Build **two** copies — fixed, and with the fault forced back in — or the run
tells you nothing you did not already believe.

7. **Add the regression case**: `mdl-examples/bug-tests/<issue>-<description>.mdl`,
and check it parses (`mxcli check`) and passes `make check-mdl`.

8. **Append one finding** to `.claude/skills/fix-issue/findings/<area>.jsonl` and run
`make check-findings`. Write the insight — what would have made this cheaper to
find, and which plausible wrong turn to skip — not the changelog.

9. `make build && make test && make lint`, then commit.

## Before you say it cannot be verified

That claim ends the investigation, so it needs the evidence a fix would. State what
a positive result would look like; try the case you are sure works as a control; try
a different *shape* of query rather than another value. Then, if it still holds, say
it with the evidence attached rather than as a property of the environment.

On #1121 the claim was "Mendix 10 is not downloadable here", from a dozen uniform
404s with 11.x succeeding on the same host. It was wrong — Mendix 9 and 10 publish
four-part names with a build number — and a uniform negative across a whole class
was the tell that the query, not the class, was at fault.

## Done when

- [ ] Reported symptom reproduced by a test before the fix existed
- [ ] Control run recorded (reverted fix → test fails with that symptom)
- [ ] Full run done, with both variants, if the argument asserts what a tool accepts
- [ ] Any "cannot verify" claim carries its evidence and a falsifying control
- [ ] Bug-test MDL committed; `make check-mdl` passes
- [ ] Finding appended; `make check-findings` passes
- [ ] `make build && make test && make lint` pass
4 changes: 2 additions & 2 deletions .claude/commands/mxcli-dev/proposal.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Ask the user:

If the user isn't sure about version or BSON, help them find out:
- Version: check `reference/mendixmodellib/reflection-data/` or Mendix release notes
- BSON: check if similar features exist in `sdk/mpr/parser*.go` or `sdk/mpr/writer*.go`
- BSON: check if similar features exist in `mdl/backend/modelsdk/*_read.go` or `*_write.go`

### Phase 2: BSON Investigation (if applicable)

Expand Down Expand Up @@ -69,7 +69,7 @@ Before writing the proposal, search for existing work:
ls docs/11-proposals/ | grep -i <feature>

# Existing implementations
grep -r "<feature>" mdl/executor/ sdk/mpr/ --include="*.go" -l
grep -r "<feature>" mdl/executor/ mdl/backend/modelsdk/ --include="*.go" -l

# Existing test coverage
ls mdl-examples/doctype-tests/ | grep -i <feature>
Expand Down
2 changes: 2 additions & 0 deletions .claude/commands/mxcli-dev/review.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ proactively. Add a row after every review that surfaces something new.
| 21 | A registry that reads only one source (an `embed.FS`) has no extension point, so the only way to customise its output is to hand-edit the generated block — which a digest fence then refuses to touch on the next run. The feature ends up hostile to the exact case it was built for | API design | When a guard refuses a user's edit, ask whether the thing being edited should have been authorable. Introduce a source abstraction (`fs.FS` + root) and let a project-local directory shadow the embedded set — the walk functions usually already take a root, so the change is contained |
| 22 | A test helper that expands a template cross-products every list against every reference (e.g. every `@each $weight` list against every `url()`), inventing artefacts no asset ever shipped and failing on correct input | Test coverage | Scan positionally: a reference must be expanded against the loop it actually sits under. Prove the helper both fires on a real break (delete one shipped file) and stays quiet on correct input — a helper only checked against green code has not been shown to detect anything |
| 23 | A copy-to-scaffold path renames files but not the identifiers built from the name (`@mixin mxcli-<name>-<alt>`, `@import "mxcli-<name>"`), so two artefacts collide the moment both exist — and the symptom is a rule that silently compiles to nothing | Code correctness | Assert the structural contract on the *generated* artefact, not just the shipped ones: factor the built-in's contract test into a helper and run the scaffold through it. Verify once end to end against the real toolchain and record it |
| 24 | A skill or command still instructs work into a package the repo has deleted (`sdk/mpr` test locations, a symptom table moved to `findings/*.jsonl` years prior) — the doc reads as authoritative and every instruction in it is a compile error or a no-op | Docs quality | When a package is deleted or a doc is restructured, grep `.claude/` for its name in the same PR. A deletion that leaves the guidance behind is worse than no guidance, because the reader trusts it |
| 25 | A doc or skill shows a CLI invocation nobody ran — a command name that does not exist (`mxcli dump-bson` for `mxcli bson dump`), or a flag form the parser rejects (`--compare "A" "B"` where `--compare` is a StringSlice needing `"A,B"`). Worst when copied FROM the command's own `--help`, which had the same error, so the doc looks sourced | Docs quality | Run every command a doc shows, against a real project, before committing it. If it came from `--help`, run that form too — the example in the help text is not evidence that it works |

---

Expand Down
2 changes: 1 addition & 1 deletion .claude/lint-rules/orphaned_elements.star
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ ENTRY_PAGE_PATTERNS = ["Home", "Login", "Index", "Dashboard"]
# Reference kinds that mean "something causes this microflow to run". These are
# catalog RefKind values (mdl/catalog/builder_references.go); a kind missing here
# turns a live document into a false "not called from anywhere" finding.
MICROFLOW_ENTRY_KINDS = ["call", "schedule", "datasource", "action", "calculate", "settings"]
MICROFLOW_ENTRY_KINDS = ["call", "schedule", "publish", "datasource", "action", "calculate", "settings", "event"]

# Reference kinds that mean "something opens this page".
PAGE_ENTRY_KINDS = ["show_page", "home_page", "login_page", "menu_item", "action"]
Expand Down
Loading