{"record":{"id":"bc31091c1dd43baf","repo":"instructure/canvas-lms","slug":"submission-not-found","errorCode":null,"errorMessage":"Submission not found","messagePattern":"Submission not found","errorType":"exception","errorClass":"GraphQL::ExecutionError","httpStatus":null,"severity":"error","filePath":"app/graphql/mutations/save_rubric_assessment.rb","lineNumber":36,"sourceCode":"# with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nclass Mutations::SaveRubricAssessment < Mutations::BaseMutation\n  argument :assessment_details, GraphQL::Types::JSON, required: true\n  argument :final, Boolean, required: false, default_value: false\n  argument :graded_anonymously, Boolean, required: true\n  argument :provisional, Boolean, required: false, default_value: false\n  argument :rubric_assessment_id, ID, required: false\n  argument :rubric_association_id, ID, required: true\n  argument :submission_id, ID, required: true, prepare: GraphQLHelpers.relay_or_legacy_id_prepare_func(\"Submission\")\n\n  field :rubric_assessment, Types::RubricAssessmentType, null: true\n  field :rubric_association, Types::RubricAssociationType, null: true\n  field :submission, Types::SubmissionType, null: true\n  def resolve(input:)\n    root_account = context[:domain_root_account]\n    submission = Submission.find_by(id: input[:submission_id], root_account:)\n    raise GraphQL::ExecutionError, \"Submission not found\" if submission.nil?\n\n    association = RubricAssociation.find(input[:rubric_association_id])\n    association_object = association.association_object\n\n    assessment = association.rubric_assessments.find(input[:rubric_assessment_id]) if input[:rubric_assessment_id].present?\n\n    # only check if there's no assessment object, since that's the only time\n    # this param matters (find_asset_for_assessment)\n    user_id = assessment.present? ? assessment.user_id : submission.user_id\n    raise GraphQL::ExecutionError, \"User ID blank - unable to determine user for assessment\" if user_id.blank?\n\n    # For a moderated assignment, submitting an assessment claims a grading\n    # slot for the submitting provisional grader (or throws an error if no\n    # slots remain).\n    begin\n      opts = {}\n      provisional = input[:provisional]\n      if provisional","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/graphql/mutations/save_rubric_assessment.rb#L18-L54","documentation":"save_rubric_assessment raises \"Submission not found\" when Submission.find_by(id:, root_account:) returns nil — the submission id is wrong or belongs to a different root account. Unlike find, find_by returns nil, so the mutation gives an explicit, friendly error before touching rubric data.","triggerScenarios":"submission_id omitted/zero/malformed, submission exists on another root account or shard, or submission hard-deleted (e.g. assignment deleted cascading submissions).","commonSituations":"Cross-account tool (LTI) passing ids from a different account; SpeedGrader tab left open after the submission was deleted; test-record ids used against production API.","solutions":["Confirm the submission id against the assignment's submissions in the current root account.","Resolve the submission via the assignment/course path to confirm reachability.","Check for shard/root_account mismatch in your session context."],"exampleFix":"// before\nsubmission = Submission.find_by(id: input[:submission_id], root_account:)\nraise GraphQL::ExecutionError, 'Submission not found' if submission.nil?\n// after\nsubmission = assignment.submissions.find_by(id: input[:submission_id])\nreturn validation_error('Submission not found for this assignment') unless submission","handlingStrategy":"validation","validationCode":"const submission = assignment.submissionsConnection.nodes.find(s => s.id === submissionId)\nif (!submission) throw new Error('Submission not found in this account')","typeGuard":null,"tryCatchPattern":"try { await saveRubricAssessment({ submissionId, ... }) } catch (e) { if (e.message === 'Submission not found') showError('Submission unavailable; reload SpeedGrader') }","preventionTips":["Pass submission ids obtained from the same account context in the current session","Refetch submission before rubric save after long-idle UI","Watch for deleted assignments cascading to submissions"],"tags":["graphql","record-not-found","rubric"],"backgroundTag":"record-not-found","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"}