Upstream will add a field, rename a field, change a type from string to object, and start sending null where it never did. None of that is avoidable. What is avoidable is finding out about it from a crash in a consumer at three in the morning.

Three schemas, not one

A document pipeline has three separate schemas and they evolve independently. Conflating them is the root of most of the pain.

The source schema — whatever the upstream system emits. You do not control it and you frequently are not told when it changes.

The internal schema — your normalised document and chunk representation. You control this completely; it should change rarely and deliberately.