I don't know if this is what you meant by mechanical checking, but I highly rate two things to reduce bugs:
(1) Checking that the output of the entire system is 100% (and I meant 100% literally in every sense of the word) accurate, not just that the smaller unit tests pass or that the output "looks right".
(2) Scrutinizing the logic of the code line by line at least 2 times after you've finished writing it.
As a dev with a data science background, I'm always impressed how many bugs pure devs are able to smuggle in whenever the task involves any kind of data, despite extensive unit testing. I check out their code, run it once, and immediately see the output is wrong and then they have to go back and debug. If we just check our output that wouldn't be the case!