Team
MembersFilterBar, MembersTable, PendingInvitesTable and InviteMemberDialog from packages/ui, against a 30-person roster with real search, filtering, sorting and paging, permission-shaped rows, and switchable failure.
Roster
An Admin actor: two Owners above their reach, one disabled member, their own row unmanageable, and three profile pictures plus one that 404s back to initials. 30 rows at 25 per page, so page 2 is a real 5-row remainder.
Empty states
Three different facts, told apart rather than collapsed into one line. Only the no-matches one has a way out of itself.
Permission shapes
The actions column is driven entirely by each row's own assignableRoles / canChangeStatus / canRemove — a viewer without team/role:w or team/remove:w never receives a row that allows any of them.