{"record":{"id":"4347de761edbcefc","repo":"instructure/canvas-lms","slug":"improper-status-status-for-a-user-observer","errorCode":null,"errorMessage":"Improper status \"#{status}\" for a user_observer","messagePattern":"Improper status \"#(.+?)\" for a user_observer","errorType":"validation","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"lib/sis/user_observer_importer.rb","lineNumber":60,"sourceCode":"      attr_accessor :success_count,\n                    :users_to_update_account_associations,\n                    :user_observers_to_update_sis_batch_ids\n\n      def initialize(batch, root_account, logger)\n        @batch = batch\n        @root_account = root_account\n        @logger = logger\n        @success_count = 0\n\n        @users_to_update_account_associations = Set.new\n        @user_observers_to_update_sis_batch_ids = []\n      end\n\n      def process_user_observer(observer_id, student_id, status)\n        raise ImportError, \"No observer_id given for a user observer\" if observer_id.blank?\n        raise ImportError, \"No user_id given for a user observer\" if student_id.blank?\n        raise ImportError, \"Can't observe yourself user #{student_id}\" if student_id == observer_id\n        raise ImportError, \"Improper status \\\"#{status}\\\" for a user_observer\" unless /\\A(active|deleted)\\z/i.match?(status)\n        return if @batch.skip_deletes? && status =~ /deleted/i\n\n        o_pseudo = @root_account.pseudonyms.active.find_by(sis_user_id: observer_id)\n        raise ImportError, \"An observer referenced a non-existent user #{observer_id}\" unless o_pseudo\n\n        s_pseudo = @root_account.pseudonyms.active.find_by(sis_user_id: student_id)\n        raise ImportError, \"A student referenced a non-existent user #{student_id}\" unless s_pseudo\n\n        observer = o_pseudo.user\n        student = s_pseudo.user\n        raise ImportError, \"Can't observe yourself user #{student_id}\" if observer == student\n\n        add_remove_observer(observer, student, observer_id, student_id, status)\n      end\n\n      def add_remove_observer(observer, student, observer_id, student_id, status)\n        case status.downcase\n        when \"active\"","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/sis/user_observer_importer.rb#L42-L78","documentation":"Validation guard in UserObserverImporter::Work#process_user_observer raised when the status argument is not one of the recognized workflow states (active/deleted etc.). The CSV supplied an unrecognized status string, so the observer-link row is rejected as malformed.","triggerScenarios":"Thrown at lib/sis/user_observer_importer.rb:60 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use 'active' or 'deleted' as status","Fix the CSV and re-run the batch"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}