name: loan-servicing-workflow title: Loan Servicing Default-To-Cure Workflow description: >- Composed Naftiko workflow that orchestrates a borrower who has fallen behind on payments: identify delinquency in MSP, document a Promise To Pay, run a loss-mitigation evaluation, and post the catch-up payment when received. Demonstrates composition across MSP DX, Servicing Digital, and Loss Mitigation. version: '0.1.0' created: '2026-05-23' steps: - id: identify-delinquent-loan capability: msp-dx operation: get-msp-loan inputs: loanNumber: "{{ input.loanNumber }}" outputs: delinquencyDays: "$.delinquencyDays" principalBalance: "$.principalBalance" borrowerName: "$.borrower.lastName" guard: when: "delinquencyDays > 0" - id: capture-promise-to-pay capability: msp-dx operation: create-promise-to-pay inputs: loanNumber: "{{ input.loanNumber }}" promiseAmount: "{{ input.promiseAmount }}" promiseDate: "{{ input.promiseDate }}" reasonCode: "{{ input.reasonCode }}" channel: "{{ input.channel | default: 'Inbound Call' }}" - id: evaluate-loss-mitigation capability: msp-dx operation: list-loss-mitigation-cases inputs: loanNumber: "{{ input.loanNumber }}" guard: when: "delinquencyDays >= 60" - id: post-catchup-payment capability: msp-dx operation: post-msp-payment inputs: loanNumber: "{{ input.loanNumber }}" amount: "{{ input.promiseAmount }}" effectiveDate: "{{ input.actualPaymentDate }}" paymentMethod: "{{ input.paymentMethod | default: 'ACH' }}" guard: when: "actualPaymentDate is present" governance: - Idempotent payment posting via paymentId - PII redaction in observability layer - Reason codes constrained to the published P2P reason taxonomy - All operations audited under servicer/investor scope