When saving data to Data Stores, Roblox first JSON encodes the data. This can change document data in subtle ways. For example, number keys in a non-array table will be converted to strings. Since validate runs before Roblox JSON encodes the data, the user's validate function won't catch this.
A potential solution is to JSON encode the data and then validate the decoded data. This isn't ideal for performance.