This uses a 3 step process
Lint -> Linux x86 Build -> [Linux x86 Test, Windows x86 Build, MacOS Check, Linux aarch64 Build]
The build steps being seperate from the linux build is so that its clear WHICH OS is preventing the build, along with if it doesn't build for linux x86 (MY dev machines) then there is ZERO point in checking other OS since all of my work happens on linux x86. This reduces Runtime on just outright bad pull-requests. Then we have plenty of runners, so we can easily run all 4 of the other jobs in the final step in parallel.
The MacOS steps includes a build BUT will pass regardless of its output, because the build step for MacOS is fairly unrelaible, so this relies on a check only.
The main difference between a check and a builds is that build calls the linker, while the check does not. Since the linker commonly fails in a cross-compile, while check verifies the rust code itself is techincally compatible with the OS. (IE no dependencies outright do not support the target). Which is a good enough for the most part.