Unpack this for me. Was it like this before? What changed to make it this way. What is an example of the degenerative case?
I see one concern worth addressing: candidates() computes the Cartesian product of decoder candidates. Numeric-looking strings generally have multiple interpretations, so an invalid array schema could cause exponential validation work as repetitions increase. The generator makes successful cases lazy, but a failure may exhaust all (n^k) combinations. I’d either document why candidate counts are safely bounded or add a stress-oriented test/design limit.
There’s also a smaller diagnostic edge: if several successful occurrences accumulate warnings and a later occurrence fails, the failure settles the parameter immediately and the earlier accumulated issues appear to be dropped. That may matter once successful reads produce meaningful diagnostics.