A real pipeline has parts that can run side by side and parts that must wait, like deploy waiting for tests. Jobs give you parallel units on separate machines, and steps are the ordered commands inside one job. Use needs when one job must finish before another starts. Do not expect files or shell variables to carry across jobs or even across run steps, because each job gets a fresh runner and each step a fresh shell.