diff --git a/lib/config/types.ts b/lib/config/types.ts
index 2c49c83da1584f9e926bf13e843d313388e53062..f6e8d56952fdbcd46cce7ec6514dbfe4d550c0e0 100644
--- a/lib/config/types.ts
+++ b/lib/config/types.ts
@@ -34,6 +34,9 @@ export interface RenovateSharedConfig {
   manager?: string;
   commitMessage?: string;
   commitMessagePrefix?: string;
+  commitMessageTopic?: string;
+  commitMessageAction?: string;
+  commitMessageExtra?: string;
   confidential?: boolean;
   customChangelogUrl?: string;
   draftPR?: boolean;
@@ -253,7 +256,7 @@ export interface RenovateConfig
   secrets?: Record<string, string>;
 
   constraints?: Record<string, string>;
-  skipInstalls?: boolean;
+  skipInstalls?: boolean | null;
 
   constraintsFiltering?: ConstraintsFilter;
 }
diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts
index e6672bd53f89ee804827ddf985112d45f78a2b84..1932f6fd8525aba670af2afd55818c7cc9a77cf9 100644
--- a/lib/modules/manager/npm/extract/index.spec.ts
+++ b/lib/modules/manager/npm/extract/index.spec.ts
@@ -1,6 +1,6 @@
 import { Fixtures } from '../../../../../test/fixtures';
 import { fs } from '../../../../../test/util';
-import { getConfig } from '../../../../config/defaults';
+import type { ExtractConfig } from '../../types';
 import * as npmExtract from '.';
 
 jest.mock('../../../../util/fs');
@@ -8,8 +8,9 @@ const realFs = jest.requireActual<typeof import('../../../../util/fs')>(
   '../../../../util/fs'
 );
 
-// TODO: fix types
-const defaultConfig = getConfig();
+const defaultExtractConfig = {
+  skipInstalls: null,
+} satisfies ExtractConfig;
 
 const input01Content = Fixtures.get('inputs/01.json', '..');
 const input02Content = Fixtures.get('inputs/02.json', '..');
@@ -35,7 +36,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         'not json',
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toBeNull();
     });
@@ -44,7 +45,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         invalidNameContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [{ skipReason: 'invalid-name' }],
@@ -55,7 +56,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         vendorisedContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toBeNull();
     });
@@ -65,7 +66,7 @@ describe('modules/manager/npm/extract/index', () => {
         npmExtract.extractPackageFile(
           '{ "renovate": {} }',
           'backend/package.json',
-          defaultConfig
+          defaultExtractConfig
         )
       ).rejects.toThrow();
     });
@@ -74,7 +75,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         '{ "renovate": {} }',
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toBeNull();
     });
@@ -83,7 +84,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         '{"dependencies": true, "devDependencies": []}',
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toBeNull();
     });
@@ -92,7 +93,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [
@@ -119,7 +120,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01GlobContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res?.deps).toHaveLength(13);
       expect(res).toMatchSnapshot({
@@ -154,7 +155,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: {
@@ -183,7 +184,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        { ...defaultConfig, npmrc: 'config-npmrc' }
+        { ...defaultExtractConfig, npmrc: 'config-npmrc' }
       );
       expect(res?.npmrc).toBe('config-npmrc');
     });
@@ -281,7 +282,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: {
@@ -302,7 +303,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: {
@@ -323,7 +324,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: {
@@ -344,7 +345,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         workspacesSimpleContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: { workspacesPackages: ['packages/*'] },
@@ -361,7 +362,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         workspacesSimpleContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: { workspacesPackages: ['packages/*'] },
@@ -378,7 +379,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         workspacesContent,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         managerData: { workspacesPackages: ['packages/*'] },
@@ -411,7 +412,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         extractedConstraints: {
@@ -494,7 +495,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [
@@ -525,7 +526,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [
@@ -568,7 +569,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
 
       expect(res).toMatchObject({
@@ -622,7 +623,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [
@@ -735,7 +736,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         deps: [
@@ -760,7 +761,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         input01Content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot();
     });
@@ -773,7 +774,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         pJsonStr,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchSnapshot({
         extractedConstraints: { yarn: '3.0.0' },
@@ -815,7 +816,7 @@ describe('modules/manager/npm/extract/index', () => {
       const res = await npmExtract.extractPackageFile(
         content,
         'package.json',
-        defaultConfig
+        defaultExtractConfig
       );
       expect(res).toMatchObject({
         deps: [
diff --git a/lib/modules/manager/npm/post-update/lerna.ts b/lib/modules/manager/npm/post-update/lerna.ts
index 72db5a57ad7aa020b70e68755cd8276faae39bb5..da3614f85f6123ec3f2bb5b8e7c72aca1b7cc4f0 100644
--- a/lib/modules/manager/npm/post-update/lerna.ts
+++ b/lib/modules/manager/npm/post-update/lerna.ts
@@ -40,7 +40,7 @@ export async function generateLockFiles(
   lockFileDir: string,
   config: PostUpdateConfig,
   env: NodeJS.ProcessEnv,
-  skipInstalls?: boolean
+  skipInstalls?: boolean | null
 ): Promise<GenerateLockFileResult> {
   const lernaClient = lernaPackageFile.managerData?.lernaClient;
   if (!is.nonEmptyString(lernaClient)) {
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index 27edf51ab2c2197db4a63652779d3c285c0e97ce..fffd4ac2ddd717440c292c21ca8f1b913b7ba07d 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -19,7 +19,7 @@ export interface ExtractConfig extends CustomExtractConfig {
   registryAliases?: Record<string, string>;
   npmrc?: string;
   npmrcMerge?: boolean;
-  skipInstalls?: boolean;
+  skipInstalls?: boolean | null;
 }
 
 export interface CustomExtractConfig extends RegexManagerTemplates {
@@ -63,7 +63,7 @@ export interface PackageFileContent<T = Record<string, any>>
   lockFiles?: string[];
   npmrc?: string;
   packageFileVersion?: string;
-  skipInstalls?: boolean;
+  skipInstalls?: boolean | null;
   matchStrings?: string[];
   matchStringsStrategy?: MatchStringsStrategy;
 }
@@ -269,7 +269,7 @@ export interface PostUpdateConfig<T = Record<string, any>>
     ManagerData<T> {
   updatedPackageFiles?: FileChange[];
   postUpdateOptions?: string[];
-  skipInstalls?: boolean;
+  skipInstalls?: boolean | null;
   ignoreScripts?: boolean;
 
   packageFile?: string;
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index 2f436d4bf62d8ac4f7fc6078dec85b13b57d95b8..040726a9034f8e7bf320d66e1cfd71e6fe4bca99 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -1,26 +1,39 @@
 import { codeBlock } from 'common-tags';
-import { getConfig, partial } from '../../../../test/util';
-import type { RenovateConfig, UpdateType } from '../../../config/types';
+import { getConfig } from '../../../../test/util';
+import type { UpdateType } from '../../../config/types';
 import { NpmDatasource } from '../../../modules/datasource/npm';
 import type { BranchUpgradeConfig } from '../../types';
 import { generateBranchConfig } from './generate';
 
-let defaultConfig: RenovateConfig;
+const {
+  commitMessage,
+  commitMessagePrefix,
+  commitMessageAction,
+  commitMessageTopic,
+  commitMessageExtra,
+} = getConfig();
+let requiredDefaultOptions = {};
 
 beforeEach(() => {
   jest.resetAllMocks();
-  defaultConfig = getConfig();
+  requiredDefaultOptions = {
+    commitMessage,
+    commitMessagePrefix,
+    commitMessageAction,
+    commitMessageTopic,
+    commitMessageExtra,
+  };
 });
 
 describe('workers/repository/updates/generate', () => {
   describe('generateBranchConfig()', () => {
     it('does not group single upgrade', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
+          branchName: 'some-branch',
           depName: 'some-dep',
           groupName: 'some-group',
-          branchName: 'some-branch',
           prTitle: 'some-title',
           releaseTimestamp: '2017-02-07T20:01:41+00:00',
           foo: 1,
@@ -28,7 +41,7 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(1);
       expect(res.groupName).toBeUndefined();
@@ -36,14 +49,14 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('handles lockFileMaintenance', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           branchName: 'some-branch',
           prTitle: 'some-title',
           isLockFileMaintenance: true,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res).toMatchSnapshot({
         branchName: 'some-branch',
@@ -60,7 +73,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('handles lockFileUpdate', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           branchName: 'some-branch',
@@ -72,7 +85,7 @@ describe('workers/repository/updates/generate', () => {
           newValue: '^1.0.0',
           newVersion: '1.0.1',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res).toMatchSnapshot({
         branchName: 'some-branch',
@@ -102,7 +115,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('does not group same upgrades', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -125,14 +138,14 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(1);
       expect(res.groupName).toBeUndefined();
     });
 
     it('groups multiple upgrades same version', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch: BranchUpgradeConfig[] = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -191,7 +204,7 @@ describe('workers/repository/updates/generate', () => {
           releaseTimestamp: '2017-02-06T20:01:41+00:00',
           automerge: false,
         },
-      ]);
+      ];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.groupName).toBeDefined();
@@ -204,7 +217,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('groups major updates with different versions but same newValue, no recreateClosed', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -233,14 +246,14 @@ describe('workers/repository/updates/generate', () => {
           isMajor: true,
           newMajor: 5,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.groupName).toBeDefined();
       expect(res.recreateClosed).toBeFalsy();
     });
 
     it('groups multiple digest updates immortally', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -263,84 +276,89 @@ describe('workers/repository/updates/generate', () => {
           newDigest: 'sha256:abcdef987654321',
           isDigest: true,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.groupName).toBeDefined();
       expect(res.recreateClosed).toBeTrue();
     });
 
     it('Grouped pin & pinDigest can be recreated', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           isPinDigest: true,
           updateType: 'pinDigest',
           newValue: 'v2',
           newDigest: 'dc323e67f16fb5f7663d20ff7941f27f5809e9b6',
-        } as BranchUpgradeConfig,
+        },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           updateType: 'pin',
           isPin: true,
           newValue: "'2.2.0'",
           newVersion: '2.2.0',
           newMajor: 2,
-        } as BranchUpgradeConfig,
-      ];
+        },
+      ] as BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.recreateClosed).toBeTrue();
     });
 
     it('Grouped pin can be recreated', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           updateType: 'pin',
           isPin: true,
           newValue: "'2.2.0'",
           newVersion: '2.2.0',
           newMajor: 2,
-        } as BranchUpgradeConfig,
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           updateType: 'pin',
           isPin: true,
           newValue: "'3.2.0'",
           newVersion: '3.2.0',
           newMajor: 3,
-        } as BranchUpgradeConfig,
-      ];
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.recreateClosed).toBeTrue();
     });
 
     it('grouped pinDigest can be recreated', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           isPinDigest: true,
           newDigest: 'abcd',
           newValue: 'v3',
           updateType: 'pinDigest',
-        } as BranchUpgradeConfig,
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           isPinDigest: true,
           newDigest: 'dcba',
           newMajor: 2,
           newValue: 'v2',
           updateType: 'pinDigest',
-        } as BranchUpgradeConfig,
-      ];
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.recreateClosed).toBeTrue();
     });
 
     it('groups multiple upgrades different version', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'depB',
@@ -379,7 +397,7 @@ describe('workers/repository/updates/generate', () => {
           updateType: 'minor',
           separateMinorPatch: true,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res).toMatchObject({
         foo: 2,
@@ -393,7 +411,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('groups multiple upgrades different version but same value', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'depB',
@@ -426,7 +444,7 @@ describe('workers/repository/updates/generate', () => {
           },
           releaseTimestamp: '2017-02-08T20:01:41+00:00',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.singleVersion).toBeUndefined();
@@ -436,7 +454,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('groups multiple upgrades different value but same version', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'depB',
@@ -469,7 +487,7 @@ describe('workers/repository/updates/generate', () => {
           },
           releaseTimestamp: '2017-02-08T20:01:41+00:00',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.singleVersion).toBeUndefined();
@@ -479,7 +497,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('groups multiple digest updates', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'foo/bar',
@@ -510,7 +528,7 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(2);
       expect(res.singleVersion).toBeUndefined();
@@ -519,24 +537,25 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('pins digest to table', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           depName: 'foo-image',
           newDigest: 'abcdefg987612345',
           currentDigest: '',
           updateType: 'pinDigest',
           isPinDigest: true,
-        } as BranchUpgradeConfig,
-      ];
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.upgrades[0].displayFrom).toBe('');
       expect(res.upgrades[0].displayTo).toBe('abcdefg');
     });
 
     it('fixes different messages', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'depA',
@@ -569,17 +588,16 @@ describe('workers/repository/updates/generate', () => {
           },
           releaseTimestamp: '2017-02-08T20:01:41+00:00',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.foo).toBe(1);
       expect(res.groupName).toBeUndefined();
     });
 
     it('uses semantic commits', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           semanticCommits: 'enabled',
@@ -592,8 +610,9 @@ describe('workers/repository/updates/generate', () => {
           group: {
             foo: 2,
           },
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(package): update dependency some-dep to v1.2.0'
@@ -604,10 +623,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('scopes monorepo commits', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           packageFile: 'package.json',
@@ -622,8 +640,9 @@ describe('workers/repository/updates/generate', () => {
           group: {
             foo: 2,
           },
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('chore(): update dependency some-dep to v1.2.0');
       expect(res.commitMessage).toBe(
@@ -632,10 +651,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('scopes monorepo commits with nested package files using parent directory', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           commitBodyTable: false,
           manager: 'some-manager',
           depName: 'some-dep',
@@ -651,8 +669,9 @@ describe('workers/repository/updates/generate', () => {
           group: {
             foo: 2,
           },
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(bar): update dependency some-dep to v1.2.0'
@@ -663,10 +682,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('scopes monorepo commits with nested package files using base directory', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           packageFile: 'foo/bar/package.json',
@@ -681,8 +699,9 @@ describe('workers/repository/updates/generate', () => {
           group: {
             foo: 2,
           },
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(foo/bar): update dependency some-dep to v1.2.0'
@@ -693,11 +712,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('use prettyVersion in pr title when there is a v', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
-          manager: 'some-manager',
+          ...requiredDefaultOptions,
           depName: 'some-dep',
           packageFile: 'foo/bar/package.json',
           packageFileDir: 'foo/bar',
@@ -708,8 +725,10 @@ describe('workers/repository/updates/generate', () => {
           newValue: 'v1.2.0',
           isSingleVersion: true,
           newVersion: 'v1.2.0',
-        } as BranchUpgradeConfig,
-      ];
+          manager: 'some-manager',
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(foo/bar): update dependency some-dep v1.2.0'
@@ -720,10 +739,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('use prettyVersion in pr title there is no v', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           packageFile: 'foo/bar/package.json',
@@ -735,8 +753,9 @@ describe('workers/repository/updates/generate', () => {
           newValue: '3.2.0',
           newVersion: '3.2.0',
           newMajor: 3,
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(foo/bar): update dependency some-dep v3.2.0'
@@ -747,10 +766,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('use newMajor in pr title with v', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           packageFile: 'foo/bar/package.json',
@@ -762,8 +780,9 @@ describe('workers/repository/updates/generate', () => {
           newValue: '3.2.0',
           newVersion: '3.2.0',
           newMajor: 3,
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('chore(foo/bar): update dependency some-dep v3');
       expect(res.commitMessage).toBe(
@@ -772,10 +791,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('Default commitMessageExtra pr title', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           packageFile: 'foo/bar/package.json',
@@ -786,8 +804,9 @@ describe('workers/repository/updates/generate', () => {
           newValue: 'v1.2.0',
           isSingleVersion: true,
           newVersion: 'v1.2.0',
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(foo/bar): update dependency some-dep to v1.2.0'
@@ -798,41 +817,41 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('adds commit message body', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           commitBody: '[skip-ci]',
           newValue: '1.2.0',
           isSingleVersion: true,
           newVersion: '1.2.0',
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('Update dependency some-dep to v1.2.0');
       expect(res.commitMessage).toBe('Update dependency some-dep to v1.2.0');
     });
 
     it('supports manual prTitle', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           prTitle: 'Upgrade {{depName}}',
           toLowerCase: true,
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('upgrade some-dep');
       expect(res.commitMessage).toBe('update dependency some-dep to');
     });
 
     it('handles @types specially', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           commitBodyTable: true,
@@ -869,7 +888,7 @@ describe('workers/repository/updates/generate', () => {
           newValue: '1.0.0',
           group: {},
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.recreateClosed).toBeFalse();
       expect(res.groupName).toBeUndefined();
@@ -897,7 +916,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('handles @types specially (reversed)', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -930,7 +949,7 @@ describe('workers/repository/updates/generate', () => {
           labels: ['a'],
           group: {},
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       expect(generateBranchConfig(branch)).toMatchSnapshot({
         upgrades: [
           {
@@ -958,8 +977,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('handles upgrades', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -970,7 +988,7 @@ describe('workers/repository/updates/generate', () => {
           fileReplacePosition: 5,
         },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           branchName: 'some-branch',
@@ -982,7 +1000,7 @@ describe('workers/repository/updates/generate', () => {
           fileReplacePosition: 1,
         },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           branchName: 'some-branch',
@@ -994,7 +1012,7 @@ describe('workers/repository/updates/generate', () => {
           fileReplacePosition: 2,
         },
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           manager: 'some-manager',
           depName: 'some-dep',
           branchName: 'some-branch',
@@ -1006,13 +1024,13 @@ describe('workers/repository/updates/generate', () => {
           updateType: 'patch' as UpdateType,
           fileReplacePosition: 0,
         },
-      ] as BranchUpgradeConfig[];
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toMatchSnapshot('some-title (patch)');
     });
 
     it('combines prBodyColumns', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           branchName: 'some-branch',
@@ -1023,13 +1041,13 @@ describe('workers/repository/updates/generate', () => {
           branchName: 'some-branch',
           prBodyColumns: ['column-c', 'column-b', 'column-a'],
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prBodyColumns).toEqual(['column-a', 'column-b', 'column-c']);
     });
 
     it('sorts upgrades, without position first', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep1',
@@ -1062,7 +1080,7 @@ describe('workers/repository/updates/generate', () => {
           newValue: '0.6.0',
           fileReplacePosition: undefined,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(
         res.upgrades.map((upgrade) => upgrade.fileReplacePosition)
@@ -1070,7 +1088,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('passes through pendingChecks', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -1087,14 +1105,14 @@ describe('workers/repository/updates/generate', () => {
           prTitle: 'some-title',
           pendingChecks: true,
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.pendingChecks).toBeTrue();
       expect(res.upgrades).toHaveLength(2);
     });
 
     it('filters pendingChecks', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -1110,14 +1128,14 @@ describe('workers/repository/updates/generate', () => {
           branchName: 'some-branch',
           prTitle: 'some-title',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.pendingChecks).toBeUndefined();
       expect(res.upgrades).toHaveLength(1);
     });
 
     it('displays pending versions', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep',
@@ -1141,7 +1159,7 @@ describe('workers/repository/updates/generate', () => {
           prTitle: 'Two pending versions',
           pendingVersions: ['1.1.0', '1.1.1'],
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.upgrades.map((u) => u.displayPending)).toStrictEqual([
         '',
@@ -1151,7 +1169,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('merge excludeCommitPaths if appears in upgrade', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           depName: 'some-dep1',
@@ -1175,7 +1193,7 @@ describe('workers/repository/updates/generate', () => {
           newValue: '0.9.0',
           excludeCommitPaths: ['some/path', 'some/other-manager/path'],
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       const excludeCommitPaths = res.excludeCommitPaths ?? [];
       expect(excludeCommitPaths.sort()).toStrictEqual(
@@ -1184,9 +1202,9 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('generates pretty version name properly', () => {
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           depName: 'some-dep',
           isSingleVersion: true,
           manager: 'some-manager',
@@ -1195,8 +1213,9 @@ describe('workers/repository/updates/generate', () => {
           semanticCommits: 'enabled',
           semanticCommitScope: 'package',
           semanticCommitType: 'chore',
-        } as BranchUpgradeConfig,
-      ];
+          branchName: 'some-branch',
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe(
         'chore(package): update dependency some-dep to foo-pkg-v3.2.1'
@@ -1207,23 +1226,22 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('prevents issue with duplicating "v" character', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           manager: 'some-manager',
           branchName: 'some-branch',
           commitMessage: 'update to vv1.2.0',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('update to v1.2.0');
       expect(res.commitMessage).toBe('update to v1.2.0');
     });
 
     it('apply semanticCommits and commitMessagePrefix together', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           branchName: 'some-branch',
           commitMessagePrefix: 'PATCH:',
           depName: 'some-dep',
@@ -1231,8 +1249,8 @@ describe('workers/repository/updates/generate', () => {
           newValue: '1.2.0',
           semanticCommits: 'enabled',
           semanticCommitScope: null,
-        } as BranchUpgradeConfig,
-      ];
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('PATCH: Update dependency some-dep to 1.2.0');
       expect(res.commitMessage).toBe(
@@ -1241,7 +1259,7 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('dedupes duplicate table rows', () => {
-      const branch = partial<BranchUpgradeConfig>([
+      const branch = [
         {
           commitBodyTable: true,
           manager: 'some-manager',
@@ -1286,7 +1304,7 @@ describe('workers/repository/updates/generate', () => {
           currentVersion: '5.1.1',
           newVersion: '5.1.2',
         },
-      ]);
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.commitMessage?.trim()).toBe(codeBlock`
         | datasource | package     | from  | to    |
@@ -1304,18 +1322,17 @@ describe('workers/repository/updates/generate', () => {
     });
 
     it('using commitMessagePrefix without separator', () => {
-      // TODO #7154 incompatible types
-      const branch: BranchUpgradeConfig[] = [
+      const branch = [
         {
-          ...defaultConfig,
+          ...requiredDefaultOptions,
           branchName: 'some-branch',
           commitMessagePrefix: '🆙',
           depName: 'some-dep',
           manager: 'some-manager',
           newValue: '1.2.0',
           commitMessageAction: 'Update',
-        } as BranchUpgradeConfig,
-      ];
+        },
+      ] satisfies BranchUpgradeConfig[];
       const res = generateBranchConfig(branch);
       expect(res.prTitle).toBe('🆙 Update dependency some-dep to 1.2.0');
       expect(res.commitMessage).toBe('🆙 Update dependency some-dep to 1.2.0');