Credit Office Committee JSON SOP
Use this skill for credit-office tasks that ask for a committee-ready JSON answer about a bank branch, loan portfolio, pending applications, CRE comparison, watch-list stress, or credit-union segment posture.
Source Discipline
- Use the remote public API only:
<environment_base_url>.
- Do not start, inspect, or read any local environment service, database, generated data file, run output, train output, test file, notes, reports, judge endpoint, or prior skill attempt.
- Read the task prompt and its
input/payloads/answer_template.json first. The template is the output contract for top-level keys, enum spellings, precision, required empty arrays/maps, and ordering.
- Fetch only public API data needed for the target branch or segment plus
/api/manifest, /api/policies, and the named benchmark endpoint.
- Return exactly one valid JSON object. Do not include prose outside JSON.
API Checklist
Start with:
/api/manifest for policy_version and benchmark versions.
/api/policies for rating thresholds, CDFI scoring, CRE weights, stress formulas, capacity rules, and material downgrade threshold.
For branch tasks, fetch as needed:
/api/branches/{branch_id}: capacity, sector_ceiling_pct, cre_policy_limit_pct, total assets, state, benchmark set.
/api/branches/{branch_id}/metrics: quarter metrics. For a 2025-03-31 review, use 2025Q1.
/api/branches/{branch_id}/loans: balances, ratings, payment status, DSCR, LTV, FICO, debt-to-asset, liquidity, loan type, sector.
/api/branches/{branch_id}/sector-exposures: current sector exposure, limit_pct, grandfathering.
/api/branches/{branch_id}/applications: pending underwriting factors and requested amounts.
For benchmark/segment tasks:
/api/benchmarks/fdic/q4-2024: FDIC ratios such as total_loans_noncurrent_pct, total_real_estate_30_89_pct, and total_real_estate_noncurrent_pct.
/api/benchmarks/ncua/q1-2025: state rows with integer delinquency_bps, loan_to_share_pct, roaa_bps, and positive_net_income_pct.
/api/credit-union-segments/{segment_id}: state, peer states, checklist gates, internal context, capacity, current outstanding, and risk tolerance.
Common Field Conventions
- Use
outstanding_balance for loan exposure and requested_amount for application gross amount.
metrics.total_loans_outstanding equals the sum of branch loan balances and is the denominator for branch portfolio, NPA, CRE, and sector concentration ratios unless the prompt says otherwise.
- For post-approval concentration, use a post-approval denominator: current
total_loans_outstanding plus retained approved exposure.
- Sector limits come from
sector-exposures.limit_pct; fall back to branch sector_ceiling_pct only when the sector has no override row.
- CRE exposure is the sum of
outstanding_balance for loans with loan_type == "CRE". CRE concentration is CRE exposure divided by total loans.
- Keep ratios as decimals, not whole percentages. Basis points are
ratio * 10000.
- Round only at the output boundary: currency to 2 decimals, ratios to 4 decimals, bps to 2 decimals, DSCR to 2 decimals, CRE weighted scores to 1 decimal, unless the template says otherwise.
Risk Rating Regrade
For a regrade population such as current_rating >= 3, filter by the requested current-rating minimum. Re-derive the final rating from objective policy factors, not from the prior rating.
Policy thresholds:
- DSCR:
>=1.50 -> 3, >=1.25 -> 4, >=1.05 -> 5, >=1.00 -> 6, <1.00 -> 7.
- LTV:
<=0.65 -> 3, <=0.75 -> 4, <=0.85 -> 5, <=1.00 -> 6, >1.00 -> 7. If LTV is missing but balance and collateral value exist, compute balance divided by collateral value.
- Delinquency minimums:
30 Days Past Due -> 4, 60 Days Past Due -> 5, 90+ Days Past Due -> 7, Nonaccrual -> 8, Current -> no minimum.
- Final rating is the worst numeric rating from available DSCR, LTV/collateral, and delinquency factors.
- A material downgrade is
final_rating - current_rating >= policies.risk_rating.material_downgrade_notches.
For NPA benchmarks:
branch_npa_exposure = metrics.nonperforming_loans.
branch_total_loans = metrics.total_loans_outstanding.
branch_npa_ratio = branch_npa_exposure / branch_total_loans.
variance_ratio = branch_ratio - benchmark_ratio; variance_bps = variance_ratio * 10000. Preserve the sign unless the template asks for absolute variance.
For problem-credit selection, rank first by most severe final rating, then by nonaccrual/90+ status, then by largest exposure. Use only the action enums allowed by the template; a practical severity ladder is monitor, watchlist, special_assets, workout, partial_chargeoff_review, legal_referral.
CDFI Factor Scores And Watch-List Stress
For adverse-rated or watch-list loans, compute factor_score from policies.cdfi_factor_scores using available objective factors:
- FICO bins, LTV bins, debt-to-asset bins, and liquidity-month bins add together.
- Exact boundary values belong to the explicit middle range where listed, such as
0.40-0.60 or 680-720.
- Class by total score:
0-5 Prime, 6-9 Desirable, 10-13 Satisfactory, 14-18 Watch, >=19 Doubtful.
- Override to
Projected Loss when score is >=19 and LTV is >1.0.
For watch-list DSCR stress:
- Use the policy formula exactly:
stressed_dscr = dscr / (1 + 0.18), even when the label says +200bp.
- Use only loans with DSCR available in stress result rows.
breaches_threshold is true when stressed DSCR is below policies.stress.coverage_breach_threshold unless the prompt defines a stricter comparison.
- Sort stress rows and breach ID lists exactly as the template requires.
Application Allocation And Concentration
For pending application packages:
- Capacity starts from
branches.lending_capacity_q1.
gross_approved_amount is the sum of approved or conditionally approved gross requested amounts.
bank_capacity_used and committed_capacity_amount should reflect retained bank exposure after any SBA guaranty, participation, or reduced-amount condition. If no mitigation applies, retained exposure equals approved amount.
remaining_capacity = lending_capacity_q1 - committed_capacity_amount.
- Rank only approved and conditionally approved applications in
priority_ranking.
For concentration flags:
- Existing sector exposure is
sector-exposures.current_exposure.
exposure_after_approval = current_exposure + retained approved exposure for that sector.
post_approval_pct = exposure_after_approval / (current total loans + total retained approved exposure).
over_limit or flags should compare post-approval percentage to the sector-specific limit_pct.
- Grandfathered existing over-limit exposure may be tolerated, but a new approval should not worsen it without a template-allowed mitigation such as participation, reduced amount, board exception, or decline.
Reason codes should come only from the template. Typical mappings are: weak DSCR to weak_dscr, high LTV to high_ltv, low FICO to low_fico, recent bankruptcy to recent_bankruptcy, incomplete documentation to documentation_gap, capacity shortfall to capacity_limit, sector over-limit to sector_breach, adverse FDIC comparison to fdic_adverse_variance, and weak NCUA comparison to ncua_peer_weakness.
CRE Competition
For competing CRE applications:
- Fetch branch details, metrics, loans, sector exposures, the target applications, policies, and FDIC benchmark data.
- Use
policies.cre_weighted_score.weights: capacity 0.45, capital 0.03, character 0.05, collateral exposure 0.36, conditions 0.11.
- Lower weighted score is better. Classify with policy thresholds:
<=2.0 approve_quality, <=3.0 conditional, >3.0 weak.
- Derive components from raw factors: DSCR for capacity, LTV for collateral exposure, total debt divided by total assets for capital when present, FICO/bankruptcy/prior delinquencies/relationship/guarantor for character, and documentation, sector concentration, CRE policy pressure, and FDIC variance for conditions.
- CRE dual stress uses
stressed_dscr = dscr * 0.85 / (1 + 0.18).
- Selected post-approval CRE concentration is
(existing CRE exposure + selected retained exposure) / (current total loans + selected retained exposure).
- Policy variance bps is
(post_approval_cre_concentration - cre_policy_limit_pct) * 10000.
- Sort application comparisons by
application_id; sort reason code and condition lists alphabetically when required.
Credit-Union Segment Posture
For segment posture pages:
- Use the segment endpoint for
state_code, peer_states, minimum_checklist, internal_context, quarterly_capacity, current_outstanding, notes, and risk tolerance.
- Use the NCUA benchmark row for the segment state, the
US row, and all named peer-state rows.
- For
peer_comparison, compare the state value to the US value and to the median of the peer-state values. Return only higher, lower, or equal.
- State metrics in the template are integer values exactly as reported by NCUA, not ratios.
- Required checklist gates usually come directly from
minimum_checklist; add operating controls from current context, such as missing insurance or lien follow-up, state benchmark monitoring, second review, or capacity exceptions.
- Choose escalation triggers and owners only from the template enums, aligning owner responsibility with the trigger type.
Output Validation
Before finalizing:
- Confirm every required top-level key is present and no uncontrolled enum value appears.
- Confirm all specified sort orders: IDs ascending, final ratings ascending, actions alphabetically, workout queues by descending exposure then ID, or template-specific order.
- Confirm numeric values are numbers, booleans are booleans, and absent result groups are represented as empty arrays or objects if required.
- Do not include candidate train answers, hidden reasoning, citations, markdown fences, or explanatory text outside the JSON response.
1---2name: self-attempt-03-33description: Credit Office Committee JSON SOP4---5# Credit Office Committee JSON SOP67Use this skill for credit-office tasks that ask for a committee-ready JSON answer about a bank branch, loan portfolio, pending applications, CRE comparison, watch-list stress, or credit-union segment posture.89## Source Discipline1011- Use the remote public API only: `<environment_base_url>`.12- Do not start, inspect, or read any local environment service, database, generated data file, run output, train output, test file, notes, reports, judge endpoint, or prior skill attempt.13- Read the task prompt and its `input/payloads/answer_template.json` first. The template is the output contract for top-level keys, enum spellings, precision, required empty arrays/maps, and ordering.14- Fetch only public API data needed for the target branch or segment plus `/api/manifest`, `/api/policies`, and the named benchmark endpoint.15- Return exactly one valid JSON object. Do not include prose outside JSON.1617## API Checklist1819Start with:2021- `/api/manifest` for `policy_version` and benchmark versions.22- `/api/policies` for rating thresholds, CDFI scoring, CRE weights, stress formulas, capacity rules, and material downgrade threshold.2324For branch tasks, fetch as needed:2526- `/api/branches/{branch_id}`: capacity, `sector_ceiling_pct`, `cre_policy_limit_pct`, total assets, state, benchmark set.27- `/api/branches/{branch_id}/metrics`: quarter metrics. For a 2025-03-31 review, use `2025Q1`.28- `/api/branches/{branch_id}/loans`: balances, ratings, payment status, DSCR, LTV, FICO, debt-to-asset, liquidity, loan type, sector.29- `/api/branches/{branch_id}/sector-exposures`: current sector exposure, `limit_pct`, grandfathering.30- `/api/branches/{branch_id}/applications`: pending underwriting factors and requested amounts.3132For benchmark/segment tasks:3334- `/api/benchmarks/fdic/q4-2024`: FDIC ratios such as `total_loans_noncurrent_pct`, `total_real_estate_30_89_pct`, and `total_real_estate_noncurrent_pct`.35- `/api/benchmarks/ncua/q1-2025`: state rows with integer `delinquency_bps`, `loan_to_share_pct`, `roaa_bps`, and `positive_net_income_pct`.36- `/api/credit-union-segments/{segment_id}`: state, peer states, checklist gates, internal context, capacity, current outstanding, and risk tolerance.3738## Common Field Conventions3940- Use `outstanding_balance` for loan exposure and `requested_amount` for application gross amount.41- `metrics.total_loans_outstanding` equals the sum of branch loan balances and is the denominator for branch portfolio, NPA, CRE, and sector concentration ratios unless the prompt says otherwise.42- For post-approval concentration, use a post-approval denominator: current `total_loans_outstanding` plus retained approved exposure.43- Sector limits come from `sector-exposures.limit_pct`; fall back to branch `sector_ceiling_pct` only when the sector has no override row.44- CRE exposure is the sum of `outstanding_balance` for loans with `loan_type == "CRE"`. CRE concentration is CRE exposure divided by total loans.45- Keep ratios as decimals, not whole percentages. Basis points are `ratio * 10000`.46- Round only at the output boundary: currency to 2 decimals, ratios to 4 decimals, bps to 2 decimals, DSCR to 2 decimals, CRE weighted scores to 1 decimal, unless the template says otherwise.4748## Risk Rating Regrade4950For a regrade population such as `current_rating >= 3`, filter by the requested current-rating minimum. Re-derive the final rating from objective policy factors, not from the prior rating.5152Policy thresholds:5354- DSCR: `>=1.50 -> 3`, `>=1.25 -> 4`, `>=1.05 -> 5`, `>=1.00 -> 6`, `<1.00 -> 7`.55- LTV: `<=0.65 -> 3`, `<=0.75 -> 4`, `<=0.85 -> 5`, `<=1.00 -> 6`, `>1.00 -> 7`. If LTV is missing but balance and collateral value exist, compute balance divided by collateral value.56- Delinquency minimums: `30 Days Past Due -> 4`, `60 Days Past Due -> 5`, `90+ Days Past Due -> 7`, `Nonaccrual -> 8`, `Current -> no minimum`.57- Final rating is the worst numeric rating from available DSCR, LTV/collateral, and delinquency factors.58- A material downgrade is `final_rating - current_rating >= policies.risk_rating.material_downgrade_notches`.5960For NPA benchmarks:6162- `branch_npa_exposure = metrics.nonperforming_loans`.63- `branch_total_loans = metrics.total_loans_outstanding`.64- `branch_npa_ratio = branch_npa_exposure / branch_total_loans`.65- `variance_ratio = branch_ratio - benchmark_ratio`; `variance_bps = variance_ratio * 10000`. Preserve the sign unless the template asks for absolute variance.6667For problem-credit selection, rank first by most severe final rating, then by nonaccrual/90+ status, then by largest exposure. Use only the action enums allowed by the template; a practical severity ladder is `monitor`, `watchlist`, `special_assets`, `workout`, `partial_chargeoff_review`, `legal_referral`.6869## CDFI Factor Scores And Watch-List Stress7071For adverse-rated or watch-list loans, compute `factor_score` from `policies.cdfi_factor_scores` using available objective factors:7273- FICO bins, LTV bins, debt-to-asset bins, and liquidity-month bins add together.74- Exact boundary values belong to the explicit middle range where listed, such as `0.40-0.60` or `680-720`.75- Class by total score: `0-5 Prime`, `6-9 Desirable`, `10-13 Satisfactory`, `14-18 Watch`, `>=19 Doubtful`.76- Override to `Projected Loss` when score is `>=19` and LTV is `>1.0`.7778For watch-list DSCR stress:7980- Use the policy formula exactly: `stressed_dscr = dscr / (1 + 0.18)`, even when the label says `+200bp`.81- Use only loans with DSCR available in stress result rows.82- `breaches_threshold` is true when stressed DSCR is below `policies.stress.coverage_breach_threshold` unless the prompt defines a stricter comparison.83- Sort stress rows and breach ID lists exactly as the template requires.8485## Application Allocation And Concentration8687For pending application packages:8889- Capacity starts from `branches.lending_capacity_q1`.90- `gross_approved_amount` is the sum of approved or conditionally approved gross requested amounts.91- `bank_capacity_used` and `committed_capacity_amount` should reflect retained bank exposure after any SBA guaranty, participation, or reduced-amount condition. If no mitigation applies, retained exposure equals approved amount.92- `remaining_capacity = lending_capacity_q1 - committed_capacity_amount`.93- Rank only approved and conditionally approved applications in `priority_ranking`.9495For concentration flags:9697- Existing sector exposure is `sector-exposures.current_exposure`.98- `exposure_after_approval = current_exposure + retained approved exposure for that sector`.99- `post_approval_pct = exposure_after_approval / (current total loans + total retained approved exposure)`.100- `over_limit` or flags should compare post-approval percentage to the sector-specific `limit_pct`.101- Grandfathered existing over-limit exposure may be tolerated, but a new approval should not worsen it without a template-allowed mitigation such as participation, reduced amount, board exception, or decline.102103Reason codes should come only from the template. Typical mappings are: weak DSCR to `weak_dscr`, high LTV to `high_ltv`, low FICO to `low_fico`, recent bankruptcy to `recent_bankruptcy`, incomplete documentation to `documentation_gap`, capacity shortfall to `capacity_limit`, sector over-limit to `sector_breach`, adverse FDIC comparison to `fdic_adverse_variance`, and weak NCUA comparison to `ncua_peer_weakness`.104105## CRE Competition106107For competing CRE applications:108109- Fetch branch details, metrics, loans, sector exposures, the target applications, policies, and FDIC benchmark data.110- Use `policies.cre_weighted_score.weights`: capacity `0.45`, capital `0.03`, character `0.05`, collateral exposure `0.36`, conditions `0.11`.111- Lower weighted score is better. Classify with policy thresholds: `<=2.0 approve_quality`, `<=3.0 conditional`, `>3.0 weak`.112- Derive components from raw factors: DSCR for capacity, LTV for collateral exposure, total debt divided by total assets for capital when present, FICO/bankruptcy/prior delinquencies/relationship/guarantor for character, and documentation, sector concentration, CRE policy pressure, and FDIC variance for conditions.113- CRE dual stress uses `stressed_dscr = dscr * 0.85 / (1 + 0.18)`.114- Selected post-approval CRE concentration is `(existing CRE exposure + selected retained exposure) / (current total loans + selected retained exposure)`.115- Policy variance bps is `(post_approval_cre_concentration - cre_policy_limit_pct) * 10000`.116- Sort application comparisons by `application_id`; sort reason code and condition lists alphabetically when required.117118## Credit-Union Segment Posture119120For segment posture pages:121122- Use the segment endpoint for `state_code`, `peer_states`, `minimum_checklist`, `internal_context`, `quarterly_capacity`, `current_outstanding`, notes, and risk tolerance.123- Use the NCUA benchmark row for the segment state, the `US` row, and all named peer-state rows.124- For `peer_comparison`, compare the state value to the US value and to the median of the peer-state values. Return only `higher`, `lower`, or `equal`.125- State metrics in the template are integer values exactly as reported by NCUA, not ratios.126- Required checklist gates usually come directly from `minimum_checklist`; add operating controls from current context, such as missing insurance or lien follow-up, state benchmark monitoring, second review, or capacity exceptions.127- Choose escalation triggers and owners only from the template enums, aligning owner responsibility with the trigger type.128129## Output Validation130131Before finalizing:132133- Confirm every required top-level key is present and no uncontrolled enum value appears.134- Confirm all specified sort orders: IDs ascending, final ratings ascending, actions alphabetically, workout queues by descending exposure then ID, or template-specific order.135- Confirm numeric values are numbers, booleans are booleans, and absent result groups are represented as empty arrays or objects if required.136- Do not include candidate train answers, hidden reasoning, citations, markdown fences, or explanatory text outside the JSON response.