From 25e417da8a05176cee7b21cdb1db387a50ab049e Mon Sep 17 00:00:00 2001 From: sarina Date: Tue, 28 Jul 2026 12:49:20 -0400 Subject: [PATCH 1/6] Create empty branch From fb662f07518d944d23a0a72b80df0e9818f51c94 Mon Sep 17 00:00:00 2001 From: Chris Patti Date: Tue, 28 Jul 2026 12:51:02 -0400 Subject: [PATCH 2/6] docs: sync Verawood dev/operator release notes with wiki updates (#1486) * docs: add Verawood dev/operator release notes content Populate the Verawood dev/operator release notes with breaking changes, deprecations & removals, Aspects analytics, and administrators & operators sections. * docs: sync Verawood dev/operator release notes with wiki updates Integrate additions and corrections made to the Verawood Operator Release Notes wiki page since the notes were first drafted here. - Correct the Upgrade/upsell widget entry: it is enabled by default in Verawood, and the config keys and slot names it documented were out of date. - Note that notifications and notification emails are now enabled by default via new opt-out waffle flags. - Document removal of course-level notification preferences, the is_core preference flag, and the V2 notification preferences config API. - Expand the send_email_digest deprecation entry with the new daily and weekly digest scheduling settings. - Document new operator-facing notification settings: instance-level preference overrides, the immediate-email buffer window, and ORA reminder notifications. - Add the Frontend-base and Loading External Scripts sections, which were present on the wiki page but missing from these notes. Refs: https://openedx.atlassian.net/wiki/spaces/COMM/pages/5331222534/Verawood+-+Operator+Release+Notes Refs openedx/wg-build-test-release#610 * Update source/community/release_notes/verawood/dev_op_release_notes.rst Co-authored-by: Maria Grimaldi (Majo) * docs: add RBAC AuthZ for Course Authoring to Verawood release notes Adds a new entry under Administrators & Operators covering the authz.enable_course_authoring waffle flag (course/org/global levels), the migration and rollback management commands, the opt-in automatic migration setting, the audit trail, and a known caveat around Admin Console course visibility, including the flag-resolution behavior added in openedx/frontend-app-admin-console#176. * docs: add a Migrations to be aware of section to Verawood release notes Several migrations in this release touch existing data at scale, run automatically without an explicit opt-in, or can fail depending on instance data history. Consolidate the existing course-ID case sensitivity callout with four newly identified ones (MariaDB UUID conversion, AuthZ course-authoring role migration, catalog course/run backfill, and enterprise academies auto-enable) into one dedicated, top-level section so operators can find them ahead of an upgrade. Co-Authored-By: Claude Sonnet 5 * Apply suggestions from code review Co-authored-by: Sarina Canelake --------- Co-authored-by: Maria Grimaldi (Majo) Co-authored-by: Claude Sonnet 5 Co-authored-by: Sarina Canelake --- .../verawood/dev_op_release_notes.rst | 608 +++++++++++++++++- 1 file changed, 606 insertions(+), 2 deletions(-) diff --git a/source/community/release_notes/verawood/dev_op_release_notes.rst b/source/community/release_notes/verawood/dev_op_release_notes.rst index 1e1e4073c..acbee14e3 100644 --- a/source/community/release_notes/verawood/dev_op_release_notes.rst +++ b/source/community/release_notes/verawood/dev_op_release_notes.rst @@ -21,15 +21,619 @@ To view the end-user facing docs, see the :ref:`Verawood Product Notes`. Breaking Changes **************** +* ``HELP_TOKENS_BOOKS`` and ``help_tokens.ini`` now reference the official Open + edX documentation. + + The ``HELP_TOKENS_BOOKS`` setting has been updated to reference the official + Open edX documentation. Similarly, the ``help_tokens.ini`` file, which is + specified in the ``HELP_TOKENS_INI_FILE`` setting, was updated in both the LMS + and CMS configurations to ensure the paths align with the official Open edX + documentation. + + This is a breaking change that many operators may want, but if you wish to + retain the original values, you must provide overrides. See + `Update HELP_TOKENS_BOOKS to use official Open edX docs `_. + +* **edx-search Typesense server requirement update.** The ``typesense-python`` + client library was upgraded from 1.x to 2.0.0. This version is only compatible + with Typesense Server >= v30.0. + + Action required if you use the Typesense search backend (``SEARCH_ENGINE = + "search.typesense.TypesenseEngine"``): upgrade your Typesense server to v30.0 + or later before deploying this Open edX release. No action is needed if you + use the default Elasticsearch backend. See + `edx-search PR #254 `_ and the + `typesense-python compatibility matrix `_ + for details. + +* **Upgrade/upsell ("notifications") panel replaced in Learning MFE.** The + Learning MFE right sidebar now uses a configurable widget registry, and the + upgrade/upsell widget was renamed internally from "Notifications" to + "Upgrade." + + * The Upgrade widget remains enabled by default in Verawood; operators do + not need to add it to ``SIDEBAR_WIDGETS``. To disable it, configure + ``SIDEBAR_WIDGETS: [{ id: 'UPGRADE', enabled: false }]``. + * Plugin developers should migrate the old notification-tray slot to the + Upgrade Panel slot, and the old discussions-sidebar slots to the Right + Sidebar and Right Sidebar Trigger slots. Deprecated aliases remain + compatible for now. + * Upgrade widget ``localStorage`` keys were renamed and are not migrated, + so stored widget state may reset after upgrading. + * See the `Upgrade Widget migration notes + `_ + for configuration examples and the complete identifier mapping. + +* **Notifications and notification emails are now enabled by default.** The + previous opt-in waffle flags, ``notifications.enable_notifications`` and + ``notifications.enable_email_notifications``, have been replaced by + opt-out flags. Operators who need to keep notifications disabled after + upgrading must enable ``notifications.disable_notifications`` or + ``notifications.disable_email_notifications``. + + * ``notifications.disable_notifications`` (default ``False``): when + enabled, disables the Notifications feature; when unset, notifications + are enabled by default. + * ``notifications.disable_email_notifications`` (default ``False``): when + enabled, disables notification emails; when unset, notification emails + are enabled by default. + * ``notifications.enable_notifications`` and + ``notifications.enable_email_notifications`` have been removed; they are + replaced by the flags above. + +Migrations to be aware of +************************* + +A few migrations in this release touch existing data at scale, run +automatically without an explicit opt-in, or can fail depending on your +instance's data history. Review these before upgrading. + +* **Course ID case-insensitive uniqueness constraint.** Due to a bug that was + present in the last several releases, it was possible for users to create + multiple courses with similar course IDs that differed only in + capitalization. Such courses would only appear as a single course in most + parts of the system, and may not work properly at all. That bug has been + fixed, and a new database constraint will prevent that from happening going + forward. + + However, if you have any of these "case duplicate" courses, the + ``split_modulestore_django`` migration ``0004_courseid_unique_ci`` will fail + with an ``IntegrityError``. If you encounter this, follow the instructions to + delete the invalid course record(s), and then you should be able to apply the + migration and continue. See + `fix!: split modulestore's has_course(ignore_case=True) was not working + `_. + +* **MariaDB UUID column conversion (edx-enterprise).** If you run MariaDB, + upgrading ``edx-enterprise`` runs a migration that converts roughly 19 UUID + columns from ``char(32)`` to MariaDB's native ``uuid`` type, with no flag to + skip it. This includes enrollment and group-membership tables + (``enterprise_licensedenterprisecourseenrollment``, + ``enterprise_enterprisecourseentitlement``, + ``enterprise_enterprisegroupmembership``) that can be large on instances + with many enterprise customers. Changing a column's type this way forces + MariaDB to rewrite the whole table (``ALGORITHM=COPY``), locking it for the + duration. This migration is a no-op on PostgreSQL. See + `fix: Convert UUIDField columns to uuid type for MariaDB + `_. + +* **AuthZ course-authoring role migration (openedx-authz).** This is not a + schema migration, it's a signal-triggered data migration. Enabling the + ``authz.enable_course_authoring`` waffle flag for an organization triggers, + synchronously inside that save, a full migration of every + ``CourseAccessRole`` row for that org into the new Casbin-based + authorization model, wrapped in a single transaction. Cost scales with how + many courses and role assignments the org has, and there's no built-in + batching. To control how much gets migrated at once, keep + ``ENABLE_AUTOMATIC_AUTHZ_COURSE_AUTHORING_MIGRATION`` set to ``False`` (its + default) and roll out with the ``authz_migrate_course_authoring`` + management command instead, scoped with ``--course-id-list`` or + ``--org-id``. See + `feat: course authoring automatic migration + `_. + +* **Catalog course/run backfill (course_overviews).** A migration populates + new ``CatalogCourse``/``CourseRun`` models by iterating every + ``CourseOverview`` row, without batching. It can fail outright with a + ``ValueError`` if a course's organization short code doesn't match the + Organizations table, which is plausible on instances with years of + accumulated data drift (case mismatches, orgs created outside the normal + flow). If it fails, the error names the offending course and organization; + create the missing Organization record (Django admin) or set + ``active=False`` on it, then re-run the migration. See + `feat: update openedx-core: new catalog models + backfill migration + `_. + +* **Enterprise academies auto-enabled for existing customers (edx-enterprise).** Any + enterprise customer that already has + ``enable_integrated_customer_learner_portal_search=True`` gets + ``enable_academies=True`` automatically. This is opt-out, not opt-in, and + the reverse migration is an explicit no-op: there's no way to determine or + restore the prior state after the fact. See + `feat: enable academies by default for all enterprise customers with search + `_. + Deprecations & Removals *********************** +* **Custom edx-val storage settings deprecated in favor of Django STORAGES.** + + The ``edx-val`` application previously relied on custom settings + (``VIDEO_IMAGE_SETTINGS``, ``VIDEO_TRANSCRIPTS_SETTINGS``, etc.) to determine + storage backends. This behavior is now deprecated in favor of the standard + Django 5.2+ ``STORAGES`` configuration. The key within the ``STORAGES`` config + for a custom video transcript location is ``video_transcripts``. See + `edx-val PR #593 `_. + + As of Verawood: + + * ``edx-val`` now correctly respects Django's ``STORAGES`` dict, giving it + precedence over legacy per-feature storage settings. + * Custom ``edx-val`` storage settings will continue to function during the + Verawood cycle but are officially deprecated and will be removed in a + future release. + * Operators should migrate their storage configuration to Django's + ``STORAGES`` format to ensure forward compatibility. + + **Required action for operators:** + + #. Define the required ``edx-val`` storages inside Django's ``STORAGES`` + dictionary (e.g., for transcripts, videos, and images). + #. Remove or stop relying on deprecated ``edx-val`` -specific storage + configuration variables. + #. Review any existing custom overrides in ``lms/envs/common.py`` or + deployment-specific files to ensure compatibility. + + Failure to migrate before the legacy settings are removed may result in + incorrect storage backends being used. + +* The ``SERVICE_VARIANT`` setting is no longer set from the environment. The + setting will be set to ``'cms'`` in ``cms/envs/common.py`` and to ``'lms'`` in + ``lms/envs/common.py`` regardless of any environment variable set. + +* CMS settings ``ID_VERIFICATION_SUPPORT_LINK``, + ``PASSWORD_RESET_SUPPORT_LINK``, ``ACTIVATION_EMAIL_SUPPORT_LINK``, and + ``LOGIN_ISSUE_SUPPORT_LINK`` are now set to the value of the + ``SUPPORT_SITE_LINK`` setting. Previously they defaulted to ``''``. + +* The setting ``USE_L10N`` was removed since it was removed in Django 5.0. + +* **Notifications** ``send_email_digest`` **management command deprecated.** + The command still exists, but it is now a no-op that emits a deprecation + warning. Daily and weekly notification digests are now scheduled + automatically with Celery when qualifying notifications are created. + Operators who previously scheduled ``send_email_digest`` with cron should + remove those cron jobs after upgrading. By default, daily digests are + delivered at 17:00 UTC, and weekly digests are delivered on Monday at + 17:00 UTC. See `edx-platform PR #38185 + `_ and `Configure + Notification Email Delivery + `_. + + * ``NOTIFICATION_DAILY_DIGEST_DELIVERY_HOUR`` (default ``17``): hour of + day, in UTC, to send daily digest emails. + * ``NOTIFICATION_DAILY_DIGEST_DELIVERY_MINUTE`` (default ``0``): minute of + the hour to send daily digest emails. + * ``NOTIFICATION_WEEKLY_DIGEST_DELIVERY_DAY`` (default ``0``): day of the + week to send weekly digest emails, where ``0`` is Monday and ``6`` is + Sunday. + * ``NOTIFICATION_WEEKLY_DIGEST_DELIVERY_HOUR`` (default ``17``): hour of + day, in UTC, to send weekly digest emails. + * ``NOTIFICATION_WEEKLY_DIGEST_DELIVERY_MINUTE`` (default ``0``): minute of + the hour to send weekly digest emails. + +* **REGISTRATION_EXTENSION_FORM replaced.** The ``REGISTRATION_EXTENSION_FORM`` + setting will stop working starting with the next release. It has been + replaced with the ``PROFILE_EXTENSION_FORM`` setting. + + Previously, data was only stored as JSON in the ``UserProfile`` ``meta`` + field. Moving forward, this information will also be stored in the custom + model that extends the fields. + + **Action for operators:** to prevent extended user fields from appearing + empty or outdated after the update, you may need to write and run a custom + data migration script to move existing information from the ``meta`` field + to your custom model, and perform this migration before activating the new + ``PROFILE_EXTENSION_FORM`` setting. See + `edx-platform PR #37119 `_ + for more details. + +* **Course-level notification preferences removed.** Integrations that read + ``CourseNotificationPreference`` records should migrate to account-level + notification preferences and the V3 preferences API. See the `model + deletion migration + `_. + +* **``is_core`` notification preference flag removed.** Notification + preference configuration no longer uses the ``is_core`` flag or the + ``core_web``, ``core_email``, and ``core_push`` fields. Clients that + consume notification preference configuration data should use + ``use_app_defaults`` and the plain channel fields exposed by the V3 + preferences API. + +* **Notification preferences V2 configuration API removed.** The + notification preferences V2 configuration API and its related manager + classes have been removed. Integrations that called + ``/api/notifications/v2/configurations/`` should use + ``/api/notifications/v3/configurations/`` instead. + +* **Removal of temporary SAML toggle.** The SAML feature toggle previously + introduced as a temporary safeguard no longer exists. Any configuration + setting this toggle should be removed. See + `fix: removal of temporary saml toggle `_. + +* **Consolidation of several XBlock packages into xblocks-extra.** The + following standalone XBlock packages have been consolidated into + ``xblocks-extra``. The standalone repositories have already been marked + deprecated: + + * ``audio-xblock`` + * ``feedback-xblock`` + * ``openedx-xblock-image-modal`` + * ``xblock-qualtrics-survey`` + * ``xblock-sql-grader`` + * ``xblock-submit-and-compare`` + + Operators who have any of these packages installed should migrate to + ``xblocks-extra`` and follow the migration guideline. + + Additionally, the following Open edX forked repositories have been archived + and are no longer maintained. Operators should refer to their respective + upstream repositories for continued support: + + * ``schoolyourself-xblock`` + * ``ConceptXBlock`` + +* **Deprecation of legacy built-in XBlock implementations.** Several previously + built-in XBlocks have been extracted from ``edx-platform`` into the shared + ``xblock-contrib`` repository, and the extracted implementations are used by + default in Verawood. The legacy "built-in" block code is considered + deprecated. Starting in Willow, the deprecated built-in implementations are + planned to be removed from ``edx-platform``, leaving only the extracted + variants in ``xblock-contrib``. + + The following blocks have been extracted and now live in ``xblock-contrib``: + + * HTML Block + * Video Block + * Problem Block + * Word Cloud Block + * Annotatable Block + * LTI Block + * Poll Block + + If you encounter problems with the extracted blocks, you can temporarily + revert to the built-in implementations using the feature flags in + ``openedx/envs/common.py``, following the pattern ``USE_EXTRACTED_*_BLOCK`` + (for example, ``USE_EXTRACTED_VIDEO_BLOCK``). + Aspects Analytics -***************************** +***************** + +Upgrading to `Aspects v4.0.0 +`_ will give you the +latest Aspects functionality including Superset 6.0! See the upgrade +instructions here: :ref:`openedx-aspects:upgrade-aspects`. + +This is a **BREAKING CHANGE** upgrade. Aspects will now use Python v3.12 which +was introduced in the Tutor Verawood release. + +.. _Verawood operators: Administrators & Operators ************************** +* **PostgreSQL is now supported as a backend (fresh installs only).** For more + detail see the `Use PostgreSQL how-to + `_. + +* **Notification preference defaults can now be managed at the instance + level.** Operators can override default preferences for existing + notification applications and notification types without code changes. + See `how to override default notification preferences + `_. + + * ``NOTIFICATION_APPS_OVERRIDE`` (default ``{}``): overrides default + preferences for existing notification applications. Supported override + keys are ``web``, ``email``, ``push``, ``non_editable``, and + ``email_cadence``. + * ``NOTIFICATION_TYPES_OVERRIDE`` (default ``{}``): overrides default + preferences for existing notification types. Supported override keys + are ``web``, ``email``, ``push``, ``non_editable``, and + ``email_cadence``. + +* **Immediate email notifications now use a configurable buffer window.** + The first notification is sent immediately; additional + immediate-cadence notifications created inside the window are combined + into one buffered digest. + + * ``NOTIFICATION_IMMEDIATE_EMAIL_BUFFER_MINUTES`` (default ``15``): number + of minutes to buffer additional immediate-cadence email notifications + after the first immediate email is sent. + +* **ORA reminder notifications are now available.** Learners who submit an + Open Response Assessment but still need to complete required peer or self + review steps can receive ``ora_reminder`` web and email notifications. See + `Configure ORA Reminder Notifications + `_. + + * ``ENABLE_ORA_REMINDERS`` (default ``True``): enables scheduled ORA + reminder notifications for learners who need to complete peer or self + reviews. + * ``ORA_REMINDER_MAX_COUNT`` (default ``3``): maximum number of reminders + sent per learner per ORA submission. + * ``ORA_REMINDER_INTERVAL_HOURS`` (default ``48``): hours between + consecutive ORA reminder notifications. + * ``ORA_REMINDER_INITIAL_DELAY_HOURS`` (default ``0``): hours after + submission before the first ORA reminder is sent. + * ``ORA_REMINDER_SWEEP_INTERVAL_SECONDS`` (default ``1800``): how often + the ORA reminder sweeper Celery task reschedules itself. + * ``ORA_REMINDER_SWEEP_BATCH_SIZE`` (default ``1000``): maximum number of + ORA reminder rows processed per sweep cycle. + * ``ORA_REMINDER_CHECK_AGAIN_HOURS`` (default ``12``): hours to wait + before checking again when no peer submissions are available. + +* **Built-in pdf XBlock.** The pdf XBlock is now built into the platform core + and installed by default. If you previously installed a third-party pdf + implementation such as open-craft's ``xblock-pdf``, then the built-in + implementation will likely work as a drop-in replacement, so you can + uninstall the third-party implementation. + + If you'd rather continue using a third-party pdf implementation, then + follow the steps to replace a preinstalled XBlock with a custom + implementation. In either case, the third-party implementation must be + removed from the ``xblock.v1`` entrypoint, otherwise you will see an + ``AmbiguousPluginError``. Additionally, you will want to enable the + ``legacy_studio.pdf_editor`` toggle to allow the third-party pdf + implementation to render its editor. + +* **New Instructor Dashboard MFE is the default experience.** The new + instructor dashboard MFE will be the default experience in Verawood. The + ``instructor.legacy_instructor_dashboard`` waffle flag will disable the + redirection that makes the new frontend app the default experience and + revert to the legacy instructor dashboard. + + If you were using the + ``org.openedx.learning.instructor.dashboard.render.started.v1`` filter to + modify the instructor dashboard tabs, you can achieve a similar outcome by + using ``org.openedx.learning.instructor.dashboard.tabs.generated.v1``, which + will give you access to the API endpoint currently consumed to render the + tabs on the frontend app. You'll also need to add a widget to the proper + slot to render the content. See the instructor dashboard MFE README for + more details. + +* **RBAC AuthZ for Course Authoring (opt-in).** Verawood introduces a new, + opt-in, RBAC-based authorization system for course authoring in Studio, + powered by `openedx-authz `_. + This replaces the legacy ``CourseAccessRole``-based permission model with a + more granular, role-based system. See `ADR: AuthZ for Course Authoring + Implementation Plan + `_. + + This flag will be turned on by default in the next release, Willow, and + the legacy permission system will be removed in Xylon (June 2027). To set up an + individual course, a specific organization, or your whole site to use the + new system, you need to both enable the appropriate feature flag(s) and + run migrations. + + * **Enabling the feature flag.** The feature is controlled by the waffle + flag ``authz.enable_course_authoring``, which can be enabled at three + levels of granularity (course, organization, global). When disabled (the + default), the legacy permission system remains in effect and no behavior + changes. + + * Course-level: add a "Waffle flag course override" at + ``/admin/waffle_utils/waffleflagcourseoverridemodel/`` for + ``authz.enable_course_authoring``, with the course key, "Force + On"/"Force Off", marked "Enabled". + * Org-level: add a "Waffle flag org override" at + ``/admin/waffle_utils/waffleflagorgoverridemodel/`` the same way, + using the org short name. + * Global: add a Flag named ``authz.enable_course_authoring`` at + ``/admin/waffle/flag/`` with "Everyone" set to "Yes". + * Course and org overrides work as overrides over the global flag, not + independent switches. If the override is "Disabled", the effective + state follows the global flag. If the global flag is off, an override + "Enabled" + "Force On" turns the flag on for that scope; if the global + flag is on, "Enabled" + "Force Off" turns it off for that scope. + * Global enablement affects all courses on the instance. If automatic + migrations are not enabled (see below), you must run the migration + management commands manually before or after toggling the global flag. + + See `ADR: Feature Flag Implementation Details + `_. + + * **Migrating permission data.** Existing legacy role assignments + (``CourseAccessRole``) must be migrated to ``openedx-authz`` when + enabling the new system. Two management commands are provided, scoped by + either ``--course-id-list`` or ``--org-id`` (mutually exclusive; one is + required): + + * Forward migration (legacy to openedx-authz): ``./manage.py cms + authz_migrate_course_authoring --delete --course-id-list + [course_key2 ...]`` or ``--org-id `` + * Rollback migration (openedx-authz to legacy): ``./manage.py cms + authz_rollback_course_authoring --delete --course-id-list + [course_key2 ...]`` or ``--org-id `` + * Both accept ``--delete``, which removes the successfully migrated role + assignments from the source system after migration (prompts for + confirmation). Without ``--delete``, the migration copies but does not + move, and source records are preserved. + * Using ``--delete`` is strongly recommended. The system expects + permission data to exist in only one system at a time for a given + resource. If assignments remain in both systems they can diverge over + time: for example, a course may keep appearing in a user's Studio + course list after their permissions were removed in one system, + because the assignment still exists in the other. Running without + ``--delete`` should only be used for development/testing before the + definitive migration. + * Both operations run within a database transaction. During rollback, + roles that exist only in the new system (no legacy equivalent) remain + in ``openedx-authz`` and are not migrated back; warnings are logged. + + See `ADR: Migration Process Details + `_. + + * **Automatic migrations (opt-in).** Set + ``ENABLE_AUTOMATIC_AUTHZ_COURSE_AUTHORING_MIGRATION = True`` (default + ``False``) to have course/org-level flag toggles in Django Admin + automatically trigger the corresponding data migration (forward on + enable, rollback on disable). Migration status and errors are recorded + in the ``AuthzCourseAuthoringMigrationRun`` model, viewable in Django + Admin. A runtime constraint prevents concurrent migrations on the same + scope. + + * Automatic migration only applies to course-level and org-level flag + changes. Global (instance-wide) flag changes do not trigger it, due to + performance risk on large instances, and must be migrated manually + with the management commands above. + * This setting is disabled by default. Only enable it if you understand + that the migration then runs synchronously within the Django Admin + request. + + See `ADR: Automatic Migration Details + `_. + + * **Audit trail.** Role assignment and removal operations in + ``openedx-authz`` are now recorded in a ``RoleAssignmentAudit`` table + (operation type, affected user, role, scope, actor), registered in + Django Admin for inspection. An ``OpenedxPublicSignal`` is also emitted + on every role lifecycle event for downstream consumers. See `ADR: + Auditability + `_. + + * **Known caveat: Admin Console and courses without the flag enabled.** + The Admin Console displays all courses in scope selectors when assigning + roles, regardless of whether ``authz.enable_course_authoring`` is + enabled for those courses. Roles can be assigned to any course through + the admin, but those assignments won't take effect unless the flag is + enabled for that course, its org, or globally. This can look like roles + were assigned but permissions aren't enforced. This limitation does not + affect content libraries, which don't use the legacy permission system. + + As of `frontend-app-admin-console PR #176 + `_, the + Admin Console's filters, Team Members table, Audit User view, and role + assignment wizard all read flag state directly from ``GET + /api/authz/v1/waffle-flag-states/`` and hide course content the flag + doesn't cover yet, independently of whether the underlying Casbin + migration has run. Observed behavior: + + .. list-table:: + :header-rows: 1 + + * - Scenario + - Expected behaviour + * - Flag OFF globally, no overrides + - Role filter hides course groups; scope filter hides all courses; + org filter hides all orgs for course-only users; wizard has no + course roles + * - Flag OFF globally, org A forced ON + - Courses in org A appear in scope/org filters and wizard; all + other orgs/courses hidden + * - Flag ON globally, course X forced OFF + - Course X hidden in scope filter and wizard scope list; all other + courses visible + * - Flag ON globally, org B forced OFF + - Org B and its courses hidden for course-only users + * - User has only library roles + - Libraries appear in all filters regardless of flag state + * - User has both library and course roles, flag OFF + - Library content visible everywhere; course content hidden + * - ``waffle-flag-states`` endpoint unreachable + - Error toast appears with retry button; all course content hidden + * - Loading state (slow network) + - Course content hidden until flag state resolves; library content + unaffected + + Flag-state resolution here is intentionally separate from permission + validation, since Casbin state can lag behind the flag when automatic + migration is disabled or the global flag changes. + +Frontend-base +************* + +Verawood is the first release that supports the new `frontend-base +architecture `_. It enables +frontend apps to be loaded as direct plugins within a unified "shell," +rather than as separate, independently deployed MFEs. There are several +advantages to this paradigm, including improved learner UX, reduced page +load time, faster builds, and a broader-scoped plugin API. For more +information on what motivated this change, see `OEP-65 +`_. + +In practice, frontend apps are NPM packages that plug into a single +frontend-base site. Verawood ships with four of these: + +* ``@openedx/frontend-app-authn``: replaces the Authn MFE; *disabled by + default* +* ``@openedx/frontend-app-learner-dashboard``: replaces the Learner + Dashboard MFE; *disabled by default* +* ``@openedx/frontend-app-instructor-dashboard``: replaces the legacy + instructor dashboard; *enabled by default* +* ``@openedx/frontend-app-notifications``: ports + ``@edx/frontend-plugin-notifications`` to the frontend-base ecosystem; + *enabled by default* + +The tutor-mfe implementation allows each of these to be easily enabled or +disabled without requiring a rebuild of the Tutor image, as documented in +the `tutor-mfe README +`_. +When an app that replaces an existing MFE is enabled (such as Authn or +Learner Dashboard), its MFE counterpart is automatically disabled. + +It is expected that by Xylon (June 2027), all +Open edX MFEs will have been converted to frontend-base apps. Operators are +therefore encouraged to enable the Authn and Learner Dashboard apps to test +pre-existing customizations on their instances. It is likely that any +branding, plugins, and forks of MFEs will need to be ported accordingly. +Documentation on how to do so is provided at: + +* `frontend-base theming docs + `_ +* `docs.openedx.org PR #1459 + `_ +* `Migrate a frontend app how-to + `_ + +As a migration aid for unconverted legacy plugins, a `frontend-base-compat +`_ shim lets legacy +``env.config.jsx`` configuration run on top of frontend-base sites. It is +also implemented by tutor-mfe: refer to `the corresponding section +`_ +of its documentation for information on how to use it. + +Finally, note that tutor-mfe's frontend-base implementation automatically +makes use of the new ``/api/frontend_site_config/v1/`` runtime configuration +endpoint, which converts existing ``MFE_CONFIG`` and ``MFE_CONFIG_OVERRIDES`` +to frontend-base's ``SiteConfig`` structure. You can find out more `here +`_. + +What if I don't use Tutor? +========================== + +If you deploy your Open edX instance using something other than Tutor, start by looking at +`frontend-template-site `_. +This is the canonical representation of how a frontend-base site should be +configured. Operators are meant to fork and modify it as required for their +own instances. Everything in it is considered user-configuration, including +``index.html``. + +Loading External Scripts +************************* + +It is now possible to configure either MFEs or frontend apps to load +arbitrary external scripts, such as ones used to configure hosted analytics +services. Where before only Google Analytics was supported, now operators +are free to load whatever external service they need. See `the +corresponding tutor-mfe documentation +`_. + +For an example implementation, refer to a sample Tutor plugin that loads +Google Analytics dynamically on both MFEs and frontend apps: +`tutor-contrib-google-analytics +`_. + Settings and Toggles ******************** @@ -39,7 +643,7 @@ Developer Experience Known Issues ************ -See the `Build Test Release project board `_ for known open issues. +See the `Build Test Release project board `_ for known open issues. **Maintenance chart** From a75cdc0a74923d5e4fd34e590768a65dfb980991 Mon Sep 17 00:00:00 2001 From: "Adolfo R. Brandes" Date: Thu, 30 Jul 2026 11:03:52 -0300 Subject: [PATCH 3/6] docs: point Verawood RNs at real frontend-base porting docs (#1498) Co-authored-by: Claude --- .../release_notes/verawood/dev_op_release_notes.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/community/release_notes/verawood/dev_op_release_notes.rst b/source/community/release_notes/verawood/dev_op_release_notes.rst index acbee14e3..7f88aef42 100644 --- a/source/community/release_notes/verawood/dev_op_release_notes.rst +++ b/source/community/release_notes/verawood/dev_op_release_notes.rst @@ -591,10 +591,9 @@ Documentation on how to do so is provided at: * `frontend-base theming docs `_ -* `docs.openedx.org PR #1459 - `_ +* :ref:`Port a Frontend Plugin to frontend-base` * `Migrate a frontend app how-to - `_ + `_ As a migration aid for unconverted legacy plugins, a `frontend-base-compat `_ shim lets legacy From 464fee65b0b7f54e8d31deb86d9d00a01ab5d660 Mon Sep 17 00:00:00 2001 From: Sarina Canelake Date: Thu, 30 Jul 2026 10:04:44 -0400 Subject: [PATCH 4/6] Update RBAC operator release note Co-authored-by: Bryann Valderrama --- .../release_notes/verawood/dev_op_release_notes.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/community/release_notes/verawood/dev_op_release_notes.rst b/source/community/release_notes/verawood/dev_op_release_notes.rst index 7f88aef42..c7ce7eb85 100644 --- a/source/community/release_notes/verawood/dev_op_release_notes.rst +++ b/source/community/release_notes/verawood/dev_op_release_notes.rst @@ -513,11 +513,13 @@ Administrators & Operators As of `frontend-app-admin-console PR #176 `_, the - Admin Console's filters, Team Members table, Audit User view, and role - assignment wizard all read flag state directly from ``GET - /api/authz/v1/waffle-flag-states/`` and hide course content the flag + Admin Console's filters and role assignment wizard all read flag state directly + from ``GET /api/authz/v1/waffle-flag-states/`` and hide course content the flag doesn't cover yet, independently of whether the underlying Casbin - migration has run. Observed behavior: + migration has run. The Team Members table and Audit User view display all + course assignments; however, course or organization assignments that are + not enabled via the ``authz.enable_course_authoring`` flag can only be viewed, + but not deleted. Observed behavior: .. list-table:: :header-rows: 1 From 254447c28658896facee1d2406224fb8e4642d76 Mon Sep 17 00:00:00 2001 From: sarina Date: Thu, 30 Jul 2026 16:15:33 -0400 Subject: [PATCH 5/6] Update xblocks-core name and add Legacy Libraries documentation --- .../verawood/migrate_legacy_libraries.png | Bin 0 -> 52427 bytes .../verawood/dev_op_release_notes.rst | 61 +++++++++++------- 2 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 source/_images/release_notes/verawood/migrate_legacy_libraries.png diff --git a/source/_images/release_notes/verawood/migrate_legacy_libraries.png b/source/_images/release_notes/verawood/migrate_legacy_libraries.png new file mode 100644 index 0000000000000000000000000000000000000000..271cd3b7996f19b746e04d7e53f7364fd3066e1b GIT binary patch literal 52427 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�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 literal 0 HcmV?d00001 diff --git a/source/community/release_notes/verawood/dev_op_release_notes.rst b/source/community/release_notes/verawood/dev_op_release_notes.rst index c7ce7eb85..9b4951232 100644 --- a/source/community/release_notes/verawood/dev_op_release_notes.rst +++ b/source/community/release_notes/verawood/dev_op_release_notes.rst @@ -262,37 +262,22 @@ Deprecations & Removals setting this toggle should be removed. See `fix: removal of temporary saml toggle `_. -* **Consolidation of several XBlock packages into xblocks-extra.** The - following standalone XBlock packages have been consolidated into - ``xblocks-extra``. The standalone repositories have already been marked - deprecated: - - * ``audio-xblock`` - * ``feedback-xblock`` - * ``openedx-xblock-image-modal`` - * ``xblock-qualtrics-survey`` - * ``xblock-sql-grader`` - * ``xblock-submit-and-compare`` - - Operators who have any of these packages installed should migrate to - ``xblocks-extra`` and follow the migration guideline. - - Additionally, the following Open edX forked repositories have been archived - and are no longer maintained. Operators should refer to their respective - upstream repositories for continued support: +* **SchoolYourself and Concept XBlocks Deprecated**: The following Open edX + forked repositories have been archived and are no longer maintained. Operators + should refer to their respective upstream repositories for continued support: * ``schoolyourself-xblock`` * ``ConceptXBlock`` * **Deprecation of legacy built-in XBlock implementations.** Several previously built-in XBlocks have been extracted from ``edx-platform`` into the shared - ``xblock-contrib`` repository, and the extracted implementations are used by - default in Verawood. The legacy "built-in" block code is considered - deprecated. Starting in Willow, the deprecated built-in implementations are - planned to be removed from ``edx-platform``, leaving only the extracted - variants in ``xblock-contrib``. + `xblocks-core `_ repository, and the + extracted implementations are used by default in Verawood. The legacy + "built-in" block code is considered deprecated. Starting in Willow, the + deprecated built-in implementations are planned to be removed from + ``edx-platform``, leaving only the extracted variants in ``xblocks-core``. - The following blocks have been extracted and now live in ``xblock-contrib``: + The following blocks have been extracted and now live in ``xblocks-core``: * HTML Block * Video Block @@ -307,6 +292,34 @@ Deprecations & Removals ``openedx/envs/common.py``, following the pattern ``USE_EXTRACTED_*_BLOCK`` (for example, ``USE_EXTRACTED_VIDEO_BLOCK``). +* **Consolidation of several XBlock packages into xblocks-extra.** The following + standalone XBlock packages have been consolidated into `xblocks-extra + `_. The following standalone + repositories have been marked deprecated: + + * ``audio-xblock`` + * ``feedback-xblock`` + * ``openedx-xblock-image-modal`` + * ``xblock-qualtrics-survey`` + * ``xblock-sql-grader`` + * ``xblock-submit-and-compare`` + + Operators who have any of these packages installed should migrate to + ``xblocks-extra`` and follow the migration guidelines. + +* **Legacy Libraries Deprecation**: :ref:`Legacy Libraries ` are now deprecated and must be :ref:`migrated to Content + Libraries ` this release. + + Operators can see if any legacy libraries exist on their instance by visiting + the "Legacy Libraries" tab on the Studio homepage, and clicking the + :guilabel:`Review Legacy Libraries` button. Operators or course teams may + perform the migration using the migration UI. + + .. figure:: /_images/release_notes/verawood/migrate_legacy_libraries.png + :alt: The Studio homepage's Legacy Libraries tab has a banner indicating that legacy libraries must be migrated. The "Review Legacy Libraries" button is on the right side of this banner. + :align: center + Aspects Analytics ***************** From 8a6473f8179e07f33d3a8bffec0bcf4f312ccbde Mon Sep 17 00:00:00 2001 From: sarina Date: Thu, 30 Jul 2026 20:10:33 -0400 Subject: [PATCH 6/6] Adjust cross reference targets and remove direct docs links --- .../verawood/dev_op_release_notes.rst | 49 +++++++------------ .../site_ops/how-tos/enable_notifications.rst | 4 ++ 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/source/community/release_notes/verawood/dev_op_release_notes.rst b/source/community/release_notes/verawood/dev_op_release_notes.rst index 9b4951232..356da0e10 100644 --- a/source/community/release_notes/verawood/dev_op_release_notes.rst +++ b/source/community/release_notes/verawood/dev_op_release_notes.rst @@ -3,8 +3,6 @@ Open edX Verawood Developer & Operator Release Notes ##################################################### -*Releasing June, 2026!* - These are the developer & operator release notes for the Verawood release, the 22nd community release of the Open edX Platform, spanning changes from October 30, 2025 to April 9, 2026. You can also review details about :ref:`Open edX Release Notes` or @@ -206,9 +204,8 @@ Deprecations & Removals remove those cron jobs after upgrading. By default, daily digests are delivered at 17:00 UTC, and weekly digests are delivered on Monday at 17:00 UTC. See `edx-platform PR #38185 - `_ and `Configure - Notification Email Delivery - `_. + `_ and :ref:`Configure + Notification Email Delivery `. * ``NOTIFICATION_DAILY_DIGEST_DELIVERY_HOUR`` (default ``17``): hour of day, in UTC, to send daily digest emails. @@ -337,14 +334,12 @@ Administrators & Operators ************************** * **PostgreSQL is now supported as a backend (fresh installs only).** For more - detail see the `Use PostgreSQL how-to - `_. + detail see the :ref:`Use PostgreSQL how-to `. * **Notification preference defaults can now be managed at the instance level.** Operators can override default preferences for existing notification applications and notification types without code changes. - See `how to override default notification preferences - `_. + See :ref:`Configure Default Notification Preferences`. * ``NOTIFICATION_APPS_OVERRIDE`` (default ``{}``): overrides default preferences for existing notification applications. Supported override @@ -367,8 +362,7 @@ Administrators & Operators * **ORA reminder notifications are now available.** Learners who submit an Open Response Assessment but still need to complete required peer or self review steps can receive ``ora_reminder`` web and email notifications. See - `Configure ORA Reminder Notifications - `_. + :ref:`Configure ORA Reminder Notifications `. * ``ENABLE_ORA_REMINDERS`` (default ``True``): enables scheduled ORA reminder notifications for learners who need to complete peer or self @@ -392,13 +386,13 @@ Administrators & Operators implementation will likely work as a drop-in replacement, so you can uninstall the third-party implementation. - If you'd rather continue using a third-party pdf implementation, then - follow the steps to replace a preinstalled XBlock with a custom - implementation. In either case, the third-party implementation must be - removed from the ``xblock.v1`` entrypoint, otherwise you will see an - ``AmbiguousPluginError``. Additionally, you will want to enable the - ``legacy_studio.pdf_editor`` toggle to allow the third-party pdf - implementation to render its editor. + If you'd rather continue using a third-party pdf implementation, then :ref:`follow + the steps to replace a preinstalled XBlock with a custom implementation + `. + In either case, the third-party implementation must be removed from the + ``xblock.v1`` entrypoint, otherwise you will see an ``AmbiguousPluginError``. + Additionally, you will want to enable the ``legacy_studio.pdf_editor`` toggle + to allow the third-party pdf implementation to render its editor. * **New Instructor Dashboard MFE is the default experience.** The new instructor dashboard MFE will be the default experience in Verawood. The @@ -574,8 +568,7 @@ frontend apps to be loaded as direct plugins within a unified "shell," rather than as separate, independently deployed MFEs. There are several advantages to this paradigm, including improved learner UX, reduced page load time, faster builds, and a broader-scoped plugin API. For more -information on what motivated this change, see `OEP-65 -`_. +information on what motivated this change, see :ref:`openedx-proposals:OEP-65 Frontend Composability`. In practice, frontend apps are NPM packages that plug into a single frontend-base site. Verawood ships with four of these: @@ -648,12 +641,6 @@ Google Analytics dynamically on both MFEs and frontend apps: `tutor-contrib-google-analytics `_. -Settings and Toggles -******************** - -Developer Experience -******************** - Known Issues ************ @@ -661,8 +648,8 @@ See the `Build Test Release project board