diff --git a/lib/modules/versioning/versioning-metadata.spec.ts b/lib/modules/versioning/versioning-metadata.spec.ts
index 2e66857240749c57682e2648708aa3ca14d8c390..e7cd9705ecc383d4076d3e80aa6c2b84cc6590c3 100644
--- a/lib/modules/versioning/versioning-metadata.spec.ts
+++ b/lib/modules/versioning/versioning-metadata.spec.ts
@@ -1,42 +1,51 @@
-import { readFile, readdir } from 'fs-extra';
+import { readdirSync } from 'node:fs';
+import { readFile } from 'fs-extra';
 
 describe('modules/versioning/versioning-metadata', () => {
-  it('readme no markdown headers', async () => {
-    const allVersioning = (await readdir('lib/modules/versioning')).filter(
-      (item) => !item.includes('.'),
-    );
-    for (const versioning of allVersioning) {
-      let readme: string | undefined;
+  const allVersioning = readdirSync('lib/modules/versioning', {
+    withFileTypes: true,
+  })
+    .filter((item) => item.isDirectory())
+    .map((item) => item.name);
+
+  describe.each(allVersioning)('%s', (versioning) => {
+    it('readme with no h1 or h2 markdown headers', async () => {
+      let readme = '';
       try {
         readme = await readFile(
-          'lib/modules/versioning/' + versioning + '/readme.md',
+          `lib/modules/versioning/${versioning}/readme.md`,
           'utf8',
         );
       } catch {
         // ignore missing file
       }
-      if (readme) {
-        // eslint-disable-next-line jest/no-conditional-expect
-        expect(RegExp(/(^|\n)#+ /).exec(readme)).toBeNull();
+      const lines = readme.split('\n');
+      let isCode = false;
+      const res: string[] = [];
+
+      for (const line of lines) {
+        if (line.startsWith('```')) {
+          isCode = !isCode;
+        } else if (!isCode) {
+          res.push(line);
+        }
       }
-    }
-  });
 
-  it('contains mandatory fields', async () => {
-    const allVersioning = (await readdir('lib/modules/versioning')).filter(
-      (item) => !item.includes('.') && !item.startsWith('_'),
-    );
+      expect(
+        res.some((line) => line.startsWith('# ') || line.startsWith('## ')),
+      ).toBeFalse();
+    });
 
-    for (const versioning of allVersioning) {
+    it('contains mandatory fields', async () => {
       const versioningObj = await import(`./${versioning}`);
       expect(versioningObj.id).toEqual(versioning);
       expect(versioningObj.displayName).toBeDefined();
-      expect(versioningObj.urls).toBeDefined();
-      expect(versioningObj.supportsRanges).toBeDefined();
+      expect(versioningObj.urls).toBeArray();
+      expect(versioningObj.supportsRanges).toBeBoolean();
       if (versioningObj.supportsRanges === true) {
         // eslint-disable-next-line jest/no-conditional-expect
-        expect(versioningObj.supportedRangeStrategies).toBeDefined();
+        expect(versioningObj.supportedRangeStrategies).toBeArrayOfStrings();
       }
-    }
+    });
   });
 });
diff --git a/tools/docs/versioning.ts b/tools/docs/versioning.ts
index 6982ed612faa651c066a1cb3003fad408e2dc4ec..c6712f2d6899c694d9dd73b7402a6b47668e7a00 100644
--- a/tools/docs/versioning.ts
+++ b/tools/docs/versioning.ts
@@ -12,13 +12,13 @@ import {
   replaceContent,
 } from './utils';
 
-type Versioning = {
+interface Versioning {
   id: string;
   displayName: string;
-  urls?: string[];
-  supportsRanges?: boolean;
+  urls: string[];
+  supportsRanges: boolean;
   supportedRangeStrategies?: string[];
-};
+}
 
 export async function generateVersioning(
   dist: string,