Part 10 — System Blueprint
BRE Functional Specification
This page specifies the functional contract for the BRE and decision service named in module map. It computes the policy outcomes described in underwriting decisioning and the credit appraisal package, then returns a reproducible decision object to LOS, credit workbench, the co-lending module and monitoring workflows.
The representation should align with Decision Model and Notation (DMN), the Object Management Group standard whose current formal version is DMN 1.4, adopted in April 2023 (OMG DMN 1.4). DMN is useful here because it separates a decision requirements graph from decision logic, decision tables, hit policies and expression language. The runtime may use a commercial or open-source engine, but the authoring model should preserve this structure so policy_risk, credit_manager, credit_committee_member and internal_auditor can read the policy without reverse-engineering application code.
Decision Domains
Section titled “Decision Domains”| Domain | Caller stage | Main inputs | Main outputs | SLA class |
|---|---|---|---|---|
| Pre-screen | prescreen_pending in LOS workflow | Product, channel, PAN/GSTIN, pincode, negative lists, consent status, repeat-customer flags | pre_screen_passed, hard_reject_triggered, missing-data list, coarse reason codes | Synchronous, sub-second engineering target after features are present |
| Eligibility and pricing | data_pending to credit_in_review, straight-through offers, renewal/top-up | Bureau, banking, GST, ITR/financials, Udyam/KYC, obligations, collateral, product grid | Amount, tenor, FOIR/DSCR/turnover/MPBF eligibility, rate, fees, risk grade, binding constraint | Synchronous for complete data; async when scorecard/model call is unavailable |
| Deviation classification | credit_in_review, deviation_pending | Rule failures, severity matrix, exposure, channel, product, risk grade | deviation rows with severity, required authority_level, waiver expiry and mitigant prompt | Synchronous, because queue routing depends on it |
| Sanction-condition derivation | approved, sanctioned, documentation_pending | Approved structure, collateral, KYC/document gaps, product, partner conditions | sanction_condition rows for CPs, CSs, covenants, monitoring requirements | Synchronous during sanction generation |
| Monitoring/EWS re-score | LMS active_current, active_overdue, monthly or event-driven monitoring | Repayment conduct, bureau refresh, GST/banking feeds, stock statements, anchor data, overdue history | Watchlist tier, limit-freeze flag, covenant breach, renewal route, collections alert | Async batch plus near-real-time triggers |
| Collections treatment | collection_case state changes | DPD, exposure, product, collateral, PTP history, contactability, legal eligibility | Tele/field/legal strategy, settlement eligibility band, next action and contact controls | Async or same-day batch, not borrower-facing instant decision |
Rule Representation
Section titled “Rule Representation”A ruleset is a versioned bundle of policies per product, lender and channel. The minimum bundle key is product_code, product_variant_code, business_line, regulated_entity_party_id, channel_type, effective_from, effective_to, ruleset_version, and status. For co-lending, the bundle also includes cla_id, both RE party ids, both policy versions and allowed split structure.
| Representation element | Required fields | Build rule |
|---|---|---|
| Decision table | decision_table_id, input columns, output columns, hit policy, priority, effective dates | Use for policy grids: geography, vintage, bureau band, GST turnover, FOIR caps, LTV caps, fee bands and deviation matrix. |
| Hit policy | hit_policy, aggregation, conflict handling | Supported values: UNIQUE, FIRST, PRIORITY, COLLECT, RULE_ORDER. Reject publish when a table marked UNIQUE has overlapping rows. |
| Expression condition | expression_id, expression language, variables, null policy | Use FEEL-style expressions where practical. If the engine uses another expression language, store a DMN-readable equivalent and test vectors. |
| Scorecard node | scorecard_id, input features, bins, points/model version, score bands | Use for application or behavioural scorecards. Store score output and rank-ordered drivers, not only the final score. |
| Decision requirements graph | drg_id, nodes, dependencies, input data, knowledge sources | Model dependencies from data quality to eligibility, from eligibility to pricing, and from policy failures to deviations. |
| Ruleset bundle | rule_set_id, rule_version_id, artifact hash, approver, validation report | Immutable after publish. Any change creates a new version and canary pointer. |
Input Contract
Section titled “Input Contract”The evaluator receives a canonical request. It must not fetch arbitrary data during rule evaluation. Missing features are resolved before the call, or declared using explicit null semantics.
| Field | Type | Source system | Freshness / consent | Nullability semantics |
|---|---|---|---|---|
application_id | uuid | LOS application | Current application version | Never null |
application_number | text | LOS | Current | Never null |
decision_point | enum | Caller | prescreen, eligibility, pricing, deviation, sanction_condition, monitoring, collections | Never null |
idempotency_key | text | Caller | One per snapshot, point and ruleset | Never null |
evaluation_timestamp | timestamptz | Caller | Injected, not read from wall clock inside rules | Never null |
ruleset_version_requested | text | Policy service | Active or explicit historical version | Never null |
product_code | text | application | Current | Never null |
product_variant_code | text | application | Current or default variant | Nullable only when product has no variants |
channel_type | enum | application | Current | Never null |
source_partner_id | uuid | application | Current | Required for dsa, lsp, anchor, co_lending |
primary_applicant_party_id | uuid | application | Current | Never null |
party_features | jsonb | KYC and AML service | KYC status current; BO status current | Hard fail if borrower KYC status absent at KYC-gated points |
bureau_features | jsonb | Bureau integration / external_verification | Timestamp and consent_id; product policy defines max age | Refer or hard fail by policy when mandatory report missing |
banking_features | jsonb | AA, BankConnect, upload analyzer | Statement end date, fetch timestamp, consent scope | Refer when mandatory; default only for explicitly optional metrics |
gst_features | jsonb | GST provider / borrower upload | Return period and fetch timestamp | Refer for GST-surrogate programs; optional for non-GST entities |
financial_features | jsonb | Credit workbench / spreads | Audited/provisional period and analyst version | Refer when method is audited_financials; nullable for scorecard_only |
udyam_kyc_features | jsonb | Udyam/KYC service | Verification timestamp | Refer if MSME/PSL classification is required |
platform_anchor_features | jsonb | anchor_data_feed, partner API | Batch id, consent scope, snapshot date | Optional unless partner program requires anchor data |
collateral_features | jsonb | Collateral and security service | Valuation date, legal status, insurance status | Hard fail for secured disbursement; refer during early eligibility |
obligation_features | jsonb | Bureau, banking, declared SOA | Snapshot timestamp | Refer if duplication unresolved |
co_lending_context | jsonb | Co-lending module | Active cla_id and share constraints | Required when co_lending_flag=true |
manual_overrides_requested | jsonb | Credit workbench | Maker, reason, evidence | Does not alter decision; only raises deviations |
Null handling is policy, not code. A feature has one of four meanings: not_applicable, unknown_but_optional, missing_required, or provider_unavailable. missing_required creates a refer or hard fail by decision point. provider_unavailable may use cached data only if the output is marked stale and the ruleset permits it. Silent defaulting to zero is forbidden for income, turnover, DPD, bounces, GST delays, collateral value or obligations.
Output Contract
Section titled “Output Contract”The decision object is persisted as bre_result.result_json, with selected values projected into typed fields on bre_result, deviation, credit_assessment, sanction_condition, partner_status_event and co-lending records.
| Field | Type | Semantics |
|---|---|---|
bre_result_id | uuid | Primary persisted result id. |
application_id | uuid | Same as input. |
decision_point | enum | Same as input. |
outcome | enum | approve, refer, decline, manual_review, error. For legacy bre_result.decision, map to pass, refer, fail, manual_review, error. |
outcome_confidence | enum | deterministic, scorecard_band, model_assisted, fallback_cached, incomplete. |
eligibility_by_method | array | Each row: method foir, dscr, turnover, mpbf, ltv, policy_cap; input amount; calculated capacity; applied haircut; result. |
binding_constraint | text | The method or policy cap that limited the final amount. Required when approved or referred. |
max_eligible_amount | numeric(18,2) | Amount to project to bre_result.max_eligible_amount. |
max_tenor_months | int | Tenor allowed by product, score band and repayment method. |
pricing_components | array | Base rate, risk premium, tenor premium, collateral discount, partner spread, fees, taxes, APR-relevant charges and policy min/max bounds. |
price_floor_rate | numeric(9,6) | Rate to project to bre_result.price_floor_rate, before final human pricing where allowed. |
conditions_precedent | array | Draft sanction_condition rows with condition_type=condition_precedent, owner role and blocking flag. |
conditions_subsequent | array | Covenant and monitoring items after disbursement. |
deviations | array | deviation_type, rule_code, severity, text, mitigant prompt, required_authority_level, expiry and whether waivable. |
reason_codes | array | Ranked reasons with code, human-readable CAM text, borrower-facing text when permitted, rule id and evidence values. |
model_inventory_refs | array | Model ids, scorecard ids and validation status used in this run. |
co_lending_allocation | object | See below. Required for co-lending decision points. |
audit_summary | object | Trace id, input snapshot ref, ruleset version, result hash and timing. |
The co-lending allocation block uses exact co-lending module names:
| Field | Type | Semantics |
|---|---|---|
cla_id | uuid | Active co_lending_arrangement. |
originating_re_party_id | uuid | Originating RE from co_lending_arrangement. |
partner_re_party_id | uuid | Partner RE from co_lending_arrangement. |
originator_policy_verdict | enum | approve, refer, decline, with originator ruleset version. |
partner_policy_verdict | enum | approve, refer, decline, with partner policy version or pending marker. |
eligible_pairings | array | Allowed RE pairing, product, geography and borrower segment rows. |
split_percentages | object | Proposed originator_share_percent and partner_share_percent; each must be at least 10 percent under RBI co-lending directions. |
blended_rate_computation | object | RE rates, share percentages, weighted blended rate, fees and APR inclusion. |
partner_share_preview | array | Draft partner_share amounts by RE. |
dlg_variant_flags | object | DLG present, dlg_set_id, cap remaining, covered portfolio and blocked reason if ineligible. |
partner_conditions | array | Conditions to convert into sanction_condition or partner-facing API messages. |
RBI’s 2025 co-lending directions make the dual-policy basis operational: each RE must incorporate CLA provisions into its own credit policy, changes to each RE rate follow that RE’s credit policy, each RE maintains its own borrower account for its share, and both shares must be reflected without delay and no later than 15 calendar days (RBI Co-Lending Arrangements Directions, 2025). The BRE should therefore record both policy verdicts, not only a joint blended offer.
Decision Trace And Audit Schema
Section titled “Decision Trace And Audit Schema”| Field | Type | Required | Purpose |
|---|---|---|---|
trace_id | uuid | Yes | Correlates request, evaluation nodes, logs and persisted result. |
idempotency_key | text | Yes | Deduplicates retries and replay. |
rule_set_id | uuid | Yes | Versioned rule bundle. |
rule_version_id | uuid | Yes | Immutable published version. |
input_snapshot_ref | text | Yes | Encrypted object reference for full input snapshot. |
input_snapshot_hash | char(64) | Yes | Hash for replay and tamper detection. |
node_evaluations | array | Yes | Each node has node id, node type, input values, output value, start/end time and errors. |
rule_evaluations | array | Yes | Each row has rule id/version, values seen, threshold, fired flag, hit policy result and DRD path. |
scorecard_evaluations | array | Conditional | Score, bins, points, rejected variables and top drivers. |
timing_by_node_ms | jsonb | Yes | Latency analysis and regression monitoring. |
external_model_refs | array | Conditional | Version-pinned model calls, feature vector hash and response hash. |
final_decision_hash | char(64) | Yes | Hash of canonical output JSON. |
pii_masking_profile | text | Yes | Describes redaction in logs and UI views. |
retention_until | date | Yes | Must satisfy audit, model inventory and loan-record retention policies. |
Full snapshots contain PII, bureau data, bank data and GST data. Store them encrypted, access-controlled through actors permissions, and masked by default. Operational logs should carry only ids, hashes, coarse bands and rule codes. A DSA, LSP or field user must never see raw bureau variables, CAM comments or hidden rule thresholds.
Ruleset Lifecycle
Section titled “Ruleset Lifecycle”| Step | Owner role | Required evidence | Exit control |
|---|---|---|---|
| Author draft | policy_risk | Business objective, affected product, regulatory basis, sample rows, expected approval/reject mix | Draft ruleset compiles and all tables pass overlap checks |
| Technical review | system_service / engineering | Schema compatibility, expression safety, performance test, no forbidden nondeterminism | Artifact build succeeds |
| Maker-checker approval | policy_risk maker, credit_manager or national_credit_head checker; aml_compliance for regulatory rules | Change note, old/new diff, expected portfolio impact | approval_request.status=approved |
| Simulation/backtest | policy_risk, risk analytics | Historical applications, outcomes, confusion matrix, approval mix, bad-rate estimate, reason-code distribution | Thresholds met or exception approved |
| Champion-challenger setup | policy_risk | Champion version, challenger version, sample split, stop-loss guardrail, monitoring dashboard | Publish as canary or shadow only |
| Publish | system_service | Immutable artifact hash, effective date, rollback pointer | Version pointer updated atomically |
| Monitor | policy_risk, internal_auditor read-only | Approval/refer/decline mix, override rate, drift, latency, rule-hit distribution | Alerts routed to owner |
| Rollback | policy_risk, system_service | Incident reason, affected versions, replay sample | Pointer reverts; decisions already issued remain immutable |
| Periodic review | policy_risk, independent validation function, RMCB/delegated authority for high-risk models | Validation report, model inventory status, monitoring, exceptions | Review recorded at least annually or earlier on trigger |
The June 24, 2026 RBI draft Guidance on Regulatory Principles for Model Risk Management applies broadly to banks, NBFC layers, AIFIs, ARCs and CICs. It covers internal, third-party and AI/ML models, and treats decision-based rules and computational tools as models when they materially affect decisions (RBI draft model risk guidance transcript). The BRE model inventory should therefore include scorecards, pricing calculators, ruleset bundles, feature transformations and third-party model calls.
Explainability And Governance
Section titled “Explainability And Governance”Reason codes are first-class output. A reason code has a stable code, internal text, borrower-facing text if permitted, rule or scorecard driver, evidence values, adverse-action severity and language version. The top reasons should be ranked by actual contribution to the outcome. Do not return generic messages such as POLICY_FAIL. For a decline, use specific but safe reasons such as high recent delinquency, insufficient verified turnover, unsettled bureau overdue, unsupported DSCR, ineligible geography, prohibited industry or KYC defect.
KFS and APR interplay is downstream but triggered here. Pricing outputs must label whether a charge is APR-relevant and whether it is borrower-payable, partner-payable or waived. Under co-lending, the borrower-facing rate is a weighted blended rate, and additional fees must be included in APR disclosure as applicable under the co-lending directions and KFS circular. The BRE should not generate the KFS, but it must provide structured pricing components so the KFS archive can reproduce the disclosed economics.
Model governance controls:
| Control | BRE implementation |
|---|---|
| Model inventory | Every ruleset, scorecard, pricing calculator and external model has an owner, validator, approver, risk tier and intended use. |
| Independent validation | Required before deployment, after material changes, on trigger events and periodically per MRMF. Third-party models still need RE validation. |
| Documentation | Store objective, assumptions, limitations, feature definitions, sample decisions, validation, approval, change history and decommissioning record. |
| Explainability | Store rule trace, score drivers, reason codes and borrower-safe text. |
| Human oversight | refer and manual_review outputs route to credit_analyst, credit_manager or the resolved DoA level; high-risk AI outputs need override/suspension controls. |
| Review cadence | At least annual tier review for all models, with earlier review on drift, material change, regulatory change, data-source change or performance breach. |
Sources
Section titled “Sources”- OMG, Decision Model and Notation Specification Version 1.4
- RBI draft release transcript, Guidance on Regulatory Principles for Model Risk Management, 24 June 2026
- RBI Co-Lending Arrangements Directions, 2025 transcript
- RBI, Reserve Bank of India (Digital Lending) Directions, 2025
- Experian, Decisioning software, engine and platform
- FinBox, What is a Credit Decisioning Platform?
- Scienaptic AI, Business Rules Engine for Credit Decisions