| Actions column with 5 always-visible icon buttons | Visual noise; destructive actions one mis-click away | Row click = primary; hover reveals ≤3; rest in ⋯; delete only in ⋯ |
| Infinite scroll + bulk actions or footer | Footer unreachable; selection scope unbounded | Pagination or load-more |
| Blanking the table during refetch | User loses reading position and context | Keep stale rows; overlay a subtle loading indicator |
| "No data" shown on fetch error | User believes records are gone; support tickets follow | Distinct error state with Retry |
| Filters/sort reset on refresh or back | Users rebuild their view constantly | Persist view state in the URL |
| Header checkbox silently selecting all 10k rows | Accidental mass actions on unseen data | Select visible page + explicit "select all matching" |
| New rows shoving in mid-read | User loses their place; mis-clicks follow | "N new items" pill, insert on tap |
| Horizontal-scrolling 9 columns on mobile | One column visible at a time; unusable | Card collapse with priority fields |
| Centered or left-aligned numeric columns | Digits don't align; magnitude comparison fails | Right-align with tabular figures |
| Unsorted default order | Table appears random; trust drops | Meaningful default sort with visible arrow |
| Cards for record comparison | Fields sit in different positions per card | Use a table |
| Skeletons unlike real content | Layout jumps on load (CLS) | Skeleton matches final row height and columns |
| Row actions appearing only on hover, on touch | Touch has no hover; actions unreachable | Always-visible ⋯ on touch |
| Hover actions that reflow the row | Content shifts under the cursor; mis-clicks | Reserve the action-area space |
| Confirm dialog for every single-row action | Trains users to click through confirmations | Confirm only destructive/irreversible; prefer undo toast |
| Color-only status indicators | Fails colorblind users and grayscale scans | Badge = color + text label |
| Every cell rendered as a blue link | Row reads as link soup; primary action unclear | One primary link per row; rest plain text |
| Mixed timestamp formats in one table | Users can't compare times across rows | One format per table, applied consistently |
| Ungrouped event spam in feeds | 40 rows of "X edited Y"; signal drowns | Group repeated events by actor/object |