The front of the loop: LANDOS ingest to signals to identity to recipes to scoring to DeedSonar sync to outreach to outcome to learning. Run it as an agentic process with a live run log, a reasoning trace, tool-call cards, and hash-chained receipts.
Synthetic data only. No live lead claims. The Supabase lead pull has failed 19 straight nights and the host is unreachable, so this console runs on synthetic Berrien-county parcels only, labeled synthetic throughout. No live lead claims are made anywhere on this page.
DeedSonar is not reachable from here. Its live deployment is paused. This console ends at a DeedSonar sync receipt. It does not claim a live sync, a live CRM write, or a live DeedSonar connection.
No owner or property PII. No real owner names, addresses, phone numbers, or parcel IDs appear anywhere on this page. Voter-file contact data, when used in the real process, is used then deleted, never retained. DNC scrubbing is always optional, never an automatic gate.
One loop, eight stages. Each stage is an agent step with a reasoning trace, a tool call, and a receipt. Nothing advances without a receipt from the stage before it.
| Stage | Agent step | Tool call | Receipt |
|---|---|---|---|
| 1. Ingest | Load the county parcel file and check its source | landos.ingest(source, county) | Ingest receipt: source, record count, pull date |
| 2. Signals | Run the 50-signal model over each parcel | landos.detect_signals(parcel_id) | Signal receipt: detected signals and points |
| 3. Identity | Resolve owner, estate, heir, and deceased-owner state | landos.resolve_identity(parcel_id) | Identity receipt: estate state, heirs parsed |
| 4. Recipes | Match the parcel to a hunt recipe in public.hunt_recipes | recipes.match(parcel_id, recipe_id) | Recipe receipt: recipe id, version, match reason |
| 5. Scoring | Score and rank, highest first | landos.score(parcel_id) | Score receipt: score, band, rank |
| 6. Sync | Project ranked owner leads into acquisition_leads | sync_to_crm.project(owner_leads) | Sync receipt: rows written, sole-writer check |
| 7. Outreach | Draft a value-first message, soft pitch | outreach.draft(lead_id, channel) | Draft receipt: channel, offer, approval state |
| 8. Outcome | Record the outcome and what was learned | learning.record(lead_id, outcome) | Learning receipt: outcome, lesson, next hunt change |
Data model, as documented. Hunts live in public.hunt_recipes. Ranked owner output lives in landos.owner_leads. The script scripts/sync_to_crm.py is the sole writer that projects into public.acquisition_leads for DeedSonar. No other writer touches that table.
Scoring math in this console. Each detected signal adds fixed points. Score is the sum of detected signal points, 0 to 100. Bands: 70 and above is Priority, 50 to 69 is Qualified, below 50 is Watch. The same signals always give the same score. The 12 named signals are a subset of the documented 50-signal model; the other 38 are not disclosed here. Weights here are illustrative and fixed for demonstration, not production weights.
Seven families are named in the available sources: tax, probate, estate, heir, lien, code, absentee. The other 23 families are counted in the 30-family registry, but their names, signals, and evidence requirements are not documented in the sources available to this console. They are listed as undocumented rather than filled in with invented names. R-number order for R1 to R7 follows the order in which the sources list the families.
Full recipe picker, weights, and worked scoring on three parcels: see the sibling Recipe system demo.
Pick a hunt, then run the loop. Run executes all eight stages with a reasoning trace, tool-call cards, and a hash-chained receipt per lead. Step advances one stage at a time. The run log is the agent thinking out loud: what it decided, what tool it called, and what receipt came back.
{}
Three sample hunts, plus the historical replay. The samples run on the six synthetic Berrien parcels in section 3. The replay does not rerun parcels: it restates the documented historical receipt.
| Sample hunt | Recipe | Synthetic parcels in scope | Expected ranked result |
|---|---|---|---|
| Berrien90+ | R1 Tax | SYN-B01, SYN-B03, SYN-B04 | SYN-B03 78 Priority, SYN-B01 60 Qualified, SYN-B04 30 Watch |
| FLOW_C probate/estate | R2 Probate | SYN-B02, SYN-B03, SYN-B06 | SYN-B03 78 Priority, SYN-B02 45 Watch, SYN-B06 25 Watch |
| LIVE_PROVEN tax lien | R1 Tax | SYN-B01, SYN-B03, SYN-B04 | SYN-B03 78 Priority, SYN-B01 60 Qualified, SYN-B04 30 Watch |
| 6071b7ad replay | Historical, 2026-09-16 | None (historical record) | 153 leads scored, 153 synced to CRM |
Date: 2026-09-16. Result: 153 leads scored, 153 leads synchronized to CRM, end to end. This is history, not a promise of future volume, and not a claim about this console, which runs on synthetic data only.
The sole-writer projection. Ranked owner leads from landos.owner_leads are projected by scripts/sync_to_crm.py into public.acquisition_leads for DeedSonar. This simulator runs that projection against the last hunt run on this page. It writes nothing to a live system. DeedSonar itself is not reachable from here, so the run ends at a sync receipt, not a live CRM write.
| Check | Result |
|---|---|
| Sole-writer check (only scripts/sync_to_crm.py writes acquisition_leads) | Not run |
| Rows read from landos.owner_leads (synthetic) | 0 |
| Rows projected to public.acquisition_leads (simulated) | 0 |
| Rows skipped (score below 50, Watch band) | 0 |
| Sync receipt hash | Not run |
Sync rule in this simulator: Priority and Qualified leads (score 50 and above) project. Watch leads (below 50) are skipped with a reason recorded, not silently dropped. In the historical 6071b7ad run, 153 of 153 scored leads synced, which means all 153 met the projection rule that day.
{}
Value-first drafts with a soft pitch. Every draft offers the Property Opportunity Scan at $100, the Property Intelligence Dossier at $1,500, or a free 10-minute call at cal.com/neuruh. Cold first-touch is held for approval: a cold draft is marked HOLD and is not sendable until the approval box is checked.
Close the loop. Record what happened with a lead and the console writes a learning entry that retunes the next hunt. Learning entries here are stored in this page only; nothing leaves the browser.
| Outcome | Count |
|---|---|
| Replied | 0 |
| Booked a call | 0 |
| No reply | 0 |
| Declined | 0 |
| Scan sold | 0 |
| Dossier sold | 0 |