ci: Gate PRs on code-health and janitor checks (#30091)

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Declan Carroll
2026-05-12 10:02:53 +01:00
committed by GitHub
parent 111d403aa7
commit a60ef7dbb5
4 changed files with 605 additions and 351 deletions
+277 -149
View File
@@ -1,24 +1,64 @@
{
"version": 1,
"generated": "2026-04-23T08:42:21.615Z",
"totalViolations": 102,
"generated": "2026-05-12T08:06:05.095Z",
"totalViolations": 122,
"violations": {
"packages/core/package.json": [
{
"rule": "catalog-violations",
"line": 44,
"message": "zod@>=3.25.0 <4 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "7206fdd3f507"
}
],
"packages/workflow/package.json": [
{
"rule": "catalog-violations",
"line": 76,
"message": "zod@>=3.25.0 <4 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "db77d12f5a47"
},
{
"rule": "catalog-violations",
"line": 58,
"message": "ast-types appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "1c7d7cf0b0fe"
},
{
"rule": "catalog-violations",
"line": 60,
"message": "esprima-next appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "627a716b5d23"
},
{
"rule": "catalog-violations",
"line": 68,
"message": "recast appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "b660317b5f6f"
}
],
"packages/@n8n/agents/package.json": [
{
"rule": "catalog-violations",
"line": 40,
"line": 52,
"message": "langsmith@>=0.3.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "193bb785d0b4"
},
{
"rule": "catalog-violations",
"line": 27,
"line": 28,
"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "b58f03d0d5c1"
},
{
"rule": "catalog-violations",
"line": 41,
"line": 50,
"message": "@opentelemetry/sdk-trace-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "c5c495ac3508"
},
{
"rule": "catalog-violations",
"line": 51,
"message": "@opentelemetry/sdk-trace-node appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "a77ced903cdf"
}
@@ -26,7 +66,7 @@
"packages/@n8n/ai-workflow-builder.ee/package.json": [
{
"rule": "catalog-violations",
"line": 72,
"line": 73,
"message": "langsmith@^0.4.6 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "6ee5e003d795"
},
@@ -39,22 +79,36 @@
{
"rule": "catalog-violations",
"line": 70,
"message": "csv-parse appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "94f80b083b76"
},
{
"rule": "catalog-violations",
"line": 71,
"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "9c770d66baf2"
},
{
"rule": "catalog-violations",
"line": 76,
"line": 77,
"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "85c311d87491"
},
{
"rule": "catalog-violations",
"line": 82,
"line": 83,
"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "407c8d1b3428"
}
],
"packages/@n8n/api-types/package.json": [
{
"rule": "catalog-violations",
"line": 39,
"message": "zod@>=3.25.0 <4 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "3ace050c7ffc"
}
],
"packages/@n8n/cli/package.json": [
{
"rule": "catalog-violations",
@@ -95,8 +149,58 @@
{
"rule": "catalog-violations",
"line": 63,
"message": "zod@^3.0.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "436de7cbc5ea"
"message": "zod@^3.25.76 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "0e18482e8781"
}
],
"packages/@n8n/nodes-langchain/package.json": [
{
"rule": "catalog-violations",
"line": 292,
"message": "openai@^6.34.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "3c1f53f0afe3"
},
{
"rule": "catalog-violations",
"line": 303,
"message": "zod-to-json-schema@3.23.3 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "081b5d0b5ca5"
},
{
"rule": "catalog-violations",
"line": 299,
"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "88d67e2ef747"
},
{
"rule": "catalog-violations",
"line": 259,
"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "69d6fa7e46f9"
},
{
"rule": "catalog-violations",
"line": 274,
"message": "cheerio appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8cd029bb871e"
},
{
"rule": "catalog-violations",
"line": 284,
"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "26f20ebea4b1"
},
{
"rule": "catalog-violations",
"line": 289,
"message": "mongodb appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "46cb48884e22"
},
{
"rule": "catalog-violations",
"line": 293,
"message": "pdf-parse appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "0c7d44a9c2e4"
}
],
"packages/@n8n/node-cli/package.json": [
@@ -112,6 +216,12 @@
"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "da74ed210d07"
},
{
"rule": "catalog-violations",
"line": 59,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "9e47058c6edb"
},
{
"rule": "catalog-violations",
"line": 51,
@@ -123,68 +233,44 @@
"line": 55,
"message": "eslint-plugin-n8n-nodes-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "6a9e12780943"
},
{
"rule": "catalog-violations",
"line": 59,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "d536f5a9c3f8"
}
],
"packages/@n8n/nodes-langchain/package.json": [
"packages/@n8n/tournament/package.json": [
{
"rule": "catalog-violations",
"line": 289,
"message": "openai@^6.9.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "b9b214e61fdc"
"line": 44,
"message": "@types/node@^18.13.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "6368b5d3b924"
},
{
"rule": "catalog-violations",
"line": 299,
"message": "zod-to-json-schema@3.23.3 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "081b5d0b5ca5"
"line": 52,
"message": "typescript@^5.0.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "f668021a144e"
},
{
"rule": "catalog-violations",
"line": 296,
"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "88d67e2ef747"
"line": 55,
"message": "ast-types appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "27edcbb2b4f8"
},
{
"rule": "catalog-violations",
"line": 254,
"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "69d6fa7e46f9"
"line": 56,
"message": "esprima-next appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "75058f9a4d30"
},
{
"rule": "catalog-violations",
"line": 270,
"message": "cheerio appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8cd029bb871e"
},
{
"rule": "catalog-violations",
"line": 280,
"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "26f20ebea4b1"
},
{
"rule": "catalog-violations",
"line": 286,
"message": "mongodb appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "46cb48884e22"
},
{
"rule": "catalog-violations",
"line": 290,
"message": "pdf-parse appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "0c7d44a9c2e4"
"line": 57,
"message": "recast appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "5f2b50fef19d"
}
],
"packages/testing/janitor/package.json": [
{
"rule": "catalog-violations",
"line": 39,
"line": 36,
"message": "ts-morph@>=20.0.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "4a2907301983"
}
@@ -214,37 +300,11 @@
"packages/frontend/@n8n/storybook/package.json": [
{
"rule": "catalog-violations",
"line": 31,
"line": 32,
"message": "@types/node@^24.10.1 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "50fb70481f8f"
}
],
"packages/@n8n/node-cli/src/template/templates/declarative/custom/template/package.json": [
{
"rule": "catalog-violations",
"line": 40,
"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "c55e0c75d586"
},
{
"rule": "catalog-violations",
"line": 43,
"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "999c932ac3ae"
},
{
"rule": "catalog-violations",
"line": 46,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "2f772d0b5a09"
},
{
"rule": "catalog-violations",
"line": 41,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "6ded3ee6fafe"
}
],
"packages/@n8n/node-cli/src/template/templates/declarative/github-issues/template/package.json": [
{
"rule": "catalog-violations",
@@ -260,15 +320,41 @@
},
{
"rule": "catalog-violations",
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "4514689aef5c"
"line": 44,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "70fc7a306272"
},
{
"rule": "catalog-violations",
"line": 44,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "ce8e04a67c4c"
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "4514689aef5c"
}
],
"packages/@n8n/node-cli/src/template/templates/declarative/custom/template/package.json": [
{
"rule": "catalog-violations",
"line": 40,
"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "c55e0c75d586"
},
{
"rule": "catalog-violations",
"line": 43,
"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
"hash": "999c932ac3ae"
},
{
"rule": "catalog-violations",
"line": 41,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "4268f09633aa"
},
{
"rule": "catalog-violations",
"line": 46,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "2f772d0b5a09"
}
],
"packages/@n8n/node-cli/src/template/templates/programmatic/example/template/package.json": [
@@ -286,15 +372,15 @@
},
{
"rule": "catalog-violations",
"line": 46,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "fd2577d9c87b"
"line": 41,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "0c7bd1cbf6cb"
},
{
"rule": "catalog-violations",
"line": 41,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "a931f101c8a0"
"line": 46,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "fd2577d9c87b"
}
],
"packages/@n8n/node-cli/src/template/templates/programmatic/ai/memory-custom/template/package.json": [
@@ -312,15 +398,15 @@
},
{
"rule": "catalog-violations",
"line": 47,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "42aefb6c9989"
"line": 42,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "b7f8b2a358d8"
},
{
"rule": "catalog-violations",
"line": 42,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "cf4f2ca88b59"
"line": 47,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "42aefb6c9989"
}
],
"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-ai-custom/template/package.json": [
@@ -338,15 +424,15 @@
},
{
"rule": "catalog-violations",
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "e1734c74601d"
"line": 44,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "f10c6c40e67c"
},
{
"rule": "catalog-violations",
"line": 44,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "2a2dea670608"
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "e1734c74601d"
}
],
"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-ai-custom-example/template/package.json": [
@@ -364,15 +450,15 @@
},
{
"rule": "catalog-violations",
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "91b58c718e73"
"line": 44,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "030ae6daa9ec"
},
{
"rule": "catalog-violations",
"line": 44,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "83b610ec607a"
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "91b58c718e73"
}
],
"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-openai-compatible/template/package.json": [
@@ -390,89 +476,119 @@
},
{
"rule": "catalog-violations",
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "6b5e714159dc"
"line": 44,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "cd6a1b0be867"
},
{
"rule": "catalog-violations",
"line": 44,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "ba672d26d64d"
"line": 49,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "6b5e714159dc"
}
],
"packages/cli/package.json": [
{
"rule": "catalog-violations",
"line": 97,
"line": 98,
"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "1e3686e1923b"
},
{
"rule": "catalog-violations",
"line": 132,
"line": 139,
"message": "@opentelemetry/sdk-trace-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "1cf7f6bcf5d1"
},
{
"rule": "catalog-violations",
"line": 140,
"message": "@opentelemetry/sdk-trace-node appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "a3dad0b8dc21"
},
{
"rule": "catalog-violations",
"line": 142,
"line": 150,
"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "949e802528f7"
},
{
"rule": "catalog-violations",
"line": 193,
"line": 202,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "dee51c035f89"
},
{
"rule": "catalog-violations",
"line": 209,
"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "5b7e9b03fb10"
},
{
"rule": "catalog-violations",
"line": 200,
"line": 217,
"message": "undici appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "91c29775e961"
},
{
"rule": "catalog-violations",
"line": 203,
"line": 220,
"message": "ws appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "cd07242e8163"
},
{
"rule": "catalog-violations",
"line": 75,
"message": "@types/psl appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "6e62e0076b0a"
}
],
"packages/@n8n/instance-ai/package.json": [
{
"rule": "catalog-violations",
"line": 56,
"line": 78,
"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "5b2153508e47"
},
{
"rule": "catalog-violations",
"line": 37,
"line": 84,
"message": "@types/psl appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "56dabb51b433"
},
{
"rule": "catalog-violations",
"line": 55,
"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8fa6b9a8fc91"
},
{
"rule": "catalog-violations",
"line": 47,
"line": 62,
"message": "csv-parse appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8f082fc2e8b6"
},
{
"rule": "catalog-violations",
"line": 69,
"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "9a9d97065952"
},
{
"rule": "catalog-violations",
"line": 59,
"line": 85,
"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "12e346c47b39"
},
{
"rule": "catalog-violations",
"line": 31,
"line": 49,
"message": "@joplin/turndown-plugin-gfm appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "a3cf1504b5c2"
},
{
"rule": "catalog-violations",
"line": 46,
"line": 66,
"message": "pdf-parse appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "283fa9114c03"
}
@@ -500,55 +616,61 @@
"packages/nodes-base/package.json": [
{
"rule": "catalog-violations",
"line": 908,
"line": 911,
"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "2d1fab7a5b05"
},
{
"rule": "catalog-violations",
"line": 958,
"line": 961,
"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "2daf37aa14e4"
},
{
"rule": "catalog-violations",
"line": 963,
"line": 966,
"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "3f93c404ae9c"
},
{
"rule": "catalog-violations",
"line": 897,
"line": 900,
"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "ca4ac788adc6"
},
{
"rule": "catalog-violations",
"line": 909,
"line": 912,
"message": "cheerio appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "1a1b5bbc50c9"
},
{
"rule": "catalog-violations",
"line": 914,
"line": 915,
"message": "csv-parse appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "781db4a1e068"
},
{
"rule": "catalog-violations",
"line": 917,
"message": "eventsource appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "9795e6c6d9e9"
},
{
"rule": "catalog-violations",
"line": 927,
"line": 930,
"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "02341f2b5e3e"
},
{
"rule": "catalog-violations",
"line": 938,
"line": 941,
"message": "mongodb appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "f688907d087a"
},
{
"rule": "catalog-violations",
"line": 889,
"line": 892,
"message": "eslint-plugin-n8n-nodes-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "ac254baa61f9"
}
@@ -560,6 +682,12 @@
"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "bd9a2eeb072b"
},
{
"rule": "catalog-violations",
"line": 90,
"message": "prettier appears in 10 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
"hash": "1d2d6bb68778"
},
{
"rule": "catalog-violations",
"line": 92,
@@ -568,15 +696,15 @@
},
{
"rule": "catalog-violations",
"line": 90,
"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8a66e00b94fa"
"line": 77,
"message": "esprima-next appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "62156c2613b2"
}
],
"packages/@n8n/scan-community-package/package.json": [
{
"rule": "catalog-violations",
"line": 15,
"line": 20,
"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "ac0e4301d694"
}
@@ -584,19 +712,19 @@
"packages/@n8n/ai-utilities/package.json": [
{
"rule": "catalog-violations",
"line": 57,
"line": 69,
"message": "undici appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "c14cd05614e8"
},
{
"rule": "catalog-violations",
"line": 53,
"line": 65,
"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "884a45bdbcf2"
},
{
"rule": "catalog-violations",
"line": 60,
"line": 72,
"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "717de3a58c50"
}
@@ -604,37 +732,37 @@
"packages/@n8n/mcp-browser/package.json": [
{
"rule": "catalog-violations",
"line": 37,
"line": 36,
"message": "ws appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "9650c1b55f3c"
},
{
"rule": "catalog-violations",
"line": 31,
"line": 28,
"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "0c97891a24f4"
},
{
"rule": "catalog-violations",
"line": 32,
"line": 30,
"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "8466b03b1044"
},
{
"rule": "catalog-violations",
"line": 36,
"line": 35,
"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "f23a9d3d7aa2"
},
{
"rule": "catalog-violations",
"line": 44,
"line": 42,
"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "3f9e46e56803"
},
{
"rule": "catalog-violations",
"line": 29,
"line": 26,
"message": "@joplin/turndown-plugin-gfm appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "743e3a7dbb32"
}
@@ -658,7 +786,7 @@
"packages/@n8n/computer-use/package.json": [
{
"rule": "catalog-violations",
"line": 44,
"line": 47,
"message": "eventsource appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
"hash": "f50c1eee2ed6"
}
+56 -1
View File
@@ -101,9 +101,64 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node .github/scripts/quality/check-pr-size.mjs
changes:
name: Detect Changes
if: github.event_name == 'pull_request' || github.event_name == 'merge_group'
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
outputs:
janitor: ${{ fromJSON(steps.filter.outputs.results).janitor == true }}
code-health: ${{ fromJSON(steps.filter.outputs.results)['code-health'] == true }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Detect changed paths
id: filter
uses: ./.github/actions/ci-filter
with:
mode: filter
filters: |
janitor:
packages/testing/playwright/**
packages/testing/janitor/**
code-health:
**/package.json
pnpm-workspace.yaml
.code-health-baseline.json
packages/testing/code-health/**
check-static-analysis:
name: Static Analysis
needs: changes
if: |
github.event_name == 'merge_group' ||
needs.changes.outputs.code-health == 'true' ||
needs.changes.outputs.janitor == 'true'
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Node.js
uses: ./.github/actions/setup-nodejs
with:
build-command: pnpm turbo run build --filter=@n8n/code-health --filter=@n8n/playwright-janitor
- name: Run code-health
if: github.event_name == 'merge_group' || needs.changes.outputs.code-health == 'true'
run: pnpm --filter=@n8n/code-health check
- name: Run janitor
if: ${{ !cancelled() && (github.event_name == 'merge_group' || needs.changes.outputs.janitor == 'true') }}
run: pnpm --filter=n8n-playwright janitor
required-pr-quality-checks:
name: Required PR Quality Checks
needs: [check-ownership-checkbox, check-pr-size]
needs: [check-ownership-checkbox, check-pr-size, check-static-analysis]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 5
@@ -12,6 +12,7 @@
"dist"
],
"scripts": {
"check": "tsx src/cli.ts",
"build": "tsc -p tsconfig.build.json",
"dev": "tsc --watch",
"test": "vitest run",
+271 -201
View File
@@ -1,7 +1,7 @@
{
"version": 1,
"generated": "2026-04-08T13:49:08.611Z",
"totalViolations": 405,
"generated": "2026-05-12T08:06:17.170Z",
"totalViolations": 416,
"violations": {
"pages/AIAssistantPage.ts": [
{
@@ -41,29 +41,21 @@
"hash": "0d4d5092768f"
}
],
"pages/AIBuilderPage.ts": [
"pages/InstanceAiPage.ts": [
{
"rule": "scope-lockdown",
"line": 8,
"message": "AIBuilderPage: Ambiguous page - add a container (for scoped components) or a navigation method (for top-level pages)",
"hash": "37ad1e349434"
}
],
"pages/InteractionsPage.ts": [
"line": 85,
"message": "InstanceAiPage: Unscoped locator - use this.container instead of this.page",
"hash": "713916b2be0f"
},
{
"rule": "scope-lockdown",
"line": 6,
"message": "InteractionsPage: Ambiguous page - add a container (for scoped components) or a navigation method (for top-level pages)",
"hash": "02f0790cba2a"
"line": 130,
"message": "InstanceAiPage: Unscoped locator - use this.container instead of this.page",
"hash": "713916b2be0f"
}
],
"pages/NodeDetailsViewPage.ts": [
{
"rule": "scope-lockdown",
"line": 34,
"message": "NodeDetailsViewPage: Unscoped locator - use this.container instead of this.page",
"hash": "4087a9cf20cb"
},
{
"rule": "scope-lockdown",
"line": 38,
@@ -78,7 +70,13 @@
},
{
"rule": "scope-lockdown",
"line": 114,
"line": 46,
"message": "NodeDetailsViewPage: Unscoped locator - use this.container instead of this.page",
"hash": "4087a9cf20cb"
},
{
"rule": "scope-lockdown",
"line": 118,
"message": "NodeDetailsViewPage: Unscoped locator - use this.container instead of this.page",
"hash": "4087a9cf20cb"
},
@@ -285,122 +283,60 @@
"line": 883,
"message": "NodeDetailsViewPage: Unscoped locator - use this.container instead of this.page",
"hash": "4087a9cf20cb"
},
{
"rule": "dead-code",
"line": 942,
"message": "Unused method: NodeDetailsViewPage.getAddOptionDropdown()",
"hash": "a3acba0a44bc"
}
],
"pages/NotificationsPage.ts": [
{
"rule": "scope-lockdown",
"line": 3,
"message": "NotificationsPage: Ambiguous page - add a container (for scoped components) or a navigation method (for top-level pages)",
"hash": "de71d54deec0"
}
],
"pages/SidebarPage.ts": [
{
"rule": "scope-lockdown",
"line": 31,
"line": 23,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 35,
"line": 43,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 39,
"line": 47,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 44,
"line": 98,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 44,
"line": 102,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 45,
"line": 115,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 45,
"line": 123,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 50,
"line": 131,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 50,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 51,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 51,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 68,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 72,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 85,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 93,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 101,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
},
{
"rule": "scope-lockdown",
"line": 109,
"line": 139,
"message": "SidebarPage: Unscoped locator - use this.container instead of this.page",
"hash": "b15fa9cfe2ac"
}
@@ -499,36 +435,28 @@
"hash": "0de6cf556dcf"
}
],
"pages/nodes/EditFieldsNode.ts": [
{
"rule": "scope-lockdown",
"line": 5,
"message": "EditFieldsNode: Ambiguous page - add a container (for scoped components) or a navigation method (for top-level pages)",
"hash": "7db586b8b01c"
}
],
"composables/WorkflowComposer.ts": [
{
"rule": "selector-purity",
"line": 155,
"line": 137,
"message": "Direct page locator call: this.n8n.page.getByTestId('move-to-folder-option').getByT...",
"hash": "976ff11703b6"
},
{
"rule": "selector-purity",
"line": 155,
"line": 137,
"message": "Direct page locator call: this.n8n.page.getByTestId('move-to-folder-option')",
"hash": "abb175fbdb8c"
},
{
"rule": "no-page-in-flow",
"line": 21,
"line": 20,
"message": "Direct page access in composable: this.n8n.page.waitForResponse",
"hash": "652001b1476b"
},
{
"rule": "no-page-in-flow",
"line": 155,
"line": 137,
"message": "Direct page access in composable: this.n8n.page.getByTestId",
"hash": "8fce14c01c57"
}
@@ -816,43 +744,43 @@
"tests/e2e/node-creator/categories.spec.ts": [
{
"rule": "selector-purity",
"line": 25,
"line": 27,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Triggers').locato...",
"hash": "606eea72385e"
},
{
"rule": "selector-purity",
"line": 28,
"line": 30,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Actions').locator...",
"hash": "c101ff91c020"
},
{
"rule": "selector-purity",
"line": 34,
"line": 36,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Actions').locator...",
"hash": "c101ff91c020"
},
{
"rule": "selector-purity",
"line": 49,
"line": 51,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Actions').locator...",
"hash": "c101ff91c020"
},
{
"rule": "selector-purity",
"line": 55,
"line": 57,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Actions').locator...",
"hash": "c101ff91c020"
},
{
"rule": "selector-purity",
"line": 61,
"line": 63,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Triggers').locato...",
"hash": "606eea72385e"
},
{
"rule": "selector-purity",
"line": 66,
"line": 68,
"message": "Chained locator call in test: n8n.canvas.nodeCreator.getCategoryItem('Triggers').locato...",
"hash": "606eea72385e"
}
@@ -1106,7 +1034,7 @@
},
{
"rule": "selector-purity",
"line": 211,
"line": 263,
"message": "Direct page locator call: n8n.page.getByText('Project Persisted Project Name saved ...",
"hash": "9d14d3ddd7f7"
}
@@ -1953,6 +1881,32 @@
"hash": "0eb6824192ab"
}
],
"tests/e2e/workflows/editor/workflow-actions/archive.spec.ts": [
{
"rule": "selector-purity",
"line": 44,
"message": "Direct page locator call: n8n.page.getByTestId('node-creator-plus-button')",
"hash": "2b61afc80039"
},
{
"rule": "selector-purity",
"line": 55,
"message": "Direct page locator call: n8n.page.getByTestId('execute-node-button')",
"hash": "af9330ed3874"
},
{
"rule": "selector-purity",
"line": 56,
"message": "Direct page locator call: n8n.page.getByTestId('delete-node-button')",
"hash": "01554562f936"
},
{
"rule": "selector-purity",
"line": 57,
"message": "Direct page locator call: n8n.page.getByTestId('disable-node-button')",
"hash": "4f683821335f"
}
],
"tests/e2e/workflows/editor/workflow-actions/settings.spec.ts": [
{
"rule": "selector-purity",
@@ -2114,99 +2068,87 @@
"tests/e2e/workflows/executions/list.spec.ts": [
{
"rule": "selector-purity",
"line": 52,
"line": 51,
"message": "Direct page locator call: n8n.page.getByRole('option', { name: 'Success' }).click()",
"hash": "b6e254523b81"
},
{
"rule": "selector-purity",
"line": 52,
"line": 51,
"message": "Direct page locator call: n8n.page.getByRole('option', { name: 'Success' })",
"hash": "553272ee7950"
},
{
"rule": "selector-purity",
"line": 197,
"line": 196,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 238,
"line": 237,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 241,
"line": 240,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 244,
"line": 243,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 247,
"line": 246,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 250,
"line": 249,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 253,
"line": 252,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 256,
"line": 255,
"message": "Chained locator call in test: iframe.locator('body')",
"hash": "6b73753fc26c"
},
{
"rule": "selector-purity",
"line": 323,
"line": 325,
"message": "Direct page locator call: n8n.page.getByTestId('workflow-execution-no-trigger-conte...",
"hash": "9f1081df0a8a"
},
{
"rule": "selector-purity",
"line": 325,
"line": 327,
"message": "Direct page locator call: n8n.page.getByRole('button', { name: 'Add first step' })....",
"hash": "3b12669e6a7f"
},
{
"rule": "selector-purity",
"line": 325,
"line": 327,
"message": "Direct page locator call: n8n.page.getByRole('button', { name: 'Add first step' })",
"hash": "ff575079b421"
},
{
"rule": "selector-purity",
"line": 331,
"line": 333,
"message": "Direct page locator call: n8n.page.getByTestId('workflow-execution-no-content')",
"hash": "10cc160abd6b"
},
{
"rule": "api-purity",
"line": 273,
"message": "Raw API call detected: request.post(",
"hash": "307c2b28449d"
},
{
"rule": "api-purity",
"line": 289,
"message": "Raw API call detected: request.get(",
"hash": "f27339291410"
}
],
"composables/BuilderWizardComposer.ts": [
@@ -2327,6 +2269,98 @@
"hash": "a4b289961490"
}
],
"tests/e2e/auth/token-exchange.spec.ts": [
{
"rule": "api-purity",
"line": 48,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 69,
"message": "Raw API call detected: request.get(",
"hash": "17c4932db849"
},
{
"rule": "api-purity",
"line": 87,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 98,
"message": "Raw API call detected: request.get(",
"hash": "17c4932db849"
},
{
"rule": "api-purity",
"line": 121,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 133,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 168,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 183,
"message": "Raw API call detected: request.get(",
"hash": "17c4932db849"
},
{
"rule": "api-purity",
"line": 208,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 223,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 238,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 256,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
},
{
"rule": "api-purity",
"line": 273,
"message": "Raw API call detected: request.get(",
"hash": "17c4932db849"
},
{
"rule": "api-purity",
"line": 285,
"message": "Raw API call detected: request.get(",
"hash": "17c4932db849"
},
{
"rule": "api-purity",
"line": 302,
"message": "Raw API call detected: request.post(",
"hash": "b424b14bc8c1"
}
],
"tests/e2e/building-blocks/workflow-entry-points.spec.ts": [
{
"rule": "api-purity",
@@ -2406,7 +2440,7 @@
"tests/e2e/workflows/editor/execution/logs.spec.ts": [
{
"rule": "api-purity",
"line": 275,
"line": 270,
"message": "Raw API call detected: request.get(",
"hash": "3783a2d87c82"
}
@@ -2437,12 +2471,24 @@
"hash": "0acea681877b"
}
],
"pages/CanvasPage.ts": [
"utils/benchmark/instance-ai-driver.ts": [
{
"rule": "deduplication",
"line": 79,
"message": "Duplicate locator: this.page.getByTestId(\"canvas-choice-prompt\") in pages scope",
"hash": "677879f95f57"
"rule": "dead-code",
"line": 263,
"message": "Unused method: InstanceAiDriver.deleteAllThreads()",
"hash": "84fa4accc8fa"
},
{
"rule": "dead-code",
"line": 302,
"message": "Unused method: InstanceAiDriver.measureHeap()",
"hash": "40ed597f87ba"
},
{
"rule": "dead-code",
"line": 307,
"message": "Unused method: InstanceAiDriver.snapshot()",
"hash": "70bd4d633512"
}
],
"pages/ChatHubSettingsPage.ts": [
@@ -2488,25 +2534,25 @@
"pages/WorkflowsPage.ts": [
{
"rule": "deduplication",
"line": 36,
"line": 40,
"message": "Duplicate locator: this.page.getByTestId(\"resources-list-search\") in pages scope",
"hash": "ec6324dc7eb8"
},
{
"rule": "deduplication",
"line": 117,
"line": 121,
"message": "Duplicate locator: this.page.getByTestId(\"action-toggle-dropdown\") in pages scope",
"hash": "0bcc0c5c11f6"
},
{
"rule": "deduplication",
"line": 32,
"line": 36,
"message": "Duplicate locator: this.page.getByTestId(\"project-name\") in pages scope",
"hash": "206b89bd1594"
},
{
"rule": "deduplication",
"line": 46,
"line": 50,
"message": "Duplicate locator: this.page.getByTestId(\"action-delete\") in pages scope",
"hash": "2f37cf533810"
}
@@ -2535,68 +2581,92 @@
"hash": "0da4699677e2"
}
],
"tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-300.spec.ts": [
"tests/e2e/instance-ai/instance-ai-timeline.spec.ts": [
{
"rule": "duplicate-logic",
"line": 13,
"message": "Duplicate test logic: \"30 nodes, 10KB payload, steady 300 msg/s\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "b2b06b5bf9cc"
"line": 11,
"message": "Duplicate test logic: \"should show artifact cards after workflow build completes\" has identical structure to tests/e2e/instance-ai/instance-ai-artifacts.spec.ts:\"should display artifact card in timeline after workflow build\"",
"hash": "da9226aef0eb"
}
],
"tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady.spec.ts": [
{
"rule": "duplicate-logic",
"line": 13,
"message": "Duplicate test logic: \"30 nodes, 10KB payload, steady 100 msg/s\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "523a788d9cb3"
}
],
"tests/infrastructure/benchmarks/kafka/load-60n-1kb-burst.spec.ts": [
{
"rule": "duplicate-logic",
"line": 13,
"message": "Duplicate test logic: \"60 nodes, 1KB payload, burst drain 10000 backlog\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "1fb8c721e201"
}
],
"tests/infrastructure/benchmarks/kafka/throughput-10n-100kb.spec.ts": [
{
"rule": "duplicate-logic",
"line": 19,
"message": "Duplicate test logic: \"10 nodes, 1KB payload, 100KB output/node, 5000 msgs\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "53c1e0072183"
}
],
"tests/infrastructure/benchmarks/kafka/throughput-10n-10kb.spec.ts": [
{
"rule": "duplicate-logic",
"line": 19,
"message": "Duplicate test logic: \"10 nodes, 10KB payload, 10KB output/node, 5000 msgs\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "fdf7b9dd7186"
}
],
"tests/infrastructure/benchmarks/kafka/throughput-30n-10kb.spec.ts": [
{
"rule": "duplicate-logic",
"line": 19,
"message": "Duplicate test logic: \"30 nodes, 10KB payload, 10KB output/node, 5000 msgs\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "3d757209f969"
}
],
"tests/infrastructure/benchmarks/kafka/throughput-60n-10kb.spec.ts": [
{
"rule": "duplicate-logic",
"line": 19,
"message": "Duplicate test logic: \"60 nodes, 10KB payload, 10KB output/node, 5000 msgs\" has identical structure to tests/infrastructure/benchmarks/kafka/load-30n-10kb-steady-200.spec.ts:\"30 nodes, 10KB payload, steady 200 msg/s\"",
"hash": "28822d0ca517"
}
],
"tests/infrastructure/benchmarks/webhook/throughput-sync.spec.ts": [
"tests/infrastructure/benchmarks/kafka/queue-mode-sustained-rate.spec.ts": [
{
"rule": "duplicate-logic",
"line": 17,
"message": "Duplicate test logic: \"sync: 10 nodes, 10KB payload, 10KB output/node, 50 connections, 60s\" has identical structure to tests/infrastructure/benchmarks/webhook/throughput-async.spec.ts:\"async: 10 nodes, 10KB payload, 10KB output/node, 50 connections, 60s\"",
"hash": "6481e87468af"
"message": "Duplicate test logic: \"Kafka trigger + 1 noop, 1KB payload, 250 msg/s × 240s (1 main + 1 worker)\" has identical structure to tests/infrastructure/benchmarks/kafka/burst-drain-capacity.spec.ts:\"Kafka trigger + 1 noop, 1KB payload, drain 100k preloaded backlog (1 main + 1 worker)\"",
"hash": "388616eecbaa"
}
],
"tests/infrastructure/benchmarks/kafka/single-instance-ceiling.spec.ts": [
{
"rule": "duplicate-logic",
"line": 17,
"message": "Duplicate test logic: \"Kafka trigger + 1 noop, 1KB payload, 150k msgs\" has identical structure to tests/infrastructure/benchmarks/kafka/burst-drain-capacity.spec.ts:\"Kafka trigger + 1 noop, 1KB payload, drain 100k preloaded backlog (1 main + 1 worker)\"",
"hash": "1c5033214063"
}
],
"tests/infrastructure/benchmarks/kafka/steady-rate-breaking-point.spec.ts": [
{
"rule": "duplicate-logic",
"line": 34,
"message": "Duplicate test logic: \"anonymous\" has identical structure to tests/infrastructure/benchmarks/kafka/burst-drain-capacity.spec.ts:\"Kafka trigger + 1 noop, 1KB payload, drain 100k preloaded backlog (1 main + 1 worker)\"",
"hash": "5579d3e330e1"
}
],
"tests/infrastructure/benchmarks/kafka/output-size-impact.spec.ts": [
{
"rule": "duplicate-logic",
"line": 25,
"message": "Duplicate test logic: \"anonymous\" has identical structure to tests/infrastructure/benchmarks/kafka/node-count-scaling.spec.ts:\"anonymous\"",
"hash": "d676f700b46d"
}
],
"tests/infrastructure/benchmarks/webhook/webhook-otel-overhead.spec.ts": [
{
"rule": "duplicate-logic",
"line": 26,
"message": "Duplicate test logic: \"anonymous\" has identical structure to tests/infrastructure/benchmarks/webhook/webhook-main-scaling.spec.ts:\"anonymous\"",
"hash": "61c8c9b0f1ff"
}
],
"tests/infrastructure/benchmarks/webhook/webhook-single-instance.spec.ts": [
{
"rule": "duplicate-logic",
"line": 27,
"message": "Duplicate test logic: \"anonymous\" has identical structure to tests/infrastructure/benchmarks/webhook/webhook-queue-baseline.spec.ts:\"anonymous\"",
"hash": "51d2d4fe3fdb"
}
],
"tests/infrastructure/benchmarks-local/instance-ai/thread-churn-delegation.spec.ts": [
{
"rule": "duplicate-logic",
"line": 24,
"message": "Duplicate test logic: \"heap returns to baseline after delegation rounds\" has identical structure to tests/infrastructure/benchmarks-local/instance-ai/thread-churn-datatables.spec.ts:\"heap returns to baseline after data table create/delete rounds\"",
"hash": "08c6be48273d"
}
],
"tests/infrastructure/benchmarks-local/instance-ai/thread-churn.spec.ts": [
{
"rule": "duplicate-logic",
"line": 17,
"message": "Duplicate test logic: \"heap returns to baseline after parallel build rounds\" has identical structure to tests/infrastructure/benchmarks-local/instance-ai/thread-churn-datatables.spec.ts:\"heap returns to baseline after data table create/delete rounds\"",
"hash": "3ac5475c5814"
}
],
"tests/infrastructure/benchmarks-local/instance-ai/cancel-abort.spec.ts": [
{
"rule": "no-direct-page-instantiation",
"line": 38,
"message": "Direct page instantiation: new InstanceAiPage(page)",
"hash": "4464b47c5e2c"
}
],
"tests/infrastructure/benchmarks-local/instance-ai/sse-reconnection.spec.ts": [
{
"rule": "no-direct-page-instantiation",
"line": 44,
"message": "Direct page instantiation: new InstanceAiPage(threadPage)",
"hash": "99e5606866b2"
}
]
}