GET /api/course_home/v1/navigation/<course key> answers HTTP 500 with the LMS
error page for a window after a publish. The log shows
LearningContext.DoesNotExist then
CourseOutlineData.DoesNotExist: No CourseOutlineData for <course key>.
The learning_sequences outline the view depends on is written by the CMS
worker on the publish signal. On the measured run that task landed 33 s after
the publish, because the same queue was carrying thousands of per-block
content.search.tasks.upsert_xblock_index_doc tasks, each taking around 21 s.
Until it lands the learner's course home cannot be built at all, while the
neighbouring course_home/v1/outline view and the Blocks API both answer 200
for the same state.
Expected: treat a missing CourseOutlineData the way the outline view does,
falling back to the unfiltered blocks or answering an empty model, rather than a
500.
Environment: Tutor main, 2026-09-11, with ENABLE_COURSEWARE_INDEX = True
and Meilisearch-backed Studio content search on.
GET /api/course_home/v1/navigation/<course key>answers HTTP 500 with the LMSerror page for a window after a publish. The log shows
LearningContext.DoesNotExistthenCourseOutlineData.DoesNotExist: No CourseOutlineData for <course key>.The
learning_sequencesoutline the view depends on is written by the CMSworker on the publish signal. On the measured run that task landed 33 s after
the publish, because the same queue was carrying thousands of per-block
content.search.tasks.upsert_xblock_index_doctasks, each taking around 21 s.Until it lands the learner's course home cannot be built at all, while the
neighbouring
course_home/v1/outlineview and the Blocks API both answer 200for the same state.
Expected: treat a missing
CourseOutlineDatathe way the outline view does,falling back to the unfiltered blocks or answering an empty model, rather than a
500.
Environment: Tutor
main, 2026-09-11, withENABLE_COURSEWARE_INDEX = Trueand Meilisearch-backed Studio content search on.