diff --git a/packages/frontend/@n8n/design-system/src/components/N8nIcon/icons.ts b/packages/frontend/@n8n/design-system/src/components/N8nIcon/icons.ts
index 91cae049f21..e7bb7647506 100644
--- a/packages/frontend/@n8n/design-system/src/components/N8nIcon/icons.ts
+++ b/packages/frontend/@n8n/design-system/src/components/N8nIcon/icons.ts
@@ -56,6 +56,7 @@ import IconLucideAtSign from '~icons/lucide/at-sign';
import IconLucideBadgeCheck from '~icons/lucide/badge-check';
import IconLucideBan from '~icons/lucide/ban';
import IconLucideBell from '~icons/lucide/bell';
+import IconLucideBlocks from '~icons/lucide/blocks';
import IconLucideBold from '~icons/lucide/bold';
import IconLucideBook from '~icons/lucide/book';
import IconLucideBookOpen from '~icons/lucide/book-open';
@@ -132,6 +133,7 @@ import IconLucideFolder from '~icons/lucide/folder';
import IconLucideFolderOpen from '~icons/lucide/folder-open';
import IconLucideFolderPlus from '~icons/lucide/folder-plus';
import IconLucideFunnel from '~icons/lucide/funnel';
+import IconLucideGauge from '~icons/lucide/gauge';
import IconLucideGem from '~icons/lucide/gem';
import IconLucideGift from '~icons/lucide/gift';
import IconLucideGitBranch from '~icons/lucide/git-branch';
@@ -549,6 +551,7 @@ export const updatedIconSet = {
ban: IconLucideBan,
'badge-check': IconLucideBadgeCheck,
bell: IconLucideBell,
+ blocks: IconLucideBlocks,
bold: IconLucideBold,
book: IconLucideBook,
'book-open': IconLucideBookOpen,
@@ -622,6 +625,7 @@ export const updatedIconSet = {
'folder-open': IconLucideFolderOpen,
'folder-plus': IconLucideFolderPlus,
funnel: IconLucideFunnel,
+ gauge: IconLucideGauge,
gem: IconLucideGem,
gift: IconLucideGift,
'git-branch': IconLucideGitBranch,
diff --git a/packages/frontend/@n8n/i18n/src/locales/en.json b/packages/frontend/@n8n/i18n/src/locales/en.json
index 5e754ae52db..b7869a0fa3e 100644
--- a/packages/frontend/@n8n/i18n/src/locales/en.json
+++ b/packages/frontend/@n8n/i18n/src/locales/en.json
@@ -3741,6 +3741,7 @@
"nodeIssues.credentials.doNotExist.hint": "You can create credentials with the exact name and then they get auto-selected on refresh..",
"nodeIssues.credentials.notIdentified": "Credentials with name {name} exist for {type}.",
"nodeIssues.credentials.notIdentified.hint": "Credentials are not clearly identified. Please select the correct credentials.",
+ "nodeIssues.credentials.privateNotConnected": "'{name}' private credential is not connected for you. Connect yours to execute this step manually.",
"nodeIssues.credentials.privateRequiresManualTrigger": "Private credentials only work in manually triggered workflows. Change the trigger to a Manual trigger, or switch this credential to Static.",
"nodeIssues.input.missing": "No node connected to required input \"{inputName}\"",
"ndv.trigger.moreInfo": "More info",
@@ -5439,6 +5440,15 @@
"evaluations.wizardSidepanel.step3.outputPlaceholder": "Run the evaluation to view the captured output.",
"evaluations.wizardSidepanel.step3.noRun": "Run the evaluation to see results.",
"evaluations.wizardSidepanel.hydrate.error": "Couldn’t load your previous setup. Starting with a blank wizard.",
+ "evaluations.emptyState.title": "Evaluations",
+ "evaluations.emptyState.description": "Evals are automated tests that evaluate agent workflow outputs using model-graded checks.",
+ "evaluations.emptyState.catchIssues.title": "Catch issues early",
+ "evaluations.emptyState.catchIssues.description": "Spot failures and unexpected behaviour before going live.",
+ "evaluations.emptyState.buildConfidence.title": "Build with confidence",
+ "evaluations.emptyState.buildConfidence.description": "Make changes and iterate without relying on guesswork.",
+ "evaluations.emptyState.measurePerformance.title": "Measure performance",
+ "evaluations.emptyState.measurePerformance.description": "Track performance and areas for improvement in workflows.",
+ "evaluations.emptyState.getStarted": "Get started",
"evaluations.wizardSidepanel.customCheck.title": "Custom check",
"evaluations.wizardSidepanel.customCheck.name": "Name",
"evaluations.wizardSidepanel.customCheck.name.placeholder": "My custom check",
@@ -5827,6 +5837,7 @@
"instanceAi.settings.sandboxTimeout.label": "Sandbox timeout (ms)",
"instanceAi.settings.searchCredential.label": "Search credential",
"instanceAi.settings.subAgentMaxSteps.label": "Sub-agent max steps",
+ "instanceAi.settings.browserMcp.label": "Chrome DevTools MCP",
"instanceAi.settings.mcpServers.label": "MCP servers",
"instanceAi.settings.mcpServers.placeholder": "name=url, comma-separated",
"instanceAi.settings.section.permissions": "Permissions",
diff --git a/packages/frontend/editor-ui/src/__tests__/setup.ts b/packages/frontend/editor-ui/src/__tests__/setup.ts
index 278bbf015da..0f475de6ae2 100644
--- a/packages/frontend/editor-ui/src/__tests__/setup.ts
+++ b/packages/frontend/editor-ui/src/__tests__/setup.ts
@@ -467,11 +467,21 @@ XMLHttpRequest.prototype.send = function (this: XMLHttpRequest) {
// broad filter would mask that signal. Sibling to the rAF polyfill (DEVP-201,
// DEVP-206) and the XHR short-circuit above — both narrow harness defences
// against Vitest 4's post-teardown rejection promotion.
+//
+// Match BOTH module and non-module SCSS style blocks. `@vitejs/plugin-vue`
+// emits `
diff --git a/packages/frontend/editor-ui/src/features/ai/evaluation.ee/views/EvaluationsRootView.vue b/packages/frontend/editor-ui/src/features/ai/evaluation.ee/views/EvaluationsRootView.vue
index 74e71c8aaae..536e2c43e19 100644
--- a/packages/frontend/editor-ui/src/features/ai/evaluation.ee/views/EvaluationsRootView.vue
+++ b/packages/frontend/editor-ui/src/features/ai/evaluation.ee/views/EvaluationsRootView.vue
@@ -1,7 +1,7 @@