You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: standardize version registry on min_version/max_version bounds
Incorporate feedback from #76: align the version feature
registry format with Mendix Content API conventions. Replaces the ad-hoc
mix of introduced/available_in/null with consistent min_version/max_version
semver bounds. Adds Prior Art section documenting the Content API as
prior art for the versioning format.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Mendix Content API (Marketplace) already solves a similar version-availability problem for add-on modules. Each Marketplace component release carries a minimum (and sometimes maximum) Studio Pro version, and Studio Pro resolves the highest compatible release at download time. The conceptual model is the same — mapping capabilities to version ranges — just applied to external packages rather than internal platform features.
36
+
37
+
This proposal adopts the same **`min_version` / `max_version`** bound format used by the Content API. A single version-comparison implementation can then handle both "is this platform feature available?" and "is this Marketplace module compatible?" — which matters for agents that reason about both in the same session (e.g., creating entities *and* importing a module).
38
+
39
+
The proposal diverges from the Content API in scope: we use a per-feature YAML registry rather than the Marketplace's full component → releases → packages data model. The alignment is specifically about version bound format and comparison semantics.
40
+
33
41
## Architecture
34
42
35
43
```
@@ -57,166 +65,163 @@ sdk/versions/
57
65
mendix-11.yaml
58
66
```
59
67
60
-
Each file defines features, their introduction version, syntax, deprecations, and upgrade hints:
68
+
Each file defines features with consistent `min_version` / `max_version` bounds (aligned with Mendix Content API conventions), syntax examples, deprecations, and upgrade hints:
mdl: "CREATE BUSINESS EVENT SERVICE Module.Name ..."
193
198
odata_client:
194
-
introduced: "10.0"
199
+
min_version: "10.0.0"
195
200
196
201
# --- Workflows ---
197
202
workflows:
198
203
basic:
199
-
introduced: "9.0"
204
+
min_version: "9.0.0"
200
205
mdl: "CREATE WORKFLOW Module.Name ..."
201
206
parallel_split:
202
-
introduced: "9.0"
207
+
min_version: "9.0.0"
203
208
user_task:
204
-
introduced: "9.0"
209
+
min_version: "9.0.0"
205
210
206
211
# --- Navigation ---
207
212
navigation:
208
213
profiles:
209
-
introduced: "10.0"
214
+
min_version: "10.0.0"
210
215
menu_items:
211
-
introduced: "10.0"
216
+
min_version: "10.0.0"
212
217
home_pages:
213
-
introduced: "10.0"
218
+
min_version: "10.0.0"
214
219
215
220
deprecated:
216
221
- id: "DEP001"
217
222
pattern: "Persistable: false on view entities"
218
223
replaced_by: "Persistable: true (auto-set)"
219
-
since: "10.18"
224
+
since: "10.18.0"
220
225
severity: "info"
221
226
222
227
upgrade_opportunities:
@@ -489,23 +494,27 @@ BSON Layer Schema Registry "How do I serialize this?"
489
494
490
495
## Design Decisions
491
496
492
-
1.**YAML as source of truth.** Human-readable, easy to edit, reviewed in PRs. Compiled to embedded Go structs at build time via `go:embed` + YAML parser.
497
+
1.**YAML as source of truth.** Human-readable, easy to edit, reviewed in PRs. Compiled to embedded Go structs at build time via `go:embed` + YAML parser. Version bounds use `min_version` / `max_version` semver notation consistent with the Mendix Content API (see Prior Art section).
498
+
499
+
2.**Consistent version bound format.** The registry uses `min_version` / `max_version` fields with semver-style notation (e.g., `"10.18.0"`), aligned with the Mendix Content API's versioning conventions. This replaces an earlier draft that mixed `introduced`, `available_in`, and `null` — which was ad-hoc and required special-case handling. With consistent bounds, a single `IsInRange(projectVersion, min, max)` comparison handles all checks. The `max_version` field is optional and defaults to unbounded (feature available in all later versions). This format also enables future unification: the same version-comparison logic can evaluate both platform feature availability and Marketplace module compatibility.
493
500
494
-
2.**Fine-grained features.** Mendix adds capabilities per minor release across all areas (new OQL functions, database connector features, REST enhancements, page properties). The registry must track at the **per-capability** level, not just per-concept. Example: `oql_functions.string_length` introduced in 10.8, `oql_functions.date_diff`in 10.12, `rest_client.query_parameters` in 11.0. Grouping by area with individual capability entries:
501
+
3.**Fine-grained features with feature-level bounds and optional property overrides.** Mendix adds capabilities per minor release across all areas. The registry tracks at the **per-capability** level, not just per-concept. Each capability has its own `min_version`. Where a capability gains sub-features in later releases, property-level overrides can be added without changing the parent entry:
495
502
496
503
```yaml
497
504
oql_functions:
498
-
string_length: { introduced: "10.8" }
499
-
date_diff: { introduced: "10.12" }
500
-
coalesce: { introduced: "10.14" }
505
+
string_length: { min_version: "10.20.0" }
506
+
date_diff: { min_version: "10.21.0" }
507
+
coalesce: { min_version: "10.14.0" }
501
508
database_connector:
502
-
basic_query: { introduced: "10.6" }
503
-
parameterized_query: { introduced: "10.12" }
504
-
runtime_connection: { introduced: "11.0" }
509
+
basic_query: { min_version: "10.6.0" }
510
+
parameterized_query: { min_version: "10.12.0" }
511
+
runtime_connection: { min_version: "11.0.0" }
505
512
```
506
513
507
-
3. **SHOW FEATURES works without a project.** `SHOW FEATURES FOR VERSION 10.24` queries the registry directly without an MPR connection. When connected, it defaults to the project's version. Useful for upgrade planning: `SHOW FEATURES ADDED SINCE 10.24` shows what upgrading to the latest would gain; `SHOW FEATURES FOR VERSION 11.6` shows the full capability set of a target version. When connected, also supports: `SHOW UPGRADE OPPORTUNITIES` to identify patterns in the current project that could benefit from the project's own version capabilities (e.g., detecting workarounds that are no longer needed).
514
+
This mirrors how the Marketplace handles it — a module has one compatibility range, but release notes call out property-level changes.
515
+
516
+
4. **SHOW FEATURES works without a project.** `SHOW FEATURES FOR VERSION 10.24` queries the registry directly without an MPR connection. When connected, it defaults to the project's version. Useful for upgrade planning: `SHOW FEATURES ADDED SINCE 10.24` shows what upgrading to the latest would gain; `SHOW FEATURES FOR VERSION 11.6` shows the full capability set of a target version. When connected, also supports: `SHOW UPGRADE OPPORTUNITIES` to identify patterns in the current project that could benefit from the project's own version capabilities (e.g., detecting workarounds that are no longer needed).
508
517
509
-
4. **Minor version granularity by default.** Metamodel changes happen at the minor release level. Patch-level overrides supported where needed but expected to be rare.
518
+
5. **Minor version granularity by default.** Metamodel changes happen at the minor release level. Patch-level overrides supported where needed but expected to be rare. All `min_version` values use three-part semver (`major.minor.patch`) for consistency, with `.0` patch for minor-release features.
510
519
511
-
5. **Non-interactive upgrade advisor for now.** `mxcli lint --upgrade-hints --target-version 11.6` outputs a report. Interactive `mxcli upgrade` can be added later as the tooling matures.
520
+
6. **Non-interactive upgrade advisor for now.** `mxcli lint --upgrade-hints --target-version 11.6` outputs a report. Interactive `mxcli upgrade` can be added later as the tooling matures.
0 commit comments