Credit Risk Lending Committee Skill
API Workflow
Base URL from environment (not localhost). Start with:
GET /api/manifest — lists endpoints, benchmark versions, record counts
GET /api/health — confirms service status
GET /api/policies — risk-rating thresholds, CDFI factor tables, stress formulas, CRE weights, concentration rules
Key data endpoints:
GET /api/branches / GET /api/branches/{id} — branch metadata, lending capacity, sector ceiling, CRE limit, state, institution type
GET /api/branches/{id}/metrics — quarterly metrics (NPA, total loans, delinquency, deposits)
GET /api/branches/{id}/loans — loan portfolio with ratings, DSCR, LTV, payment status, FICO, debt-to-asset, liquidity
GET /api/branches/{id}/sector-exposures — per-sector current exposure, limit_pct, grandfathered flag
GET /api/branches/{id}/applications — pending applications with DSCR, LTV, FICO, DTI, guarantor, relationship, SBA, bankruptcy
GET /api/benchmarks/fdic/q4-2024 — FDIC noncurrent/delinquency benchmarks
GET /api/benchmarks/ncua/q1-2025 — NCUA state-level metrics (delinquency_bps, loan_to_share_pct, roaa_bps, positive_net_income_pct)
GET /api/credit-union-segments/{id} — segment details, peer states, minimum checklist, internal context, quarterly capacity
Risk Rating Re-derivation (Dominant Factor Rule)
Final rating = worst (highest numeric) of available DSCR, LTV, and delinquency factors:
DSCR thresholds:
| DSCR Range |
Rating |
| ≥ 1.50 |
3 |
| ≥ 1.25 |
4 |
| ≥ 1.05 |
5 |
| ≥ 1.00 |
6 |
| < 1.00 |
7 |
LTV thresholds:
| LTV Range |
Rating |
| ≤ 0.65 |
3 |
| ≤ 0.75 |
4 |
| ≤ 0.85 |
5 |
| ≤ 1.00 |
6 |
| > 1.00 |
7 |
Delinquency minimums:
| Payment Status |
Minimum Rating |
| Current |
(none) |
| 30 Days Past Due |
4 |
| 60 Days Past Due |
5 |
| 90+ Days Past Due |
7 |
| Nonaccrual |
8 |
Material downgrade = ≥ 2 notches (per policy material_downgrade_notches).
When a loan has no DSCR, LTV, or delinquency-based factors available, retain its current rating.
CDFI Factor Scoring
Factor score = FICO score + LTV score + Debt-to-Asset score + Liquidity score. Null/missing factors score 0.
| Factor |
Range |
Score |
| FICO |
>720 / 680-720 / 580-679 / <580 |
0 / 1 / 3 / 5 |
| LTV |
<0.40 / 0.40-0.60 / 0.60-0.80 / >0.80 |
0 / 2 / 4 / 6 |
| Debt-to-Asset |
<0.40 / 0.40-0.60 / 0.60-0.80 / >0.80 |
0 / 2 / 4 / 6 |
| Liquidity (months) |
>12 / 6-12 / 3-6 / <3 |
0 / 1 / 3 / 5 |
Risk classes: Prime (0-5), Desirable (6-9), Satisfactory (10-13), Watch (14-18), Doubtful (≥19), Projected Loss (≥19 and LTV > 1.0).
For Nonaccrual loans with underwater collateral (LTV > 1.0), "Projected Loss" classification may apply even when the numeric score is below 19, reflecting the credit's actual loss exposure.
Stress-Test Formulas
Watch-list parallel shock (+200bp):
stressed_dscr = dscr / (1 + 0.18)
breach_threshold = 1.0
CRE dual-stress formula:
stressed_dscr = dscr × 0.85 / (1 + 0.18)
breach_threshold = 1.0
CRE Weighted Scoring (Competing Credit)
Score each application 1-5 (1=best) on five dimensions, then compute weighted sum. Lower total is better.
| Dimension |
Weight |
Key Drivers |
| Capacity |
0.45 |
DSCR (≥1.5→1, ≥1.35→2, ≥1.25→3, ≥1.10→4, <1.10→5) |
| Capital |
0.03 |
Debt/Asset ratio |
| Character |
0.05 |
Guarantor strength, relationship years, prior delinquencies |
| Collateral/Exposure |
0.36 |
LTV |
| Conditions |
0.11 |
Loan purpose, sector stability, term |
Score classes: approve_quality (≤ 2.0), conditional (≤ 3.0), weak (> 3.0).
Concentration Rules
Sector concentration limit = limit_pct × total_loans_outstanding. Per-sector overrides live in sector-exposures (e.g., Healthcare may have a tighter limit_pct than the branch default sector_ceiling_pct).
Existing over-ceiling exposure is grandfathered, but new approvals may not worsen that sector without mitigation: participation_required, reduced_amount, or board_exception.
CRE exposure = sum of outstanding balances for loans with loan_type = "CRE". CRE concentration = CRE exposure / total_loans_outstanding. Compare against cre_policy_limit_pct.
For SBA-guaranteed loans, only the unguaranteed portion (approved_amount × (1 - sba_guaranty_pct)) counts against bank_capacity_used, but the full approved amount counts toward sector/CRE concentration.
Benchmark Conventions
NPA benchmark: Use total_loans_noncurrent_pct from FDIC Q4 2024. Branch NPA = nonperforming_loans from branch metrics. Ratios computed against total_loans_outstanding.
FDIC delinquency benchmark: Use total_real_estate_30_89_pct for CRE-related reviews. Branch ratio = branch-level delinquency metric (from branch metrics or computed from loan-level data).
NCUA benchmarks: Use exact integer values from the NCUA Q1 2025 table. Peer median = median of listed peer states for each metric. Direction comparisons: "higher", "lower", or "equal" relative to US national or peer median.
Output Field Conventions
- Exposure/balance fields: rounded to 2 decimal places (USD)
- Ratios (percentages as decimals): rounded to 4 decimal places
- Basis points (bps): rounded to 2 decimal places; bps = ratio × 10000
- Weighted CDFI CRE score: rounded to 1 decimal place
- NCUA metric integers: exact values as reported (no rounding)
- factor_score: integer
- Sorting: loan_ids ascending within lists; final_rating ascending in exposure totals; sector then application_id for concentration flags; descending exposure then ascending loan_id for workout queues
- Lists with no items: use empty array
[], not omitted
- Enum values: use exact string values from templates; do not invent new ones
Common Pitfalls
Sector limit computation: Always use limit_pct × total_loans_outstanding (not total_assets or lending_capacity). Verify by summing sector_exposures — they should equal total_loans_outstanding.
Re-derivation population: Only loans meeting the rating threshold (e.g., current_rating ≥ 3) are re-derived. Loans below threshold keep their current rating and are excluded from target counts but included in portfolio-wide exposure totals.
Final rating exposure totals: Include only the re-derived (target) population, not all branch loans. Each loan's final re-derived rating is its assigned bucket.
Watch-list action coverage: All target-population loans receive an action assignment. Action tiers: monitor (ratings 3-4), watchlist (5-6), special_assets (7, current), workout (7, past due), partial_chargeoff_review or legal_referral (8).
Delinquency factor is a minimum, not additive: If a loan is 30 DPD, the rating cannot be better than 4 regardless of DSCR/LTV.
SBA capacity treatment: bank_capacity_used = approved_amount × (1 - sba_guaranty_pct). The SBA-guaranteed portion reduces the bank's capital commitment. But full amount counts toward gross and sector exposure.
Post-approval concentrations: Only include sectors with approved applications or existing exposure changes. Unaffected sectors may be omitted from the summary.
Monitoring cadence for mixed adverse portfolios: Use quarterly as default when the population spans multiple risk classes; use monthly only when most credits are Watch or worse.
DSCR-stressed rounding: Compute stressed DSCR from raw base DSCR first, then round the result to 2 decimals.
NCUA peer median: Sort peer state values, take middle. For 3 peers, it's the 2nd value. Compare NC against this median for each of the 4 metrics independently.
1---2name: reflect-3-attempt-02-533description: Credit Risk Lending Committee Skill4---5# Credit Risk Lending Committee Skill67## API Workflow89Base URL from environment (not localhost). Start with:10- `GET /api/manifest` — lists endpoints, benchmark versions, record counts11- `GET /api/health` — confirms service status12- `GET /api/policies` — risk-rating thresholds, CDFI factor tables, stress formulas, CRE weights, concentration rules1314Key data endpoints:15- `GET /api/branches` / `GET /api/branches/{id}` — branch metadata, lending capacity, sector ceiling, CRE limit, state, institution type16- `GET /api/branches/{id}/metrics` — quarterly metrics (NPA, total loans, delinquency, deposits)17- `GET /api/branches/{id}/loans` — loan portfolio with ratings, DSCR, LTV, payment status, FICO, debt-to-asset, liquidity18- `GET /api/branches/{id}/sector-exposures` — per-sector current exposure, limit_pct, grandfathered flag19- `GET /api/branches/{id}/applications` — pending applications with DSCR, LTV, FICO, DTI, guarantor, relationship, SBA, bankruptcy20- `GET /api/benchmarks/fdic/q4-2024` — FDIC noncurrent/delinquency benchmarks21- `GET /api/benchmarks/ncua/q1-2025` — NCUA state-level metrics (delinquency_bps, loan_to_share_pct, roaa_bps, positive_net_income_pct)22- `GET /api/credit-union-segments/{id}` — segment details, peer states, minimum checklist, internal context, quarterly capacity2324## Risk Rating Re-derivation (Dominant Factor Rule)2526Final rating = worst (highest numeric) of available DSCR, LTV, and delinquency factors:2728**DSCR thresholds:**29| DSCR Range | Rating |30|---|---|31| ≥ 1.50 | 3 |32| ≥ 1.25 | 4 |33| ≥ 1.05 | 5 |34| ≥ 1.00 | 6 |35| < 1.00 | 7 |3637**LTV thresholds:**38| LTV Range | Rating |39|---|---|40| ≤ 0.65 | 3 |41| ≤ 0.75 | 4 |42| ≤ 0.85 | 5 |43| ≤ 1.00 | 6 |44| > 1.00 | 7 |4546**Delinquency minimums:**47| Payment Status | Minimum Rating |48|---|---|49| Current | (none) |50| 30 Days Past Due | 4 |51| 60 Days Past Due | 5 |52| 90+ Days Past Due | 7 |53| Nonaccrual | 8 |5455**Material downgrade = ≥ 2 notches** (per policy `material_downgrade_notches`).5657When a loan has no DSCR, LTV, or delinquency-based factors available, retain its current rating.5859## CDFI Factor Scoring6061Factor score = FICO score + LTV score + Debt-to-Asset score + Liquidity score. Null/missing factors score 0.6263| Factor | Range | Score |64|---|---|---|65| FICO | >720 / 680-720 / 580-679 / <580 | 0 / 1 / 3 / 5 |66| LTV | <0.40 / 0.40-0.60 / 0.60-0.80 / >0.80 | 0 / 2 / 4 / 6 |67| Debt-to-Asset | <0.40 / 0.40-0.60 / 0.60-0.80 / >0.80 | 0 / 2 / 4 / 6 |68| Liquidity (months) | >12 / 6-12 / 3-6 / <3 | 0 / 1 / 3 / 5 |6970**Risk classes:** Prime (0-5), Desirable (6-9), Satisfactory (10-13), Watch (14-18), Doubtful (≥19), Projected Loss (≥19 and LTV > 1.0).7172For Nonaccrual loans with underwater collateral (LTV > 1.0), "Projected Loss" classification may apply even when the numeric score is below 19, reflecting the credit's actual loss exposure.7374## Stress-Test Formulas7576**Watch-list parallel shock (+200bp):**77```78stressed_dscr = dscr / (1 + 0.18)79breach_threshold = 1.080```8182**CRE dual-stress formula:**83```84stressed_dscr = dscr × 0.85 / (1 + 0.18)85breach_threshold = 1.086```8788## CRE Weighted Scoring (Competing Credit)8990Score each application 1-5 (1=best) on five dimensions, then compute weighted sum. Lower total is better.9192| Dimension | Weight | Key Drivers |93|---|---|---|94| Capacity | 0.45 | DSCR (≥1.5→1, ≥1.35→2, ≥1.25→3, ≥1.10→4, <1.10→5) |95| Capital | 0.03 | Debt/Asset ratio |96| Character | 0.05 | Guarantor strength, relationship years, prior delinquencies |97| Collateral/Exposure | 0.36 | LTV |98| Conditions | 0.11 | Loan purpose, sector stability, term |99100**Score classes:** approve_quality (≤ 2.0), conditional (≤ 3.0), weak (> 3.0).101102## Concentration Rules103104**Sector concentration limit** = `limit_pct × total_loans_outstanding`. Per-sector overrides live in sector-exposures (e.g., Healthcare may have a tighter limit_pct than the branch default `sector_ceiling_pct`).105106Existing over-ceiling exposure is grandfathered, but new approvals may not worsen that sector without mitigation: `participation_required`, `reduced_amount`, or `board_exception`.107108**CRE exposure** = sum of outstanding balances for loans with `loan_type = "CRE"`. CRE concentration = CRE exposure / total_loans_outstanding. Compare against `cre_policy_limit_pct`.109110For SBA-guaranteed loans, only the unguaranteed portion (`approved_amount × (1 - sba_guaranty_pct)`) counts against `bank_capacity_used`, but the full approved amount counts toward sector/CRE concentration.111112## Benchmark Conventions113114**NPA benchmark:** Use `total_loans_noncurrent_pct` from FDIC Q4 2024. Branch NPA = `nonperforming_loans` from branch metrics. Ratios computed against `total_loans_outstanding`.115116**FDIC delinquency benchmark:** Use `total_real_estate_30_89_pct` for CRE-related reviews. Branch ratio = branch-level delinquency metric (from branch metrics or computed from loan-level data).117118**NCUA benchmarks:** Use exact integer values from the NCUA Q1 2025 table. Peer median = median of listed peer states for each metric. Direction comparisons: "higher", "lower", or "equal" relative to US national or peer median.119120## Output Field Conventions121122- **Exposure/balance fields:** rounded to 2 decimal places (USD)123- **Ratios (percentages as decimals):** rounded to 4 decimal places124- **Basis points (bps):** rounded to 2 decimal places; bps = ratio × 10000125- **Weighted CDFI CRE score:** rounded to 1 decimal place126- **NCUA metric integers:** exact values as reported (no rounding)127- **factor_score:** integer128- **Sorting:** loan_ids ascending within lists; final_rating ascending in exposure totals; sector then application_id for concentration flags; descending exposure then ascending loan_id for workout queues129- **Lists with no items:** use empty array `[]`, not omitted130- **Enum values:** use exact string values from templates; do not invent new ones131132## Common Pitfalls1331341. **Sector limit computation:** Always use `limit_pct × total_loans_outstanding` (not total_assets or lending_capacity). Verify by summing sector_exposures — they should equal total_loans_outstanding.1351362. **Re-derivation population:** Only loans meeting the rating threshold (e.g., current_rating ≥ 3) are re-derived. Loans below threshold keep their current rating and are excluded from target counts but included in portfolio-wide exposure totals.1371383. **Final rating exposure totals:** Include only the re-derived (target) population, not all branch loans. Each loan's final re-derived rating is its assigned bucket.1391404. **Watch-list action coverage:** All target-population loans receive an action assignment. Action tiers: monitor (ratings 3-4), watchlist (5-6), special_assets (7, current), workout (7, past due), partial_chargeoff_review or legal_referral (8).1411425. **Delinquency factor is a minimum, not additive:** If a loan is 30 DPD, the rating cannot be better than 4 regardless of DSCR/LTV.1431446. **SBA capacity treatment:** `bank_capacity_used = approved_amount × (1 - sba_guaranty_pct)`. The SBA-guaranteed portion reduces the bank's capital commitment. But full amount counts toward gross and sector exposure.1451467. **Post-approval concentrations:** Only include sectors with approved applications or existing exposure changes. Unaffected sectors may be omitted from the summary.1471488. **Monitoring cadence for mixed adverse portfolios:** Use `quarterly` as default when the population spans multiple risk classes; use `monthly` only when most credits are Watch or worse.1491509. **DSCR-stressed rounding:** Compute stressed DSCR from raw base DSCR first, then round the result to 2 decimals.15115210. **NCUA peer median:** Sort peer state values, take middle. For 3 peers, it's the 2nd value. Compare NC against this median for each of the 4 metrics independently.