- Shipped
- July 22, 2026 at 6:18 PM UTC
- Author
- Kamo
- Commit
- 7f80b96
SUSPENDED is deliberately not terminal — LoanFileStatus.isTerminal excludes it, because a loan is suspended for a fixable reason. But it had no forward arrow, so its only exits were WITHDRAWN and DENIED: every suspended file was dead, and the only way to act on one was to kill it. Meanwhile ClosingHorizon still gave it a 40-day close and LoanTransactionStatusDeriver reported it as IN_PROCESS, so the rest of the system believed it was live. It now resumes to IN_UNDERWRITING, gated on LOS_UNDERWRITE_LOAN. Underwriting rather than the stage it came from, because the pre-suspension stage is not recorded anywhere: landing on an underwriter is a human re-entry decision, not a silent restore of a stage whose work may have gone stale. Recording the origin stage would need a schema change and is the better long-term answer. legalNext also stopped offering an off-ramp to the status the loan is already in. The steward UI preselects the first option, so a suspended loan defaulted to SUSPENDED -> SUSPENDED — a submit that could only fail. The UI needs no change: it renders whatever the backend returns, so the resume now becomes its sensible default. Six tests, including a sweep asserting no status is ever offered as a transition to itself.