Inference produces a draft, and it is important to treat it as one
A generated schema describes the example you provided, not the contract you intend. Those coincide only by accident. If your sample has `"status": "active"`, the generator can see that the field is a string - it cannot know that the only permitted values are `active`, `suspended` and `closed`. If `"retries": 3` appears, it infers an integer, not that the valid range is 0 to 5.
Optionality is the biggest gap. Every field in the sample is present, so a naive inference marks everything as required. Fields that are genuinely optional will then fail validation whenever they are legitimately absent, and you will spend a while confused about why valid payloads are being rejected.
The right mental model is that generation does the mechanical 80% - the structure, the nesting, the basic types - and saves you a lot of typing. The remaining 20% is where the schema becomes valuable, and it has to come from knowledge the sample does not contain.