D
DealHuman
LIVE

Architecture & Multi-State Reconnaissance

Phase 1P · 5 states now LIVE (CT, NY, NJ, OH, FL) via verified $0 public GIS endpoints. Commercial-use & redistribution UNVERIFIED for all sources. No paid services, no outreach. $0/month maintained. Current cost: $0.00.

Phase 1P update: NY, NJ, OH, and FL statewide parcel providers are now CONNECTED and verified via live ArcGIS REST queries. Each normalizes into the same NormalizedProperty model. Missing fields are marked source_unavailable / not_supported — never false. PA/TX/AZ/CA remain on county-fallback (NOT_CONNECTED). Financial engine untouched.

10-State Public Data Coverage Matrix (10 states)

StateParcelOwnerMailingCAMATax DelinqForeclosureCode/BlightProbateLiensListing
Connecticut🟢 LIVE PUBLIC ($0)✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
New York🟢 LIVE PUBLIC ($0)✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
New Jersey🟢 LIVE PUBLIC ($0)✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Pennsylvania🟡 MANUAL PUBLIC / DOWNLOAD ONLY✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Rhode Island🟢 LIVE PUBLIC ($0)❌❌❌🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Ohio🟢 LIVE PUBLIC ($0)❌❌❌🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Florida🟢 LIVE PUBLIC ($0)✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Texas🟡 MANUAL PUBLIC / DOWNLOAD ONLY✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
Arizona🟡 MANUAL PUBLIC / DOWNLOAD ONLY✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE
California🟡 MANUAL PUBLIC / DOWNLOAD ONLY✅✅✅🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY🟡 MANUAL PUBLIC / DOWNLOAD ONLY⚫ NOT AVAILABLE

6 states have verified free statewide parcel geometry: Connecticut, New York, New Jersey, Rhode Island, Ohio, Florida.

4 states require county-by-county adapters (no single statewide attribute service): Pennsylvania, Texas, Arizona, California.

Owner/mailing/CAMA availability varies by state even where parcel geometry is free — NY & RI public parcel layers are geometry-only. Distress fields (tax delinquency, foreclosure, probate, liens) are manual-portal-only in every state at $0.

County-Level Fallback Architecture

StateStatewide AdapterCounty AdaptersBehaviorNotes
ConnecticutctPublicGisProvider—statewide onlyStatewide CT CAMA covers all 169 towns. No county fallback needed.
New YorknyParcelsProvider—statewide onlyGeometry statewide; owner/CAMA requires county or paid enrichment (future).
New JerseynjModivProvider—statewide onlyMOD-IV composite is statewide. Strongest free CAMA.
Pennsylvania—Monroecounty only67 autonomous counties. County-by-county adapter required. Monroe UNVERIFIED.
Rhode IslandriRigisProvider—statewide onlyRIGIS geometry statewide; CAMA via municipal assessor (future).
OhioohOgripProviderFranklinuse statewide then countyOGRIP statewide + county auditor CAMA where available.
FloridaflFgioProvider—statewide onlyFGIO statewide parcels from 67 county property appraisers.
Texas—Bexar, Harriscounty onlyNo statewide attribute service. County CADs hold CAMA.
Arizona—Pima, Maricopacounty onlyCounty open-data portals; no statewide attribute service.
California—Los Angeles, San Diegocounty only58 counties; LA publishes statewide boundary geodatabase (geometry only).

Each state may have a statewide adapter OR fall back to per-county adapters. Different jurisdictions can use different sources. All adapters normalize into the same internal model — no screen consumes state-specific schemas.

Normalized Multi-State Data Model

Every state's raw schema (CT CAMA, NY parcels, NJ MOD-IV, etc.) is normalized into one internal NormalizedProperty with coverage-aware fields:

supported_truesupported_falsesupported_unknownnot_supportedsource_unavailablenot_connected

Missing state/county coverage NEVER silently becomes FALSE. Every field retains provenance. Raw state-specific attributes are kept for traceability but never consumed directly by app screens.

National-Ready Provider Registry

StateProviderCoverageFieldsCostStatus
ConnecticutctPublicGisProviderStatewide (169 towns)geometry, apn, owner, mailing, assessment, beds, baths, living_area, sale_history$0LIVE
New YorknyParcelsProviderStatewide (county-permission-dependent)geometry, apn, owner, mailing, assessment, market_value, beds, living_area, year_built, acreage$0LIVE
New JerseynjModivProviderStatewide (21 counties)geometry, apn, owner, mailing, assessment, land_use, beds, sale_history, year_built$0LIVE
OhioohOgripProviderStatewide (88 counties)geometry, apn, situs_address, land_use_code$0LIVE
PennsylvaniapaMonroeGisProviderMonroe Countygeometry, apnUNKNOWNNOT_CONNECTED
Rhode IslandriRigisProviderStatewide (geometry)geometry, apn$0NOT_CONNECTED
FloridaflFgioProviderStatewide (67 counties, 10.8M parcels)geometry, apn, owner, mailing, assessment, just_value, living_area, year_built, sale_history, acreage$0LIVE
TexastxCountyCadProviderCounty-by-countygeometry, apn, owner, assessmentUNKNOWNNOT_CONNECTED
ArizonaazCountyProviderCounty-by-countygeometry, apn, ownerUNKNOWNNOT_CONNECTED
CaliforniacaCountyProviderCounty-by-countygeometry, apn, owner, assessment$0NOT_CONNECTED

Only CT is LIVE. All others NOT_CONNECTED until explicitly approved + endpoint-verified. No faked nationwide coverage.

Phase 1P — Live Provider Verification (NY / NJ / OH / FL)

4 new statewide parcel providers verified LIVE via actual ArcGIS REST queries (2026-09-19). Commercial-use & redistribution remain UNVERIFIED for all — internal lookup use only.
New York
🟢 LIVE🔵 UNVERIFIED
NYS Tax Parcels Public (FeatureServer layer 1)
https://nysgeohub.ny.gov/arcgis/rest/services/Parcels/NYS_Tax_Parcels_Public/FeatureServer/1
Geometry: ✓Owner: ✓Mailing: ✓CAMA: ✓APN: ✓Year: 2025

CORRECTS Phase 1O matrix (which said geometry-only). Layer 1 carries owner/mailing/CAMA. Coverage is county-permission-dependent — some counties absent. Commercial redistribution terms UNVERIFIED; internal lookup use only until confirmed.

New Jersey
🟢 LIVE🔵 UNVERIFIED
NJ Parcels + MOD-IV Composite (Cadastral MapServer layer 0)
https://maps.nj.gov/arcgis/rest/services/Framework/Cadastral/MapServer/0
Geometry: ✓Owner: ✓Mailing: ✓CAMA: ✓APN: ✓Year: 2025

Strongest free CAMA-equivalent of the 10 states. MOD-IV = tax assessment table joined to parcels. License text states data is 'not survey data.' Commercial redistribution terms UNVERIFIED — internal lookup use only.

Ohio
🟢 LIVE🔵 UNVERIFIED
Ohio Statewide Parcels Public View (FeatureServer layer 0)
https://services2.arcgis.com/MlJ0G8iWUyC7jAmu/arcgis/rest/services/OhioStatewidePacels_full_view/FeatureServer/0
Geometry: ✓Owner: —Mailing: —CAMA: —APN: ✓Year: 2024

HONEST LIMITATION: public 'full view' layer carries geometry + parcel ID + SitusAddressAll ONLY. Owner/mailing/CAMA fields exist in schema but are BLANK — CAMA lives at county auditor open-data portals (e.g. Franklin). OGRIP states 'no use restrictions' but redistribution UNVERIFIED. ownerName/mailing marked source_unavailable in adapter.

Florida
🟢 LIVE🔵 UNVERIFIED
Florida Statewide Cadastral / FDOR Cadastral 2025 (FeatureServer layer 0)
https://services9.arcgis.com/Gh9awoU677aKree0/arcgis/rest/services/Florida_Statewide_Cadastral/FeatureServer/0
Geometry: ✓Owner: ✓Mailing: ✓CAMA: ✓APN: ✓Year: 2025

Very rich: owner, mailing, just-value, assessed value, living area, year built, sale price/date. FDOR data is public record per FL law, but commercial redistribution inside a paid SaaS UNVERIFIED. Internal lookup use only until confirmed.

Coverage symbols: ✓ Available · — Not provided by this source (does NOT mean the real-world fact is absent) · ✗ Confirmed absent. OH owner/mailing/CAMA are blank in the public layer — marked source_unavailable, never false.

Multi-Tenant SaaS Architecture (Design Only)

NOT DEPLOYED. localStorage is NOT production SaaS persistence. This documents requirements for future migration.
AreaRequirementMVP Status
User authenticationEmail/password + OAuth; secure session; password resetnot configured
Investor accountsPer-user profile, preferences, plan tiernot configured
Tenant isolationEvery user-owned record scoped by tenantId; row-level securitydesigned
Durable databaseRelational/JSON store surviving restart + rebuildnot configured
Encryption/securityTLS in transit; encryption at rest; secrets managementnot configured
RolesOwner / Team member / Viewer (future)designed
BackupsAutomated + point-in-time recoverynot configured
Data export/deletionGDPR/CCPA-style export + deletepartial
Usage meteringTrack API calls, map tiles, saved-search runs per tenantnot configured
Subscription/billingStripe or equivalent; plan limits enforcednot configured
Plan limitsFree / Pro / Team tiers with property + search capsdesigned
Customer onboardingSignup → state selection → first property importdesigned
Account recoveryEmail reset, MFA fallbacknot configured
Admin/support toolsTenant lookup, impersonation (audited), suspensionnot configured
Logging/monitoringError capture, audit log of state changespartial
Rate limitingPer-tenant limits on external + internal callsnot configured
Scheduled jobsSaved-search refresh, snapshot diffingdesigned
Data-provider credentialsPer-tenant or platform-level API keys, secret-storednot configured
Privacy/termsPrivacy policy, ToS, data processing agreementnot configured
Data Isolation (non-negotiable):

Every user-owned record (properties, notes, targets, field records, analyses, seller info, proposals, offers, documents, actual outcomes, acquisition history) MUST carry a tenantId and be filtered by it on every read/write.

Joseph migration: Joseph's existing localStorage data becomes a single private tenant during migration. No other tenant can read it.

Enforcement: Row-level security at the DB layer + application-level tenantId filter on all queries.

Shared data: Public parcel/CAMA geometry may be shared/cached across tenants (it is public record). Investor-specific intelligence (notes, offers, outcomes) is NEVER shared.

Durable Persistence Options:
OptionCostIsolationVerified
Browser localStorage (CURRENT)$0NONE — single implicit tenant✓
IndexedDB (CURRENT for offline cache)$0NONE✓
Cloudflare D1 (SQLite at edge)Free tier; paid ~$5/mo + usageRow-level via tenantId columnUNVERIFIED
Supabase PostgresFree tier; Pro ~$25/moRLS policies + auth.uid()UNVERIFIED
Cloudflare KV / Workers KVFree tier; paid ~$5/mo + reads/writesKey prefix by tenantIdUNVERIFIED
Saved-Search Automation:

Current: Manual refresh only. User clicks RUN SEARCH; snapshot diff computes NEW/CHANGED/REMOVED.

Future: Scheduled job (cron/edge timer) runs each active saved search on a cadence, stores snapshot, diffs, and notifies.

Status: NOT CONFIGURED — architecture only

Commercial Cost Model by User Count

UsersDatabaseHostingMapsProperty DataEst. Total
1$0 (localStorage)$0 (edge free tier)$0 (Esri/OSM free)$0 (public GIS)$0
25UNKNOWN (D1/Supabase tier)UNKNOWN (edge limits)UNKNOWN (tile usage)$0 (public) or UNKNOWN (paid)UNKNOWN — needs vendor quotes
100UNKNOWNUNKNOWNUNKNOWNUNKNOWNUNKNOWN — needs vendor quotes
500UNKNOWNUNKNOWNUNKNOWNUNKNOWNUNKNOWN — needs vendor quotes
1000UNKNOWNUNKNOWNUNKNOWNUNKNOWNUNKNOWN — needs vendor quotes

All costs at 25+ users are UNKNOWN until vendor quotes obtained. No invented prices. At 1 user (current), verified cost = $0.

$97/Month Feasibility (Pricing Hypothesis)

$97/month is a PRICING HYPOTHESIS only — not hard-coded anywhere.

  • • Cost-per-active-user must stay well below $97 to leave margin
  • • Maps: free Esri/OSM tiles must cover Pro usage, OR a paid tier (Mapbox) must fit budget — UNKNOWN until usage measured
  • • Geocoding: Census free tier covers low volume; paid geocoding needed at scale — cost UNKNOWN
  • • Property data: $0 public GIS keeps cost near zero; paid enrichment (ATTOM/Regrid) would erode margin
  • • Database + hosting: must stay on free/low tiers (D1/Supabase free → paid only at threshold)
  • • Background jobs: platform cron at $0; scale cost UNKNOWN
Free $0
50 props · 1 state(s) · basic tools
Pro $97/mo (HYPOTHESIS)
1000 props · 3 state(s) · full tools
Team UNKNOWN
5000 props · 10 state(s) · full tools

Do NOT launch billing until cost-per-user is verified below the price point with margin.

Deal Tools & Documents Architecture

Workflow: Property → Deal Workspace → Calculators → Documents → Checklist → Offers → Closing → Outcomes

N2W Calculator v5.4
native calculatorunverified

Native calculator translating N2W spreadsheet formulas into a tested engine. Must reuse acquisition-calc.ts primitives — NOT a competing engine. Requires golden-number regression before replacing spreadsheet.

AWS Calculator v10
native calculatorunverified

Native calculator. Identify overlap with acquisition-calc.ts first; extend authoritative primitives rather than duplicating.

DASF v3.4
native calculatorunverified

Native calculator. Overlap analysis + golden-number testing required before adoption.

ClosingDocsChecklist v3.0
interactive workflowunverified

Interactive digital checklist with statuses, notes, timestamps. Property/deal-specific instance — editing one transaction never modifies the master.

Autofill Rules:
  • • Every autofilled value carries provenance — never manufacture UNKNOWN info.
  • • Autofill populates empty fields; it does NOT overwrite user-entered values.
  • • If source field is UNKNOWN, autofill leaves the target empty with provenance 'unknown'.
  • • Autofill writes into a deal-specific instance — never the master template.
Autofill map: property_address, apn, municipality, state, owner_seller, purchase_price, financing_terms, mortgage_balance, repairs, rent, closing_date, entity_buyer, offer_terms

No third-party/proprietary templates redistributed until ownership/license confirmed. Spreadsheet formulas require independent golden-number regression before replacing spreadsheets. acquisition-calc.ts remains the authoritative financial engine — no competing engine.

Commercial Rights / IP Register

AssetKindOwnerInternalCommercialRedist.
CT Statewide CAMA/Parcelgovernment datasetState of Connecticutinternal usecommercial use unknowncommercial use unknown
NYS Tax Parcels Publicgovernment datasetState of New Yorkinternal usecommercial use unknowncommercial use unknown
N2W Calculator v5.4spreadsheet templateUNVERIFIEDinternal usecommercial use unknownnot permitted
AWS Calculator v10spreadsheet templateUNVERIFIEDinternal usecommercial use unknownnot permitted
DASF v3.4spreadsheet templateUNVERIFIEDinternal usecommercial use unknownnot permitted
ClosingDocsChecklist v3.0spreadsheet templateUNVERIFIEDinternal usecommercial use unknownnot permitted
NYS Tax Parcels Publicgovernment datasetState of New Yorkinternal usecommercial use unknowncommercial use unknown
NJ Parcels + MOD-IV Compositegovernment datasetState of New Jerseyinternal usecommercial use unknowncommercial use unknown
Ohio Statewide Parcels Public Viewgovernment datasetState of Ohiointernal usecommercial use unknowncommercial use unknown
Florida Statewide Cadastral / FDORgovernment datasetState of Florida / County Property Appraisersinternal usecommercial use unknowncommercial use unknown

State-by-State Source Register (Verified Sources)

Connecticut — parcel geometry🟢 LIVE PUBLIC ($0)
CT ECO / CT GIS Office Statewide Parcel · CT GIS Office, Dept of Administrative Services
https://cteco.uconn.edu/data/gis/
Access: ArcGIS FeatureServer (query by APN/address/point) · Cost: $0 · Commercial: UNVERIFIED — public record; reuse likely permitted but terms not confirmed for redistribution
New York — parcel geometry🟢 LIVE PUBLIC ($0)
NYS Tax Parcels Public · NYS GIS Clearinghouse
https://nysgeohub.ny.gov/arcgis/rest/services/Parcels/NYS_Tax_Parcels_Public/FeatureServer
Access: ArcGIS FeatureServer + zipfile download · Cost: $0 · Commercial: UNVERIFIED
New Jersey — parcel geometry🟢 LIVE PUBLIC ($0)
NJGIN Parcels + MOD-IV Composite · NJ Office of GIS (NJGIN)
https://nj.gov/njgin/edata/parcels
Access: Statewide download + county shapefiles + ArcGIS open data · Cost: $0 · Commercial: UNVERIFIED
Ohio — parcel geometry🟢 LIVE PUBLIC ($0)
OGRIP Statewide Parcel Map · OGRIP / Ohio DAS
https://ohioparcels-geohio.hub.arcgis.com/
Access: ArcGIS Online item + download · Cost: $0 · Commercial: OGRIP states 'no use restrictions' — UNVERIFIED for redistribution
Florida — parcel geometry🟢 LIVE PUBLIC ($0)
Florida Statewide Parcels · FL Geographic Information Office + FDOR
https://www.floridagio.gov/
Access: FGIO open-data portal (ArcGIS Hub) · Cost: $0 · Commercial: UNVERIFIED
Rhode Island — parcel geometry🟢 LIVE PUBLIC ($0)
RIGIS Parcels · RIGIS / RI Statewide Planning
https://www.rigis.org/
Access: Download (shapefile/geodatabase) · Cost: $0 · Commercial: UNVERIFIED
New Jersey — parcel geometry🟢 LIVE PUBLIC ($0)
NJ Parcels + MOD-IV Composite · NJ Office of GIS (NJOGIS / NJGIN)
https://maps.nj.gov/arcgis/rest/services/Framework/Cadastral/MapServer/0 | https://www.nj.gov/njgin/edata/parcels
Access: ArcGIS REST MapServer query (where/geometry/outFields) · Cost: $0 · Commercial: UNVERIFIED
Ohio — parcel geometry🟢 LIVE PUBLIC ($0)
Ohio Statewide Parcels Public View · OGRIP / Ohio DAS
https://services2.arcgis.com/MlJ0G8iWUyC7jAmu/arcgis/rest/services/OhioStatewidePacels_full_view/FeatureServer/0
Access: ArcGIS REST FeatureServer query · Cost: $0 · Commercial: UNVERIFIED
Florida — parcel geometry🟢 LIVE PUBLIC ($0)
Florida Statewide Cadastral / FDOR 2025 · FL Geographic Information Office + FDOR
https://services9.arcgis.com/Gh9awoU677aKree0/arcgis/rest/services/Florida_Statewide_Cadastral/FeatureServer/0
Access: ArcGIS REST FeatureServer query · Cost: $0 · Commercial: UNVERIFIED

Phase 1Q — Commercial Rights Gate (3 Independent Dimensions)

A technically LIVE endpoint does NOT automatically become SaaS-approved. Three independent dimensions: technical (reachable?), commercial use (may we use it in a commercial product?), redistribution (may we cache/transform/redistribute inside a paid SaaS?). Silence in a license is NEVER permission.

Gate summary: 5 of 11 gates technically LIVE · 0 SaaS-approved · 0 internal-use-approved. No source has been cleared for commercial redistribution.
StateCategoryProviderTechnicalCommercialRedist.SaaS?
ConnecticutParcel/CAMACT Statewide CAMA/Parcel (CT GIS Office / CT ECO)🟢 LIVE🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
New YorkParcel/CAMANYS Tax Parcels Public (FeatureServer layer 1)🟢 LIVE🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
New JerseyParcel/CAMANJ Parcels + MOD-IV Composite (Cadastral MapServer layer 0)🟢 LIVE🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
OhioParcel/CAMAOhio Statewide Parcels Public View (FeatureServer layer 0)🟢 LIVE🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
FloridaParcel/CAMAFlorida Statewide Cadastral / FDOR 2025 (FeatureServer layer 0)🟢 LIVE🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
ConnecticutCourt/ForeclosureCT Judicial Branch Civil Lookup🔵 RESEARCH ONLY🔴 NOT PERMITTED🔴 NOT PERMITTED⛔ NO
ConnecticutProbateCT Probate Court Case Lookup🔵 RESEARCH ONLY🔴 NOT PERMITTED🔴 NOT PERMITTED⛔ NO
ConnecticutTax DelinquencyMunicipal Tax Collector Portals🔵 RESEARCH ONLY🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
ConnecticutRecorder/Land RecordsTown Clerk RECORDhub / SearchIQ Index🔵 RESEARCH ONLY🔵 UNVERIFIED🔴 NOT PERMITTED⛔ NO
ConnecticutCode EnforcementBridgeport Anti-Blight / Stamford Code Enforcement⚫ NOT CONNECTED🔵 UNVERIFIED🔵 UNVERIFIED⛔ NO
All StatesListing/MLSMLS / Zillow / Redfin / Realtor.com⚫ NOT CONNECTED🔴 NOT PERMITTED🔴 NOT PERMITTED⛔ NO

Phase 1Q — Provider / Data Categories (8 Tracks)

Parcel/CAMA data is separated from investment intelligence. Public GIS gives geometry + assessment — it does NOT give equity, mortgage, foreclosure, listing, DOM, or vacancy. 1 of 8 categories operational (LIVE). The rest are RESEARCH_ONLY or NOT_CONNECTED.

1. Parcel / CAMALIVE

Parcel geometry, APN, owner, mailing, assessment, appraisal, beds/baths, living area, sale history, land use.

Provides: Parcel boundary geometry, APN / parcel ID, Owner name (where supplied), Mailing address (where supplied)…
Does NOT provide: Current market value / AVM, Mortgage balance, Equity, Tax delinquency status…
Coverage: CT (LIVE, statewide CAMA), NY (LIVE, county-dependent), NJ (LIVE, MOD-IV), OH (LIVE, geometry+APN only), FL (LIVE, rich CAMA). PA/TX/AZ/CA = county fallback, NOT_CONNECTED.
2. Recorder / Land RecordsRESEARCH ONLY

Mortgages, releases, assignments, lis pendens, judgment liens, tax liens, mechanic's liens, deeds, probate deeds.

Provides: Recorded mortgages, Deed transfers / ownership changes, Lis pendens (pre-foreclosure notice), Judgment liens…
Does NOT provide: Current mortgage balance (without payoff statement), Listing status…
Coverage: CT = manual portal lookup only (RECORDhub/SearchIQ, vendor-operated). No verified API. All other states = NOT_CONNECTED.
3. Court / ForeclosureRESEARCH ONLY

Foreclosure cases, filing date, case number, plaintiff, defendant, property address, case status, judgment/sale.

Provides: Foreclosure case filings, Case number / docket, Filing date, Plaintiff (lender)…
Does NOT provide: Pre-foreclosure before filing, Listing status…
Coverage: CT Judicial Branch = manual portal only, ToS bans scraping. No machine-readable feed. All states = RESEARCH_ONLY / NOT_CONNECTED.
4. Tax DelinquencyRESEARCH ONLY

Delinquent real-estate taxes, outstanding balance, tax liens, tax-sale status, delinquency date.

Provides: Delinquent tax balance, Tax lien filings, Tax-sale / auction notices, Delinquency date…
Does NOT provide: Current if paid after source snapshot, Listing status…
Coverage: CT = manual municipal portal lookup only. Bridgeport tax-lien dataset NOT confirmed (Phase 1J). All states = RESEARCH_ONLY / NOT_CONNECTED.
5. Probate / EstateRESEARCH ONLY

Decedent estate cases, trusts, probate district, case status. Possible estate-match to property owner.

Provides: Decedent estate cases, Probate district, Case filing date, Case status…
Does NOT provide: Verified property linkage (name match alone is insufficient), Confirmation owner is deceased (requires additional evidence), Listing status…
Coverage: CT Probate Court Case Lookup = manual portal only. No API. All states = RESEARCH_ONLY / NOT_CONNECTED.
6. Listing / MLSNOT CONNECTED

Active listings, listing price, DOM, price reductions, expired/withdrawn, pending, sold status.

Provides: Active listing price, Days on market, Price reductions, Expired / withdrawn / canceled…
Does NOT provide: Off-market properties, Owner contact info…
Coverage: NO VERIFIED $0 SOURCE. MLS requires paid license. Zillow/Redfin/Realtor.com ToS ban scraping. All states = NOT_CONNECTED.
7. Code EnforcementNOT CONNECTED

Building violations, property-maintenance violations, zoning violations, unsafe structures, blight, open permits.

Provides: Code violations, Blight / condemnation records, Open permits (intelligence, not distress), Enforcement case status…
Does NOT provide: Listing status, Mortgage info…
Coverage: Bridgeport blight = NOT_CONNECTED (Phase 1J). Stamford code = NOT_CONNECTED. No verified machine-readable enforcement datasets. All states = NOT_CONNECTED.
8. Other Distress / Event SourcesNOT CONNECTED

Vacancy signals, fire/insurance loss, water shut-off indicators, utility disconnects, other distress not covered above.

Provides: Vacancy indicators (where authoritative), Utility disconnect notices (where public), Fire/insurance loss records (where public)…
Does NOT provide: Most of these are NOT publicly available at $0…
Coverage: No verified $0 machine-readable sources identified. Vacancy remains UNKNOWN unless an authoritative source field supports it. All states = NOT_CONNECTED.

Phase 1Q — Property Data Freshness Architecture

Critical distinction: SOURCE FRESHNESS (how often the government dataset updates) ≠ PLATFORM CHECK FREQUENCY (how often we query). If a source updates annually and we check every 5 minutes, the data is STILL annual. Never label data "real-time" or "fresh" solely because the platform recently queried it.
StateCategoryProviderSource Update Freq.Verified?≤24h Detection?
Connecticutparcel camaCT GIS Office / CT ECO Statewide CAMAAnnual✅ Yes⛔ No
New Yorkparcel camaNYS Tax Parcels Public (FeatureServer layer 1)Annual✅ Yes⛔ No
New Jerseyparcel camaNJ Parcels + MOD-IV CompositeAnnual✅ Yes⛔ No
Ohioparcel camaOGRIP Statewide Parcels Public ViewAnnual✅ Yes⛔ No
Floridaparcel camaFDOR Statewide Cadastral 2025Annual✅ Yes⛔ No
All Statescourt foreclosureCT Judicial Branch (manual portal)UNKNOWN🔵 No⛔ No
All Statestax delinquencyMunicipal tax portalsUNKNOWN🔵 No⛔ No
All Statesrecorder land recordsTown clerk / RECORDhub indexUNKNOWN🔵 No⛔ No
All StatesprobateCT Probate Court Case LookupUNKNOWN🔵 No⛔ No
All Stateslisting mlsMLS / commercial portalsDaily🔵 No⛔ No
All Statescode enforcementMunicipal code/blight datasetsUNKNOWN🔵 No⛔ No
All Statesother distress eventsVariousUNKNOWN🔵 No⛔ No
≤24h detection capable: NONE — no verified fast sources connected
NOT capable of ≤24h: 12 categories — all connected sources are ANNUAL; all event sources are NOT_CONNECTED.

Phase 1Q — Property Watch Architecture (DESIGN ONLY)

STATUS: NOT OPERATIONAL. ARCHITECTURE ONLY. Phase 1S added a D1Adapter + server trust boundary, but no D1 binding is configured, so durable persistence is NOT yet proven. All other prerequisites remain unmet: scheduler, notification channel, connected event sources, commercial rights clearance.

Detection target: Detection within 24 hours of the event becoming available from the authorized source — TARGET, not current guarantee.

Current capability: Manual snapshot diff exists for CT CAMA fields (watch-snapshots.ts). User must manually trigger REFRESH. No automated monitoring, no notifications.

Prerequisites (all unmet):
  • • Durable persistence for snapshots (cannot live in browser for automation)
  • • Scheduled job runner (Cloudflare Cron Triggers or external scheduler)
  • • Per-tenant rate limiting on public endpoints
  • • Notification channel (email/in-app) — currently NONE
  • • Commercial rights clearance for cached/redistributed data
  • • Connected event sources (foreclosure, tax, liens, listings — all NOT_CONNECTED)
Operational TODAY (manual):
  • • Owner name changed
  • • Owner mailing address changed
  • • Assessment changed
  • • CAMA attributes updated
Future only (require connected sources):
  • • New foreclosure filing detected
  • • Lis pendens recorded on property
  • • Tax delinquency detected
  • • Tax sale / auction notice filed
  • • New lien recorded on property
  • • New mortgage recorded
  • • …and 9 more

Phase 1Q — Paid Provider Research (DOCUMENTATION ONLY — NOT PURCHASED)

NO PURCHASES. 7 providers researched · 0 purchased. Pricing marked UNKNOWN where not independently verified. Do NOT connect without Joseph's explicit approval.
Regrid (formerly Loveland Technologies)NOT PURCHASED
parcel cama · Nationwide parcel boundaries + owner/CAMA attributes
Claimed freq: Monthly · Verified: UNKNOWN
Price: UNKNOWN — self-service API tier exists but pricing not independently verified. State license previously estimated $7K-$10K/yr (UNVERIFIED).
Value: Would add nationwide owner/mailing/land-use to states where public layers are geometry-only (OH, RI). Could improve coverage but does NOT add distress events.
ATTOM Data SolutionsNOT PURCHASED
parcel cama · Nationwide property data + pre-foreclosure + mortgage + AVM
Claimed freq: Weekly · Verified: UNKNOWN
Price: UNKNOWN — enterprise pricing, typically $500-$1,500+/mo. NOT independently verified.
Value: Would add pre-foreclosure, mortgage balance, equity, AVM — the highest-value UNKNOWN signals. Would transform opportunity scoring. But cost likely exceeds $100/mo ceiling.
CoreLogic / RealtyTracNOT PURCHASED
court foreclosure · Nationwide foreclosure / pre-foreclosure / NOD / lis pendens
Claimed freq: Daily · Verified: UNKNOWN
Price: UNKNOWN — enterprise licensing. NOT verified.
Value: Would provide same-day foreclosure event detection — the #1 freshness gap. But redistribution typically restricted and cost likely exceeds budget.
DataTree / First American (Title Data)NOT PURCHASED
recorder land records · Nationwide recorded documents — mortgages, deeds, liens, lis pendens
Claimed freq: Daily · Verified: UNKNOWN
Price: UNKNOWN — per-document or subscription pricing. NOT verified.
Value: Would provide same-day lien/recording/ownership-transfer event detection. High value but redistribution restricted.
Black Knight (Mortgage Data)NOT PURCHASED
parcel cama · Nationwide mortgage/loan-level data
Claimed freq: Monthly · Verified: UNKNOWN
Price: UNKNOWN — enterprise only. NOT available for small-scale purchase.
Value: Would provide mortgage balance / equity — the biggest data gap. But NOT available for our use case (enterprise licensing, restricted redistribution).
MLS API (various regional MLS)NOT PURCHASED
listing mls · Regional — active listings, DOM, price changes, sold data
Claimed freq: Near real-time · Verified: UNKNOWN
Price: UNKNOWN — MLS membership + API fees vary by region. Typically $50-$200+/mo per MLS.
Value: Would provide near-real-time listing/DOM/price-change detection. High value for flip/retail strategies. But redistribution NOT_PERMITTED — can only display, not redistribute.
PropStreamNOT PURCHASED
parcel cama · Nationwide property data + pre-foreclosure + skip tracing
Claimed freq: Weekly · Verified: UNKNOWN
Price: UNKNOWN — subscription product (~$99-$129/mo per user, UNVERIFIED).
Value: Joseph may already use this. Data exports could feed our CSV importer. But no API — manual export only. Redistribution NOT_PERMITTED.

Phase 1Q — Property Data Freshness Target Register

For each signal track: the authoritative source, verified source update frequency, our engineering target detection time, and what we actually achieve today. Target ≠ guarantee. SOURCE FRESHNESS ≠ PLATFORM POLLING FREQUENCY.

Summary: 14 signal tracks · 2 LIVE · 9 RESEARCH_ONLY · 3 NOT_CONNECTED. 0 capable of ≤24h detection today · 14 NOT capable. All high-value event tracks are MANUAL_ONLY or NOT_POSSIBLE at $0.
SignalCategoryAuthoritative SourceSource Freq.TargetActual TodayAutomationTechnical
CAMA / Assessment Changeparcel camaState GIS Office / County Property AppraiserAnnualWithin 24 hoursManual onlyPartial automation🟢 LIVE
Ownership / Deed Transfer (via CAMA)parcel camaState GIS Office (sourced from town/county recorder)AnnualWithin 24 hoursManual onlyPartial automation🟢 LIVE
Deed Recording / Ownership Transferrecorder land recordsMunicipal Town Clerk / County RecorderDailyWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Mortgage Recordingrecorder land recordsMunicipal Town Clerk / County RecorderDailyWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Lis Pendens / Pre-Foreclosure Noticerecorder land recordsMunicipal Town Clerk / County RecorderDailyWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Judgment / Tax / Mechanic's Lienrecorder land recordsMunicipal Town Clerk / County RecorderDailyWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Foreclosure Case Filingcourt foreclosureCT Judicial BranchDailyWithin 24 hoursManual onlyNot permitted🔵 RESEARCH ONLY
Foreclosure Judgment / Sale Datecourt foreclosureCT Judicial BranchDailyWithin 24 hoursManual onlyNot permitted🔵 RESEARCH ONLY
Tax Delinquency Detectedtax delinquencyMunicipal Tax CollectorUNKNOWNWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Tax Sale / Auction Noticetax delinquencyMunicipal Tax CollectorUNKNOWNWithin 24 hoursManual onlyManual only🔵 RESEARCH ONLY
Probate / Estate Case FiledprobateCT Probate CourtsUNKNOWNWithin 24 hoursManual onlyNot permitted🔵 RESEARCH ONLY
New Listing / Price Change / Pending / Soldlisting mlsRegional Multiple Listing ServiceNear real-timeReal-timeNot possiblePartial automation⚫ NOT CONNECTED
Code Violation / Blight / Condemnationcode enforcementMunicipal Building / Code EnforcementUNKNOWNWithin 24 hoursManual onlyManual only⚫ NOT CONNECTED
Vacancy Signalother distress eventsVarious (utility, postal, assessor occupancy field)UNKNOWNWithin 24 hoursUNKNOWNUNKNOWN⚫ NOT CONNECTED

Phase 1Q — Sources Required for ≤24h / Near-Real-Time Detection

What would need to be licensed + connected to hit the 24-hour detection target for the two highest-value event tracks. NONE purchased. NONE connected. All BLOCKED or conditional.

Foreclosure / Pre-Foreclosure / Lis PendensBLOCKED
Target: Within 24 hours · Required source class: Paid foreclosure data feed OR paid recorder/title index API
Candidate providers: CoreLogic / RealtyTrac (foreclosure feed — DAILY claimed); DataTree / First American (recorder index — DAILY); ATTOM (pre-foreclosure + NOD/NED — WEEKLY claimed)
Why current sources fail: CT Judicial Branch ToS bans scraping (NOT_PERMITTED). Town clerk recorder index has no API (MANUAL_ONLY). CAMA reflects foreclosure only at annual update. No $0 machine-readable foreclosure source exists.
Cost barrier: UNKNOWN — enterprise pricing, likely $500-$1,500+/mo. NOT verified. Exceeds $100/mo MVP ceiling.
Rights barrier: Redistribution inside a paid SaaS is NOT_PERMITTED for CoreLogic/DataTree without enterprise agreement. ATTOM redistribution UNVERIFIED.
New Listing / Price Change / Pending / Sold / DOMPOSSIBLE UNDER CONDITIONS
Target: Real-time · Required source class: MLS API (regional) with valid MLS membership
Candidate providers: Regional MLS API (e.g. SMART MLS CT, OneKey MLS NY); ATTOM (listing data — WEEKLY, not real-time)
Why current sources fail: NO VERIFIED $0 source. Zillow/Redfin/Realtor.com ToS ban scraping. MLS is the only near-real-time source but requires paid membership + API fees. ATTOM listing data is WEEKLY at best, not real-time.
Cost barrier: UNKNOWN — MLS membership + API fees vary by region, typically $50-$200+/mo per MLS. May fit under $100/mo IF Joseph already holds a membership.
Rights barrier: Redistribution of MLS data inside a paid SaaS is NOT_PERMITTED per MLS rules. Display-only with proper attribution MAY be possible under a broker's license. Requires MLS rules verification.

Phase 1Q — Property Watch Notification Architecture (DESIGN ONLY)

STATUS: ARCHITECTURE_ONLY. NOT OPERATIONAL. Only manual CAMA snapshot diff exists (owner/mailing/assessment/cama_change). All 15 high-value event types require connected sources that do not exist at $0. No scheduler, no notification channel, no durable persistence.

Target: Detect material property changes within 24 hours of the event becoming available from the authorized source — preferably much faster where legitimate near-real-time feeds permit.

Flow:
  1. 1. Property saved → Watch enabled (per-tenant)
  2. 2. Scheduler triggers authorized-source check at cadence permitted by source rights
  3. 3. Current snapshot retrieved from connected provider
  4. 4. Snapshot compared with prior snapshot (compareSnapshots engine — already built)
  5. 5. Material change detected → PropertyWatchEvent created (already modeled)
  6. 6. Notification triggered via channel (email / in-app / SMS)
  7. 7. Event + provenance stored durably (per-tenant isolation)
Cadence rules:
  • • Polling frequency must NEVER exceed what the source license permits.
  • • Polling a DAILY source every minute does NOT make data real-time — it wastes rate-limit budget.
  • • Recommended cadence = min(sourceUpdateFrequency, license-permitted frequency).
  • • ANNUAL sources (CAMA) → poll weekly at most; detection bounded by annual updates.
  • • DAILY sources (recorder/court) → poll daily IF a connected API exists (none today).
  • • NEAR_REAL_TIME sources (MLS) → poll hourly IF MLS API connected + rights cleared.
Prerequisites (all unmet):
  • • Durable per-tenant persistence (snapshots cannot live in browser for automation)
  • • Scheduled job runner (Cloudflare Cron Triggers or external scheduler)
  • • Per-tenant rate limiting on public endpoints (respect source ToS)
  • • Notification channel (email/in-app) — currently NONE configured
  • • Commercial rights clearance for any cached/redistributed data
  • • At least one connected event source (foreclosure/listing/tax/lien) — currently NONE
Notification types (15):
  • • New foreclosure filing detected
  • • Lis pendens recorded on property
  • • Property listed for sale
  • • Listing price reduced
  • • Listing moved to pending
  • • Property sold
  • • New lien recorded
  • • Ownership changed — deed recorded
  • • Tax delinquency detected
  • • Tax sale / auction notice filed
  • • Probate case filed (possible estate match)
  • • Assessment changed
  • • Code violation recorded
  • • Owner name changed
  • • Owner mailing address changed
Recommendation: Do NOT build automated monitoring until (a) durable persistence is proven, (b) at least one event source is licensed + connected, and (c) commercial rights are cleared. Build manual event capture first (Phase 1R candidate) so Joseph can record verified events by hand with full provenance.

Phase 1R — Durable Persistence + Property Event Ledger

PERSISTENCE STATUS: NOT DURABLE. localStorage is browser-only. It does NOT survive server restart, rebuild, or redeploy. A durable binding (Cloudflare D1 / Supabase) is AVAILABLE but NOT configured. The Property Event Ledger uses the LocalStorageAdapter today so functionality works in-browser, but this is NOT production-durable persistence.
Durable options investigated (NOT connected):
  • • Cloudflare D1 (SQLite at the edge) — AVAILABLE BUT UNCONFIGURED. Free tier: Free tier: 5GB storage, 5M rows read/day, 100K rows written/day (per Cloudflare published limits — verify before relying). Binding configured: false. Survives restart/rebuild/redeploy: true (if configured).
  • • Supabase Postgres — AVAILABLE BUT UNCONFIGURED. Free tier: Free tier: 500MB storage, paused after inactivity (per Supabase published limits — verify). Binding configured: false. Survives restart/rebuild/redeploy: true (if configured).
Property Event Ledger — single ingestion contract:

One ingestPropertyEvent() contract serves BOTH manual capture (today) and future automated feeds. Manual events default to UNVERIFIED. Deduplication is deterministic; conflicts are flagged, never silently merged. Event date, source publication date, and platform discovery date are three distinct timestamps.

Migration safety (BLOCKED):

10 localStorage structures inventoried (2 HIGH risk). Safe path: BACKUP → VALIDATE → MIGRATE → VERIFY. Migration is BLOCKED until a durable binding is configured + a restart/redeploy survival test passes. Local source is never erased automatically.

Provider performance benchmark:

ARCHITECTURE ONLY. No providers are connected for any event signal track. Cannot measure provider performance without at least two connected providers producing the same signal type for the same coverage area. Future value: Lets Joseph compare providers on cost-per-useful-event and detection speed BEFORE purchasing — the evidence we need before paying for data.

What's operational today: Manual event capture + Property Event Timeline + derived opportunity signals (with evidence) on Property Detail. Event freshness/lag computed per event. NOT operational: durable persistence, automated watch, provider benchmarking, SaaS tenant auth.

Phase 1R — Durable Persistence Proof

BLOCKED — NOT DURABLE. NOT durable. No D1/Postgres binding is configured. localStorage cannot serve as durable persistence for automated event monitoring. Migration of Joseph's existing data to a durable store is BLOCKED until a binding is configured + a restart/redeploy survival test passes.
Active adapter: LocalStorageAdapter · Tier: NOT_DURABLE · Survives restart: NO · Survives rebuild: NO · Survives redeploy: NO (UNVERIFIED)

NOT durable. localStorage is browser-only and does not survive server restart, rebuild, or redeploy. A durable binding (Cloudflare D1 or Supabase) is AVAILABLE but NOT configured. The Property Event Ledger uses the LocalStorageAdapter today so functionality works in-browser, but this is NOT production-durable persistence.

Durable options investigated:
Cloudflare D1 (SQLite at the edge)AVAILABLE BUT UNCONFIGURED
Runtime compatible: ✓Binding configured: NOFree tier: yesTransactions: ✓Tenant-ready: ✓Cost: $0 (free tier, within limits)

Limits: Free tier: 5GB storage, 5M rows read/day, 100K rows written/day (per Cloudflare published limits — verify before relying).

Runs in the Workers runtime this project targets. Requires a D1 binding in the deployment config (wrangler / nitro) + a database ID. NOT configured. Would need binding setup + a live restart/redeploy survival test before claiming durable.

Supabase PostgresAVAILABLE BUT UNCONFIGURED
Runtime compatible: ✓Binding configured: NOFree tier: yesTransactions: ✓Tenant-ready: ✓Cost: $0 (free tier, within limits)

Limits: Free tier: 500MB storage, paused after inactivity (per Supabase published limits — verify).

External hosted Postgres. Requires account + project + connection string stored as a secret. NOT configured. Adds an external dependency + potential future cost.

What was built instead: A swappable PersistenceAdapter interface + LocalStorageAdapter so the Property Event Ledger, migration layer, and all consumers work in-browser today and can switch to a durable D1/Postgres adapter later with zero consumer changes.
D1 activation path (when a binding is configured):
  1. 1. Create a Cloudflare D1 database and add a D1 binding to the deployment config (wrangler / nitro).
  2. 2. Store the database binding name so the runtime can inject it.
  3. 3. Implement a D1Adapter class implementing the PersistenceAdapter interface (read/write/remove/keys).
  4. 4. Swap getActiveAdapter() to return the D1Adapter when the binding is present.
  5. 5. Run a restart + redeploy survival test: write a record, restart/redeploy, read it back.
  6. 6. Only after survival is verified, mark PERSISTENCE_STATUS.durable = true.
  7. 7. Migrate existing localStorage data via the safe BACKUP → VALIDATE → MIGRATE → VERIFY path.
What Joseph must do: When ready: configure a Cloudflare D1 binding in the deployment config, then ask Mak to run a restart + redeploy survival test and swap getActiveAdapter() to a D1 adapter. No application data needs to be re-entered.

Phase 1R — Local Data Inventory & Migration Safety

Migration status: BLOCKED. No durable target (D1/Postgres) is configured. Migration cannot run safely. localStorage is NOT durable and must not be treated as the source of truth for production data.
Structures inventoried: 10 · Keys present in this browser: 0 · Backup available: yes
Safe migration path:
  1. 1. BACKUP — export full app backup JSON (existing EXPORT APP BACKUP capability)
  2. 2. VALIDATE — validate backup schema + record counts + conflict identification
  3. 3. MIGRATE — copy (not move) records into the durable store using a fixture/copy first
  4. 4. VERIFY — read back from durable store + compare counts + spot-check relationships
  5. 5. ONLY THEN mark migration successful — never erase local source automatically
KeyDescriptionProvenance fields
ctres.propertyStore.v1Core property records (manual + imported + enriched)source, dataSource, retrievedAt, collectionYear
ctres.closedDeals.v2Consolidated acquisition store (analyses, proposals, offers, closed deals)source, createdAt, updatedAt, discoverySource
ctres.fieldNotes.v1Field walk notes + photos + condition observationscreatedAt, capturedAt
ctres.targets.v1Today's Targets work queueaddedAt, reason, sourceProvenance
ctres.reviewState.v1Property review status (unreviewed/reviewing/interesting/not-a-fit/target)reviewedDate, sourceSearch
ctres.savedSearches.v1Saved searches + snapshotscreatedAt, lastRun
ctres.watchSnapshots.v1Property watch snapshots (manual CAMA diff)capturedAt, source
ctres.discoveryTrace.v1Discovery provenance (which search found which property)discoveryDate, searchName, criteriaMatched
ctres.activityTimeline.v1Property activity timeline eventstimestamp, source
ctres.propertyEvents.v1Phase 1R Property Event Ledger (NEW)eventDate, discoveredAt, sourcePublishedAt, sourceProvider, sourceRecordId, captureMethod, verificationStatus

Phase 1R — Property Event Ledger (Canonical)

A single provenance-preserving ledger for material property events. Both MANUAL verified events (today) and future AUTOMATED authorized feeds enter through the same ingestion contract — the manual workflow is simply one producer.

Ingestion contract:
PropertyEventInput → validate → identify property → deduplicate → preserve provenance → store event → update derived intelligence → (future) notification hook
Event types (22):
  • • FORECLOSURE_FILED — Foreclosure Filed
  • • LIS_PENDENS — Lis Pendens
  • • TAX_DELINQUENCY — Tax Delinquency
  • • TAX_SALE — Tax Sale / Auction
  • • LIEN_RECORDED — Lien Recorded
  • • MORTGAGE_RECORDED — Mortgage Recorded
  • • DEED_TRANSFER — Deed Transfer
  • • OWNER_CHANGE — Owner Change
  • • PROBATE_EVENT — Probate / Estate
  • • LISTED_FOR_SALE — Listed for Sale
  • • LISTING_PRICE_CHANGE — Listing Price Change
  • • LISTING_PENDING — Listing Pending
  • • LISTING_SOLD — Listing Sold
  • • ASSESSMENT_CHANGE — Assessment Change
  • • CAMA_CHANGE — CAMA Change
  • • VACANCY_SIGNAL — Vacancy Signal
  • • CODE_VIOLATION — Code Violation
  • • DISTRESS_SIGNAL — Distress Signal
  • • CUSTOM_VERIFIED_EVENT — Custom Verified Event
  • • RETURNED_MAIL — Returned Mail
  • • SKIP_TRACE_COMPLETED — Skip Trace Completed
  • • ADDRESS_UPDATED — Address Updated
  • Verification statuses:
    VerifiedUnverifiedNeeds ReviewConflicting

    Manual entries default to UNVERIFIED unless Joseph explicitly sets VERIFIED. Automated feeds default to UNVERIFIED until a human confirms. Conflicting legal events are NEVER silently merged — flagged CONFLICTING for review.

    Capture methods:
    ManualAutomated
    Event freshness (three distinct timestamps):
    • • eventDate — when the real-world event occurred
    • • sourcePublishedAt — when the source made it available
    • • discoveredAt — when our platform detected it

    Enables future measurement of source lag, platform detection lag, and total event-to-detection lag — the evidence layer for evaluating paid data providers.

    Phase 1R — Derived Opportunity Signals (Evidence-Based)

    Events contribute to derived intelligence labels (PRE_FORECLOSURE, TAX_DISTRESS, etc.). Every signal carries its supporting events — never an opaque score. No AI scoring in Phase 1R. MULTIPLE_DISTRESS_SIGNALS activates when ≥2 distress categories are present.

    Architecture only. Signals populate as events are recorded. No signal is generated without supporting events in the ledger.

    Phase 1R — Provider Performance Benchmark (Architecture Only)

    ARCHITECTURE ONLY. ARCHITECTURE ONLY. No providers are connected for any event signal track. Cannot measure provider performance without at least two connected providers producing the same signal type for the same coverage area.

    Intended use: Compare connected providers on the same signal track by source lag, platform detection lag, accuracy, duplicate rate, missing rate, and cost-per-useful-event — so Joseph can make evidence-based decisions BEFORE paying for data (e.g. 'Provider A costs $X but gets foreclosure events 18 hours earlier than B').

    Required before operational:
    • • At least two connected providers for the same signal track (to compare)
    • • Durable persistence to accumulate measurements across time
    • • A meaningful sample of real events (not test data)
    • • Verified cost data for each provider being compared

    Phase 1R — Property Watch Prerequisite Update

    STILL NOT OPERATIONAL. Durable persistence is now ARCHITECTURED (swappable PersistenceAdapter) but NOT yet durable (no D1 binding). All other prerequisites remain unmet: no scheduler, no notification channel, no connected event sources, no commercial rights clearance.

    The Property Event Ledger + ingestion contract are the foundation Property Watch will use when its prerequisites are met. Manual event capture is operational today; automated monitoring is not.

    Phase 1S — Runtime Verification (Cloudflare Workers)

    Hosting: Cloudflare Workers (Nitro cloudflare-module preset, nodejs_compat)Execution: Serverless edge Worker — SSR + server functions + server routes run in the WorkerD1 runtime compatible: ✓D1 binding configured: NOServer functions: ✓Browser→durable via server boundary: ✓
    • • D1 is runtime-compatible (Workers binding) but NOT configured in this deployment.
    • • No wrangler.toml, no d1_databases, no env var, no secret — confirmed by inspection.
    • • A D1Adapter is implemented behind binding detection; it activates ONLY when detectD1Binding() finds a real bound D1Database.
    • • Until a binding exists + a genuine restart/redeploy survival test passes, all lifecycle tests are UNVERIFIED_NOT_TESTABLE — never PASS.
    • • Browser never receives DB credentials; all durable access goes through server functions (trust boundary).

    Phase 1S — D1 Durable Adapter

    IMPLEMENTED, NOT ACTIVATED. D1 is runtime-compatible (Cloudflare Workers) but no binding is configured in this deployment. The adapter is implemented and ready; it will activate the moment a D1 binding is added at the deployment level and a restart/redeploy survival test passes.
    Implemented: ✓Binding configured: NOActivated: NOSchema: ctres_kv (tenant_id, key, value, created_at, updated_at) + idx_ctres_kv_tenant

    Activation rule: Activates ONLY when detectD1Binding() finds a real bound D1Database. Never simulated. Never fake.

    Server-side trust boundary: Browser → server function (createServerFn) → validation (zod) → tenant enforcement (tenantId scoping) → D1Adapter → durable store. The browser never receives database credentials.

    Phase 1S — Real Persistence Lifecycle Test

    UNVERIFIED — no D1 binding. The lifecycle harness is implemented as server functions (writeLifecycleTest / readLifecycleTest) but cannot produce VERIFIED_PASS until a real binding is configured and a genuine restart/redeploy is performed.
    Lifecycle eventResult
    Refresh (write + read-back)UNVERIFIED NOT TESTABLE
    Runtime/server restartUNVERIFIED NOT TESTABLE
    RebuildUNVERIFIED NOT TESTABLE
    RedeploymentUNVERIFIED NOT TESTABLE
    Cross-browser / cross-deviceUNVERIFIED NOT TESTABLE
    • • No durable backend configured in this deployment (no Postgres/Supabase secrets, no D1 binding). The lifecycle harness is implemented as server functions (writeLifecycleTest / readLifecycleTest) and will produce VERIFIED_PASS only after a real backend is configured + a genuine restart/redeploy is performed and readLifecycleTest is re-run.
    • • Mocks, unit tests, in-memory DBs, localStorage, and simulated adapters do NOT count.

    Phase 1S — Reversible Migration Harness

    Migration status: BLOCKED. No durable target (D1/Postgres) is configured. Migration cannot run safely. localStorage is NOT durable and must not be treated as the source of truth for production data.

    Safe path: BACKUP → INVENTORY → VALIDATE → DRY RUN → MIGRATE → VERIFY → RECONCILE. localStorage is never deleted after migration; rollback remains available. Production read path does not switch until verification succeeds.

    Dry-run requires no binding; real migration is BLOCKED until a D1 binding is configured.

    Phase 1S — Property Watch Prerequisite Update

    STILL NOT OPERATIONAL. Durable persistence removed ONE architectural gap (swappable adapter + server trust boundary) but did NOT satisfy the durable prerequisite because no binding is configured. Property Watch remains NOT OPERATIONAL.
    • • Durable persistence NOT proven — D1Adapter implemented but no D1 binding configured (Phase 1S)
    • • No scheduler
    • • No notification infrastructure
    • • No connected distress/event providers (all RESEARCH_ONLY or NOT_CONNECTED)
    • • Commercial redistribution rights UNVERIFIED for all sources

    Phase 1T — D1 Activation Status (BLOCKED: infrastructure action required)

    SUCCESS CONDITION NOT MET. A real Cloudflare D1 database + binding cannot be created from inside the application sandbox. The D1Adapter, server trust boundary, lifecycle harness, and migration harness are all implemented and ready — they activate the instant a real binding is configured. No data has been migrated. localStorage remains authoritative.
    D1 database created: NOD1 binding configured: NOAdapter activated: NORecords migrated: 0
    Lifecycle eventResult
    Refresh (write + read-back)UNVERIFIED NOT TESTABLE
    Runtime/server restartUNVERIFIED NOT TESTABLE
    RebuildUNVERIFIED NOT TESTABLE
    RedeploymentUNVERIFIED NOT TESTABLE
    Cross-browser / cross-deviceUNVERIFIED NOT TESTABLE

    Phase 1T — Server-Controlled Single-Tenant Context

    SERVER-CONTROLLED SINGLE-TENANT CONTEXT

    The server determines Joseph's tenant context. Client-supplied tenantId is ignored for writes and cannot be used to read another tenant's data. This is NOT full multi-tenant authentication — it is a server-controlled single-tenant trust boundary appropriate to the current single-user MVP.

    Full multi-tenant auth: NOClient can choose tenant: NOAuthorized tenant: tenant.joseph

    Enforcement: enforceTenant() coerces any client-supplied tenantId to the server-controlled tenant before every durable read/write. A client cannot read/write another tenant by changing tenantId. Tests prove substitution is rejected.

    Phase 1T — Infrastructure Action Joseph Must Perform

    STOP — requires Joseph's Cloudflare access. The application cannot create a D1 database or binding from inside the sandbox. These steps must be performed in the Cloudflare dashboard / deployment config.
    1. In the Cloudflare dashboard, create a D1 database (free tier — $0). Name it e.g. ctres-acquisition.
    2. Add a D1 binding to the deployed Worker. Binding name expected by the app: DB (also checks D1, DATABASE, CTRES_DB). The binding must be present in the Worker's environment.
    3. Redeploy the Worker so the binding is injected into the runtime.
    4. Tell Mak the binding is live. Mak will run writeLifecycleTest (writes a canary to real D1), then trigger a redeploy, then run readLifecycleTest to prove the same record survived.
    5. Only after survival is VERIFIED_PASS will Mak run the safe migration (BACKUP → VALIDATE → DRY RUN → MIGRATE → VERIFY → RECONCILE) and switch the authoritative read path to D1. localStorage is retained as rollback.

    No payment, no paid upgrade, no recurring charge required — D1 free tier covers the MVP. Do not enter billing information for a paid plan without explicit approval.

    Cost guard: Current monthly cost $0.00 · new cost incurred $0.00. No paid services connected, no outreach activated, no state integrations deployed. All architecture is design-only.