polycratia

KYC is not a signup step. It is a state that changes over the whole life of the account, and most systems store it as a boolean set once.

That boolean is where things break later. A document expires. A provider re-runs screening and the result flips. A compliance officer reverses an automated approval after manual review. Sanctions and watchlist data changes underneath users who were cleared months ago. Nothing in the signup flow ever notices, because the flag was written once and never asked again.

Building onramps and verification tooling, I stopped storing a verification result and started storing a history: each decision as its own record, with the source (provider or human moderator), the reason, and the period it is valid for. Current status is derived, never overwritten. Manual moderation writes a new decision instead of editing the old one.

Then every money-moving action asks the same question at execution time — is this user cleared right now — instead of trusting a flag set at registration.

The practical payoff is not elegance. It is that when a regulator or a partner asks why a specific withdrawal was allowed on a specific day, you can answer with data instead of a guess.

For those running verification in production: what finally forced you to make KYC status time-aware — an expiry, a reversal, or an audit?

react

$ new-project --brief

or email hey@polycratia.com