diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 00019c4cb0063084d3a4392de88db1b05d1052f7..8780d99fac415ca5804826b42eba73fb0bcae294 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -226,21 +226,25 @@ This is used to add a suffix to commit messages. Usually left empty except for i
 
 This is used to alter `commitMessage` and `prTitle` without needing to copy/paste the whole string. The "topic" is usually refers to the dependency being updated, e.g. `"dependency react"`.
 
-## compatibility
+## configWarningReuseIssue
+
+Renovate's default behaviour is to reuse/reopen a single Config Warning issue in each repository so as to keep the "noise" down. However for some people this has the downside that the config warning won't be sorted near the top if you view issues by creation date. Configure this option to `false` if you prefer Renovate to open a new issue whenever there is a config warning.
+
+## constraints
 
-This is used to manually restrict which versions are possible to upgrade to based on their language support. For now this only supports `python`, other compatibility restrictions will be added in the future.
+Constraints are used in package managers which use third party tools to update "artifacts" like lock files or checksum files. Typically, the constraint is detected automatically by Renovate from files within the repository and there is no need to manually configure it.
+
+Constraints are also used to manually restrict which _datasource_ versions are possible to upgrade to based on their language support. For now this only supports `python`, other compatibility restrictions will be added in the future.
 
 ```json
 {
-  "compatibility": {
+  "constraints": {
     "python": "2.7"
   }
 }
 ```
 
-## configWarningReuseIssue
-
-Renovate's default behaviour is to reuse/reopen a single Config Warning issue in each repository so as to keep the "noise" down. However for some people this has the downside that the config warning won't be sorted near the top if you view issues by creation date. Configure this option to `false` if you prefer Renovate to open a new issue whenever there is a config warning.
+Note: make sure not to mix this up with the term `compatibility`, which Renovate uses in the context of version releases, e.g. if a Docker image is `node:12.16.0-alpine` then the `-alpine` suffix represents `compatibility`.
 
 ## dependencyDashboard
 
diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index 0f201826dcdc541eb2d8ce50fba0866b088c92a6..39751a29fcc55f322923fbe8b282d0b981605dad 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -42,6 +42,9 @@ Object {
   "branchPrefix": "renovate/",
   "commitMessage": "{{#if semanticCommitType}}{{semanticCommitType}}{{#if semanticCommitScope}}({{semanticCommitScope}}){{/if}}: {{/if}}some commit message",
   "commitMessageExtra": "{{currentValue}} something",
+  "constraints": Object {
+    "python": "3.7",
+  },
   "dependencyDashboard": true,
   "dependencyDashboardTitle": "foo",
   "enabled": true,
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index 257d5657fbe99b6b708e0f8e3ed0aeaf847c6ea5..f40d06829fed9be748af8cbc3d33f262336faef8 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -1580,8 +1580,9 @@ const options: RenovateOptions[] = [
     cli: false,
   },
   {
-    name: 'compatibility',
-    description: 'Configuration object for compatibility',
+    name: 'constraints',
+    description:
+      'Configuration object for define language or manager version constraints',
     type: 'object',
     default: {},
     mergeable: true,
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 08a2370b88c9a599d99d81b03e7e124b555fa47c..e6288c3b78ea05fc487f9aab5744fc2eff56b203 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -26,6 +26,9 @@ describe('config/migration', () => {
             password: 'some-password',
           },
         ],
+        compatibility: {
+          python: '3.7',
+        },
         extends: [':js-app', 'config:library', ':masterIssue'],
         maintainYarnLock: true,
         onboarding: 'false' as never,
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 70e3118117e745832f2a0d0022c6518ca73227b7..19fb8296d491af944b907e83b9c3aa3222bc46c7 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -487,6 +487,10 @@ export function migrateConfig(
           }
         }
         migratedConfig[key] = newArray;
+      } else if (key === 'compatibility' && is.object(val)) {
+        isMigrated = true;
+        migratedConfig.constraints = migratedConfig.compatibility;
+        delete migratedConfig.compatibility;
       } else if (is.object(val)) {
         const subMigrate = migrateConfig(
           migratedConfig[key] as RenovateConfig,
diff --git a/lib/config/presets/internal/monorepo.ts b/lib/config/presets/internal/monorepo.ts
index f7a4222dbf7d0cdf43775c42de8ecdee85a2e0d1..982bc518f7aaf04df1651ab5a620b2eb031ff351 100644
--- a/lib/config/presets/internal/monorepo.ts
+++ b/lib/config/presets/internal/monorepo.ts
@@ -92,7 +92,7 @@ const repoGroups = {
     'https://github.com/mozilla-neutrino/neutrino-dev',
   ],
   nextjs: [
-    'https://github.com/zeit/next.js', // for compatibility
+    'https://github.com/zeit/next.js', // old repo
     'https://github.com/vercel/next.js',
   ],
   ngrx: 'https://github.com/ngrx/',
diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts
index 73a9088b2effe0918c2efcb4ef129095fed32404..583b5409e1f2a2b1f3393261c3f0341522e5c1d9 100644
--- a/lib/config/validation.spec.ts
+++ b/lib/config/validation.spec.ts
@@ -313,9 +313,9 @@ describe('config/validation', () => {
       expect(errors).toHaveLength(0);
     });
 
-    it('does not validate compatibility children', async () => {
+    it('does not validate constraints children', async () => {
       const config = {
-        compatibility: { packageRules: [{}] },
+        constraints: { packageRules: [{}] },
       };
       const { warnings, errors } = await configValidation.validateConfig(
         config,
diff --git a/lib/config/validation.ts b/lib/config/validation.ts
index c16210281da65eeab62b03a1261f418e2ecf17fc..c594eeda3dee8ff765bf966ca2ed6e940f00a79a 100644
--- a/lib/config/validation.ts
+++ b/lib/config/validation.ts
@@ -361,7 +361,11 @@ export async function validateConfig(
               message: `Configuration option \`${currentPath}\` should be a string`,
             });
           }
-        } else if (type === 'object' && currentPath !== 'compatibility') {
+        } else if (
+          type === 'object' &&
+          currentPath !== 'compatibility' &&
+          currentPath !== 'constraints'
+        ) {
           if (is.plainObject(val)) {
             if (key === 'aliases') {
               if (!validateAliasObject(key, val)) {
diff --git a/lib/datasource/common.ts b/lib/datasource/common.ts
index 1ea807a037837e51eab061b3a902e86c1d017973..eb7d02c38a9c5dc8e42c1a13bd8f9d9f8caedbc4 100644
--- a/lib/datasource/common.ts
+++ b/lib/datasource/common.ts
@@ -10,7 +10,7 @@ export interface DigestConfig extends Config {
 }
 
 interface ReleasesConfigBase {
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   npmrc?: string;
   registryUrls?: string[];
 }
diff --git a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
index 167ff5ca4de91afa7d249bacbe9ef355ed0a3269..ab246638c85cad433488192998a5dfb16b2f50ae 100644
--- a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
@@ -80,7 +80,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getReleases parses data-requires-python and respects compatibility from simple endpoint 1`] = `
+exports[`datasource/pypi getReleases parses data-requires-python and respects constraints from simple endpoint 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -105,7 +105,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getReleases parses data-requires-python and respects compatibility from simple endpoint 2`] = `
+exports[`datasource/pypi getReleases parses data-requires-python and respects constraints from simple endpoint 2`] = `
 Array [
   Object {
     "headers": Object {
@@ -365,7 +365,7 @@ Array [
 ]
 `;
 
-exports[`datasource/pypi getReleases respects compatibility 1`] = `
+exports[`datasource/pypi getReleases respects constraints 1`] = `
 Object {
   "releases": Array [
     Object {
@@ -381,7 +381,7 @@ Object {
 }
 `;
 
-exports[`datasource/pypi getReleases respects compatibility 2`] = `
+exports[`datasource/pypi getReleases respects constraints 2`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index e34d0323f33cc0c8d38ea532c6b227902f42d99f..0177a0760734d9606963e0a38a7f34a1b3ef9e9c 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -184,7 +184,7 @@ describe('datasource/pypi', () => {
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
-    it('respects compatibility', async () => {
+    it('respects constraints', async () => {
       httpMock
         .scope(baseUrl)
         .get('/doit/json')
@@ -205,7 +205,7 @@ describe('datasource/pypi', () => {
       expect(
         await getPkgReleases({
           datasource,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'doit',
         })
       ).toMatchSnapshot();
@@ -223,7 +223,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
@@ -241,7 +241,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
@@ -259,7 +259,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'image-collector',
         })
       ).toMatchSnapshot();
@@ -277,7 +277,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -295,7 +295,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -313,7 +313,7 @@ describe('datasource/pypi', () => {
         await getPkgReleases({
           datasource,
           ...config,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           depName: 'dj-database-url',
         })
       ).toBeNull();
@@ -338,7 +338,7 @@ describe('datasource/pypi', () => {
       expect(result).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
-    it('parses data-requires-python and respects compatibility from simple endpoint', async () => {
+    it('parses data-requires-python and respects constraints from simple endpoint', async () => {
       httpMock
         .scope('https://pypi.org/simple/')
         .get('/dj-database-url')
@@ -349,7 +349,7 @@ describe('datasource/pypi', () => {
       expect(
         await getPkgReleases({
           datasource,
-          compatibility: { python: '2.7' },
+          constraints: { python: '2.7' },
           ...config,
           depName: 'dj-database-url',
         })
diff --git a/lib/datasource/pypi/index.ts b/lib/datasource/pypi/index.ts
index 82cb434f52abe752b3caa089a3d7c15ed97b8ee5..2e98b5e5b96d8814f9af7f8d5262db10b61d7ba8 100644
--- a/lib/datasource/pypi/index.ts
+++ b/lib/datasource/pypi/index.ts
@@ -39,10 +39,10 @@ function normalizeName(input: string): string {
 
 function compatibleVersions(
   releases: Releases,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): string[] {
   const versions = Object.keys(releases);
-  if (!(compatibility?.python && pep440.isVersion(compatibility.python))) {
+  if (!(constraints?.python && pep440.isVersion(constraints.python))) {
     return versions;
   }
   return versions.filter((version) =>
@@ -50,7 +50,7 @@ function compatibleVersions(
       if (!release.requires_python) {
         return true;
       }
-      return matches(compatibility.python, release.requires_python);
+      return matches(constraints.python, release.requires_python);
     })
   );
 }
@@ -58,7 +58,7 @@ function compatibleVersions(
 async function getDependency(
   packageName: string,
   hostUrl: string,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): Promise<ReleaseResult | null> {
   const lookupUrl = url.resolve(hostUrl, `${packageName}/json`);
   const dependency: ReleaseResult = { releases: null };
@@ -121,7 +121,7 @@ async function getDependency(
 
   dependency.releases = [];
   if (dep.releases) {
-    const versions = compatibleVersions(dep.releases, compatibility);
+    const versions = compatibleVersions(dep.releases, constraints);
     dependency.releases = versions.map((version) => {
       const releases = dep.releases[version] || [];
       const { upload_time: releaseTimestamp } = releases[0] || {};
@@ -185,7 +185,7 @@ function cleanSimpleHtml(html: string): string {
 async function getSimpleDependency(
   packageName: string,
   hostUrl: string,
-  compatibility: Record<string, string>
+  constraints: Record<string, string>
 ): Promise<ReleaseResult | null> {
   const lookupUrl = url.resolve(hostUrl, `${packageName}`);
   const dependency: ReleaseResult = { releases: null };
@@ -214,7 +214,7 @@ async function getSimpleDependency(
       releases[version].push(release);
     }
   }
-  const versions = compatibleVersions(releases, compatibility);
+  const versions = compatibleVersions(releases, constraints);
   dependency.releases = versions.map((version) => {
     const versionReleases = releases[version] || [];
     const isDeprecated = versionReleases.some(({ yanked }) => yanked);
@@ -228,7 +228,7 @@ async function getSimpleDependency(
 }
 
 export async function getReleases({
-  compatibility,
+  constraints,
   lookupName,
   registryUrl,
 }: GetReleasesConfig): Promise<ReleaseResult | null> {
@@ -237,13 +237,13 @@ export async function getReleases({
   // not all simple indexes use this identifier, but most do
   if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {
     logger.trace({ lookupName, hostUrl }, 'Looking up pypi simple dependency');
-    return getSimpleDependency(lookupName, hostUrl, compatibility);
+    return getSimpleDependency(lookupName, hostUrl, constraints);
   }
 
   logger.trace({ lookupName, hostUrl }, 'Looking up pypi api dependency');
   try {
     // we need to resolve early here so we can catch any 404s and fallback to a simple lookup
-    const releases = await getDependency(lookupName, hostUrl, compatibility);
+    const releases = await getDependency(lookupName, hostUrl, constraints);
     // the dep was found in the json api, return as-is
     return releases;
   } catch (err) {
@@ -259,7 +259,7 @@ export async function getReleases({
     const releases = await getSimpleDependency(
       lookupName,
       hostUrl,
-      compatibility
+      constraints
     );
     return releases;
   }
diff --git a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
index 9ba6dcf644ae9d09da7d9e7fdbafdc5eb659e442..8119b8875c47f1f50856e96752d76daf42b7e95c 100644
--- a/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/artifacts.spec.ts.snap
@@ -47,7 +47,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker compatibility options 1`] = `
+exports[`bundler.updateArtifacts() Docker constraints options 1`] = `
 Array [
   Object {
     "file": Object {
@@ -58,7 +58,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker compatibility options 2`] = `
+exports[`bundler.updateArtifacts() Docker constraints options 2`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
@@ -142,7 +142,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker invalid compatibility options 1`] = `
+exports[`bundler.updateArtifacts() Docker invalid constraints options 1`] = `
 Array [
   Object {
     "file": Object {
@@ -153,7 +153,7 @@ Array [
 ]
 `;
 
-exports[`bundler.updateArtifacts() Docker invalid compatibility options 2`] = `
+exports[`bundler.updateArtifacts() Docker invalid constraints options 2`] = `
 Array [
   Object {
     "cmd": "docker pull renovate/ruby:latest",
diff --git a/lib/manager/bundler/__snapshots__/extract.spec.ts.snap b/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
index dff39673527fdb6a70c6f01702a20af0201615ca..8390b3f01ddf1eeae1a65b3d1f3e9b8a7722cdcf 100644
--- a/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/bundler/__snapshots__/extract.spec.ts.snap
@@ -2,7 +2,7 @@
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse Ruby CI Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "2.0.2",
   },
   "deps": Array [
@@ -151,7 +151,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse mastodon Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "ruby": ">= 2.4.0",
   },
   "deps": Array [
@@ -1387,7 +1387,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parse webpacker Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.3",
   },
   "deps": Array [
@@ -1448,7 +1448,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parses rails Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.2",
   },
   "deps": Array [
@@ -2146,7 +2146,7 @@ Object {
 
 exports[`lib/manager/bundler/extract extractPackageFile() parses sourceGroups 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "ruby": "~> 1.5.3",
   },
   "deps": Array [
@@ -2216,7 +2216,7 @@ Object {
 
 exports[`lib/manager/bundler/extract parse Gitlab Foss Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.17.3",
   },
   "deps": Array [
@@ -4722,7 +4722,7 @@ Object {
 
 exports[`lib/manager/bundler/extract parse source blocks with spaces in Gemfile 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "bundler": "1.16.6",
   },
   "deps": Array [
diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 6e6d9f3d8acb0c2d681f2fbb1cd11f18dfb07039..77770cc17a20bbb0d1d02d8c33815e5e2afb9899 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -150,7 +150,7 @@ describe('bundler.updateArtifacts()', () => {
       ).toMatchSnapshot();
       expect(execSnapshots).toMatchSnapshot();
     });
-    it('compatibility options', async () => {
+    it('constraints options', async () => {
       fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.writeLocalFile.mockResolvedValueOnce(null as never);
       datasource.getPkgReleases.mockResolvedValueOnce({
@@ -174,7 +174,7 @@ describe('bundler.updateArtifacts()', () => {
             ...config,
             binarySource: BinarySource.Docker,
             dockerUser: 'foobar',
-            compatibility: {
+            constraints: {
               ruby: '1.2.5',
               bundler: '3.2.1',
             },
@@ -183,7 +183,7 @@ describe('bundler.updateArtifacts()', () => {
       ).toMatchSnapshot();
       expect(execSnapshots).toMatchSnapshot();
     });
-    it('invalid compatibility options', async () => {
+    it('invalid constraints options', async () => {
       fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
       fs.writeLocalFile.mockResolvedValueOnce(null as never);
       datasource.getPkgReleases.mockResolvedValueOnce({
@@ -207,7 +207,7 @@ describe('bundler.updateArtifacts()', () => {
             ...config,
             binarySource: BinarySource.Docker,
             dockerUser: 'foobar',
-            compatibility: {
+            constraints: {
               ruby: 'foo',
               bundler: 'bar',
             },
diff --git a/lib/manager/bundler/artifacts.ts b/lib/manager/bundler/artifacts.ts
index c0d0bbd2281cfe05ecd8190c28c37bbc1ff01452..93d5443b4c211407908d576ab488ca40aba515a8 100644
--- a/lib/manager/bundler/artifacts.ts
+++ b/lib/manager/bundler/artifacts.ts
@@ -26,8 +26,8 @@ async function getRubyConstraint(
   updateArtifact: UpdateArtifact
 ): Promise<string> {
   const { packageFileName, config } = updateArtifact;
-  const { compatibility = {} } = config;
-  const { ruby } = compatibility;
+  const { constraints = {} } = config;
+  const { ruby } = constraints;
 
   let rubyConstraint: string;
   if (ruby) {
@@ -72,7 +72,7 @@ export async function updateArtifacts(
     newPackageFileContent,
     config,
   } = updateArtifact;
-  const { compatibility = {} } = config;
+  const { constraints = {} } = config;
   logger.debug(`bundler.updateArtifacts(${packageFileName})`);
   const existingError = memCache.get<string>('bundlerArtifactsError');
   // istanbul ignore if
@@ -103,7 +103,7 @@ export async function updateArtifacts(
     }
 
     let bundlerVersion = '';
-    const { bundler } = compatibility;
+    const { bundler } = constraints;
     if (bundler) {
       if (isValid(bundler)) {
         logger.debug({ bundlerVersion: bundler }, 'Found bundler version');
diff --git a/lib/manager/bundler/extract.ts b/lib/manager/bundler/extract.ts
index 4f5115b3156eae652970d13e2b4429a175e5a41a..1d9e4308ce08f3afeb9cf4e7c3b381b70fdfb6b8 100644
--- a/lib/manager/bundler/extract.ts
+++ b/lib/manager/bundler/extract.ts
@@ -36,7 +36,7 @@ export async function extractPackageFile(
         regEx(`^ruby ${delimiter}([^${delimiter}]+)${delimiter}`).exec(line);
     }
     if (rubyMatch) {
-      res.compatibility = { ruby: rubyMatch[1] };
+      res.constraints = { ruby: rubyMatch[1] };
     }
     const gemMatchRegex = /^\s*gem\s+(['"])(?<depName>[^'"]+)\1(\s*,\s*(?<currentValue>(['"])[^'"]+\5(\s*,\s*\5[^'"]+\5)?))?/;
     const gemMatch = gemMatchRegex.exec(line);
@@ -194,8 +194,8 @@ export async function extractPackageFile(
       }
       const bundledWith = /\nBUNDLED WITH\n\s+(.*?)(\n|$)/.exec(lockContent);
       if (bundledWith) {
-        res.compatibility = res.compatibility || {};
-        res.compatibility.bundler = bundledWith[1];
+        res.constraints = res.constraints || {};
+        res.constraints.bundler = bundledWith[1];
       }
     }
   }
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index 57f36f7453c781cb0c4e49ef918f1a3eb5650fba..654e79489835b6224c21e2f74e47d30a29be7a64 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -37,7 +37,7 @@ export interface CustomExtractConfig extends ExtractConfig {
 
 export interface UpdateArtifactsConfig extends ManagerConfig {
   isLockFileMaintenance?: boolean;
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   cacheDir?: string;
   composerIgnorePlatformReqs?: boolean;
   currentValue?: string;
@@ -77,7 +77,7 @@ export interface PackageFile<T = Record<string, any>>
     ManagerData<T> {
   hasYarnWorkspaces?: boolean;
   internalPackages?: string[]; // TODO: remove
-  compatibility?: Record<string, string>;
+  constraints?: Record<string, string>;
   datasource?: string;
   registryUrls?: string[];
   deps: PackageDependency[];
diff --git a/lib/manager/gomod/__snapshots__/extract.spec.ts.snap b/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
index 57882e72d9f366bca0e55463b2924692f885c69c..aef12d91e4e1402f54a8fdd25b91278dd8807973 100644
--- a/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gomod/__snapshots__/extract.spec.ts.snap
@@ -1,8 +1,8 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/manager/gomod/extract extractPackageFile() extracts compatibility 1`] = `
+exports[`lib/manager/gomod/extract extractPackageFile() extracts constraints 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "go": "1.13",
   },
   "deps": Array [
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 0f4c9f5ed0f50207c6cad98e947d384d96f7efdc..4bdc4e4ced6c522bd20370a20bb9e065aeffd92d 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -40,7 +40,7 @@ const config = {
   localDir: join('/tmp/github/some/repo'),
   cacheDir: join('/tmp/renovate/cache'),
   dockerUser: 'foobar',
-  compatibility: { go: '1.14' },
+  constraints: { go: '1.14' },
 };
 
 const goEnv = {
diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 0f4636ce942542aa5474f20dd5b04591c235ce81..3e82e6942aaf4fa6f3d27b79a0b47dac929c9071 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -68,7 +68,7 @@ export async function updateArtifacts({
       },
       docker: {
         image: 'renovate/go',
-        tagConstraint: config.compatibility?.go,
+        tagConstraint: config.constraints?.go,
         tagScheme: 'npm',
         volumes: [goPath],
         preCommands: getPreCommands(),
diff --git a/lib/manager/gomod/extract.spec.ts b/lib/manager/gomod/extract.spec.ts
index ae754c6cc188f4bd6aec3ba263c8759482d8e93c..cf9a944af617c24438c9878aff30f894a0a85084 100644
--- a/lib/manager/gomod/extract.spec.ts
+++ b/lib/manager/gomod/extract.spec.ts
@@ -17,10 +17,10 @@ describe('lib/manager/gomod/extract', () => {
       expect(res.filter((e) => e.skipReason)).toHaveLength(1);
       expect(res.filter((e) => e.depType === 'replace')).toHaveLength(1);
     });
-    it('extracts compatibility', () => {
+    it('extracts constraints', () => {
       const res = extractPackageFile(gomod3);
       expect(res).toMatchSnapshot();
-      expect(res.compatibility.go).toEqual('1.13');
+      expect(res.constraints.go).toEqual('1.13');
     });
     it('extracts multi-line requires', () => {
       const res = extractPackageFile(gomod2).deps;
diff --git a/lib/manager/gomod/extract.ts b/lib/manager/gomod/extract.ts
index 8e10d6e47b493bd58bbea02e242a9935c939dfea..1b7b33b0d0103421c7e7a82dfa501387968d6bc8 100644
--- a/lib/manager/gomod/extract.ts
+++ b/lib/manager/gomod/extract.ts
@@ -44,14 +44,14 @@ function getDep(
 
 export function extractPackageFile(content: string): PackageFile | null {
   logger.trace({ content }, 'gomod.extractPackageFile()');
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
   const deps: PackageDependency[] = [];
   try {
     const lines = content.split('\n');
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       let line = lines[lineNumber];
       if (line.startsWith('go ') && validRange(line.replace('go ', ''))) {
-        compatibility.go = line.replace('go ', '');
+        constraints.go = line.replace('go ', '');
       }
       const replaceMatch = /^replace\s+[^\s]+[\s]+[=][>]\s+([^\s]+)\s+([^\s]+)/.exec(
         line
@@ -90,5 +90,5 @@ export function extractPackageFile(content: string): PackageFile | null {
   if (!deps.length) {
     return null;
   }
-  return { compatibility, deps };
+  return { constraints, deps };
 }
diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 0561a3cab0035380ab8b0eb63f77f066cf06398f..ec3ed9ab2bbc88f349fc092a41240258af5c5ba2 100644
--- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -2,7 +2,7 @@
 
 exports[`manager/npm/extract .extractPackageFile() catches invalid names 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "depName": "kgabis/parson",
@@ -30,7 +30,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts engines 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": ">= 8.9.2",
     "npm": "^8.0.0",
     "pnpm": "^1.2.0",
@@ -146,7 +146,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts non-npmjs 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "github:owner/a",
@@ -308,7 +308,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts npm package alias 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "1",
@@ -356,7 +356,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts volta 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": "8.9.2",
   },
   "deps": Array [
@@ -421,7 +421,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() extracts volta yarn unknown-version 1`] = `
 Object {
-  "compatibility": Object {
+  "constraints": Object {
     "node": "8.9.2",
   },
   "deps": Array [
@@ -480,7 +480,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"npm" in lerna.json 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -615,7 +615,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"yarn" in lerna.json 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -750,7 +750,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds a lock file 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -885,7 +885,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds complex yarn workspaces 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [],
   "ignoreNpmrcFile": undefined,
   "lernaClient": "npm",
@@ -908,7 +908,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds lerna 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
@@ -1043,7 +1043,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [],
   "ignoreNpmrcFile": undefined,
   "lernaClient": "npm",
@@ -1066,7 +1066,7 @@ Object {
 
 exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "6.5.0",
diff --git a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
index 31c43a6bc787507c69fa33530a999e61791baeec..4223dc4e43b2d2a74a14759a44cef798b3aeaafc 100644
--- a/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
@@ -41,7 +41,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v1.22.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {},
+    "constraints": Object {},
     "deps": Array [
       Object {
         "currentValue": "1.0.0",
@@ -63,7 +63,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v2.1.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {
+    "constraints": Object {
       "yarn": ">= 2.0.0",
     },
     "deps": Array [
@@ -87,7 +87,7 @@ Array [
 exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v2.2.0 1`] = `
 Array [
   Object {
-    "compatibility": Object {
+    "constraints": Object {
       "yarn": ">= 2.2.0",
     },
     "deps": Array [
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 0532e1cb86dcfef0d60c166c19d0dd088bb9ec07..affab3ae1045f7711b4beeaa21716f0b9fa19677 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -151,7 +151,7 @@ export async function extractPackageFile(
     resolutions: 'resolutions',
   };
 
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
 
   function extractDependency(
     depType: string,
@@ -173,19 +173,19 @@ export async function extractPackageFile(
         dep.datasource = datasourceGithubTags.id;
         dep.lookupName = 'nodejs/node';
         dep.versioning = nodeVersioning.id;
-        compatibility.node = dep.currentValue;
+        constraints.node = dep.currentValue;
       } else if (depName === 'yarn') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'Yarn';
-        compatibility.yarn = dep.currentValue;
+        constraints.yarn = dep.currentValue;
       } else if (depName === 'npm') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'npm';
-        compatibility.npm = dep.currentValue;
+        constraints.npm = dep.currentValue;
       } else if (depName === 'pnpm') {
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'pnpm';
-        compatibility.pnpm = dep.currentValue;
+        constraints.pnpm = dep.currentValue;
       } else {
         dep.skipReason = SkipReason.UnknownEngines;
       }
@@ -363,7 +363,7 @@ export async function extractPackageFile(
     lernaPackages,
     skipInstalls,
     yarnWorkspacesPackages,
-    compatibility,
+    constraints,
   };
 }
 
diff --git a/lib/manager/npm/extract/locked-versions.spec.ts b/lib/manager/npm/extract/locked-versions.spec.ts
index 35de12dcc7c873ceaf91fa86ad64f150d78f0b84..90348d08b1d41e8e16a5002a9b8770ae4fc141b6 100644
--- a/lib/manager/npm/extract/locked-versions.spec.ts
+++ b/lib/manager/npm/extract/locked-versions.spec.ts
@@ -26,7 +26,7 @@ describe('manager/npm/extract/locked-versions', () => {
           {
             npmLock: 'package-lock.json',
             yarnLock: 'yarn.lock',
-            compatibility: {},
+            constraints: {},
             deps: [
               {
                 depName: 'a',
diff --git a/lib/manager/npm/extract/locked-versions.ts b/lib/manager/npm/extract/locked-versions.ts
index 622bd103d19a5eacc329d6b73c978f7c6d263315..a54dcb7de3d85efd34b159158479fb875ea56f72 100644
--- a/lib/manager/npm/extract/locked-versions.ts
+++ b/lib/manager/npm/extract/locked-versions.ts
@@ -21,9 +21,9 @@ export async function getLockedVersions(
       if (!isYarn1) {
         if (cacheVersion >= 6) {
           // https://github.com/yarnpkg/berry/commit/f753790380cbda5b55d028ea84b199445129f9ba
-          packageFile.compatibility.yarn = '>= 2.2.0';
+          packageFile.constraints.yarn = '>= 2.2.0';
         } else {
-          packageFile.compatibility.yarn = '>= 2.0.0';
+          packageFile.constraints.yarn = '>= 2.0.0';
         }
       }
       for (const dep of packageFile.deps) {
diff --git a/lib/manager/npm/post-update/lerna.spec.ts b/lib/manager/npm/post-update/lerna.spec.ts
index bd42333e0c8a9652601029375d4e75d5a6e2f7aa..ba8881a4084a9a1691cb5b763a295b93addf90f2 100644
--- a/lib/manager/npm/post-update/lerna.spec.ts
+++ b/lib/manager/npm/post-update/lerna.spec.ts
@@ -75,7 +75,7 @@ describe(getName(__filename), () => {
       const res = await lernaHelper.generateLockFiles(
         lernaPkgFile('yarn'),
         'some-dir',
-        { compatibility: { yarn: '^1.10.0' } },
+        { constraints: { yarn: '^1.10.0' } },
         {}
       );
       expect(execSnapshots).toMatchSnapshot();
@@ -99,7 +99,7 @@ describe(getName(__filename), () => {
         'some-dir',
         {
           dockerMapDotfiles: true,
-          compatibility: { npm: '^6.0.0' },
+          constraints: { npm: '^6.0.0' },
         },
         {}
       );
diff --git a/lib/manager/npm/post-update/lerna.ts b/lib/manager/npm/post-update/lerna.ts
index d467c95fdcf4c4bdfc752fd847a215f97f8c9551..a70dbd2fc08fc4133fbe1ebcdee0ee1c389f4733 100644
--- a/lib/manager/npm/post-update/lerna.ts
+++ b/lib/manager/npm/post-update/lerna.ts
@@ -45,7 +45,7 @@ export async function generateLockFiles(
   try {
     if (lernaClient === 'yarn') {
       let installYarn = 'npm i -g yarn';
-      const yarnCompatibility = config.compatibility?.yarn;
+      const yarnCompatibility = config.constraints?.yarn;
       if (validRange(yarnCompatibility)) {
         installYarn += `@${quote(yarnCompatibility)}`;
       }
@@ -56,7 +56,7 @@ export async function generateLockFiles(
       cmdOptions = '--ignore-scripts --ignore-engines --ignore-platform';
     } else if (lernaClient === 'npm') {
       let installNpm = 'npm i -g npm';
-      const npmCompatibility = config.compatibility?.npm;
+      const npmCompatibility = config.constraints?.npm;
       if (validRange(npmCompatibility)) {
         installNpm += `@${quote(npmCompatibility)}`;
         preCommands.push(installNpm);
diff --git a/lib/manager/npm/post-update/node-version.spec.ts b/lib/manager/npm/post-update/node-version.spec.ts
index 06622fec821d82f48d281e6f5e63a72d137ef76c..36702afb450e8d1c74338ed70a098a4cccb47037 100644
--- a/lib/manager/npm/post-update/node-version.spec.ts
+++ b/lib/manager/npm/post-update/node-version.spec.ts
@@ -6,7 +6,7 @@ jest.mock('../../../util/fs');
 describe('getNodeConstraint', () => {
   const config = {
     packageFile: 'package.json',
-    compatibility: { node: '^12.16.0' },
+    constraints: { node: '^12.16.0' },
   };
   it('returns package.json range', async () => {
     fs.readLocalFile = jest.fn();
@@ -39,7 +39,7 @@ describe('getNodeConstraint', () => {
     fs.readLocalFile = jest.fn();
     fs.readLocalFile.mockResolvedValueOnce(null);
     fs.readLocalFile.mockResolvedValueOnce(null);
-    const res = await getNodeConstraint({ ...config, compatibility: null });
+    const res = await getNodeConstraint({ ...config, constraints: null });
     expect(res).toBeNull();
   });
 });
diff --git a/lib/manager/npm/post-update/node-version.ts b/lib/manager/npm/post-update/node-version.ts
index c6391a6cd92f3474a0a0a082d983fa30f515c36e..adaf0dff9c9fdeadc0a349f46ddc16002de9309e 100644
--- a/lib/manager/npm/post-update/node-version.ts
+++ b/lib/manager/npm/post-update/node-version.ts
@@ -19,7 +19,7 @@ async function getNodeFile(filename: string): Promise<string> | null {
 }
 
 function getPackageJsonConstraint(config: PostUpdateConfig): string | null {
-  const constraint: string = config.compatibility?.node;
+  const constraint: string = config.constraints?.node;
   if (constraint && validRange(constraint)) {
     logger.debug(`Using node constraint "${constraint}" from package.json`);
     return constraint;
diff --git a/lib/manager/npm/post-update/npm.spec.ts b/lib/manager/npm/post-update/npm.spec.ts
index bac9acd302963b70659e7c770eb3936496a96074..ce9c65c025396303c2dc55caac410b41a6eecc3b 100644
--- a/lib/manager/npm/post-update/npm.spec.ts
+++ b/lib/manager/npm/post-update/npm.spec.ts
@@ -166,7 +166,7 @@ describe('generateLockFile', () => {
       'some-dir',
       {},
       'package-lock.json',
-      { binarySource: BinarySource.Docker, compatibility: { npm: '^6.0.0' } }
+      { binarySource: BinarySource.Docker, constraints: { npm: '^6.0.0' } }
     );
     expect(fs.readFile).toHaveBeenCalledTimes(1);
     expect(res.lockFile).toEqual('package-lock-contents');
diff --git a/lib/manager/npm/post-update/npm.ts b/lib/manager/npm/post-update/npm.ts
index 6e26b6471126a9dbbb8e87103b5ef53cded8313d..7e60bd0b4d313fa4a3ad21c6d27fdbb1d8db6a44 100644
--- a/lib/manager/npm/post-update/npm.ts
+++ b/lib/manager/npm/post-update/npm.ts
@@ -27,7 +27,7 @@ export async function generateLockFile(
   let lockFile = null;
   try {
     let installNpm = 'npm i -g npm';
-    const npmCompatibility = config.compatibility?.npm;
+    const npmCompatibility = config.constraints?.npm;
     if (validRange(npmCompatibility)) {
       installNpm += `@${quote(npmCompatibility)}`;
     }
diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts
index d79995ee8f9ce261dbb923d1a2f8b9780db2cf57..83026fd3373120fac7e1e20fad017846eae92c25 100644
--- a/lib/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/manager/npm/post-update/pnpm.spec.ts
@@ -20,7 +20,7 @@ delete process.env.NPM_CONFIG_CACHE;
 describe('generateLockFile', () => {
   let config: PostUpdateConfig;
   beforeEach(() => {
-    config = { cacheDir: 'some-cache-dir', compatibility: { pnpm: '^2.0.0' } };
+    config = { cacheDir: 'some-cache-dir', constraints: { pnpm: '^2.0.0' } };
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
   });
   it('generates lock files', async () => {
diff --git a/lib/manager/npm/post-update/pnpm.ts b/lib/manager/npm/post-update/pnpm.ts
index fce7c21ab57933ba9ffcc56856d12169c1904822..efcca417127338447e0e432d82bc8165be171c08 100644
--- a/lib/manager/npm/post-update/pnpm.ts
+++ b/lib/manager/npm/post-update/pnpm.ts
@@ -28,7 +28,7 @@ export async function generateLockFile(
   let cmd = 'pnpm';
   try {
     let installPnpm = 'npm i -g pnpm';
-    const pnpmCompatibility = config.compatibility?.pnpm;
+    const pnpmCompatibility = config.constraints?.pnpm;
     if (validRange(pnpmCompatibility)) {
       installPnpm += `@${quote(pnpmCompatibility)}`;
     }
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index 926b6c189ea68d2885a88e52e72cdcac4f4254cf..cb0e1ddc93cb9b721f76c4ec8d34a6c7b59f224a 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -49,7 +49,7 @@ describe(getName(__filename), () => {
       });
       const config = {
         dockerMapDotfiles: true,
-        compatibility: {
+        constraints: {
           yarn: yarnCompatibility,
         },
         postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'],
@@ -77,7 +77,7 @@ describe(getName(__filename), () => {
         );
       });
       const config = {
-        compatibility: {
+        constraints: {
           yarn: yarnVersion === '1.22.0' ? '^1.10.0' : '>= 2.0.0',
         },
       };
@@ -135,7 +135,7 @@ describe(getName(__filename), () => {
       });
       const config = {
         dockerMapDotfiles: true,
-        compatibility: {
+        constraints: {
           yarn: yarnCompatibility,
         },
         postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'],
diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts
index d91b73b70a563970eae2c852731ed774d42f23c7..addc60925fdc23acbb3a9b949f143dc62e3c6116 100644
--- a/lib/manager/npm/post-update/yarn.ts
+++ b/lib/manager/npm/post-update/yarn.ts
@@ -47,7 +47,7 @@ export async function generateLockFile(
   logger.debug(`Spawning yarn install to create ${lockFileName}`);
   let lockFile = null;
   try {
-    const yarnCompatibility = config.compatibility?.yarn;
+    const yarnCompatibility = config.constraints?.yarn;
     const minYarnVersion =
       validRange(yarnCompatibility) && minVersion(yarnCompatibility);
     const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index 40dd136d33856e692109505fab3b2a4f109c9270..95de3ddb70bd98fdb0c327ae50c3f8194fc96a5c 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -97,7 +97,7 @@ describe('.updateArtifacts()', () => {
         packageFileName: 'Pipfile',
         updatedDeps: [],
         newPackageFileContent: 'some new content',
-        config: { ...config, compatibility: { python: '3.7' } },
+        config: { ...config, constraints: { python: '3.7' } },
       })
     ).not.toBeNull();
     expect(execSnapshots).toMatchSnapshot();
diff --git a/lib/manager/pipenv/artifacts.ts b/lib/manager/pipenv/artifacts.ts
index f27b6f60014b28e1350091498127286e18b982af..3359e60288b441c8f7beb78be04f8070120e668f 100644
--- a/lib/manager/pipenv/artifacts.ts
+++ b/lib/manager/pipenv/artifacts.ts
@@ -17,8 +17,8 @@ function getPythonConstraint(
   existingLockFileContent: string,
   config: UpdateArtifactsConfig
 ): string | undefined | null {
-  const { compatibility = {} } = config;
-  const { python } = compatibility;
+  const { constraints = {} } = config;
+  const { python } = constraints;
 
   if (python) {
     logger.debug('Using python constraint from config');
diff --git a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
index 87bf69039f1dd4f2a3cb8fa269f7b3d0f3e4da3f..3b0748c87d72004041a8ba16c5849d8bc9b3a1c5 100644
--- a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
@@ -9,7 +9,7 @@ Array [
 
 exports[`lib/manager/poetry/extract extractPackageFile() extracts mixed versioning types 1`] = `
 Object {
-  "compatibility": Object {},
+  "constraints": Object {},
   "deps": Array [
     Object {
       "currentValue": "0.2",
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index 4021424b6c1eb0eadb59c562c99e44348c028b98..00d6fe4d770d6e1d4d26cc8fa9bbcfe228bf5097 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -151,7 +151,7 @@ describe('.updateArtifacts()', () => {
         newPackageFileContent: '{}',
         config: {
           ...config,
-          compatibility: { python: '~2.7 || ^3.4' },
+          constraints: { python: '~2.7 || ^3.4' },
         },
       })
     ).not.toBeNull();
@@ -180,7 +180,7 @@ describe('.updateArtifacts()', () => {
         newPackageFileContent: '{}',
         config: {
           ...config,
-          compatibility: { poetry: 'poetry>=1.0' },
+          constraints: { poetry: 'poetry>=1.0' },
         },
       })
     ).not.toBeNull();
diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 74e01674c3e17f3a5e8fbf5ebf3a7eaa32b0f36f..0b44638b1658e88b79e2981af1a094defc2d221f 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -21,8 +21,8 @@ function getPythonConstraint(
   existingLockFileContent: string,
   config: UpdateArtifactsConfig
 ): string | undefined | null {
-  const { compatibility = {} } = config;
-  const { python } = compatibility;
+  const { constraints = {} } = config;
+  const { python } = constraints;
 
   if (python) {
     logger.debug('Using python constraint from config');
@@ -120,7 +120,7 @@ export async function updateArtifacts({
       }
     }
     const tagConstraint = getPythonConstraint(existingLockFileContent, config);
-    const poetryRequirement = config.compatibility?.poetry || 'poetry';
+    const poetryRequirement = config.constraints?.poetry || 'poetry';
     const poetryInstall = 'pip install ' + quote(poetryRequirement);
     const extraEnv = getSourceCredentialVars(
       newPackageFileContent,
diff --git a/lib/manager/poetry/extract.spec.ts b/lib/manager/poetry/extract.spec.ts
index a9a2feca6e184ced656ffa34a8fb73c03d2183b0..f0b812696e0359ed77e9a52149f1a0d2cc76208f 100644
--- a/lib/manager/poetry/extract.spec.ts
+++ b/lib/manager/poetry/extract.spec.ts
@@ -62,7 +62,7 @@ describe('lib/manager/poetry/extract', () => {
       const res = extractPackageFile(pyproject1toml, filename);
       expect(res.deps).toMatchSnapshot();
       expect(res.deps).toHaveLength(9);
-      expect(res.compatibility).toEqual({
+      expect(res.constraints).toEqual({
         poetry: 'poetry>=1.0 wheel',
         python: '~2.7 || ^3.4',
       });
diff --git a/lib/manager/poetry/extract.ts b/lib/manager/poetry/extract.ts
index 917fd5285a1e49d25bf29a6b6276d5d7f4d9ab57..cc4ee05fd9c5db5019ea512645441c4204197614 100644
--- a/lib/manager/poetry/extract.ts
+++ b/lib/manager/poetry/extract.ts
@@ -112,22 +112,22 @@ export function extractPackageFile(
     return null;
   }
 
-  const compatibility: Record<string, any> = {};
+  const constraints: Record<string, any> = {};
 
   // https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
   if (
     pyprojectfile['build-system']?.['build-backend'] === 'poetry.masonry.api'
   ) {
-    compatibility.poetry = pyprojectfile['build-system']?.requires.join(' ');
+    constraints.poetry = pyprojectfile['build-system']?.requires.join(' ');
   }
 
   if (is.nonEmptyString(pyprojectfile.tool?.poetry?.dependencies?.python)) {
-    compatibility.python = pyprojectfile.tool?.poetry?.dependencies?.python;
+    constraints.python = pyprojectfile.tool?.poetry?.dependencies?.python;
   }
 
   return {
     deps,
     registryUrls: extractRegistries(pyprojectfile),
-    compatibility,
+    constraints,
   };
 }
diff --git a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
index d6d8b83fa14de3aabd04b44c0d9ee37bb396144b..2ea2cac14871439554ec43ef452e86657173d05c 100644
--- a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
+++ b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap
@@ -3,7 +3,7 @@
 exports[`workers/repository/extract/manager-files getManagerPackageFiles() returns files with extractAllPackageFiles 1`] = `
 Array [
   Object {
-    "compatibility": Object {},
+    "constraints": Object {},
     "deps": Array [
       Object {
         "currentValue": "2.0.0",
diff --git a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
index 67ad999a27939672ff8bfa97b72c5a3254d25b24..ca3db6457db8f12e4b2f43f53fd157eeb4ccfbc8 100644
--- a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
+++ b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
@@ -13,7 +13,7 @@ Object {
   "branchName": "some-branch",
   "canBeUnpublished": false,
   "commitMessage": "",
-  "compatibility": Object {},
+  "constraints": Object {},
   "depName": "some-dep",
   "dependencyDashboardApproval": false,
   "dependencyDashboardPrApproval": false,
@@ -74,7 +74,7 @@ Object {
 | ---------- | --------------- | ----- | ----- |
 | npm        | @types/some-dep | 0.5.7 | 0.5.8 |
 ",
-  "compatibility": Object {},
+  "constraints": Object {},
   "datasource": "npm",
   "depName": "some-dep",
   "dependencyDashboardApproval": false,
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index b176bdfddb2cab306d362b54ecbcc64a32815138..d6b94b835c5b7204037341f2a5d2797c3015a680 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -74,7 +74,7 @@ describe('workers/repository/updates/generate', () => {
           releaseTimestamp: '2017-02-07T20:01:41+00:00',
           canBeUnpublished: false,
           automerge: true,
-          compatibility: {
+          constraints: {
             foo: '1.0.0',
           },
         },
@@ -94,7 +94,7 @@ describe('workers/repository/updates/generate', () => {
           releaseTimestamp: '2017-02-06T20:01:41+00:00',
           canBeUnpublished: true,
           automerge: false,
-          compatibility: {
+          constraints: {
             foo: '1.0.0',
             bar: '2.0.0',
           },
@@ -123,7 +123,7 @@ describe('workers/repository/updates/generate', () => {
       expect(res.releaseTimestamp).toEqual('2017-02-07T20:01:41+00:00');
       expect(res.canBeUnpublished).toBe(true);
       expect(res.automerge).toBe(false);
-      expect(res.compatibility).toEqual({
+      expect(res.constraints).toEqual({
         foo: '1.0.0',
         bar: '2.0.0',
       });
diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts
index 59daac300aa76834a98cf9007287d9d82fdec338..22a51fe088901e0f7ad91b16222116178f1f5ae4 100644
--- a/lib/workers/repository/updates/generate.ts
+++ b/lib/workers/repository/updates/generate.ts
@@ -304,9 +304,9 @@ export function generateBranchConfig(
   config.blockedByPin = config.upgrades.every(
     (upgrade) => upgrade.blockedByPin
   );
-  config.compatibility = Object.assign(
+  config.constraints = Object.assign(
     {},
-    ...config.upgrades.map((upgrade) => upgrade.compatibility)
+    ...config.upgrades.map((upgrade) => upgrade.constraints)
   );
   const tableRows = config.upgrades
     .map((upgrade) => getTableValues(upgrade))