The article queue showed one opaque Generating spinner while three separate drafts were being researched, generated, checked, and saved.

That was technically accurate and practically useless. The server knew much more than the interface admitted, so I replaced the spinner with a live three slot stepper driven by server sent events.

Streaming the actual work

POST /api/articles/drafts/queue now streams progress over SSE. Each event reports meaningful state for the current slot: Researching, Generating, Verifying links, or Done.

The dashboard renders those events through GenerationProgress. Instead of staring at a spinner and guessing whether anything is happening, I can see source counts appear during research, draft titles arrive after generation, and completion land only when the draft actually exists.