Optimizing for local-first checking is 100% the way to go, and should be used much more widely I think.
I have done a similar thing using simple makefiles though, collecting more complex chains of tasks into a "meta rule" in Make and just calling that from whatever CI config we're using.
I have also slowly transitioned into something similar - using justfiles instead of make. I have `just prerequisites`, `just lint`, `just build` in all of my projects.
pixie's lockfile might be the most interesting part.
Same but using mise. It is so nice to define all runtime/build time dependencies for both dev and production builds in one place and then have a task runner that builds everything for you!
I have done a similar thing using simple makefiles though, collecting more complex chains of tasks into a "meta rule" in Make and just calling that from whatever CI config we're using.