Disclosure Document Gaps

Goal Compliance Validation Frequency Common Category Mortgage Documents Published View source on GitHub ↗

Issue: OCR System Fails to Detect Missing or Incomplete Required Disclosures

Frequency: Common

Symptoms

  • Required disclosures missing from file
  • Disclosure versions outdated
  • State-specific disclosures absent
  • Loan-type specific disclosures missing
  • Receipt acknowledgments not present
  • Disclosure content incomplete

Root Cause Mortgage transactions require numerous federal and state disclosures depending on loan type, property type, and state. OCR processes documents individually without validating completeness against disclosure requirements. Missing disclosures create compliance violations, rescission risk, and audit findings.

Example

Scenario 1: Missing ARM disclosure

Loan type: 5/1 ARM
Required: ARM Program Disclosure

File contains:
- Loan Estimate ✓
- Closing Disclosure ✓
- Right to Cancel ✓

Missing: ARM Program Disclosure

← Required for all ARM loans
← Explains rate adjustment terms
← TILA violation

---

Scenario 2: State disclosure gap

Property state: Texas
Required Texas disclosures:
- Texas Section 50(a)(6) Notice
- Right of Rescission (Texas specific)
- 12-day waiting period acknowledgment

File contains: Federal disclosures only

← State-specific requirements not met
← Texas has unique equity loan rules
← Potential loan invalidity

---

Scenario 3: Outdated disclosure version

Closing Disclosure present:
- Version date: 2019
- Current version: 2023

← CFPB updated disclosure requirements
← Old form missing new required fields
← Form version validation missing

---

Scenario 4: Missing receipt acknowledgment

Disclosures delivered:
- Loan Estimate (delivered March 1)
- Intent to Proceed (received March 3)

Missing:
- Borrower signature acknowledging LE receipt
- Delivery method documentation

← Can't prove disclosure was received
← Timing compliance uncertain

---

Disclosure gap failures:
  
  Files with disclosure issues: 15%
  
  Issue types:
    Missing required disclosure: 35%
    State-specific gaps: 25%
    Version/form outdated: 20%
    Receipt acknowledgment missing: 15%
    Incomplete disclosure: 5%
  
  Impact:
    Compliance violations: 10%
    Audit findings: 12%
    Rescission risk: 5%

Key Statistics From Compliance Audit Research (2026):

  • Missing disclosure findings: 12-18%
  • State disclosure gaps: 20-25%
  • Version compliance issues: 8-12%
  • Rescission claims (disclosure): 2-3%

Required Disclosures by Loan Type

Loan TypeRequired Disclosures
AllLE, CD, Right to Cancel (refi)
ARMARM Disclosure, CHARM Booklet
HELOCHELOC Disclosure
ReverseHECM counseling, TIL
FHAFHA disclosures, amendatory clause
VAVA disclosures, funding fee

Contributing Factors

  • No disclosure manifest validation
  • Loan-type rules not encoded
  • State requirements not tracked
  • Version control absent
  • Receipt tracking missing

Mitigation Strategies

Prevention

  1. Disclosure manifest: Required list by loan type
  2. State requirements: Jurisdiction-specific checks
  3. Version validation: Current form verification
  4. Receipt tracking: Acknowledgment verification
  5. Content validation: Required sections present

Implementation

class DisclosureValidator:
    """Validate required disclosures are present"""
    
    FEDERAL_DISCLOSURES = [
        "loan_estimate",
        "closing_disclosure",
        "servicing_disclosure"
    ]
    
    LOAN_TYPE_DISCLOSURES = {
        "arm": ["arm_program_disclosure", "charm_booklet"],
        "heloc": ["heloc_disclosure", "heloc_handbook"],
        "reverse": ["hecm_counseling", "hecm_disclosure"],
        "fha": ["fha_amendatory", "fha_informed_consumer"],
        "va": ["va_funding_fee", "va_loan_summary"]
    }
    
    STATE_DISCLOSURES = {
        "TX": ["tx_50a6_notice", "tx_equity_disclosure"],
        "CA": ["ca_mlds", "ca_foreclosure_notice"],
        "NY": ["ny_subprime_disclosure"],
        "FL": ["fl_nonprime_disclosure"]
    }
    
    REFI_DISCLOSURES = ["right_to_cancel"]
    
    def get_required_disclosures(self, 
                                 loan_type: str,
                                 property_state: str,
                                 is_refinance: bool) -> list:
        """Get list of required disclosures"""
        required = self.FEDERAL_DISCLOSURES.copy()
        
        # Loan-type specific
        if loan_type in self.LOAN_TYPE_DISCLOSURES:
            required.extend(self.LOAN_TYPE_DISCLOSURES[loan_type])
        
        # State-specific
        if property_state in self.STATE_DISCLOSURES:
            required.extend(self.STATE_DISCLOSURES[property_state])
        
        # Refinance disclosures
        if is_refinance:
            required.extend(self.REFI_DISCLOSURES)
        
        return required
    
    def validate_disclosures(self,
                            documents: list,
                            loan_type: str,
                            property_state: str,
                            is_refinance: bool) -> dict:
        """Validate all required disclosures present"""
        required = self.get_required_disclosures(
            loan_type, property_state, is_refinance
        )
        
        present = [d["type"] for d in documents]
        
        missing = [r for r in required if r not in present]
        
        return {
            "complete": len(missing) == 0,
            "required": required,
            "present": present,
            "missing": missing,
            "compliance_risk": "high" if missing else "none"
        }
    
    def validate_disclosure_version(self,
                                   disclosure_type: str,
                                   disclosure_date: str) -> dict:
        """Validate disclosure version is current"""
        current_versions = {
            "closing_disclosure": "2023-10-01",
            "loan_estimate": "2023-10-01",
            "arm_program_disclosure": "2021-01-01"
        }
        
        required_version = current_versions.get(disclosure_type)
        
        if required_version and disclosure_date < required_version:
            return {
                "valid": False,
                "error": "outdated_version",
                "document_version": disclosure_date,
                "current_version": required_version
            }
        
        return {"valid": True}
    
    def validate_receipt(self,
                        disclosure: dict,
                        receipt: dict) -> dict:
        """Validate disclosure receipt is documented"""
        if not receipt:
            return {
                "valid": False,
                "error": "missing_receipt",
                "disclosure": disclosure["type"],
                "action": "obtain_signed_acknowledgment"
            }
        
        if receipt["date"] < disclosure["delivery_date"]:
            return {
                "valid": False,
                "error": "receipt_before_delivery",
                "delivery": disclosure["delivery_date"],
                "receipt": receipt["date"]
            }
        
        return {"valid": True}

References