We recently added a mechanism to defer validation of required blocks within StreamFields when saving drafts. We implemented this by adding defer_required_validation(), restore_deferred_validation(), and clean_deferred(). You can see the implementation of these methods in wagtail.blocks.base.Block, wagtail.blocks.stream_block.BaseStreamBlock, and wagtail.blocks.field_block.FieldBlock.
We recently got a report where in some cases, a required block may become not-required while the application is running, and it stays that way even after validation. The block in question seems to be an ImageChooserBlock inside a StructBlock, which is inside a StreamField's StreamBlock. Could you identify what could be the problem?
Don't make any code changes yet, just analyze the problem first and find the root cause if possible.