Part 10 — System Blueprint
State Machines
State machines are contractual. A state is not a screen label; it defines who can act, what events are legal, which timestamps are regulatory evidence, and which downstream modules receive updates. Every transition must be generated by a named event, actor, guard and audit record. Direct database edits to state columns are prohibited.
Application Machine
Section titled “Application Machine”The application machine is owned by LOS workflow until loan_booked. The KYC, document, BRE, credit, documentation and disbursement services publish events; LOS decides whether the event is legal in the current state.
Application States
Section titled “Application States”| State | Meaning | Owner queue | Entry action | Exit allowed to |
|---|---|---|---|---|
lead_created | Lead exists with source and consent attempt | Sales/CRM | Create application shell if login is requested | prescreen_pending, withdrawn, expired |
prescreen_pending | Dedupe, product, geography, negative-list and consent checks running | Sales ops/BRE | Lock source and run pre-screen rules | prescreen_passed, rejected, returned_for_rework, expired |
prescreen_passed | Basic eligibility passed or referred and accepted | Sales ops | Create full application checklist | kyc_pending, docs_pending, withdrawn |
kyc_pending | Required parties are not fully KYC-verified | KYC ops/AML | Create CDD, BO and screening tasks | docs_pending, on_hold, rejected, returned_for_rework |
docs_pending | Application documents are incomplete or unverified | Sales ops/loan ops | Generate document requirements | data_pending, returned_for_rework, withdrawn |
data_pending | Bureau, banking, GST, ITR, financials or alternate data pack is incomplete | Credit ops/integrations | Request data using active consent | credit_in_review, on_hold, returned_for_rework |
credit_in_review | Analyst/CAM/PD/RCU/legal/valuation review is active | Credit | Freeze underwriting data version | deviation_pending, approved, sanctioned, rejected, returned_for_rework, on_hold |
deviation_pending | One or more deviations require approval | Credit/authority | Resolve required DoA level | credit_in_review, approved, rejected |
approved | Credit approval exists but sanction letter/KFS is not accepted | Credit ops | Generate sanction and KFS | sanctioned, expired, rejected |
sanctioned | Sanction letter and KFS are issued | Sales/borrower | Notify borrower; start validity clock | sanction_accepted, expired, withdrawn, returned_for_rework |
sanction_accepted | Borrower accepted terms and KFS | Loan ops | Generate documentation and CP checklist | documentation_pending, expired |
documentation_pending | Loan/security documents, stamping, signatures, CPs or charge tasks are incomplete | Loan ops/legal | Create execution package | disbursement_pending, returned_for_rework, on_hold |
disbursement_pending | CPs, mandate, bank account and payment instruction are awaiting checker approval | Disbursement ops/treasury | Create disbursement request | loan_booked, on_hold, returned_for_rework |
loan_booked | LMS account exists and booking event is accepted | LMS | Close LOS workflow and publish account details | None |
returned_for_rework | File is sent back to previous team with reason | Prior owner | Create rework task | Any non-terminal state allowed by rework target |
on_hold | External dependency, compliance hit, fraud review or court/legal issue blocks processing | Holding owner | Suspend SLA clock with reason | Prior active state, rejected, withdrawn |
rejected | Lender declined application | Credit/sales ops | Send adverse/reject communication as policy requires | None |
withdrawn | Borrower or source withdrew before booking | Sales ops | Close active tasks and preserve evidence | None |
expired | Lead, data, sanction or documentation validity lapsed | System owner | Close or route to refresh | returned_for_rework only when policy permits refresh |
Application Transitions
Section titled “Application Transitions”| From | Event | To | Guard | Actor/system | Side effects |
|---|---|---|---|---|---|
lead_created | lead_submitted_for_prescreen | prescreen_pending | Active consent for contact and product identifiers present | Sales/partner API | Create application id and source lock. |
lead_created | lead_withdrawn | withdrawn | No active application tasks | Borrower/sales | Close lead with reason. |
lead_created | lead_ttl_elapsed | expired | No contact or login within channel TTL | System | Suppress stale follow-up. |
prescreen_pending | pre_screen_passed | prescreen_passed | Dedupe not hard-negative; policy gates pass or refer accepted | BRE | Store rule tree and eligibility snapshot. |
prescreen_pending | hard_reject_triggered | rejected | Rule failure is non-waivable or negative-list hit confirmed | BRE/credit policy | Store reject reason and block duplicate retry window. |
prescreen_pending | data_or_identifier_deficient | returned_for_rework | Required identifier missing or inconsistent | Sales ops | Create rework task. |
prescreen_passed | kyc_required_parties_created | kyc_pending | Application parties include borrower and required obligors | LOS | Create KYC tasks. |
prescreen_passed | docs_collection_started | docs_pending | KYC already verified for repeat borrower and no BO gap | LOS | Generate checklist. |
kyc_pending | kyc_verified | docs_pending | All required KYC profiles verified; BO and screening hits closed | KYC service | Publish kyc_verified. |
kyc_pending | sanctions_or_aml_hold | on_hold | Open true-positive or unresolved AML/sanctions hit | AML/compliance | Suspend workflow and notify compliance. |
kyc_pending | kyc_rejected | rejected | KYC defect cannot be cured or prohibited party found | KYC checker | Close application with KYC reason. |
docs_pending | document_pack_locked | data_pending | Mandatory documents verified or approved waivers recorded | Document service | Freeze document version. |
docs_pending | deficiency_raised | returned_for_rework | One or more mandatory document deficiencies remain | Operations | Assign deficiency to sales/customer. |
data_pending | data_pack_finalized | credit_in_review | Bureau, banking/GST/financial data requirements met or waivers approved | Credit ops | Freeze underwriting data version. |
data_pending | provider_retry_exhausted | on_hold | External API failure prevents required data | Integration gateway | Open dependency ticket. |
credit_in_review | deviation_raised | deviation_pending | BRE/CAM found waivable rule breach | Credit analyst | Resolve required authority. |
credit_in_review | credit_approved_without_deviation | approved | CAM submitted; no open deviations; authority has approved | Credit authority | Create approval event. |
credit_in_review | sanction_direct_generated | sanctioned | Program permits straight-through sanction and KFS generation | Credit/BRE | Create sanction and KFS. |
credit_in_review | credit_rejected | rejected | Authority rejects or non-waivable credit fail | Credit authority | Store reject code. |
deviation_pending | all_deviations_approved | approved | Each deviation approved at required DoA level | Approval service | Lock deviation approvals. |
deviation_pending | deviation_rejected | credit_in_review | Rework permitted | Approval authority | Return CAM with comments. |
deviation_pending | deviation_rejected_final | rejected | Authority rejects and no lower structure accepted | Approval authority | Store final rejection. |
approved | sanction_letter_generated | sanctioned | KFS/APR computed where required; sanction validity set | LOS/KFS service | Send sanction pack. |
sanctioned | borrower_acceptance_recorded | sanction_accepted | Valid sanction; acceptance by authorised signatory/borrower; KFS accepted where required | Borrower/ops | Start documentation workflow. |
sanctioned | sanction_expired | expired | valid_until elapsed without acceptance | System | Close sanction; allow refresh only by policy. |
sanctioned | borrower_negotiation_rework | returned_for_rework | Requested change is material | Sales/credit | Route to credit for revised sanction. |
sanction_accepted | documentation_started | documentation_pending | Accepted sanction has active checklist | Operations | Generate execution pack. |
documentation_pending | documents_executed_and_cps_cleared | disbursement_pending | Documents executed; CPs cleared or approved exceptions; mandate policy met | Ops checker | Create disbursement request. |
documentation_pending | document_exception_hold | on_hold | Legal/security/stamping issue blocks execution | Legal/ops | Create exception task. |
disbursement_pending | loan_booked | loan_booked | Payment posted or limit opened; LMS account created; GL event accepted | LMS/disbursement service | Publish account number, schedule and first due date. |
disbursement_pending | booking_failed | returned_for_rework | LMS/payment failure is correctable | LMS/ops | Cancel payment instruction if needed. |
| Any non-terminal | borrower_withdrawn | withdrawn | No disbursement posted; withdrawal reason captured | Borrower/sales ops | Close tasks, preserve evidence. |
| Any non-terminal | fraud_confirmed | rejected | RCU/FCU true-positive approved by authority | RCU/compliance | Block party/source as applicable. |
Loan Account Machine
Section titled “Loan Account Machine”The LMS owns this machine. LOS cannot change account state after booking.
Loan Account States
Section titled “Loan Account States”| State | Meaning | Entry trigger | Exit trigger |
|---|---|---|---|
pending_booking | Booking request accepted but account not fully created | loan_booking_requested | loan_booked or booking_failed |
active_undisbursed | Account or facility opened with zero disbursement | loan_booked_without_disbursement | first_disbursement_posted, cancel_account |
partially_disbursed | One or more tranches disbursed below sanctioned amount | tranche_posted | final_tranche_posted, cancel_undisbursed_balance, recall |
active_current | Live account with no overdue and no freeze | loan_booked or cure_completed | demand_overdue, freeze_account, foreclosure_posted, maturity_paid |
active_overdue | Live account with overdue amount but not NPA | demand_overdue | cure_completed, npa_classified, restructure_approved, recall |
frozen | Drawdown or servicing action is blocked | freeze_account | unfreeze_account, recall, close_account |
restructured | Terms changed due to approved restructuring | restructure_implemented | performance_cured, default_after_restructure, close_account |
recalled | Facility accelerated/terminated by lender | recall_notice_issued | settlement_implemented, legal_recovery_opened, close_account |
preclosed | Foreclosure amount paid before contractual maturity | foreclosure_posted | no_dues_generated, closure_reversed |
matured_pending_closure | Maturity reached and dues cleared but closure tasks remain | maturity_paid | no_dues_generated |
closed | No contractual dues; NOC and accounting closure done | no_dues_generated | None |
written_off | Accounting write-off posted; recovery may continue | writeoff_posted | recovery_after_writeoff_posted |
cancelled | Account cancelled before disbursement or booking reversed per policy | cancel_account | None |
Loan Account Transitions
Section titled “Loan Account Transitions”| From | Event | To | Guard | Actor/system | Side effects |
|---|---|---|---|---|---|
pending_booking | loan_booked_without_disbursement | active_undisbursed | Facility type permits limit opening before drawdown | LMS | Create account number and zero principal outstanding. |
pending_booking | loan_booked_with_first_disbursement | active_current | Disbursement posted and first schedule active | LMS | Publish first due date. |
active_undisbursed | first_disbursement_posted | partially_disbursed | Posted amount below sanctioned amount | LMS | Generate schedule or drawdown ledger. |
active_undisbursed | first_disbursement_posted_full | active_current | Posted amount equals sanctioned amount or single-tranche booking | LMS | Generate active schedule. |
partially_disbursed | final_tranche_posted | active_current | Total disbursed equals approved amount or undisbursed cancelled | Disbursement service | Update principal and schedule. |
active_current | demand_overdue | active_overdue | Day-end due remains unpaid after due date | LMS batch | Recompute DPD and open delinquency snapshot. |
active_overdue | cure_completed | active_current | Oldest unpaid dues cleared under appropriation rule | LMS | Publish DPD decrease. |
active_overdue | npa_classified | active_overdue | More than 90 DPD or CC/OD out-of-order trigger met | LMS | Update asset classification; collections bucket may change. |
active_current | freeze_account | frozen | Court stay, fraud hold, AML hold, deceased borrower, security issue or compliance hold | Authorized ops/compliance | Block disbursement/drawdown/service actions. |
active_overdue | freeze_account | frozen | Same as above | Authorized ops/compliance | Preserve overdue and DPD computation. |
frozen | unfreeze_account | active_current | No overdue and hold cleared | Authorized checker | Resume servicing. |
frozen | unfreeze_account_overdue | active_overdue | Hold cleared but arrears remain | Authorized checker | Resume collections. |
active_current | restructure_implemented | restructured | Approved restructure workflow and documents executed | LMS/credit | Create new schedule version and IRAC flags. |
active_overdue | restructure_implemented | restructured | Approved restructure; asset classification impact recorded | LMS/credit | Preserve old schedule and classification history. |
restructured | performance_cured | active_current | Satisfactory performance and regulatory cure rule met | LMS/risk | Update monitoring status. |
restructured | default_after_restructure | active_overdue | Revised due unpaid | LMS | Open delinquency case. |
active_current | foreclosure_posted | preclosed | Foreclosure quote paid and realized | LMS/ops | Stop future demands, create closure tasks. |
active_overdue | settlement_implemented | preclosed | OTS amount realized and waiver approved | Collections/LMS | Post waiver/write-off split. |
preclosed | no_dues_generated | closed | All charges, reversals, security release conditions and GL events complete | Ops checker | Generate NOC and charge release workflow. |
matured_pending_closure | no_dues_generated | closed | Same closure checks | Ops checker | Close account. |
active_overdue | writeoff_posted | written_off | Write-off approved under DoA and accounting posted | Finance/collections | Recovery case may remain open. |
| Any open state | account_cancelled_before_disbursement | cancelled | No posted disbursement or reversal approved | Ops checker | Cancel schedule and booking references. |
Delinquency Machine
Section titled “Delinquency Machine”The delinquency machine is computed by LMS at borrower and facility levels. Collections consumes it. RBI requires objective day-end SMA/NPA classification and NPA upgradation only after arrears are cleared; manual bucket edits are forbidden.
Delinquency States
Section titled “Delinquency States”| State | Trigger | Regulatory/operational meaning |
|---|---|---|
current | No overdue amount and no CC/OD out-of-order condition | Normal servicing |
x_bucket | Due within configured pre-due window or mandate risk detected | Pre-due reminder only |
dpd_1_30 | Oldest unpaid due is 1-30 DPD | Early delinquency; SMA-0 mapping where applicable |
dpd_31_60 | Oldest unpaid due is 31-60 DPD | SMA-1 for term-loan overdue |
dpd_61_90 | Oldest unpaid due is 61-90 DPD | SMA-2 for term-loan overdue |
npa_90_plus | More than 90 DPD or CC/OD out-of-order NPA condition | NPA recognition and income reversal/provisioning workflow |
restructured_watch | Restructure implemented and performance monitoring active | Watch for satisfactory performance or relapse |
written_off_recovery | Write-off posted while recovery continues | Accounting state differs from recovery state |
closed | Loan closed or cancelled | No delinquency action |
Delinquency Transitions
Section titled “Delinquency Transitions”| From | Event | To | Guard | Actor/system | Side effects |
|---|---|---|---|---|---|
current | pre_due_window_opened | x_bucket | Due date within configured T-minus days; account active | LMS batch | Create reminder segment. |
x_bucket | due_paid_before_due_date | current | Full current demand paid before due date | LMS | Close pre-due reminder. |
x_bucket | day_end_due_unpaid | dpd_1_30 | Due amount unpaid after day-end for due date | LMS batch | Open collections case if threshold met. |
current | day_end_due_unpaid | dpd_1_30 | Due amount unpaid after day-end | LMS batch | Compute oldest unpaid due date. |
dpd_1_30 | arrears_cleared | current | Oldest arrear cleared by realized receipt/approved waiver | LMS | Close or cure case. |
dpd_1_30 | dpd_crossed_30 | dpd_31_60 | Oldest unpaid due is greater than 30 DPD | LMS batch | Publish SMA-1 where applicable. |
dpd_31_60 | arrears_cleared | current | All overdue dues cleared | LMS | Publish cure. |
dpd_31_60 | partial_payment_posted | dpd_31_60 | Oldest unpaid due remains in same band | LMS | Update cure amount, not state. |
dpd_31_60 | dpd_crossed_60 | dpd_61_90 | Oldest unpaid due is greater than 60 DPD | LMS batch | Publish SMA-2 and legal readiness task. |
dpd_61_90 | arrears_cleared | current | All overdue dues cleared | LMS | Publish cure. |
dpd_61_90 | dpd_crossed_90 | npa_90_plus | More than 90 DPD | LMS batch | Trigger NPA accounting and income reversal. |
current | cc_od_out_of_order_90 | npa_90_plus | CC/OD continuously excess over limit/DP or insufficient credits for 90 days | LMS batch | Trigger NPA accounting. |
npa_90_plus | all_arrears_cleared | current | Entire arrears of principal and interest across linked facilities cleared | LMS | Upgrade to standard per RBI IRACP clarification. |
npa_90_plus | restructure_implemented | restructured_watch | Approved restructure and asset-class impact posted | LMS/risk | Start watch/performance counters. |
restructured_watch | satisfactory_performance_met | current | Policy/regulatory performance criteria met | Risk/LMS | Remove restructured watch flag if permitted. |
restructured_watch | restructured_due_unpaid | dpd_1_30 | Revised schedule due unpaid | LMS | Reopen delinquency. |
| Any non-closed | writeoff_posted | written_off_recovery | Write-off approved and accounting posted | Finance/LMS | Continue recovery case. |
| Any non-closed | loan_closed | closed | Loan closed, cancelled or settled with closure posted | LMS | Stop delinquency computation. |
Collections Case Machine
Section titled “Collections Case Machine”Collections cases are operational. They cannot cure DPD directly; they request payments, waivers, settlements, restructures or legal actions that LMS and approval services validate.
Collections Case States
Section titled “Collections Case States”| State | Meaning | Owner |
|---|---|---|
not_open | No active collections case | LMS/collections integration |
open_unallocated | Case created but no agent/team assigned | Collections supervisor |
allocated_tele | Telecalling queue owns next action | Tele collections |
allocated_field | Field visit or agency action required | Field collections/agency |
ptp_active | Valid Promise to Pay exists | Assigned collector |
ptp_broken | PTP date passed without agreed payment | Collections supervisor |
escalated_hard_bucket | Senior collections handling 31-90 DPD or high-risk early case | Hard bucket team |
legal_review | Legal route selection in progress | Legal/recovery |
settlement_review | OTS or waiver proposal under approval | Collections/credit/finance |
restructure_review | Viability-based restructure under review | Credit/risk |
repossession_or_enforcement | Collateral enforcement, repossession, SARFAESI, arbitration or DRT workflow active | Legal/recovery |
closed_cured | Case closed because arrears cured | Collections system |
closed_settled | Case closed by OTS/settlement implementation | Collections/LMS |
closed_written_off | Case closed operationally after write-off or transfer | Collections/finance |
closed_uncollectable | Recovery stopped per approved policy reason | Recovery head |
Collections Transitions
Section titled “Collections Transitions”| From | Event | To | Guard | Actor/system | Side effects |
|---|---|---|---|---|---|
not_open | delinquency_snapshot_received | open_unallocated | DPD or pre-due risk meets case threshold | Collections system | Create case with loan, borrower and cure amount. |
open_unallocated | auto_allocate_tele | allocated_tele | Bucket and exposure fit tele strategy | Strategy engine | Assign campaign and call rules. |
open_unallocated | auto_allocate_field | allocated_field | Exposure, bucket, risk or skip signal requires visit | Strategy engine | Assign field agent/agency. |
allocated_tele | ptp_recorded | ptp_active | PTP has amount, date, payer, mode and collector id | Collector | Pause excessive calling until PTP date unless high-risk. |
allocated_field | ptp_recorded | ptp_active | Same valid PTP guard | Field agent | Capture visit evidence. |
ptp_active | payment_received_matching_ptp | closed_cured | LMS confirms arrears cleared | LMS/collections | Close case and store cure event. |
ptp_active | partial_payment_received | allocated_tele | PTP partly kept but arrears remain and bucket is early | LMS/collector | Update cure amount. |
ptp_active | ptp_due_missed | ptp_broken | PTP date/time passed and LMS did not post expected payment | Collections system | Increase broken PTP count. |
ptp_broken | reallocate_tele | allocated_tele | Broken count below field threshold | Supervisor | Resume calls. |
ptp_broken | escalate_field | allocated_field | Broken count or exposure requires field | Supervisor | Create field task. |
allocated_tele | dpd_crossed_30_or_high_risk | escalated_hard_bucket | Bucket/risk threshold met | Strategy engine | Assign senior collector. |
allocated_field | negative_visit_or_skip | escalated_hard_bucket | Business closed, borrower skip, refusal or collateral concern | Field supervisor | Trigger legal/RCU review if required. |
escalated_hard_bucket | legal_route_requested | legal_review | 60+ DPD, fraud, skip, secured exposure, cheque bounce or recovery strategy | Collections manager | Legal case draft opened. |
escalated_hard_bucket | settlement_offer_received | settlement_review | Borrower offer includes amount, dates and source of funds | Collector | Generate OTS note. |
escalated_hard_bucket | restructure_request_received | restructure_review | Borrower financial difficulty and viability evidence present | Credit/collections | Open restructure workflow. |
legal_review | enforcement_approved | repossession_or_enforcement | Legal authority approves route and notices | Legal/recovery | Issue notices and update case. |
legal_review | legal_hold_or_defect | escalated_hard_bucket | Legal defect requires more collection or documentation | Legal | Create rework task. |
settlement_review | ots_approved | settlement_review | DoA approves waiver and settlement terms | Approval authority | Issue OTS letter; remain until funds realized. |
settlement_review | ots_funds_realized | closed_settled | LMS posts settlement receipt and waiver/write-off | LMS/finance | Close case and start security release if applicable. |
settlement_review | ots_rejected | escalated_hard_bucket | Authority rejects or borrower fails token condition | Approval authority | Resume normal recovery. |
restructure_review | restructure_implemented | closed_cured | LMS posts new schedule and collections case closed by policy | Credit/LMS | Open monitoring case if needed. |
repossession_or_enforcement | recovery_completed | closed_cured | Sale/payment clears arrears or account | Legal/LMS | Close enforcement tasks. |
| Any open state | arrears_cleared | closed_cured | LMS confirms cure | LMS | Close case and stop agency allocation. |
| Any open state | writeoff_posted | closed_written_off | Write-off posted and active recovery ended or transferred | Finance/recovery | Preserve recovery-after-write-off ledger. |
| Any open state | approved_uncollectable_closure | closed_uncollectable | Recovery head approval and reason code | Recovery head | Stop activity with audit reason. |
Sources
Section titled “Sources”- RBI, Prudential norms on IRACP - Clarifications, November 12, 2021
- RBI, Master Circular - Prudential norms on Income Recognition, Asset Classification and Provisioning pertaining to Advances, April 1, 2025
- RBI, Outsourcing of Financial Services - Responsibilities of regulated entities employing Recovery Agents, August 12, 2022
- RBI, Reserve Bank of India (Digital Lending) Directions, 2025