Part of the Property Investigator skill. Runs independently (“compare my loans”) or is invoked by the orchestrator at the Financing stage of the buyer journey. Financial estimate analysis, not mortgage/financial advice — state the disclaimer every time.
.property/journey.json)journey.json for context —
property.purchasePrice, planned loan amount, contract.maxRate, contract.closingDate,
contract.financingApprovalDate, and insurance.annualPremium (use it for escrow if present).loan section — bestLender, rate, monthlyPITI, escrowMonthly, cashToClose,
maxRateFlag — set loan.ran = true, append any 🔴 items to openRisks, and stamp updated. Never write
another agent’s section; never invent contract dates.| Input | Where to add it | Type | Importance |
|——-|—————–|——|————|
| Official Loan Estimate per lender | loan/<Lender Name>/ (one folder per lender) | PDF | Critical — apples-to-apples rate/APR/fees/cash-to-close |
| Rate sheets / emails / screenshots | loan/<Lender Name>/ | PDF, PNG, JPG | Useful — informal; flagged “not an LE” |
| Contract max rate & closing date | executed contract in documents/ | PDF | Critical — over-max rate or lock-before-closing is 🔴 |
| Output | What it tells you |
|---|---|
loan-comparison-dashboard.html |
Interactive term filter + hold-period slider → single best option by total cost |
Loan-Comparison-Report.html |
Cash-at-closing + monthly headlines, “your money vs lender’s charge,” one pick + switch condition |
loan/data/loan-quotes.json, loan/history/ |
Normalized quotes + timestamped prior versions |
properties/<Address>/loan/ exists; put each lender’s quotes in a subfolder named after the lender (e.g. loan/First Lending/, loan/Chase/; create a new subfolder for any new lender). The user drops loan quotes there — official Loan Estimates (LE), lender rate sheets, emails, or screenshots. Treat the loan/ folder as part of this property’s isolated engagement (Principle 2).loan/data/loan-quotes.json (one record per quote). Recency wins if a lender re-quotes; note the change.points cost ÷ monthly savings); net cost over the holding period (monthly PITI × months + closing costs − principal paid down); and best-of picks (lowest rate/APR, lowest monthly, lowest cash-to-close, lowest lifetime cost). Flag issues 🔴/🟡/🟢 (rate over contract max, lock expiring before closing, missing APR, junk/duplicate fees, PMI not removable, ARM reset, prepayment penalty, informal quote that isn’t an LE).
5b. Upfront vs monthly clarity (always highlight prominently — user preference). Lead the report with two clearly separated headline numbers per recommended option: (a) total cash due at closing and (b) total monthly payment. Break each down: cash-to-close = down payment + lender/closing fees + prepaids (prepaid interest + 1st-yr insurance) + escrow reserves (≈ months of taxes+insurance) − lender credits; monthly = P&I + property taxes + homeowner’s insurance (+ PMI if any). Explicitly separate the property-driven escrow/prepaids (≈ same for every lender) from the lender-driven fees & credits (what actually differs). Show a compact all-options table of cash at closing + total monthly side by side.
5c. “Your money vs the lender’s actual charge” (line-item clarity). Sort cash-to-close into 4 buckets: (1) down payment (your equity), (2) escrow + prepaids (your money), (3) third-party & government fees (appraisal, credit, title, recording, survey), and (4) the lender’s own charge for their process (origination/processing/underwriting + points − lender credits). Then show a small cross-lender table of bucket 4 only so the buyer sees who charges most for their process independent of the rate and of their own escrow money.loan/ folder: Loan-Comparison-Report.html from templates/report-template.html (HTML by default), and loan-comparison-dashboard.html from templates/loan-comparison-dashboard-template.html (set the CONFIG block + QUOTES array; keep the disclaimer footer). The dashboard is interactive: a term filter and a “how long you’ll keep the loan” slider that dynamically pick the single BEST option = lowest total cost (payments + upfront fees/prepaids/escrow − equity built) for the chosen term + horizon. Give every quote a term; escrow is always included. End with one clear recommendation plus the explicit condition to switch, and lender questions to close the gaps. (templates/loan-comparison-template.md remains available if the user wants a markdown copy.)loan/ — add new quotes and drop quotes whose files were removed, then regenerate loan-quotes.json, the report, and the dashboard in place. Outputs must reflect only the current set (no stale data).*.html deliverables into loan/history/, renamed with a yyyy-MM-dd_HHmm suffix. Then write the fresh report with an updated <date/time> header stamp + a short revision note describing what changed.When invoked by the orchestrator (or run after insurance/inspection changed numbers): recompute escrow from
the latest insurance.annualPremium and reflect any inspection.buyerCredit in cash-to-close, then produce
a new timestamped version in loan/history/ and update state. See the orchestrator’s reconciliation rules.