Use structured concurrency so model, upload, and tool tasks belong to the user action that created them. Cancel work when the screen or request disappears.
Keep UI state on the main actor, isolate shared mutable state, and bound parallel calls. Model retries and streaming need explicit lifecycle ownership. Responsiveness comes from predictable cancellation and state transitions, not simply adding more tasks.