The Schema object does not have a separate validate() phase. Instead, validation is integrated into the complete() step of the processing pipeline.
When using Processor::process(), the following sequence occurs:
normalize(): Data is normalized.complete(): Data is validated (type checking, ranges, patterns, recursion) and transformed.throwsErrors(): Errors are checked and thrown if present.
When using Processor::processMultiple(), the behavior changes slightly:
before() hooks run for each individual dataset item during the normalization phase.transform(), assert(), and castTo() run once on the final, merged result during the single complete() phase.
This means before() sees individual configuration layers, while transform() sees the entire merged configuration.