Visibility of system status
Nielsen's first usability heuristic: the interface always tells you what it is doing right now, soon enough to be useful.
See it
What it is
The first of Jakob Nielsen's ten usability heuristics: the system should always keep people informed about what is going on, through feedback that arrives in reasonable time. Every click, every upload, every background save answers the question 'did that work?' before the user has to ask it.
Nielsen's response-time thresholds set the budget. Under 0.1s feels instant and needs nothing. Up to 1s the flow stays unbroken but you should acknowledge the action (button pressed state, row highlight). Past 1s show an indicator. Past 10s is where people leave, so show determinate progress with a percentage or a step count whenever progress is genuinely measurable, and an indeterminate indicator with changing stage text when it is not. Status also covers the quiet things: 'Saved', 'Offline', 'Syncing', '3 of 12 uploaded'.
Gotcha: an endless spinner with a fixed label is not status, it is a shrug. Plenty of work has no honest percentage (a server-side job, a third-party call), so name the stage instead ('Compressing video...', 'Waiting on the bank') and let the message change as work moves. Faking a percentage that crawls to 90 and parks there is worse than admitting you do not know. The other half people forget is the ending: after success, say so, and put the message near the thing that changed instead of in a corner nobody is looking at.
Ask AI for it
Add system-status feedback to this flow. Give every control an immediate pressed or active state on click. For any request over 400ms show an inline indicator attached to the element that triggered it, not a full-page overlay. For long or multi-step operations show a determinate progress bar when the work is actually measurable ('Uploading 3 of 12', '64%'); when it is not, show an indeterminate indicator with a stage label that changes as the job advances ('Compressing...', then 'Processing...'), and never invent a fake percentage. On completion swap to a persistent success cue next to the changed content, and announce state changes to screen readers with an aria-live='polite' region. Never show a spinner with no label for more than 10 seconds.