instructure/canvas-lms · error

Rubric criteria not descriptive enough

Error message

Rubric criteria not descriptive enough

What it means

GradeService#call checks whether the supplied rubric matches Canvas's default (generic) template via rubric_matches_default_template?. A default-template rubric lacks the descriptive, assignment-specific criteria the external Cedar grading engine needs, so the service refuses to grade rather than send useless criteria. This is an input-quality guard for the AI grading pipeline.

Solutions

  1. Edit the rubric criteria to be assignment-specific (distinct descriptions, points, learning outcomes) so it no longer matches the default template
  2. Create a custom rubric for the assignment instead of the default one before running GradeService
  3. If you control the caller, validate the rubric upstream and surface a friendly 'rubric too generic' message to the instructor

Example fix

// before
rubric = Rubric.default_template_for(course)
GradeService.new(essay:, rubric:, rubric_association:).call
// after
rubric = Rubric.default_template_for(course)
rubric.update!(data: rubric.data.map { |c| c.merge(description: custom_description(c)) })
GradeService.new(essay:, rubric:, rubric_association:).call
Defensive patterns

Strategy: validation

Validate before calling

raise 'rubric too generic' if GradeService.new(essay:, rubric:, rubric_association:).send(:rubric_matches_default_template?)

Type guard

rubric.present? && !rubric_matches_default_template?(rubric)

Try / catch

begin
  GradeService.new(essay:, rubric:, rubric_association:).call
rescue RuntimeError => e
  prompt_custom_rubric if e.message.include?('not descriptive enough')
end

Prevention

When it happens

Trigger: Calling GradeService.call(essay:, rubric:, ...) with a rubric whose criteria exactly match the stock default template (generic criteria like 'Description of criteria'); assignments created without customizing rubric criteria before enabling AI grading; rubric criteria never edited after duplicating the default template.

Common situations: Teachers applying the built-in default rubric to an assignment and turning on AI grading; importers cloning rubrics verbatim from templates; automated pipelines feeding placeholder rubrics.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15). Data as JSON: /api/errors/bd922511fa2f017c. Report an issue: GitHub.

Appendix: source

Thrown at app/services/grade_service.rb:36

# with this program. If not, see <http://www.gnu.org/licenses/>.
#

class GradeService
  def initialize(assignment:, essay:, rubric:, root_account_uuid:, current_user:)
    @assignment = assignment.to_s
    @essay = essay.to_s
    @rubric = rubric
    @root_account_uuid = root_account_uuid
    @current_user = current_user
    @rubric_prompt_format = self.class.normalize_rubric_for_prompt(@rubric)
  end

  def call
    @essay = sanitize_essay(@essay)
    validate_essay_length(@essay)

    if rubric_matches_default_template?
      raise "Rubric criteria not descriptive enough"
    end

    cedar_rubric = build_cedar_rubric(@rubric)

    begin
      grading_results = CedarClient.grade_essay(
        description: @assignment,
        essay: @essay,
        rubric: cedar_rubric,
        feature_slug: "grading-assistance",
        root_account_uuid: @root_account_uuid,
        current_user: @current_user
      )

      map_grade_essay_results_to_canvas(grading_results, @rubric)
    # These subclasses have static, user-safe messages and can be shown directly.
    # If new CedarClientError subclasses are added with user-safe messages, add them here.
    rescue InstructureMiscPlugin::Extensions::CedarClient::ValidationError,

View on GitHub (pinned to 1c9f0bb801)