1. The reason code and its human-readable text
The person asks "why." The record holds a code such as RULE_INC_04. The code map holds the sentence. The sentence is the deliverable, and it must name the fact that decided the outcome, not the rule that detected it. "Income verification could not be completed within 30 days" beats "RULE_INC_04" and also beats "insufficient documentation," which is the kind of sample-form phrase that hides the real reason.
Reason codes drift. A code map that is not versioned alongside the model can end up printing a meaning the model never scored, which is exactly the failure described in this worked lending example, where one model version redefined a code and letters went out with the wrong reason until someone noticed. The fix is structural: store the code map identifier in the decision record at decision time, not the map that happens to be live when someone asks.
2. The named reviewer and their role
The person asks "who decided." If a human reviewed or signed off, the record should name them, their role and the date and time of the review. If the decision was fully automated, the record should say that plainly and name the accountable function instead of inventing a person.
This is the difference between nominal and genuine oversight. A reviewer who lacks the information, authority or time to change the outcome does not satisfy meaningful human review requirements, and the evidentiary basis is an audit trail showing who authorized what, when and under which policy per this compliance analysis. Human in the loop means a human must review, approve or act before the workflow proceeds, and the reviewer's approval is an event in the log, not an edit to it per this HITL and HOTL comparison. A named person with a timestamp is also the single most calming sentence you can put in a letter.
3. The versioned policy or model that set the threshold
The person asks "why that line and not another." The record answers with an identifier and version, for example renewal-policy-v4 or a named model release. Version identifiers are what let you explain a historical decision honestly later, when the threshold has moved as this decision-logging guide notes.
Without the version, two things break. First, you cannot reproduce the decision, so your answer to a regulator and your answer to the customer may diverge. Second, you cannot tell whether the decision would still hold under today's policy, which is often the customer's actual question. Keeping the version identifier in the record costs almost nothing and converts a fragile answer into a stable one.
4. The appeal path and its deadline
The person asks "what can I do about it." Give the channel, the person or team that handles it, what the person should send, and the date by which they will hear back. If a statutory clock applies, give it in plain words. Adverse action notices carry a 30-day window from a completed application, and the clock runs while the file sits in review per this overview.
Two details make appeals real rather than decorative. The appeal must be able to change the outcome, and the person reviewing it must not be the person who made the original call where volume allows. Both of those need to be true in the workflow before you promise them in a letter.
| Field | Where it lives | What the recipient sees | Common failure |
|---|
| Reason code | Decision record, reason array | One or two plain sentences naming the deciding fact | Code map version not stored, so old decisions get new meanings |
| Reviewer | Review event appended to the record | Name, role, review date | Reviewer exists but cannot change the outcome |
| Policy version | Release manifest linked to the decision | "The rule in force at the time" plus version identifier | Only the live policy is retrievable |
| Appeal path | Case record plus policy | Channel, what to send, deadline, who decides | No way to record an overturn back into the log |