Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
6ff7a81 · 2026-07-28 · TK-50: field-level provenance across ALL remaining parcel ingesters
Wire source_url + source_key + fetched_at + raw_source onto every parcel row,
and registerSourceFieldMap(our_field -> source_attr) for each source, replicating
the arcgis_sales reference pattern. Now 100% of the pipeline that writes `parcel`
carries full field-level provenance.
Wired: nyc_pluto (own upsert path — provenance cols added to its bespoke
upsertChunk), king_wa (4 EXTR extracts joined by PIN), cook_il (4 Socrata datasets
by PIN), franklin_oh (GDAL .gdb), miami_dade, wake_nc, tarrant_tx, bexar_tx,
fulton_ga, saltlake_ut, sandiego_ca. Each gets a per-record addressable sourceUrl
(ArcGIS OBJECTID/id query, Socrata ?pin/?bbl, or county detail page), fetchedAt =
run start, rawSource = the raw feature/row attrs before normalization, and a
source_field_map declaring the REAL attribute each field maps from (read from the
actual mapping, joined-file/dataset named for the multi-source counties).
Behavior-preserving otherwise. tsc --noEmit clean. Verified end-to-end via bounded
real runs (San Diego Poway, Wake NC, Bexar TX): all four columns populate + the
field-map resolves a field to its source attr + raw value; test rows purged, dev
DB left consistent. No existing-row backfill (gated prod step — see
TK-50-field-provenance.md).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
536b408 · 2026-07-28 · parcels: field-level data provenance — source every parcel field to (feed + attr + time + raw)
Migration 012_parcel_provenance.sql (additive): parcel.source_url/source_key/
fetched_at/raw_source + source_field_map(source_key,our_field,source_attr).
upsert.ts: ParcelUpsertRow +optional {sourceUrl,sourceKey,fetchedAt,rawSource};
new registerSourceFieldMap(). arcgis_sales.ts: per-source fieldMap + raw feature,
stamps provenance per row + registers the field map at ingest (all 14 sources).
Adds provenance_selftest.ts (asserts persistence + "where did field X come from"
resolution, self-purging). Verified vs local usre dev DB + a bounded oregon-rlis run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1c33393 · 2026-07-28 · parcels: guard null/placeholder/junk owner names — shared sanitizeOwnerName() at upsert chokepoint
New src/ingest/parcels/owner_guard.ts drops owner values that are not real
names: exact placeholder tokens (CURRENT OWNER, UNKNOWN, OWNER OF RECORD,
TAXPAYER, N/A, NULL, ...) and non-name junk with no letter at all (leaked
Cook-IL PINs like 09364120170000, address fragments '189-191', bare years).
Wired centrally into upsertParcels() (covers all 11 ingesters that route
through it) + nyc_pluto's own upsert path. Mirrors date_guard/price_guard:
30-case tsx self-test, tsc --noEmit clean.
Over-correction guard: legit 2-char initials (JS/MH/PI) and names containing
digits (3M CO, 7-ELEVEN) are KEPT; only zero-letter values and known
placeholders are dropped. ~1,785 existing corrupt rows quantified in the
local mirror; the one-time backfill of those is drafted to pending-approval
(gated persistent DB write), not run here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f01d750 · 2026-07-28 · parcels: add Fulton County GA / Atlanta (13121) — dedicated rich full-universe adapter
Dedicated fulton_ga.ts over the keyless Fulton County DoIT/GIS-hosted Tax_Parcels
FeatureServer (Board of Assessors tax digest, ~373,004 parcels, TaxYear 2026).
Coverage: owner 99.98%, property address assembled from structured components 100%,
land-use code 100%, living units 86%, land acres. No market value / year-built /
building sqft / beds-baths / sale-or-deed feed in this open view -> parcel-detail-only
(Bexar/Salt Lake precedent): zero parcel_event rows, never a fabricated sale.
Registered 'fulton' in engine.ts, documented in PARCEL-COVERAGE.md. Verified
end-to-end vs local usre DB (bounded 2-page run, owner/addr/use 100%, geo in Atlanta
bounds, 0 events, 0 parcel_source leak), tsc exit 0, test rows purged. Applies the
Wake/Tarrant/Bexar DTD-B precedent (dedicated *.ts, no re-panel). Full 373k backfill +
Kamatera prod deploy remain Steve-gated and NOT executed this pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
994fedb · 2026-07-28 · parcels: guard negative sale prices — shared sanitizeSalePrice() across king_wa + arcgis
King County WA's EXTR_RPSale.csv carries occasional negative saleprice values
(source data-entry artifacts, -400..-100) that king_wa's num() let through
(it rejected only 0), landing 72 impossible negative prices in
parcel.last_sale_price. New shared src/ingest/parcels/price_guard.ts
sanitizeSalePrice() rejects negative/zero/non-finite amounts (strips currency,
NO upper cap — real >$1B tower sales are legit), wired into king_wa and
arcgis anyPrice (also fixes a latent bug where anyPrice stripped the minus
sign, turning -400 into 400). 18-case self-test passes; tsc clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1e35d6a · 2026-07-28 · parcels: add Yakima County WA (53077) free priced-deed feed
56,030 priced sales from the Yakima County Assessor ArcGIS MapServer
(gis.yakimawa.gov). SQL-Server-backed layer returns fully-qualified
DBO.Parcels.* attribute keys, so outFields/toRecords/orderBy all use the
qualified names. Maps GROSS_SALE_PRICE + SALE_DATE (M/D/YYYY) + EXCISE_NUMBER
+ GRANTOR_NAME + owner (ORG or FIRST/LAST) + situs + use + yrblt + sqft +
beds/baths + summed market land/impvt -> total_value. Verified end-to-end vs
local usre DB (1921 parcels + 1938 sale events w/ doc+grantor+grantee+GIS
deep-links, dates 2005-2026, source registered). tsc clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f29163c · 2026-07-27 · parcels: add Bexar County TX / San Antonio (48029) — dedicated rich full-universe adapter
BCAD appraisal roll via City-of-San-Antonio open-data BCAD_Parcels FeatureServer
(keyless ArcGIS, PropID>0, outSR=4326 server-side reproject). ~721k parcels:
owner 99%, situs property address parsed to street+city+zip 99%, living-area
sqft 87%, land sqft, state use code, legal acreage. Parcel-detail-only (no
appraised value/year-built/beds-baths/sale feed here) so zero parcel_event rows
- never a fabricated sale. Applies the Wake/Tarrant DTD-B precedent (rich
full-universe ArcGIS -> dedicated *.ts). Registered in engine.ts, documented in
PARCEL-COVERAGE.md. Verified end-to-end vs local usre DB (2-page bounded run:
3996 parcels, owner/city/zip/latlng 100%, sqft populated, 0 events, real SA
centroids, 4 stubs skipped); tsc exit 0; test rows purged. Full 721k backfill +
Kamatera deploy remain Steve-gated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0e3ce56 · 2026-07-27 · parcels: add Tarrant County TX / Fort Worth (48439) — dedicated rich full-universe adapter
715k parcels via City-of-Fort-Worth hosted TAD Parcels_Public_Vview FeatureServer
(keyless ArcGIS, COUNTYNAME='Tarrant' filter). Owner 100%, TRUE market value 99%,
sqft 89%, year-built 90%, deed date 98%. No beds/baths or sale price in the feed —
deed events recorded as event_type='deed' with amount NULL (honest, no fabricated
price). Drops the 12-31-1900 'no deed on record' sentinel (~18k rows). Applies the
Wake/Miami DTD-B precedent (rich full-universe ArcGIS → dedicated *.ts adapter).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0bae506 · 2026-07-27 · parcels: extend deed-date sanity guard to franklin_oh, king_wa, nyc_acris
Prior pass centralized sanitizeEventDate() into the 4 parcel_event deed
ingesters (arcgis_sales, miami_dade, wake_nc, sandiego_ca). But three more
parcel ingesters — franklin_oh, king_wa, nyc_acris — also emit a bare
YYYY-MM-DD sale date into parcel.last_sale_date (and the sales JSON detail)
with no future/absurd-date guard. Route each ingester's single date-parse
helper (toIsoDate/isoDate) through the shared sanitizeEventDate() so a
future/typo/sub-1900 date is dropped before it lands on the parcel row.
Same defect class the arcgis guard was added to stop, closed on the
parcel table for the last three date-bearing ingesters.
cook_il + saltlake_ut set last_sale_date:null (no dates) — safe, untouched.
DB verified clean (0 future, 0 ancient) for these counties: preventive.
tsc --noEmit clean; date_guard 19-case self-test passes. $0 (local).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8934410 · 2026-07-27 · parcels: centralize deed-date sanity guard across all 4 deed ingesters
The future-date guard was a one-off inline check in arcgis_sales.ts; wake_nc
had only a 1971 lower bound and miami_dade/sandiego had no future/absurd-date
guard at all — so a bad-data run against those feeds could re-introduce
impossible parcel_event dates. Add a shared, self-tested sanitizeEventDate()
(rejects future dates, sub-1900, and non-calendar dates like Feb 30) and wire
it into all four deed ingesters at the date-normalization point. Ships a
19-case tsx self-test (no test framework in repo).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
de29c39 · 2026-07-27 · parcels: add Marion County OR / Salem (41047) free priced-deed feed
96,115 priced sales from the Marion County official ArcGIS org
(TaxParcel_Assessment/0): SALEPRICE + INSTDATE deed date + INSTNUM/INSTTYPE
doc metadata + OWNERNAME + SITUS + LIVINGAREA + YEARBUILT + RMVTOTAL.
Config in arcgis_sales.ts, adapter in engine.ts (appended), hourly-loop
job deeds-marion, docs in SOURCES.md. Verified end-to-end against local
usre DB (2000 parcels + 2000 sale events + source registration for 41047);
tsc clean. Local only; prod deploy + full backfill to Kamatera are Steve-gated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
180998f · 2026-07-27 · parcels: add Klamath County OR (41035) free priced-deed feed
New ArcGIS priced-deed source in arcgis_sales.ts + engine.ts adapter +
hourly-loop job (deeds-klam). KC_ParcelSales FeatureServer, 38,796 priced
sales with owner/situs/sqft/beds/baths/yrblt/total-appraised/doc. Verified
end-to-end against local usre DB (1k parcels + 1k sale events + links +
source registration). SOURCES.md documents the feed + the arcgis_sales
config family. TK-16.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
eed29a4 · 2026-07-26 · saltlake: contrarian polish — drop dead EFFBUILT_YR fallback + filter attribute-less ROW ghost parcels
Contrarian gate = SHIP IT (5/5, no data bug). Two latent-risk fixes: (1) year_built now strictly BUILT_YR (eff year stays in extra.eff_year_built) — the ?? EFFBUILT fallback was dead code that would silently mislabel renovation year as built year if it ever fired; (2) skip the ~3,542 attribute-less ROW/easement ghost features (null value+addr+sqft+use) + purged the prior run's ghosts. Rejected the suggested shared upsert.ts value-guard (would break legit value-decrease re-runs). TK-00026.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b761f11 · 2026-07-26 · parcels: add Salt Lake County UT (49035) — 393k parcels, market value+sqft+year (DTD-B fresh state)
DTD verdict B (broaden hunt after NC/FL dead-ends) -> Utah LIR standardized FeatureServer. 393,521 parcels: 99% MARKET total+land value, 88% sqft, 88% year-built, use/floors/acres/material, 99% address, 100% in-bbox. No owner/sale (UT withholds owner from public LIR). Per-page dedup by source_id (PARCEL_ID non-unique across multi-part polygons). Ticket TK-00026.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d32c870 · 2026-07-26 · wake: optimize bulk-flag UPDATE to pkey join (was 53min JSONB-expr seq-scan on 5M-row prod table)
The bulk-flag UPDATE joined on extra->>'latest_deed' (JSONB, unindexable) — fine locally, but seq-scanned for ~53min on the remote 5M-row parcel table. Now: materialized CTE resolves bulk parcels to source_id, UPDATE joins on the PKEY (county_fips,source_id). Same pattern in miami/franklin adapters is a latent perf risk (deployed OK when table was smaller). TK-00026.
d39bdf3 · 2026-07-26 · wake: contrarian gate fixes — all-zero deed sentinel + pre-1971 epoch date
(1) '000000-00000' null-deed sentinel (govt/ROW parcels, no deed on record) was bulk-flagging 429 parcels + creating 37 junk parcel_event doc_numbers — the in-memory guard caught '-' but not the all-zero form (same class as Miami's placeholder). Both deed guards now use ^[-0]*$ (memory + SQL + event doc_number). (2) epochToISO now rejects sub-1971 near-epoch artifacts. Verified: sentinel 0, junk events 0, bulk 62147->61718. Ticket TK-5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8699785 · 2026-07-26 · parcels: add Wake County NC (37183) — 437k parcels, richest layer (owner+assessed value+sqft+year+sale)
Authoritative Wake Assessor ArcGIS MapServer (the www data page 404s but the REST service is live+paginated). Dedicated streaming adapter (Miami DTD-B precedent). 437,112 parcels: 100% owner, 96% assessed LAND+BLDG+TOTAL value, 86% sqft, 87% year-built, 78% sale price -> 355k parcel_event rows current to 2024+. First county with assessed value+sqft+year populated. Deed-based in-DB bulk guard: 62,147 assemblage sales flagged. Ticket TK-5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ffad429 · 2026-07-26 · brokers: add CT broker-side REB roster (fwpc-pgqj) — 16.8k brokers + 4.9k firms
Completes the CT broker thread: ct_dcp had salespersons only (RES). New ct_dcp_reb adapter ingests the Real Estate Broker Licenses roster (21,754 REB credentials) — 16,833 individual brokers + 4,920 brokerage firms (type INDIVIDUAL vs LLC/CORP/PARTNERSHIP split), all with status+city. Separate source so REB.# never collides with RES.#; same canonical-code normalization. $0 SODA CSV.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d409f98 · 2026-07-26 · miami: contrarian gate fixes — placeholder-deed bulk false-positive + ghost sale events
(1) The PA's all-zero '00000-00000' 'no deed on record' placeholder was grouping 12,285 un-recorded parcels into a fake assemblage and bulk-flagging them. Now excluded from latest_deed + bulk SQL (regex ^0+-0+$). Bulk flags 62,745->50,447 (all now real multi-folio deeds). (2) $0 non-arms-length transfers set last_sale_date but were filtered out of parcel_event -> 70,594 parcels with a last_sale_date pointing to a missing event. Now every dated transfer gets an event with doc_type Qualified/Unqualified/Non-Arms-Length (+297,491 events). Ghost rows 70,594->0. (3) Deterministic same-date sort tiebreak by slot. Verified.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7dfbf4f · 2026-07-26 · parcels: add Miami-Dade FL (12086) via keyless ArcGIS PaGis — 937k parcels + 2.06M sales
DTD verdict B (unanimous 5/5): dedicated full-universe adapter over extending the generic sale-cursor one. Streams the Property Appraiser MDC.PaGis layer (memory-safe batch upsert after a first attempt OOM'd holding 943k in RAM). 937,182 parcels: current owner (99.9%), address (95%), zoning (100%), use; up to 3 recorded sales each -> 2,064,976 parcel_event rows w/ price+grantor+grantee+deed+qualified flag, dates current to 2025. Bulk guard: 62,745 multi-folio-deed assemblages detected in-DB -> price nulled + flagged (no ParcelCount field, so deed-spans-multiple-folios is the signal). Top prices verified as real landmark commercial sales (Ponte Gadea, Brickell towers). No assessed value/beds/baths/sqft/year in the public layer.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aa4b31c · 2026-07-26 · franklin: contrarian gate fixes — full-timestamp dedupe + bulk-sale price nulling
(1) Same-date sales: date-only dedupe let a $0 grantor-side transfer (recorded at HH:00:00) beat the real arms-length sale one second later (HH:00:01), yielding wrong owner + null price on ~1289 parcels. Now rank by FULL timestamp, price-desc as secondary tiebreak. Verified 010-001903: FOX/null -> WILLIAMS/$206k. (2) Bulk sales (ParcelCount>1) stamped the full portfolio total on each parcel (1100 impossible >$10M, max $120M). Now null the unallocatable price + flag bulk_sale/bulk_parcel_count in extra (24,116 flagged); 72 legit large-commercial singles retained.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4c2251e · 2026-07-26 · parcels: add Franklin County OH (39049) via .gdb + GDAL — 122k parcels w/ owner/address/sqft/sale
DTD verdict B: rich CAMA lives only in the auditor's 603MB monthly FileGeoDatabase (GDAL-only); polygon shapefile is geometry-only, www data pages WAF-walled. Adapter extracts the TaxParcelSale point layer (dedupe to latest sale/parcel) -> 122,047 parcels: site address (98%), owner=latest grantee (100%), use class, res sqft (85%), last sale date+price (66% arms-length), lat/lng (100% in-county). Honest sale-window label 2020-01..2023-05 in parcel_source. Documented GDAL exception + deploy path in FRANKLIN-RUNBOOK.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c452e2e · 2026-07-26 · ct_dcp: normalize credential code to canonical RES.# source_id (contrarian gate fix)
218 rows carried a legacy Socrata suffix (RES.#.INACTIVE) + 1 digitless RES stub — malformed upsert keys that would silently duplicate if upstream cleaned the field. Strip the suffix at parse, require a digit, delete+reingest. Verified: 96,988 CT rows now 100% canonical shape, 0 collisions with distinct persons.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a74ceb3 · 2026-07-26 · brokers: license_status filter (?status=active) on /api/brokers + Active-only UI toggle on directory
Leverages the CT full-roster upgrade (status now populated on 97k CT + FL/DE/IL brokers) so the directory can show active licensees only. localStorage-persisted, matches existing srvbar controls.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
289894d · 2026-07-24 · fix(sublease): reject non-finite numerics + malformed dates in admin insert
Bad numeric input reached Postgres verbatim: Number('abc')=NaN → term_months (integer) 500s
('invalid input syntax for type integer: NaN'), and sqft/asking_rate/lat/lng (numeric/double)
silently stored literal NaN, poisoning sorts + the map. available_date took any string → date
column 500 on a bad value. Now coerced to null (num/int/isoDate helpers) so bad input degrades
to unset instead of a 500 or a NaN row.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
948bf60 · 2026-07-22 · Deepen LA: commercial property-detail page unifying facts + brief + comps + firms
- public/commercial-property.html: click any commercial asset -> full detail page with
the generated news brief as lede, assessed value breakdown (total/land/improvements),
building details, last-recorded date, comparable same-type assets in the same city,
and local LA real-estate firms (from the CA DRE registry). Ties together every layer
built this session (parcels + briefs + comps + broker intel) into one 'property page'.
- Wired card/marquee/feed/story clicks across the explorer + feed to open it.
- Verified headless: Beverly Center detail renders lede + 6 stats + 12 comps/firms, 0 errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45be23a · 2026-07-22 · Phase 5: CA DRE broker registry (FREE) + LA broker/firm intel surface
- CA DRE turned out to be FREE (secure.dre.ca.gov/datafile/CurrList.zip, refreshed
daily) — no purchase needed. New src/ingest/brokers/ca_dre.ts adapter (unzip + CSV,
Corporation->firm, Broker/Salesperson->broker w/ employing-firm linkage).
Loaded 382,944 brokers + 34,727 firms in 17s.
- index.ts: added city filter to /api/brokers + /api/firms (LA scoping).
- public/commercial-brokers.html: LA firms ranked by agent count (surfaces CBRE 1,213,
Newmark, etc. — the major commercial houses), click-to-expand roster, broker search.
Wired into commercial nav. Verified headless: 200 firms + roster + broker tab, 0 errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
04a19e4 · 2026-07-22 · Phase 4: generated commercial news briefs (local Ollama, $0)
- 006_commercial_briefs.sql + src/ingest/commercial/briefs.ts: local-LLM (qwen2.5)
generates one factual news-wire sentence per top/recent asset from assessor facts
only — strict guardrails against invented prices/owners/tenants ('assessed value'
never called a sale). 220 briefs generated, 0 failed.
- commercial.ts: LEFT JOIN briefs into /marquee + /feed; new /api/commercial/brief/:ain.
- Feed page gains a Featured-Assets story grid + inline briefs on activity items;
explorer marquee tiles show briefs. Verified headless: 9 stories + 79 item-briefs, 0 errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
613b106 · 2026-07-22 · LA commercial RE layer: taxonomy + materialized 153.9k parcels + explorer & news feed
Repositions the platform toward local commercial real estate news, LA first.
- src/lib/commercial_types.ts: use_desc2 -> canonical taxonomy (office/retail/
industrial/hospitality/studio/parking/other); Studio broken out for LA media assets.
- 005_commercial.sql + src/ingest/commercial/la_assessor.ts: materialize the LA
assessor sqlite's 153,923 commercial+industrial parcels into pg commercial_parcel
(classified, city/zip parsed, indexed; multi-county-ready). LA has assessed value +
recording date, NO sale price/owner (roll limit) — never fabricated.
- src/server/commercial.ts: /api/commercial/{types,cities,search,feed,marquee,property}.
- public/commercial.html (explorer: marquee + filters + sort + density) and
public/commercial-feed.html (recent recorded activity, the local news feed).
- Verified headless: 120 cards + 6 marquee + 8 filters / 80 feed items, 0 console errors.
Marquee surfaces real trophy assets (Beverly Center $995M, Bunker Hill towers).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e3663e8 · 2026-07-21 · NYC ACRIS recorded sales -> PLUTO parcels (188k lots, 5 boroughs, $0 open data)
Extends King-depth recorded sale prices to NYC, the platform's #1 metro — the
'Sale/deed chain from ACRIS pending' gap on all five boroughs is now filled.
- Keyset-streams ACRIS Master (priced deed-family + RPTT transfer docs) and Legals
(->BBL), joins in memory, single set-based UPDATE onto existing PLUTO lots.
- Single-lot price attribution: document_amt is per-DOCUMENT, so multi-lot/portfolio
deeds are dropped (killed the $1.5B-on-a-house artifacts); trophy single-lot sales
(245 Park $1.77B, 424 5th/Amazon $978M) verified real.
- Broad sale doc_type set (DEED family + RPTT&RET/RPTT) fixed Staten Island 1 -> 35,725.
- Idempotent clear-then-apply (no residue across re-runs); retry-hardened SODA client
(429/5xx + network-timeout backoff, bounded per-request).
- Result: 188,046 lots with recorded sales to 2026-06, 95% clean sale history.
Condo-unit deeds + buyer/seller (ACRIS Parties) noted as follow-up.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>