Skip to content

Live events for "classic quiz with no assignment" content type + live events for all quiz types content update + new event types for quizzes#39

Open
JoshBothell wants to merge 1950 commits into
masterfrom
jab/live-events-classic-quiz-no-assn-new-event-types
Open

Live events for "classic quiz with no assignment" content type + live events for all quiz types content update + new event types for quizzes#39
JoshBothell wants to merge 1950 commits into
masterfrom
jab/live-events-classic-quiz-no-assn-new-event-types

Conversation

@JoshBothell

Copy link
Copy Markdown
  • Live events for "classic quiz with no assignment" content type
  • Live events for all quiz types content update
  • New event types for quizzes to avoid confusion regarding using "assignment_updated" events for quizzes with no assignment.

@JoshBothell

Copy link
Copy Markdown
Author

submitted to Instructure, awaiting approval.

ccutrer and others added 28 commits April 20, 2026 16:49
Closes AE-3819

Change-Id: I2e40d945d52ca238c187e8fa99e21c8a729c0daf
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406614
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Aaron Ogata <[email protected]>
QA-Review: Cody Cutrer <[email protected]>
Product-Review: Cody Cutrer <[email protected]>
The discovery page had no cap on the number of
sign-in option buttons, which violated an a11y
audit requirement. Users could save an unlimited
number of items across the primary and secondary
sections.

Backend validation now rejects configurations
exceeding 10 total items. Primary and secondary
sections are treated as empty when absent, since
discovery_page_active= can write discovery page
settings without those keys. The frontend enforces
the same limit by disabling the Add button at the
cap and blocking saves when over the limit.

A live item counter in the modal footer shows
green below the limit, yellow at the limit, and
red with an explanatory message when over it.
Existing configurations above 10 still render,
but must be reduced before saving again.

closes AE-3686
flag=new_login_ui_identity_discovery_page

[skip-crystalball]

test plan:
- enable "New Canvas Login UI: Identity Service Discovery
  Page" at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Identity Service Discovery Page"
- verify the counter shows 0/10 with no items added
- add sign-in options one at a time
- verify the counter increments only after each item
  is committed, not while the form is open
- verify the counter is green below 10 items
- verify the counter turns yellow at exactly 10
- verify the Add button is disabled at 10 items
- verify Save is disabled when over the limit
- verify the counter turns red above 10 with an
  error message
- verify existing configs above 10 load and display
  the red counter, and Save is blocked until reduced

Change-Id: Ib88d61c8415905b609581ef3b892d21ce59d9712
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405720
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Michael Hulse <[email protected]>
Product-Review: Michael Hulse <[email protected]>
Reviewed-by: Weston Dransfield <[email protected]>
Added a DiscoveryPageStatus component to the configure
modal header that shows an "Enabled" or "Disabled" pill
based on the discovery page active state, along with a
"View Discovery Page" link that opens the discovery page
URL in a new tab.

Also replaced the native window.confirm exit confirmation
with the InstUI-based confirm() dialog, and added a save
confirmation warning when the discovery page is currently
enabled to alert admins that changes will be immediately
visible to users.

closes AE-3698
closes AE-3699
flag=new_login_ui_identity_discovery_page

[skip-crystalball]

test plan:
- enable "New Canvas Login UI: Identity Service Discovery
  Page" at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Discovery Page" to open the modal
- verify the "Disabled" pill appears in the header
- verify the "View Discovery Page" link opens the
  discovery page in a new tab
- enable the discovery page toggle, save the form
- reopen the modal and verify "Enabled" pill shows
- make a change and click Save
- verify a confirmation dialog warns that changes
  will be immediately visible to users
- cancel the confirmation and verify save did not occur
- confirm the dialog and verify save completes
- make a change and click Close
- verify an unsaved changes confirmation dialog appears
- cancel and verify the modal stays open
- confirm close and verify the modal closes
- resize the browser narrow and verify the pill and
  link wrap below the heading as a single unit

Change-Id: Ia83817d0d6c479d153e98672395255480c817369
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406023
QA-Review: Michael Hulse <[email protected]>
Product-Review: Michael Hulse <[email protected]>
Reviewed-by: Weston Dransfield <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Custom nav links (nav_menu_link_* tab IDs) were
not surfaced in the K5 course Resources tab.
Now they appear as a "Links" section with
external link cards.

Also fixes issue in course.rb where for K5 subject courses, on the
settings page, the "no eye" icon was not being displayed for disabled
tabs.

refs INTEROP-10283
flag=nav_menu_links

test plan:
- Enable K5 on a subaccount: Admin → Account Settings →
  check "Canvas for Elementary"
  for this account" → Save
- make a course under this subaccount. This will be a K5 subject course.
  (homeroom course can be enabled in course settings)
- Add custom links in account nav settings and course nav settings
- From the course main page, click the Resources tab
- Verify the "Other Resources" section appears with clickable external link cards
- disable one of the nav menu links and verify that it shows with a "no
  eye" icon for a teacher or admin but does not show at all for a
  student

Change-Id: I2aa8ade75874b059129c69e3986b2e3720c0154c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406428
Reviewed-by: Csaba Csuzdi <[email protected]>
QA-Review: Csaba Csuzdi <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Product-Review: Alexis Nast <[email protected]>
closes INTEROP-10325
flag=nav_menu_links

* also, for consistency, uses CanvasHttp.validate_url() in
  NavMenuLink validation even if URl starts with '/'
* also be forgiving if they just paste a URL in and they end up with
  https://https://example.com

Test plan:
- add a custom link with url "http://example.com/1 2" (with space) and
  observe that it now changes space to %20 (previously it would keep the
  space and then cause a ruby error when saving)
- add a link with URL "http://canvas-web.inseng.test//accounts/self"
  (double slash after host) in Course settings. check that the link
  works before and after save. Check in the rails console that it is
  stored as "/accounts/self"
- try to add a link with URL "//example.com/123" and observe that the
  front-end rejects it.
- try adding URL  https://https://example.com and observe that it gets
  turned into https://example.com

Change-Id: I40a9908bf357f0176c95a78d8d29dfcd32bc49ea
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406376
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Csaba Csuzdi <[email protected]>
QA-Review: Csaba Csuzdi <[email protected]>
Product-Review: Alexis Nast <[email protected]>
Display link URL as small secondary text below
the label for NavMenuLink tabs in course settings,
matching the same pattern as account settings.

closes INTEROP-10480
flag=nav_menu_links

test plan:
- Go to course settings > Navigation
- add a custom link (nav menu link)
- Verify nav menu link items show their URL
  in small text below the label. click link to make sure it works.
- save and refresh page and make sure link still appears
- add an custom link with internal url
  (http://canvas-web.inseng.test/courses/123) and save. after page
  refresh check that the link starts with "/" but still shows the full
  url with http://canvas-web.inseng.test

Change-Id: I147b49f5723e4f257a1179c91a9eb5d45ad2ca09
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406184
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Csaba Csuzdi <[email protected]>
QA-Review: Csaba Csuzdi <[email protected]>
Product-Review: Alexis Nast <[email protected]>
Adds the ic-brand-Discovery-custom-message brand variable
to the JWT claims generated for the discovery page preview
iframe. The value is read from the account's brand config
and included in the token payload so the preview page can
display it without requiring frontend changes.

The custom message is gated behind the
new_login_ui_custom_labels site admin feature flag,
consistent with how login and registration custom
messages are handled.

closes AE-3736
flag=new_login_ui_custom_labels

[skip-crystalball]

test plan:
- enable “New Canvas Login UI: Custom Labels” flag
  at /accounts/site_admin/settings#tab-features
- enable "New Canvas Login UI: Identity Service Discovery
  Page" flag at /accounts/site_admin/settings#tab-features
- visit /accounts/self/authentication_providers
- click "Configure" for "Discovery Page" to open the modal
- confirm custom_message appears in the JWT payload
- disable the “New Canvas Login UI: Custom Labels” flag
- confirm custom_message is null in the JWT payload

Change-Id: Ib482b854a9353e5e072c8cae433141cc90e2c02b
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406096
QA-Review: Michael Hulse <[email protected]>
Product-Review: Michael Hulse <[email protected]>
Reviewed-by: Dave Wenzlick <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
This commit fixes an issue with with the wrapping of the buttons on the
App details page. If there were too many buttons, they would all be on
one line and would overflow the container. This commit changes the flex
wrapper div to have `flex-wrap: wrap` so that the buttons will wrap to
the next line if there are too many.

test plan:
1. Go to the App details page for an app with many buttons (Create a
registration update request, and view a DR app with reinstallation
enabled).

2. Ensure that the buttons wrap to the next line and do not overflow
the container.

closes INTEROP-10507
flag=none

Change-Id: I7e945d50a5aaaef11a18716d03208272c3c7631d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406872
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Ryan Hawkins <[email protected]>
QA-Review: Ryan Hawkins <[email protected]>
Product-Review: Ryan Hawkins <[email protected]>
When validating discovery page settings, the validator
would crash with ActiveRecord::SubclassNotFound when
encountering a deleted provider with an invalid
auth_type (e.g., legacy “twitter” that no longer has a
subclass). This occurred because Rails attempted STI
resolution during the iteration and method call.

We now use a database query with the
valid_for_discovery_page scope to check provider
existence and activity directly, avoiding STI
instantiation entirely. Invalid or deleted providers
gracefully return nil and fail validation with a clear
error message instead of raising an exception.

closes AE-3825
flag=none

[skip-crystalball]

test plan:
- run the account settings validator spec
- ensure the new test for legacy deleted providers
  passes without raising SubclassNotFound exceptions
- validate an account with a discovery page entry
  referencing a deleted provider
- expect validation to fail with the appropriate error
  message, not with an STI instantiation exception

Change-Id: I12c116989b46ae94700d72278e26447281f67ba2
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406707
QA-Review: Michael Hulse <[email protected]>
Product-Review: Michael Hulse <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Weston Dransfield <[email protected]>
refs AE-3801
flag=none

many developer keys include this and would
break if it disappeared. re-introducing it
to prevent that until a better story
evolves around handling invalid scopes on
dev keys

Change-Id: I9dc4b4dd926a77989d20b318404066eab553311c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406965
Reviewed-by: Xander Moffatt <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Jake Oeding <[email protected]>
Product-Review: Jake Oeding <[email protected]>
refs EGG-2507
flag=peer_review_allocation_and_grading

Replaced the following localized messages for errors:
- "Unlock date" -> "Available from date"
- "Lock date" -> "Until date"

This change only modifies customer visible UI strings,
the lock / unlock terminology on the backend is kept as is.

[fsc-timeout=120]
[fsc-node-count=35]
[fsc-max-nodes=35]

test plan:
- create an assignment and attempt to set the dates
in a wrong way
- set due date to 15th April
- set review due date to 13rd April
- set available from date to 6th April
- set until date to 5th April
- error messages should display under each field
- verify "lock" and "unlock" language is changed

Change-Id: Ibc6bd81159564f777634558fca7cd01f13bb421d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406292
Reviewed-by: Artsiom Bolhar <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Jason Gillett <[email protected]>
QA-Review: Jason Gillett <[email protected]>
Product-Review: Martin Yosifov <[email protected]>
refs AE-3466
flag=none

Instructure Identity pseudonyms are only filtered
from SisPseudonym.for results when current_user: is
provided. Without it, pending inst pseudonyms are
visible to all callers.

Not addressed (no current_user context available):
- Authentication loading (authentication_methods.rb,
  inst_access_token.rb, kaltura_helper.rb) — these
  load the session user's own pseudonym; filtering
  on self would be incorrect
- Model layer (course.rb, user.rb, message.rb, etc.)
- Background jobs and exporters (live_events.rb,
  gradebook_exporter.rb, enrollment_importer.rb,
  user_list_v2.rb, lti/*.rb, account_reports,
  custom_reports)

test plan:
- specs pass (here and in mra PS)

Change-Id: I0de2508641ae7436b1233427ac5d28dfb5c26f09
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405582
Reviewed-by: Weston Dransfield <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Dave Wenzlick <[email protected]>
Product-Review: Dave Wenzlick <[email protected]>
This reverts commit 6b97896.

Reason for revert: This doesn't resolve the issue from the ticket, and we're concerned it might have unintended consequences that we don't need.

Change-Id: Ieeb4195340f8476da9f9f221e2cf4dc96fc94515
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406994
Reviewed-by: Kasra Rismanchi <[email protected]>
QA-Review: Kasra Rismanchi <[email protected]>
Product-Review: Kasra Rismanchi <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
EAP ending; widget dashboard moves to GA Opt-in.
Drops the "Use Widgets for Dashboard" toggle and
"Early Adopter Program Settings" section. The
dashboard version switcher button stays.

closes LX-4100
flag=widget_dashboard

test plan:
- Enable widget_dashboard feature flag on root
  account; log in as student
- Open user profile tray; confirm "Early Adopter
  Program Settings" heading and toggle are gone
- Confirm Accessibility Settings section still
  renders
- Confirm "Switch to new/old dashboard view"
  button on dashboard still toggles both ways

Change-Id: Ieb45ed4191673b11575ad2fa69be0c5bb735d384
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406776
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Sarah Gerard <[email protected]>
QA-Review: Sarah Gerard <[email protected]>
Product-Review: Drake Harper <[email protected]>
Wire CanvasRce into the educator announcement
creation widget via platform-ui's renderMessageEditor
render prop.
The host renders a bare CanvasRce —
platform-ui owns the FormField wrapper, label,
required asterisk, and screen-reader announcement.

The main goal of this ticket is that the RCE is wired into
the widget and can be used to create an announcement

closes EGG-2471
flag=educator_dashboard

test plan:
- enable educator_dashboard feature flag
- visit /, open the announcement creation widget
- verify the RCE renders
- type content, pick a course, and submit
- verify the announcement is created with the content
that was in the RCE

Change-Id: I55ec5c0deb705716f32508da46f73e6ea0d5bd85
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406799
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Angela Gomba <[email protected]>
QA-Review: Angela Gomba <[email protected]>
Product-Review: Jason Gillett <[email protected]>
Change-Id: I1078d7ed968cacedec3cd5ba6824982ae3b0e9c1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407015
Tested-by: Service Cloud Jenkins <[email protected]>
Change-Id: I139258443665bf910d7821dbd26c5604f4846d67
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407016
Tested-by: Service Cloud Jenkins <[email protected]>
Change-Id: Id7578a9992980dc9d0e4d7c653cc3564cac0c920
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407017
Tested-by: Service Cloud Jenkins <[email protected]>
Cache TPs for ACTLs. Check current submission first in
find_attempt_for_report before loading all versions.
Preload old versions of submissions with multiple attempts.

refs INTEROP-10487
flag=lti_asset_processor_tii_migration

test plan:
- enable lti_asset_processor_tii_migration on an account
- set up account with TII LTI 2.0 tool proxy and assignments
  with originality reports
- trigger migration via the API
- verify migration completes successfully
- verify asset processors and asset reports are created
  correctly for each assignment

Change-Id: I1329cce53050601a9d3aa327072cec3830f0c010
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406676
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Evan Battaglia <[email protected]>
QA-Review: Evan Battaglia <[email protected]>
Product-Review: Csaba Csuzdi <[email protected]>
The new on_migration_failed function makes it possible
to add custom alerting to the migrator

refs INTEROP-10487
flag=lti_asset_processor_tii_migration

test plan:
- regression test:
- add a logline to on_migration_failed
- create an LTI2 TP
- configure an assignment with it
- inject an error to tii_tp_migration function
- migrate
- check in the logs if on_migration_failed was called

Change-Id: Iaec6c77419b1be850e33c4ab59e85e532d894f67
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406746
Reviewed-by: Evan Battaglia <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Csaba Csuzdi <[email protected]>
Product-Review: Csaba Csuzdi <[email protected]>
The "Switch to new dashboard view" button should be
hidden when an observer is observing themselves, since
observers are not meant to see the widget dashboard in
that case. Observers viewing a student and plain students
still see the button as before.

fixes LX-3829
flag=widget_dashboard

test plan:
- log in as an observer that observes a student
- go to dashboard, select the student in observer picker
- verify "Switch to new dashboard" button is visible
- switch the observer picker to self
- verify the button is hidden
- log in as a student
- go to dashboard
- verify "Switch to new dashboard" button is visible

Change-Id: I30182bcee184794c264ef59dd2266112dec3d558
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406646
Reviewed-by: Sarah Gerard <[email protected]>
QA-Review: Sarah Gerard <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Product-Review: Zoe Lubitz <[email protected]>
The multiple_root_accounts plugin was already changed to use pv5
so this change will have no effect.

Test Plan
Check that PageView functionality has not changed.

flag=none
refs PVIEW-1004

Change-Id: I7ab14d9594b9829f195b2205b995a9b527e83d3a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405816
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Robert Sznyida <[email protected]>
Reviewed-by: Peter Michaleczky <[email protected]>
Product-Review: Robert Sznyida <[email protected]>
closes IMP-7330
flag=institutional_tags

Test Plan:
 - Use SIS import to import all inst tagging content
 - Run the separate export for them.
 - Run the provisioning export for them.
 - Both should be correct.

Change-Id: I1eafb88b15eac7d087dfa91f7b78485fb17cc273
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406865
Reviewed-by: Kristof Mehes <[email protected]>
Reviewed-by: David Hajnal <[email protected]>
QA-Review: David Hajnal <[email protected]>
Product-Review: David Hajnal <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
- Make Width and Height input labels visible
  instead of screen-reader-only
- Remove redundant "Custom width and height
  (Pixels)" heading
- Update FormFieldGroup description to
  "Custom Dimensions" (screen-reader-only)
- Fix lock icon alignment between inputs
- Fix focus ring overflow causing horizontal
  scroll

fixes ARC-11311
flag=none

test plan:
- open Studio Media Options tray
- select custom dimensions
- verify Width and Height labels are visible
- verify lock icon is centered between inputs
- focus each input, verify no horizontal scroll

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Change-Id: I85291a80a8cf0d33f88ce1ecbb223e82c4213dca
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406757
Reviewed-by: Kristóf Baján <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Kristóf Baján <[email protected]>
Reviewed-by: Zoltan Dalmadi <[email protected]>
Product-Review: Patrik Gerzsenyi <[email protected]>
Bump @instructure/studio-player to 1.10.0 which
adds studio_transcript_editing track event for
inline transcript editing. Wire it to Pendo
behind rce_asr_captioning_improvements flag:

- canvas_transcript_editing (enter_edit_mode,
  segment_edited, autosave_succeeded,
  autosave_failed) with user roles attached

Also fixes CSS issues introduced by the player
upgrade: loading state and transcript editing
layout now render correctly.

refs ARC-11580
flag=rce_asr_captioning_improvements

test plan:
- Enable rce_asr_captioning_improvements flag
- Embed a media with Show Rolling Transcript
  enabled and open it in RCE Editor
- Verify loading state displays correctly
  (no blank screen or broken layout)
- Click Edit Transcript and edit a segment
- Verify transcript editing UI renders correctly
- Verify Pendo events fire with correct params
  via console.log in trackPendoEvent:
  - enter_edit_mode on clicking edit
  - segment_edited on saving a line
  - autosave_succeeded / autosave_failed
    depending on network outcome
- Confirm roles array is included in the event

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Change-Id: I7229067e33c42def7c19d66db6351815e570ae46
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406866
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Tamas Jakli <[email protected]>
Reviewed-by: Kristóf Baján <[email protected]>
QA-Review: Kristóf Baján <[email protected]>
Product-Review: Jozsef Gubicza <[email protected]>
test plan:
- include `docker-compose/rdbg.override.yml` in your `.env` file.
- then `inst canvas restart --debug` from the terminal
- put a breakpoint in user.rb#sortable_name
- lunch "Attach with rdbg to jobs server (tcp 12356)" debug config
- from the rails console trigger
a delayed job `User.first.delay.sortable_name`
- the code execution should stop at your breakpoint

Change-Id: I30ffe489932d859e7f14029f2727c5e4ff6a0af1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406762
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: James Butters <[email protected]>
Build-Review: James Butters <[email protected]>
QA-Review: Adrián Grúber <[email protected]>
Product-Review: Adrián Grúber <[email protected]>
test plan:
- run `inst canvas restart --debug`
- choose any rspec tests case
- put a breakpoint on one of the lines
- run the test with "Debug Current Spec (Docker)"
debug config
- the execution should stop at the breakpoint.

Change-Id: I0c5f0e39c3f9fcd2decc81a4613794a5d9a1062c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406860
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: James Butters <[email protected]>
QA-Review: Adrián Grúber <[email protected]>
Product-Review: Adrián Grúber <[email protected]>
This index improves performance of the `update_learning_outcome_results`
query from ~6 minutes down to ~50ms.

flag = none
closes: QO-1394

Change-Id: I8c3a4f2a44455a6004ca0300ef197e16bfd6b5cf
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406484
Reviewed-by: Cody Cutrer <[email protected]>
Migration-Review: Cody Cutrer <[email protected]>
QA-Review: Hossam Aladdin <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Product-Review: András Maróy <[email protected]>
dwilli77 and others added 28 commits April 29, 2026 17:21
GraderErrors were displayed directly to users in the
auto_grade_orchestration flow, but the grade_service
was wrapping all errors — including internal Ruby errors
and verbose Cedar API responses — as GraderErrors. This
caused technical stack traces and internal details to
leak to users.

Now only known-safe Cedar error subclasses surface their
messages to users, mapped to grading-specific copy.
The base CedarClientError and all unexpected errors log
their details and raise a generic user-safe message.
The criteria mismatch error likewise logs its count
details instead of exposing them.

refs EVAL-6799
flag=project_lhotse

test plan:
Setup:
- Set up a course with an assignment, rubric,
  and a student submission eligible for auto-grading

Testing:
- Trigger auto-grading on a submission that exceeds
  the Cedar content length limit and verify the user
  sees "The submission is too long to be graded
  automatically." rather than a raw Cedar message
- Trigger auto-grading when Cedar's rate limit is
  hit and verify "Grading is temporarily unavailable.
  Please try again later."
- Simulate a Cedar API error that doesn't match a
  known subclass and verify the user sees a generic
  message, not internal Cedar API details

Change-Id: If349e5a07f0104b6a535cf1f512d0e06da44c6fe
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406489
Reviewed-by: Rajmund Csehil <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Chris Soto <[email protected]>
QA-Review: Chris Soto <[email protected]>
Product-Review: Yasi Afsharnive <[email protected]>
if a grade was zero, it was displayed as a dash in
the individual gradebook

closes EVAL-6516
flag=none

test plan:
- set up an assignment to use a grading scheme
  -- ensure 0% is covered in the scheme
- grade that assignment as a zero
- verify that the letter grade is displayed correctly
in the Student Information section of the individual gradebook

Change-Id: Ief85b7bdf38ed9ace698680b34308e56b9a6156d
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406325
Reviewed-by: Chris Soto <[email protected]>
Reviewed-by: Spencer Olson <[email protected]>
QA-Review: Derek Williams <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Product-Review: Yasi Afsharnive <[email protected]>
When a graded discussion uses checkpoints, grade change
events are recorded against each SubAssignment ID, not
the parent assignment. Filtering gradebook history by
the parent assignment returned no results because the
query used an exact match on the parent ID.

When the selected assignment is a checkpoint parent,
expand the query to include the parent and all active
sub-assignment IDs using an IN clause via the existing
for_scope_conditions path. Grader and student filters
are still applied when provided.

fixes EVAL-5785
flag=discussion_checkpoints

Test plan:
Setup:
- Have a course with at least one student enrolled
- Create a graded discussion with checkpoints enabled
  and publish it
- Grade the student on both checkpoints

Testing:
- Go to Gradebook History for the course
- In the Artifact filter, search for and select the
  discussion topic
- Click Filter
- Verify grade change events are returned for both
  checkpoints (Reply to Topic, Required Replies)
- Re-filter adding a Grader and verify only events
  for that grader are returned
- Re-filter adding the Student and verify only events
  for that student are returned
- Verify a non-checkpoint assignment still works
  correctly in the Artifact filter

Expected Results:
- Checkpoint grade changes appear when filtering by
  the parent discussion assignment
- Grader and student filters narrow results correctly
- Non-checkpoint assignments are unaffected

Change-Id: I9a5cbfbed92f29ff05edbf249805a15c1d73cf6c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406665
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Chris Soto <[email protected]>
Reviewed-by: Kai Bjorkman <[email protected]>
QA-Review: Derek Williams <[email protected]>
Product-Review: Yasi Afsharnive <[email protected]>
this commit fixes the AssignmentPointsDifferenceModal from not rendering
when a user creates a rubric with points possible that is different from
the assignment points possible on the assignment's page. The issue was
that the check for whether the points were different was including a
check for whether there was already an active rubric so it only
displayed when updating the rubric on the assignment

fixes EVAL-6830
flag=enhanced_rubrics

test plan:
- go to the assignment's show page and verify that when creating a new
  rubric for the assignment that if the points are different from the
  assignment points possible and the "Use for assignment grading"
  checkbox is checked that the AssignmentPointsDifferenceModal renders
- after save, verify that the AssignmentPointsDifferenceModal is also
  rendered if you edit that rubric with points different.
- remove the rubric from the assignment.
- create a new rubric and verify that if you create a rubric with points
  different and do not have the "Use for assignment grading" checkbox
  checked that the AssignmentPointsDifferenceModal does not render.
- go to the /rubrics page and verify that when creating or updating a
  rubric that it never triggers the AssignmentPointsDifferenceModal.

Change-Id: Icb045078138c76222f9b51712f9f05814a4ad53a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407475
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Kai Bjorkman <[email protected]>
Reviewed-by: Derek Williams <[email protected]>
QA-Review: Derek Williams <[email protected]>
Product-Review: Yasi Afsharnive <[email protected]>
the file referenced was removed in g/261784

actually, the file referenced never existed in that location;
the comment was updated to reference ui/features in g/258807,
which landed a week after the file was deleted from app/coffeescripts

flag=none
test plan: N/A
refs FOO-6341

Change-Id: Ib6c83f41adfcace929a8b8c15faa59deb51c4753
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407617
Reviewed-by: August Thornton <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Jeremy Stanley <[email protected]>
Product-Review: Jeremy Stanley <[email protected]>
When a student submits a new attempt on an assignment, we want to keep
the AttachmentAssociations from previous attempts around. This moves us
towards a future where we use AttachmentAssociation-based auth checks
to determine if a submission is associated with an attachment.

Note that this change does not impact the returned attachments from
Submission#attachments. That will continue to only return attachments
from the most recent attempt.

closes GROW-234
flag=none

[fsc-timeout=75]
[fsc-node-count=10]

Test Plan 1:
1. turn OFF "Assignment Enhancements - Student"
2. create a file upload assignment
3. submit File A as a student. then submit again, but submit File B.
4. Go to /courses/:id/assignments/:assignment_id for the assignment,
   as the student
5. Notice you only see a "Download File B" link in the sidebar, not a
   "Download File A" link.

Test Plan 2:
1. create a file upload assignment
2. submit File A as a student. then submit again, but submit File B.
3. Go to /graphiql as a site admin user
4. Make sure the following request only returns File B

query MyQuery {
  submission(
    userId: <the student id>,
    assignmentId: <the assignment id>
  ) {
    attachments {
      displayName
      _id
    }
  }
}

Change-Id: Ibc15fb29f9b3fa26594b4785c852eaf0b442122a
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405710
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Rajmund Csehil <[email protected]>
QA-Review: Rajmund Csehil <[email protected]>
Product-Review: Cameron Ray <[email protected]>
Adds accessible label to IconPeerReviewLine so
screen readers can identify the icon in the
student peer reviews list.

closes EGG-2375
flag=peer_review_allocation_and_grading

QA: https://instructure.atlassian.net/browse/EGG-2375?focusedCommentId=2912334

test plan:
- Navigate to an assignment with peer reviews
- Open student view and check the peer reviews
  section
- Inspect the HTML via the dev tools and verify that the SVG has the aria-label "Peer Review"

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Change-Id: Id1fcd277c5ce026a2d8ee07a70fd8e4c7bcf36ce
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407626
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Martin Yosifov <[email protected]>
QA-Review: Martin Yosifov <[email protected]>
Product-Review: Angela Gomba <[email protected]>
this commit refactors the rubric form to not use nested tables in the
criteria container. it will instead be seperate sections with headers
for each criteria. it also fixes the display and responsiveness of the
Generate Criteria buttons so that they display correctly and wrap
responsively on smaller screens.

fixes EVAL-6753
fixes EVAL-6755
flag=enhanced_rubrics

test plan:
- open the rubric form page and add a criteria, an outcome criteria,
  and a couple AI generated criteria.
- verify that the criteria are all displayed correctly
- make the criteria responsive down to 320px and verify that they are
  still displayed correctly
- verify that the GeneratedCriteriaHeader component renders properly and
  that the contents of the header wrap responsively as well.
- verify that the Generate Criteria button for an individual criterion
  is displayed correctly and becomes added to the action menu for that
  criterion when the viewport is under 550px
- verify that both Generate Criteria buttons correctly open and close
  the RegenerateCriteriaModal and that the modal closes correctly when
  cancelling or regenerating criteria.

Change-Id: I6302148ee5bceca41e16664fc1ed7dbe9f06e114
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405700
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Derek Williams <[email protected]>
Reviewed-by: László Sipula <[email protected]>
QA-Review: László Sipula <[email protected]>
Product-Review: Cameron Ray <[email protected]>
flag=ai_experiences
fixes EGG-336

implements tabbed view to match designs
Removes AI Analysis section (will be
re-introduced once we get real AC)
refactors frontend code to fix linter errors
removes backend code used only by
old ai conversations route

also: removes AI analysis, as it was a POC.
it will be reintroduced when PM comes up
with new Analysis AC

test plan:
- jenkins passes
- see demo video in ticket
(it should give you a general idea of
what to test)

Change-Id: I1a34d2b1c7c0608df4c859d374cdb871e9bee766
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407602
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Jason Anderson <[email protected]>
QA-Review: Jason Anderson <[email protected]>
Product-Review: Caleb Guanzon <[email protected]>
pass ENV.disable_keyboard_shortcuts to the speedgrader context so
the new speedgrader can respect the user's keyboard shortcut preference.

fixes EVAL-6474
flag=none

test plan:
- go to account settings and enable "Disable Keyboard Shortcuts"
- open speedgrader with the new speedgrader enabled
- press J or K
- verify student does not navigate

Change-Id: I42dc5d966e59ca5dcd6ce2ddfbc4d42c28e79116
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/406423
Reviewed-by: Chris Soto <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Derek Williams <[email protected]>
QA-Review: Derek Williams <[email protected]>
Product-Review: Cameron Ray <[email protected]>
Returns five submission counts for a single assignment
scoped to the teacher calling the API: on_time, late, and
resubmitted needs-grading pills, plus submitted and total
enrollment counts.

For moderated assignments before grades are published,
applies the same provisional-grade exclusion used by
NeedsGradingCountQueryOptimized so all five metrics
reflect what is on this teacher's plate.

Wires the counts into the todo item API serializer
alongside the existing needs_grading_count field.

refs EGG-2561
flag=educator_dashboard

test plan:
- bin/rspec spec/models/assignments/teacher_todo_metrics_query_spec.rb
- bin/rspec spec/models/assignments/needs_grading_count_query_spec.rb
- bin/rspec spec/apis/v1/todo_items_api_spec.rb

Change-Id: I9e3da4cb911984f34b4cb5d1bebc4f1611a06810
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407562
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Martin Yosifov <[email protected]>
QA-Review: Martin Yosifov <[email protected]>
Product-Review: Jason Gillett <[email protected]>
Move reusable API, query, translation, and theme
code from ui/features/notebook/ into the new
ui/shared/notebook/ package so the upcoming
notebook_index feature can import from a single
shared location.

closes LX-4122
flag=none

test plan:
- open a wiki page with notebook feature enabled
- verify notebook button appears and tray opens
- verify highlights and note saving still work

Change-Id: I51bf286bce892fe85732fe4f8b545118961a1496
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407329
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Eric Saupe <[email protected]>
QA-Review: Eric Saupe <[email protected]>
Product-Review: Sarah Gerard <[email protected]>
Replace Journey-based study tools with a Canvas
endpoint that calls Cedar directly for Summarize,
Quiz me, and Flashcards. Journey plumbing removed
from the study_assist path.

closes LX-4114
flag=study_assist

test plan:
- enable study_assist in a course and sign in as
  a student
- open a wiki page and click the study tools
  button
- verify chips show Summarize, Quiz me,
  Flashcards (per per-tool feature flags)
- click Summarize and confirm a summary renders
- click Quiz me and Flashcards and confirm they
  render
- click regenerate on Quiz / Flashcards and
  confirm a new call is made
- open a course file (PDF or text) and repeat
- disable study_assist or each per-tool flag and
  confirm the tools hide or return an error

Change-Id: Ia9c7b53d13a0e6991a72bbfcf0635d81e5576958
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407249
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Sarah Gerard <[email protected]>
QA-Review: Sarah Gerard <[email protected]>
Product-Review: Eric Saupe <[email protected]>
closes: EGG-2540
flag=educator_dashboard

test plan:
- enable educator_dashboard on default account
- as a teacher, visit / and confirm the
  educator dashboard renders
- as a student, visit / and confirm it does
  not render

Change-Id: I15cd02dd6f04a8d9448573706a82cb4f4259e1e7
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407599
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Jason Gillett <[email protected]>
QA-Review: Jason Gillett <[email protected]>
Product-Review: Ferenc Marcsó <[email protected]>
  Cascade-restore queries filter by workflow_state='deleted'
  and updated_at to find rows archived in the same operation.
  Without partial composite indexes these scans grow with
  total deleted rows. Add postdeploy partial indexes on
  (institutional_tag_id, updated_at) and
  (category_id, updated_at) to keep restore O(matched rows).

  refs IMP-7422
  flag=none

  test plan:
  - run db:migrate; verify both indexes exist
  - archive a category with tags + associations
  - restore the category; confirm cascade restores
    associated tags and associations
  - EXPLAIN cascade_restore_associations_for query uses
    idx_inst_tag_assoc_tag_archived_updated_at

Change-Id: If678db8dc0f1455bad4b61c90ef5d0512d4ece88
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407569
Reviewed-by: Norbert György <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Cody Cutrer <[email protected]>
Migration-Review: Cody Cutrer <[email protected]>
QA-Review: David Hajnal <[email protected]>
Product-Review: David Hajnal <[email protected]>
Hover state should be driven by actual cursor
position, not per-cell enter/leave events which
browsers drop on fast movement.

fixes OUTC-783
flag=improved_lmgb

test plan:
- open Learning Mastery Gradebook
- sweep cursor quickly across multiple
  outcome bar charts
- verify only one expand button is visible
  at any time
- click expand and confirm the popover
  still opens correctly

Change-Id: Id679125072712e26331d6e9aae1c7fea28401669
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407488
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Balázs Buri <[email protected]>
Reviewed-by: Balázs Buri <[email protected]>
Product-Review: Sam Garza <[email protected]>
When switching to LMGB via ?view=learning_mastery, render
the correct template directly instead of redirecting to
/gradebook. The redirect + re-read pattern was unreliable:
if the DB read in the second request returned stale data
(e.g., read replica lag), Traditional Gradebook would show
instead of LMGB.

fixes OUTC-784
flag=outcomes_gradebook

test plan:
- Go to Traditional Gradebook for a course
- Open the gradebook dropdown menu
- Click "Learning Mastery Gradebook"
- Verify LMGB loads consistently (no intermittent
  Traditional Gradebook reload)

Change-Id: I0eada5c063c3f40bc789b1ce95059f71d705118c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407516
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Balázs Buri <[email protected]>
QA-Review: Balázs Buri <[email protected]>
Product-Review: Sam Garza <[email protected]>
Implementation of E2E tests, consisting of tests for:
-missing table caption rule
-missing table headers rule
-missing table header scope rule

closes RCX-5005
flag=a11y_checker

[fsc-timeout=75]
[fsc-node-count=10]

test plan:
- tests should pass

Change-Id: I4b65fc7e155fecaefbb37755f0a6e9a06306fcb9
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407512
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Marta Nagy <[email protected]>
QA-Review: Adam Zoltan Jelenszky <[email protected]>
Product-Review: Adam Zoltan Jelenszky <[email protected]>
closes RCX-5073

test-plan:
-pipeline passes
-open http://canvas-web.inseng.test/graphiql
-go to course endpoint
-execute a query to show the files
-both size, and size_bytes should work

Change-Id: Ib143bf5bc78f259072878d419e9f2b41960b7a33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407590
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Rajmund Csehil <[email protected]>
QA-Review: Ferenc Marcsó <[email protected]>
Product-Review: Ádám Máté <[email protected]>
closes: EGG-2452
flag=educator_dashboard

test plan:
- enable educator_dashboard and
  a11y_checker_account_statistics on the account
- GET the educator a11y statistics endpoint
  (users/:id/educator_accessibility_course_statistics)
  with no include[]: rows omit course_name,
  course_code, published, closed_issue_count
- adding ?include[]=closed_issue_count
  &include[]=course_details includes those fields
- as a student, the endpoint returns 403
- as a teacher in only completed/deleted courses,
  the endpoint returns 403
- POST users/:id/educator_accessibility_course_scan
  as a teacher returns 200; as a student, 403

Change-Id: Iad2793c951271ac8d14ff1bf7c4c9dc4d7bdb28c
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407655
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Dániel Török <[email protected]>
Reviewed-by: Zsolt Mester <[email protected]>
QA-Review: Zsolt Mester <[email protected]>
Product-Review: Ferenc Marcsó <[email protected]>
Move AssignmentPostingPolicyTray to ui/shared/ so
it can be used from both the regular and individual
gradebook without violating feature interdependence
rules.

Add a "Grade Post Policy" button to AssignmentActions
in the individual gradebook that opens the tray.

closes EVAL-6228
flag=none

test plan:
- Open the individual gradebook
- Select an assignment
- Confirm "Grade Post Policy" button appears below
  Curve Grades
- Click the button and confirm the tray opens with
  the assignment name in the header
- Save a policy change and confirm the success alert

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Change-Id: Iba13726eacba29007c1345b8d36acc6839963744
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405769
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Jacob DeWar <[email protected]>
QA-Review: Jacob DeWar <[email protected]>
Reviewed-by: Chris Soto <[email protected]>
Product-Review: Yasi Afsharnive <[email protected]>
This reverts commit 436d7c3.

Reason for revert: This change causing regression issues, for
example site admin could not access a11y features.

Change-Id: I8b552e9a1cd2715350af5a2107a34d08563a9441
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407437
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Zsolt Mester <[email protected]>
QA-Review: Zsolt Mester <[email protected]>
Product-Review: Ferenc Marcsó <[email protected]>
Implementation of E2E tests, consisting of tests for:
-low contrast issues with small text
-low contrast issues with large text

closes RCX-5002
flag=a11y_checker

[fsc-timeout=75]
[fsc-node-count=10]

test plan:
- tests should pass

Change-Id: I9b19cbd9b9f5966492925b391a094eacd2744f20
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407600
Reviewed-by: Marta Nagy <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
QA-Review: Adam Zoltan Jelenszky <[email protected]>
Product-Review: Adam Zoltan Jelenszky <[email protected]>
User.courseProgression returned null when queried via
enrollments → course → usersConnection across more
than one course. Move context.scoped_merge!(course:)
out of the preload_course_permissions.then block so
its scoped path is attributed to the resolver, not
the deferred batch flush.

fixes LX-4162
flag=none

test plan:
- as a learner enrolled in 2+ module-based courses
  with completion requirements, run the multi-course
  GraphQL query from the ticket
- verify courseProgression.requirements is populated
  for every course (not null)
- single-course query still returns progression
- REST progress endpoint still works

Change-Id: Iadd785788e6c6e153a5067fc1e2973c2e31b0fe6
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407576
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Sarah Gerard <[email protected]>
QA-Review: Sarah Gerard <[email protected]>
Product-Review: Sarah Gerard <[email protected]>
The "Instructor Score" / "Peer Review Score" label in
the rubric assessment panel was overflowing and
overlapping adjacent content when translated into
languages with longer strings (e.g., Norwegian).

Wrapped the label in TruncateText so it truncates
gracefully when space is constrained, and added a
Tooltip that appears on hover only when the text is
actually truncated, preserving the full label for
accessibility.

Changes:
- Import TruncateText and Tooltip components
- Track truncation state via onUpdate callback
- Render Tooltip conditionally based on truncation
- Adjust margin when label is truncated

fixes EVAL-5857
flag=none

Test plan:
Setup:
- Enable a course with peer review assignments
- Create a rubric and attach it to the assignment
- Open Canvas in English and in Norwegian
  (Account Settings > Language)

Testing:
- In English: verify "Instructor Score" label renders
  normally with no truncation or tooltip
- Switch language to Norwegian and reopen the rubric
  assessment panel
- Verify the label truncates instead of overflowing
  into adjacent content
- Hover over the truncated label and verify a tooltip
  appears showing the full translated label text
- Verify the layout does not shift or break for other
  rubric elements
- Repeat for peer review rubric and verify
  "Peer Review Score" behaves the same way

Expected Results:
- No text overlap in any language
- Tooltip only appears when label is actually truncated
- English labels are unaffected and render normally
- Layout remains stable across both score label types

Change-Id: I1453fcd3192b85ce32c27140f7873e9b0012d664
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407478
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Chris Soto <[email protected]>
Reviewed-by: Derek Williams <[email protected]>
Reviewed-by: Kai Bjorkman <[email protected]>
QA-Review: Chris Soto <[email protected]>
QA-Review: Jacob DeWar <[email protected]>
Product-Review: Cameron Ray <[email protected]>
Screen reader users navigating the caption list now hear
the status (Processing/Failed) when focusing a language
name, satisfying WCAG 1.3.1.

refs ARC-11503
flag=rce_asr_captioning_improvements

test plan:
- open Caption Manager, trigger auto-captioning
- verify screen reader announces status with
  the language name
- verify no aria-describedby in ready state

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Change-Id: I27e5e2d9d0ef1b202d16e823de112ac0ca1c8008
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/405975
Reviewed-by: Tamas Jakli <[email protected]>
Tested-by: Service Cloud Jenkins <[email protected]>
Reviewed-by: Jozsef Gubicza <[email protected]>
QA-Review: Jozsef Gubicza <[email protected]>
Product-Review: Patrik Gerzsenyi <[email protected]>
Change-Id: I08bb9f45154aeec6c199a5fc3c000e5673a6e0e2
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407679
Tested-by: Service Cloud Jenkins <[email protected]>
Change-Id: I51dbde60f0a52a1a1a9f90190d3006c2649feb65
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/407681
Tested-by: Service Cloud Jenkins <[email protected]>
@braysch braysch force-pushed the jab/live-events-classic-quiz-no-assn-new-event-types branch from d83c5e9 to 414f36c Compare May 6, 2026 20:09
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.