Edge Cases & Special Scenarios
# | Scenario | Trigger Condition | Expected Behavior | UI Response |
|---|---|---|---|---|
EC-1 | Channel archived while in managed category | Channel Admin or System Admin archives a channel mapped to a managed category | Channel disappears from all users' sidebars. Channel-to-category mapping preserved. If unarchived later, channel reappears in managed category with mapping intact. | Standard archive behavior. Category header persists if other channels remain. |
EC-2 | Feature disabled while categories and mappings exist | System Admin or Team Admin disables feature toggle | Managed zone hidden. Channels revert to personal positions. All category entities and channel mappings are preserved. When re-enabled, categories and mappings are restored and appear in users' sidebars as before. | Sidebar re-renders without managed zone. No destructive action. |
EC-3 | Permission revoked mid-operation | Channel Admin/Team Admin role revoked while modal is open | Client state is stale. On save, server returns 403: "You no longer have permission to perform this action." | Error toast. Previous state preserved. Modal may close or become read-only. |
EC-4 | Concurrent category creation with same name | Two admins submit identical category names simultaneously | First write wins (server-side uniqueness check). Second receives: "A category with this name already exists." | Error on second submission. Category list refreshes. |
EC-5 | Race condition: category deleted between dropdown open and save | Team Admin deletes a category while Channel Admin has it selected in the dropdown | On save, server rejects mapping to deleted category: "This category no longer exists. Please select another." | Dropdown refreshes. Previous state preserved. |
EC-6 | User joins channel mapped to managed category | User joins via browse channels, invitation, or link | Channel appears under correct managed category. If first channel in that category for the user, category header appears. | Sidebar re-renders. Briefcase icon on new header. |
EC-7 | User leaves last channel in a managed category | User leaves channel or is removed by admin | Channel disappears from managed category. If last accessible channel, category header disappears for read-only users. | Sidebar re-renders. |
EC-8 | Category name contains sensitive information | Team Admin names a category with operationally sensitive text | Category names are visible to all users with create/edit permissions (by design). Read-only users see only categories with accessible channels. | No UI mitigation -- accepted risk. Team Admins should use non-descriptive names per security guidance. |
EC-9 | Channel moved between categories | Channel Admin changes mapping from Category A to Category B | Channel moves in all sidebars. Previous mapping replaced with new mapping. Category A persists even if now empty. | Sidebar re-renders. Channel appears under new category. |
EC-10 | Reconnection after category changes | User's connection drops and reconnects | Client re-fetches all sidebar state from the server. Current server-side state is rendered. No stale categories persist. | Sidebar re-renders with current state. |
EC-11 | Maximum category limit reached | Removed -- no hard cap for MVF | -- | -- |
EC-12 | Channel in managed category is also in Favorites, then unfavorited | User unfavorites a channel in managed category | Channel removed from Favorites ONLY. Remains in managed category. | Sidebar: channel disappears from Favorites, remains in managed category. |
EC-13 | DM/GM drag into managed category | User attempts to drag DM/GM into managed zone | Drop rejected. DMs/GMs cannot be mapped to managed categories. | No valid drop zone. |
EC-14 | Guest user views managed categories | Guest is a member of channels in managed categories | Guest sees managed categories containing only channels they have access to. Same visual treatment (briefcase icon, locked). | Standard managed zone rendering. |
EC-15 | Browser closed during category save | User closes browser during pending save operation | Server-side: if request reached server, operation completes. If not, no change. No partial state. | On re-open, sidebar reflects server state. |