Repository: Redocly/redocly-cli
Pull request #923 (2022-11-04 13:07:02)

refactor: do not add the recommended ruleset fallback when there is a config
## What/Why/How?

Currently we provide the default fallback with the recommended ruleset if there's no extends explicitly set up in a Redocly config file or there's no config file at all.

We put a deprecation message some time ago, and now it's the highest time to finally change the approach: to extend with the default ruleset ONLY when there's no config provided.

~Also it would be great to remove the deprecated suggestions (like apiDefinitions &c.). -- DONE~

- [x] change default fallback behaviour
- [x] check configs for braking changes

## Reference

## Testing

## Screenshots (optional)

## Check yourself

- [x] Code is linted
- [x] Tested with redoc/reference-docs/workflows
- [x] All new/updated code is covered with tests

## Security

- [x] Security impact of change has been considered
- [x] Code follows company security practices and guidelines


github-actions[bot]: <!-- jest coverage report action for options with hash 3339ae53a38c44382c0fb4491bdb282d -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :--------- | :-------------: |
|                                                                           🟡                                                                           | Statements | 73.42%     |    3304/4500    |
|                                                                           🟡                                                                           | Branches   | 64.69%     |    1841/2846    |
|                                                                           🟡                                                                           | Functions  | 65.92%     |     559/848     |
|                                                                           🟡                                                                           | Lines      | 73.43%     |    3070/4181    |


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                               | Statements | Branches                                                       | Functions | Lines  |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------- | :--------- | :------------------------------------------------------------- | :-------- | :----- |
|                                                                           🟢                                                                           | <div title="core/src/config/config-resolvers.ts">`...` / config-resolvers.ts</div> | 84.46%     | <div title="Base coverage is: 76.01%">74.49% (-1.52% 🔻)</div> | 100%      | 85.21% |

</details>

## Test suite run success
509 tests passing in 84 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from 54fb476983ec51f1b2c1bb7cc62eeb94a2f57cfb</p>

adamaltman: # Migration guide

The migration guide applies to `1.0.0-beta.113` and newer.

If you have an explicit extends declaration in your Redocly configuration file, you can skip this guide.
```yaml
extends:
  - recommended
```

## No configuration file

If you do not have a Redocly configuration file, then the prior behavior for running the `lint` command is as follows:

- From the CLI: defaults to `recommended` configuration.
- From Redocly Workflows: defaults to `minimal` configuration.

### Actions to take

Create a [Redocly configuration file](https://redocly.com/docs/cli/configuration/) named `redocly.yaml` and place it in the root of your repo.

To use the `recommended` configuration, add this to your [Redocly configuration file](https://redocly.com/docs/cli/configuration/)
```yaml
extends:
  - recommended
```

To use the `minimal` configuration, add this to your [Redocly configuration file](https://redocly.com/docs/cli/configuration/):

```yaml
extends:
  - minimal
```

## Configuration file missing `extends`

If you have a Redocly configuration file, it is missing an explicit `extends` declaration that selects a default configuration.
The behavior prior to `1.0.0-beta.113` is as follows:

- From the CLI:  TODO
- From Redocly Workflows:  TODO

### Actions to take

To use the `recommended` configuration, add this to your [Redocly configuration file](https://redocly.com/docs/cli/configuration/)
```yaml
extends:
  - recommended
```

To use the `minimal` configuration, add this to your [Redocly configuration file](https://redocly.com/docs/cli/configuration/):

```yaml
extends:
  - minimal
```

Patch:
diff --git a/packages/cli/src/commands/bundle.ts b/packages/cli/src/commands/bundle.ts
index 9bd1c768..34d234a5 100644
--- a/packages/cli/src/commands/bundle.ts
+++ b/packages/cli/src/commands/bundle.ts
@@ -18,7 +18,7 @@ import {
 } from '../utils';
 import type { CommonOptions, OutputExtensions, Skips, Totals } from '../types';
 import { performance } from 'perf_hooks';
-import { blue, gray, green, red, yellow } from 'colorette';
+import { blue, gray, green, yellow } from 'colorette';
 import { writeFileSync } from 'fs';
 
 export type BundleOptions = CommonOptions &
@@ -55,11 +55,9 @@ export async function handleBundle(argv: BundleOptions, version: string) {
       if (argv.lint) {
         if (config.styleguide.recommendedFallback) {
           process.stderr.write(
-            `No configurations were defined in extends -- using built in ${blue(
+            `No configurations were provided -- using built in ${blue(
               'recommended'
-            )} configuration by default.\n${red(
-              'Warning! This default behavior is going to be deprecated soon.'
-            )}\n\n`
+            )} configuration by default.\n\n`
           );
         }
         const results = await lint({
diff --git a/packages/cli/src/commands/lint.ts b/packages/cli/src/commands/lint.ts
index 4aa5df1f..2f88a7b2 100644
--- a/packages/cli/src/commands/lint.ts
+++ b/packages/cli/src/commands/lint.ts
@@ -25,7 +25,7 @@ import {
   exitWithError,
 } from '../utils';
 import type { CommonOptions, Skips, Totals } from '../types';
-import { blue, gray, red } from 'colorette';
+import { blue, gray } from 'colorette';
 import { performance } from 'perf_hooks';
 
 export type LintOptions = CommonOptions &
@@ -65,11 +65,9 @@ export async function handleLint(argv: LintOptions, version: string) {
 
       if (styleguide.recommendedFallback) {
         process.stderr.write(
-          `No configurations were defined in extends -- using built in ${blue(
+          `No configurations were provided -- using built in ${blue(
             'recommended'
-          )} configuration by default.\n${red(
-            'Warning! This default behavior is going to be deprecated soon.'
-          )}\n\n`
+          )} configuration by default.\n\n`
         );
       }
       process.stderr.write(gray(`validating ${path.replace(process.cwd(), '')}...\n`));
diff --git a/packages/core/src/config/config-resolvers.ts b/packages/core/src/config/config-resolvers.ts
index b010e808..1312e03d 100644
--- a/packages/core/src/config/config-resolvers.ts
+++ b/packages/core/src/config/config-resolvers.ts
@@ -41,25 +41,15 @@ export async function resolveConfig(rawConfig: RawConfig, configPath?: string):
   }
 
   const resolver = new BaseResolver(getResolveConfig(rawConfig.resolve));
-  const configExtends = rawConfig?.styleguide?.extends ?? ['recommended'];
-  const recommendedFallback = !rawConfig?.styleguide?.extends;
-  const styleguideConfig = {
-    ...rawConfig?.styleguide,
-    extends: configExtends,
-    recommendedFallback,
-  };
 
   const apis = await resolveApis({
-    rawConfig: {
-      ...rawConfig,
-      styleguide: styleguideConfig,
-    },
+    rawConfig,
     configPath,
     resolver,
   });
 
   const styleguide = await resolveStyleguideConfig({
-    styleguideConfig,
+    styleguideConfig: rawConfig.styleguide,
     configPath,
     resolver,
   });
diff --git a/packages/core/src/config/load.ts b/packages/core/src/config/load.ts
index 2dd4c345..79c785ce 100644
--- a/packages/core/src/config/load.ts
+++ b/packages/core/src/config/load.ts
@@ -15,18 +15,21 @@ async function addConfigMetadata({
   customExtends,
   configPath,
   tokens,
+  files,
+  region,
 }: {
   rawConfig: RawConfig;
   customExtends?: string[];
   configPath?: string;
   tokens?: RegionalTokenWithValidity[];
+  files?: string[];
+  region?: Region;
 }): Promise<Config> {
   if (customExtends !== undefined) {
     rawConfig.styleguide = rawConfig.styleguide || {};
     rawConfig.styleguide.extends = customExtends;
   } else if (isEmptyObject(rawConfig)) {
-    // TODO: check if we can add recommended here. add message here?
-    // rawConfig.styleguide = { extends: ['recommended'], recommendedFallback: true };
+    rawConfig.styleguide = { extends: ['recommended'], recommendedFallback: true };
   }
 
   if (tokens?.length) {
@@ -58,7 +61,10 @@ async function addConfigMetadata({
     }
   }
 
-  return resolveConfig(rawConfig, configPath);
+  return resolveConfig(
+    { ...rawConfig, files: files ?? rawConfig.files, region: region ?? rawConfig.region },
+    configPath
+  );
 }
 
 export async function loadConfig(
@@ -71,8 +77,7 @@ export async function loadConfig(
   } = {}
 ): Promise<Config> {
   const { configPath = findConfig(), customExtends, processRawConfig, files, region } = options;
-  const config = await getConfig(configPath, processRawConfig);
-  const rawConfig = { ...config, files: files ?? config.files, region: region ?? config.region };
+  const rawConfig = await getConfig(configPath, processRawConfig);
 
   const redoclyClient = new RedoclyClient();
   const tokens = await redoclyClient.getTokens();
@@ -82,6 +87,8 @@ export async function loadConfig(
     customExtends,
     configPath,
     tokens,
+    files,
+    region,
   });
 }
 


Test patch:
diff --git a/__tests__/bundle/bundle-anchor/.redocly.yaml b/__tests__/bundle/bundle-anchor/.redocly.yaml
index 936a3d7d..569b57f4 100644
--- a/__tests__/bundle/bundle-anchor/.redocly.yaml
+++ b/__tests__/bundle/bundle-anchor/.redocly.yaml
@@ -1,7 +1,6 @@
 apis:
   main:
     root: ./test.yaml
-    extends: []
     rules:
       no-invalid-media-type-examples:
         severity: error
diff --git a/__tests__/bundle/bundle-anchor/snapshot.js b/__tests__/bundle/bundle-anchor/snapshot.js
index 4b864dc0..3443ded3 100644
--- a/__tests__/bundle/bundle-anchor/snapshot.js
+++ b/__tests__/bundle/bundle-anchor/snapshot.js
@@ -28,9 +28,6 @@ paths:
                 foo: TEST
 components: {}
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 Woohoo! Your OpenAPI definitions are valid. 🎉
 
 bundling ./test.yaml...
diff --git a/__tests__/bundle/bundle-description-dereferenced/.redocly.yaml b/__tests__/bundle/bundle-description-dereferenced/.redocly.yaml
index c417a283..34c09a08 100644
--- a/__tests__/bundle/bundle-description-dereferenced/.redocly.yaml
+++ b/__tests__/bundle/bundle-description-dereferenced/.redocly.yaml
@@ -1,3 +1,6 @@
 apis:
   main:
     root: ./test.yaml
+
+extends: 
+  - recommended
diff --git a/__tests__/bundle/bundle-description-dereferenced/snapshot.js b/__tests__/bundle/bundle-description-dereferenced/snapshot.js
index 2f80d3cf..64e2cf9f 100644
--- a/__tests__/bundle/bundle-description-dereferenced/snapshot.js
+++ b/__tests__/bundle/bundle-description-dereferenced/snapshot.js
@@ -36,9 +36,6 @@ components:
           $ref: '#/components/schemas/Name'
           description: Other name (specific).
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 test.yaml:
   1:1  error    spec  The field \`info\` must be present on this level.
 
diff --git a/__tests__/bundle/bundle-description-long/.redocly.yaml b/__tests__/bundle/bundle-description-long/.redocly.yaml
index c417a283..34c09a08 100644
--- a/__tests__/bundle/bundle-description-long/.redocly.yaml
+++ b/__tests__/bundle/bundle-description-long/.redocly.yaml
@@ -1,3 +1,6 @@
 apis:
   main:
     root: ./test.yaml
+
+extends: 
+  - recommended
diff --git a/__tests__/bundle/bundle-description-long/snapshot.js b/__tests__/bundle/bundle-description-long/snapshot.js
index 19445a3a..ab66703b 100644
--- a/__tests__/bundle/bundle-description-long/snapshot.js
+++ b/__tests__/bundle/bundle-description-long/snapshot.js
@@ -18,9 +18,6 @@ info:
     second line exists
 components: {}
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 test.yaml:
   1:1  error    no-empty-servers  Servers must be present.
 
diff --git a/__tests__/bundle/info-description-override-error/.redocly.yaml b/__tests__/bundle/info-description-override-error/.redocly.yaml
index 94dcf8dc..5830fa1c 100644
--- a/__tests__/bundle/info-description-override-error/.redocly.yaml
+++ b/__tests__/bundle/info-description-override-error/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 decorators:
   info-description-override:
     filePath: ./test.md
-extends: []
diff --git a/__tests__/bundle/info-description-override/.redocly.yaml b/__tests__/bundle/info-description-override/.redocly.yaml
index 94dcf8dc..5830fa1c 100644
--- a/__tests__/bundle/info-description-override/.redocly.yaml
+++ b/__tests__/bundle/info-description-override/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 decorators:
   info-description-override:
     filePath: ./test.md
-extends: []
diff --git a/__tests__/bundle/operation-description-override-error/.redocly.yaml b/__tests__/bundle/operation-description-override-error/.redocly.yaml
index c221030d..866029f4 100644
--- a/__tests__/bundle/operation-description-override-error/.redocly.yaml
+++ b/__tests__/bundle/operation-description-override-error/.redocly.yaml
@@ -6,4 +6,3 @@ decorators:
   operation-description-override:
     operationIds:
       updatePet: ./update-pet-operation-description.md
-extends: []
diff --git a/__tests__/bundle/operation-description-override/.redocly.yaml b/__tests__/bundle/operation-description-override/.redocly.yaml
index eeeaaa47..5dc5df36 100644
--- a/__tests__/bundle/operation-description-override/.redocly.yaml
+++ b/__tests__/bundle/operation-description-override/.redocly.yaml
@@ -7,4 +7,3 @@ decorators:
     operationIds:
       updatePet: ./update-pet-operation-description.md
       createUser: ./create-user-operation-description.md
-extends: []
diff --git a/__tests__/bundle/primitive-types/snapshot.js b/__tests__/bundle/primitive-types/snapshot.js
index 63945c6c..610ab058 100644
--- a/__tests__/bundle/primitive-types/snapshot.js
+++ b/__tests__/bundle/primitive-types/snapshot.js
@@ -40,9 +40,6 @@ paths:
                     key2: 2
 components: {}
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 Woohoo! Your OpenAPI definitions are valid. 🎉
 
 bundling ./openapi.yaml...
diff --git a/__tests__/bundle/tag-description-override-error/.redocly.yaml b/__tests__/bundle/tag-description-override-error/.redocly.yaml
index e2b892e0..d9ed40ea 100644
--- a/__tests__/bundle/tag-description-override-error/.redocly.yaml
+++ b/__tests__/bundle/tag-description-override-error/.redocly.yaml
@@ -6,4 +6,3 @@ decorators:
   tag-description-override:
     tagNames:
       pet: ./pet-tag-description.md
-extends: []
diff --git a/__tests__/bundle/tag-description-override/.redocly.yaml b/__tests__/bundle/tag-description-override/.redocly.yaml
index ae43f13e..6ff81063 100644
--- a/__tests__/bundle/tag-description-override/.redocly.yaml
+++ b/__tests__/bundle/tag-description-override/.redocly.yaml
@@ -7,4 +7,3 @@ decorators:
     tagNames:
       pet: ./pet-tag-description.md
       store: ./store-tag-description.md
-extends: []
diff --git a/__tests__/commands.test.ts b/__tests__/commands.test.ts
index b8ca6616..a0636d5c 100644
--- a/__tests__/commands.test.ts
+++ b/__tests__/commands.test.ts
@@ -30,6 +30,28 @@ describe('E2E', () => {
     }
   });
 
+  describe('zero-config', () => {
+    const folderPath = join(__dirname, 'zero-config');
+
+    it('default-recommended-fallback', () => {
+      const testPath = join(folderPath, 'default-recommended-fallback');
+      const args = getParams('../../../packages/cli/src/index.ts', 'lint', [
+        join(testPath, './openapi.yaml'),
+      ]);
+      const result = getCommandOutput(args, testPath);
+      (<any>expect(result)).toMatchSpecificSnapshot(join(testPath, 'snapshot.js'));
+    });
+
+    it('no-default-recommended-fallback', () => {
+      const testPath = join(folderPath, 'no-default-recommended-fallback');
+      const args = getParams('../../../packages/cli/src/index.ts', 'lint', [
+        join(testPath, './openapi.yaml'),
+      ]);
+      const result = getCommandOutput(args, testPath);
+      (<any>expect(result)).toMatchSpecificSnapshot(join(testPath, 'snapshot.js'));
+    });
+  });
+
   describe('lint-config', () => {
     const lintOptions: { dirName: string; option: string | null; format?: string }[] = [
       { dirName: 'invalid-config--lint-config-off', option: 'off' },
diff --git a/__tests__/lint-config/invalid-config--lint-config-error/snapshot.js b/__tests__/lint-config/invalid-config--lint-config-error/snapshot.js
index 5f0156c9..a627e56a 100644
--- a/__tests__/lint-config/invalid-config--lint-config-error/snapshot.js
+++ b/__tests__/lint-config/invalid-config--lint-config-error/snapshot.js
@@ -16,9 +16,6 @@ Error was generated by the configuration spec rule.
 
 
 ❌ Your config has 1 error.
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/valid-openapi.yaml...
 ../__fixtures__/valid-openapi.yaml: validated in <test>ms
 
diff --git a/__tests__/lint-config/invalid-config--lint-config-off/snapshot.js b/__tests__/lint-config/invalid-config--lint-config-off/snapshot.js
index 68f1de9a..ec832607 100644
--- a/__tests__/lint-config/invalid-config--lint-config-off/snapshot.js
+++ b/__tests__/lint-config/invalid-config--lint-config-off/snapshot.js
@@ -2,9 +2,6 @@
 
 exports[`E2E lint-config test with option: { dirName: 'invalid-config--lint-config-off', option: 'off' } 1`] = `
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/valid-openapi.yaml...
 ../__fixtures__/valid-openapi.yaml: validated in <test>ms
 
diff --git a/__tests__/lint-config/invalid-config--lint-config-warn/snapshot.js b/__tests__/lint-config/invalid-config--lint-config-warn/snapshot.js
index 887dbae2..182a3b7a 100644
--- a/__tests__/lint-config/invalid-config--lint-config-warn/snapshot.js
+++ b/__tests__/lint-config/invalid-config--lint-config-warn/snapshot.js
@@ -16,9 +16,6 @@ Warning was generated by the configuration spec rule.
 
 
 You have 1 warning.
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/valid-openapi.yaml...
 ../__fixtures__/valid-openapi.yaml: validated in <test>ms
 
diff --git a/__tests__/lint-config/invalid-config--no-option/snapshot.js b/__tests__/lint-config/invalid-config--no-option/snapshot.js
index 055d63b7..d436577d 100644
--- a/__tests__/lint-config/invalid-config--no-option/snapshot.js
+++ b/__tests__/lint-config/invalid-config--no-option/snapshot.js
@@ -16,9 +16,6 @@ Warning was generated by the configuration spec rule.
 
 
 You have 1 warning.
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/valid-openapi.yaml...
 ../__fixtures__/valid-openapi.yaml: validated in <test>ms
 
diff --git a/__tests__/lint-config/invalid-config-assertation-config-type/.redocly.yaml b/__tests__/lint-config/invalid-config-assertation-config-type/.redocly.yaml
index c8102def..b0eed68a 100644
--- a/__tests__/lint-config/invalid-config-assertation-config-type/.redocly.yaml
+++ b/__tests__/lint-config/invalid-config-assertation-config-type/.redocly.yaml
@@ -15,5 +15,3 @@ rules:
       property: property
     assertions:
       defined: true
-
-extends: []
diff --git a/__tests__/lint-config/invalid-config-assertation-name/.redocly.yaml b/__tests__/lint-config/invalid-config-assertation-name/.redocly.yaml
index 671ba6be..731ff4cc 100644
--- a/__tests__/lint-config/invalid-config-assertation-name/.redocly.yaml
+++ b/__tests__/lint-config/invalid-config-assertation-name/.redocly.yaml
@@ -7,5 +7,3 @@ rules:
     context:
       - type: PathItem
     subject: Operation
-
-extends: []
diff --git a/__tests__/lint-config/invalid-config-format-json/snapshot.js b/__tests__/lint-config/invalid-config-format-json/snapshot.js
index b251c0b4..1d39f93e 100644
--- a/__tests__/lint-config/invalid-config-format-json/snapshot.js
+++ b/__tests__/lint-config/invalid-config-format-json/snapshot.js
@@ -14,9 +14,6 @@ exports[`E2E lint-config test with option: {
   "version": "<version>",
   "problems": []
 }
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/valid-openapi.yaml...
 ../__fixtures__/valid-openapi.yaml: validated in <test>ms
 
diff --git a/__tests__/lint-config/invalid-definition-and-config/.redocly.yaml b/__tests__/lint-config/invalid-definition-and-config/.redocly.yaml
index 97c5577a..e411a299 100644
--- a/__tests__/lint-config/invalid-definition-and-config/.redocly.yaml
+++ b/__tests__/lint-config/invalid-definition-and-config/.redocly.yaml
@@ -4,3 +4,6 @@ apis:
 
 rules:
   context:
+
+extends: 
+  - recommended
diff --git a/__tests__/lint-config/invalid-definition-and-config/snapshot.js b/__tests__/lint-config/invalid-definition-and-config/snapshot.js
index 5f846d2d..4e7c0e7b 100644
--- a/__tests__/lint-config/invalid-definition-and-config/snapshot.js
+++ b/__tests__/lint-config/invalid-definition-and-config/snapshot.js
@@ -10,15 +10,13 @@ Property \`context\` is not expected here.
 4 | rules:
 5 |   context: null
   |   ^^^^^^^
-6 |
+6 | extends:
+7 |   - recommended
 
 Error was generated by the configuration spec rule.
 
 
 ❌ Your config has 1 error.
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating ../__fixtures__/invalid-openapi.yaml...
 [1] ../__fixtures__/invalid-openapi.yaml:4:1 at #/info
 
diff --git a/__tests__/lint-config/invalid-lint-config-severity/.redocly.yaml b/__tests__/lint-config/invalid-lint-config-severity/.redocly.yaml
index 85bdce7c..82eeb879 100644
--- a/__tests__/lint-config/invalid-lint-config-severity/.redocly.yaml
+++ b/__tests__/lint-config/invalid-lint-config-severity/.redocly.yaml
@@ -8,5 +8,3 @@ rules:
       type: Operation
     assertions:
       defined: true
-
-extends: []
diff --git a/__tests__/lint/assertions-camel-case-twice/.redocly.yaml b/__tests__/lint/assertions-camel-case-twice/.redocly.yaml
index 3546bbc5..ab39f30a 100644
--- a/__tests__/lint/assertions-camel-case-twice/.redocly.yaml
+++ b/__tests__/lint/assertions-camel-case-twice/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     severity: warn
     assertions:
       casing: camelCase
-
-extends: []
diff --git a/__tests__/lint/assertions-casing-camel-case-error/.redocly.yaml b/__tests__/lint/assertions-casing-camel-case-error/.redocly.yaml
index 2c99ff6a..843a39b9 100644
--- a/__tests__/lint/assertions-casing-camel-case-error/.redocly.yaml
+++ b/__tests__/lint/assertions-casing-camel-case-error/.redocly.yaml
@@ -28,5 +28,3 @@ rules:
     assertions:
       casing: camelCase
     message: Named Parameters should be camelCase
-
-extends: []
diff --git a/__tests__/lint/assertions-casing-kebab-case-error/.redocly.yaml b/__tests__/lint/assertions-casing-kebab-case-error/.redocly.yaml
index f2f6fad9..dd06f28b 100644
--- a/__tests__/lint/assertions-casing-kebab-case-error/.redocly.yaml
+++ b/__tests__/lint/assertions-casing-kebab-case-error/.redocly.yaml
@@ -19,5 +19,3 @@ rules:
     message: Operation id should be kebab-case
     assertions:
       casing: kebab-case
-
-extends: []
diff --git a/__tests__/lint/assertions-casing-pascal-case-error/.redocly.yaml b/__tests__/lint/assertions-casing-pascal-case-error/.redocly.yaml
index 5d1d216a..92fd1cbf 100644
--- a/__tests__/lint/assertions-casing-pascal-case-error/.redocly.yaml
+++ b/__tests__/lint/assertions-casing-pascal-case-error/.redocly.yaml
@@ -19,5 +19,3 @@ rules:
     message: Operation id should be PascalCase
     assertions:
       casing: PascalCase
-
-extends: []
diff --git a/__tests__/lint/assertions-casing-snake-case-error/.redocly.yaml b/__tests__/lint/assertions-casing-snake-case-error/.redocly.yaml
index 693de1cd..dfd45a7b 100644
--- a/__tests__/lint/assertions-casing-snake-case-error/.redocly.yaml
+++ b/__tests__/lint/assertions-casing-snake-case-error/.redocly.yaml
@@ -19,5 +19,3 @@ rules:
     message: Operation id should be snake_case
     assertions: 
       casing: snake_case
-
-extends: []
diff --git a/__tests__/lint/assertions-custom-function-options/.redocly.yaml b/__tests__/lint/assertions-custom-function-options/.redocly.yaml
index 3e614950..f73224eb 100644
--- a/__tests__/lint/assertions-custom-function-options/.redocly.yaml
+++ b/__tests__/lint/assertions-custom-function-options/.redocly.yaml
@@ -60,5 +60,3 @@ rules:
     assertions:
       defined: true
       const: integer
-    
-extends: []
diff --git a/__tests__/lint/assertions-defined-error/.redocly.yaml b/__tests__/lint/assertions-defined-error/.redocly.yaml
index 0627c2f0..7ffa1c2d 100644
--- a/__tests__/lint/assertions-defined-error/.redocly.yaml
+++ b/__tests__/lint/assertions-defined-error/.redocly.yaml
@@ -18,5 +18,3 @@ rules:
     message: Operation security should be defined
     assertions:
       defined: true
-
-extends: []
diff --git a/__tests__/lint/assertions-enum-error/.redocly.yaml b/__tests__/lint/assertions-enum-error/.redocly.yaml
index 8d78bb9d..7e673382 100644
--- a/__tests__/lint/assertions-enum-error/.redocly.yaml
+++ b/__tests__/lint/assertions-enum-error/.redocly.yaml
@@ -15,5 +15,3 @@ rules:
       enum:
       - test summary
       - test example
-
-extends: []
diff --git a/__tests__/lint/assertions-enum-on-keys-error/.redocly.yaml b/__tests__/lint/assertions-enum-on-keys-error/.redocly.yaml
index 11223393..2ac7031b 100644
--- a/__tests__/lint/assertions-enum-on-keys-error/.redocly.yaml
+++ b/__tests__/lint/assertions-enum-on-keys-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     assertions: 
       enum:
       - application/json
-
-extends: []
diff --git a/__tests__/lint/assertions-error/.redocly.yaml b/__tests__/lint/assertions-error/.redocly.yaml
index 244f2a6b..067ed824 100644
--- a/__tests__/lint/assertions-error/.redocly.yaml
+++ b/__tests__/lint/assertions-error/.redocly.yaml
@@ -2,8 +2,6 @@ apis:
   main:
     root: ./openapi.yaml
 
-extends: []
-
 rules:
   assert/tag-description-pattern:
     subject: 
diff --git a/__tests__/lint/assertions-map-types/.redocly.yaml b/__tests__/lint/assertions-map-types/.redocly.yaml
index b56ec8a5..4094b145 100644
--- a/__tests__/lint/assertions-map-types/.redocly.yaml
+++ b/__tests__/lint/assertions-map-types/.redocly.yaml
@@ -2,7 +2,6 @@ apis:
   main:
     root: ./openapi.yaml
 
-extends: []
 rules:
   assert/headerMap:
     subject: 
diff --git a/__tests__/lint/assertions-match-parent-keys/.redocly.yaml b/__tests__/lint/assertions-match-parent-keys/.redocly.yaml
index b0e7dda3..b95c7f1b 100644
--- a/__tests__/lint/assertions-match-parent-keys/.redocly.yaml
+++ b/__tests__/lint/assertions-match-parent-keys/.redocly.yaml
@@ -18,5 +18,3 @@ rules:
       property: x-test
     assertions:
       const: true
-
-extends: []
diff --git a/__tests__/lint/assertions-max-length-array-error/.redocly.yaml b/__tests__/lint/assertions-max-length-array-error/.redocly.yaml
index cbd5c10b..1e3e2e75 100644
--- a/__tests__/lint/assertions-max-length-array-error/.redocly.yaml
+++ b/__tests__/lint/assertions-max-length-array-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Operation tags should have maximum 2 items
     assertions:
       maxLength: 2
-
-extends: []
diff --git a/__tests__/lint/assertions-max-length-string-error/.redocly.yaml b/__tests__/lint/assertions-max-length-string-error/.redocly.yaml
index a3fd2b47..2af78291 100644
--- a/__tests__/lint/assertions-max-length-string-error/.redocly.yaml
+++ b/__tests__/lint/assertions-max-length-string-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Info description should be maximum 10 chars length
     assertions:
       maxLength: 10
-
-extends: []
diff --git a/__tests__/lint/assertions-min-length-array-error/.redocly.yaml b/__tests__/lint/assertions-min-length-array-error/.redocly.yaml
index a08dcb8b..b4012e2e 100644
--- a/__tests__/lint/assertions-min-length-array-error/.redocly.yaml
+++ b/__tests__/lint/assertions-min-length-array-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Operation tags should have minimum 4 items
     assertions: 
       minLength: 4
-
-extends: []
diff --git a/__tests__/lint/assertions-min-length-string-error/.redocly.yaml b/__tests__/lint/assertions-min-length-string-error/.redocly.yaml
index c171b4b5..be92fb2a 100644
--- a/__tests__/lint/assertions-min-length-string-error/.redocly.yaml
+++ b/__tests__/lint/assertions-min-length-string-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Info description should be minimum 20 chars length
     assertions: 
       minLength: 20
-
-extends: []
diff --git a/__tests__/lint/assertions-mutually-exclusive-error/.redocly.yaml b/__tests__/lint/assertions-mutually-exclusive-error/.redocly.yaml
index 0927c0a3..8b6aa06e 100644
--- a/__tests__/lint/assertions-mutually-exclusive-error/.redocly.yaml
+++ b/__tests__/lint/assertions-mutually-exclusive-error/.redocly.yaml
@@ -17,5 +17,3 @@ rules:
       mutuallyExclusive:
       - summary
       - tags
-
-extends: []
diff --git a/__tests__/lint/assertions-mutually-required-error/.redocly.yaml b/__tests__/lint/assertions-mutually-required-error/.redocly.yaml
index 8933e15e..b885641a 100644
--- a/__tests__/lint/assertions-mutually-required-error/.redocly.yaml
+++ b/__tests__/lint/assertions-mutually-required-error/.redocly.yaml
@@ -17,5 +17,3 @@ rules:
       mutuallyRequired:
       - summary
       - security
-
-extends: []
diff --git a/__tests__/lint/assertions-non-empty-error/.redocly.yaml b/__tests__/lint/assertions-non-empty-error/.redocly.yaml
index 651857e8..a4d226f0 100644
--- a/__tests__/lint/assertions-non-empty-error/.redocly.yaml
+++ b/__tests__/lint/assertions-non-empty-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Operation summary should not be empty
     assertions: 
       nonEmpty: true
-
-extends: []
diff --git a/__tests__/lint/assertions-non-empty-off/.redocly.yaml b/__tests__/lint/assertions-non-empty-off/.redocly.yaml
index 454132a7..5555aa62 100644
--- a/__tests__/lint/assertions-non-empty-off/.redocly.yaml
+++ b/__tests__/lint/assertions-non-empty-off/.redocly.yaml
@@ -11,5 +11,3 @@ rules:
     assertions: 
       nonEmpty: true
     severity: off
-
-extends: []
diff --git a/__tests__/lint/assertions-non-empty-warn/.redocly.yaml b/__tests__/lint/assertions-non-empty-warn/.redocly.yaml
index f3098420..c9ee7240 100644
--- a/__tests__/lint/assertions-non-empty-warn/.redocly.yaml
+++ b/__tests__/lint/assertions-non-empty-warn/.redocly.yaml
@@ -11,5 +11,3 @@ rules:
     assertions: 
       nonEmpty: true
     severity: warn
-
-extends: []
diff --git a/__tests__/lint/assertions-pattern-error/.redocly.yaml b/__tests__/lint/assertions-pattern-error/.redocly.yaml
index 4115759b..4bfa24bb 100644
--- a/__tests__/lint/assertions-pattern-error/.redocly.yaml
+++ b/__tests__/lint/assertions-pattern-error/.redocly.yaml
@@ -10,5 +10,3 @@ rules:
     message: Operation summary should have 'test' word
     assertions: 
       pattern: '/test/'
-
-extends: []
diff --git a/__tests__/lint/assertions-query-in-parameters/.redocly.yaml b/__tests__/lint/assertions-query-in-parameters/.redocly.yaml
index 789ade17..e0feff43 100644
--- a/__tests__/lint/assertions-query-in-parameters/.redocly.yaml
+++ b/__tests__/lint/assertions-query-in-parameters/.redocly.yaml
@@ -14,4 +14,3 @@ rules:
       property: in
     assertions: 
       const: path
-extends: []
\ No newline at end of file
diff --git a/__tests__/lint/assertions-ref-forbidden-error/.redocly.yaml b/__tests__/lint/assertions-ref-forbidden-error/.redocly.yaml
index 59533029..2b79cc1a 100644
--- a/__tests__/lint/assertions-ref-forbidden-error/.redocly.yaml
+++ b/__tests__/lint/assertions-ref-forbidden-error/.redocly.yaml
@@ -21,5 +21,3 @@ rules:
     message: PathItems should NOT should have a ref
     assertions: 
       ref: false
-
-extends: []
diff --git a/__tests__/lint/assertions-ref-pattern-error/.redocly.yaml b/__tests__/lint/assertions-ref-pattern-error/.redocly.yaml
index e2c93ac1..7d0de051 100644
--- a/__tests__/lint/assertions-ref-pattern-error/.redocly.yaml
+++ b/__tests__/lint/assertions-ref-pattern-error/.redocly.yaml
@@ -21,5 +21,3 @@ rules:
     message: PathItem should contain ref to components/paths folder
     assertions:
       ref: ^(\.\/)?components\/paths\/.*\.yaml$
-
-extends: []
diff --git a/__tests__/lint/assertions-ref-required-error/.redocly.yaml b/__tests__/lint/assertions-ref-required-error/.redocly.yaml
index 51c0ed1f..c3533baa 100644
--- a/__tests__/lint/assertions-ref-required-error/.redocly.yaml
+++ b/__tests__/lint/assertions-ref-required-error/.redocly.yaml
@@ -21,5 +21,3 @@ rules:
     message: PathItems should have refs
     assertions:
       ref: true
-
-extends: []
diff --git a/__tests__/lint/assertions-require-any-error/.redocly.yaml b/__tests__/lint/assertions-require-any-error/.redocly.yaml
index 8d5ab790..913fddd8 100644
--- a/__tests__/lint/assertions-require-any-error/.redocly.yaml
+++ b/__tests__/lint/assertions-require-any-error/.redocly.yaml
@@ -12,5 +12,3 @@ rules:
       requireAny:
       - description
       - externalDocs
-
-extends: []
diff --git a/__tests__/lint/assertions-show-suggestions/.redocly.yaml b/__tests__/lint/assertions-show-suggestions/.redocly.yaml
index e8d4ad30..0da35201 100644
--- a/__tests__/lint/assertions-show-suggestions/.redocly.yaml
+++ b/__tests__/lint/assertions-show-suggestions/.redocly.yaml
@@ -19,5 +19,3 @@ rules:
       - Suggestion 2
     assertions:
       minLength: 20
-
-extends: []
diff --git a/__tests__/lint/assertions-type-integer-in-parameter/.redocly.yaml b/__tests__/lint/assertions-type-integer-in-parameter/.redocly.yaml
index 952cd228..d3c83de7 100644
--- a/__tests__/lint/assertions-type-integer-in-parameter/.redocly.yaml
+++ b/__tests__/lint/assertions-type-integer-in-parameter/.redocly.yaml
@@ -17,4 +17,3 @@ rules:
     assertions:
       enum:
         - string
-extends: []
diff --git a/__tests__/lint/assertions-type-integer-in-schema-response/.redocly.yaml b/__tests__/lint/assertions-type-integer-in-schema-response/.redocly.yaml
index 7da7782b..5117abe9 100644
--- a/__tests__/lint/assertions-type-integer-in-schema-response/.redocly.yaml
+++ b/__tests__/lint/assertions-type-integer-in-schema-response/.redocly.yaml
@@ -26,5 +26,3 @@ rules:
       property: type
     assertions: 
       const: string
-
-extends: []
diff --git a/__tests__/lint/assertions-undefined-error/.redocly.yaml b/__tests__/lint/assertions-undefined-error/.redocly.yaml
index 40e3e44d..82a0c7e7 100644
--- a/__tests__/lint/assertions-undefined-error/.redocly.yaml
+++ b/__tests__/lint/assertions-undefined-error/.redocly.yaml
@@ -10,4 +10,3 @@ rules:
     message: Operation summary should be undefined
     assertions:
       defined: false
-extends: []
diff --git a/__tests__/lint/assertions/.redocly.yaml b/__tests__/lint/assertions/.redocly.yaml
index 6863566b..21c9687b 100644
--- a/__tests__/lint/assertions/.redocly.yaml
+++ b/__tests__/lint/assertions/.redocly.yaml
@@ -2,7 +2,6 @@ apis:
   main:
     root: ./openapi.yaml
 
-extends: []
 rules:
   assert/tag-description:
     subject:
diff --git a/__tests__/lint/deprecated-apiDefinitions/.redocly.yaml b/__tests__/lint/deprecated-apiDefinitions/.redocly.yaml
index 3ed8fdfb..b162e9f2 100644
--- a/__tests__/lint/deprecated-apiDefinitions/.redocly.yaml
+++ b/__tests__/lint/deprecated-apiDefinitions/.redocly.yaml
@@ -4,4 +4,3 @@ apiDefinitions:
 lint:
   rules:
     info-contact: warn
-  extends: []
diff --git a/__tests__/lint/deprecated-lint/.redocly.yaml b/__tests__/lint/deprecated-lint/.redocly.yaml
index aa5c400d..a79a8de8 100644
--- a/__tests__/lint/deprecated-lint/.redocly.yaml
+++ b/__tests__/lint/deprecated-lint/.redocly.yaml
@@ -8,4 +8,3 @@ apis:
 lint:
   rules:
     info-contact: warn
-  extends: []
\ No newline at end of file
diff --git a/__tests__/lint/deprecated-styleguide/.redocly.yaml b/__tests__/lint/deprecated-styleguide/.redocly.yaml
index e935b54a..98e5e6ae 100644
--- a/__tests__/lint/deprecated-styleguide/.redocly.yaml
+++ b/__tests__/lint/deprecated-styleguide/.redocly.yaml
@@ -8,4 +8,3 @@ apis:
 styleguide:
   rules:
     info-contact: warn
-  extends: []
\ No newline at end of file
diff --git a/__tests__/lint/info-contact--lint-in-apis/.redocly.yaml b/__tests__/lint/info-contact--lint-in-apis/.redocly.yaml
index 76ed7631..6078b0e2 100644
--- a/__tests__/lint/info-contact--lint-in-apis/.redocly.yaml
+++ b/__tests__/lint/info-contact--lint-in-apis/.redocly.yaml
@@ -3,4 +3,3 @@ apis:
     root: ./openapi.yaml
     rules:
       info-contact: warn
-    extends: []
diff --git a/__tests__/lint/info-contact-not-present-warning/.redocly.yaml b/__tests__/lint/info-contact-not-present-warning/.redocly.yaml
index a1268564..5f692c21 100644
--- a/__tests__/lint/info-contact-not-present-warning/.redocly.yaml
+++ b/__tests__/lint/info-contact-not-present-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-contact: warn
-extends: []
diff --git a/__tests__/lint/info-contact/.redocly.yaml b/__tests__/lint/info-contact/.redocly.yaml
index a1268564..5f692c21 100644
--- a/__tests__/lint/info-contact/.redocly.yaml
+++ b/__tests__/lint/info-contact/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-contact: warn
-extends: []
diff --git a/__tests__/lint/info-license-rule-not-present-warning/.redocly.yaml b/__tests__/lint/info-license-rule-not-present-warning/.redocly.yaml
index f1e6155e..3de053d0 100644
--- a/__tests__/lint/info-license-rule-not-present-warning/.redocly.yaml
+++ b/__tests__/lint/info-license-rule-not-present-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-license: warn
-extends: []
diff --git a/__tests__/lint/info-license-rule/.redocly.yaml b/__tests__/lint/info-license-rule/.redocly.yaml
index f1e6155e..3de053d0 100644
--- a/__tests__/lint/info-license-rule/.redocly.yaml
+++ b/__tests__/lint/info-license-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-license: warn
-extends: []
diff --git a/__tests__/lint/info-license-url-missing-warning/.redocly.yaml b/__tests__/lint/info-license-url-missing-warning/.redocly.yaml
index e28e7fd3..3cec8468 100644
--- a/__tests__/lint/info-license-url-missing-warning/.redocly.yaml
+++ b/__tests__/lint/info-license-url-missing-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-license-url: warn
-extends: []
diff --git a/__tests__/lint/info-license-url-rule/.redocly.yaml b/__tests__/lint/info-license-url-rule/.redocly.yaml
index e28e7fd3..3cec8468 100644
--- a/__tests__/lint/info-license-url-rule/.redocly.yaml
+++ b/__tests__/lint/info-license-url-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-license-url: warn
-extends: []
diff --git a/__tests__/lint/merge-lint-configs/.redocly.yaml b/__tests__/lint/merge-lint-configs/.redocly.yaml
index 28d4daac..923ac266 100644
--- a/__tests__/lint/merge-lint-configs/.redocly.yaml
+++ b/__tests__/lint/merge-lint-configs/.redocly.yaml
@@ -6,4 +6,3 @@ apis:
 
 rules:
   info-contact: error
-extends: []
diff --git a/__tests__/lint/nested-extends/.redocly.yaml b/__tests__/lint/nested-extends/.redocly.yaml
new file mode 100644
index 00000000..fb713a6c
--- /dev/null
+++ b/__tests__/lint/nested-extends/.redocly.yaml
@@ -0,0 +1,8 @@
+apis:
+  main:
+    root: ./openapi.yaml
+    extends: 
+    - ./nested-config.yaml
+    rules:
+      info-contact: warn
+      operation-4xx-response: off
diff --git a/__tests__/lint/nested-extends/nested-config.yaml b/__tests__/lint/nested-extends/nested-config.yaml
new file mode 100644
index 00000000..49cca9a0
--- /dev/null
+++ b/__tests__/lint/nested-extends/nested-config.yaml
@@ -0,0 +1,4 @@
+rules:
+  info-contact: error
+  path-parameters-defined: error
+  operation-4xx-response: error
diff --git a/__tests__/lint/nested-extends/openapi.yaml b/__tests__/lint/nested-extends/openapi.yaml
new file mode 100644
index 00000000..c0ecfd56
--- /dev/null
+++ b/__tests__/lint/nested-extends/openapi.yaml
@@ -0,0 +1,20 @@
+openapi: 3.1.0
+info:
+  title: Example OpenAPI 3 definition.
+  version: 1.0.0
+
+paths:
+  '/ping/{id}/{test}':
+    get:
+      summary: example summary
+      operationId: getPingTestById
+      parameters:
+        - in: path
+          name: test_id
+          description: User id
+          required: true
+          schema:
+            type: string
+      responses:
+        '200':
+          description: example description
diff --git a/__tests__/lint/nested-extends/snapshot.js b/__tests__/lint/nested-extends/snapshot.js
new file mode 100644
index 00000000..7b8410c7
--- /dev/null
+++ b/__tests__/lint/nested-extends/snapshot.js
@@ -0,0 +1,67 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`E2E lint nested-extends 1`] = `
+
+validating /openapi.yaml...
+[1] openapi.yaml:13:17 at #/paths/~1ping~1{id}~1{test}/get/parameters/0/name
+
+Path parameter \`test_id\` is not used in the path \`/ping/{id}/{test}\`.
+
+11 | parameters:
+12 |   - in: path
+13 |     name: test_id
+   |           ^^^^^^^
+14 |     description: User id
+15 |     required: true
+
+Error was generated by the path-parameters-defined rule.
+
+
+[2] openapi.yaml:11:7 at #/paths/~1ping~1{id}~1{test}/get/parameters
+
+The operation does not define the path parameter \`{id}\` expected by path \`/ping/{id}/{test}\`.
+
+ 9 | summary: example summary
+10 | operationId: getPingTestById
+11 | parameters:
+   | ^^^^^^^^^^
+12 |   - in: path
+13 |     name: test_id
+
+Error was generated by the path-parameters-defined rule.
+
+
+[3] openapi.yaml:11:7 at #/paths/~1ping~1{id}~1{test}/get/parameters
+
+The operation does not define the path parameter \`{test}\` expected by path \`/ping/{id}/{test}\`.
+
+ 9 | summary: example summary
+10 | operationId: getPingTestById
+11 | parameters:
+   | ^^^^^^^^^^
+12 |   - in: path
+13 |     name: test_id
+
+Error was generated by the path-parameters-defined rule.
+
+
+[4] openapi.yaml:2:1 at #/info/contact
+
+Info object should contain \`contact\` field.
+
+1 | openapi: 3.1.0
+2 | info:
+  | ^^^^
+3 |   title: Example OpenAPI 3 definition.
+4 |   version: 1.0.0
+
+Warning was generated by the info-contact rule.
+
+
+/openapi.yaml: validated in <test>ms
+
+❌ Validation failed with 3 errors and 1 warning.
+run \`openapi lint --generate-ignore-file\` to add all problems to the ignore file.
+
+
+`;
diff --git a/__tests__/lint/no-empty-servers-rule/.redocly.yaml b/__tests__/lint/no-empty-servers-rule/.redocly.yaml
index fce711ff..201fc430 100644
--- a/__tests__/lint/no-empty-servers-rule/.redocly.yaml
+++ b/__tests__/lint/no-empty-servers-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-empty-servers: warn
-extends: []
diff --git a/__tests__/lint/no-empty-servers-warning/.redocly.yaml b/__tests__/lint/no-empty-servers-warning/.redocly.yaml
index fce711ff..201fc430 100644
--- a/__tests__/lint/no-empty-servers-warning/.redocly.yaml
+++ b/__tests__/lint/no-empty-servers-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-empty-servers: warn
-extends: []
diff --git a/__tests__/lint/no-enum-type-mismatch-error/.redocly.yaml b/__tests__/lint/no-enum-type-mismatch-error/.redocly.yaml
index 56ee5b28..771358fa 100644
--- a/__tests__/lint/no-enum-type-mismatch-error/.redocly.yaml
+++ b/__tests__/lint/no-enum-type-mismatch-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-enum-type-mismatch: error
-extends: []
diff --git a/__tests__/lint/no-enum-type-mismatch/.redocly.yaml b/__tests__/lint/no-enum-type-mismatch/.redocly.yaml
index 56ee5b28..771358fa 100644
--- a/__tests__/lint/no-enum-type-mismatch/.redocly.yaml
+++ b/__tests__/lint/no-enum-type-mismatch/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-enum-type-mismatch: error
-extends: []
diff --git a/__tests__/lint/no-http-verbs-in-paths-error/.redocly.yaml b/__tests__/lint/no-http-verbs-in-paths-error/.redocly.yaml
index c406a61d..4d2beb13 100644
--- a/__tests__/lint/no-http-verbs-in-paths-error/.redocly.yaml
+++ b/__tests__/lint/no-http-verbs-in-paths-error/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 rules:
   no-http-verbs-in-paths:
     severity: error
-extends: []
diff --git a/__tests__/lint/no-http-verbs-in-paths-split-words-error/.redocly.yaml b/__tests__/lint/no-http-verbs-in-paths-split-words-error/.redocly.yaml
index 6f1d0d7a..f54d809d 100644
--- a/__tests__/lint/no-http-verbs-in-paths-split-words-error/.redocly.yaml
+++ b/__tests__/lint/no-http-verbs-in-paths-split-words-error/.redocly.yaml
@@ -6,4 +6,3 @@ rules:
   no-http-verbs-in-paths:
     severity: error
     splitIntoWords: true
-extends: []
diff --git a/__tests__/lint/no-invalid-media-type-examples/.redocly.yaml b/__tests__/lint/no-invalid-media-type-examples/.redocly.yaml
index 77796510..3516cbec 100644
--- a/__tests__/lint/no-invalid-media-type-examples/.redocly.yaml
+++ b/__tests__/lint/no-invalid-media-type-examples/.redocly.yaml
@@ -2,6 +2,5 @@ apis:
   main:
     root: ./openapi.yaml
 
-extends: []
 rules:
   no-invalid-media-type-examples: error
diff --git a/__tests__/lint/no-invalid-schema-examples-array-error/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples-array-error/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples-array-error/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples-array-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-invalid-schema-examples-nested-error/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples-nested-error/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples-nested-error/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples-nested-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-invalid-schema-examples-oas3.1-error/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples-oas3.1-error/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples-oas3.1-error/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples-oas3.1-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-invalid-schema-examples-oas3.1/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples-oas3.1/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples-oas3.1/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples-oas3.1/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-invalid-schema-examples-string-number-error/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples-string-number-error/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples-string-number-error/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples-string-number-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-invalid-schema-examples/.redocly.yaml b/__tests__/lint/no-invalid-schema-examples/.redocly.yaml
index c4297a19..325d5760 100644
--- a/__tests__/lint/no-invalid-schema-examples/.redocly.yaml
+++ b/__tests__/lint/no-invalid-schema-examples/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-invalid-schema-examples: error
-extends: []
diff --git a/__tests__/lint/no-path-trailing-slash-error/.redocly.yaml b/__tests__/lint/no-path-trailing-slash-error/.redocly.yaml
index 37ff2af7..779b8b05 100644
--- a/__tests__/lint/no-path-trailing-slash-error/.redocly.yaml
+++ b/__tests__/lint/no-path-trailing-slash-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-path-trailing-slash: error
-extends: []
diff --git a/__tests__/lint/no-path-trailing-slash-off/.redocly.yaml b/__tests__/lint/no-path-trailing-slash-off/.redocly.yaml
index d4689a95..bc2a2c4d 100644
--- a/__tests__/lint/no-path-trailing-slash-off/.redocly.yaml
+++ b/__tests__/lint/no-path-trailing-slash-off/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 rules:
   no-path-trailing-slash: off
   paths-kebab-case: error
-extends: []
diff --git a/__tests__/lint/no-path-trailing-slash-rule/.redocly.yaml b/__tests__/lint/no-path-trailing-slash-rule/.redocly.yaml
index 37ff2af7..779b8b05 100644
--- a/__tests__/lint/no-path-trailing-slash-rule/.redocly.yaml
+++ b/__tests__/lint/no-path-trailing-slash-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-path-trailing-slash: error
-extends: []
diff --git a/__tests__/lint/no-server-example-rule/.redocly.yaml b/__tests__/lint/no-server-example-rule/.redocly.yaml
index 7cdd6e10..d90e327c 100644
--- a/__tests__/lint/no-server-example-rule/.redocly.yaml
+++ b/__tests__/lint/no-server-example-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-server-example.com: warn
-extends: []
diff --git a/__tests__/lint/no-server-trailing-slash-error/.redocly.yaml b/__tests__/lint/no-server-trailing-slash-error/.redocly.yaml
index 9148e20b..c7839dfe 100644
--- a/__tests__/lint/no-server-trailing-slash-error/.redocly.yaml
+++ b/__tests__/lint/no-server-trailing-slash-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-server-trailing-slash: error
-extends: []
diff --git a/__tests__/lint/no-server-trailing-slash-rule/.redocly.yaml b/__tests__/lint/no-server-trailing-slash-rule/.redocly.yaml
index 9148e20b..c7839dfe 100644
--- a/__tests__/lint/no-server-trailing-slash-rule/.redocly.yaml
+++ b/__tests__/lint/no-server-trailing-slash-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-server-trailing-slash: error
-extends: []
diff --git a/__tests__/lint/no-server-variables-empty-enum-errror/.redocly.yaml b/__tests__/lint/no-server-variables-empty-enum-errror/.redocly.yaml
index 1bcf1742..9917d631 100644
--- a/__tests__/lint/no-server-variables-empty-enum-errror/.redocly.yaml
+++ b/__tests__/lint/no-server-variables-empty-enum-errror/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-server-variables-empty-enum: error
-extends: []
diff --git a/__tests__/lint/no-server-variables-empty-enum/.redocly.yaml b/__tests__/lint/no-server-variables-empty-enum/.redocly.yaml
index 1bcf1742..9917d631 100644
--- a/__tests__/lint/no-server-variables-empty-enum/.redocly.yaml
+++ b/__tests__/lint/no-server-variables-empty-enum/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-server-variables-empty-enum: error
-extends: []
diff --git a/__tests__/lint/no-unresolved-refs-error/.redocly.yaml b/__tests__/lint/no-unresolved-refs-error/.redocly.yaml
index d53df931..d171cd8b 100644
--- a/__tests__/lint/no-unresolved-refs-error/.redocly.yaml
+++ b/__tests__/lint/no-unresolved-refs-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-unresolved-refs: error
-extends: []
diff --git a/__tests__/lint/no-unresolved-refs-rule/.redocly.yaml b/__tests__/lint/no-unresolved-refs-rule/.redocly.yaml
index d53df931..d171cd8b 100644
--- a/__tests__/lint/no-unresolved-refs-rule/.redocly.yaml
+++ b/__tests__/lint/no-unresolved-refs-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-unresolved-refs: error
-extends: []
diff --git a/__tests__/lint/no-unused-components-rule/.redocly.yaml b/__tests__/lint/no-unused-components-rule/.redocly.yaml
index 6a71e6cc..1c73aba2 100644
--- a/__tests__/lint/no-unused-components-rule/.redocly.yaml
+++ b/__tests__/lint/no-unused-components-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-unused-components: warn
-extends: []
diff --git a/__tests__/lint/no-unused-components-warning/.redocly.yaml b/__tests__/lint/no-unused-components-warning/.redocly.yaml
index 6a71e6cc..1c73aba2 100644
--- a/__tests__/lint/no-unused-components-warning/.redocly.yaml
+++ b/__tests__/lint/no-unused-components-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   no-unused-components: warn
-extends: []
diff --git a/__tests__/lint/operation-2xx-response-rule/.redocly.yaml b/__tests__/lint/operation-2xx-response-rule/.redocly.yaml
index cdd18670..bbe59796 100644
--- a/__tests__/lint/operation-2xx-response-rule/.redocly.yaml
+++ b/__tests__/lint/operation-2xx-response-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-2xx-response: warn
-extends: []
diff --git a/__tests__/lint/operation-2xx-response-warning/.redocly.yaml b/__tests__/lint/operation-2xx-response-warning/.redocly.yaml
index cdd18670..bbe59796 100644
--- a/__tests__/lint/operation-2xx-response-warning/.redocly.yaml
+++ b/__tests__/lint/operation-2xx-response-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-2xx-response: warn
-extends: []
diff --git a/__tests__/lint/operation-4xx-problem-details-rfc7807/.redocly.yaml b/__tests__/lint/operation-4xx-problem-details-rfc7807/.redocly.yaml
index 37bfdc34..727c3f5b 100644
--- a/__tests__/lint/operation-4xx-problem-details-rfc7807/.redocly.yaml
+++ b/__tests__/lint/operation-4xx-problem-details-rfc7807/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-4xx-problem-details-rfc7807: error
-extends: []
diff --git a/__tests__/lint/operation-4xx-response-rule/.redocly.yaml b/__tests__/lint/operation-4xx-response-rule/.redocly.yaml
index a14c35dd..c4829572 100644
--- a/__tests__/lint/operation-4xx-response-rule/.redocly.yaml
+++ b/__tests__/lint/operation-4xx-response-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-4xx-response: warn
-extends: []
diff --git a/__tests__/lint/operation-4xx-response-warning/.redocly.yaml b/__tests__/lint/operation-4xx-response-warning/.redocly.yaml
index a14c35dd..c4829572 100644
--- a/__tests__/lint/operation-4xx-response-warning/.redocly.yaml
+++ b/__tests__/lint/operation-4xx-response-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-4xx-response: warn
-extends: []
diff --git a/__tests__/lint/operation-description-rule/.redocly.yaml b/__tests__/lint/operation-description-rule/.redocly.yaml
index b4ff548a..e8570fb7 100644
--- a/__tests__/lint/operation-description-rule/.redocly.yaml
+++ b/__tests__/lint/operation-description-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-description: warn
-extends: []
diff --git a/__tests__/lint/operation-description-warning/.redocly.yaml b/__tests__/lint/operation-description-warning/.redocly.yaml
index b4ff548a..e8570fb7 100644
--- a/__tests__/lint/operation-description-warning/.redocly.yaml
+++ b/__tests__/lint/operation-description-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-description: warn
-extends: []
diff --git a/__tests__/lint/operation-operationId-unique-error/.redocly.yaml b/__tests__/lint/operation-operationId-unique-error/.redocly.yaml
index 163a7f0e..6882d9fe 100644
--- a/__tests__/lint/operation-operationId-unique-error/.redocly.yaml
+++ b/__tests__/lint/operation-operationId-unique-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-operationId-unique: error
-extends: []
diff --git a/__tests__/lint/operation-operationId-unique-rule/.redocly.yaml b/__tests__/lint/operation-operationId-unique-rule/.redocly.yaml
index 163a7f0e..6882d9fe 100644
--- a/__tests__/lint/operation-operationId-unique-rule/.redocly.yaml
+++ b/__tests__/lint/operation-operationId-unique-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-operationId-unique: error
-extends: []
diff --git a/__tests__/lint/operation-parameters-unique-rule/.redocly.yaml b/__tests__/lint/operation-parameters-unique-rule/.redocly.yaml
index d2ec08d5..0f7f7a7d 100644
--- a/__tests__/lint/operation-parameters-unique-rule/.redocly.yaml
+++ b/__tests__/lint/operation-parameters-unique-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-parameters-unique: error
-extends: []
diff --git a/__tests__/lint/operation-security-defined-rule/.redocly.yaml b/__tests__/lint/operation-security-defined-rule/.redocly.yaml
index 9cc50378..876da33f 100644
--- a/__tests__/lint/operation-security-defined-rule/.redocly.yaml
+++ b/__tests__/lint/operation-security-defined-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   security-defined: warn
-extends: []
diff --git a/__tests__/lint/operation-security-defined-warning/.redocly.yaml b/__tests__/lint/operation-security-defined-warning/.redocly.yaml
index 9cc50378..876da33f 100644
--- a/__tests__/lint/operation-security-defined-warning/.redocly.yaml
+++ b/__tests__/lint/operation-security-defined-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   security-defined: warn
-extends: []
diff --git a/__tests__/lint/operation-tag-defined-rule/.redocly.yaml b/__tests__/lint/operation-tag-defined-rule/.redocly.yaml
index 5b1a2777..ada00ebc 100644
--- a/__tests__/lint/operation-tag-defined-rule/.redocly.yaml
+++ b/__tests__/lint/operation-tag-defined-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   operation-tag-defined: warn
-extends: []
diff --git a/__tests__/lint/parameter-description-rule/.redocly.yaml b/__tests__/lint/parameter-description-rule/.redocly.yaml
index 3a769c16..dddd2945 100644
--- a/__tests__/lint/parameter-description-rule/.redocly.yaml
+++ b/__tests__/lint/parameter-description-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   parameter-description: warn
-extends: []
diff --git a/__tests__/lint/parameter-description-warning/.redocly.yaml b/__tests__/lint/parameter-description-warning/.redocly.yaml
index 3a769c16..dddd2945 100644
--- a/__tests__/lint/parameter-description-warning/.redocly.yaml
+++ b/__tests__/lint/parameter-description-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   parameter-description: warn
-extends: []
diff --git a/__tests__/lint/path-declaration-must-exist-error/.redocly.yaml b/__tests__/lint/path-declaration-must-exist-error/.redocly.yaml
index f595ae32..1c3ba629 100644
--- a/__tests__/lint/path-declaration-must-exist-error/.redocly.yaml
+++ b/__tests__/lint/path-declaration-must-exist-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-declaration-must-exist: error
-extends: []
diff --git a/__tests__/lint/path-declaration-must-exist-rule/.redocly.yaml b/__tests__/lint/path-declaration-must-exist-rule/.redocly.yaml
index f595ae32..1c3ba629 100644
--- a/__tests__/lint/path-declaration-must-exist-rule/.redocly.yaml
+++ b/__tests__/lint/path-declaration-must-exist-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-declaration-must-exist: error
-extends: []
diff --git a/__tests__/lint/path-excludes-patterns/.redocly.yaml b/__tests__/lint/path-excludes-patterns/.redocly.yaml
index 2c86be58..ab20e78a 100644
--- a/__tests__/lint/path-excludes-patterns/.redocly.yaml
+++ b/__tests__/lint/path-excludes-patterns/.redocly.yaml
@@ -7,4 +7,3 @@ rules:
     severity: error
     patterns:
       - ^\/[a-z]
-extends: []
diff --git a/__tests__/lint/path-not-include-query-error/.redocly.yaml b/__tests__/lint/path-not-include-query-error/.redocly.yaml
index f9702567..419d9f80 100644
--- a/__tests__/lint/path-not-include-query-error/.redocly.yaml
+++ b/__tests__/lint/path-not-include-query-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-not-include-query: error
-extends: []
diff --git a/__tests__/lint/path-not-include-query-rule/.redocly.yaml b/__tests__/lint/path-not-include-query-rule/.redocly.yaml
index f9702567..419d9f80 100644
--- a/__tests__/lint/path-not-include-query-rule/.redocly.yaml
+++ b/__tests__/lint/path-not-include-query-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-not-include-query: error
-extends: []
diff --git a/__tests__/lint/path-parameters-defined-error/.redocly.yaml b/__tests__/lint/path-parameters-defined-error/.redocly.yaml
index 224f3566..0417e752 100644
--- a/__tests__/lint/path-parameters-defined-error/.redocly.yaml
+++ b/__tests__/lint/path-parameters-defined-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-parameters-defined: error
-extends: []
diff --git a/__tests__/lint/path-parameters-defined-rule/.redocly.yaml b/__tests__/lint/path-parameters-defined-rule/.redocly.yaml
index 224f3566..0417e752 100644
--- a/__tests__/lint/path-parameters-defined-rule/.redocly.yaml
+++ b/__tests__/lint/path-parameters-defined-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-parameters-defined: error
-extends: []
diff --git a/__tests__/lint/path-segment-plural-error/.redocly.yaml b/__tests__/lint/path-segment-plural-error/.redocly.yaml
index f5246084..95d98eea 100644
--- a/__tests__/lint/path-segment-plural-error/.redocly.yaml
+++ b/__tests__/lint/path-segment-plural-error/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   path-segment-plural: error
-extends: []
diff --git a/__tests__/lint/path-segment-plural/.redocly.yaml b/__tests__/lint/path-segment-plural/.redocly.yaml
index de3dded1..e62f01d5 100644
--- a/__tests__/lint/path-segment-plural/.redocly.yaml
+++ b/__tests__/lint/path-segment-plural/.redocly.yaml
@@ -9,4 +9,3 @@ rules:
     exceptions:
       - v1
       - pet
-extends: []
diff --git a/__tests__/lint/request-response-mime-type-oas2-error/.redocly.yaml b/__tests__/lint/request-response-mime-type-oas2-error/.redocly.yaml
index 4e9a5915..bbedfda8 100644
--- a/__tests__/lint/request-response-mime-type-oas2-error/.redocly.yaml
+++ b/__tests__/lint/request-response-mime-type-oas2-error/.redocly.yaml
@@ -11,4 +11,3 @@ rules:
     severity: error
     allowedValues:
       - application/json
-extends: []
\ No newline at end of file
diff --git a/__tests__/lint/request-response-mime-type-oas3-error/.redocly.yaml b/__tests__/lint/request-response-mime-type-oas3-error/.redocly.yaml
index 7876bb78..bbedfda8 100644
--- a/__tests__/lint/request-response-mime-type-oas3-error/.redocly.yaml
+++ b/__tests__/lint/request-response-mime-type-oas3-error/.redocly.yaml
@@ -11,4 +11,3 @@ rules:
     severity: error
     allowedValues:
       - application/json
-extends: []
diff --git a/__tests__/lint/request-response-mime-type-oas3.1-error/.redocly.yaml b/__tests__/lint/request-response-mime-type-oas3.1-error/.redocly.yaml
index 7876bb78..bbedfda8 100644
--- a/__tests__/lint/request-response-mime-type-oas3.1-error/.redocly.yaml
+++ b/__tests__/lint/request-response-mime-type-oas3.1-error/.redocly.yaml
@@ -11,4 +11,3 @@ rules:
     severity: error
     allowedValues:
       - application/json
-extends: []
diff --git a/__tests__/lint/spec-error-if-minimum-not-correct/.redocly.yaml b/__tests__/lint/spec-error-if-minimum-not-correct/.redocly.yaml
index ab55088c..e69818e9 100644
--- a/__tests__/lint/spec-error-if-minimum-not-correct/.redocly.yaml
+++ b/__tests__/lint/spec-error-if-minimum-not-correct/.redocly.yaml
@@ -4,3 +4,5 @@ apis:
 
 rules:
   spec: error
+
+extends: [recommended]
diff --git a/__tests__/lint/spec-error-if-minimum-not-correct/snapshot.js b/__tests__/lint/spec-error-if-minimum-not-correct/snapshot.js
index 621eea72..3ad9916a 100644
--- a/__tests__/lint/spec-error-if-minimum-not-correct/snapshot.js
+++ b/__tests__/lint/spec-error-if-minimum-not-correct/snapshot.js
@@ -2,9 +2,6 @@
 
 exports[`E2E lint spec-error-if-minimum-not-correct 1`] = `
 
-No configurations were defined in extends -- using built in recommended configuration by default.
-Warning! This default behavior is going to be deprecated soon.
-
 validating /openapi.yaml...
 [1] openapi.yaml:29:23 at #/paths/~1pet~1findByStatus/get/parameters/0/schema/minItems
 
diff --git a/__tests__/lint/spec-from/.redocly.yaml b/__tests__/lint/spec-from/.redocly.yaml
index 772b5cdd..ce11a2dd 100644
--- a/__tests__/lint/spec-from/.redocly.yaml
+++ b/__tests__/lint/spec-from/.redocly.yaml
@@ -2,6 +2,5 @@ apis:
   main:
     root: ./openapi.yaml
 
-extends: []
 rules:
   spec: error
diff --git a/__tests__/lint/tags-alphabetical-rule/.redocly.yaml b/__tests__/lint/tags-alphabetical-rule/.redocly.yaml
index 26472699..7ebdb6d9 100644
--- a/__tests__/lint/tags-alphabetical-rule/.redocly.yaml
+++ b/__tests__/lint/tags-alphabetical-rule/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   tags-alphabetical: warn
-extends: []
diff --git a/__tests__/lint/tags-alphabetical-warning/.redocly.yaml b/__tests__/lint/tags-alphabetical-warning/.redocly.yaml
index 26472699..7ebdb6d9 100644
--- a/__tests__/lint/tags-alphabetical-warning/.redocly.yaml
+++ b/__tests__/lint/tags-alphabetical-warning/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   tags-alphabetical: warn
-extends: []
diff --git a/__tests__/lint/test-unused-component/.redocly.yaml b/__tests__/lint/test-unused-component/.redocly.yaml
index 901dfbde..d3c96c58 100644
--- a/__tests__/lint/test-unused-component/.redocly.yaml
+++ b/__tests__/lint/test-unused-component/.redocly.yaml
@@ -4,4 +4,3 @@ apis:
 
 rules:
   info-contact: off
-extends: []
diff --git a/__tests__/lint/turn-off-rules/.redocly.yaml b/__tests__/lint/turn-off-rules/.redocly.yaml
index 9a170d04..f6f9f275 100644
--- a/__tests__/lint/turn-off-rules/.redocly.yaml
+++ b/__tests__/lint/turn-off-rules/.redocly.yaml
@@ -1,5 +1,3 @@
 apis:
   main:
     root: ./openapi.yaml
-
-extends: []
diff --git a/__tests__/lint/with-ignore-file/.redocly.yaml b/__tests__/lint/with-ignore-file/.redocly.yaml
index 232f5491..b216bfd7 100644
--- a/__tests__/lint/with-ignore-file/.redocly.yaml
+++ b/__tests__/lint/with-ignore-file/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 rules:
   operation-operationId: error
   operation-summary: error
-extends: []
diff --git a/__tests__/webpack-bundle/lint-workflows-fail/.redocly.yaml b/__tests__/webpack-bundle/lint-workflows-fail/.redocly.yaml
index dd4bf007..cee2123d 100644
--- a/__tests__/webpack-bundle/lint-workflows-fail/.redocly.yaml
+++ b/__tests__/webpack-bundle/lint-workflows-fail/.redocly.yaml
@@ -5,4 +5,3 @@ apis:
 rules: 
   operation-operationId: warn
   operation-summary: error
-extends: []
diff --git a/__tests__/zero-config/default-recommended-fallback/openapi.yaml b/__tests__/zero-config/default-recommended-fallback/openapi.yaml
new file mode 100644
index 00000000..c43c46b9
--- /dev/null
+++ b/__tests__/zero-config/default-recommended-fallback/openapi.yaml
@@ -0,0 +1,58 @@
+openapi: 3.0.0
+servers:
+  - url: //petstore.swagger.io/v2
+    description: Default server
+info:
+  title: Example OpenAPI 3 definition.
+  version: 1.0.0
+  description: desc
+  license:
+    name: Apache 2.0
+    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
+  contact:
+    name: qa
+    url: https://swagger.io/specification/#definitions
+    email: email@redoc.ly
+paths:
+  /pet/findByStatus:
+    get:
+      operationId: example
+      summary: summary example
+      responses:
+        '200':
+          description: example description
+        '400':
+          description: Invalid status value
+components:
+  securitySchemes:
+    petstore_auth:
+      description: Get access to data
+      type: oauth2
+      flows:
+        implicit:
+          authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+          refreshUrl: 'http://refreshUrl'
+          testProp: test
+          tokenUrl: 'http://tokenUrl'
+          scopes:
+            'write:pets': modify pets in your account
+            'read:pets': read your pets
+        password:
+          authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+          tokenUrl: 'http://tokenUrl'
+          scopes:
+            'write:pets': modify pets in your account
+            'read:pets': read your pets
+    api_key:
+      type: apiKey
+      name: api_key
+      in: header
+      description: api key
+      authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+    httpScheme:
+      type: http
+      name: http
+      in: header
+      scheme: scheme
+      description: http scheme
+      authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
diff --git a/__tests__/zero-config/default-recommended-fallback/snapshot.js b/__tests__/zero-config/default-recommended-fallback/snapshot.js
new file mode 100644
index 00000000..3b4c3970
--- /dev/null
+++ b/__tests__/zero-config/default-recommended-fallback/snapshot.js
@@ -0,0 +1,125 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`E2E zero-config default-recommended-fallback 1`] = `
+
+No configurations were provided -- using built in recommended configuration by default.
+
+validating /openapi.yaml...
+[1] openapi.yaml:35:11 at #/components/securitySchemes/petstore_auth/flows/implicit/testProp
+
+Property \`testProp\` is not expected here.
+
+33 | authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+34 | refreshUrl: 'http://refreshUrl'
+35 | testProp: test
+   | ^^^^^^^^
+36 | tokenUrl: 'http://tokenUrl'
+37 | scopes:
+
+Error was generated by the spec rule.
+
+
+[2] openapi.yaml:36:11 at #/components/securitySchemes/petstore_auth/flows/implicit/tokenUrl
+
+Property \`tokenUrl\` is not expected here.
+
+34 | refreshUrl: 'http://refreshUrl'
+35 | testProp: test
+36 | tokenUrl: 'http://tokenUrl'
+   | ^^^^^^^^
+37 | scopes:
+38 |   'write:pets': modify pets in your account
+
+Error was generated by the spec rule.
+
+
+[3] openapi.yaml:41:11 at #/components/securitySchemes/petstore_auth/flows/password/authorizationUrl
+
+Property \`authorizationUrl\` is not expected here.
+
+39 |     'read:pets': read your pets
+40 | password:
+41 |   authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+   |   ^^^^^^^^^^^^^^^^
+42 |   tokenUrl: 'http://tokenUrl'
+43 |   scopes:
+
+Error was generated by the spec rule.
+
+
+[4] openapi.yaml:51:7 at #/components/securitySchemes/api_key/authorizationUrl
+
+Property \`authorizationUrl\` is not expected here.
+
+49 |   in: header
+50 |   description: api key
+51 |   authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+   |   ^^^^^^^^^^^^^^^^
+52 | httpScheme:
+53 |   type: http
+
+Error was generated by the spec rule.
+
+
+[5] openapi.yaml:54:7 at #/components/securitySchemes/httpScheme/name
+
+The field \`name\` is not allowed here.
+
+52 | httpScheme:
+53 |   type: http
+54 |   name: http
+   |   ^^^^
+55 |   in: header
+56 |   scheme: scheme
+
+Error was generated by the spec rule.
+
+
+[6] openapi.yaml:55:7 at #/components/securitySchemes/httpScheme/in
+
+The field \`in\` is not allowed here.
+
+53 | type: http
+54 | name: http
+55 | in: header
+   | ^^
+56 | scheme: scheme
+57 | description: http scheme
+
+Error was generated by the spec rule.
+
+
+[7] openapi.yaml:58:7 at #/components/securitySchemes/httpScheme/authorizationUrl
+
+Property \`authorizationUrl\` is not expected here.
+
+56 | scheme: scheme
+57 | description: http scheme
+58 | authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+   | ^^^^^^^^^^^^^^^^
+59 |
+
+Error was generated by the spec rule.
+
+
+[8] openapi.yaml:18:5 at #/paths/~1pet~1findByStatus/get
+
+Every operation should have security defined on it or on the root level.
+
+16 | paths:
+17 |   /pet/findByStatus:
+18 |     get:
+   |     ^^^
+19 |       operationId: example
+20 |       summary: summary example
+
+Error was generated by the security-defined rule.
+
+
+/openapi.yaml: validated in <test>ms
+
+❌ Validation failed with 8 errors.
+run \`openapi lint --generate-ignore-file\` to add all problems to the ignore file.
+
+
+`;
diff --git a/__tests__/zero-config/no-default-recommended-fallback/openapi.yaml b/__tests__/zero-config/no-default-recommended-fallback/openapi.yaml
new file mode 100644
index 00000000..c43c46b9
--- /dev/null
+++ b/__tests__/zero-config/no-default-recommended-fallback/openapi.yaml
@@ -0,0 +1,58 @@
+openapi: 3.0.0
+servers:
+  - url: //petstore.swagger.io/v2
+    description: Default server
+info:
+  title: Example OpenAPI 3 definition.
+  version: 1.0.0
+  description: desc
+  license:
+    name: Apache 2.0
+    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
+  contact:
+    name: qa
+    url: https://swagger.io/specification/#definitions
+    email: email@redoc.ly
+paths:
+  /pet/findByStatus:
+    get:
+      operationId: example
+      summary: summary example
+      responses:
+        '200':
+          description: example description
+        '400':
+          description: Invalid status value
+components:
+  securitySchemes:
+    petstore_auth:
+      description: Get access to data
+      type: oauth2
+      flows:
+        implicit:
+          authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+          refreshUrl: 'http://refreshUrl'
+          testProp: test
+          tokenUrl: 'http://tokenUrl'
+          scopes:
+            'write:pets': modify pets in your account
+            'read:pets': read your pets
+        password:
+          authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+          tokenUrl: 'http://tokenUrl'
+          scopes:
+            'write:pets': modify pets in your account
+            'read:pets': read your pets
+    api_key:
+      type: apiKey
+      name: api_key
+      in: header
+      description: api key
+      authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+    httpScheme:
+      type: http
+      name: http
+      in: header
+      scheme: scheme
+      description: http scheme
+      authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
diff --git a/__tests__/zero-config/no-default-recommended-fallback/redocly.yaml b/__tests__/zero-config/no-default-recommended-fallback/redocly.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/__tests__/zero-config/no-default-recommended-fallback/snapshot.js b/__tests__/zero-config/no-default-recommended-fallback/snapshot.js
new file mode 100644
index 00000000..75391bd7
--- /dev/null
+++ b/__tests__/zero-config/no-default-recommended-fallback/snapshot.js
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`E2E zero-config no-default-recommended-fallback 1`] = `
+
+validating /openapi.yaml...
+/openapi.yaml: validated in <test>ms
+
+Woohoo! Your OpenAPI definition is valid. 🎉
+
+
+`;
diff --git a/packages/core/src/config/__tests__/config-resolvers.test.ts b/packages/core/src/config/__tests__/config-resolvers.test.ts
index 3d728a89..4cb187bc 100644
--- a/packages/core/src/config/__tests__/config-resolvers.test.ts
+++ b/packages/core/src/config/__tests__/config-resolvers.test.ts
@@ -342,7 +342,7 @@ describe('resolveApis', () => {
 });
 
 describe('resolveConfig', () => {
-  it('should add recommended to top level by default', async () => {
+  it('should NOT add recommended to top level by default IF there is a config file', async () => {
     const rawConfig: RawConfig = {
       apis: {
         petstore: {
@@ -373,7 +373,6 @@ describe('resolveConfig', () => {
     expect(apis['petstore'].styleguide.pluginPaths!.map(removeAbsolutePath)).toEqual([]);
 
     expect(apis['petstore'].styleguide.rules).toEqual({
-      ...(await recommendedStyleguidePreset).rules,
       'operation-2xx-response': 'warn',
       'operation-4xx-response': 'error',
     });
diff --git a/packages/core/src/config/__tests__/fixtures/load-redocly.yaml b/packages/core/src/config/__tests__/fixtures/load-redocly.yaml
index e720abcd..96e41069 100644
--- a/packages/core/src/config/__tests__/fixtures/load-redocly.yaml
+++ b/packages/core/src/config/__tests__/fixtures/load-redocly.yaml
@@ -1,4 +1,2 @@
-lint:
   rules:
     info-contact: warn
-  extends: []
diff --git a/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml b/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml
index 35f4defc..50d3bf3b 100644
--- a/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml
+++ b/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml
@@ -1,4 +1,3 @@
-lint:
   rules:
     no-invalid-media-type-examples: warn
     operation-4xx-response: off
diff --git a/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml b/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml
index f6e44004..e7bfce6a 100644
--- a/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml
+++ b/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml
@@ -1,4 +1,3 @@
-lint:
   rules:
     no-invalid-media-type-examples: warn
     operation-4xx-response: off