Verified is not something a user is. It is a decision about one document, from one provider, at one moment in time.
Store it as a boolean on the user record and you have thrown away everything that made it defensible.
We have built KYC and KYB flows with real-time moderation queues behind them, and the failures all have the same shape. An ID expires. A provider revises a verdict. A screening list updates overnight. Nothing can be recomputed, because the only thing left in the database is true.
We keep the decision instead: which provider answered, which document version it saw, what it returned, who on the compliance side overrode it and on what grounds, and when the decision stops being valid. The status you show the user becomes a derived value, computed from decisions still in force rather than from whatever was written last.
Two things change once that is in place. Re-screening stops being a data migration and becomes a query: find every decision past its validity window. And a compliance officer asking why an account is open gets an answer from the record, instead of an engineer reading code and guessing.
Screening is continuous, and modelling it as a one-time event is the design error, which tends to surface during an audit rather than in testing.
If you run KYC in production, the move from storing the status to storing the decision probably came out of an expiry, a provider changing its verdict, or an audit you could not answer.