Having good error messages is one of the important priorities for me in my compiler, so I made the commitment early and am using codespan_reporting[0] to report the errors, which is going well so far.
Oh, it looks like the release command would fit the `build` step I mention.
As far as the after-deployment tasks go, we automate those just like migrations - they're (occasionally very slow) one-offs that we don't want to hold up a restart for. Really, an analogue to the release command that can run after restart is all that I'm talking about here.
My big want here is containerized deployments with build + release steps to allow me to e.g. run migrations and after-deploy tasks (we use both). This prevented a move to Render for us previously.