Neuruh · LANDOS · Lead Recipe OS · DeedSonar · Interactive Console

Agentic Real Estate Lead Gen Console

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.

Console versionlead-gen-console v0.1
Date2026-11-04
LANDOS signals50-signal model, 12 named here
Recipe families30 canonical (R1 to R30), 36 registry rows
Active hunts4 documented
DataSynthetic Berrien County only

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.

1. How the loop works

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.

1. INGESTcounty parcels 2. SIGNALS50 signals 3. IDENTITYowner / estate 4. RECIPESR1 to R30 5. SCORINGranked leads 6. SYNCto DeedSonar 7. OUTREACHvalue first 8. OUTCOMElearning Outcome feeds back into learning, which retunes the next hunt. Dashed line: the learning loop.
Figure 1. The lead-gen loop. Stages 1 to 5 produce ranked owner leads in landos.owner_leads. Stage 6 is the sole-writer projection scripts/sync_to_crm.py into public.acquisition_leads for DeedSonar. Stages 7 and 8 are outreach and outcome.
StageAgent stepTool callReceipt
1. IngestLoad the county parcel file and check its sourcelandos.ingest(source, county)Ingest receipt: source, record count, pull date
2. SignalsRun the 50-signal model over each parcellandos.detect_signals(parcel_id)Signal receipt: detected signals and points
3. IdentityResolve owner, estate, heir, and deceased-owner statelandos.resolve_identity(parcel_id)Identity receipt: estate state, heirs parsed
4. RecipesMatch the parcel to a hunt recipe in public.hunt_recipesrecipes.match(parcel_id, recipe_id)Recipe receipt: recipe id, version, match reason
5. ScoringScore and rank, highest firstlandos.score(parcel_id)Score receipt: score, band, rank
6. SyncProject ranked owner leads into acquisition_leadssync_to_crm.project(owner_leads)Sync receipt: rows written, sole-writer check
7. OutreachDraft a value-first message, soft pitchoutreach.draft(lead_id, channel)Draft receipt: channel, offer, approval state
8. OutcomeRecord the outcome and what was learnedlearning.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.

What this is not

2. Recipe explorer

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.

3. Hunt runner (agentic loop)

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.

Hash-chained receipts. Each lead receipt carries prev_hash, the hash of the previous receipt in the run, and its own sha256 over the canonical receipt text. Tamper with one receipt and the chain breaks at the next link. Hashing uses SHA-256 through Web Crypto when available, with an FNV-1a fallback when it is not. The fallback is labeled in the receipt.

Stage 0 of 8: idle

    Ranked output (landos.owner_leads, synthetic)

    1. No run yet. Pick a hunt and press Run hunt.

    Run receipts (hash-chained)

    {}

    4. Sample hunts and the 6071b7ad replay

    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 huntRecipeSynthetic parcels in scopeExpected ranked result
    Berrien90+R1 TaxSYN-B01, SYN-B03, SYN-B04SYN-B03 78 Priority, SYN-B01 60 Qualified, SYN-B04 30 Watch
    FLOW_C probate/estateR2 ProbateSYN-B02, SYN-B03, SYN-B06SYN-B03 78 Priority, SYN-B02 45 Watch, SYN-B06 25 Watch
    LIVE_PROVEN tax lienR1 TaxSYN-B01, SYN-B03, SYN-B04SYN-B03 78 Priority, SYN-B01 60 Qualified, SYN-B04 30 Watch
    6071b7ad replayHistorical, 2026-09-16None (historical record)153 leads scored, 153 synced to CRM

    5. DeedSonar sync simulator

    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.

    No sync run yet. Run a hunt first.
    CheckResult
    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 hashNot 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.

    {}

    6. Outreach draft generator

    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.

    7. Outcome and learning log

    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.

    OutcomeCount
    Replied0
    Booked a call0
    No reply0
    Declined0
    Scan sold0
    Dossier sold0

      8. Completeness, share link, walkthrough

      Completeness meter

      The console is complete when every step of the loop has been exercised at least once on this page. The meter counts: hunt selected, hunt run, receipts issued, sync projected, draft generated, outcome recorded.

      0 of 6 steps complete (0%)

      Share link

      The link encodes the current console state (hunt, DNC choice, channel, warmth, last outcome) in the URL hash as base64 JSON. Opening the link restores that state. Copy it and send it to someone with this page.

      Try-it walkthrough

      1. Press Run hunt in section 3 with Berrien90+ selected. Watch the run log: eight stages, each with a reasoning line, a tool call, and a receipt.
      2. Read the ranked output. SYN-B03 should top the list at 78, Priority.
      3. Press Run sync projection in section 5. Two rows project (78 and 60); one Watch row (30) is skipped with a reason.
      4. Pick SYN-B03 in section 6, set warmth to Warm, and press Generate draft. The draft offers the Scan at $100, the Dossier at $1,500, or a free 10-minute call.
      5. Set warmth to Cold and generate again. The draft is held until you check founder approval.
      6. Record an outcome in section 7. The learning log writes a lesson and the completeness meter moves.
      7. Press Show 6071b7ad replay receipt in section 4 to see the one documented historical run: 153 scored, 153 synced, 2026-09-16.

      9. What this is not, and honest gaps

      Related modules