From 016e64739008ec0f263d8a5799b82a4e01cb7e21 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 28 Jan 2023 08:11:10 +0100
Subject: [PATCH] feat(config)!: default to rangeStrategy=auto, prefer
 update-lockfile (#19942)

Changes `rangeStrategy` default value from `'replace'` to `'auto'`. Also changes `auto` behavior so that `update-lockfile` is preferred if the manager
supports the `updateLockedDependency()` function.

Closes #19800

BREAKING CHANGE: Renovate will now default to updating locked dependency versions. To revert to previous behavior, configure rangeStrategy=replace.
---
 lib/config/options/index.ts                   |  2 +-
 lib/config/presets/common.ts                  |  3 ++-
 lib/config/presets/index.spec.ts              |  1 -
 lib/config/presets/internal/config.ts         |  1 -
 lib/config/presets/internal/default.ts        |  4 ----
 lib/modules/manager/cargo/index.ts            |  2 +-
 lib/modules/manager/cargo/range.spec.ts       | 14 +++++++++++++
 lib/modules/manager/cargo/range.ts            |  8 ++++++++
 lib/modules/manager/circleci/extract.ts       |  1 -
 lib/modules/manager/circleci/index.ts         |  1 +
 lib/modules/manager/circleci/range.spec.ts    | 14 +++++++++++++
 lib/modules/manager/circleci/range.ts         |  8 ++++++++
 lib/modules/manager/composer/range.spec.ts    |  8 ++++----
 lib/modules/manager/composer/range.ts         |  2 +-
 lib/modules/manager/conan/index.ts            |  2 +-
 lib/modules/manager/conan/range.spec.ts       | 14 +++++++++++++
 lib/modules/manager/conan/range.ts            |  8 ++++++++
 lib/modules/manager/gomod/extract.spec.ts     |  1 -
 lib/modules/manager/gomod/extract.ts          |  1 -
 lib/modules/manager/index.ts                  |  3 +++
 lib/modules/manager/npm/range.spec.ts         | 20 ++-----------------
 lib/modules/manager/npm/range.ts              |  2 +-
 lib/modules/manager/range.spec.ts             | 12 +++++++++--
 lib/modules/manager/swift/index.ts            |  2 +-
 lib/modules/manager/swift/range.spec.ts       | 16 +++++++++++++++
 lib/modules/manager/swift/range.ts            |  8 ++++++++
 .../__fixtures__/migrated-data-formatted.json |  2 +-
 .../branch/__fixtures__/migrated-data.json    |  2 +-
 .../branch/__fixtures__/migrated-data.json5   |  2 +-
 .../branch/__fixtures__/migrated.json         |  1 -
 .../branch/__fixtures__/renovate.json         |  1 -
 .../branch/__fixtures__/renovate.json5        |  1 -
 .../pr/__fixtures__/migrated-data.json        |  2 +-
 33 files changed, 122 insertions(+), 47 deletions(-)
 create mode 100644 lib/modules/manager/cargo/range.spec.ts
 create mode 100644 lib/modules/manager/cargo/range.ts
 create mode 100644 lib/modules/manager/circleci/range.spec.ts
 create mode 100644 lib/modules/manager/circleci/range.ts
 create mode 100644 lib/modules/manager/conan/range.spec.ts
 create mode 100644 lib/modules/manager/conan/range.ts
 create mode 100644 lib/modules/manager/swift/range.spec.ts
 create mode 100644 lib/modules/manager/swift/range.ts

diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts
index a767649136..5239b8d3ac 100644
--- a/lib/config/options/index.ts
+++ b/lib/config/options/index.ts
@@ -1344,7 +1344,7 @@ const options: RenovateOptions[] = [
     name: 'rangeStrategy',
     description: 'Determines how to modify or update existing ranges.',
     type: 'string',
-    default: 'replace',
+    default: 'auto',
     allowedValues: [
       'auto',
       'pin',
diff --git a/lib/config/presets/common.ts b/lib/config/presets/common.ts
index 2f72e59cbc..b2ff01c1a9 100644
--- a/lib/config/presets/common.ts
+++ b/lib/config/presets/common.ts
@@ -1,5 +1,6 @@
 export const removedPresets: Record<string, string | null> = {
-  ':autodetectPinVersions': ':autodetectRangeStrategy',
+  ':autodetectPinVersions': null,
+  ':autodetectRangeStrategy': null,
   ':automergeBranchMergeCommit': ':automergeBranch',
   ':automergeBranchPush': ':automergeBranch',
   ':base': 'config:base',
diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index c7b432a0e5..3bf5d5fffb 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -839,7 +839,6 @@ describe('config/presets/index', () => {
           ':dependencyDashboard',
           ':semanticPrefixFixDepsChoreOthers',
           ':ignoreModulesAndTests',
-          ':autodetectRangeStrategy',
           ':prHourlyLimit2',
           ':prConcurrentLimit10',
           'group:monorepos',
diff --git a/lib/config/presets/internal/config.ts b/lib/config/presets/internal/config.ts
index 044b557537..355135deaa 100644
--- a/lib/config/presets/internal/config.ts
+++ b/lib/config/presets/internal/config.ts
@@ -9,7 +9,6 @@ export const presets: Record<string, Preset> = {
       ':dependencyDashboard',
       ':semanticPrefixFixDepsChoreOthers',
       ':ignoreModulesAndTests',
-      ':autodetectRangeStrategy',
       ':prHourlyLimit2',
       ':prConcurrentLimit10',
       'group:monorepos',
diff --git a/lib/config/presets/internal/default.ts b/lib/config/presets/internal/default.ts
index 0d1daebcef..8cef075470 100644
--- a/lib/config/presets/internal/default.ts
+++ b/lib/config/presets/internal/default.ts
@@ -10,10 +10,6 @@ export const presets: Record<string, Preset> = {
     assignees: ['{{arg0}}'],
     description: 'Assign PRs to `{{arg0}}`.',
   },
-  autodetectRangeStrategy: {
-    description: 'Automatically detect the best rangeStrategy to use.',
-    rangeStrategy: 'auto',
-  },
   automergeAll: {
     automerge: true,
     description:
diff --git a/lib/modules/manager/cargo/index.ts b/lib/modules/manager/cargo/index.ts
index c7768858e3..45ee9c4fad 100644
--- a/lib/modules/manager/cargo/index.ts
+++ b/lib/modules/manager/cargo/index.ts
@@ -3,6 +3,7 @@ import { CrateDatasource } from '../../datasource/crate';
 import * as cargoVersioning from '../../versioning/cargo';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
+export { getRangeStrategy } from './range';
 
 export const language: ProgrammingLanguage = 'rust';
 export const supportsLockFileMaintenance = true;
@@ -13,7 +14,6 @@ export const defaultConfig = {
   commitMessageTopic: 'Rust crate {{depName}}',
   fileMatch: ['(^|/)Cargo\\.toml$'],
   versioning: cargoVersioning.id,
-  rangeStrategy: 'bump',
 };
 
 export const supportedDatasources = [CrateDatasource.id];
diff --git a/lib/modules/manager/cargo/range.spec.ts b/lib/modules/manager/cargo/range.spec.ts
new file mode 100644
index 0000000000..0356aac6a8
--- /dev/null
+++ b/lib/modules/manager/cargo/range.spec.ts
@@ -0,0 +1,14 @@
+import type { RangeConfig } from '../types';
+import { getRangeStrategy } from '.';
+
+describe('modules/manager/cargo/range', () => {
+  it('returns same if not auto', () => {
+    const config: RangeConfig = { rangeStrategy: 'widen' };
+    expect(getRangeStrategy(config)).toBe('widen');
+  });
+
+  it('defaults to bump', () => {
+    const config: RangeConfig = { rangeStrategy: 'auto' };
+    expect(getRangeStrategy(config)).toBe('bump');
+  });
+});
diff --git a/lib/modules/manager/cargo/range.ts b/lib/modules/manager/cargo/range.ts
new file mode 100644
index 0000000000..8f3d6e7eb5
--- /dev/null
+++ b/lib/modules/manager/cargo/range.ts
@@ -0,0 +1,8 @@
+import type { RangeStrategy } from '../../../types';
+import type { RangeConfig } from '../types';
+
+export function getRangeStrategy({
+  rangeStrategy,
+}: RangeConfig): RangeStrategy {
+  return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
+}
diff --git a/lib/modules/manager/circleci/extract.ts b/lib/modules/manager/circleci/extract.ts
index 4f3bc24ab9..3557cb7a2f 100644
--- a/lib/modules/manager/circleci/extract.ts
+++ b/lib/modules/manager/circleci/extract.ts
@@ -41,7 +41,6 @@ export function extractPackageFile(content: string): PackageFileContent | null {
               packageName: orbName,
               commitMessageTopic: '{{{depName}}} orb',
               versioning: npmVersioning.id,
-              rangeStrategy: 'pin',
             };
             deps.push(dep);
           }
diff --git a/lib/modules/manager/circleci/index.ts b/lib/modules/manager/circleci/index.ts
index 8505e9d39c..183098e281 100644
--- a/lib/modules/manager/circleci/index.ts
+++ b/lib/modules/manager/circleci/index.ts
@@ -1,6 +1,7 @@
 import { DockerDatasource } from '../../datasource/docker';
 import { OrbDatasource } from '../../datasource/orb';
 import { extractPackageFile } from './extract';
+export { getRangeStrategy } from './range';
 
 export { extractPackageFile };
 
diff --git a/lib/modules/manager/circleci/range.spec.ts b/lib/modules/manager/circleci/range.spec.ts
new file mode 100644
index 0000000000..40fb6c583d
--- /dev/null
+++ b/lib/modules/manager/circleci/range.spec.ts
@@ -0,0 +1,14 @@
+import type { RangeConfig } from '../types';
+import { getRangeStrategy } from '.';
+
+describe('modules/manager/circleci/range', () => {
+  it('returns same if not auto', () => {
+    const config: RangeConfig = { rangeStrategy: 'widen' };
+    expect(getRangeStrategy(config)).toBe('widen');
+  });
+
+  it('defaults to bump', () => {
+    const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
+    expect(getRangeStrategy(config)).toBe('pin');
+  });
+});
diff --git a/lib/modules/manager/circleci/range.ts b/lib/modules/manager/circleci/range.ts
new file mode 100644
index 0000000000..2c3311a8ca
--- /dev/null
+++ b/lib/modules/manager/circleci/range.ts
@@ -0,0 +1,8 @@
+import type { RangeStrategy } from '../../../types';
+import type { RangeConfig } from '../types';
+
+export function getRangeStrategy({
+  rangeStrategy,
+}: RangeConfig): RangeStrategy {
+  return rangeStrategy === 'auto' ? 'pin' : rangeStrategy;
+}
diff --git a/lib/modules/manager/composer/range.spec.ts b/lib/modules/manager/composer/range.spec.ts
index 87f65b9c67..944797d5c8 100644
--- a/lib/modules/manager/composer/range.spec.ts
+++ b/lib/modules/manager/composer/range.spec.ts
@@ -12,7 +12,7 @@ describe('modules/manager/composer/range', () => {
       rangeStrategy: 'auto',
       depType: 'require-dev',
     };
-    expect(getRangeStrategy(config)).toBe('replace');
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
   });
 
   it('replaces project require', () => {
@@ -21,7 +21,7 @@ describe('modules/manager/composer/range', () => {
       managerData: { composerJsonType: 'project' },
       depType: 'require',
     };
-    expect(getRangeStrategy(config)).toBe('replace');
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
   });
 
   it('widens complex ranges', () => {
@@ -42,9 +42,9 @@ describe('modules/manager/composer/range', () => {
     expect(getRangeStrategy(config)).toBe('widen');
   });
 
-  it('defaults to replace', () => {
+  it('defaults to update-lockfile', () => {
     const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
-    expect(getRangeStrategy(config)).toBe('replace');
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
   });
 
   it('defaults to widen for TYPO3 extensions', () => {
diff --git a/lib/modules/manager/composer/range.ts b/lib/modules/manager/composer/range.ts
index dd70eb54f9..a1faa3f6f1 100644
--- a/lib/modules/manager/composer/range.ts
+++ b/lib/modules/manager/composer/range.ts
@@ -23,5 +23,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   ) {
     return 'widen';
   }
-  return 'replace';
+  return 'update-lockfile';
 }
diff --git a/lib/modules/manager/conan/index.ts b/lib/modules/manager/conan/index.ts
index 2ac518f460..3dc5571ded 100644
--- a/lib/modules/manager/conan/index.ts
+++ b/lib/modules/manager/conan/index.ts
@@ -1,4 +1,5 @@
 export { extractPackageFile } from './extract';
+export { getRangeStrategy } from './range';
 import { ConanDatasource } from '../../datasource/conan';
 import * as conan from '../../versioning/conan';
 
@@ -6,7 +7,6 @@ export const defaultConfig = {
   fileMatch: ['(^|/)conanfile\\.(txt|py)$'],
   datasource: ConanDatasource.id,
   versioning: conan.id,
-  rangeStrategy: 'bump',
   enabled: false, // See https://github.com/renovatebot/renovate/issues/14170
 };
 
diff --git a/lib/modules/manager/conan/range.spec.ts b/lib/modules/manager/conan/range.spec.ts
new file mode 100644
index 0000000000..7dcee82fb9
--- /dev/null
+++ b/lib/modules/manager/conan/range.spec.ts
@@ -0,0 +1,14 @@
+import type { RangeConfig } from '../types';
+import { getRangeStrategy } from '.';
+
+describe('modules/manager/conan/range', () => {
+  it('returns same if not auto', () => {
+    const config: RangeConfig = { rangeStrategy: 'widen' };
+    expect(getRangeStrategy(config)).toBe('widen');
+  });
+
+  it('defaults to bump', () => {
+    const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
+    expect(getRangeStrategy(config)).toBe('bump');
+  });
+});
diff --git a/lib/modules/manager/conan/range.ts b/lib/modules/manager/conan/range.ts
new file mode 100644
index 0000000000..8f3d6e7eb5
--- /dev/null
+++ b/lib/modules/manager/conan/range.ts
@@ -0,0 +1,8 @@
+import type { RangeStrategy } from '../../../types';
+import type { RangeConfig } from '../types';
+
+export function getRangeStrategy({
+  rangeStrategy,
+}: RangeConfig): RangeStrategy {
+  return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
+}
diff --git a/lib/modules/manager/gomod/extract.spec.ts b/lib/modules/manager/gomod/extract.spec.ts
index 4d9b35b36f..c1503da32c 100644
--- a/lib/modules/manager/gomod/extract.spec.ts
+++ b/lib/modules/manager/gomod/extract.spec.ts
@@ -67,7 +67,6 @@ replace (
             currentValue: '1.18',
             datasource: 'golang-version',
             versioning: 'go-mod-directive',
-            rangeStrategy: 'replace',
           },
           {
             managerData: {
diff --git a/lib/modules/manager/gomod/extract.ts b/lib/modules/manager/gomod/extract.ts
index 2d99d83f48..5f6352d2a3 100644
--- a/lib/modules/manager/gomod/extract.ts
+++ b/lib/modules/manager/gomod/extract.ts
@@ -46,7 +46,6 @@ function getGoDep(lineNumber: number, goVer: string): PackageDependency {
     currentValue: goVer,
     datasource: GolangVersionDatasource.id,
     versioning: 'go-mod-directive',
-    rangeStrategy: 'replace',
   };
 }
 
diff --git a/lib/modules/manager/index.ts b/lib/modules/manager/index.ts
index 4d7500b883..26befb170e 100644
--- a/lib/modules/manager/index.ts
+++ b/lib/modules/manager/index.ts
@@ -87,6 +87,9 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy | null {
     return managerRangeStrategy;
   }
   if (rangeStrategy === 'auto') {
+    if (m.updateLockedDependency) {
+      return 'update-lockfile';
+    }
     // default to 'replace' for auto
     return 'replace';
   }
diff --git a/lib/modules/manager/npm/range.spec.ts b/lib/modules/manager/npm/range.spec.ts
index 997567a68d..4898d3f18c 100644
--- a/lib/modules/manager/npm/range.spec.ts
+++ b/lib/modules/manager/npm/range.spec.ts
@@ -7,22 +7,6 @@ describe('modules/manager/npm/range', () => {
     expect(getRangeStrategy(config)).toBe('widen');
   });
 
-  it('replaces devDependencies', () => {
-    const config: RangeConfig = {
-      rangeStrategy: 'auto',
-      depType: 'devDependencies',
-    };
-    expect(getRangeStrategy(config)).toBe('replace');
-  });
-
-  it('replaces app dependencies', () => {
-    const config: RangeConfig = {
-      rangeStrategy: 'auto',
-      depType: 'dependencies',
-    };
-    expect(getRangeStrategy(config)).toBe('replace');
-  });
-
   it('widens peerDependencies', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
@@ -49,11 +33,11 @@ describe('modules/manager/npm/range', () => {
     expect(getRangeStrategy(config)).toBe('widen');
   });
 
-  it('defaults to replace', () => {
+  it('defaults to update-lockfile', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'dependencies',
     };
-    expect(getRangeStrategy(config)).toBe('replace');
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
   });
 });
diff --git a/lib/modules/manager/npm/range.ts b/lib/modules/manager/npm/range.ts
index ed56cb1070..91d8ceca3b 100644
--- a/lib/modules/manager/npm/range.ts
+++ b/lib/modules/manager/npm/range.ts
@@ -25,5 +25,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   if (isComplexRange) {
     return 'widen';
   }
-  return 'replace';
+  return 'update-lockfile';
 }
diff --git a/lib/modules/manager/range.spec.ts b/lib/modules/manager/range.spec.ts
index 0cfbbe5a51..7f1c3b2b58 100644
--- a/lib/modules/manager/range.spec.ts
+++ b/lib/modules/manager/range.spec.ts
@@ -16,12 +16,20 @@ describe('modules/manager/range', () => {
       rangeStrategy: 'auto',
       depType: 'dependencies',
     };
-    expect(getRangeStrategy(config)).toBe('replace');
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
+  });
+
+  it('defaults to update-lockfile if updateLockedDependency() is supported', () => {
+    const config: RangeConfig = {
+      manager: 'bundler',
+      rangeStrategy: 'auto',
+    };
+    expect(getRangeStrategy(config)).toBe('update-lockfile');
   });
 
   it('defaults to replace', () => {
     const config: RangeConfig = {
-      manager: 'circleci',
+      manager: 'sbt',
       rangeStrategy: 'auto',
     };
     expect(getRangeStrategy(config)).toBe('replace');
diff --git a/lib/modules/manager/swift/index.ts b/lib/modules/manager/swift/index.ts
index c41cdba0bf..bbb83400ec 100644
--- a/lib/modules/manager/swift/index.ts
+++ b/lib/modules/manager/swift/index.ts
@@ -2,6 +2,7 @@ import { GitTagsDatasource } from '../../datasource/git-tags';
 import * as swiftVersioning from '../../versioning/swift';
 
 export { extractPackageFile } from './extract';
+export { getRangeStrategy } from './range';
 
 export const displayName = 'Swift Package Manager';
 export const url = 'https://www.swift.org/package-manager/';
@@ -11,6 +12,5 @@ export const supportedDatasources = [GitTagsDatasource.id];
 export const defaultConfig = {
   fileMatch: ['(^|/)Package\\.swift'],
   versioning: swiftVersioning.id,
-  rangeStrategy: 'bump',
   pinDigests: false,
 };
diff --git a/lib/modules/manager/swift/range.spec.ts b/lib/modules/manager/swift/range.spec.ts
new file mode 100644
index 0000000000..4f20913fca
--- /dev/null
+++ b/lib/modules/manager/swift/range.spec.ts
@@ -0,0 +1,16 @@
+import type { RangeConfig } from '../types';
+import { getRangeStrategy } from '.';
+
+describe('modules/manager/swift/range', () => {
+  describe('getRangeStrategy()', () => {
+    it('returns same if not auto', () => {
+      const config: RangeConfig = { rangeStrategy: 'widen' };
+      expect(getRangeStrategy(config)).toBe('widen');
+    });
+
+    it('defaults to update-lockfile', () => {
+      const config: RangeConfig = { rangeStrategy: 'auto' };
+      expect(getRangeStrategy(config)).toBe('bump');
+    });
+  });
+});
diff --git a/lib/modules/manager/swift/range.ts b/lib/modules/manager/swift/range.ts
new file mode 100644
index 0000000000..8f3d6e7eb5
--- /dev/null
+++ b/lib/modules/manager/swift/range.ts
@@ -0,0 +1,8 @@
+import type { RangeStrategy } from '../../../types';
+import type { RangeConfig } from '../types';
+
+export function getRangeStrategy({
+  rangeStrategy,
+}: RangeConfig): RangeStrategy {
+  return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
+}
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json
index 1891c1584d..4b038d5bb2 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json
@@ -1,4 +1,4 @@
 {
   "filename": "renovate.json",
-  "content": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \":autodetectRangeStrategy\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\"main\"]\n}\n"
+  "content": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\"main\"]\n}\n"
 }
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json
index 1266070ddd..1e9f8833a3 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json
@@ -1,5 +1,5 @@
 {
-  "content": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \":autodetectRangeStrategy\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\n    \"main\"\n  ]\n}\n",
+  "content": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\n    \"main\"\n  ]\n}\n",
   "filename": "renovate.json",
   "indent": {
     "amount": 2,
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5 b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5
index c80dcb42b6..22888d346d 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5
@@ -1,5 +1,5 @@
 {
-  "content": "{\n  extends: [\n    ':separateMajorReleases',\n    ':prImmediately',\n    ':renovatePrefix',\n    ':semanticPrefixFixDepsChoreOthers',\n    ':updateNotScheduled',\n    ':automergeDisabled',\n    ':maintainLockFilesDisabled',\n    ':autodetectRangeStrategy',\n    'group:monorepos',\n  ],\n  onboarding: false,\n  rangeStrategy: 'replace',\n  semanticCommits: 'enabled',\n  timezone: 'US/Central',\n  baseBranches: [\n    'main',\n  ],\n}\n",
+  "content": "{\n  extends: [\n    ':separateMajorReleases',\n    ':prImmediately',\n    ':renovatePrefix',\n    ':semanticPrefixFixDepsChoreOthers',\n    ':updateNotScheduled',\n    ':automergeDisabled',\n    ':maintainLockFilesDisabled',\n    'group:monorepos',\n  ],\n  onboarding: false,\n  rangeStrategy: 'replace',\n  semanticCommits: 'enabled',\n  timezone: 'US/Central',\n  baseBranches: [\n    'main',\n  ],\n}\n",
   "filename": "renovate.json5",
   "indent": {
     "amount": 2,
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json
index 549d809c23..66b64ae3c8 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json
@@ -7,7 +7,6 @@
     ":updateNotScheduled",
     ":automergeDisabled",
     ":maintainLockFilesDisabled",
-    ":autodetectRangeStrategy",
     "group:monorepos"
   ],
   "onboarding": false,
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json
index 6ea0880bb1..1a0a9efc29 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json
@@ -8,7 +8,6 @@
     ":updateNotScheduled",
     ":automergeDisabled",
     ":maintainLockFilesDisabled",
-    ":autodetectRangeStrategy",
     "group:monorepos",
     "helpers:oddIsUnstablePackages"
   ],
diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5 b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5
index 2d13ebc63f..559b6b9879 100644
--- a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5
+++ b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5
@@ -7,7 +7,6 @@
     ':updateNotScheduled',
     ':automergeDisabled',
     ':maintainLockFilesDisabled',
-    ':autodetectRangeStrategy',
     'group:monorepos',
     'helpers:oddIsUnstablePackages'
   ],
diff --git a/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json b/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json
index 0dce506326..3375b555e6 100644
--- a/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json
+++ b/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json
@@ -1,4 +1,4 @@
 {
   "configFileName": "renovate.json",
-  "migratedContent": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \":autodetectRangeStrategy\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\n    \"main\"\n  ]\n}\n"
+  "migratedContent": "{\n  \"extends\": [\n    \":separateMajorReleases\",\n    \":prImmediately\",\n    \":renovatePrefix\",\n    \":semanticPrefixFixDepsChoreOthers\",\n    \":updateNotScheduled\",\n    \":automergeDisabled\",\n    \":maintainLockFilesDisabled\",\n    \"group:monorepos\"\n  ],\n  \"onboarding\": false,\n  \"rangeStrategy\": \"replace\",\n  \"semanticCommits\": \"enabled\",\n  \"timezone\": \"US/Central\",\n  \"baseBranches\": [\n    \"main\"\n  ]\n}\n"
 }
-- 
GitLab