| "Anyone with the link can edit" as the default | One leak = data breach; silent overexposure | Restricted default; escalation is always explicit |
| Bare 403 or "not found" on permission denial | Dead end; users chase the sharer through other channels | Request-access flow + switch-account option |
| Invite that dumps new users on a dashboard | Recipient never reaches the shared thing; the loop dies | Persist the deep link through auth and signup |
| Auto-inviting contacts / pre-checked bulk invites | Spam; trust damage; documented dark pattern | Explicit selection + preview of exactly who gets emailed |
| Six custom roles with overlapping powers | Nobody can predict access; over-granting follows | Four canonical roles; extra roles are enterprise-only |
| Permission wording differing across surfaces | "Viewer" here, "read-only" there → wrong grants | One shared permission component and vocabulary |
| "Copy link" hidden behind a menu | Highest-frequency action gets friction | Always-visible button with instant feedback |
| Invisible inherited access | Sharer can't answer "who can see this?" | List inherited grants with their source |
| No commenter role | Reviewers receive edit rights they shouldn't have | Comment-only role between view and edit |
| Silent read-tracking ("seen by") without disclosure | Feels like surveillance; trust erosion | Disclose what presence/read data others can see |
| Invite links with no revoke or expiry | A leaked link is a permanent open door | Regenerate/disable controls; optional expiry |
| A notification per keystroke or comment | Recipients mute everything; real signal is lost | Digest batching + granular notification settings |
| OG/link previews exposing restricted content | Access control bypassed by paste-into-Slack | Generic unfurl card for non-public objects |
| Surprise seat charges after invites | Billing dispute; admin distrust | Cost consequence shown at invite time |
| Guests indistinguishable from members | Accidental disclosure to outsiders | "Guest" badge everywhere the person appears |
| Permission changes with no history | Unresolvable "who opened this up?" disputes | Audit log of grants, changes, and removals |
| Removing access with no path back | Legitimate re-access becomes a support ticket | Request-access screen for removed users |
| Presence shown as "online" long after disconnect | False expectations of live collaboration | Idle after 1–5 min; gone on disconnect |
| Share dialog reachable only from a settings page | Sharing friction kills the growth loop | "Share" button on the object itself, top-right |