Credit Office Committee JSON Skill
Use this skill for Credit Office / lending committee tasks that ask for a JSON answer over the public credit office API.
Ground Rules
- Use only the task prompt, its
input/payloads/answer_template.json, and the public API described by environment_access.md.
- Do not inspect local environment source/data, train outputs, test files, notes, prior runs, reports, other attempts, or judge endpoints.
- Prefer the remote public API directly. In this workspace the base URL is
<environment_base_url>.
- Return exactly one valid JSON object. Do not add prose around it.
- Treat
answer_template.json as the contract: required keys, enum spellings, ordering, and precision rules override intuition.
API Workflow
- Read the prompt for target ids, review/as-of date, benchmark family, and requested analysis.
- Read the answer template and list every required key, enum, sort order, and rounding instruction.
- Fetch
/api/manifest and /api/policies first to confirm policy and benchmark versions.
- Fetch only the public records needed:
- Branch base data:
/api/branches/{branch_id}
- Metrics:
/api/branches/{branch_id}/metrics
- Loans:
/api/branches/{branch_id}/loans
- Sector exposure:
/api/branches/{branch_id}/sector-exposures
- Applications:
/api/branches/{branch_id}/applications
- FDIC benchmark:
/api/benchmarks/fdic/q4-2024
- NCUA benchmark:
/api/benchmarks/ncua/q1-2025
- Credit-union segment:
/api/credit-union-segments/{segment_id}
- Compute with a script or structured JSON tooling, then validate the final object against the template before answering.
Field Conventions
- Loan exposure is
outstanding_balance.
- Application exposure/capacity use is usually
requested_amount, unless the decision explicitly reduces or participates the amount.
- Branch capacity is
lending_capacity_q1.
- Branch sector limits come from
sector-exposures.limit_pct; fall back to branches.sector_ceiling_pct only if no sector-specific row exists.
- CRE policy limit is
branches.cre_policy_limit_pct.
- Metrics rows use
quarter, not an as_of_date; select the row matching the review quarter.
- In metrics, map
nonperforming_loans to NPA exposure and total_loans_outstanding to total loans.
- Ratios are decimals, not percentages. Basis points are
ratio * 10000.
- Currency is rounded to 2 decimals. Ratio fields usually round to 4 decimals. DSCR fields usually round to 2 decimals. Weighted CRE score rounds to 1 decimal.
Rating Migration Tasks
For regrading loans, filter the exact population requested, commonly loans with current_rating >= target_min.
Apply the policy risk_rating dominant-factor rule: final rating is the worst numeric rating from available DSCR, LTV/collateral, and delinquency factors.
- DSCR rating:
>=1.50 -> 3, >=1.25 -> 4, >=1.05 -> 5, >=1.00 -> 6, <1.00 -> 7.
- LTV rating:
<=0.65 -> 3, <=0.75 -> 4, <=0.85 -> 5, <=1.00 -> 6, >1.00 -> 7.
- Delinquency minimum:
30 Days Past Due -> 4, 60 Days Past Due -> 5, 90+ Days Past Due -> 7, Nonaccrual -> 8, Current -> no floor.
- Material downgrade is
final_rating - current_rating >= material_downgrade_notches.
Aggregate exposure by final rating, sort ascending by rating, and sort loan ids ascending where requested. For NPA benchmark variance, use:
branch_npa_ratio = nonperforming_loans / total_loans_outstanding
variance_ratio = branch_ratio - fdic_benchmark_ratio
variance_bps = variance_ratio * 10000
Choose problem-credit and watch-list actions from the template enums only. Tie severity to final rating, payment status, projected loss/collateral weakness, and exposure.
Watch-List Stress Tasks
Adverse-rated watch lists usually mean loans with current_rating >= 6 unless the prompt gives another threshold.
For CDFI factor scoring, sum the available policy scores for fico, ltv, liquidity_months, and debt_to_asset.
- Classes:
Prime 0-5, Desirable 6-9, Satisfactory 10-13, Watch 14-18, Doubtful 19+, and Projected Loss when score is 19+ and ltv > 1.0.
- Use only the risk class enum in the template.
- If DSCR is missing, omit that loan from DSCR stress results but keep it in population and workout aggregates.
- Watch-list stress formula:
stressed_dscr = dscr / (1 + 0.18).
- Breach threshold is the policy
coverage_breach_threshold, normally 1.00.
Workout queues are typically sorted by descending exposure, then ascending loan id. Severe bucket counts group by current_rating and payment_status, sorted as the template requires.
Application Allocation Tasks
For pending-application packages:
- Fetch branch, sector exposures, and all pending applications for the target branch.
- Evaluate application-level policy issues: DSCR, LTV, FICO, recent bankruptcy, startup risk, documentation, SBA guaranty, capacity, and sector concentration.
- Keep decisions and conditions to template enums exactly.
- Capacity math:
gross_approved_amount is total approved or conditionally approved face amount.
committed_capacity_amount is the bank-retained amount after reductions or participation.
remaining_capacity = lending_capacity_q1 - committed_capacity_amount.
- Sector post-approval concentration:
exposure_after_approval = current_exposure + bank_capacity_used for that sector
post_approval_pct = exposure_after_approval / total_assets
- compare to the sector-specific
limit_pct.
- Existing over-ceiling exposure can be grandfathered, but a new approval should not worsen it without mitigation.
- Sort decisions by
application_id, concentration flags by sector then application_id, post-approval concentrations by sector, and reason-code lists alphabetically.
Competing CRE Decision Tasks
When comparing named CRE applications, filter the application list to the exact ids in the prompt.
- Use policy
cre_weighted_score.weights: capacity .45, capital .03, character .05, collateral/exposure .36, conditions .11.
- Lower weighted score is better. Classify by policy:
approve_quality <= 2.0, conditional <= 3.0, weak > 3.0.
- If component scores are not explicit fields, derive them transparently from objective application factors: DSCR for capacity, debt-to-assets/net income for capital, relationship/delinquency/bankruptcy for character, LTV/collateral for collateral exposure, and documentation/concentration/benchmark environment for conditions.
- CRE stress formula:
stressed_dscr = dscr * 0.85 / (1 + 0.18).
- Use the policy coverage breach threshold, normally
1.00.
- CRE concentration after selecting an application:
- existing CRE exposure comes from existing CRE/CRE-like sector exposure as requested by the prompt.
- post-approval concentration adds the selected bank-retained amount and divides by
total_assets.
- policy variance bps is
(post_approval_concentration - cre_policy_limit_pct) * 10000.
- FDIC 30-89 or noncurrent benchmark variance uses
branch_ratio - benchmark_ratio; keep the exact metric enum from the template.
Credit-Union Segment Posture Tasks
For segment posture pages:
- Fetch the segment endpoint, policies, manifest, and NCUA benchmark table.
- Use the segment
state_code, peer_states, quarterly_capacity, current_outstanding, risk_tolerance, minimum_checklist, notes, and internal_context.
- State metrics come directly from the NCUA row for the segment state; do not convert bps or integer percentages unless the template says to.
- Peer comparison directions are relative to US and to the median of named peer states. Return only
higher, lower, or equal.
- Required checklist gates should include the segment minimum checklist, restricted to template choices.
- Added operating controls should respond to the actual context: insurance/lien gaps, elevated delinquency, capacity exceptions, staffing/second review, or benchmark monitoring.
- Escalation triggers must use allowed trigger ids/conditions/owners only and be sorted ascending by
trigger_id.
- Match posture and interpretation enums to the evidence: capacity availability, external risk status, and risk tolerance.
Final QA Checklist
- All required top-level keys are present and no narrative text is outside the JSON.
- Every enum value is copied exactly from the template.
- Every list follows the requested ordering.
- Currency, ratios, DSCRs, scores, and bps use the requested precision.
- Benchmark versions and policy versions come from the API, not memory.
- Denominators are correct: total assets for concentration, total loans outstanding for NPA ratios, and capacity for allocation.
- Nulls, missing DSCR values, and missing FICO values are handled deliberately rather than coerced to zero.
- The answer contains no training-output values or test-answer leakage.
1---2name: self-attempt-02-63description: Credit Office Committee JSON Skill4---5# Credit Office Committee JSON Skill67Use this skill for Credit Office / lending committee tasks that ask for a JSON answer over the public credit office API.89## Ground Rules1011- Use only the task prompt, its `input/payloads/answer_template.json`, and the public API described by `environment_access.md`.12- Do not inspect local environment source/data, train outputs, test files, notes, prior runs, reports, other attempts, or judge endpoints.13- Prefer the remote public API directly. In this workspace the base URL is `<environment_base_url>`.14- Return exactly one valid JSON object. Do not add prose around it.15- Treat `answer_template.json` as the contract: required keys, enum spellings, ordering, and precision rules override intuition.1617## API Workflow18191. Read the prompt for target ids, review/as-of date, benchmark family, and requested analysis.202. Read the answer template and list every required key, enum, sort order, and rounding instruction.213. Fetch `/api/manifest` and `/api/policies` first to confirm policy and benchmark versions.224. Fetch only the public records needed:23 - Branch base data: `/api/branches/{branch_id}`24 - Metrics: `/api/branches/{branch_id}/metrics`25 - Loans: `/api/branches/{branch_id}/loans`26 - Sector exposure: `/api/branches/{branch_id}/sector-exposures`27 - Applications: `/api/branches/{branch_id}/applications`28 - FDIC benchmark: `/api/benchmarks/fdic/q4-2024`29 - NCUA benchmark: `/api/benchmarks/ncua/q1-2025`30 - Credit-union segment: `/api/credit-union-segments/{segment_id}`315. Compute with a script or structured JSON tooling, then validate the final object against the template before answering.3233## Field Conventions3435- Loan exposure is `outstanding_balance`.36- Application exposure/capacity use is usually `requested_amount`, unless the decision explicitly reduces or participates the amount.37- Branch capacity is `lending_capacity_q1`.38- Branch sector limits come from `sector-exposures.limit_pct`; fall back to `branches.sector_ceiling_pct` only if no sector-specific row exists.39- CRE policy limit is `branches.cre_policy_limit_pct`.40- Metrics rows use `quarter`, not an `as_of_date`; select the row matching the review quarter.41- In metrics, map `nonperforming_loans` to NPA exposure and `total_loans_outstanding` to total loans.42- Ratios are decimals, not percentages. Basis points are `ratio * 10000`.43- Currency is rounded to 2 decimals. Ratio fields usually round to 4 decimals. DSCR fields usually round to 2 decimals. Weighted CRE score rounds to 1 decimal.4445## Rating Migration Tasks4647For regrading loans, filter the exact population requested, commonly loans with `current_rating >= target_min`.4849Apply the policy `risk_rating` dominant-factor rule: final rating is the worst numeric rating from available DSCR, LTV/collateral, and delinquency factors.5051- DSCR rating: `>=1.50 -> 3`, `>=1.25 -> 4`, `>=1.05 -> 5`, `>=1.00 -> 6`, `<1.00 -> 7`.52- LTV rating: `<=0.65 -> 3`, `<=0.75 -> 4`, `<=0.85 -> 5`, `<=1.00 -> 6`, `>1.00 -> 7`.53- Delinquency minimum: `30 Days Past Due -> 4`, `60 Days Past Due -> 5`, `90+ Days Past Due -> 7`, `Nonaccrual -> 8`, `Current -> no floor`.54- Material downgrade is `final_rating - current_rating >= material_downgrade_notches`.5556Aggregate exposure by final rating, sort ascending by rating, and sort loan ids ascending where requested. For NPA benchmark variance, use:5758- `branch_npa_ratio = nonperforming_loans / total_loans_outstanding`59- `variance_ratio = branch_ratio - fdic_benchmark_ratio`60- `variance_bps = variance_ratio * 10000`6162Choose problem-credit and watch-list actions from the template enums only. Tie severity to final rating, payment status, projected loss/collateral weakness, and exposure.6364## Watch-List Stress Tasks6566Adverse-rated watch lists usually mean loans with `current_rating >= 6` unless the prompt gives another threshold.6768For CDFI factor scoring, sum the available policy scores for `fico`, `ltv`, `liquidity_months`, and `debt_to_asset`.6970- Classes: `Prime` 0-5, `Desirable` 6-9, `Satisfactory` 10-13, `Watch` 14-18, `Doubtful` 19+, and `Projected Loss` when score is 19+ and `ltv > 1.0`.71- Use only the risk class enum in the template.72- If DSCR is missing, omit that loan from DSCR stress results but keep it in population and workout aggregates.73- Watch-list stress formula: `stressed_dscr = dscr / (1 + 0.18)`.74- Breach threshold is the policy `coverage_breach_threshold`, normally `1.00`.7576Workout queues are typically sorted by descending exposure, then ascending loan id. Severe bucket counts group by `current_rating` and `payment_status`, sorted as the template requires.7778## Application Allocation Tasks7980For pending-application packages:8182- Fetch branch, sector exposures, and all pending applications for the target branch.83- Evaluate application-level policy issues: DSCR, LTV, FICO, recent bankruptcy, startup risk, documentation, SBA guaranty, capacity, and sector concentration.84- Keep decisions and conditions to template enums exactly.85- Capacity math:86 - `gross_approved_amount` is total approved or conditionally approved face amount.87 - `committed_capacity_amount` is the bank-retained amount after reductions or participation.88 - `remaining_capacity = lending_capacity_q1 - committed_capacity_amount`.89- Sector post-approval concentration:90 - `exposure_after_approval = current_exposure + bank_capacity_used for that sector`91 - `post_approval_pct = exposure_after_approval / total_assets`92 - compare to the sector-specific `limit_pct`.93- Existing over-ceiling exposure can be grandfathered, but a new approval should not worsen it without mitigation.94- Sort decisions by `application_id`, concentration flags by sector then `application_id`, post-approval concentrations by sector, and reason-code lists alphabetically.9596## Competing CRE Decision Tasks9798When comparing named CRE applications, filter the application list to the exact ids in the prompt.99100- Use policy `cre_weighted_score.weights`: capacity `.45`, capital `.03`, character `.05`, collateral/exposure `.36`, conditions `.11`.101- Lower weighted score is better. Classify by policy: `approve_quality <= 2.0`, `conditional <= 3.0`, `weak > 3.0`.102- If component scores are not explicit fields, derive them transparently from objective application factors: DSCR for capacity, debt-to-assets/net income for capital, relationship/delinquency/bankruptcy for character, LTV/collateral for collateral exposure, and documentation/concentration/benchmark environment for conditions.103- CRE stress formula: `stressed_dscr = dscr * 0.85 / (1 + 0.18)`.104- Use the policy coverage breach threshold, normally `1.00`.105- CRE concentration after selecting an application:106 - existing CRE exposure comes from existing CRE/CRE-like sector exposure as requested by the prompt.107 - post-approval concentration adds the selected bank-retained amount and divides by `total_assets`.108 - policy variance bps is `(post_approval_concentration - cre_policy_limit_pct) * 10000`.109- FDIC 30-89 or noncurrent benchmark variance uses `branch_ratio - benchmark_ratio`; keep the exact metric enum from the template.110111## Credit-Union Segment Posture Tasks112113For segment posture pages:114115- Fetch the segment endpoint, policies, manifest, and NCUA benchmark table.116- Use the segment `state_code`, `peer_states`, `quarterly_capacity`, `current_outstanding`, `risk_tolerance`, `minimum_checklist`, notes, and `internal_context`.117- State metrics come directly from the NCUA row for the segment state; do not convert bps or integer percentages unless the template says to.118- Peer comparison directions are relative to US and to the median of named peer states. Return only `higher`, `lower`, or `equal`.119- Required checklist gates should include the segment minimum checklist, restricted to template choices.120- Added operating controls should respond to the actual context: insurance/lien gaps, elevated delinquency, capacity exceptions, staffing/second review, or benchmark monitoring.121- Escalation triggers must use allowed trigger ids/conditions/owners only and be sorted ascending by `trigger_id`.122- Match posture and interpretation enums to the evidence: capacity availability, external risk status, and risk tolerance.123124## Final QA Checklist125126- All required top-level keys are present and no narrative text is outside the JSON.127- Every enum value is copied exactly from the template.128- Every list follows the requested ordering.129- Currency, ratios, DSCRs, scores, and bps use the requested precision.130- Benchmark versions and policy versions come from the API, not memory.131- Denominators are correct: total assets for concentration, total loans outstanding for NPA ratios, and capacity for allocation.132- Nulls, missing DSCR values, and missing FICO values are handled deliberately rather than coerced to zero.133- The answer contains no training-output values or test-answer leakage.