events
Hot SharedFlow of lifecycle events emitted during the run.
The underlying flow replays a bounded recent history, so a subscriber that attaches shortly after Runner.submit returns can initialise a progress indicator without missing the run start on very fast models.
The flow is never closed; it simply stops emitting after the terminal event (RunEvent.RunCompleted, RunEvent.RunCancelled, or RunEvent.RunFailed). Collectors should cancel their collection job after receiving a terminal event if they do not want to block indefinitely.