LookupError: No installed app with label 'grades' and unpickle not working

Hi,
while running Open edX with tutor I see the following error message in the logs:

cms-worker-1   | [2025-05-28 07:06:20,530: ERROR/ForkPoolWorker-3] [2cab9916-ef30-47c0-bc4d-fe0c07481727] failed due to Traceback (most recent call last):
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/client/default.py", line 445, in decode
cms-worker-1   |     value = int(value)
cms-worker-1   |             ^^^^^^^^^^
cms-worker-1   | ValueError: invalid literal for int() with base 10: b'\x80\x04\x95\xf4\x00\x00\x00\x00\x00\x00\x00\x8c\x15django.db.models.base\x94\x8c\x0emodel_unpickle\x94\x93\x94\x8c\x06grades\x94\x8c\x14ComputeGradesSetting\x94\x86\x94\x85\x94R\x94}\x94(\x8c\x06_s

During handling of the above exception, another exception occurred:

cms-worker-1   | Traceback (most recent call last):
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/celery/app/trace.py", line 453, in trace_task
cms-worker-1   |     R = retval = fun(*args, **kwargs)
cms-worker-1   |                  ^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/celery/app/trace.py", line 736, in __protected_call__
cms-worker-1   |     return self.run(*args, **kwargs)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/edx_django_utils/monitoring/internal/code_owner/utils.py", line 193, in new_function
cms-worker-1   |     return wrapped_function(*args, **kwargs)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/edx-platform/lms/djangoapps/grades/tasks.py", line 71, in compute_all_grades_for_course
cms-worker-1   |     for course_key_string, offset, batch_size in _course_task_args(course_key=course_key, **kwargs):
cms-worker-1   |   File "/openedx/edx-platform/lms/djangoapps/grades/tasks.py", line 373, in _course_task_args
cms-worker-1   |     batch_size = ComputeGradesSetting.current().batch_size
cms-worker-1   |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/config_models/models.py", line 133, in current
cms-worker-1   |     cached_response = TieredCache.get_cached_response(cache_key)
cms-worker-1   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/edx_django_utils/cache/utils.py", line 191, in get_cached_response
cms-worker-1   |     django_cached_response = cls._get_cached_response_from_django_cache(key)
cms-worker-1   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/edx_django_utils/cache/utils.py", line 262, in _get_cached_response_from_django_cache
cms-worker-1   |     cached_value = django_cache.get(key, _CACHE_MISS)
cms-worker-1   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/cache.py", line 92, in get
cms-worker-1   |     value = self._get(key, default, version, client)
cms-worker-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/cache.py", line 29, in _decorator
cms-worker-1   |     return method(self, *args, **kwargs)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/cache.py", line 99, in _get
cms-worker-1   |     return self.client.get(key, default=default, version=version, client=client)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/client/default.py", line 265, in get
cms-worker-1   |     return self.decode(value)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/client/default.py", line 452, in decode
cms-worker-1   |     value = self._serializer.loads(value)
cms-worker-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django_redis/serializers/pickle.py", line 32, in loads
cms-worker-1   |     return pickle.loads(value)
cms-worker-1   |            ^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/base.py", line 2524, in model_unpickle
cms-worker-1   |     model = apps.get_model(*model_id)
cms-worker-1   |             ^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django/apps/registry.py", line 208, in get_model
cms-worker-1   |     app_config = self.get_app_config(app_label)
cms-worker-1   |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cms-worker-1   |   File "/openedx/venv/lib/python3.11/site-packages/django/apps/registry.py", line 165, in get_app_config
cms-worker-1   |     raise LookupError(message)
cms-worker-1   | LookupError: No installed app with label 'grades'.

Can anyone help me figure out what went wrong?

Was there anything you did recently prior to this happening? Maybe a plugin/patch affecting the grades system?
I could be mistaken but I think grades is part of the lms worker, yet your errors are showing in the cms worker, so maybe something was patched into the wrong place, I’m not 100% certain though