Homesonspec
Search the build
-
70807442026-07-28 feat: live V8 'engine room' dashboard (:9798) — pistons/crank/belt driven by real DB throughput -
c9a3fdf2026-07-28 admin/ingestion: guard sparkline last-value (TS strict index) -
557ae652026-07-28 admin/ingestion: live sparkline + new-vs-refreshed + error rate + per-source health table -
d44d5272026-07-28 auto-save: 2026-07-28T08:58:52 (1 files) — apps/admin/src/app/api/ingestion-stats/route.ts -
3cac9a32026-07-28 deploy-kamatera: :80 acme block covers admin.homesonspec.com for renewals -
50641122026-07-28 deploy-kamatera: admin block uses LE cert (admin now in cert SANs) -
de505ba2026-07-28 feat: LA all-permit ingest + Census permit geocoder + searchable permit viewer -
b0103f22026-07-28 admin: live ingestion dashboard (/ingestion) — auto-refreshing throughput from Kamatera DB -
db9700f2026-07-28 build-loop: source repo .env for DATABASE_URL (fixes PrismaClientInitializationError on Kamatera) -
9075f7b2026-07-28 feat: construction-pipeline layer — building-permit ingestion + Census geocoder -
89a47a02026-07-28 build-loop: honor injected DATABASE_URL (portable to Kamatera cron) -
be371282026-07-28 deploy-kamatera: rewrite for homesonspec self-host (correct naming, explicit PORT, pgboss grants, LE-cert vhost) -
e118a5b2026-07-28 build-loop: max-it — fan out 4 adapters in parallel (per-domain), 30rpm, bigger enrich batches -
168b21d2026-07-28 build-loop: West Coast first + deeper per-state cap (CAP=120) -
53b18042026-07-28 collectors: add Ashton Woods adapter (national; JSON-LD QMI, per-home geo) -
da8824a2026-07-28 build-loop: go nationwide — sweep 42 top homebuilding states (all-50 name map) -
40750c02026-07-28 fix: david-weekley stories/garages must be integer (1.5-story home 400'd the Houston page) -
b319e2f2026-07-28 TK-10: add finish-tk10.sh turnkey go-live driver -
887b38f2026-07-28 auto-save: 2026-07-28T06:58:06 (2 files) — collectors/discovery/src/index.ts scripts/build-loop.sh -
eacead22026-07-27 collectors: add David Weekley adapter (national; server-rendered homes-ready-soon) -
8550e532026-07-27 recon: classify 8 regional builders' plain-fetch inventory feasibility -
444eee62026-07-27 collectors: add Discovery Homes adapter (first regional; Seeno-family feed) -
c6127352026-07-27 auto-save: 2026-07-27T20:54:34 (4 files) — apps/workers/package.json apps/workers/src/cli.ts pnpm-lock.yaml collectors/discovery/ -
fbd5fc62026-07-27 workers: register 29 Pacific-region regional builders as onboarding targets -
76c1d272026-07-27 auto-save: 2026-07-27T20:24:23 (1 files) — scripts/build-loop.sh -
48110bc2026-07-27 scripts: all-night autonomous build-loop (ingest x states + enrichment sweeps) -
8dda3322026-07-27 workers: public-records nearby-enrichment stage (NCES schools + OSM places) -
7677fe32026-07-27 collectors: enforce robots.txt in LiveFetcher (POLICY compliance) -
7782f9c2026-07-27 auto-save: 2026-07-27T19:54:12 (1 files) — collectors/common/src/live-fetch.ts -
ce2edb52026-07-27 chore: v0.3.1 (session close — spechomes→homesonspec rename) -
63efe782026-07-27 auto-save: 2026-07-27T18:53:10 (95 files) — .env.example README.md apps/admin/next.config.ts apps/admin/package.json apps/admin/src/app/api/review/route.ts -
ff7f5932026-07-27 Scrub non-owned domain spechomes.com -> homesonspec.com (Layer 1) -
762fa0e2026-07-27 chore: v0.3.0 (session close) — honest positioning, admin fail-closed auth, secret history scrub, typecheck gate green -
1c821fb2026-07-27 chore(TK-10): finalize secret scrub — gitignore ROLLBACK-DNS.txt, env-based admin test cred -
77fbb632026-07-27 auto-save: 2026-07-27T17:22:24 (1 files) — deploy-kamatera.sh -
89f29a32026-07-27 admin: fail-closed auth + generated prod password (TK-10 security #2, partial) -
2fa9a7f2026-07-27 auto-save: 2026-07-27T16:52:13 (3 files) — apps/workers/src/pipeline.itest.ts collectors/taylor-morrison/tsconfig.json packages/source-registry/src/ -
ef453032026-07-27 web: honest Lennar-anchored positioning (TK-10 blocker C) -
0d87dcd2026-07-23 chore: v0.2.1 (session close) — spechomes pm2 prod + redeploy scripts -
8f6d3bf2026-07-23 auto-save: 2026-07-23T13:51:43 (1 files) — pnpm-lock.yaml -
b04f2be2026-07-23 add pnpm redeploy scripts (build + pm2 restart) for prod web/admin -
844edb32026-07-23 pm2: boot spechomes-workers via node --env-file so DATABASE_URL loads -
ff4a50f2026-07-23 chore: gitignore screenrecord/ test artifacts -
4acc9f12026-07-23 chore: v0.2.0 (session close) — Taylor Morrison adapter + national multi-state state-fixes -
6612fe52026-07-23 fix(dr-horton,tri-pointe): use real parsed state instead of hardcoded CA -
55372bc2026-07-23 fix(pulte): use real state code instead of hardcoded CA (enables multi-state) -
ac8dff82026-07-23 docs(collectors): update builder status — 5 live, TM egress-blocked, Meritage needs XHR trace -
2570ea02026-07-23 fix(workers): declare taylor-morrison collector dep so pnpm links it -
86433ff2026-07-23 feat(collectors): add Taylor Morrison adapter (Sitecore fedmodel, CA) -
08c6d172026-07-23 fix(collectors): raise DRH+Lennar default PAGE_LIMIT 8→300 for statewide coverage -
aa61dfd2026-07-23 fix(live-fetch): broaden Accept header so D.R. Horton WAF stops 406ing -
f66f9ae2026-07-23 Add Tri Pointe adapter (5th builder) — Next.js RSC (unescape + brace-match display_price objects), CA-scoped, WITH lat/lon; verified 3 live Corona homes + community geo/phone; registered -
8456a672026-07-23 Fix new-builder ingest bugs caught on real data: lat/lon optional in home schema (KB/DRH feeds lack per-home geo), TOWNHOUSE→TOWNHOME enum (KB/Pulte), Pulte builder slug pulte→pultegroup + deploy-full pnpm install step -
74786962026-07-23 Add Pulte adapter (4th builder) — JSON API (getcommunities + qmiplans), CA-scoped, WITH lat/lon so homes map; verified 8 live Ontario homes + community geo/phone; registered -
ca4ba1d2026-07-22 CA builders: recon spec doc (collectors/BUILDERS.md) — turnkey extraction specs for Pulte/TriPointe/TaylorMorrison/Meritage; all 6 builders plain-curl/no-anti-bot/per-community-phone -
65775ba2026-07-22 Add KB Home adapter (3rd builder) — single-feed (var allMIRs double-decode), CA-scoped, verified 58 communities + 143 live CA homes from one fetch; registered in pipeline -
d27cab52026-07-22 Add D.R. Horton adapter (2nd builder) — Sitecore var-model blob, CA-scoped via DRHORTON_STATE, captures homes+community+salesPhone+images; verified 3 live Manteca homes; registered in pipeline -
0d7bc772026-07-22 Listings contact: capture per-community sales-office phone from Lennar feed (verified) + Community.salesPhone column + prominent Call button on home detail; Lennar exposes no public email so listings show phone + lead form -
c6421402026-07-22 Lennar adapter: LENNAR_STATE_FILTER for targeted per-state crawls + drop promo/event non-community URLs (alphabetical full-sweep is too slow to reach late-alphabet states like TX) -
ef19ec02026-07-22 Fix broken search: when a query doesn't resolve to a location (city/state/builder name), fall back to a free-text filter (city/community/builder/state) instead of silently returning the entire national catalog -
82319812026-07-22 Design review fix: dedupe home detail Data-provenance table to one row per field (newest) — kills the ~8x per-snapshot row bloat the visual review caught -
2968a922026-07-22 Builder-image kill-switch: BUILDER_IMAGES_ENABLED env gates all photo render sites (default ON) — one flip to compliance pending media-rights decision (DTD panel FIX-THEN-SHIP) -
f5b91112026-07-22 Contrarian fixes: StagedRecord unique (source,snapshot,home) + upsert/delete-recreate → FORCE_REEXTRACT idempotent (no raw-row bloat); img loading=lazy + hero fetchPriority -
bda9b292026-07-22 auto-save: 2026-07-22T20:46:37 (1 files) — packages/database/prisma/schema.prisma -
f4b686d2026-07-22 Featured homes: spread price bands (value ~250-380k / mid ~480-650k / luxury 750k+) so tiers read distinctly -
ba86ab22026-07-22 Homepage: 3 featured homes on load — Value / Mid-range / Luxury price tiers, real listings with builder photos -
4be9de72026-07-22 deploy-full.sh: also ship collectors + publisher + schemas src (image extractor was silently missing from prod deploys) -
ba895b72026-07-22 Pipeline: FORCE_REEXTRACT env to re-extract already-snapshotted pages (backfills new fields like images onto unchanged-source homes) + durable grant note -
13997e32026-07-22 Builder images: capture per-home photos from Lennar feed (elevationImage/plan/community, verified 58/58 homes), images[] schema+migration, thread through publisher, render in detail hero+gallery+carousel with gradient fallback -
77b81eb2026-07-22 Home detail: branded hero header + status badge, 'more homes in this community' carousel, prominent builder-contact CTA (builders-want-to-sell), full brand reskin -
da530f22026-07-22 Amazon-style faceted search rail: State (multi-select, 50-state overflow) + Builder/firm + Min Sq Ft facets, live counts, clear-all, sticky scroll; add state facet to API + multi-state param -
008a9de2026-07-22 auto-save: 2026-07-22T18:15:55 (4 files) — apps/web/src/app/search/SearchClient.tsx apps/web/src/lib/parse-search.ts packages/search/src/index.ts deploy-full.sh -
ec6046b2026-07-22 Contrarian gate fixes: guard auto-pause recovery (manual disable stays down), defense-in-depth freshness!=INACTIVE on search+map, honest design-bundle README -
3cb66352026-07-22 Stage-3 verification engine: freshness decay + relabel, source-health auto-pause (SourceRun log + counters), cross-source dedup, verify CLI + 9 unit tests, wired into pipeline runs -
832a5c02026-07-22 Design system iter-2: reskin /map explorer panel + /search cards & controls from tokens (brand/accent, Fraunces prices, card-interactive) -
8b8126d2026-07-22 Design system iter-1: Claude Design bundle (tokens + buttons/badges/home-card/map-legend cards w/ @dsCard markers) staged for DesignSync push -
678cf482026-07-22 Design system iter-1: @theme token layer (brand/accent/status ramps, Fraunces+Inter, radii/shadows), reskin app shell + hero from tokens -
be457642026-07-22 auto-save: 2026-07-22T17:15:39 (2 files) — deploy-heromap.sh deploy-web.sh -
bbbcbc62026-07-22 Add robust map explorer (/map): 12k canvas markers, per-field on/off toggles (status/price/beds/builder), color-by + legend, localStorage-persisted -
13c6b832026-07-22 Add live national map to homepage hero (loads on page load) + fix stale demo copy -
ab1a3302026-07-22 auto-save: 2026-07-22T14:44:58 (1 files) — cert-homesonspec.sh -
1a425932026-07-22 rebrand SpecHomes → HomesOnSpec; add /builders directory (all 30 builders w/ coverage, website, live home counts + links) -
af67cea2026-07-22 clean-relaunch script for homesonspec.com (ship demo-filtered code + purge synthetic DB rows + rebuild + retarget nginx) -
f8954802026-07-22 HARD RULE: demo/synthetic inventory NEVER surfaces live — isDemo:false filter on search + all consumer queries, isDemo 404-guards on detail pages, banner drops demo language (real builder data only) -
5c857692026-07-22 resilience: live adapters skip per-URL fetch failures (404/blip) instead of aborting the whole sweep — a single stale Lennar /promo/ URL killed a 4.4k-page run after 15,974 homes -
e8366c42026-07-22 auto-save: 2026-07-22T13:14:23 (1 files) — ROLLBACK-DNS.txt -
6e35e392026-07-22 fix: relative import for parse-search (the @/ alias mis-resolved against inherited baseUrl under next build — never caught because prod build was never run locally) -
013b8282026-07-22 yolo: harden go-live scripts per contrarian (self-signed origin TLS + CF Full, admin origin-only, default_server preflight, rollback capture) -
030753f2026-07-22 go-live scripts (Kamatera deploy + CF/GoDaddy cutover), gitignored (contain infra topology); pm2 env hardening -
30af0842026-07-22 go-live: Kamatera deploy script; start scripts respect PORT env; national-builder recon recorded (batches 3-4); dream-finders adapter -
0e090e42026-07-22 auto-save: 2026-07-22T12:13:58 (1 files) — collectors/dream-finders/ -
4ba331c2026-07-22 source runbooks for toll-brothers + lennar live adapters -
45f9ee22026-07-22 lennar live adapter (172 real homes from 8 pages, Apollo state extraction), streaming runPipeline for large sweeps, honest early-preview banner -
f0e81ad2026-07-22 top-30 builder registry + recon findings recorded; toll-brothers live adapter: 337 real communities ingested via sitemap-sanctioned feed, full evidence trail; positioning update (no one-stop place) -
14131612026-07-22 polite LiveFetcher (rate-limited, never circumvents blocks) + top-10 national builder registry seed (sources PAUSED until recon + activation) -
4dce3d22026-07-22 pm2 ecosystem config, 9 ADRs, data-rights policy, source runbook template, README -
0ba88222026-07-22 integration tests (pipeline e2e, only-writer invariant, review-approve flow) + 7 Playwright e2e specs, all green -
73a5db32026-07-22 generalize pipeline: hints column on StagedRecord, publisher resolves builder/community from hints, label derives from collection method, live/fixture mode from registry -
7c746cc2026-07-22 fix Leaflet SSR: keep MapView out of the shared-ui barrel, subpath dynamic import -
6b477e62026-07-22 consumer web app (search/detail/community/builder/contact) + admin app (review/sources/validation/snapshots) + publisher package extraction; both apps serving -
75e00bb2026-07-22 worker pipeline (fetch/extract/validate/publish) + CLI + synthetic seed; fixture pipeline e2e green, idempotent re-run, dup rule scoped to zip -
1e9a0232026-07-22 collector adapter contract + meridian-homes fixture adapter with hand-authored extraction contracts (7 tests green, null-never-guessed proven) -
d6358032026-07-22 shared utilities (canonicalKey/geo/queue) + zod schemas + validation engine with 10 rules, 31 unit tests green -
1aad19c2026-07-22 initial scaffold: pnpm monorepo, Prisma schema (published + raw pipeline sides), migrations applied
Authors
- Steve104
Agents used
- secrets-manager1
Skills used
- /lon5
- /workers4
- /builder4
- /community4
- /ingestion3
- /app3
- /search3
- /route2
- /baths2
- /stories2
- /garage2
- /discovery2
- /index2
- /build-loop2
- /price2
- /beds2
- /status2
- /sterling2
- /package2
- /builders2
- /phone2
- /state2
- /web2
- /map2
- /accent2
- /crank1
- /belt1
- /ingestion-stats1
- /geocode-census1
- /garages1
Creative ideas + design notes
de505ba · 2026-07-28 · feat: LA all-permit ingest + Census permit geocoder + searchable permit viewer
- ingest-permits.py: LA (LADBS, ALL types commercial+residential, ~539k) + per-city cap - geocode-permits.sh: free Census batch geocoder for building_permits (94% hit on LA) - permit-viewer.mjs: zero-dep searchable map viewer over building_permits (:9977)
9075f7b · 2026-07-28 · feat: construction-pipeline layer — building-permit ingestion + Census geocoder
New leading-indicator layer: ingest new-residential building permits from free, no-key city open-data APIs (Socrata) into building_permits — homes visible at the permit stage, months before they list. SF + Seattle live (5.3k permits, geocoded, current). Plus scripts/geocode-census.sh (free Census batch geocoder to backfill home coords). $0, West Coast first. Next metros: LA/Sacramento/San Jose/Portland/Phoenix/Vegas.
168b21d · 2026-07-28 · build-loop: West Coast first + deeper per-state cap (CAP=120)
Reorder sweep to lead with CA/OR/WA/NV/AZ/ID/HI, then the rest by volume; raise per-(adapter,state) community cap 40->120 so California actually fills in.
53b1804 · 2026-07-28 · collectors: add Ashton Woods adapter (national; JSON-LD QMI, per-home geo)
Next national plain-fetch target off the backlog after David Weekley (eacead2). Ashton Woods publishes per-metro *-sitemap-qmi.xml files; each QMI page is fully server-rendered with a clean JSON-LD SingleFamilyResidence + Product/Offer pair (address, Floorsize, AmenityFeature beds/baths/stories/garage, geo lat/lon, sales phone, price, availability). robots allows the metro QMI pages. One page == one inventory_home + community; baths = full + half*0.5; coord() preserves negative US longitudes (same bug class caught in Discovery overnight). Facts-only, mediaRights=NONE. Env: ASHTONWOODS_METRO, ASHTONWOODS_PAGE_LIMIT. Live-verified read-only across TX/AZ (3 homes, 0 errors, full facts incl. geo). 6/6 vitest + adapter/workers typecheck green. Registered in workers CLI. Activation + deploy + ingest stays GATED (go-live). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40750c0 · 2026-07-28 · fix: david-weekley stories/garages must be integer (1.5-story home 400'd the Houston page)
Round stories+garages at emission — schema wants int; num() returned a float for a 1.5-story home, rejecting the whole Houston homes-ready-soon page.
b319e2f · 2026-07-28 · TK-10: add finish-tk10.sh turnkey go-live driver
Gates on GoDaddy->Cloudflare NS propagation (exits with the DO-THIS-ONE-THING card if not swapped), then runs the CF-API cutover half + Kamatera deploy + apex/admin smoke test, and prints (does not run) the old-GoDaddy-key revocation step. Secret-free; reads creds from secrets-manager at runtime like cutover-dns.sh. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
eacead2 · 2026-07-27 · collectors: add David Weekley adapter (national; server-rendered homes-ready-soon)
Plain-fetch HTML_PARSE adapter over davidweekleyhomes.com per-metro homes-ready-soon list pages (robots-clean, no browser). Parses per-home QMI showcase cards: address/price/beds/baths/sqft/stories/garage/status/ plan/jobNumber. Live-verified 3 TX pages -> 284 inventory_home recs, 0 err; fixture parse matches source exactly. 6/6 vitest + typecheck green. Registered in workers cli. Env: DAVIDWEEKLEY_STATE, DAVIDWEEKLEY_PAGE_LIMIT. Facts-only (mediaRights=NONE). BUILDERS.md: also re-verdicts Highland as BOT-WALLED (CF challenge blocks Algolia search; Insights key can't reach index). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8550e53 · 2026-07-27 · recon: classify 8 regional builders' plain-fetch inventory feasibility
Evidence-backed pass over registered 'adapter pending' regionals. Findings mirrored into SourceRegistry.notes. Highland Homes is the best next adapter (open robots + large inventory; needs one browser-trace of its AJAX endpoint). Most regionals render inventory client-side — plain-fetch adapters are the exception; SPA/XHR builders share one next-step (capture the inventory XHR). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
444eee6 · 2026-07-27 · collectors: add Discovery Homes adapter (first regional; Seeno-family feed)
discoveryhomes.com JSON API (/api/communities + a single site-wide /api/homes). Joins each home card to its community by href-slug in fetch(), emits a normalized page so extract() stays pure. Onboards 4 Seeno-family brands from one feed (discovery/seeno/jmc/sterling). Facts-only (images omitted), robots-enforced, sold/unpriced skipped. Fixed a location-mislabel bug (community_id param is ignored by the server; derive location from the home's own href+address). Live: discovery 14 homes + sterling 3, +109 communities. Registered seeno/sterling builders.
fbd5fc6 · 2026-07-27 · workers: register 29 Pacific-region regional builders as onboarding targets
Inactive Builder + SourceRegistry rows (CRAWL, mediaRights=NONE, active=false, health=PAUSED) for CA/AZ/WA/OR/NV/HI regionals (Trumark, New Home Co, Fulton, Holt, Pahlisch, Castle & Cooke, etc.) with verified websites. Tracked 'coming soon' targets; no crawl until bespoke adapters are built (Loop B backlog).
48110bc · 2026-07-27 · scripts: all-night autonomous build-loop (ingest x states + enrichment sweeps)
Deterministic overnight driver: activates the 4 working adapters + dr-horton, sweeps CA/TX/FL/AZ/NV/CO/GA/NC/SC/TN/WA/UT (op-40 each), drains public-records enrichment, repeats freshness sweeps (max 6, ~2.5h apart) until tmp/BUILD-LOOP-STOP. Facts-only, robots-enforced, LOCAL DB only; public go-live stays gated. Idempotent re-sweeps.
8dda332 · 2026-07-27 · workers: public-records nearby-enrichment stage (NCES schools + OSM places)
Attaches objective nearby facts to communities from PUBLIC RECORDS instead of builders' robots-disallowed nearby-schools/amenities pages: NCES CCD schools (via Urban Institute API; no ratings -> Fair-Housing safe) + OpenStreetMap places (ODbL, attributed). Keyed on Community.lat/lon, persisted to Community.amenities with per-source provenance. Idempotent, op-N batched, $0. Verified on 40 real Lennar/Toll communities (schools 100%, OSM places 25/35 with graceful fallback).
7677fe3 · 2026-07-27 · collectors: enforce robots.txt in LiveFetcher (POLICY compliance)
Adds a robots.txt parser + longest-match Allow/Disallow matcher (with */$ wildcards) and a per-origin cache to LiveFetcher, throwing DisallowedError on blocked paths. Closes the gap where POLICY.md claimed robots compliance but the fetcher only did UA+rate-limit+stop-on-403/429. Verified: 13/13 matcher unit cases, typecheck clean, kb-home + lennar paths regression-clean (no false blocks).
ff7f593 · 2026-07-27 · Scrub non-owned domain spechomes.com -> homesonspec.com (Layer 1)
'spechomes.com' is not ours (rebranded to homesonspec.com). Removed the last domain refs: the outbound collector bot User-Agent (was advertising SpecHomesBot + spechomes.com + data@spechomes.com to every scraped site) and the nginx vhost filename in cert-homesonspec.sh. Left 'spechomes.compare' localStorage key + all structural 'spechomes' names (dir/pm2/DB/pkg) for the Layer-2 coordinated migration. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1c821fb · 2026-07-27 · chore(TK-10): finalize secret scrub — gitignore ROLLBACK-DNS.txt, env-based admin test cred
History rewritten via git filter-repo --replace-text (GoDaddy sso-key + admin default removed from all 70 commits). This commit stops the rollback file from re-entering git and removes the last hardcoded test credential. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
89f29a3 · 2026-07-27 · admin: fail-closed auth + generated prod password (TK-10 security #2, partial)
- middleware: remove hardcoded 'admin:DWSecure2024!' fallback; deny all when BASIC_AUTH is unset/malformed (fail closed). First-colon split on BOTH the configured value and the incoming credential (symmetric; ':' allowed in pw). - deploy-kamatera: generate a random BASIC_AUTH into the gitignored .env.kamatera (mirrors the SPECHOMES_DB_PW pattern) instead of writing a committed default. - .env.example: placeholder, not a real credential. Verified: admin typecheck+build clean; gate 401(no-auth)/200(correct)/401(wrong). NOT fully resolved (Steve/gated): the string still exists in tests/end-to-end/ admin.spec.ts AND git history — needs the same rotate+filter-repo scrub as the GoDaddy key (TK-10 blocker A). Existing prod boxes rotate on next deploy-kamatera. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ef45303 · 2026-07-27 · web: honest Lennar-anchored positioning (TK-10 blocker C)
- hero stat leads with homes+metros; shows builder count only when >1, else 'more builders coming' (no '1 builder' under 'Every builder') - builder count now counts only builders with live published inventory - builder photos default OFF (BUILDER_IMAGES_ENABLED=1 to opt in) on BOTH homepage and home-detail — media-rights safe per docs/data-rights/POLICY.md - drop over-claims from root + /builders meta descriptions (no 'across the United States' / 'national, regional, and local') Verified: web build compiles clean; renders '...27 metros · more builders coming', no builder <img>, home detail 200. Gated go-live still blocked on TK-10 A (leaked GoDaddy key) + B (committed admin default). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6612fe5 · 2026-07-23 · fix(dr-horton,tri-pointe): use real parsed state instead of hardcoded CA
Same class of bug as the Pulte fix: both adapters PARSED the true state
(DRH parseCityStateZip → geo.state; TriPointe state_alpha_2_code) then
discarded it and wrote fv("CA" as const, …). On the national drain this
mislabeled every TX/FL/etc. home as California — corrupting search-by-state.
Now the parsed 2-letter code becomes the published value. state is not in
canonicalKey, so a re-drain UPDATES existing rows in place (no dupes).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
55372bc · 2026-07-23 · fix(pulte): use real state code instead of hardcoded CA (enables multi-state)
The community + home state value was pinned to 'CA' while raw evidence held the true stateAbbreviation — a silent data-integrity bug that would mislabel every non-CA home as California on a multi-state drain. Now normalizes stateAbbreviation (or the PULTE_STATE full-name fallback) to the real 2-letter code. Prereq for the authorized national expansion. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86433ff · 2026-07-23 · feat(collectors): add Taylor Morrison adapter (Sitecore fedmodel, CA)
Two-level sitemap → per-community /available-homes. Scans all 13 fedmodel blocks for the one carrying availableHomesList (first is a browser-warning decoy), walks sections[].homes[]. Normalizes California→CA, M/D/YYYY→ISO, JSON-LD telephone, photo.Src → images. Verified against live fixture: 3 records, 0 errors, all fields correct. Builder+source rows already seeded. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
08c6d17 · 2026-07-23 · fix(collectors): raise DRH+Lennar default PAGE_LIMIT 8→300 for statewide coverage
The 8-page default stranded >96% of inventory: there is no cursor to advance past the sorted head, so successive runs re-hit the same 8 communities forever. DRH's CA sitemap alone has 226 communities. 300 covers a whole state per run; contentHash dedup keeps unchanged communities cheap on recurring cron passes. Matches Pulte/TriPointe (200). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aa61dfd · 2026-07-23 · fix(live-fetch): broaden Accept header so D.R. Horton WAF stops 406ing
Narrow 'text/html,application/json' failed DRH's strict content negotiation (406 Not Acceptable) from the datacenter IP. Added the standard */*;q=0.8 fallback (kept the honest SpecHomesBot UA — no browser spoofing). */* still covers Pulte's JSON API + XML sitemaps. Fixes DRH = 0 published; helps every adapter through the one choke-point. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
File tree
- .env.example
- .gitignore
- README.md
- apps/admin/next-env.d.ts
- apps/admin/next.config.ts
- apps/admin/package.json
- apps/admin/postcss.config.mjs
- apps/admin/src/app/api/ingestion-stats/route.ts
- apps/admin/src/app/api/review/route.ts
- apps/admin/src/app/corrections/page.tsx
- apps/admin/src/app/globals.css
- apps/admin/src/app/ingestion/IngestionLive.tsx
- apps/admin/src/app/ingestion/page.tsx
- apps/admin/src/app/layout.tsx
- apps/admin/src/app/leads/page.tsx
- apps/admin/src/app/page.tsx
- apps/admin/src/app/review/ReviewActions.tsx
- apps/admin/src/app/review/page.tsx
- apps/admin/src/app/snapshots/page.tsx
- apps/admin/src/app/sources/page.tsx
- apps/admin/src/app/validation/page.tsx
- apps/admin/src/middleware.ts
- apps/admin/tsconfig.json
- apps/web/next-env.d.ts
- apps/web/next.config.ts
- apps/web/package.json
- apps/web/postcss.config.mjs
- apps/web/src/app/HeroMap.tsx
- apps/web/src/app/[state]/[city]/page.tsx
- apps/web/src/app/api/corrections/route.ts
- apps/web/src/app/api/facets/route.ts
- apps/web/src/app/api/leads/route.ts
- apps/web/src/app/api/map/route.ts
- apps/web/src/app/api/search/route.ts
- apps/web/src/app/builders/[slug]/page.tsx
- apps/web/src/app/builders/page.tsx
- apps/web/src/app/communities/[slug]/page.tsx
- apps/web/src/app/compare/page.tsx
- apps/web/src/app/contact/ContactClient.tsx
- apps/web/src/app/contact/page.tsx
- apps/web/src/app/globals.css
- apps/web/src/app/homes/[id]/CorrectionForm.tsx
- apps/web/src/app/homes/[id]/LeadForm.tsx
- apps/web/src/app/homes/[id]/page.tsx
- apps/web/src/app/layout.tsx
- apps/web/src/app/map/MapCanvas.tsx
- apps/web/src/app/map/MapExplorer.tsx
- apps/web/src/app/map/page.tsx
- apps/web/src/app/page.tsx
- apps/web/src/app/plans/[id]/page.tsx
- apps/web/src/app/saved/page.tsx
- apps/web/src/app/search/SearchClient.tsx
- apps/web/src/app/search/page.tsx
- apps/web/src/lib/parse-search.ts
- apps/web/tsconfig.json
- apps/workers/package.json
- apps/workers/scripts/enrich-nearby.ts
- apps/workers/scripts/register-pacific-regionals.ts
- apps/workers/src/cli.ts
- apps/workers/src/index.ts
- apps/workers/src/pipeline.itest.ts
- apps/workers/src/pipeline.ts
- apps/workers/src/verify-cli.ts
- apps/workers/src/verify.test.ts
- apps/workers/src/verify.ts
- apps/workers/tsconfig.json
- apps/workers/vitest.integration.config.ts
- apps/workers/vitest.integration.setup.ts
- cert-homesonspec.sh
- collectors/BUILDERS.md
- collectors/ashton-woods/fixtures/austin-321-possumhaw-lane.html
- collectors/ashton-woods/package.json
- collectors/ashton-woods/src/index.test.ts
- collectors/ashton-woods/src/index.ts
- collectors/ashton-woods/tsconfig.json
- collectors/common/package.json
- collectors/common/src/adapter.ts
- collectors/common/src/index.ts
- collectors/common/src/live-fetch.ts
- collectors/common/src/robots.selftest.ts
- collectors/common/tsconfig.json
- collectors/david-weekley/fixtures/dfw-homes-ready-soon.html
- collectors/david-weekley/package.json
- collectors/david-weekley/src/index.test.ts
- collectors/david-weekley/src/index.ts
- collectors/david-weekley/tsconfig.json
- collectors/discovery/package.json
- collectors/discovery/src/index.ts
- collectors/discovery/tsconfig.json
- collectors/dr-horton/package.json
- collectors/dr-horton/src/index.ts
- collectors/dr-horton/tsconfig.json
- collectors/dream-finders/package.json
- collectors/dream-finders/src/index.ts
- collectors/dream-finders/tsconfig.json
- collectors/kb-home/package.json
- collectors/kb-home/src/index.ts
- collectors/kb-home/tsconfig.json
- collectors/lennar/package.json
- collectors/lennar/src/index.ts
- collectors/lennar/tsconfig.json
- collectors/meridian-homes/package.json
- collectors/meridian-homes/src/extract.test.ts
- collectors/meridian-homes/src/index.ts
- collectors/meridian-homes/tsconfig.json
- collectors/pulte/package.json
- collectors/pulte/src/index.ts
- collectors/pulte/tsconfig.json
- collectors/taylor-morrison/package.json
- collectors/taylor-morrison/src/index.ts
- collectors/taylor-morrison/tsconfig.json
- collectors/toll-brothers/package.json
- collectors/toll-brothers/src/index.ts
- collectors/toll-brothers/tsconfig.json
- collectors/tri-pointe/package.json
- collectors/tri-pointe/src/index.ts
- collectors/tri-pointe/tsconfig.json
- deploy-full.sh
- deploy-heromap.sh
- deploy-kamatera.sh
- deploy-web.sh
- design-system/README.md
- design-system/components/badges/index.html
- design-system/components/buttons/index.html
- design-system/components/home-card/index.html
- design-system/components/map-legend/index.html
- design-system/tokens.html
- docs/architecture/ADRS.md
- docs/data-rights/POLICY.md
- docs/product/POSITIONING.md
- docs/source-runbooks/lennar.md
- docs/source-runbooks/meridian-homes.md
- docs/source-runbooks/toll-brothers.md
- ecosystem.config.js
- finish-tk10.sh
- fixtures/expected-records/meridian-homes.json
- fixtures/raw-pages/meridian-homes/01-community-cedar-bend.html
- fixtures/raw-pages/meridian-homes/02-home-118-juniper.html
- fixtures/raw-pages/meridian-homes/03-home-124-silverleaf.html
- fixtures/raw-pages/meridian-homes/04-home-131-brackens.html
- fixtures/raw-pages/meridian-homes/05-incentives.html
- package.json
- packages/database/package.json
- packages/database/prisma/migrations/20260722181638_init/migration.sql
- packages/database/prisma/migrations/20260722181700_trgm_search_index/migration.sql
- packages/database/prisma/migrations/20260722183952_staged_hints/migration.sql
- packages/database/prisma/migrations/20260723003309_stage3_verification_engine/migration.sql
- packages/database/prisma/migrations/20260723012950_home_images/migration.sql
- packages/database/prisma/migrations/20260723030000_stagedrecord_unique_idempotent/migration.sql
- packages/database/prisma/migrations/20260723040000_community_sales_phone/migration.sql
- packages/database/prisma/migrations/migration_lock.toml
- packages/database/prisma/schema.prisma
- packages/database/prisma/seed-national-builders.ts
- packages/database/prisma/seed.ts
- packages/database/src/index.ts
- packages/database/tsconfig.json
- packages/publisher/package.json
- packages/publisher/src/index.ts
- packages/publisher/tsconfig.json
- packages/schemas/package.json
- packages/schemas/src/index.ts
- packages/schemas/tsconfig.json
- packages/search/package.json
- packages/search/src/index.ts
- packages/search/tsconfig.json
- packages/shared-ui/package.json
- packages/shared-ui/src/MapView.tsx
- packages/shared-ui/src/badges.tsx
- packages/shared-ui/src/index.ts
- packages/shared-ui/tsconfig.json
- packages/shared/package.json
- packages/shared/src/canonical.test.ts
- packages/shared/src/canonical.ts
- packages/shared/src/geo.test.ts
- packages/shared/src/geo.ts
- packages/shared/src/index.ts
- packages/shared/src/queue.ts
- packages/shared/tsconfig.json
- packages/source-registry/package.json
- packages/source-registry/src/index.ts
- packages/source-registry/tsconfig.json
- packages/validation/package.json
- packages/validation/src/engine.ts
- packages/validation/src/index.ts
- packages/validation/src/rules.test.ts
- packages/validation/src/rules.ts
- packages/validation/src/types.ts
- packages/validation/tsconfig.json
- playwright.config.ts
- pnpm-lock.yaml
- pnpm-workspace.yaml
- retarget-domain.sh
- scripts/build-loop.sh
- scripts/engine-dashboard.mjs
- scripts/geocode-census.sh
- scripts/geocode-permits.sh
- scripts/ingest-permits.py
- scripts/permit-viewer.mjs
- tests/end-to-end/admin.spec.ts
- tests/end-to-end/consumer.spec.ts
- tsconfig.base.json