I simulated each gate using Falstad, then built up an example of each gate on a breadboard and connected them together. This was very helpful, but...
The real world often throws you a curve ball. I discovered that for some inputs, a "logic low" was .6 or .7, not just a few millivolts which the LM324 is spec'd at. The reason for this is that I used 10k resistors for the input averaging networks and that created some leakage current which added an offset to the op amp's output. In retrospect, it would have been better to use some higher valued resistors, 100k or even 1M (although you don't want to go too high as that might make the circuit more susceptible to noise).
The offset voltage was only a problem for the four input OR gate. Fortunately, I was able to solve the problem by increasing the OR gate Vref (by replacing the 1k resistor with a 2.2k).
Nearing the end of the build, I ran out of 10k resistors so I used 20k resistors instead. This works fine as long as you are consistent and all inputs of a gate use the same resistor value.