Empty at every stage
Each stage can return nothing: no chunks, no filter survivors, no candidates above the threshold. Each needs its own message, because a blank answer tells the reader nothing about which stage failed.
Make the stages callable alone
A script that runs one stage on a saved input is what makes a bug findable. When the whole pipeline is one call, a wrong answer has seven possible causes and no way to narrow them.