If you cannot re-run a lending decision from last March and get the same answer, you do not have an audit trail. You have a log file.
A merchant asks why their credit line was declined in March. Compliance wants the answer by Friday. The engineer who wrote the underwriting rules left in June, the rules have been edited eleven times since, and the bureau response was never stored. All that remains is a row with status = 'declined' .
This is the normal state of lending backends that grew from a prototype. Underwriting starts as an if block in a service. It becomes a config file, then a feature-flagged config file, then a set of rules that product managers adjust directly. Each step is reasonable. Together they destroy your ability to explain a past decision.
A decision is a function of inputs and rules, and you are storing neither
Most schemas store the outcome. Some store the score. Almost none store the exact inputs the rules saw, or the exact version of the rules that ran.…