diff --git a/changelog.d/maintenance/vitest-ui-suite-green.md b/changelog.d/maintenance/vitest-ui-suite-green.md
new file mode 100644
index 0000000000..539058bd72
--- /dev/null
+++ b/changelog.d/maintenance/vitest-ui-suite-green.md
@@ -0,0 +1 @@
+- chore(tests): fix all 70 failing `test:vitest:ui` tests across 30 files (was advisory/parked) — root causes were 15 node:test-authored `.tsx` files never collected by vitest, a missing `window.matchMedia` jsdom polyfill, stale assertions against a redesigned BuildTab wizard / CompressionHub Phase-2 UI, and one obsolete test for a retired Plans screen; suite is now 158/158 files, 870/870 tests green (promotion to blocking is a follow-up)
diff --git a/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx b/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx
index a9165a7684..8b702028cd 100644
--- a/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx
+++ b/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx
@@ -5,6 +5,8 @@ import { useTranslations } from "next-intl";
import Link from "next/link";
import type { SearchProviderCatalogItem } from "@/shared/schemas/searchTools";
+const MAX_COMPARE_PROVIDERS = 4; // D22: cap at 4 providers running in parallel
+
export interface CompareResult {
provider: string;
latency: number;
@@ -69,12 +71,15 @@ export default function CompareTab({ providers, onMetrics }: CompareTabProps) {
const toggleProvider = useCallback((id: string) => {
setSelectedProviderIds((prev) => {
if (prev.includes(id)) return prev.filter((p) => p !== id);
+ if (prev.length >= MAX_COMPARE_PROVIDERS) return prev;
return [...prev, id];
});
}, []);
const selectAll = useCallback(() => {
- setSelectedProviderIds(activeSearchProviders.map((p) => p.id));
+ setSelectedProviderIds(
+ activeSearchProviders.slice(0, MAX_COMPARE_PROVIDERS).map((p) => p.id)
+ );
}, [activeSearchProviders]);
const clearAll = useCallback(() => {
@@ -230,7 +235,7 @@ export default function CompareTab({ providers, onMetrics }: CompareTabProps) {
- {/* Provider picker — no cap */}
+ {/* Provider picker — capped at MAX_COMPARE_PROVIDERS (D22) */}
@@ -253,9 +258,15 @@ export default function CompareTab({ providers, onMetrics }: CompareTabProps) {
+ {selectedProviderIds.length >= MAX_COMPARE_PROVIDERS && (
+
+ Maximum of {MAX_COMPARE_PROVIDERS} providers can be compared at once.
+
+ )}
{activeSearchProviders.map((p) => {
const selected = selectedProviderIds.includes(p.id);
+ const atCap = !selected && selectedProviderIds.length >= MAX_COMPARE_PROVIDERS;
return (