Custom rules written against ESLint 8 commonly call context.getScope(), context.getSourceCode(), context.getAncestors(), context.getFilename(), and similar accessors. ESLint 9 removed them. A rule that uses one throws context.getScope is not a function at lint time, and since the throw happens inside the plugin, the message often names the plugin rather than the incompatibility.
The replacements live on the source code object and on context properties: context.sourceCode replaces getSourceCode(), sourceCode.getScope(node) replaces getScope(), sourceCode.getAncestors(node) replaces getAncestors(), and context.filename replaces getFilename(). Note that the scope and ancestor forms now take the node explicitly instead of using the traversal's implicit current node.
A rule can support both majors by reading context.sourceCode ?? context.getSourceCode() once at rule creation. When the failing rule comes from a third-party plugin, upgrading that plugin to a version advertising ESLint 9 support is the fix; there is no configuration workaround.