Checking whether a string of bits encodes a proof of False in ZF is decidable. Now enumerate the bitstrings and check each.
"Now, draw the rest of the owl." Not saying you're wrong, just, this jump is super non-obvious even to most mathematicians.
And they can be enumerated by a finite program. For example, in lazily evaluated pseudocode:
bits = ["0", "1"]
bitstrings = bits + [(bit + suffix for bit in bits) for suffix in bitstrings]