@@ -359,7 +359,12 @@ struct LogTableView: View {
359 sorted = enumerated.sorted { a, b in
359 sorted = enumerated.sorted { a, b in
360 let aVal = a.element[col] ?? .null
360 let aVal = a.element[col] ?? .null
361 let bVal = b.element[col] ?? .null
361 let bVal = b.element[col] ?? .null
362+ // `sorted(by:)` is not guaranteed stable, so break ties on
363+ // the original index to keep equal-keyed rows in a fixed
364+ // order across re-sorts (otherwise low-cardinality columns
365+ // like `level`/`status` would reshuffle on every refresh).
362− return asc ? aVal < bVal : bVal < aVal
366+ if aVal != bVal { return asc ? aVal < bVal : bVal < aVal }
367+ return a.offset < b.offset
365 sorted = enumerated
370 sorted = enumerated
@@ -403,7 +408,9 @@ struct LogTableView: View {
403 sorted = enumerated.sorted { a, b in
408 sorted = enumerated.sorted { a, b in
404 let aVal = a.element[sortColumn] ?? .null
409 let aVal = a.element[sortColumn] ?? .null
405 let bVal = b.element[sortColumn] ?? .null
410 let bVal = b.element[sortColumn] ?? .null
411+ // Stable tiebreak on original index — see the async path above.
406− return sortAscending ? aVal < bVal : bVal < aVal
412+ if aVal != bVal { return sortAscending ? aVal < bVal : bVal < aVal }
413+ return a.offset < b.offset
409 sorted = enumerated
416 sorted = enumerated