Skip to content

learn(multilingual-app): source language, enabled languages, starting language, a switch a normal role can use - #387

Closed
CarlesZ wants to merge 6 commits into
MendixMau:masterfrom
CarlesZ:learn/multilingual-app
Closed

CarlesZ wants to merge 6 commits into
MendixMau:masterfrom
CarlesZ:learn/multilingual-app

Conversation

@CarlesZ

@CarlesZ CarlesZ commented Oct 14, 2026 •

Copy link
Copy Markdown

Closes #386.

Why. On a field build the translations were correct and the user still could not switch language: the picker errored, showed
no label and changed nothing, with every gate green. The causes are three model decisions nobody checks (source language, enabled
languages, the user's starting language) and one platform limit seen on one project (no grant route for System.User_Language was found: mxcli refuses the grant, Studio
Pro does not offer the member), so the fix is a skill, not an instrument.

What.

  • skills/learned-multilingual-app.md (new): the failure table; §1 source language before the first caption; §2 what is not
    translated; §3 starting language; §4 why the Marketplace LanguageSelector fails for a normal role and the microflow + reload +
    <html lang> switch that works; §5 login page; §6 per-language × per-role verification with a denominator. Each rule names
    its probe (describe settings, describe translations … K to go, document.documentElement.lang).
  • skills/learned-mdl-cannot-express.md: LanguageSelector row (⚠️ workaround → §4).
  • bin/lib/skill-routing.tsv: one row (ondemand, build, stages 3/5/6, architect + mdl + review); render-routing.sh output for README,
    ROUTING, the three agent stubs and gate-check's stage map.
  • CHANGELOG.md: one line under Unreleased.

Field proof. One run, 2026-10-09, Mendix 11.15.0, mxcli v0.25.0: the switch changes language for both roles, persists across
sign-in, <html lang> follows it; demo-guide screenshots in both languages. The check result for the grant was re-measured on
2026-10-14; the exec refusal is quoted from the project's findings of 2026-10-09 (not re-run: the project routes exec through
exec.sh). The MDL examples pass mxcli check with references resolved against the field project (module names substituted).

Gates run locally. check-scripts, render-routing --check, check-portability, check-no-client-data, check-pr-discipline — all
clean. Fixtures: test-render-routing, test-routing-tier, test-stage-p, test-bug06-freshness, test-ritual-slim — all pass.

Update 2026-10-16. Merged origin/master (1ed7c99) into the branch, resolved the CHANGELOG (kept both sides) and
bin/gate-check.sh (taken from master, re-rendered), added the architect role to the routing row (source language is a Stage 3
design decision), and regenerated the routing surfaces.

Impact

Row Answer
Process None. One on-demand skill; no gate, no new human step, nothing new blocks.
Dependencies bin/lib/skill-routing.tsv and its re-render (README.md, ROUTING.md, agent stubs architect/mdl/review, bin/gate-check.sh stage map); skills/learned-mdl-cannot-express.md (one row). Reads no artifact. Merges clean onto master 1ed7c99.
Context cost Unchanged. bin/render-routing.sh --check on master (d1cbd41) and on this head: baseline 75,225 → 75,225 words (budget 80,000). Stage 5 per role (lead 26,443, mdl 30,965, review 31,435) and Stage 3 (architect 24,779, mdl 6,924, review 6,924) are the same on base and head; the skill is on demand and costs 0 here.
Behaviour NOT RUN: on-demand row only (a generated routing row in three agent stubs, Context cost 0). Skill text is situational; the field run on one project is the evidence.
Runtime n/a: nothing on a hot path.

Squash message (use this when squash merging)

learn(multilingual-app): source language, enabled languages, starting language, and a switch a normal role can use (#386)

New on-demand skill learned-multilingual-app.md: a second language is four decisions the
translations never see. On one field project (Mendix 11.15.0, mxcli v0.25.0) no grant route for
System.User_Language was found, so the skill gives a microflow + reload + html lang switch that a
normal role can use. One real run with two roles; a second project has not confirmed the grant limit.
Routed on demand to architect, mdl and review; baseline unchanged at 75,225 words.

Closes #386.

🤖 Generated with Claude Code

… language, a switch a normal role can use

New skills/learned-multilingual-app.md (ondemand, stages 3/5/6, mdl + review) and a
LanguageSelector row in learned-mdl-cannot-express.md. Field run 2026-10-09
(Mendix 11.15.0, mxcli v0.25.0): translations correct, picker errored / blank /
no-op with every gate green. System.User_Language is not grantable (mxcli check
passes the grant, exec refuses it; Studio Pro does not offer the member), so the
Marketplace LanguageSelector cannot work for a normal role; the recipe is a
microflow on $currentUser + a reloading nanoflow + CSS on <html lang>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MendixMau

Copy link
Copy Markdown
Owner

Thanks @CarlesZ, this is a really useful learning. The routing row, the symptom table and the 4 × languages × roles check are all solid, and nothing leaks. Before merge, two text fixes, plus a few optional ones:

1. Please scope the "cannot be granted" claim (skills/learned-multilingual-app.md:23, :93-95, repeated in the CHANGELOG line and learned-mdl-cannot-express.md:25).

  • What is verified: the grant route is closed. mxcli's access-rule walk stops at System.User (entity_hierarchy.go), so listing those members in a rule on a specialization gives CE0066. The error text and the check-then-exec refusal are right.
  • Not verified: that a normal user can't write their own User_Language at all. That member is governed by the System module's own access rules, which a user role gets through the System.User module role.
  • Suggested fix: reword to "on this project no grant route was found", and add one probe before replacing the widget: does the user role include the System.User module role, and is the picker bound to System.User rather than Administration.Account? Keep the microflow-plus-reload recipe; it's sound either way.

2. :57: "alter settings is a STOP-table operation" is out of date. STOP #2 was retired on 2026-09-30 (learned-mdl-preflight.md:40), and settings writes now work from the CLI. Please drop or correct that sentence; as written it adds a needless stop-and-ask.

Optional:

  • :24 / :76-77: say the picker leaving out en_US was observed with this widget configuration.
  • :138: check the CONV010 description against the rule text.
  • §1: one line naming mxcli's alternative fix (change DefaultLanguageCode, then re-run the create statements).

Impact (our new review block):

  • Context: +0 always-loaded words (the row is on-demand; the baseline stays at 73,522).
  • Process: two Stage 3 questions and a Stage 6 per-language/per-role check.
  • Dependencies: NanoflowCommons Reload.
  • Behaviour: situational text, A/B recommended, not run.
  • Runtime: n/a.

Push the two fixes to this branch and we'll merge.


Generated by Claude Code

…e System.User module-role probe, drop the retired STOP MendixMau#2 note

- 'cannot be granted' -> 'on this project no grant route was found'; the System
  module's own rules (via the System.User module role) are named as the open
  question, with a DESCRIBE USER ROLE probe before replacing the widget (both
  roles here had System.User; the pick still failed).
- STOP MendixMau#2 (settings writes) retired 2026-09-30: no stop-and-ask for alter settings.
- en_US left out of the picker was this project's own filter [Code != 'en_US'].
- CONV010 quoted from the rule text; mxcli's DefaultLanguageCode alternative named.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CarlesZ

CarlesZ commented Oct 15, 2026

Copy link
Copy Markdown
Author

Thanks for the review — both fixes and the three optional ones are in 2d9a6ba.

  1. Grant claim scoped. "cannot be granted" → "on this project no grant route was found" (skill §4 + table, learned-mdl-cannot-express.md, CHANGELOG). §4 now names the System module's own rules as the open question and adds the probe before replacing the widget: DESCRIBE USER ROLE — does it include System.User? — and is the picker reading the session user? Answer on this project: both roles did include System.User and the pick still failed; the widget takes no user binding (session user). Recipe unchanged.
  2. STOP WIP: Mac-local divergence — 2 unique commits + uncommitted state, needs rebase cleanup #2 note dropped — §1 now says settings writes work from the CLI (STOP WIP: Mac-local divergence — 2 unique commits + uncommitted state, needs rebase cleanup #2 retired 2026-09-30).

Optional: the en_US exclusion turned out to be this project's own filter (System.Language [Code != 'en_US']), now said so; CONV010 quoted from the rule text; §1 names mxcli's DefaultLanguageCode + re-run alternative.

Re-run locally: check-scripts, render-routing --check, check-no-client-data, check-pr-discipline — clean.

MendixMau and others added 4 commits October 16, 2026 10:20
CHANGELOG kept both sides, bin/gate-check.sh taken from master and re-rendered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Source language is a Stage 3 design decision, so the architect stub gets the on-demand row.
Routing re-rendered; baseline unchanged at 75225 words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MendixMau added a commit that referenced this pull request Oct 16, 2026
… language, a switch a normal role can use (from #387 by @CarlesZ) (#449)

Lands #387 by @CarlesZ. Independent review: APPROVE.

# PR 449 (lands #387 by @CarlesZ) review r1 (delta self-review)
Verdict: APPROVE
- Content identical to #387 head reviewed APPROVE in 387-w1.md; delta = merge from release/v1.0, routing re-render (--check in sync), CHANGELOG credit " — CarlesZ" and roles "architect, mdl + review".
- Squash message scoped; no "not grantable"/"cannot be granted".
- Leak guard, private citations, PR discipline clean.
@MendixMau

Copy link
Copy Markdown
Owner

Thank you @CarlesZ! Your multilingual app skill is now in the toolkit via #449, which landed on the release branch for the upcoming v1.0. We brought it in through our own branch so we could sync it with the latest changes and regenerate the routing tables, and your name is credited in the CHANGELOG and the commit. The architect, mdl and review agents now load it.

Closing this one in favour of #449. Thanks a lot for writing it up.

@MendixMau MendixMau closed this Oct 16, 2026
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.

[learning] Multilingual app: the language picker errors, shows no label and changes nothing while every gate is green

2 participants