Each failure caused by assertions is associated with a failure stack. The stack represents the trail of assertions that have run, containing the ids of all values asserted against. When any field or classification changes that is represented on the failure stack, the failure for the failed field associated with that failure stack is cleared.
Example: If an assertion for some question foo first checked the value of bucket field bar, and within its failure checked the value c:predicate, the failure stack would contain both of those ids. If either bar or the predicate classification changed, the question foo would have its error cleared.
Error state is managed by ValidStateMonitor.