### New features

* [#15166](https://github.com/rubocop/rubocop/pull/15166): Add a new `Recursive` option to `Style/MutableConstant`. When enabled, the cop checks and freezes mutable literals nested inside arrays and hashes. The option is disabled by default to preserve existing behavior. ([@paracycle][])

### Bug fixes

* [#15220](https://github.com/rubocop/rubocop/pull/15220): Fix a bad autocorrect for `Lint/RedundantSplatExpansion` when splatting an empty literal (e.g. `when *[]` or `rescue *[]`), which expanded to invalid or semantically different code. ([@bbatsov][])
* [#15221](https://github.com/rubocop/rubocop/pull/15221): Fix a bad autocorrect for `Lint/RegexpAsCondition` when the regexp literal is negated (e.g. `if !/foo/`), which inverted the condition. ([@bbatsov][])
* [#15242](https://github.com/rubocop/rubocop/pull/15242): Fix a bad autocorrect for `Lint/SymbolConversion` when the receiver is an interpolated string containing an embedded double quote (e.g. `"foo#{bar}\"qux".to_sym`), which produced a syntax error. ([@bbatsov][])
* [#15270](https://github.com/rubocop/rubocop/pull/15270): Fix a crash for `Style/CombinableLoops` when a `for` loop has an empty body, and stop autocorrecting consecutive `for` loops whose iteration variables differ (which produced code referencing an undefined variable). ([@bbatsov][])
* [#15272](https://github.com/rubocop/rubocop/pull/15272): Fix a crash for `Style/ConstantVisibility` when a visibility declaration has a numeric literal argument (e.g. `private_constant 42`). ([@bbatsov][])
* [#15215](https://github.com/rubocop/rubocop/pull/15215): Fix a false negative for `Lint/OrderedMagicComments` when an `encoding` magic comment is preceded by a magic comment other than `frozen_string_literal` (e.g. `shareable_constant_value`). ([@bbatsov][])
* [#15228](https://github.com/rubocop/rubocop/pull/15228): Fix a false negative for `Lint/RedundantWithIndex` when the block takes no arguments (e.g. `ary.each_with_index { do_something }`). ([@bbatsov][])
* [#15230](https://github.com/rubocop/rubocop/pull/15230): Fix a false negative for `Lint/RequireRelativeSelfPath` when requiring the current file by name with its extension (e.g. `require_relative 'foo.rb'`) and the file path is absolute. ([@bbatsov][])
* [#15229](https://github.com/rubocop/rubocop/pull/15229): Fix a false negative for `Lint/SafeNavigationChain` when an ordinary method is chained after a parenthesized safe navigation call (e.g. `(x&.foo).bar`). ([@bbatsov][])
* [#15225](https://github.com/rubocop/rubocop/pull/15225): Fix a false negative for `Lint/SafeNavigationWithEmpty` when the receiver of `&.empty?` is a local variable, instance variable, constant, or other non-method-call expression. ([@bbatsov][])
* [#15231](https://github.com/rubocop/rubocop/pull/15231): Fix a false negative for `Lint/SendWithMixinArgument` when `send`/`public_send`/`__send__` is called with no explicit receiver or with a `self` receiver (e.g. `send(:include, Bar)`). ([@bbatsov][])
* [#15248](https://github.com/rubocop/rubocop/pull/15248): Fix a false negative for `Lint/ToEnumArguments` when more positional arguments are passed than the method accepts (e.g. `def m(x); to_enum(:m, x, extra); end`), which raises `ArgumentError` when the enumerator is used. ([@bbatsov][])
* [#15249](https://github.com/rubocop/rubocop/pull/15249): Fix a false negative for `Lint/UnescapedBracketInRegexp` when an unescaped `]` is preceded by an escaped backslash (e.g. `/abc\\]123/`). ([@bbatsov][])
* [#15267](https://github.com/rubocop/rubocop/pull/15267): Fix a false positive for `Style/ArrayIntersectWithSingleElement` with a splat argument (e.g. `array.intersect?([*foo])`), which is not a single element and was incorrectly rewritten to `array.include?(*foo)`. ([@bbatsov][])
* [#15272](https://github.com/rubocop/rubocop/pull/15272): Fix a false positive for `Style/ColonMethodCall` with chained JRuby interop calls (e.g. `Java::com::something_method`). ([@bbatsov][])
* [#15271](https://github.com/rubocop/rubocop/pull/15271): Fix a false positive for `Style/ConditionalAssignment` with `EnforcedStyle: assign_inside_condition` when assigning an `unless` without an `else` branch (e.g. `x = unless cond; 1; end`), which was rewritten to move the assignment inside the `unless` and changed behavior when the condition was true. ([@bbatsov][])
* [#14401](https://github.com/rubocop/rubocop/issues/14401): Fix a false positive for `Layout/BlockAlignment` with `EnforcedStyleAlignWith: start_of_line` when a block is passed as a method argument. ([@augustocbx][])
* [#15216](https://github.com/rubocop/rubocop/pull/15216): Fix a false positive for `Lint/RaiseException` when `raise Exception` is used inside a module nested within an allowed implicit namespace (e.g. `Gem`). ([@bbatsov][])
* [#15219](https://github.com/rubocop/rubocop/pull/15219): Fix a false positive for `Lint/RedundantDirGlobSort` when `sort` is given a comparator block or a block-pass argument, which is not redundant with the default sorting. ([@bbatsov][])
* [#15224](https://github.com/rubocop/rubocop/pull/15224): Fix a false positive for `Lint/ShadowingOuterLocalVariable` when a block argument has the same name as a pattern variable from a different `in` branch of the same `case`. ([@bbatsov][])
* [#15239](https://github.com/rubocop/rubocop/pull/15239): Fix a false positive for `Lint/SuppressedExceptionInNumberConversion` when the numeric constructor already passes `exception: false` (e.g. `Integer(arg, exception: false) rescue nil`), which also produced an autocorrect with a duplicate `exception: false` keyword. ([@bbatsov][])
* [#15243](https://github.com/rubocop/rubocop/pull/15243): Fix a false positive for `Lint/TopLevelReturnWithArgument` when a `return` with an argument is inside a numbered-parameter block or an `it` block. ([@bbatsov][])
* [#15245](https://github.com/rubocop/rubocop/pull/15245): Fix a false positive for `Lint/UselessRuby2Keywords` when `ruby2_keywords` in a nested class or module refers to a method of the same name defined in an outer scope. ([@bbatsov][])
* [#15246](https://github.com/rubocop/rubocop/pull/15246): Fix a false positive for `Lint/UselessSetterCall` when a multiple assignment uses nested destructuring (e.g. `(a, b), c = arg, other_arg`), which misaligned variables with the right-hand side values. ([@bbatsov][])
* [#15125](https://github.com/rubocop/rubocop/issues/15125): Fix a false positive for `Style/ZeroLengthPredicate` when `File::Stat.new(...).size.zero?` is used. ([@augustocbx][])
* [#15196](https://github.com/rubocop/rubocop/pull/15196): Fix `--start-server` to wait until the server is running before returning, which fixes a flaky `--restart-server` spec and a race for commands run right after starting the server. ([@koic][])
* [#15272](https://github.com/rubocop/rubocop/pull/15272): Fix `Style/Alias` not detecting block scope for numbered-parameter and `it` blocks, which caused a false positive for `alias_method` and a false negative for `alias` inside such blocks. ([@bbatsov][])
* [#15281](https://github.com/rubocop/rubocop/pull/15281): Fix an incorrect autocorrect when `Style/IfUnlessModifier` and `Style/Next` correct the same conditional. ([@fynsta][])
* [#15260](https://github.com/rubocop/rubocop/issues/15260): Fix an error for `Style/FileWrite` when a literal or variable is passed to `write` in the block form. ([@koic][])
* [#15276](https://github.com/rubocop/rubocop/pull/15276): Fix an error for `Style/RedundantFormat` when the format string is a heredoc with format arguments. ([@fynsta][])
* [#15270](https://github.com/rubocop/rubocop/pull/15270): Fix an incorrect autocorrect for `Style/AndOr` when an operand is `next`, `break`, or `yield` with an argument (e.g. `foo and next 1`), which produced invalid Ruby like `foo && next 1`. ([@bbatsov][])
* [#15267](https://github.com/rubocop/rubocop/pull/15267): Fix an incorrect autocorrect for `Style/ArrayFirstLast` when `arr[0]`/`arr[-1]` is the target of a compound assignment (e.g. `arr[0] += 1`), which produced `arr.first += 1` and raised `NoMethodError`. ([@bbatsov][])
* [#15267](https://github.com/rubocop/rubocop/pull/15267): Fix an incorrect autocorrect for `Style/ArrayIntersect` where a negated predicate on a safe-navigation chain (e.g. `a&.intersection(b)&.none?`) was rewritten to `!a&.intersect?(b)`, flipping the result when the receiver is `nil`. ([@bbatsov][])
* [#15273](https://github.com/rubocop/rubocop/pull/15273): Fix an incorrect autocorrect for `Style/BlockDelimiters` that converted a single-line `do...end` block containing a block-level `rescue` or `ensure` to `{...}`, producing invalid Ruby. ([@bbatsov][])
* [#15268](https://github.com/rubocop/rubocop/pull/15268): Fix an incorrect autocorrect for `Style/CaseEquality` when the argument is an operator or unary expression (e.g. `Array === a + b`), which produced mis-parsed code like `a + b.is_a?(Array)`. ([@bbatsov][])
* [#15268](https://github.com/rubocop/rubocop/pull/15268): Fix an incorrect autocorrect for `Style/ClassEqualityComparison` inside a namespace when the class name string is already fully qualified (e.g. `bar.class.name == '::Bar'`), which produced `instance_of?(::::Bar)` and was a syntax error. ([@bbatsov][])
* [#15268](https://github.com/rubocop/rubocop/pull/15268): Fix an incorrect autocorrect for `Style/ClassEqualityComparison` when comparing `Class` itself to a string literal (e.g. `var.class == 'Date'`), which produced `var.instance_of?('Date')` and raised `TypeError`; such comparisons are no longer autocorrected. ([@bbatsov][])
* [#15274](https://github.com/rubocop/rubocop/pull/15274): Fix an incorrect autocorrect for `Style/ClassMethodsDefinitions` that corrupted a preceding comment containing `def <name>` and left the method undefined as a class method. ([@bbatsov][])
* [#15270](https://github.com/rubocop/rubocop/pull/15270): Fix an incorrect autocorrect for `Style/ComparableClamp` when the clamped value is an operator expression (e.g. `a + b`), which produced mis-parsed code like `a + b.clamp(low, high)`. ([@bbatsov][])
* [#15267](https://github.com/rubocop/rubocop/pull/15267): Fix an incorrect autocorrect for `Style/ConcatArrayLiterals` with an empty array literal argument (e.g. `arr.concat([], [b])`), which produced invalid Ruby like `arr.push(, b)`. ([@bbatsov][])
* [#15274](https://github.com/rubocop/rubocop/pull/15274): Fix an incorrect autocorrect for `Style/DigChain` that duplicated a trailing comment and dropped indentation when the chain was inside a method or block. ([@bbatsov][])
* [#15288](https://github.com/rubocop/rubocop/pull/15288): Fix an incorrect autocorrect for `Lint/UselessTimes` when a `1.times` block takes a single destructured (`|(a, b)|`) or splat (`|*a|`) argument, which produced a body referencing an undefined variable. ([@bbatsov][])
* [#15280](https://github.com/rubocop/rubocop/pull/15280): Fix an incorrect autocorrect for `Style/ConditionalAssignment` with `EnforcedStyle: assign_inside_condition` and a single-line `case`. ([@fynsta][])
* [#15278](https://github.com/rubocop/rubocop/pull/15278): Fix an incorrect autocorrect for `Style/ParallelAssignment` when the right-hand side contains a heredoc. ([@fynsta][])
* [#15279](https://github.com/rubocop/rubocop/pull/15279): Fix an incorrect autocorrect for `Style/Semicolon` when a heredoc is opened before the semicolon. ([@fynsta][])
* [#15277](https://github.com/rubocop/rubocop/pull/15277): Fix an incorrect autocorrect for `Style/WordArray` when the array contains heredocs. ([@fynsta][])
* [#15240](https://github.com/rubocop/rubocop/pull/15240): Fix an incorrect autocorrect for `Lint/UselessAssignment` that rewrote a first-seen `foo &&= 1` to `foo && 1`, raising `NameError` at runtime. ([@bbatsov][])
* [#15269](https://github.com/rubocop/rubocop/issues/15269): Fix a false positive where a cop's relative `Include` pattern could match directories above the project root. ([@augustocbx][])
* [#15209](https://github.com/rubocop/rubocop/pull/15209): Fix a false negative for `Lint/InterpolationCheck` when interpolation appears in a multiline single-quoted string. ([@bbatsov][])
* [#15211](https://github.com/rubocop/rubocop/pull/15211): Fix a false negative for `Lint/NonLocalExitFromIterator` when the iterator receiver uses safe navigation. ([@bbatsov][])
* [#15227](https://github.com/rubocop/rubocop/pull/15227): Fix false negatives for `Lint/RedundantSafeNavigation` with `&.respond_to?` on a guaranteed-instance receiver (e.g. `foo.to_s&.respond_to?(:class)`) and with `&.to_h` using a numbered-parameter or `it` block (e.g. `foo&.to_h { _1 } || {}`). ([@bbatsov][])
* [#15226](https://github.com/rubocop/rubocop/pull/15226): Fix false negatives for `Lint/RescueType` when rescuing from `true`, `false`, a rational literal (`1r`), or a complex literal (`1i`), all of which raise a `TypeError` at runtime. ([@bbatsov][])
* [#15233](https://github.com/rubocop/rubocop/pull/15233): Fix false negatives for `Lint/SelfAssignment` with `||=` and `&&=` on constants, attributes, and hash keys (e.g. `Foo ||= Foo`, `foo.bar ||= foo.bar`, `hash['foo'] ||= hash['foo']`). ([@bbatsov][])
* [#15247](https://github.com/rubocop/rubocop/pull/15247): Fix false negatives for `Lint/SharedMutableDefault` when a mutable default is combined with a `capacity:` keyword argument and given as an array or `Array.new`/`Hash.new` (e.g. `Hash.new([], capacity: 42)`). ([@bbatsov][])
* [#15206](https://github.com/rubocop/rubocop/pull/15206): Fix a false positive for `Lint/FloatComparison` when comparing against a parenthesized zero or `nil`. ([@bbatsov][])
* [#15208](https://github.com/rubocop/rubocop/pull/15208): Fix a false positive for `Lint/IncompatibleIoSelectWithFiberScheduler` when the single array argument element is a splat. ([@bbatsov][])
* [#15207](https://github.com/rubocop/rubocop/pull/15207): Fix a false positive for `Lint/LiteralAssignmentInCondition` when a literal is assigned inside a block in the condition. ([@bbatsov][])
* [#15272](https://github.com/rubocop/rubocop/pull/15272): Fix false positives for `Style/DateTime`: a bare `to_datetime` call on implicit self is no longer flagged, and historic-date calls using safe navigation (e.g. `DateTime&.iso8601(str, Date::ENGLAND)`) are now exempted. ([@bbatsov][])
* [#14979](https://github.com/rubocop/rubocop/issues/14979): Fix false positives in `Layout/BlockAlignment` when there is a line break between method arguments before the block. ([@koic][])
* [#15204](https://github.com/rubocop/rubocop/pull/15204): Fix false positives in `Lint/EnsureReturn` and `Lint/NoReturnInBeginEndBlocks` for `return` inside a nested method definition or lambda. ([@bbatsov][])
* [#15197](https://github.com/rubocop/rubocop/issues/15197): Fix false positives in `Style/WhileUntilDo` when the loop body is on the same line as the `do` keyword. ([@koic][])
* [#15205](https://github.com/rubocop/rubocop/pull/15205): Fix an incorrect autocorrect for `Lint/ErbNewArguments` when a keyword argument follows the `safe_level` argument. ([@bbatsov][])
* [#15210](https://github.com/rubocop/rubocop/pull/15210): Fix an incorrect autocorrect for `Lint/LambdaWithoutLiteralBlock` that dropped safe navigation from the block argument. ([@bbatsov][])
* [#15214](https://github.com/rubocop/rubocop/pull/15214): Fix an incorrect autocorrect for `Lint/NumericOperationWithConstantResult` when using safe navigation, as the result is `nil` when the receiver is `nil`. ([@bbatsov][])
* [#15217](https://github.com/rubocop/rubocop/pull/15217): Fix an incorrect autocorrect for `Lint/RedundantCopDisableDirective` and `Lint/RedundantCopEnableDirective` when a cop name in the directive is a prefix of another cop name in the same directive (e.g. `Lint/AmbiguousOperator` and `Lint/AmbiguousOperatorPrecedence`). ([@bbatsov][])
* [#15275](https://github.com/rubocop/rubocop/pull/15275): Fix incorrect autocorrects for `Style/FileWrite` that deleted or duplicated heredoc bodies when a heredoc was used as the filename, in an argument expression, or in an inline block. ([@fynsta][])
* [#15241](https://github.com/rubocop/rubocop/pull/15241): Fix incorrect autocorrects for `Lint/UselessTimes` when the `times` block uses `next`/`break` (which became a syntax error) or takes multiple block arguments (which became undefined references). ([@bbatsov][])
* [#15222](https://github.com/rubocop/rubocop/pull/15222): Fix `Lint/ScriptPermission` to honor a cop-level `AutoCorrect: false` setting and to not crash on sources without a file on disk (e.g. unsaved editor buffers). ([@bbatsov][])
* [#15244](https://github.com/rubocop/rubocop/pull/15244): Fix `Lint/TrailingCommaInAttributeDeclaration` to detect a trailing comma before a singleton method definition (e.g. `def self.bar`) and to not crash when a `def` is the sole argument (e.g. `attr_reader def bar; end`). ([@bbatsov][])
* [#15250](https://github.com/rubocop/rubocop/issues/15250): Fix incorrect autocorrects for `Lint/LiteralInInterpolation` with embedded quotes and escaped interpolation text. ([@RedZapdos123][])
* [#15291](https://github.com/rubocop/rubocop/issues/15291): Fix an incorrect autocorrect for `Lint/LiteralInInterpolation` when interpolated hashes contain symbols that require quoted syntax, such as `:'foo-bar'`. ([@RedZapdos123][])
* [#14364](https://github.com/rubocop/rubocop/issues/14364): Fix `.rubocop_todo.yml` autocorrect safety comments for local custom cops configured in the project config. ([@RedZapdos123][])
* [#15252](https://github.com/rubocop/rubocop/issues/15252): Stop autocorrecting `Lint/NumberConversion` offenses on safe navigation calls. ([@RedZapdos123][])
* [#12276](https://github.com/rubocop/rubocop/issues/12276): Fix `--auto-gen-config` to record `--disable-pending-cops` and `--enable-pending-cops` in the generated `.rubocop_todo.yml` command so that `--regenerate-todo` preserves them. ([@augustocbx][])
* [#15202](https://github.com/rubocop/rubocop/pull/15202): Fix `InternalAffairs/RedundantLetRuboCopConfigNew` crash when `let(:config)` has no enclosing `describe`. ([@bbatsov][])

### Changes

* [#15234](https://github.com/rubocop/rubocop/pull/15234): Reword the `Lint/RequireRangeParentheses` offense message, which incorrectly called the flagged (finite) range "endless". ([@bbatsov][])
* [#15235](https://github.com/rubocop/rubocop/pull/15235): Add autocorrection to `Lint/RefinementImportMethods` (replacing `include`/`prepend` with `import_methods`) and report that the functionality was removed (not just deprecated) on Ruby 3.2+. ([@bbatsov][])
* [#15198](https://github.com/rubocop/rubocop/pull/15198): Reword cop descriptions that did not start with a verb (e.g. `Lint/UnreachableCode`, `Metrics/AbcSize`, `Security/Eval`) for consistency. ([@bbatsov][])
* [#15223](https://github.com/rubocop/rubocop/pull/15223): Make `Lint/RedundantWithObject` autocorrect unsafe, since `each_with_object` returns the memo object while the corrected `each` returns the receiver. ([@bbatsov][])
* [#15194](https://github.com/rubocop/rubocop/pull/15194): Rename inconsistently named cop parameters to follow RuboCop's conventions (the old names are deprecated but still work): `Bundler/GemComment`'s `IgnoredGems` to `AllowedGems`, `Lint/NumberConversion`'s `IgnoredClasses` to `AllowedClasses`, `Lint/MissingCopEnableDirective`'s `MaximumRangeSize` to `MaxRangeSize`, `Metrics/CollectionLiteralLength`'s `LengthThreshold` to `Max`, and `Style/FetchEnvVar`'s `AllowedVars` to `AllowedVariables`. ([@bbatsov][])

[@paracycle]: https://github.com/paracycle
[@bbatsov]: https://github.com/bbatsov
[@augustocbx]: https://github.com/augustocbx
[@koic]: https://github.com/koic
[@fynsta]: https://github.com/fynsta
[@RedZapdos123]: https://github.com/RedZapdos123
