Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
28bbca1
lint: ARCH001 exempts the System workflow entities
claude Nov 9, 2026
d70451a
lint: SEC013 warns when the security level ignores the project's rules
claude Nov 9, 2026
3112cf2
marketplace: download a module's managed Java dependencies on install
claude Nov 9, 2026
d68601b
run: the watcher ignores the theme scaffold a build writes
claude Nov 9, 2026
1a8d56f
Merge remote-tracking branch 'origin/main' into claude/issue-triage-p…
claude Nov 9, 2026
9c1ca88
Merge pull request #2046 from ako/claude/issue-triage-prioritization-…
ako Nov 9, 2026
a88c4d9
Merge branch 'mendixlabs:main' into main
ako Nov 9, 2026
2fca29a
run: git-ignore the test endpoint's generated Java source
claude Nov 9, 2026
49b8361
fix(catalog): refs edges for entities named as a type or reached thro…
ako Nov 9, 2026
603a775
Merge remote-tracking branch 'origin/main' into fix/1829-entity-ref-e…
ako Nov 9, 2026
6c007b6
Merge pull request #2047 from ako/claude/issue-triage-prioritization-…
ako Nov 9, 2026
f947673
Merge branch 'main' into fix/1829-entity-ref-edges
ako Nov 9, 2026
c4e0e02
Merge pull request #2048 from ako/fix/1829-entity-ref-edges
ako Nov 9, 2026
55c3eea
exec: a timed-out or panicking statement no longer skips the rollback
claude Nov 9, 2026
9be24de
Merge remote-tracking branch 'origin/main' into claude/issue-triage-p…
claude Nov 9, 2026
eaa3b56
Merge pull request #2049 from ako/claude/issue-triage-prioritization-…
ako Nov 9, 2026
0244c9f
mpr: look a unit up by name without reading every unit of its type
claude Nov 9, 2026
7a43d23
Merge pull request #2050 from ako/claude/issue-triage-prioritization-…
ako Nov 9, 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
13 changes: 13 additions & 0 deletions .claude/lint-rules/cross_module_data.star
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@
#
# This promotes loose coupling between modules and better encapsulation.
#
# Exempt: the System workflow entities (System.Workflow*). Mendix requires them
# on a page — a task page takes a System.WorkflowUserTask parameter
# (CE7410/CE7412), and `complete task` / `open user task` / `open workflow` only
# work inside a System.WorkflowUserTask or System.Workflow data container
# (CE1843) — so there is no view entity or microflow to use instead
# (ako/mxcli#2034).
#
# Widget properties:
# .id - Widget ID
# .name - Widget name
Expand All @@ -30,6 +37,10 @@ def get_module_from_qualified_name(qualified_name):
return ""
return qualified_name.split(".")[0]

def is_platform_required(entity_ref):
"""The System workflow entities a task page or task inbox must use."""
return entity_ref.startswith("System.Workflow")

def check():
"""
Check that widgets don't reference entities from other modules.
Expand All @@ -44,6 +55,8 @@ def check():
# Skip widgets without entity references
if not widget.entity_ref:
continue
if is_platform_required(widget.entity_ref):
continue

# Get the module of the referenced entity
entity_module = get_module_from_qualified_name(widget.entity_ref)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "cmd/mxcli", "date": "2026-11-09", "symptom": "ako/mxcli#2028: after `marketplace install` of the Agents Kit stack, mx check reported 0 errors but run/test --local failed compiling Java actions with ~180 `package io.modelcontextprotocol... does not exist`. Reproduced: MCP Client 4.4.0 into a fresh 11.12.6 app, `sync-java-deps --check` 3 of 3 missing; after a manual sync it still reported jackson-databind:[2.21.2,3) missing with jackson-databind-2.23.0.jar in vendorlib/.", "cause": "The install transplanted the ModuleSettings JarDependencies but never ran the resolution Studio Pro runs on import; UnvendoredJarDependencies looked for a file named after a Maven range; one transient 'Failed to find some hosts' ended the sync.", "file": "cmd/mxcli/marketplace_javadeps.go (syncInstalledJarDependencies after install/update), cmd/mxcli/docker/javadeps.go (jarVendored range match, retry on unreachable hosts)", "insight": "A declared dependency's version is not always a file name: Maven ranges resolve to whatever Gradle picks, so a vendored-check must match the artifact and test the range — the exact-name check made a correct sync fail its own postcondition. Reproduce with the real package (marketplace install with MENDIX_PAT into a `mxcli new` app at the cached mxbuild version), not a hand-made .mpk.", "refs": ["ako/mxcli#2028", "mendixlabs/mxcli#1450"], "test": "cmd/mxcli/marketplace_javadeps_test.go, cmd/mxcli/docker/javadeps_range_retry_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "cmd/mxcli", "date": "2026-11-09", "symptom": "ako/mxcli#2033: javasource/mxtest/actions/RegisterTestEndpoint.java was committed by a `git add -A` made while `run --test-endpoint` hosted the endpoint.", "cause": "The endpoint's generated Java source lives in the working tree for the run's lifetime and nothing git-ignored it: init's .gitignore template did not list it, and run --test-endpoint never touched .gitignore.", "file": "cmd/mxcli/testendpoint_gitignore.go (ensureTestEndpointIgnored, called by run --test-endpoint and init), cmd/mxcli/init.go (template)", "insight": "Anything a long-running command leaves in the working tree must be ignored by that command itself, not only by init: projects created elsewhere, or with their own .gitignore, never got init's template.", "refs": ["ako/mxcli#2033"], "test": "cmd/mxcli/testendpoint_gitignore_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "cmd/mxcli/docker", "date": "2026-11-09", "symptom": "ako/mxcli#2033: `run --local --watch --test-endpoint --detach` logged 'Change detected, rebuilding (build #2)' right after the boot with nothing edited; mxbuild --serve was restarted for dist/pages, ~30 s of 404s on every page and a 'Failed to preserve application state during reload'. Without --test-endpoint it stayed on build #1.", "cause": "The boot build scaffolds themesource/<module>/ for a module that has none (here MxTest, which --test-endpoint injects); those .json/.js files are watched theme source newer than the boot baseline, so the watcher read the build's own output as an edit.", "file": "cmd/mxcli/docker/runlocal.go (buildScaffold, themeModuleFolders, sourceMTimeExcept; settleSource takes a source func)", "insight": "A watcher whose baseline is taken before the build (to keep edits made during boot) must still exclude what the build itself writes into watched folders; excluding by 'folder the build created, up to the build's end' keeps both. Reproduced end to end with a main-built binary as the control on a blank `mxcli new` app with --db-type hsqldb — no Postgres needed.", "refs": ["ako/mxcli#2033"], "test": "cmd/mxcli/docker/runlocal_scaffold_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "mdl/executor", "date": "2026-11-09", "symptom": "ako/mxcli#2043 (mendixlabs/mxcli#1780): `exec --no-check` of a large script panicked with a nil pointer in modelsdk Reader.GetRawUnitByName (receiver 0x0) via layoutCheckBackend/microflowExists while building a create or modify after a drop; no rollback, the drop and all earlier statements stayed written.", "cause": "The statement outlasted the 5m per-statement limit. Execute returned the timeout but its goroutine kept running (handlers are not context-aware); runScriptAtomically called exec.Close() (Disconnect sets reader=nil) before Rollback; the abandoned goroutine read the nil reader and its unrecovered panic killed the process before Rollback and before the timeout error was printed.", "file": "mdl/executor/executor.go (Execute: running WaitGroup + executeRecovered; Close waits abandonedStatementWait)", "insight": "The stack's goroutine was the one Execute spawns, and nothing else nils the reader mid-statement — that pointed at a timeout, though the report never mentions one: the timeout message is printed after the rollback, which the panic skipped. Reproduced with slowImplicitRebuilds + exec.Close(). Why the statement took 5 minutes: GetRawUnitByName re-decodes every unit of the type per call, once per distinct call target.", "refs": ["ako/mxcli#2043", "mendixlabs/mxcli#1780"], "test": "mdl/executor/execute_abandoned_statement_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "mdl/linter", "date": "2026-11-09", "symptom": "ako/mxcli#2034: ARCH001 'references entity from module System' fired on the System.WorkflowUserTask data view of every workflow task page and on a task inbox over System.WorkflowUserTask; in ako/ChatV2 three such warnings dropped the Architecture score from 82 to 58 with nothing to act on.", "cause": "cross_module_data.star treated every entity outside the widget's module as cross-module coupling, including the platform's workflow API.", "file": ".claude/lint-rules/cross_module_data.star (is_platform_required exempts System.Workflow*)", "insight": "A lint rule's advice must have a way out: Mendix requires System.WorkflowUserTask/System.Workflow data containers (CE7410/CE7412, CE1843), so a warning there can only be suppressed, never fixed. Check a rule against the templates the skills ship before trusting a score built on it.", "refs": ["ako/mxcli#2034"], "test": "mdl/linter/starlark_arch001_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "mdl/catalog", "date": "2026-11-09", "symptom": "The ref coverage trace (TestCatalog_RefCoverageOfProject) found reads of another document with no refs edge: 65 on FactoryManagement, 42 on EVORA - ICX. show references / impact missed the reader, five FactoryManagement entities in use read as unreferenced, and an incremental build did not rebuild a flow naming an enumeration value when the value was added.", "cause": "The member-refs walk matched an entity name only in mappings, so an entity named as a result variable type, a created list, an entity-type Java/JavaScript argument, a snippet parameter or an association step's destination made no edge; a value missing from an existing enumeration made none either. The same walk read annotation captions, text translations and AllowedModuleRoles as if they could be references.", "file": "mdl/catalog/builder_member_refs.go", "insight": "Classify every uncovered read by the BSON key that holds the string (bson dump + a key-path search) before adding edges: 12 of the 65 were not uses at all (annotation prose, static text, a module role named like an entity), and an edge for those would make show references wrong. The walk needs the owner AND parent $Type, since DataTypes$ObjectType.Entity is a use under ResultHandling but already a typed parameter/return edge elsewhere. A microflow call's result has no stored type (ResultVariableName only), so a fixture probe needs an import/Java call. A path probe that ends in /Attr is already covered by the attribute edge; only a path ending on the entity reproduces. dependents() is not transitive through calls, so each probe must name the domain model through one construct only.", "issue": "ako/mxcli#1829"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "mdl/linter", "date": "2026-11-09", "symptom": "ako/mxcli#2027: a blank app at security level Off with module roles, XPath-constrained entity access, page grants and demo users passed check --references, lint, mx check and test --local; at runtime a customer read 10 of 10 tickets, opened ungranted pages, and no demo user existed. At Prototype pages were guarded but every row was still readable.", "cause": "Nothing compared the security level with the security the project defines; SEC010-SEC012 return early below Production, so the levels that ignore the rules were exactly the ones no rule looked at.", "file": "mdl/linter/rules/security_level_ignores_rules.go (SEC013), .claude/skills/mendix/manage-security/SKILL.md", "insight": "A rule that only runs at Production is silent precisely where the rules it checks are not applied; the level itself needs a rule. Count only the project's own modules (Source empty), or every blank app warns about Administration's marketplace rules.", "refs": ["ako/mxcli#2027"], "test": "mdl/linter/rules/security_level_ignores_rules_test.go"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"area": "modelsdk/mpr", "date": "2026-11-09", "symptom": "ako/mxcli#2043: a `create or modify` of one large microflow ran past the 5-minute statement limit (and, before #2049, crashed exec); every `call microflow` target is resolved through Reader.GetRawUnitByName.", "cause": "GetRawUnitByName read and decoded every unit of the type on each call (the PERF NOTE from #651), so a flow build cost distinct callees x microflows unit reads; the executor's per-build memo only removes repeats of the same name.", "file": "modelsdk/mpr/reader_raw.go (nameIndex hint + unitNamed verification), modelsdk/mpr/reader_units.go (InvalidateCache clears it)", "insight": "A name index on a reader that other processes may rewrite is safe as a hint, not an answer: re-read the one unit it names and check name, $Type and module, and fall back to the scan on any mismatch or miss. Count unit reads (fileReads + UnitStoreHits) to test it, net of buildModuleResolution's per-call reads, which are not the type's units.", "refs": ["ako/mxcli#2043", "ako/mxcli#651", "mendixlabs/mxcli#1272"], "test": "modelsdk/mpr/reader_raw_name_index_test.go"}
22 changes: 15 additions & 7 deletions .claude/skills/mendix/download-marketplace-content/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ description: "The full lifecycle of Mendix Marketplace modules and widgets from
| 226-290 | Step 4 — Repair the model after the install (required, headless) |
| 291-347 | Step 5 — Before updating: has the module been edited? |
| 348-406 | Step 6 — Update an installed module |
| 407-452 | Worked example: the agent-editor stack on a vanilla app |
| 453-474 | Package a module of the project (`marketplace package`) |
| 475-482 | Notes |
| 483-486 | Platform authentication (`mxcli auth login/logout/status/list`) with PAT scheme for marketplace-api |
| 487-490 | Marketplace download/install (`mxcli marketplace download/install`) — the content API now exposes a per-version downloadUrl (303→public CDN); install is type-aware (widget→widgets/, new module→`mx module-import`); existing-module updates are reported, not applied (entity-ID/local-edit safety — see PROPOSAL_marketplace_modules |
| 491-495 | Marketplace drift detection (`mxcli marketplace diff <content-id> -p app.mpr [--to VERSION] [--json]`) |
| 407-460 | Worked example: the agent-editor stack on a vanilla app |
| 461-482 | Package a module of the project (`marketplace package`) |
| 483-490 | Notes |
| 491-494 | Platform authentication (`mxcli auth login/logout/status/list`) with PAT scheme for marketplace-api |
| 495-498 | Marketplace download/install (`mxcli marketplace download/install`) — the content API now exposes a per-version downloadUrl (303→public CDN); install is type-aware (widget→widgets/, new module→`mx module-import`); existing-module updates are reported, not applied (entity-ID/local-edit safety — see PROPOSAL_marketplace_modules |
| 499-503 | Marketplace drift detection (`mxcli marketplace diff <content-id> -p app.mpr [--to VERSION] [--json]`) |

<!-- /skill-index -->
# Download, Install and Update Marketplace Content
Expand Down Expand Up @@ -435,7 +435,7 @@ Then authoring works — `create constant` + `create ai model` + `create agent`
added 3 units, with `list features in agent_documents` reporting all four document types
available on 11.12.1.

Four things this run established, none of them obvious from the command list:
Five things these runs established, none of them obvious from the command list:

1. **Install `AgentEditorCommons` last** — it depends transitively on the rest.
2. **`--version` is mandatory in practice.** Every agent-stack module's latest release
Expand All @@ -446,6 +446,14 @@ Four things this run established, none of them obvious from the command list:
`mx check` on the finished project reported 203 errors (202 × CE0463, 1 × CE6087);
`mxcli fix widgets` (62 units) and `mxcli fix design-properties` (42 units) took it to
**0**. The project stays MPR v2 throughout: 1,868 `.mxunit` files, a 249,856-byte index.
5. **`mx check` passing does not mean the app builds.** MCP Client (and Agent Commons
through it) declares managed Java dependencies — `io.modelcontextprotocol.sdk:mcp`,
`mcp-json-jackson2`, `jackson-databind`. Until they are in `vendorlib/`, `run --local` and
`test --local` fail compiling Java actions with ~180 `package … does not exist` errors,
while `mx check` reports 0. `marketplace install` / `update` now download them (the step
Studio Pro runs on import) and print `Retry with: mxcli sync-java-deps -p …` when Maven
cannot be reached; `mxcli sync-java-deps -p App.mpr --check` reports what is still missing
(ako/mxcli#2028).

The ids are a convenience, not an authority: confirm with `search`/`info` rather than
trusting them from memory, and note that the listing name never matches the module name.
Expand Down
15 changes: 8 additions & 7 deletions .claude/skills/mendix/manage-security/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ description: "Configure Mendix security in MDL — module and user roles, access
| lines | section |
|---|---|
| 27-35 | When to Use This Skill |
| 36-43 | Security Concepts |
| 44-120 | The System-module ceiling — decide the role model around this FIRST |
| 121-567 | Syntax Reference |
| 568-582 | Starlark Lint Rule APIs |
| 583-644 | Common Workflow: Setting Up Module Security |
| 645-654 | Common Mistakes |
| 655-664 | Validation |
| 36-44 | Security Concepts |
| 45-121 | The System-module ceiling — decide the role model around this FIRST |
| 122-568 | Syntax Reference |
| 569-583 | Starlark Lint Rule APIs |
| 584-645 | Common Workflow: Setting Up Module Security |
| 646-655 | Common Mistakes |
| 656-665 | Validation |

<!-- /skill-index -->
# Security Management Skill
Expand All @@ -40,6 +40,7 @@ Use when the user asks to:
- **Access Rules** control CRUD rights on entities per module role
- **Microflow/Page Access** controls which module roles can execute/view specific elements
- **Project Security Level** determines enforcement: `off`, `prototype`, or `production`
- **A blank app (`mxcli new`) ships at `off`.** At `off` the runtime applies no access rule, page or microflow grant, and creates no demo user — every user sees every page and every row. `prototype` guards pages and microflows but **not entity access**, so XPath constraints on access rules have no effect. Only `production` applies entity access. check, `mx check` and `test --local` all pass at every level; lint SEC013 reports the gap. Set `alter app security ( SecurityLevel: production );` before writing access rules you mean to rely on.

## The System-module ceiling — decide the role model around this FIRST

Expand Down
Loading
Loading