Context
County exports, skip-trace files, and gut-feel offers do not compose. A model that invents an offer is a liability. A CRM that also “decides” the number hides the formula. Outbound SMS from an underwriting app creates consent and carrier-risk the product should never own.
Architecture
Six objects: Parcel (APN/TMS facts), Owner, Comp, Deal (underwriting + status), Buyer, Activity. Scoring is a pure function of documented fields in lib/scoring.ts. Underwriting in lib/underwriting.ts implements maxAcquisition = estimatedResale − targetGrossProfit − transactionCosts − riskReserve, then openingOffer = maxAcquisition × ratio (default 0.60). Contract price above the ceiling requires an override string.
Kill rules flag — they do not auto-kill — no legal access, unclear ownership, title defect, zoning that forbids a plausible use. A human confirms every flag. Every status mutation writes an Activity row. Silent updates are a defect.
The LLM is a prose engine. Property briefs and comp narratives receive numbers as inputs. Owner PII and skip-trace files live in /data, gitignored and cursorignored, and never enter a model prompt. Outreach queues can be handed to GoHighLevel; this process never sends.
Implementation
Phase-gated build
Phase 0 is a ledger: import, table, filters, real county exports, no model. Scoring is not wired into the UI until the table has been used on live parcels. That order is enforced as process, not a slide.
Reviewable weights
Motivation weights live in one exported constant. Changing scoring or underwriting requires passing tests and a note in an append-only decisions log. Before/after on two real parcels is the review standard.
Hard money guard
The UI must refuse a contract above maxAcquisition without override + reason. The ceiling is the product. The opening ratio is a policy default, not a suggestion from a chat model.
Separation of intelligence and send
Qualified sellers can be queued for GoHighLevel. Consent, opt-out, and carrier registration stay on that platform. Land OS records outcomes; it does not originate messages.
Non-negotiables
No autonomous offers or sends
Scores and offers are recommendations. A human approves every offer and every outbound. legalReviewedAt is a workflow gate, not legal advice.
Not generalized PropTech
No public signup, billing, or nationwide marketplace. The product is an internal operating system for acquisition, exit matching, and diligence tracking.
Exit structure varies by state and belongs with licensed counsel or a title company in the transaction state. The schema gate is operational, not an opinion letter.
