A gap means a record never arrived at all. A completeness flag means it arrived, but broken.
A source ping came in, and after the full expected window passed, no matching destination ping ever showed up. Nothing landed. This is the core thing FlowProofs exists to catch: the record that silently vanished somewhere between start and finish.
The destination ping did arrive, but is missing a field you've told FlowProofs to expect, or that field is empty when it shouldn't be. The record technically made it, but not in usable shape: a lead with no phone number, an order with no shipping address. This is a different failure mode from a gap, and it's detected differently. You define which fields matter per flow, and FlowProofs checks every arriving record against that list.
Why they're kept separate