Closing Fee Financing, the canonical underwriting model
@sooner/contract model (PR1, merged). Every weight, gate, rule, and the playground decision below is computed by the same code the engine runs, read directly from the contract bundle rather than re-typed. If it is right here, it is right in production.Three visible layers. A file is decided by the worst band across them; the score is shown alongside, never hidden.
Hard pass/fail eligibility plus affordability minimums. A hard fail declines; a soft fail returns a path-to-acceptance.
For gate-passing files, multi-factor rules route the band (approve, committee, manual, decline), each with a published reason code.
An additive weighted sum, labelled "creditworthiness if the gates pass". No capacity cap.
Additive weighted sum out of 100. Higher and lower-is-good categories interpolate between published breakpoints; residency uses a 3-year step; H and J are discrete tier lookups.
Each gate is tagged hard (immutable: residency, age, credit, employer, income floor) or soft (controllable: budget, area, property type, returns a counter-offer). Hard dominates: any hard fail suppresses the soft path.
Applied to gate-passing files. The worst band across the fired rules and the score wins. DR2 is the strong-recourse rescue of a weak employer; DR6 and DR7 are the 60-month affordability stress checks.
How an employer or community resolves to a tier, which then feeds the score as Category J (employer) or Category H (recourse). Tier-to-score comes from the live contract; the named lists come from the engine classifier config. Search a name, alias, or industry.
A name not on these lists resolves through the engine classifier hierarchy (industry bucket, seniority, tenure, size) and unenumerated cases route to needs-verification (manual review).
Edit a profile and see the live decision. This calls the same decide() the engine calls.