This document provides motivation, background, and design for creating a more robust and reliable grading subsystem in the edX platform.

Motivation

As edX further invests in creating a viable platform for teaching and learning credit-deserving courses and degrees, it is essential for us to have a robust grading framework.  As noted in Grading @ duke.edu, accurate grading and prevention of cheating in a MOOC are necessary for successfully making its "MOOC Credit" credible.  This document describes the next steps that the edX Teaching & Learning team plans to make on the path towards more reliable grades.

As we step back and design grading from the perspective of reliability and robustness, we need to ensure that we address the short-term issues faced by our users, including course teams, partners, and learners.  The Inventory of grade issues document gives a rough idea of the types of grading reliability issues that edX has faced over the last 2 years. This design attempts to address the various issues tagged in that document as

Executive Summary

The following table provides a high level summary of our plan of attack to address the high-level use cases and grading-related issues, to date.

Use CaseFeature Design that satisfies the use case
Hide Content to prevent cheatingBlockContentViewPermission
Change of Content doesn't affect past grades

SavedSubsectionGrade

CourseAuthorManualRescoring

Course Version Locking (no longer needed)

Certificates retain accurate gradesPersistentCourseGrade
In Exceptional cases, grades can be overridenGradeOverrides
Event trail enables debugging of grade issuesEventing/Logging of Grading Changes

Background

Please see Grades Background.

Note: For a published description of the final architecture see Grades Architecture.

Requirements

Deferred goals

These are things we would like to do, but will defer until after the initial rollout of these changes.

Future goals

These are things we have considered, but have no plans to pursue at the moment.

Use Cases

Robust Grades

The importance of grades is increasing as we grow the number of courses offered for credit on the edX platform - edX, learners, and course staff want to have reliable grades that all parties can feel confident are accurate.

Grade Exceptions

Like courses on campus, course authors want the ability to provide exceptions to individual learners. Course authors also want to maintain a record of when and why the exception was allowed, to ensure integrity.

Scenarios

The scenarios in this section describe the expected behavior whenever an instructor changes something in an active course after learners have already submitted answers to problems.  These scenarios are not supported on the edX platform today (July, 2016), but will be supported once the changes explained in SavedSubsectionGrade and CourseAuthorManualConflictHandling are implemented.

Starting Condition

For the following scenarios, consider the following starting state:

This is visually depicted as follows:

Scenario 1: Problem Content Edited

In this scenario, the instructor edits the content of the first problem (P1) after the learner has already submitted a response to the problem.  The instructor decides whether or not to rescore the problem, and if so whether or not to rescore only if the learner "gains" (score is improved) from the rescore.

Scenario 2: Problem Weight Edited

In these two scenarios, the instructor edits the weight of the second problem (P2) after the learner has already submitted a response to the problem.  The weight is either increased or decreased.  Increasing the weight of P2 negatively affects the learner's score since the learner had gotten 0 points on it.  So the decision of "rescore if gain only" matters.  In contrast, decreasing the weight of P2 has a positive effect on the learner's score and so the "rescore if gain only" decision doesn't matter.

Scenario 3: Problem Added

In this scenario, an instructor adds a problem (P3) after the learner has already submitted problems in the containing subsection.  Since adding a problem with a non-zero weight will always negatively affect any pre-recorded grades for the containing subsection, "rescore if gain only" will always revert back to the previously recorded grade.

Scenario 4: Problem Removed

In these scenarios, an instructor removes a problem that a learner has already submitted.  If the instructor chooses to rescore, the learner's grade may be negatively or positively impacted depending on which problem is removed.

Scenario 5: Grading Policy changes

When an instructor makes any changes related to the course's grading policy, any learner's grades previously persisted for a subsection is not automatically impacted.  Consider each of the following cases separately:

Design

We expect that the following set of changes will collectively make the grading subsystem more robust and reliable going forward.

Block Content View Permission

Distinguish between

  1. hiding a block's content from the learner's current view (block is still available for grading and appears in course outline), and
  2. hiding entire block so the learner does not have access to it completely (block is not at all available in the courseware for the learner).

See further description in .

Persistent Subsection Grade

Data Model Notes

Note: See Grades Data Model (for published description).

columnpurposeadditional info

Identifiers
id
course_id
user_id
usage_key

uniqueness and identification

(course_id, user_id, usage_key) together form a unique identifier for each row in the database. 

Additionally, the id field is an automatically generated primary key for the table.

The usage_key is the opaque key identifying the location of the Subsection.

Timestamps
created
modified
subtree_edited_timestamp

debugging & recovery

The modified timestamp allows us to find and recover from issues that were active during a limited timeframe. For example, find and reset all grades that were computed while bug X was alive in production.

The subtree_edited_timestamp allows us to determine whether any content within the subsection has changed since the grade was computed.

course_version

debugging & recovery

Allows us to immediately find and retrieve the exact version of the course that was active when the grade was computed.
visible_blocks

grading visualization
debugging & recovery 

Record the block-ids that the user had access to when the grade was computed.

Use this information to populate the information on the progress page so the saved subsection grade is always consistent with the list of shown problems on the progress page. The list of problems currently available in the course may be different at the current time, but this data allows us to retrieve the blocks that were used in computing the grade.

total_weighted_raw_score (earned_all)
total_weighted_max_score (possible_all)
total_graded_raw_score (earned_graded)
total_graded_max_score (possible_graded)

grading computationRecord the total score and the total maximum score in separate columns so the saved grades can be aggregated further to compute higher-level grades

Persistent Course Grade

Data Model Notes

Note: See Grades Data Model (for published description).

columnadditional info

Identifiers
id
course_id
user_id

(course_id, user_id) together form a unique identifier for each row in the database. 

Additionally, the id field is an automatically generated primary key for the table.

Timestamps
created
modified
course_edited_timestamp


course_versionAllows us to immediately find and retrieve the exact version of the course that was active when the grade was computed.
grading_policy_hashA SHA-1 digest of the grading policy allows us to detect and update grades whenever a course's grading policy changes.

percent_grade
letter_grade

Records percent and letter course grades for the user.

Certificate Generation and Availability

Transcripts and Course Finality

Course Author Manual Rescoring

Have course authors make a conscious decision when they change content/policy that affects learners' grades.

Course Authors can decide to

  1. Retain already computed subsection grades, if any, as they are.

  2. Rescore to recompute already computed subsection grades. (In the future, we may support automatically notifying students when this happens.)

  3. Rescore to update-if-gain only those subsection grades that have improved scores after the rescore.  That is, keep the score that is higher.

For the initial rollout of this, course authors can use the already existing UI in the Instructor Dashboard to rescore a problem's grade.  Nothing is needed for option #1 since it's a no-op.  Option #2 exists already as the existing "rescore" feature.  Option #3 would need to be implemented.

Note: #1 and #3 can potentially benefit with improved handling of course versions for better user experience.  Learners who already completed problems that are now removed may want to see their previous answers and the content of the removed block, per Course Version Locking.

Grade Overrides

Implement UI for overriding any of the following to a specific value:

  1. a final course grade
  2. a subsection grade
  3. a problem's score (implemented in EDUCATOR-165)

For final course and subsection grades, course teams will need to request the edX staff to manually override a learner's grade directly in the database.

Eventing/Logging of Grading Changes

Course Structure Assumptions

This grading system is built upon some assumptions about the structure of a course. Note that this only applies to graded content, and does not touch upon videos, HTML blocks, etc. as they are unrelated to grading.

What does (and doesn't) trigger regrades

Actions that cause a regrade of a single learnerActions that cause a regrade of all learnersActions that do NOT cause a regrade
Learner submits a problemEdit the course' Grading Policy in Studio's Grading pageCreate new course content at any level

Learner's group access changes:

  • Cohort affiliation changes
  • Enrollment track changes
Change a subsection's assignment type (e.g., ungraded → homework)Delete course content at any level


Move course content at any level


Change course content visibility to learners


Change problem weight


Edit the content of a problem in any way

Turning on Persistent Grades

To turn on persistent grading in an Open edX instance:

  1. Go to /admin/grades/persistentgradesenabledflag/ of your site's Django admin
  2. Click on "Add a Persistent grades enabled flag"
  3. To turn on the feature for all courses make sure to check both "enabled" and "enabled for all courses."
    1. If you want to turn on the setting for only a specific course, you will need to create a "Course persistent grades flags" entry in /admin/grades/coursepersistentgradesflag/ for the course and ensure that your main "Persistent grades enabled flag" has "enabled" set to True, but "enabled for all courses" set to False.

There is a waffle switch that can be used to enhance grades performance, but should be enabled only after any Backfilling process is completed: