Documents · Enterprise mortgage lender, via Amihan Solutions
Document review where rules check the facts first
A system that picked up each property appraisal as it was submitted, checked the facts with fixed rules, and had a pass, conditional or reject verdict waiting for an underwriter to confirm. I was the only engineer on it, from design to production support.
- Used in production by the lender’s underwriting team
- Less time on routine fact checks, more on judgement calls
1 · Checking the facts
Facts checked by rules, not guessed by AI
Each fact was pulled from the form and checked by fixed rules. AI drafted the verdict from the checked facts only. A person decided.
1 · Reads the appraisal
Each fact is pulled from its place on the form
Appraisal report
Form fields
- Property
- 14 Marlow Street
- Appraiser
- Sam Ortega
- Signed
- 12 Mar 2026
- Appraised value
- $412,000
Checkboxes
- As is
- Subject to repairs
Table · Comparable sales
- 22 Marlow Street
- $405,000
- 9 Alder Avenue
- $418,000
- 31 Pine Road
- $409,000
Photos · 5 of 6
2 · Checks the facts
Fixed rules, the same for every appraisal
- Address and owner match the loan record14 Marlow Street
- Signed, dated and not too oldSigned 12 Mar 2026
- Required photos are present1 of 6 is missingFlagged
- Three comparable sales, dates in range3 found
- “As is” or “subject to repairs” is markedAs is
- Value sits within the comparable sales$412,000, between $405,000 and $418,000
3 · Drafts a verdict
AI, working only from the checked facts
- Pass
- Conditional
- Reject
Reason
One required photo is missing. Every other check passed.
Underwriter confirms
- The cost
- Underwriters read every property appraisal by hand. Each one mixes forms, tables, checkboxes and photos, and the same facts had to be found and checked in every one.
- The first attempt
- The first version sent the whole document to AI and asked for a review. It gave wrong answers on messy documents, and even basic facts such as the appraisal date could not be relied on.
- What I rebuilt
- Appraisals follow a set format. So I rebuilt it to pull each fact from its place on the form, check it with fixed rules, and only then ask AI to draft a verdict from the checked facts.
- Result
- Underwriters spent less time re-checking routine facts and more on judgement calls such as property condition and safety
Technical detail
Version 1 sent the document text to a language model, with the images transcribed by a second model, and generated the review from that. Version 2 extracted each field into structured JSON with PyMuPDF and Google Document AI, validated the fields in code, and passed only the verified data to the language model for the verdict. Backend services were Python and FastAPI.
2 · Starting by itself
A report waiting before anyone asks
Nobody had to start it. The report was waiting in the underwriter’s queue.
1 · Submitted
Documents are submitted in Encompass
Encompass · Loan file
14 Marlow Street
Loan 20418
- Appraisal reportSubmitted
- Purchase contractOn file
- Title reportOn file
2 · Triggered
The submission starts the tool. Nobody asks
Runs by itself
- Submission noticed
- Appraisal picked up
- Facts read and checked
- Verdict drafted
- Report sent to the queue
3 · In the queue
Waiting when the underwriter opens it
Review queue
4 ready
- 14 Marlow Street1 photo missingConditional
- 8 Harbor LaneAll checks passedPass
- 51 Quarry RoadValue outside comparable salesReject
- 3 Linden CourtAll checks passedPass
Underwriter opens and confirms
- The cost
- Every review began with an underwriter opening the loan and finding the appraisal. Nothing happened until someone got to it.
- The trigger
- The lender kept its loan documents in Encompass. Submitting them there became the signal to start.
- What I built
- A workflow that noticed each submission, ran the review, and placed the report in a queue screen I added to the tool.
- Result
- The report was already waiting when the underwriter opened the queue
Technical detail
A submission in Encompass was the event that started each run. Document ingestion and analysis ran as event-driven jobs on Google Cloud, using Cloud Run, Cloud Run Jobs, Workflows and Cloud Scheduler. The queue was added in version 2 of the tool.
Built with
- Python
- FastAPI
- Google Document AI
- PyMuPDF
- Cloud Run
- Cloud Run Jobs
- Google Cloud Workflows
- Cloud Scheduler
- Docker
What this means for a small team
The same pattern fits any team that reads documents and types the details into another system: invoices, application forms, client intake. Each detail is pulled out and checked by fixed rules first, AI drafts a summary from the checked facts, and a person approves the result.
See what you could automate
Enter your website and get three workflows worth automating, with estimated hours saved.