@@ -12,7 +12,6 @@ struct LiveTailView: View {
12 @State private var sortAscending = false
12 @State private var sortAscending = false
13 @State private var columnWidths: [String: CGFloat] = [:]
13 @State private var columnWidths: [String: CGFloat] = [:]
14 @State private var cachedSorted: [LiveTailViewModel.LiveTailEntry] = []
14 @State private var cachedSorted: [LiveTailViewModel.LiveTailEntry] = []
15− @State private var cachedSeverities: [SeverityLevel] = []
16 @State private var severityColumnSet: Set<String> = []
15 @State private var severityColumnSet: Set<String> = []
17 @State private var liveTailSortTask: Task<Void, Never>?
16 @State private var liveTailSortTask: Task<Void, Never>?
@@ -284,7 +283,6 @@ struct LiveTailView: View {
284 let sevCols = buildSeverityColumnSet(columns: cols)
283 let sevCols = buildSeverityColumnSet(columns: cols)
285 guard let col = sortColumn else {
284 guard let col = sortColumn else {
286 cachedSorted = entries
285 cachedSorted = entries
287− cachedSeverities = entries.map { extractSeverity(from: $0.record, severityColumns: sevCols) }
288 severityColumnSet = sevCols
286 severityColumnSet = sevCols
@@ -302,7 +300,6 @@ struct LiveTailView: View {
303 guard !Task.isCancelled else { return }
301 guard !Task.isCancelled else { return }
304 cachedSorted = sorted
302 cachedSorted = sorted
305− cachedSeverities = sorted.map { extractSeverity(from: $0.record, severityColumns: sevCols) }
306 severityColumnSet = sevCols
303 severityColumnSet = sevCols
@@ -319,7 +316,7 @@ struct LiveTailView: View {
319 columnWidths: columnWidths,
316 columnWidths: columnWidths,
320 isSelected: selectedRecord == entry.record,
317 isSelected: selectedRecord == entry.record,
321 isAlternate: index % 2 == 1,
318 isAlternate: index % 2 == 1,
322− severity: index < cachedSeverities.count ? cachedSeverities[index] : .unknown,
319+ severity: extractSeverity(from: entry.record, severityColumns: severityColumnSet),
323 severityColumns: severityColumnSet,
320 severityColumns: severityColumnSet,
324 wrapText: wrapText,
321 wrapText: wrapText,
325 onCellFilter: { column, value, exclude in
322 onCellFilter: { column, value, exclude in
@@ -360,13 +357,12 @@ struct LiveTailView: View {
360 .onChange(of: sortAscending) { _, _ in
357 .onChange(of: sortAscending) { _, _ in
361 rebuildSortedEntries()
358 rebuildSortedEntries()
360+ // Scroll when the rendered list (`cachedSorted`) changes, targeting
361+ // its last element. Keying off `entries.count` could fire before the
362+ // rebuild, scrolling to an id not yet present (a silent no-op).
363− .onChange(of: viewModel.entries.count) { _, _ in
363+ .onChange(of: cachedSorted.count) { _, _ in
364 guard autoScroll, sortColumn == nil else { return }
364 guard autoScroll, sortColumn == nil else { return }
365− let hasFilters = !viewModel.filterText.isEmpty || !viewModel.columnFilters.isEmpty
366− let target = hasFilters
367− ? viewModel.cachedFilteredEntries.last
368− : viewModel.entries.last
369− if let target {
365+ if let target = cachedSorted.last {
370 proxy.scrollTo(target.id, anchor: .bottom)
366 proxy.scrollTo(target.id, anchor: .bottom)