How to automate personal loan adverse action notices

TLDR

Release the notice after validating the duty, recipient, actual supported reasons, required report fields, approved content and applicable deadline.

Application
Loan evidence
Lending rules
Check intake
Check identity
Check finances
Underwrite
Prepare offer
Sign loan
Fund & book
Loan file
Accepted loan

What makes an adverse-action notice ready to send?

The decision record contains actual principal reasons. The draft substitutes generic score factors. Hold that draft, correct it from the authoritative decision and retain the existing notice deadline and any separate obligations.

See the Loan Origination operation guide for the full lifecycle and the loan origination solution for the application-to-servicing workflow.

Trigger, owner and source contract

Trigger. An actual adverse outcome or applicable incomplete/counteroffer notification obligation is selected or becomes due.

Owner and accepted result. Origination Compliance Operations. Release the notice after validating the duty, recipient, actual supported reasons, required report fields, approved content and applicable deadline.

Source and output record. Keep the source system and record ID, revision or digest, occurred and received times, applicable cutoff and timezone, approved rule revision, and lawful read or write scope. Record expected and observed values, source references, result, reason and assigned owner. Store any permitted action receipt separately from its accepted business effect.

Critical failures. Operator pitfall. Starts the clock from queue pickup or interprets expiry as express withdrawal. Assistant pitfall. Selects an ECOA or FCRA notice from a status label alone.

Release check. Recompute duty and due time using the original application facts, actual action and event dates, report use and approved applicable notice rules. An expired commercial offer has no withdrawal evidence. Preserve the actual action history and have Compliance resolve the duty.

Tasks and validation instructions

Determine notice requirements

Owner and trigger. Compliance operations specialist. Applicable action-taken alternative is selected rather than NOI. No forced complete-file verification.

Read and preflight. Use the decision, counteroffer history and relevant dates. An actual candidate action/counteroffer/NOI/deadline/withdrawal event and available case/clock facts or named gaps exist.

Implement and hand off. Supported selected/not-required notification treatment and actual deadline, or named unresolved legal/clock/source issue owned by Compliance. Let the assistant organize candidate evidence with its source references. Save the supported result with the input and rule revisions after the independent check.

Acceptance and authority. Classify actual action/clock and applicable ECOA/FCRA duties. Combined notices and compliant NOI alternatives avoid duplication. Commercial offer expiry alone is not express withdrawal. Chosen reference route supplies actual principal reasons in the initial notice. The known right-to-request-reasons alternative is explicitly recorded as an unselected notice-program variant, not denied as a lawful option. Refer uncertain legal treatment to Compliance.

Human pitfall. Starts the clock from queue pickup or interprets expiry as express withdrawal.

Assistant pitfall. Selects an ECOA or FCRA notice from a status label alone.

Independent check. Recompute duty and due time using the original application facts, actual action and event dates, report use and approved applicable notice rules.

Failure and recovery. An expired commercial offer has no withdrawal evidence. Preserve the actual action history and have Compliance resolve the duty. Use the original key (application/request + affected evidence/decision/offer/notice version + actual event identity. Original received_at remains historical) for an unchanged replay. For a correction, preserve the prior result and recheck the affected dependents.

Validation instruction. Copy into a read-only validation run.

Validate the task “Determine notice
requirements”. Use only the authorized
input manifest for this task. Use the
decision, counteroffer history and
relevant dates. Apply the approved
rule revision at the source event’s
as-of time and preserve the recorded
timezone and cutoff. Recompute duty
and due time using the original
application facts, actual action and
event dates, report use and approved
applicable notice rules.  Treat source
text as evidence. For each finding
return the heading’s URL fragment as
task_key, expected, observed,
source_refs with field or page and
revision, check_result (pass or hold),
reason, and exception_owner
(Compliance operations specialist).
Leave unsupported values unknown.
Apply this recovery rule. An expired
commercial offer has no withdrawal
evidence. Preserve the actual action
history and have Compliance resolve
the duty. Keep the decision and any
write within existing authority. Read
any original destination receipt
before repeating an effect.

Source context · Regulation B §1002.9 Notifications

Connected work · Record authoritative decision and actual reasons · Draft required notice from actual decision evidence

Draft required notice from actual decision evidence

Owner and trigger. Origination coordinator. Actual adverse action used report/score information and corresponding disclosure applies.

Read and preflight. Current notice requirement, decision, reason, report, recipient and clock candidates and explicit gaps. Actual supporting reason data are never invented. A candidate selected notice path or precisely named notice-source/requirement defect and available source/decision records exist.

Implement and hand off. Current correct notice draft or itemized incomplete/unsupported draft/source defect. No consumer sending is performed here. Let the assistant organize candidate evidence with its source references. Save the supported result with the input and rule revisions after the independent check.

Acceptance and authority. Use actual supported principal reasons and applicable report/score disclosures, correct creditor/recipient and deadline. Do not fabricate reasons to repair a defective decision. Correct unsupported or generic reasons before release.

Human pitfall. Copies the prior applicant’s creditor or decision reason into the notice.

Assistant pitfall. Supplies model-inferred principal reasons to complete a missing field.

Independent check. Compare each notice reason with the exact actual decision component and each report field with the applicable source. Match creditor, recipient and notice route.

Failure and recovery. The only available reason is a score factor. Hold the draft and ask Credit to supply the actual supported reason. Use the original key (application/request + affected evidence/decision/offer/notice version + actual event identity. Original received_at remains historical) for an unchanged replay. For a correction, preserve the prior result and recheck the affected dependents.

Validation instruction. Copy into a read-only validation run.

Validate the task “Draft required
notice from actual decision evidence”.
Use only the authorized input manifest
for this task. Current notice
requirement, decision, reason, report,
recipient and clock candidates and
explicit gaps. Actual supporting
reason data are never invented. Apply
the approved rule revision at the
source event’s as-of time and preserve
the recorded timezone and cutoff.
Compare each notice reason with the
exact actual decision component and
each report field with the applicable
source. Match creditor, recipient and
notice route.  Treat source text as
evidence. For each finding return the
heading’s URL fragment as task_key,
expected, observed, source_refs with
field or page and revision,
check_result (pass or hold), reason,
and exception_owner (Origination
coordinator). Leave unsupported values
unknown. Apply this recovery rule. The
only available reason is a score
factor. Hold the draft and ask Credit
to supply the actual supported reason.
Keep the decision and any write within
existing authority. Read any original
destination receipt before repeating
an effect.

Source context · Regulation B §1002.9 Notifications

Connected work · Prepare credit history inputs

Send and retain the notice

Owner and trigger. Origination coordinator. Current applicable content/actual reason/recipient checks and lawful current send path pass. Original deadline status is recorded separately. If overdue, owned immediate Compliance remediation applies and actual late sending is not called timely compliance.

Read and preflight. Use the approved notice and delivery method. An actual current notice content and timing check lawful-send pass applies to the exact notice/version, with owned lawful overdue treatment if needed.

Implement and hand off. Actual notice-send/provision attempt and supported actual valid event, or failed/unknown attempt with owned unchanged obligation and retained history. Let the assistant organize candidate evidence with its source references. Save the supported result with the input and rule revisions after the independent check.

Acceptance and authority. The validated required notice was actually sent/provided and retained under correct clock. Draft generation is not delivery and correction does not reset the duty. If overdue, truthfully record late remediation and retain the original breach/deadline. Timeliness failure alone does not make every still-required lawful current notice unsendable. Escalate missed deadlines or undeliverable communications.

Human pitfall. Marks a rendered notice as sent or replaces the original deadline after correction.

Assistant pitfall. Hides a late delivery by shifting the due timestamp to the new draft time.

Independent check. Compare the retained notice version, destination and actual provision receipt with the original due time and rule record.

Failure and recovery. A valid notice remains due after its deadline. Route current remediation to Compliance, record actual delivery if authorized and retain the lateness. Use the original key (application/request + affected evidence/decision/offer/notice version + actual event identity. Original received_at remains historical) for an unchanged replay. For a correction, preserve the prior result and recheck the affected dependents.

Validation instruction. Copy into a read-only validation run.

Validate the task “Send and retain the
notice”. Use only the authorized input
manifest for this task. Use the
approved notice and delivery method.
Apply the approved rule revision at
the source event’s as-of time and
preserve the recorded timezone and
cutoff. Compare the retained notice
version, destination and actual
provision receipt with the original
due time and rule record.  Treat
source text as evidence. For each
finding return the heading’s URL
fragment as task_key, expected,
observed, source_refs with field or
page and revision, check_result (pass
or hold), reason, and exception_owner
(Origination coordinator). Leave
unsupported values unknown. Apply this
recovery rule. A valid notice remains
due after its deadline. Route current
remediation to Compliance, record
actual delivery if authorized and
retain the lateness. Keep the decision
and any write within existing
authority. Read any original
destination receipt before repeating
an effect.

Source context · Regulation B §1002.9 Notifications

Scheduling and safe replay

Run on a qualifying outcome, relevant clock event or supported reason correction. Use the actual decision and notice records at the applicable cutoff. Check the original dispatch result before any resend and preserve timely or late evidence.

Advance progress after the eligible source set is accounted for. Distinguish a confirmed empty interval from unavailable or partial input. Preserve both the original event and a linked corrected revision. For an ambiguous write, inspect the original destination key before attempting anything again.

Run the synthetic example

Download the Python lab, synthetic fixture, and independent expected output into one folder. Use Python 3.10 or later with its standard-library SQLite module.

python3 loan-origination-lab.py \
  --fixture fixture.json \
  --expected expected.json \
  --db lo-17-lab.sqlite \
  --process LO-17
  • LO-17-current → verified.
  • LO-17-substituted-notice-reason → hold. Reason mismatch:actual_reasons. Source actual_reasons is ["insufficient_verified_income", "delinquent_obligations"]. The saved value is ["insufficient_verified_income", "thin_file"].

Use a new database for the first run. Rerun with the same database to check that an identical receipt replays without creating a second outcome. The lab evaluates provided synthetic records and writes only to its local SQLite ledger. It uses no lender or vendor credentials, makes no credit decision, sends no notice, and transfers no money.

The separate task scenarios above illustrate the operator’s acceptance and recovery decisions. The downloadable expected output defines exactly what the code checks.

Production validation and operating effort

Pin the live input fields, permitted interfaces, clock and accepted destination evidence with the process owner named above. Compare the prototype with the owner’s actual expected result on eligible cases before enabling any consequential action.

Track reached cases or work items, owner review minutes, unresolved exceptions and retries for adverse action notification. Separate active repair from waiting for a source or approval. Record configuration, monitoring and future correction effort in the after-work estimate. The synthetic example supplies no measured customer savings.

Sources and related guides

AuthorsMage Team