The ChangelogEntryInvalid constructor of ValidateFailure has a field vfSuccessfullyApplied :: [APITableChange], and each APITableChange contains the entire NormAPI at that step. Thus using show to render a ValidateFailure or MigrateFailure can result in trying to compute an enormous serialised representation, whereas prettyMigrateFailure/prettyValidateFailure avoid this because the pretty-printed representation ignores the NormAPI.
Instead, ChangelogEntryInvalid should store a list of changes without the API at each step.