Business

Explaining an AI Decision to the Person It Affected

Antonio Evans9 min read

A split scene: on the left, an engineer at a desk reads a decision log on screen with four highlighted fields (reason, reviewer, policy version, appeal path); on the right.
Key points

Key points

  1. 1Answer the affected person by pulling four things from the decision record in the order they will ask: the reason code and its plain-text version, the named reviewer and role, the versioned policy that set the threshold, and the appeal path with its deadline.
  2. 2The reason code is meaningless to a customer, so ship every code with a human-readable sentence that names the actual fact, not the internal rule.
  3. 3The reviewer's name, role and review date are what turn "the computer said no" into an accountable human decision.
  4. 4Never fill a missing field with a plausible story; say what the record does not contain, say why, and say what you will do about it in a stated time.

Start from the person, not the log

Most engineering write-ups about decision records aim at the auditor or the debugger. This one reads the log outward. The person on the other side of the decision is not asking for a trace, a span ID or a token count. They are asking a small set of questions in a fixed order, and the record either answers them or it does not.

That framing changes what you pull first. A decision log is useful when a teammate who was absent could reconstruct the reason, the authority and the result of an action from one record, and the same test applies to the person who received the decision. The typical decision log carries the decision outcome, the rule or policy version matched, the requesting identity, a timestamp and a correlation identifier in this field breakdown. Two of those fields are for engineers. Four are for the recipient.

There is a legal floor under this in several domains. Under Regulation B, a creditor generally must give specific principal reasons for adverse action, and generic phrases such as "incomplete application" are not sufficient when the file contained enough to make a decision as this adverse action analysis sets out. In the EU, where a decision is based solely on automated processing and has legal or similarly significant effects, the person has the right to obtain human intervention, express a point of view and contest the decision per Article 22. The UK regulator's checklist for the same situation asks for a simple way to request reconsideration and named staff authorized to review and change decisions per the ICO guidance. Even where none of that applies, the four fields are simply the fastest way to end the conversation well.

The four fields, in the order the person asks

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.

FieldWhere it livesWhat the recipient seesCommon failure
Reason codeDecision record, reason arrayOne or two plain sentences naming the deciding factCode map version not stored, so old decisions get new meanings
ReviewerReview event appended to the recordName, role, review dateReviewer exists but cannot change the outcome
Policy versionRelease manifest linked to the decision"The rule in force at the time" plus version identifierOnly the live policy is retrievable
Appeal pathCase record plus policyChannel, what to send, deadline, who decidesNo way to record an overturn back into the log

Translate each field, do not summarize the whole record

A common mistake is to write one paragraph that paraphrases the record. The recipient cannot check a paraphrase. Translate field by field and keep the code visible in a reference line, so that a support agent, a regulator or the customer's own adviser can join the letter to the record.

A pattern that works:

Decision reference: D-4417
What we decided: we could not verify your income within 30 days of your application.
Why: our rule set at the time (income-verification policy, version 4) requires
verification within 30 days. Your application reached day 31 without the two
documents we requested on 3 and 11 June.
Who reviewed it: A. Okafor, underwriting team lead, reviewed this decision on 14 June.
What you can do: reply to this message or call the number below before 12 July.
Send the two documents and we will recheck the decision. A different reviewer
will look at it and you will hear back within 10 business days.

Every sentence in that block is checkable against one field. None of it speculates about intent, and none of it hides behind passive voice.

Two rules keep the translation honest. First, describe the fact, not the score. "Your oldest account is 11 months old, below the 24 months our policy requires" tells someone what to do next; "low creditworthiness" does not. Second, do not quote model internals. Reason codes are designed to be safe to expose; raw feature weights and prompt text are not, and storing them creates a second copy of sensitive data with its own retention obligations per this logging guidance.

For teams producing these at volume, the reason map is worth treating as product, not configuration. A mislabelled reason is a wrong explanation to a real person, and it repeats at the speed of your batch job.

What to do when the record has gaps

Records have gaps. The reviewer field is empty because the workflow skipped the step. The policy version was not written because the field was added later. The code map changed and the original sentence is gone. The temptation is to reconstruct a tidy story. Do not.

The rule: state what the record contains, state what it does not contain, and state what you will do and by when. "Our record shows the decision was made by the automated rules engine on 14 June. It does not show that a person reviewed it before it was issued. That is a gap in our process, and I have asked our team to confirm whether a review happened and to come back to you by 21 June." That answer is uncomfortable and it is defensible. The invented version is comfortable and it collapses the first time anyone audits it.

Gaps also tell you where to invest. Missing reviewer identity usually means the approval step was optional in the workflow, not that the reviewer forgot. Missing policy version usually means the decision service read the live policy instead of snapshotting it. Both are schema fixes, and both are cheaper than the correspondence they generate.

Three practical moves:

  • Make the four fields required at write time. A decision that cannot produce them should not be allowed to send a customer-facing outcome.
  • Link, do not copy. Store references to evidence such as the documents received and the verification attempt, with access controls and retention that already apply to those systems per this decision-log schema discussion.
  • Check that review is real. If the reviewer screen shows only a summary and an approve button, the review is theater, and the letter will overclaim.

Retention deserves a decision rather than a default. No AI-specific rule fixes a period for these records, so organizations derive it from sector rules; PCI DSS, for instance, requires at least 12 months of audit log retention with three months immediately available, and privacy law may extend it where personal data is involved per this retention summary. Pick the longest applicable clock and write it down, because the person asking about a decision two years later is often the one with the strongest reason to ask.

SituationWhat the record showsWhat to tell the person
Clean automated decisionCode, policy version, no reviewer"Decided by our rules engine, no individual review before issue. You can ask for a review."
Human approvedCode, policy version, reviewer name and date"Reviewed and approved by [name], [role], on [date]."
Reviewer step skippedCode, policy version, empty reviewer"Our record does not show a review. We are checking why and will reply by [date]."
Code meaning changedCode, but code map version missing"We are confirming which version of our rule produced this. We will send the corrected explanation by [date]."
Appeal already filedEverything above plus case referenceAcknowledge, name the new reviewer, confirm the deadline.

Design the record so the answer is boring

The best time to solve this is schema design. Store the outcome, the reason codes with their map version, the reviewer identity and role with an event timestamp, the policy or release manifest identifier, and an appeal case reference. The record should be reproducible without the full prompt or the full customer file, which means stable references and versioned identifiers rather than a giant JSON blob per this agent decision record pattern.

If you are running agents rather than a rules engine, the same fields map onto agent identity, the authorizing principal, an action classification and an outcome, with tamper-evident chaining so a record cannot be quietly edited after the fact per this draft audit-trail format. You do not need the full format to answer a customer, but the authorizing principal field is the one that lets you name a person when the model acted on its own.

One more design note, because it is where teams get surprised. If your model is accessed through a single gateway, log the request at the gateway with the decision reference attached. That gives you one place where code version, model identifier and policy version meet, which is usually cheaper than retrofitting four fields into six downstream services. A gateway that speaks one interface for every model type, such as Quanta Inference, makes that correlation straightforward because the model identifier is already part of the request.

A short checklist before the letter goes out

  • Does the reason sentence name a fact the person could act on, and is the code map version recorded with the decision?
  • Is the reviewer's name, role and review time in the letter, or an explicit statement that no review occurred?
  • Does the policy identifier match the version in force at decision time, not today's version?
  • Is the appeal channel real, with a named handler, a stated deadline and a recorded way to overturn?
  • If a field is missing, does the letter say so and give a date for the follow-up?

If your team handles these questions by hand across several products, or the review step exists but nobody can show where it is recorded, a short working session on the decision record and the response template usually pays for itself. Quanta Consulting runs a free 30-minute discovery call where you can bring one real decision record and map it against these four fields.

FAQ

FAQ

What are the four fields to pull from a decision record?

The reason code together with its human-readable text, the named reviewer and role with the review date, the identifier and version of the policy or model that set the threshold, and the appeal path with its deadline. Pull them in that order because it matches the order the person will ask. Each maps to one sentence in your reply.

Do I have to name the human reviewer?

Name them whenever a human actually reviewed or signed off, and give their role and the date. If no human reviewed the decision before it was issued, say that instead of finding a name to put in the letter. In many jurisdictions a person affected by a solely automated decision can request human intervention, which is easier to honor when the record already shows who is authorized to review per the ICO guidance.

Why does the policy version matter to the person receiving the letter?

Because the version is what makes your explanation stable. If the threshold moved after the decision, an answer based on today's policy is wrong, and it will contradict the record if anyone checks. A stored version identifier also lets you reproduce the decision later, which is the difference between a defensible answer and a plausible one.

What do I say when a field is missing from the record?

Say exactly what the record contains, say which field is missing, and give a date by which you will follow up. Do not substitute a story. A gap usually points at a workflow or schema defect, such as an optional review step or a decision service that read the live policy instead of a snapshot, and fixing that prevents the next hundred letters.

How specific must the reason be?

Specific enough that the person knows what fact drove the outcome and what would change it. Regulators in lending have made this concrete: generic phrases such as "incomplete application" are not sufficient when the file contained enough information to decide, and the notice must state the actual reasons per this analysis. The same standard is a good one to apply outside lending.

Sources

Sources

  1. Policy Decision Log: Format, Fields, and Retention - Trussed AI
  2. Getting Adverse Action Notices Right - CrossCheck Compliance
  3. Automated individual decision-making, including profiling
  4. Rights related to automated decision making including ...
  5. Adverse Action Notice Automation - Botminds AI
  6. Human in the Loop: AI Compliance and Oversight ...
  7. Human-in-the-Loop vs Human-on-the-Loop: Enterprise ...
  8. AI Agent Decision Logs: Record Evidence Without Storing Chain of ...
  9. Agent Audit Trail: A Standard Logging Format for Autonomous AI Systems
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles