{"record":{"id":"e29264dc91c13b83","repo":"instructure/canvas-lms","slug":"auto-grading-failed-due-to-the-following-issue-s-errors-join","errorCode":null,"errorMessage":"Auto-grading failed due to the following issue(s): #{errors.join(\", \")}","messagePattern":"Auto-grading failed due to the following issue\\(s\\): #(.+?)","errorType":"exception","errorClass":"GraphQL::ExecutionError","httpStatus":null,"severity":"error","filePath":"app/graphql/mutations/auto_grade_submission.rb","lineNumber":36,"sourceCode":"# with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nclass Mutations::AutoGradeSubmission < Mutations::BaseMutation\n  argument :submission_id, ID, required: true\n\n  field :error, String, null: true\n  field :progress, Types::ProgressType, null: true\n\n  def resolve(input:)\n    submission_id = GraphQLHelpers.parse_relay_or_legacy_id(input[:submission_id], \"Submission\")\n    submission = Submission.find(submission_id)\n\n    errors = []\n    GraphQLHelpers::AutoGradeEligibilityHelper.validate_assignment(assignment: submission.assignment).each { |i| append_issue_message(errors, i) }\n    GraphQLHelpers::AutoGradeEligibilityHelper.validate_submission(submission:).each { |i| append_issue_message(errors, i) }\n\n    if errors.any?\n      raise GraphQL::ExecutionError, \"Auto-grading failed due to the following issue(s): #{errors.join(\", \")}\"\n    end\n\n    course = submission.assignment&.course\n    raise \"Course not found\" unless course\n\n    unless course.feature_enabled?(:project_lhotse)\n      raise GraphQL::ExecutionError, I18n.t(\"Project Lhotse is not enabled for this course.\")\n    end\n\n    verify_authorized_action!(course, :manage_grades)\n\n    service = AutoGradeOrchestrationService.new(course:, current_user:)\n    progress = service.auto_grade_in_background(submission:)\n\n    { progress: }\n  rescue GraphQL::ExecutionError => e\n    Rails.logger.error(\"[AutoGradeSubmission GraphQL ExecutionError] #{e.message}\")\n    raise e","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/graphql/mutations/auto_grade_submission.rb#L18-L54","documentation":"AutoGradeSubmission.resolve validates the assignment and submission via AutoGradeEligibilityHelper first; any eligibility issue is collected and raised together as a single GraphQL::ExecutionError listing all issues, aborting auto-grading before orchestration starts.","triggerScenarios":"Calling the autoGradeSubmission mutation when the assignment/submission fail eligibility checks — e.g., assignment not an eligible type, submission in wrong state, no student submission content, assignment not published, etc., as determined by the helper.","commonSituations":"Auto-grading an unsubmitted or graded submission; assignment type not supported by Auto Grade; feature prerequisites (assignment settings) unmet; running on submissions of quizzes or non-essay types the helper rejects.","solutions":["Read the joined issue messages in the error — they enumerate each failed validation from validate_assignment/validate_submission.","Fix each listed condition (publish the assignment, correct submission state, use an eligible assignment type).","Pre-check eligibility client-side by replicating/invoking the same validation before mutating.","Ensure the assignment and submission are in a state Auto Grade supports (e.g., student-submitted, gradable type)."],"exampleFix":"// before\nmutation { autoGradeSubmission(input: { submissionId }) } # ineligible submission\n\n// after: pre-validate\nissues = [...AutoGradeEligibilityHelper.validate_assignment(assignment:),\n          ...AutoGradeEligibilityHelper.validate_submission(submission:)]\nif issues.empty? then # run mutation end","handlingStrategy":"validation","validationCode":"const issues = [\n  ...AutoGradeEligibilityHelper.validate_assignment({ assignment }),\n  ...AutoGradeEligibilityHelper.validate_submission({ submission })\n]\nif (issues.length) throw new Error(issues.join(', '))\n","typeGuard":null,"tryCatchPattern":"try {\n  await autoGradeSubmission({ submissionId })\n} catch (e) {\n  if (e.message.startsWith('Auto-grading failed')) displayIssues(parseIssues(e.message))\n}","preventionTips":["Pre-check eligibility before offering Auto Grade UI","Surface per-issue messages to users","Keep assignment/submission states compatible with auto grading"],"tags":["graphql","auto-grading","validation","canvas-lms"],"backgroundTag":"schema-validation-failed","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}