A team adds a field to an event. Their producer deploys fine. Six services that read that topic start throwing deserialization errors, and three of those teams are asleep. The event was a contract, and nobody checked it.
A schema registry makes the contract something a machine can enforce. Producers register the schema and publish data carrying a schema ID; consumers fetch the schema by that ID. Before anything is published, the registry checks the new version against the old one and either allows it or rejects it.
What counts as allowed is a choice. Backward compatibility lets new consumers read old data — add an optional field, remove an optional field. Forward compatibility lets old consumers read new data, which means new fields need defaults and existing ones stay where they are. Full compatibility is both, and it is usually the right setting when the deploy order isn't ours to control.
Removing a required field, renaming one, changing a type: the registry refuses all three at deploy time, in the producer's own pipeline, while the person who made the change is still watching it.
A rule that lives in a document gets broken. A rule that blocks a deploy gets followed.
