diff --git a/frontend-modern/src/components/shared/AIOverviewTable.tsx b/frontend-modern/src/components/shared/AIOverviewTable.tsx index 872b1d6..0049800 100644 --- a/frontend-modern/src/components/shared/AIOverviewTable.tsx +++ b/frontend-modern/src/components/shared/AIOverviewTable.tsx @@ -271,6 +271,12 @@ export const AIOverviewTable: Component<{ showWhenEmpty?: boolean }> = (props) = : actionableRemediations.slice(0, ACTION_LIMIT); for (const rem of visibleRemediations) { + // Get the title - skip if it's just the generic fallback + const title = rem.summary || summarizeValue(rem.problem, rem.action); + if (title === 'Ran diagnostic' || title === 'Executed command') { + continue; // Skip generic fallbacks - not actionable + } + const outcomeBadgeClass: Record = { resolved: 'bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300', partial: 'bg-amber-100 text-amber-700 dark:bg-amber-900/40 dark:text-amber-300', @@ -282,7 +288,7 @@ export const AIOverviewTable: Component<{ showWhenEmpty?: boolean }> = (props) = type: 'impact', typeBadge: rem.outcome === 'resolved' ? 'Fixed' : rem.outcome === 'failed' ? 'Failed' : 'Action', typeBadgeClass: outcomeBadgeClass[rem.outcome] || 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-300', - title: rem.summary || summarizeValue(rem.problem, rem.action), // Use backend summary or fallback + title: title, subtitle: rem.resource_name || '', timestamp: formatRelativeTime(rem.timestamp), locked: false, @@ -291,6 +297,7 @@ export const AIOverviewTable: Component<{ showWhenEmpty?: boolean }> = (props) = } + // Changes - only show meaningful changes, not noise // Skip: created (just patrol discovering resources) // Skip: backed_up (backups have their own section, no need to duplicate here) diff --git a/internal/ai/baseline/store.go b/internal/ai/baseline/store.go index a8870f9..a158087 100644 --- a/internal/ai/baseline/store.go +++ b/internal/ai/baseline/store.go @@ -296,11 +296,12 @@ func (s *Store) CheckResourceAnomalies(resourceID string, metrics map[string]flo ratio := value / baseline.Mean // Filter out statistically significant but practically meaningless anomalies - // Users don't care about "1.0x baseline" or small deviations - // Require at least 50% deviation from baseline to report - if ratio >= 0.5 && ratio <= 1.5 { + // Users don't care about small deviations from baseline + // Require at least 2x above baseline OR 0.5x below to be truly actionable + if ratio >= 0.5 && ratio <= 2.0 { continue // Too close to baseline to be actionable } + report := AnomalyReport{ ResourceID: resourceID,