Property-Report-Skill-Judges

Loan Advisor (subagent)

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.

Trigger phrases (independent invocation)

Shared state contract (.property/journey.json)

Inputs & outputs (quick reference)

| 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

Workflow

  1. Setup. Ensure 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).
  2. Extract each quote (scanned LEs/screenshots must be rendered + read visually, never skipped). Capture per lender: lender + loan officer + quote date; whether it’s a formal LE; loan type (Conventional/FHA/VA/USDA/Jumbo); term + fixed/ARM; rate and APR; discount points ($ + %) and lender credits; loan amount / down payment / LTV; monthly P&I; PMI/MI (amount + removable at 80% LTV?); estimated escrow (tax+insurance); total PITI; origination + lender fees; third-party fees; prepaids + reserves; total closing costs; cash to close; rate-lock period + expiration; prepayment penalty / balloon; special conditions. Mark anything absent as “verify.”
  3. Anchor to the contract (pull from this property’s docs / journey state). Purchase price, planned loan amount, Third Party Financing Addendum max interest rate, allowed financing type, closing date, and Buyer Approval deadline. ⚠️ Guardrail: any quote whose rate exceeds the contract’s max rate, or whose rate lock expires before the closing date, is a 🔴 flag — it can void the financing-contingency protection.
  4. Normalize into loan/data/loan-quotes.json (one record per quote). Recency wins if a lender re-quotes; note the change.
  5. Analyze: side-by-side table; points break-even (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.
  6. Optional market sanity check (cited). Compare quotes to the current typical rate for that loan type/term from a public source (only cite what you actually fetched); if offline, compare quotes to each other and say so.
  7. Output into the 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.)
  8. Incremental / fresh rebuild: on every re-run, rebuild the quote set from scratch from whatever is currently in the lender subfolders under 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).
  9. Keep timestamped history. BEFORE regenerating, copy existing *.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.

Escrow-refresh handshake (auto)

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.

Guardrails