Most approval queues break not because the change was large but because it was applied to records that were already mid-flight. The first step is to name the edit. Schema evolution guidance splits changes into two families: compatible (backward and forward) changes such as adding or removing optional fields, and breaking changes such as adding a required field or removing one that consumers rely on Confluent's compatibility tables and Data Expert's schema evolution guide.
The practical rule for an approval schema:
| Edit | Safe to deploy immediately? | Why |
|---|---|---|
| Add an optional field with no validation | Yes | Old cards remain valid; new cards carry extra data |
| Add a new enum value | Yes, if readers default unknown values | Old readers must not crash on it |
| Add an optional nested object | Yes | Absent object reads as empty |
| Add a required field | No | Every in-flight card fails validation on next save |
| Remove a field readers still render | No | UI shows blanks or throws |
| Change a field's type (string to number) | No | Old values fail the new validator |
| Rename a field without an alias | No | Both readers and writers see missing data |
The reason required fields are the dangerous case is structural. A schema's required list applies to the whole document, so marking a field required retroactively invalidates every card that predates the field the JSON Schema reference. You cannot grandfather old documents with the required keyword alone; you need either a compatibility window or conditional validation.
If you truly cannot wait, JSON Schema offers conditional tools. dependentRequired makes one field mandatory only when another is present, and if/then/else lets you require different fields under different conditions the JSON Schema reference, a Stack Overflow walkthrough of four approaches. A common pattern in practice is to require the new field only when a version marker says the card is new, which is the topic of the next section.



