TODOΒΆ
files/python/apply/oidc_settings.py:87-91stores the Keycloak group to ERPNext role map ofvars/main.yml(ERPNEXT_OIDC_GROUP_ROLE_MAP) as the site defaulterpnext_oidc_group_role_mapon every deploy withssoenabled, and nothing reads that key: no file of this role and no file of the Frappe 16.36 source tree references it (read, not measured with a Keycloak sign-in, becausessowas disabled on the design stack). The roles the map names (System Manager,Sales User,Purchase User,Stock User,Accounts User,Customer) are therefore not assigned through it, and whether an account that Keycloak creates reaches the desk at all is unproven:files/playwright/test-login-administrator.js:13only checks that the page text contains one ofdesk,workspace,erpnext,homeordashboard. Options: assign the roles from the group claim in code that runs at the OAuth sign-in (a server script or a small app with a hook), or sync them from an Ansible task, or delete the map together with its variable.tasks/02_bench_bootstrap.yml:21-22andtasks/02_bench_bootstrap/create_site.yml:16-17expand$ADMIN_PASSWORDand$DB_ROOT_PASSWORDinto the argument list ofbenchinside the backend container (set-admin-password "$ADMIN_PASSWORD",--admin-password=,--db-root-password=), so both values are part of a process argument list while the command runs (read in the task files, not measured). Cause: the commands receive the secrets as arguments. Options: set the Administrator password through the bench Python interpreter with the value in the environment, the wayfiles/python/apply/api_bot.pyreceives the API bot password, and hand the database root credentials tobench new-sitethrough a file or the environment.No schema migration runs after an image bump (measured on
frappe/erpnext:v16.50.0): the backend starts/usr/local/bin/entrypoint.sh, which only links the baked assets intosites/assetsand executes gunicorn, the image commandstart.shonly starts gunicorn, the configurator only runsbench set-config, and no task of this role callsbench migrate. A site created under v16.37.0 therefore keeps its old schema after the v16.50.0 bump on main, and Frappe 16.50 renders βThis site needs a migrationβ on the desk of such a site (www/desk.py); a fresh site is not affected (measured: desk boots, Frappe 16.51.0, ERPNext 16.50.0). Option: an idempotentbench --site <site> migratetask intasks/02_bench_bootstrap.ymlbefore the design task, withchanged_whenon its output.Every desk list page logs one
Executing inline event handler violates the following Content Security Policy directive 'script-src-attr 'self''per page menu entry (measured: 17a.grey-link[onclick]on/desk/build/todo, 16 on/desk/users/user, 49 console errors after two list pages). Cause: Frappe renders the page menu entries withonClick="return false;"(frappe/public/js/frappe/ui/page.js:564,577at v16.50.0) andmeta/csp.ymlallows no inline handler, so a click on such an entry also follows itshref="#". Options: allow that one handler through'unsafe-hashes'plus its hash inscript-src-attr, or accept the blocked handler since the menu actions run through jQuery handlers.On the signed-in desk Chromium reports
Creating a worker from 'blob:https://<domain>/...' violates the following Content Security Policy directive: "worker-src 'self'"(measured three times while opening 20 desk routes, the route that starts the worker was not isolated). Cause:meta/csp.ymlwhitelists noblob:source forworker-src. Options: find the feature that starts the worker and whitelistblob:forworker-src, or keep it blocked when that feature is not needed.βRealign the Administrator password with the declared oneβ reports changed on every deploy (measured 2026-10-11 in two consecutive closing role syncs), so the role never shows idempotent. Option: check the stored password first and run
set-admin-passwordonly on a mismatch, withchanged_whenon that branch.