Bank Branch Credit-Risk Lending-Committee Skill
Environment & API Entry
Base URL: http://34.46.77.124:8011 (from environment_access.md; overrides any localhost refs in task prompts).
Start every session with GET /api/manifest to confirm benchmark versions and available endpoints.
Core Endpoints
| Endpoint |
Returns |
GET /api/manifest |
Benchmark versions, record counts, endpoint list |
GET /api/branches |
All branches with branch_id, institution_type, lending_capacity_q1, sector_ceiling_pct, cre_policy_limit_pct, state_code, total_assets |
GET /api/branches/{id} |
Single branch detail |
GET /api/branches/{id}/metrics |
Quarterly metrics (2025Q1, 2024Q4): total_loans_outstanding, nonperforming_loans, total_deposits, delinquency_30_plus_pct, net_charge_offs, allowance_for_loan_losses |
GET /api/branches/{id}/loans |
All loans: loan_id, current_rating, dscr, ltv, fico, payment_status, outstanding_balance, collateral_value, debt_to_asset, liquidity_months, sector, loan_type, borrower_name, days_past_due, guarantor_strength, interest_rate, notes |
GET /api/branches/{id}/sector-exposures |
Per-sector: sector, current_exposure, limit_pct, grandfathered |
GET /api/branches/{id}/applications |
Pending applications: application_id, requested_amount, dscr, ltv, fico, sector, loan_type, documentation_complete, prior_delinquencies_12m, bankruptcy_months_ago, years_in_business, sba_guaranty_pct, co_guarantor_strength, existing_relationship_years, relationship_deposit_balance, proposed_rate, term_months, purpose, business_name, total_assets, total_debt, annual_revenue, net_income, notes |
GET /api/policies |
Credit policy: risk_rating, cdfi_factor_scores, cre_weighted_score, capacity_concentration, stress |
GET /api/benchmarks/fdic/q4-2024 |
FDIC benchmark ratios (single object, not an array) |
GET /api/benchmarks/ncua/q1-2025 |
NCUA state rows: state_code, delinquency_bps, loan_to_share_pct, roaa_bps, positive_net_income_pct |
GET /api/credit-union-segments/{id} |
Segment detail: state_code, peer_states, risk_tolerance, quarterly_capacity, current_outstanding, recent_delinquency_bps, minimum_checklist, notes |
Risk Rating Re-Derivation (Dominant Factor Rule)
Rule: Final re-derived rating = worst (highest numeric) rating from all available factors among DSCR, LTV, and delinquency.
DSCR → Rating
| DSCR Range |
Rating |
| ≥ 1.50 |
3 |
| ≥ 1.25 |
4 |
| ≥ 1.05 |
5 |
| ≥ 1.00 |
6 |
| < 1.00 |
7 |
LTV → Rating
| LTV Range |
Rating |
| ≤ 0.65 |
3 |
| ≤ 0.75 |
4 |
| ≤ 0.85 |
5 |
| ≤ 1.00 |
6 |
| > 1.00 |
7 |
Delinquency Floor (minimum rating from payment status)
| Payment Status |
Minimum Rating |
| Current |
no floor |
| 30 Days Past Due |
4 |
| 60 Days Past Due |
5 |
| 90+ Days Past Due |
7 |
| Nonaccrual |
8 |
Null/missing factors: If DSCR or LTV is null, skip that factor entirely (it contributes nothing). Delinquency floor always applies regardless of other factors.
Material downgrade: A re-derived final_rating that is ≥ 2 notches worse than current_rating (final_rating − current_rating ≥ 2).
CDFI Risk-Class Scoring
Assign each loan a risk class by summing independent factor scores. Score each factor where data is available; skip nulls.
| Factor |
Range |
Score |
| FICO |
> 720 |
0 |
|
680–720 |
1 |
|
580–679 |
3 |
|
< 580 |
5 |
| LTV |
< 0.40 |
0 |
|
0.40–0.60 |
2 |
|
0.60–0.80 |
4 |
|
> 0.80 |
6 |
| Debt-to-Asset |
< 0.40 |
0 |
|
0.40–0.60 |
2 |
|
0.60–0.80 |
4 |
|
> 0.80 |
6 |
| Liquidity Months |
> 12 |
0 |
|
6–12 |
1 |
|
3–6 |
3 |
|
< 3 |
5 |
Risk class from total score:
- 0–5: Prime
- 6–9: Desirable
- 10–13: Satisfactory
- 14–18: Watch
- ≥ 19: Doubtful
- ≥ 19 AND LTV > 1.0: Projected Loss
CRE Weighted Credit Scoring
Used for competing CRE application decisions. Weights: capacity 0.45, capital 0.03, character 0.05, collateral_exposure 0.36, conditions 0.11.
Score classes (lower is better):
- ≤ 2.0: approve_quality
- ≤ 3.0: conditional
3.0: weak
Stress-Test Formulas
Watch-list +200bp DSCR Stress
stressed_dscr = base_dscr / 1.18
Applied to watch-list loans where DSCR is available. Breach threshold = 1.00.
CRE Dual Stress
stressed_dscr = dscr × 0.85 / 1.18
Coverage breach threshold = 1.00.
Concentration Rules
Sector Concentration
- Each branch has a default
sector_ceiling_pct on the branch object.
- The
/sector-exposures endpoint provides per-sector limit_pct which may differ from the default.
grandfathered: 1 = existing over-limit exposure is tolerated but new approvals must not worsen that sector without mitigation.
- Allowed mitigations:
participation_required, reduced_amount, board_exception.
- Concentration ratio = sector_exposure / total_loans_outstanding (use most recent quarter, Q1).
CRE Concentration
- Branch
cre_policy_limit_pct caps total CRE exposure as a fraction of total loans.
- Post-approval CRE = (existing CRE exposure + selected app amount) / total_loans_outstanding.
- FDIC benchmark:
total_real_estate_30_89_pct for delinquency comparison.
Capacity
lending_capacity_q1 from branch is the Q1 lending budget.
- Bank capacity used = requested_amount (or approved amount).
- Committed capacity = sum of approved amounts.
NPA Benchmark Calculation
Metric: total_loans_noncurrent_pct from FDIC Q4 2024 (0.0098).
branch_npa_exposure = nonperforming_loans (from 2025Q1 metrics)
branch_total_loans = total_loans_outstanding (from 2025Q1 metrics)
branch_npa_ratio = branch_npa_exposure / branch_total_loans
variance_ratio = branch_npa_ratio - fdic_benchmark_ratio
variance_bps = variance_ratio × 10000
Credit Union Segment Posture
From segment endpoint: risk_tolerance, recent_delinquency_bps, state_code, peer_states, quarterly_capacity, current_outstanding, minimum_checklist, internal control_issue, staffing_constraint, notes.
State Metrics
Read from NCUA benchmark row matching the segment's state_code. Values are integers exactly as reported.
Peer Comparison
Compare NC state metrics to US national row (state_code: "US") and peer-state median.
Direction: higher, lower, or equal for each of delinquency_bps, loan_to_share_pct, roaa_bps, positive_net_income_pct.
Posture Decision
continue_approving — capacity available, external risk stronger/neutral, risk_tolerance expansive or moderate with strong metrics.
continue_with_tighter_conditions — capacity available but external risk mixed or requires added controls.
temporarily_pause — severe external risk weakness or capacity exhausted.
Controls & Triggers
required_checklist_gates: from segment minimum_checklist plus any additional required gates.
added_operating_controls: derived from internal context (control issues, staffing constraints) and posture.
escalation_triggers: conditions like segment_recent_delinquency_ge_90_bps, missing_insurance_or_lien_exception, quarterly_capacity_exceeded_or_exception_requested, state_delinquency_gap_widens_25_bps. Owners: credit_risk_manager, operations_control_manager, lending_committee_chair.
Allocation & Decision Logic
Priority Ranking
Rank applications by credit quality signals: higher DSCR, higher FICO, lower LTV, longer relationship, lower risk sector concentration impact. Applications with documentation_complete: 0 or red flags (recent bankruptcy, very low FICO, startup with no mitigants) rank lower.
Decision Codes
approve, conditional_approve, decline, defer, participation_required
Condition Codes
participation_required, reduced_amount, board_exception, sba_guaranty_required, startup_monitoring, none
Decline Reason Codes
capacity_limit, sector_breach, weak_dscr, high_ltv, low_fico, recent_bankruptcy, startup_risk, underwater_collateral, policy_floor_missing, documentation_gap, fdic_adverse_variance, ncua_peer_weakness
Recommended Action Codes
monitor, watchlist, special_assets, workout, partial_chargeoff_review, legal_referral
Output Conventions (MUST FOLLOW)
Numeric Precision
| Field Type |
Decimals |
Example |
| Currency (USD) |
2 |
1234567.89 |
| Ratios / percentages (as decimal) |
4 |
0.0523 |
| Basis points (bps) |
2 |
52.30 |
| Weighted CDFI score |
1 |
2.5 |
| NCUA integer metrics |
integers (as reported) |
79 |
Sorting
- Lists of loans/ratings: ascending by the key field (final_rating, loan_id, application_id, sector, trigger_id, payment_status).
- Exception:
workout_queue sorts descending exposure, then ascending loan_id.
material_downgrades: ascending loan_id.
decline_reasons: reason codes sorted alphabetically within each application.
conditions (Harbor): ascending alphabetically.
Enum Values — Exact Strings Required
Payment status: "Current", "30 Days Past Due", "60 Days Past Due", "90+ Days Past Due", "Nonaccrual"
Risk class: "Prime", "Desirable", "Satisfactory", "Watch", "Doubtful", "Projected Loss"
Score class: "approve_quality", "conditional", "weak"
Monitoring cadence: "monthly", "quarterly", "semiannual"
Posture: "continue_approving", "continue_with_tighter_conditions", "temporarily_pause"
Common Pitfalls
- Nonaccrual dominates: A loan with payment_status
"Nonaccrual" gets rating 8 regardless of DSCR/LTV — the delinquency floor is a hard minimum, and 8 is the worst possible.
- Missing DSCR/LTV: When
dscr or ltv is null, skip that factor in dominant-factor rating. Do NOT assign a rating from it.
- Material downgrade threshold is 2, not 1: Only report downgrades where final_rating − current_rating ≥ 2.
- FDIC benchmark is one object, not an array:
GET /api/benchmarks/fdic/q4-2024 returns {} with named fields, not [].
- Sorting
migration_from_current_rating_3: Sort by final_rating ascending, not by loan_id.
variance_bps = variance_ratio × 10000: 1% = 100 bps, so ratio 0.01 = 100 bps. Multiply ratio by 10000 to get bps.
- NCUA
US row: The national row has state_code: "US" — use it for the national comparison.
- Peer median, not mean: For NCUA peer comparison, compute the median of peer-state values, not the mean.
- Watch-list stress only for loans with DSCR: Loans without DSCR are excluded from
stress_results; only include loans where dscr is not null.
- Grandfathering is per-sector: Check
grandfathered field in sector-exposures. Sectors with grandfathered=1 may show exposure above limit_pct.
- Top problem credit: Select the loan with the worst (highest) final_rating. If tied, pick the one with the highest exposure. Include
recommended_action from the action-code enum.
watch_list_action_coverage: Count loans from the regrade population that received a watch-list action. Group by action type with loan_ids sorted ascending.
- CRE dual-stress formula is
dscr * 0.85 / 1.18: Apply the 0.85 revenue haircut AND the 1.18 rate shock multiplicatively, not additively.
approved_amount vs requested_amount: For conditional approvals, approved_amount may be less than requested_amount (e.g., reduced_amount condition).
- Post-approval concentration: Recompute sector exposure after adding approved amounts to the relevant sectors.
1---2name: self-attempt-03-493description: Bank Branch Credit-Risk Lending-Committee Skill4---5# Bank Branch Credit-Risk Lending-Committee Skill67## Environment & API Entry89Base URL: `http://34.46.77.124:8011` (from `environment_access.md`; overrides any localhost refs in task prompts).1011Start every session with `GET /api/manifest` to confirm benchmark versions and available endpoints.1213### Core Endpoints1415| Endpoint | Returns |16|---|---|17| `GET /api/manifest` | Benchmark versions, record counts, endpoint list |18| `GET /api/branches` | All branches with `branch_id`, `institution_type`, `lending_capacity_q1`, `sector_ceiling_pct`, `cre_policy_limit_pct`, `state_code`, `total_assets` |19| `GET /api/branches/{id}` | Single branch detail |20| `GET /api/branches/{id}/metrics` | Quarterly metrics (2025Q1, 2024Q4): `total_loans_outstanding`, `nonperforming_loans`, `total_deposits`, `delinquency_30_plus_pct`, `net_charge_offs`, `allowance_for_loan_losses` |21| `GET /api/branches/{id}/loans` | All loans: `loan_id`, `current_rating`, `dscr`, `ltv`, `fico`, `payment_status`, `outstanding_balance`, `collateral_value`, `debt_to_asset`, `liquidity_months`, `sector`, `loan_type`, `borrower_name`, `days_past_due`, `guarantor_strength`, `interest_rate`, `notes` |22| `GET /api/branches/{id}/sector-exposures` | Per-sector: `sector`, `current_exposure`, `limit_pct`, `grandfathered` |23| `GET /api/branches/{id}/applications` | Pending applications: `application_id`, `requested_amount`, `dscr`, `ltv`, `fico`, `sector`, `loan_type`, `documentation_complete`, `prior_delinquencies_12m`, `bankruptcy_months_ago`, `years_in_business`, `sba_guaranty_pct`, `co_guarantor_strength`, `existing_relationship_years`, `relationship_deposit_balance`, `proposed_rate`, `term_months`, `purpose`, `business_name`, `total_assets`, `total_debt`, `annual_revenue`, `net_income`, `notes` |24| `GET /api/policies` | Credit policy: `risk_rating`, `cdfi_factor_scores`, `cre_weighted_score`, `capacity_concentration`, `stress` |25| `GET /api/benchmarks/fdic/q4-2024` | FDIC benchmark ratios (single object, not an array) |26| `GET /api/benchmarks/ncua/q1-2025` | NCUA state rows: `state_code`, `delinquency_bps`, `loan_to_share_pct`, `roaa_bps`, `positive_net_income_pct` |27| `GET /api/credit-union-segments/{id}` | Segment detail: `state_code`, `peer_states`, `risk_tolerance`, `quarterly_capacity`, `current_outstanding`, `recent_delinquency_bps`, `minimum_checklist`, `notes` |2829---3031## Risk Rating Re-Derivation (Dominant Factor Rule)3233**Rule**: Final re-derived rating = **worst (highest numeric)** rating from all available factors among DSCR, LTV, and delinquency.3435### DSCR → Rating36| DSCR Range | Rating |37|---|---|38| ≥ 1.50 | 3 |39| ≥ 1.25 | 4 |40| ≥ 1.05 | 5 |41| ≥ 1.00 | 6 |42| < 1.00 | 7 |4344### LTV → Rating45| LTV Range | Rating |46|---|---|47| ≤ 0.65 | 3 |48| ≤ 0.75 | 4 |49| ≤ 0.85 | 5 |50| ≤ 1.00 | 6 |51| > 1.00 | 7 |5253### Delinquency Floor (minimum rating from payment status)54| Payment Status | Minimum Rating |55|---|---|56| Current | *no floor* |57| 30 Days Past Due | 4 |58| 60 Days Past Due | 5 |59| 90+ Days Past Due | 7 |60| Nonaccrual | 8 |6162**Null/missing factors**: If DSCR or LTV is `null`, skip that factor entirely (it contributes nothing). Delinquency floor always applies regardless of other factors.6364**Material downgrade**: A re-derived final_rating that is ≥ 2 notches worse than current_rating (final_rating − current_rating ≥ 2).6566---6768## CDFI Risk-Class Scoring6970Assign each loan a risk class by summing independent factor scores. Score each factor where data is available; skip nulls.7172| Factor | Range | Score |73|---|---|---|74| **FICO** | > 720 | 0 |75| | 680–720 | 1 |76| | 580–679 | 3 |77| | < 580 | 5 |78| **LTV** | < 0.40 | 0 |79| | 0.40–0.60 | 2 |80| | 0.60–0.80 | 4 |81| | > 0.80 | 6 |82| **Debt-to-Asset** | < 0.40 | 0 |83| | 0.40–0.60 | 2 |84| | 0.60–0.80 | 4 |85| | > 0.80 | 6 |86| **Liquidity Months** | > 12 | 0 |87| | 6–12 | 1 |88| | 3–6 | 3 |89| | < 3 | 5 |9091**Risk class from total score**:92- 0–5: **Prime**93- 6–9: **Desirable**94- 10–13: **Satisfactory**95- 14–18: **Watch**96- ≥ 19: **Doubtful**97- ≥ 19 **AND** LTV > 1.0: **Projected Loss**9899---100101## CRE Weighted Credit Scoring102103Used for competing CRE application decisions. Weights: capacity 0.45, capital 0.03, character 0.05, collateral_exposure 0.36, conditions 0.11.104105Score classes (lower is better):106- ≤ 2.0: **approve_quality**107- ≤ 3.0: **conditional**108- > 3.0: **weak**109110---111112## Stress-Test Formulas113114### Watch-list +200bp DSCR Stress115```116stressed_dscr = base_dscr / 1.18117```118Applied to watch-list loans where DSCR is available. Breach threshold = 1.00.119120### CRE Dual Stress121```122stressed_dscr = dscr × 0.85 / 1.18123```124Coverage breach threshold = 1.00.125126---127128## Concentration Rules129130### Sector Concentration131- Each branch has a default `sector_ceiling_pct` on the branch object.132- The `/sector-exposures` endpoint provides **per-sector** `limit_pct` which may differ from the default.133- `grandfathered: 1` = existing over-limit exposure is tolerated but new approvals must not worsen that sector without mitigation.134- Allowed mitigations: `participation_required`, `reduced_amount`, `board_exception`.135- **Concentration ratio** = sector_exposure / total_loans_outstanding (use most recent quarter, Q1).136137### CRE Concentration138- Branch `cre_policy_limit_pct` caps total CRE exposure as a fraction of total loans.139- Post-approval CRE = (existing CRE exposure + selected app amount) / total_loans_outstanding.140- FDIC benchmark: `total_real_estate_30_89_pct` for delinquency comparison.141142### Capacity143- `lending_capacity_q1` from branch is the Q1 lending budget.144- Bank capacity used = requested_amount (or approved amount).145- Committed capacity = sum of approved amounts.146147---148149## NPA Benchmark Calculation150151Metric: `total_loans_noncurrent_pct` from FDIC Q4 2024 (`0.0098`).152153```154branch_npa_exposure = nonperforming_loans (from 2025Q1 metrics)155branch_total_loans = total_loans_outstanding (from 2025Q1 metrics)156branch_npa_ratio = branch_npa_exposure / branch_total_loans157variance_ratio = branch_npa_ratio - fdic_benchmark_ratio158variance_bps = variance_ratio × 10000159```160161---162163## Credit Union Segment Posture164165From segment endpoint: `risk_tolerance`, `recent_delinquency_bps`, `state_code`, `peer_states`, `quarterly_capacity`, `current_outstanding`, `minimum_checklist`, internal `control_issue`, `staffing_constraint`, `notes`.166167### State Metrics168Read from NCUA benchmark row matching the segment's `state_code`. Values are integers exactly as reported.169170### Peer Comparison171Compare NC state metrics to US national row (`state_code: "US"`) and peer-state median.172Direction: `higher`, `lower`, or `equal` for each of delinquency_bps, loan_to_share_pct, roaa_bps, positive_net_income_pct.173174### Posture Decision175- `continue_approving` — capacity available, external risk stronger/neutral, risk_tolerance expansive or moderate with strong metrics.176- `continue_with_tighter_conditions` — capacity available but external risk mixed or requires added controls.177- `temporarily_pause` — severe external risk weakness or capacity exhausted.178179### Controls & Triggers180- `required_checklist_gates`: from segment `minimum_checklist` plus any additional required gates.181- `added_operating_controls`: derived from internal context (control issues, staffing constraints) and posture.182- `escalation_triggers`: conditions like `segment_recent_delinquency_ge_90_bps`, `missing_insurance_or_lien_exception`, `quarterly_capacity_exceeded_or_exception_requested`, `state_delinquency_gap_widens_25_bps`. Owners: `credit_risk_manager`, `operations_control_manager`, `lending_committee_chair`.183184---185186## Allocation & Decision Logic187188### Priority Ranking189Rank applications by credit quality signals: higher DSCR, higher FICO, lower LTV, longer relationship, lower risk sector concentration impact. Applications with `documentation_complete: 0` or red flags (recent bankruptcy, very low FICO, startup with no mitigants) rank lower.190191### Decision Codes192`approve`, `conditional_approve`, `decline`, `defer`, `participation_required`193194### Condition Codes195`participation_required`, `reduced_amount`, `board_exception`, `sba_guaranty_required`, `startup_monitoring`, `none`196197### Decline Reason Codes198`capacity_limit`, `sector_breach`, `weak_dscr`, `high_ltv`, `low_fico`, `recent_bankruptcy`, `startup_risk`, `underwater_collateral`, `policy_floor_missing`, `documentation_gap`, `fdic_adverse_variance`, `ncua_peer_weakness`199200### Recommended Action Codes201`monitor`, `watchlist`, `special_assets`, `workout`, `partial_chargeoff_review`, `legal_referral`202203---204205## Output Conventions (MUST FOLLOW)206207### Numeric Precision208| Field Type | Decimals | Example |209|---|---|---|210| Currency (USD) | 2 | `1234567.89` |211| Ratios / percentages (as decimal) | 4 | `0.0523` |212| Basis points (bps) | 2 | `52.30` |213| Weighted CDFI score | 1 | `2.5` |214| NCUA integer metrics | integers (as reported) | `79` |215216### Sorting217- Lists of loans/ratings: **ascending by the key field** (final_rating, loan_id, application_id, sector, trigger_id, payment_status).218- Exception: `workout_queue` sorts **descending exposure, then ascending loan_id**.219- `material_downgrades`: ascending loan_id.220- `decline_reasons`: reason codes sorted alphabetically within each application.221- `conditions` (Harbor): ascending alphabetically.222223### Enum Values — Exact Strings Required224Payment status: `"Current"`, `"30 Days Past Due"`, `"60 Days Past Due"`, `"90+ Days Past Due"`, `"Nonaccrual"`225Risk class: `"Prime"`, `"Desirable"`, `"Satisfactory"`, `"Watch"`, `"Doubtful"`, `"Projected Loss"`226Score class: `"approve_quality"`, `"conditional"`, `"weak"`227Monitoring cadence: `"monthly"`, `"quarterly"`, `"semiannual"`228Posture: `"continue_approving"`, `"continue_with_tighter_conditions"`, `"temporarily_pause"`229230---231232## Common Pitfalls2332341. **Nonaccrual dominates**: A loan with payment_status `"Nonaccrual"` gets rating 8 regardless of DSCR/LTV — the delinquency floor is a hard minimum, and 8 is the worst possible.2352. **Missing DSCR/LTV**: When `dscr` or `ltv` is `null`, skip that factor in dominant-factor rating. Do NOT assign a rating from it.2363. **Material downgrade threshold is 2, not 1**: Only report downgrades where final_rating − current_rating ≥ 2.2374. **FDIC benchmark is one object, not an array**: `GET /api/benchmarks/fdic/q4-2024` returns `{}` with named fields, not `[]`.2385. **Sorting `migration_from_current_rating_3`**: Sort by `final_rating` ascending, not by loan_id.2396. **`variance_bps = variance_ratio × 10000`**: 1% = 100 bps, so ratio 0.01 = 100 bps. Multiply ratio by 10000 to get bps.2407. **NCUA `US` row**: The national row has `state_code: "US"` — use it for the national comparison.2418. **Peer median, not mean**: For NCUA peer comparison, compute the median of peer-state values, not the mean.2429. **Watch-list stress only for loans with DSCR**: Loans without DSCR are excluded from `stress_results`; only include loans where `dscr` is not null.24310. **Grandfathering is per-sector**: Check `grandfathered` field in sector-exposures. Sectors with grandfathered=1 may show exposure above limit_pct.24411. **Top problem credit**: Select the loan with the worst (highest) final_rating. If tied, pick the one with the highest exposure. Include `recommended_action` from the action-code enum.24512. **`watch_list_action_coverage`**: Count loans from the regrade population that received a watch-list action. Group by action type with loan_ids sorted ascending.24613. **CRE dual-stress formula is `dscr * 0.85 / 1.18`**: Apply the 0.85 revenue haircut AND the 1.18 rate shock multiplicatively, not additively.24714. **`approved_amount` vs `requested_amount`**: For conditional approvals, `approved_amount` may be less than `requested_amount` (e.g., reduced_amount condition).24815. **Post-approval concentration**: Recompute sector exposure after adding approved amounts to the relevant sectors.