diff --git a/resources/views/livewire/summary/index.blade.php b/resources/views/livewire/summary/index.blade.php
index 77844e8..3467b75 100644
--- a/resources/views/livewire/summary/index.blade.php
+++ b/resources/views/livewire/summary/index.blade.php
@@ -247,11 +247,16 @@ class="cursor-pointer"
@php
$devlogicSuites = ['softbench', 'prosebench', 'psychbench', 'depthsweep'];
$sysopsSuites = ['infrabench', 'scenariobench'];
- $devlogicRows = $session->suites->filter(fn ($r) => in_array($r->suite, $devlogicSuites));
- $sysopsRows = $session->suites->filter(fn ($r) => in_array($r->suite, $sysopsSuites));
+ $suiteFilterActive = ! empty($this->filters['suite']);
+ $visibleSuites = $suiteFilterActive
+ ? $session->suites->filter(fn ($r) => in_array($r->suite, $this->filters['suite'], true))
+ : $session->suites;
+ $devlogicRows = $visibleSuites->filter(fn ($r) => in_array($r->suite, $devlogicSuites));
+ $sysopsRows = $visibleSuites->filter(fn ($r) => in_array($r->suite, $sysopsSuites));
@endphp
{{-- Devlogic section: total strip + column headers + suite rows --}}
- @if ($devlogicRows->isNotEmpty() && $session->band->devlogic_tps !== null)
+ @if ($devlogicRows->isNotEmpty() && ($suiteFilterActive || $session->band->devlogic_tps !== null))
+ @unless ($suiteFilterActive)
{{ __('Devlogic total') }}
@@ -267,6 +272,7 @@ class="cursor-pointer"
✘ {{ $session->band->devlogic_failed }}
+ @endunless
{{ __('Benchmark') }}
{{ __('Thinking') }}
@@ -308,7 +314,8 @@ class="flex flex-wrap items-center gap-x-4 gap-y-1 px-4 py-2.5 hover:bg-zinc-50
@endif
{{-- Sysops section: total strip + column headers + suite rows --}}
- @if ($sysopsRows->isNotEmpty() && $session->band->sysops_tps !== null)
+ @if ($sysopsRows->isNotEmpty() && ($suiteFilterActive || $session->band->sysops_tps !== null))
+ @unless ($suiteFilterActive)
{{ __('Sysops total') }}
@@ -324,6 +331,7 @@ class="flex flex-wrap items-center gap-x-4 gap-y-1 px-4 py-2.5 hover:bg-zinc-50
✘ {{ $session->band->sysops_failed }}
+ @endunless
{{ __('Benchmark') }}
{{ __('Thinking') }}
diff --git a/tests/Feature/SessionSummaryTest.php b/tests/Feature/SessionSummaryTest.php
index ddd242f..3eed646 100644
--- a/tests/Feature/SessionSummaryTest.php
+++ b/tests/Feature/SessionSummaryTest.php
@@ -278,3 +278,79 @@
$component->call('toggleFilter', 'suite', 'infrabench')
->assertSet('filters.suite', []);
});
+
+test('suite filter hides non-selected suite rows and category totals within matching bands', function () {
+ $me = User::factory()->create();
+
+ // One band containing both softbench (devlogic) and infrabench (sysops).
+ $soft = BenchmarkRun::factory()->create([
+ 'run_id' => 'RUN-SOFT-001',
+ 'suite' => 'softbench', 'label' => 'mixed-band', 'model_id' => 'm', 'model_quant' => 'Q5_K_M',
+ 'gpu' => 'GPU1', 'gpu_count' => 1, 'engine' => 'llama.cpp', 'user_id' => $me->id, 'visibility' => 'public',
+ 'ran_at' => '2026-09-03 12:00:00',
+ ]);
+ SoftbenchResult::factory()->create(['benchmark_run_id' => $soft->id, 'ok' => true, 'user_tps' => 50.0, 'total' => 100, 'level' => 'off']);
+
+ $infra = BenchmarkRun::factory()->create([
+ 'run_id' => 'RUN-INFRA-001',
+ 'suite' => 'infrabench', 'label' => 'mixed-band', 'model_id' => 'm', 'model_quant' => 'Q5_K_M',
+ 'gpu' => 'GPU1', 'gpu_count' => 1, 'engine' => 'llama.cpp', 'user_id' => $me->id, 'visibility' => 'public',
+ 'ran_at' => '2026-09-03 12:05:00',
+ ]);
+ InfrabenchResult::factory()->create(['benchmark_run_id' => $infra->id, 'ok' => true, 'user_tps' => 30.0, 'total' => 100, 'level' => 'low']);
+
+ Artisan::call('festbench:summary');
+
+ // No suite filter: both suite rows and both category totals visible.
+ Volt::test('summary.index')
+ ->assertSee('mixed-band')
+ ->assertSee('RUN-SOFT-001')
+ ->assertSee('RUN-INFRA-001')
+ ->assertSee('Devlogic total')
+ ->assertSee('Sysops total');
+
+ // Filter to infrabench: band still shows, but only the infrabench row
+ // is rendered and both category total strips are hidden.
+ Volt::test('summary.index', ['filters' => [
+ 'gpu' => [], 'model' => [], 'quant' => [], 'engine' => [], 'suite' => ['infrabench'],
+ ]])
+ ->assertSee('mixed-band')
+ ->assertSee('RUN-INFRA-001')
+ ->assertDontSee('RUN-SOFT-001')
+ ->assertDontSee('Devlogic total')
+ ->assertDontSee('Sysops total');
+});
+
+test('clearing the suite filter restores all suite rows and category totals', function () {
+ $me = User::factory()->create();
+
+ $soft = BenchmarkRun::factory()->create([
+ 'run_id' => 'RUN-SOFT-002',
+ 'suite' => 'softbench', 'label' => 'mixed-band', 'model_id' => 'm', 'model_quant' => 'Q5_K_M',
+ 'gpu' => 'GPU1', 'gpu_count' => 1, 'engine' => 'llama.cpp', 'user_id' => $me->id, 'visibility' => 'public',
+ 'ran_at' => '2026-09-03 12:00:00',
+ ]);
+ SoftbenchResult::factory()->create(['benchmark_run_id' => $soft->id, 'ok' => true, 'user_tps' => 50.0, 'total' => 100, 'level' => 'off']);
+
+ $infra = BenchmarkRun::factory()->create([
+ 'run_id' => 'RUN-INFRA-002',
+ 'suite' => 'infrabench', 'label' => 'mixed-band', 'model_id' => 'm', 'model_quant' => 'Q5_K_M',
+ 'gpu' => 'GPU1', 'gpu_count' => 1, 'engine' => 'llama.cpp', 'user_id' => $me->id, 'visibility' => 'public',
+ 'ran_at' => '2026-09-03 12:05:00',
+ ]);
+ InfrabenchResult::factory()->create(['benchmark_run_id' => $infra->id, 'ok' => true, 'user_tps' => 30.0, 'total' => 100, 'level' => 'low']);
+
+ Artisan::call('festbench:summary');
+
+ $component = Volt::test('summary.index', ['filters' => [
+ 'gpu' => [], 'model' => [], 'quant' => [], 'engine' => [], 'suite' => ['infrabench'],
+ ]])
+ ->assertSee('RUN-INFRA-002')
+ ->assertDontSee('RUN-SOFT-002');
+
+ $component->call('resetFilters')
+ ->assertSee('RUN-SOFT-002')
+ ->assertSee('RUN-INFRA-002')
+ ->assertSee('Devlogic total')
+ ->assertSee('Sysops total');
+});