diff --git a/lib/config/admin.ts b/lib/config/admin.ts
index feb3701c818dcd698613c5b5a3e2cf3655d6e77b..c25361eac9024424e61e378a43706b4b4d717d9b 100644
--- a/lib/config/admin.ts
+++ b/lib/config/admin.ts
@@ -2,7 +2,7 @@ import type { RenovateConfig, RepoAdminConfig } from './types';
 
 let adminConfig: RepoAdminConfig = {};
 
-// TODO: once admin config work is complete, add a test to make sure this list includes all options with admin=true
+// TODO: once admin config work is complete, add a test to make sure this list includes all options with admin=true (#9603)
 export const repoAdminOptions = [
   'allowCustomCrateRegistries',
   'allowPostUpgradeCommandTemplating',
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 559a1d8c1a6a817ca326716737cab325d4fb3094..44e7842cc2fbad1842545acdb991e73faea44ea7 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -46,7 +46,7 @@ interface MigratedRenovateConfig extends RenovateConfig {
 // Returns a migrated config
 export function migrateConfig(
   config: RenovateConfig,
-  // TODO: remove any type
+  // TODO: remove any type (#9611)
   parentKey?: string | any
 ): MigratedConfig {
   try {
diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts
index 368c8c070b2d9f6bf6b084769e210e3c0741e18b..a3c4298e62e43a56ce3e481b92d3f155032785a2 100644
--- a/lib/datasource/docker/index.ts
+++ b/lib/datasource/docker/index.ts
@@ -16,8 +16,8 @@ import * as dockerVersioning from '../../versioning/docker';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 import { Image, ImageList, MediaType } from './types';
 
-// TODO: add got typings when available
-// TODO: replace www-authenticate with https://www.npmjs.com/package/auth-header ?
+// TODO: add got typings when available (#9646)
+// TODO: replace www-authenticate with https://www.npmjs.com/package/auth-header (#9645)
 
 export const id = 'docker';
 export const customRegistrySupport = true;
@@ -198,7 +198,7 @@ async function getAuthHeaders(
     };
   } catch (err) /* istanbul ignore next */ {
     if (err.host === 'quay.io') {
-      // TODO: debug why quay throws errors
+      // TODO: debug why quay throws errors (#9604)
       return null;
     }
     if (err.statusCode === 401) {
@@ -251,7 +251,7 @@ function extractDigestFromResponse(manifestResponse: HttpResponse): string {
   return manifestResponse.headers['docker-content-digest'] as string;
 }
 
-// TODO: make generic to return json object
+// TODO: debug why quay throws errors (#9612)
 async function getManifestResponse(
   registry: string,
   dockerRepository: string,
diff --git a/lib/datasource/npm/get.ts b/lib/datasource/npm/get.ts
index 0e22727a648bf8cb429490650c69e4f4148720e4..2dada2be0f4e3dbf62c59ec3b49359dc3b202c76 100644
--- a/lib/datasource/npm/get.ts
+++ b/lib/datasource/npm/get.ts
@@ -133,7 +133,7 @@ export async function getDependency(
     const cacheMinutes = process.env.RENOVATE_CACHE_NPM_MINUTES
       ? parseInt(process.env.RENOVATE_CACHE_NPM_MINUTES, 10)
       : 15;
-    // TODO: use dynamic detection of public repos instead of a static list
+    // TODO: use dynamic detection of public repos instead of a static list (#9587)
     const whitelistedPublicScopes = [
       '@graphql-codegen',
       '@storybook',
diff --git a/lib/datasource/npm/npmrc.ts b/lib/datasource/npm/npmrc.ts
index b7d700acac3c6a413cb6b1a3b1d92bfd125cfab5..ccfa73de07aa8e41719dc31a3039bdc98eb79880 100644
--- a/lib/datasource/npm/npmrc.ts
+++ b/lib/datasource/npm/npmrc.ts
@@ -36,7 +36,7 @@ function envReplace(value: any, env = process.env): any {
 }
 
 const envRe = /(\\*)\$\{([^}]+)\}/;
-// TODO: better add to host rules
+// TODO: better add to host rules (#9588)
 function sanitize(key: string, val: string): void {
   if (!val || envRe.test(val)) {
     return;
diff --git a/lib/datasource/packagist/index.ts b/lib/datasource/packagist/index.ts
index bc8a0cf2b2d3d51965ac19df1ec9fd32729f28c2..78dc632ab3bf93c9d3d43af2357b297f577681bb 100644
--- a/lib/datasource/packagist/index.ts
+++ b/lib/datasource/packagist/index.ts
@@ -229,7 +229,7 @@ async function packagistOrgLookup(name: string): Promise<ReleaseResult> {
   let dep: ReleaseResult = null;
   const regUrl = 'https://packagist.org';
   const pkgUrl = URL.resolve(regUrl, `/p/${name}.json`);
-  // TODO: fix types
+  // TODO: fix types (#9610)
   const res = (await http.getJson<any>(pkgUrl)).body.packages[name];
   if (res) {
     dep = extractDepReleases(res);
@@ -278,7 +278,7 @@ async function packageLookup(
       return null;
     }
     const opts = getHostOpts(regUrl);
-    // TODO: fix types
+    // TODO: fix types (#9610)
     const versions = (await http.getJson<any>(pkgUrl, opts)).body.packages[
       name
     ];
diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts
index def44bfb2562d6051c00d7a50b8ab351255e87c7..e1894928f51a5cfde9257b4546ff642bf803da6c 100644
--- a/lib/datasource/terraform-provider/index.ts
+++ b/lib/datasource/terraform-provider/index.ts
@@ -70,7 +70,7 @@ async function queryRegistry(
   return dep;
 }
 
-// TODO: add long term cache
+// TODO: add long term cache (#9590)
 async function queryReleaseBackend(
   lookupName: string,
   registryURL: string,
diff --git a/lib/logger/index.ts b/lib/logger/index.ts
index 4ec334202455d946b6588090971cec741a52cf83..b8884663de71969f585bbf5cc6e3cfc9f7815405 100644
--- a/lib/logger/index.ts
+++ b/lib/logger/index.ts
@@ -29,7 +29,7 @@ const stdout: bunyan.Stream = {
 
 // istanbul ignore else: not testable
 if (process.env.LOG_FORMAT !== 'json') {
-  // TODO: typings
+  // TODO: typings (#9615)
   const prettyStdOut = new RenovateStream() as any;
   prettyStdOut.pipe(process.stdout);
   stdout.stream = prettyStdOut;
diff --git a/lib/manager/bazel/extract.ts b/lib/manager/bazel/extract.ts
index 9a20d2699d916c9b4e025e1e516534b10af0b1fa..74c3f3d1c407e010bcdcf8832c932f9284f07b1e 100644
--- a/lib/manager/bazel/extract.ts
+++ b/lib/manager/bazel/extract.ts
@@ -242,7 +242,7 @@ export function extractPackageFile(
       if (commit) {
         dep.currentDigest = commit;
       }
-      // TODO: Check if we really need to use parse here or if it should always be a plain https url
+      // TODO: Check if we really need to use parse here or if it should always be a plain https url (#9605)
       const githubURL = parse(remote);
       if (githubURL) {
         const repo = githubURL.substring('https://github.com/'.length);
diff --git a/lib/manager/docker-compose/extract.ts b/lib/manager/docker-compose/extract.ts
index 55fb611c8edc34859abd8d140c2d259e002972b1..43be4a262a03c5550c14178b5e497408ad8da3df 100644
--- a/lib/manager/docker-compose/extract.ts
+++ b/lib/manager/docker-compose/extract.ts
@@ -46,7 +46,7 @@ export function extractPackageFile(
   logger.debug('docker-compose.extractPackageFile()');
   let config: DockerComposeConfig;
   try {
-    // TODO: fix me
+    // TODO: fix me (#9610)
     config = safeLoad(content, { json: true }) as unknown;
     if (!config) {
       logger.debug(
diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts
index effe283fda95133919fbec75eb0f5083ba8ac58f..b3ba608b47ea04f756846a0c459322c60405769f 100644
--- a/lib/manager/gitlabci-include/extract.ts
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -30,7 +30,7 @@ export function extractPackageFile(
 ): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    // TODO: fix me
+    // TODO: fix me (#9610)
     const doc = yaml.safeLoad(content, { json: true }) as any;
     if (doc?.include && is.array(doc.include)) {
       for (const includeObj of doc.include) {
diff --git a/lib/manager/helm-values/extract.ts b/lib/manager/helm-values/extract.ts
index cb997d65190c0e9ac344d88b200a3214f9ab3389..f2cd4230c0dc15e3f85a9b1478b4bdf843bc22fa 100644
--- a/lib/manager/helm-values/extract.ts
+++ b/lib/manager/helm-values/extract.ts
@@ -60,7 +60,7 @@ export function extractPackageFile(content: string): PackageFile {
   try {
     // a parser that allows extracting line numbers would be preferable, with
     // the current approach we need to match anything we find again during the update
-    // TODO: fix me
+    // TODO: fix me (#9610)
     parsedContent = yaml.safeLoad(content, { json: true }) as any;
   } catch (err) {
     logger.debug({ err }, 'Failed to parse helm-values YAML');
diff --git a/lib/manager/helmv3/extract.ts b/lib/manager/helmv3/extract.ts
index 3150934684037a1e21ad35a6b622ad95e25610fa..739f205a6ae8d447eef67bcf3416c3f8566f90b8 100644
--- a/lib/manager/helmv3/extract.ts
+++ b/lib/manager/helmv3/extract.ts
@@ -18,7 +18,7 @@ export async function extractPackageFile(
     dependencies: Array<{ name: string; version: string; repository: string }>;
   };
   try {
-    // TODO: fix me
+    // TODO: fix me (#9610)
     chart = yaml.safeLoad(content, { json: true }) as any;
     if (!(chart?.apiVersion && chart.name && chart.version)) {
       logger.debug(
diff --git a/lib/manager/homebrew/extract.ts b/lib/manager/homebrew/extract.ts
index dd669d7147c68b76648abb5c6e0b3a8d42bea2f3..c6d34398e1a6d71ef82056ca92011b13b43e89c2 100644
--- a/lib/manager/homebrew/extract.ts
+++ b/lib/manager/homebrew/extract.ts
@@ -130,7 +130,7 @@ function extractClassName(content: string): string | null {
   return parseClassHeader(i, content);
 }
 
-// TODO: Maybe check if quotes/double-quotes are balanced
+// TODO: Maybe check if quotes/double-quotes are balanced (#9591)
 export function extractPackageFile(content: string): PackageFile | null {
   logger.trace('extractPackageFile()');
   /*
diff --git a/lib/manager/homebrew/update.ts b/lib/manager/homebrew/update.ts
index e709f6ba3cd9f378aadf7f54ab921549afb29a8d..f85b261b796fa5e0e738b0fffcd42514f1fc3da0 100644
--- a/lib/manager/homebrew/update.ts
+++ b/lib/manager/homebrew/update.ts
@@ -135,7 +135,7 @@ function updateSha256(
   return newContent;
 }
 
-// TODO: Refactor
+// TODO: Refactor (#9591)
 export async function updateDependency({
   fileContent,
   upgrade,
diff --git a/lib/manager/npm/extract/type.ts b/lib/manager/npm/extract/type.ts
index ea16f2fb4551779993a3e8f7c829723c18e2d99c..941cff67233cc96ee66b61dc363df0f97b149087 100644
--- a/lib/manager/npm/extract/type.ts
+++ b/lib/manager/npm/extract/type.ts
@@ -11,6 +11,6 @@ export function mightBeABrowserLibrary(packageJson: NpmPackage): boolean {
     return false;
   }
   // TODO: how can we know if it's a node.js library only, and not browser?
-  // Otherwise play it safe and return true
+  // Otherwise play it safe and return true (#9616)
   return true;
 }
diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts
index 1455157eb9482f299bc3b4c6a21aefab02591572..9be0c7e15f591d8c7037192d18a478b3826a9e74 100644
--- a/lib/manager/npm/post-update/yarn.spec.ts
+++ b/lib/manager/npm/post-update/yarn.spec.ts
@@ -19,7 +19,7 @@ const yarnHelper = mocked(_yarnHelper);
 
 delete process.env.NPM_CONFIG_CACHE;
 
-// TODO: figure out snapshot similarity for each CI platform
+// TODO: figure out snapshot similarity for each CI platform (#9617)
 const fixSnapshots = (snapshots: ExecSnapshots): ExecSnapshots =>
   snapshots.map((snapshot) => ({
     ...snapshot,
diff --git a/lib/manager/pip_setup/index.spec.ts b/lib/manager/pip_setup/index.spec.ts
index 82095fcb2bc2dd808f5cecf2cf9ad1c58d9e2ac7..5532a147d27f5c29e63d86b649dbefc9fc1a1835 100644
--- a/lib/manager/pip_setup/index.spec.ts
+++ b/lib/manager/pip_setup/index.spec.ts
@@ -29,7 +29,7 @@ const pythonVersionCallResults = [
   { stdout: 'Python 3.7.5\\n', stderr: '' },
 ];
 
-// TODO: figure out snapshot similarity for each CI platform
+// TODO: figure out snapshot similarity for each CI platform (#9617)
 const fixSnapshots = (snapshots: ExecSnapshots): ExecSnapshots =>
   snapshots.map((snapshot) => ({
     ...snapshot,
@@ -79,7 +79,7 @@ describe(getName(), () => {
           binarySource: BinarySource.Docker,
         })
       ).toMatchSnapshot();
-      expect(execSnapshots).toHaveLength(1); // TODO: figure out volume arguments in Windows
+      expect(execSnapshots).toHaveLength(1); // TODO: figure out volume arguments in Windows (#9617)
     });
 
     it('returns no deps', async () => {
diff --git a/lib/manager/pipenv/extract.ts b/lib/manager/pipenv/extract.ts
index afc710318e03fe98c71f6ce20178bf4e37427357..84c7e4fc34ac414528b38f4479d636b30367f387 100644
--- a/lib/manager/pipenv/extract.ts
+++ b/lib/manager/pipenv/extract.ts
@@ -126,7 +126,7 @@ export async function extractPackageFile(
 
   let pipfile: PipFile;
   try {
-    // TODO: fix type
+    // TODO: fix type (#9610)
     pipfile = toml.parse(content) as any;
   } catch (err) {
     logger.debug({ err }, 'Error parsing Pipfile');
diff --git a/lib/manager/pub/extract.ts b/lib/manager/pub/extract.ts
index 250ebbedfa0e57de9051e99435619fa33d66c1dd..ea5bef4dfe8306211b584e98b2e3362d6728fb2f 100644
--- a/lib/manager/pub/extract.ts
+++ b/lib/manager/pub/extract.ts
@@ -40,7 +40,7 @@ export function extractPackageFile(
   packageFile: string
 ): PackageFile | null {
   try {
-    // TODO: fix me
+    // TODO: fix me (#9610)
     const doc = safeLoad(content, { json: true }) as any;
     const deps = [
       ...getDeps(doc.dependencies, {
diff --git a/lib/manager/travis/package.spec.ts b/lib/manager/travis/package.spec.ts
index 862c1c4be036fe727b5f427a980ee64144ec7906..8380fe6c8a99d16404425667d70d95e786eb1ddb 100644
--- a/lib/manager/travis/package.spec.ts
+++ b/lib/manager/travis/package.spec.ts
@@ -10,7 +10,6 @@ jest.mock('../../datasource');
 
 describe(getName(), () => {
   describe('getPackageUpdates', () => {
-    // TODO: should be `PackageUpdateConfig`
     let config: any;
     const RealDate = Date;
 
diff --git a/lib/manager/travis/package.ts b/lib/manager/travis/package.ts
index d622799305ed82e953aeb64ad21a131f175efc94..49897f9d65d1086382629f9a5f37bf0308cd137a 100644
--- a/lib/manager/travis/package.ts
+++ b/lib/manager/travis/package.ts
@@ -45,7 +45,6 @@ export async function getPackageUpdates(
   }
   newValue.sort((a, b) => a - b);
 
-  // TODO: `config.currentValue` is a string!
   (config.currentValue as any).sort((a, b) => a - b);
   if (dequal(config.currentValue, newValue)) {
     return { updates: [] };
diff --git a/lib/manager/travis/update.spec.ts b/lib/manager/travis/update.spec.ts
index 1ef3529689a3a33b22e210811f5750aef5079ce8..c03ab2ce2d0b09b43f66b9c1d789c41d9dd50bbe 100644
--- a/lib/manager/travis/update.spec.ts
+++ b/lib/manager/travis/update.spec.ts
@@ -6,7 +6,6 @@ const content = loadFixture('travis.yml');
 describe(getName(), () => {
   describe('updateDependency', () => {
     it('updates values', () => {
-      // TODO: should be `Upgrade`
       const upgrade: any = {
         currentValue: ['8', '6', '4'],
         newValue: '6,8',
@@ -15,7 +14,6 @@ describe(getName(), () => {
       expect(res).toMatchSnapshot();
     });
     it('falls back to 2 spaces', () => {
-      // TODO: should be `Upgrade`
       const upgrade: any = {
         currentValue: [8, 6, 4],
         newValue: '6,8',
@@ -27,7 +25,6 @@ describe(getName(), () => {
       expect(res).toMatchSnapshot();
     });
     it('uses double quotes', () => {
-      // TODO: should be `Upgrade`
       const upgrade: any = {
         currentValue: ['6'],
         newValue: '6,8',
@@ -39,7 +36,6 @@ describe(getName(), () => {
       expect(res).toMatchSnapshot();
     });
     it('returns null if error', () => {
-      // TODO: should be `Upgrade`
       const upgrade: any = {
         currentValue: [8, 6, 4],
         newValue: 6,
diff --git a/lib/manager/travis/update.ts b/lib/manager/travis/update.ts
index 3839cf12541183d283909b45f0dca4bac4ca068f..8e9b2a8e0d26b3e223bd4ed053926c9a9f58aaa1 100644
--- a/lib/manager/travis/update.ts
+++ b/lib/manager/travis/update.ts
@@ -20,7 +20,6 @@ export function updateDependency({
       quote = '';
     }
     let newString = `node_js:\n`;
-    // TODO: `newValue` is a string!
     upgrade.newValue.split(',').forEach((version) => {
       newString += `${indent}- ${quote}${version}${quote}\n`;
     });
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 5b0bc3bab7c375bbffb6704980581fa6a430727f..bd5f96e417d0c7179f2c82f169dd829f167e1d69 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -89,7 +89,7 @@ export function initPlatform({
       'Init: You must configure an Azure DevOps token, or a username and password'
     );
   }
-  // TODO: Add a connection check that endpoint/token combination are valid
+  // TODO: Add a connection check that endpoint/token combination are valid (#9593)
   const res = {
     endpoint: ensureTrailingSlash(endpoint),
   };
@@ -703,7 +703,7 @@ export function ensureIssueClosing(): Promise<void> {
 /* istanbul ignore next */
 export function getIssueList(): Promise<Issue[]> {
   logger.debug(`getIssueList()`);
-  // TODO: Needs implementation
+  // TODO: Needs implementation (#9592)
   return Promise.resolve([]);
 }
 
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 95423d626bcc883a5a3ee4171f073257807f0f68..f62c1710306ab11373a8eafa10f8418b5b98d7f8 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -90,7 +90,7 @@ export function initPlatform({
       'Init: You must configure a Bitbucket Server username/password'
     );
   }
-  // TODO: Add a connection check that endpoint/username/password combination are valid
+  // TODO: Add a connection check that endpoint/username/password combination are valid (#9595)
   defaults.endpoint = ensureTrailingSlash(endpoint);
   setBaseUrl(defaults.endpoint);
   const platformConfig: PlatformResult = {
@@ -298,7 +298,7 @@ export async function getPr(
   return pr;
 }
 
-// TODO: coverage
+// TODO: coverage (#9624)
 // istanbul ignore next
 function matchesState(state: string, desiredState: string): boolean {
   if (desiredState === PrState.All) {
@@ -310,7 +310,7 @@ function matchesState(state: string, desiredState: string): boolean {
   return state === desiredState;
 }
 
-// TODO: coverage
+// TODO: coverage (#9624)
 // istanbul ignore next
 const isRelevantPr = (
   branchName: string,
@@ -321,7 +321,7 @@ const isRelevantPr = (
   (!prTitle || p.title === prTitle) &&
   matchesState(p.state, state);
 
-// TODO: coverage
+// TODO: coverage (#9624)
 export async function getPrList(refreshCache?: boolean): Promise<Pr[]> {
   logger.debug(`getPrList()`);
   // istanbul ignore next
@@ -346,7 +346,7 @@ export async function getPrList(refreshCache?: boolean): Promise<Pr[]> {
   return config.prList;
 }
 
-// TODO: coverage
+// TODO: coverage (#9624)
 // istanbul ignore next
 export async function findPr({
   branchName,
@@ -538,9 +538,11 @@ export async function setBranchStatus({
 /* istanbul ignore next */
 export function findIssue(title: string): Promise<Issue | null> {
   logger.debug(`findIssue(${title})`);
-  // TODO: Needs implementation
-  // This is used by Renovate when creating its own issues, e.g. for deprecated package warnings, config error notifications, or "dependencyDashboard"
-  // BB Server doesnt have issues
+  // This is used by Renovate when creating its own issues,
+  // e.g. for deprecated package warnings,
+  // config error notifications, or "dependencyDashboard"
+  //
+  // Bitbucket Server does not have issues
   return null;
 }
 
@@ -549,33 +551,43 @@ export function ensureIssue({
   title,
 }: EnsureIssueConfig): Promise<EnsureIssueResult | null> {
   logger.warn({ title }, 'Cannot ensure issue');
-  // TODO: Needs implementation
-  // This is used by Renovate when creating its own issues, e.g. for deprecated package warnings, config error notifications, or "dependencyDashboard"
-  // BB Server doesnt have issues
+  // This is used by Renovate when creating its own issues,
+  // e.g. for deprecated package warnings,
+  // config error notifications, or "dependencyDashboard"
+  //
+  // Bitbucket Server does not have issues
   return null;
 }
 
 /* istanbul ignore next */
 export function getIssueList(): Promise<Issue[]> {
   logger.debug(`getIssueList()`);
-  // TODO: Needs implementation
+  // This is used by Renovate when creating its own issues,
+  // e.g. for deprecated package warnings,
+  // config error notifications, or "dependencyDashboard"
+  //
+  // Bitbucket Server does not have issues
   return Promise.resolve([]);
 }
 
 /* istanbul ignore next */
 export function ensureIssueClosing(title: string): Promise<void> {
   logger.debug(`ensureIssueClosing(${title})`);
-  // TODO: Needs implementation
-  // This is used by Renovate when creating its own issues, e.g. for deprecated package warnings, config error notifications, or "dependencyDashboard"
-  // BB Server doesnt have issues
+  // This is used by Renovate when creating its own issues,
+  // e.g. for deprecated package warnings,
+  // config error notifications, or "dependencyDashboard"
+  //
+  // Bitbucket Server does not have issues
   return Promise.resolve();
 }
 
 export function addAssignees(iid: number, assignees: string[]): Promise<void> {
   logger.debug(`addAssignees(${iid}, [${assignees.join(', ')}])`);
-  // TODO: Needs implementation
-  // Currently Renovate does "Create PR" and then "Add assignee" as a two-step process, with this being the second step.
-  // BB Server doesnt support assignees
+  // This is used by Renovate when creating its own issues,
+  // e.g. for deprecated package warnings,
+  // config error notifications, or "dependencyDashboard"
+  //
+  // Bitbucket Server does not have issues
   return Promise.resolve();
 }
 
@@ -626,8 +638,9 @@ export async function addReviewers(
 
 export function deleteLabel(issueNo: number, label: string): Promise<void> {
   logger.debug(`deleteLabel(${issueNo}, ${label})`);
-  // TODO: Needs implementation
   // Only used for the "request Renovate to rebase a PR using a label" feature
+  //
+  // Bitbucket Server does not have issues
   return Promise.resolve();
 }
 
diff --git a/lib/platform/bitbucket-server/utils.ts b/lib/platform/bitbucket-server/utils.ts
index 90a1b7b7425d481e65168239caad6947e72dc912..e98a66b09d8ee8fb4e743230963b27fe4fe4831f 100644
--- a/lib/platform/bitbucket-server/utils.ts
+++ b/lib/platform/bitbucket-server/utils.ts
@@ -82,7 +82,7 @@ export async function accumulateValues<T = any>(
   let nextUrl = addMaxLength(reqUrl, limit);
 
   while (typeof nextUrl !== 'undefined') {
-    // TODO: fix typing
+    // TODO: fix typing (#9610)
     const { body } = await callApi<{
       values: T[];
       isLastPage: boolean;
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index 114e8f106e12f037d87a65bd96ff5869b3adb14a..e1c4eae8aba5018acfc157dd03fd7458b3e30e76 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -78,7 +78,7 @@ export async function initPlatform({
       logger.debug({ err }, 'Unknown error fetching Bitbucket user identity');
     }
   }
-  // TODO: Add a connection check that endpoint/username/password combination are valid
+  // TODO: Add a connection check that endpoint/username/password combination are valid (#9594)
   const platformConfig: PlatformResult = {
     endpoint: endpoint || BITBUCKET_PROD_ENDPOINT,
   };
@@ -278,7 +278,7 @@ export async function getPr(prNo: number): Promise<Pr | null> {
   if (utils.prStates.open.includes(pr.state)) {
     res.isConflicted = await isPrConflicted(prNo);
 
-    // TODO: Is that correct? Should we check getBranchStatus like gitlab?
+    // TODO: Is that correct? Should we check getBranchStatus like gitlab? (#9618)
     res.canMerge = !res.isConflicted;
   }
   res.hasReviewers = is.nonEmptyArray(pr.reviewers);
diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts
index bd9e688af73d5d2ecc1be88f549d390aa6371248..f334c4a4d142e667eb1a8c04f5f27131754cfc14 100644
--- a/lib/platform/index.spec.ts
+++ b/lib/platform/index.spec.ts
@@ -14,7 +14,7 @@ describe(getName(), () => {
 
   it('validates', () => {
     function validate(module: Platform, name: string): boolean {
-      // TODO: test required api
+      // TODO: test required api (#9650)
       if (!module.initPlatform) {
         throw Error(`Missing api on ${name}`);
       }
diff --git a/lib/util/cache/package/redis.ts b/lib/util/cache/package/redis.ts
index 5f1e93e51cf7888e84f4aa93e2b8a75a2ee0a658..cdafdb18f81cca6f206e09333227d0b9e1edaa3e 100644
--- a/lib/util/cache/package/redis.ts
+++ b/lib/util/cache/package/redis.ts
@@ -11,7 +11,7 @@ function getKey(namespace: string, key: string): string {
 
 export function end(): void {
   try {
-    client?.nodeRedis?.end(true); // TODO: Why is this not supported by client directly?
+    client?.nodeRedis?.end(true); // TODO: Why is this not supported by client directly? (#9714)
   } catch (err) {
     logger.warn({ err }, 'Redis cache end failed');
   }
diff --git a/lib/util/http/index.ts b/lib/util/http/index.ts
index fe014f8d426d2da1546e78a64ba7d78216345e6f..337bbfd4a7f90036bd6849291bbe3fbc3c0ccee0 100644
--- a/lib/util/http/index.ts
+++ b/lib/util/http/index.ts
@@ -12,7 +12,7 @@ import { applyHostRules } from './host-rules';
 import { getQueue } from './queue';
 import type { GotOptions, OutgoingHttpHeaders, RequestStats } from './types';
 
-// TODO: refactor code to remove this
+// TODO: refactor code to remove this (#9651)
 import './legacy';
 
 export interface HttpOptions {
diff --git a/lib/util/http/legacy.ts b/lib/util/http/legacy.ts
index 97c09208c19dcae1096a7a7b9b57a43e7d623a21..62d4b3c5949d961a21da348c703dd9bdf6c0ad01 100644
--- a/lib/util/http/legacy.ts
+++ b/lib/util/http/legacy.ts
@@ -2,7 +2,7 @@
 import { parseUrl } from '../url';
 import { HttpError } from './types';
 
-// TODO: remove when code is refactored
+// TODO: remove when code is refactored (#9651)
 
 Object.defineProperty(HttpError.prototype, 'statusCode', {
   get: function statusCode(this: HttpError) {
diff --git a/lib/versioning/index.spec.ts b/lib/versioning/index.spec.ts
index 14ff34666c5dc990cf90c9ae3f1ac43e46416f83..acc9fd02f52a4edb74e87be0732e23d2cabc0c62 100644
--- a/lib/versioning/index.spec.ts
+++ b/lib/versioning/index.spec.ts
@@ -22,7 +22,7 @@ describe('allVersioning.get(versioning)', () => {
       // eslint-disable-next-line new-cap
       const mod = isVersioningApiConstructor(module) ? new module() : module;
 
-      // TODO: test required api
+      // TODO: test required api (#9715)
       if (!mod.isValid || !mod.isVersion) {
         throw Error(`Missing api on ${name}`);
       }
diff --git a/lib/versioning/node/index.ts b/lib/versioning/node/index.ts
index 9a78f7b53fbcfcb2114349eb4122cb606e73abaa..97aa87c307dbefee05cf588609817c6f8d16617c 100644
--- a/lib/versioning/node/index.ts
+++ b/lib/versioning/node/index.ts
@@ -34,7 +34,7 @@ export function isStable(version: string): boolean {
     const major = npm.getMajor(version);
     const schedule = nodeSchedule[`v${major}`];
     if (schedule?.lts) {
-      // TODO: use the exact release that started LTS
+      // TODO: use the exact release that started LTS (#9716)
       return DateTime.local() > DateTime.fromISO(schedule.lts);
     }
   }
diff --git a/lib/versioning/regex/index.ts b/lib/versioning/regex/index.ts
index 3008231a213d9750812040d0fd43a89a85a70382..e0cedd1c11aaefb309bb387731de3c66256ab2bd 100644
--- a/lib/versioning/regex/index.ts
+++ b/lib/versioning/regex/index.ts
@@ -62,7 +62,7 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
     }
 
     // TODO: should we validate the user has not added extra unsupported
-    // capture groups?
+    // capture groups? (#9717)
     this._config = regEx(new_config);
   }
 
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index 5d6b829180c09a654b4e031f43d95c76a86e0ae4..32db6ec90183a0b3dc0264f57c3d1463bb4b1d30 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -132,6 +132,7 @@ describe(getName(), () => {
            The type definition for "releaseTimestamp" is a string. But when I change it to
            one the test starts failing. Once this test has been fixed, the never typing can be removed.
            And instead replaced with the pattern used on the other places that have a config.upgrades
+           (#9718)
         */
       ] as never;
 
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index 8bbc0160d87c193034ed30b69c1b729a45efc727..6cb181c17ec40a91afb64fbc4dff5adc6ffc5174 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -483,7 +483,7 @@ export async function processBranch(
       logger.debug('Reached PR limit - skipping PR creation');
       return { branchExists, result: BranchResult.PrLimitReached };
     }
-    // TODO: ensurePr should check for automerge itself
+    // TODO: ensurePr should check for automerge itself (#9719)
     if (result === PrResult.AwaitingApproval) {
       return { branchExists, result: BranchResult.NeedsPrApproval };
     }
diff --git a/lib/workers/branch/reuse.ts b/lib/workers/branch/reuse.ts
index dabee5d66e463c9276849f36151a94e65e4fa2b7..7c2718c48fccbe94e92b7183a0207aaa0cce211b 100644
--- a/lib/workers/branch/reuse.ts
+++ b/lib/workers/branch/reuse.ts
@@ -55,7 +55,7 @@ export async function shouldReuseExistingBranch(
       logger.debug(`Branch is stale and needs rebasing`);
       // We can rebase the branch only if no PR or PR can be rebased
       if (await isBranchModified(branchName)) {
-        // TODO: Warn here so that it appears in PR body
+        // TODO: Warn here so that it appears in PR body (#9720)
         logger.debug('Cannot rebase branch as it has been modified');
         return { reuseExistingBranch: true, isModified: true };
       }
@@ -82,7 +82,7 @@ export async function shouldReuseExistingBranch(
       return { reuseExistingBranch: false };
     }
     // Don't do anything different, but warn
-    // TODO: Add warning to PR
+    // TODO: Add warning to PR (#9720)
     logger.debug(`Branch is not mergeable but can't be rebased`);
   }
   logger.debug(`Branch does not need rebasing`);
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 4dbcba81da6f0f0d27692c4b42dc128d8d4f2706..02e887e6c2e54ae428c4a6b9af198e693b455dac 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -939,7 +939,7 @@ describe(getName(), () => {
       config.lockedVersion = '0.9.4';
       config.currentValue = '~=0.9';
       config.depName = 'q';
-      // TODO: we are using npm as source to test pep440
+      // TODO: we are using npm as source to test pep440 (#9721)
       config.datasource = datasourceNpmId;
       nock('https://registry.npmjs.org').get('/q').reply(200, qJson);
       const res = await lookup.lookupUpdates(config);
diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts
index 2ddf9b39bc1f1a1e6e8effdc6d8390cb62e56d92..2b7fd67b5956b65e3c53e3c991665a5dc0b8f2bb 100644
--- a/lib/workers/repository/updates/generate.ts
+++ b/lib/workers/repository/updates/generate.ts
@@ -273,7 +273,7 @@ export function generateBranchConfig(
     });
   }
   // Now assign first upgrade's config as branch config
-  config = { ...config, ...config.upgrades[0], releaseTimestamp }; // TODO: fixme
+  config = { ...config, ...config.upgrades[0], releaseTimestamp }; // TODO: fixme (#9666)
   config.reuseLockFiles = config.upgrades.every(
     (upgrade) => upgrade.updateType !== 'lockFileMaintenance'
   );