{"record":{"id":"e1990e7d82b857a4","repo":"instructure/canvas-lms","slug":"canvas-career-permission-overrides-failed-e-message","errorCode":null,"errorMessage":"Canvas Career permission overrides failed: #{e.message}","messagePattern":"Canvas Career permission overrides failed: #(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"lib/permissions.rb","lineNumber":87,"sourceCode":"      begin\n        label_overrides = CanvasCareer::LabelOverrides.permission_label_overrides(context)\n        if label_overrides.any?\n          permissions_with_overrides = @permissions.transform_values do |permission_def|\n            permission_key = @permissions.key(permission_def)\n            override = label_overrides[permission_key] || {}\n\n            if override.any?\n              new_permission_def = permission_def.dup\n              new_permission_def = new_permission_def.merge(label: override[:label]) if override[:label]\n              new_permission_def\n            else\n              permission_def\n            end\n          end\n          return permissions_with_overrides\n        end\n      rescue => e\n        Rails.logger.warn(\"Canvas Career permission overrides failed: #{e.message}\")\n      end\n    end\n\n    @permissions\n  end\n\n  def self.non_masquerading_permissions\n    return [] unless @permissions.frozen?\n\n    @non_masquerading_permissions ||= Set.new(@permissions.keys.select { |perm| @permissions.dig(perm, :not_for_masquerading) })\n  end\n\n  def self.not_for_masquerading?(permission)\n    if permission.is_a?(Array)\n      non_masquerading_permissions.intersect?(permission)\n    else\n      non_masquerading_permissions.include?(permission)\n    end","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/permissions.rb#L69-L105","documentation":"A fallback warning in lib/permissions.rb when applying Canvas Career permission overrides raises any exception. The code rescues the error, logs it with e.message, and returns the un-overridden permissions, so Canvas Career-specific permission customization silently degrades to base permissions.","triggerScenarios":"Computing permissions for a Canvas Career (K5/Career Learning) context where the override-apply block raises — e.g. a career account/course object missing expected attributes, a bad permission definition shape, or a database error while loading career role/override records.","commonSituations":"Environments where the Canvas Career feature flag is on but career data is partially migrated or inconsistent; plugins/gems defining career permissions with unexpected structures; exceptions inside custom career permission override hooks.","solutions":["Check the Rails log for the full exception (use the timestamp to find the backtrace; the warning only shows e.message).","Verify Canvas Career feature flag / account settings match the career data present; disable the flag if career data is not provisioned.","Fix the raising code path in the career permission override block (nil-guard missing associations or malformed permission defs).","If permissions are wrong in behavior, note that this rescue swallows overrides — confirm base permissions are safe before ignoring the warning."],"exampleFix":"// before\nrescue => e\n  Rails.logger.warn(\"Canvas Career permission overrides failed: #{e.message}\")\n// after\nrescue => e\n  Rails.logger.warn(\"Canvas Career permission overrides failed: #{e.message}\")\n  Rails.logger.warn(e.backtrace.join(\"\\n\")) if Rails.env.development?\n  Canvas::Errors.capture(e)","handlingStrategy":"try-catch","validationCode":"if @context.respond_to?(:career_data?) && @context.career_data?\n  # safe to attempt career overrides\nend","typeGuard":"def career_permission_context?(context)\n  context.is_a?(Account) && context.career_learning? && context.respond_to?(:career_roles)\nrescue NoMethodError\n  false\nend","tryCatchPattern":"begin\n  permissions_with_overrides = apply_career_overrides(permissions)\nrescue NoMethodError, ActiveRecord::StatementInvalid => e\n  Rails.logger.warn(\"Canvas Career permission overrides failed: #{e.class}: #{e.message}\")\n  Canvas::Errors.capture(e)\n  permissions # fall back to base permissions\nend","preventionTips":["Keep Canvas Career feature flag state in sync with career data provisioning","Nil-guard career associations inside override blocks","Report rescued exceptions to Canvas::Errors, not just the logger","Add a spec covering permissions computation with empty/partial career data"],"tags":["permissions","canvas-career","rescue-fallback","feature-flags"],"backgroundTag":"api-error-response","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"}