{"slug":"homesonspec","total":111,"limit":100,"offset":0,"since":null,"commits":[{"hash":"de3e088","date":"2026-07-28 09:45:53 -0700","author":"Steve Abrams","subject":"build-loop: throttle Toll (communities-only) to every 8th sweep — DTD 4/5 (Lennar stays full-rate)","body":""},{"hash":"b9c9bbc","date":"2026-07-28 09:36:08 -0700","author":"Steve Abrams","subject":"build-loop: add Lennar (state-iterating) + Toll Brothers (national) to ingestion rotation — keep ingesting","body":""},{"hash":"8873056","date":"2026-07-28 09:29:28 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-28T09:29:05 (1 files) — apps/workers/var/","body":""},{"hash":"04910e0","date":"2026-07-28 09:24:28 -0700","author":"Steve Abrams","subject":"admin/ingestion: LEFT JOIN active sources — surface stale/absent sources (Cody-gated: silent-source blind spot)","body":""},{"hash":"80fb677","date":"2026-07-28 09:21:18 -0700","author":"Steve","subject":"feat: HomesOnSpec data-feed API (:9799) — share the development pipeline with RENTV/partners","body":"Read-only CORS JSON feed over homes + building_permits: /feed/permits (sector/geo/value/\ndate filters), /feed/homes, /feed/developments (CRE pipeline by city, e.g. LA $17.4B),\n/feed/summary. Source for RENTV commercial-real-estate content + usrealestate."},{"hash":"847b94d","date":"2026-07-28 09:18:04 -0700","author":"Steve Abrams","subject":"admin/ingestion: honest error signal — surface per-record homes dropped (per-source), not just failed-run %","body":""},{"hash":"5aea788","date":"2026-07-28 09:16:47 -0700","author":"Steve","subject":"engine: per-stream liveness — each cylinder fires only when its data stream is moving live (idle streams go dark; RPM=0 when nothing flows)","body":""},{"hash":"7080744","date":"2026-07-28 09:03:25 -0700","author":"Steve","subject":"feat: live V8 'engine room' dashboard (:9798) — pistons/crank/belt driven by real DB throughput","body":""},{"hash":"c9a3fdf","date":"2026-07-28 09:00:53 -0700","author":"Steve Abrams","subject":"admin/ingestion: guard sparkline last-value (TS strict index)","body":""},{"hash":"557ae65","date":"2026-07-28 08:59:24 -0700","author":"Steve Abrams","subject":"admin/ingestion: live sparkline + new-vs-refreshed + error rate + per-source health table","body":""},{"hash":"d44d527","date":"2026-07-28 08:59:01 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-28T08:58:52 (1 files) — apps/admin/src/app/api/ingestion-stats/route.ts","body":""},{"hash":"3cac9a3","date":"2026-07-28 08:51:18 -0700","author":"Steve Abrams","subject":"deploy-kamatera: :80 acme block covers admin.homesonspec.com for renewals","body":""},{"hash":"5064112","date":"2026-07-28 08:50:53 -0700","author":"Steve Abrams","subject":"deploy-kamatera: admin block uses LE cert (admin now in cert SANs)","body":""},{"hash":"de505ba","date":"2026-07-28 08:24:17 -0700","author":"Steve","subject":"feat: LA all-permit ingest + Census permit geocoder + searchable permit viewer","body":"- ingest-permits.py: LA (LADBS, ALL types commercial+residential, ~539k) + per-city cap\n- geocode-permits.sh: free Census batch geocoder for building_permits (94% hit on LA)\n- permit-viewer.mjs: zero-dep searchable map viewer over building_permits (:9977)"},{"hash":"b0103f2","date":"2026-07-28 08:14:45 -0700","author":"Steve Abrams","subject":"admin: live ingestion dashboard (/ingestion) — auto-refreshing throughput from Kamatera DB","body":""},{"hash":"db9700f","date":"2026-07-28 08:01:13 -0700","author":"Steve Abrams","subject":"build-loop: source repo .env for DATABASE_URL (fixes PrismaClientInitializationError on Kamatera)","body":""},{"hash":"9075f7b","date":"2026-07-28 07:55:03 -0700","author":"Steve","subject":"feat: construction-pipeline layer — building-permit ingestion + Census geocoder","body":"New leading-indicator layer: ingest new-residential building permits from free,\nno-key city open-data APIs (Socrata) into building_permits — homes visible at the\npermit stage, months before they list. SF + Seattle live (5.3k permits, geocoded,\ncurrent). Plus scripts/geocode-census.sh (free Census batch geocoder to backfill\nhome coords). $0, West Coast first. Next metros: LA/Sacramento/San Jose/Portland/Phoenix/Vegas."},{"hash":"89a47a0","date":"2026-07-28 07:52:36 -0700","author":"Steve Abrams","subject":"build-loop: honor injected DATABASE_URL (portable to Kamatera cron)","body":""},{"hash":"be37128","date":"2026-07-28 07:42:59 -0700","author":"Steve Abrams","subject":"deploy-kamatera: rewrite for homesonspec self-host (correct naming, explicit PORT, pgboss grants, LE-cert vhost)","body":""},{"hash":"e118a5b","date":"2026-07-28 07:26:16 -0700","author":"Steve","subject":"build-loop: max-it — fan out 4 adapters in parallel (per-domain), 30rpm, bigger enrich batches","body":""},{"hash":"168b21d","date":"2026-07-28 07:16:23 -0700","author":"Steve","subject":"build-loop: West Coast first + deeper per-state cap (CAP=120)","body":"Reorder sweep to lead with CA/OR/WA/NV/AZ/ID/HI, then the rest by volume; raise\nper-(adapter,state) community cap 40->120 so California actually fills in."},{"hash":"53b1804","date":"2026-07-28 07:13:46 -0700","author":"Steve Abrams","subject":"collectors: add Ashton Woods adapter (national; JSON-LD QMI, per-home geo)","body":"Next national plain-fetch target off the backlog after David Weekley (eacead2).\nAshton Woods publishes per-metro *-sitemap-qmi.xml files; each QMI page is fully\nserver-rendered with a clean JSON-LD SingleFamilyResidence + Product/Offer pair\n(address, Floorsize, AmenityFeature beds/baths/stories/garage, geo lat/lon, sales\nphone, price, availability). robots allows the metro QMI pages. One page == one\ninventory_home + community; baths = full + half*0.5; coord() preserves negative\nUS longitudes (same bug class caught in Discovery overnight). Facts-only,\nmediaRights=NONE. Env: ASHTONWOODS_METRO, ASHTONWOODS_PAGE_LIMIT.\n\nLive-verified read-only across TX/AZ (3 homes, 0 errors, full facts incl. geo).\n6/6 vitest + adapter/workers typecheck green. Registered in workers CLI.\nActivation + deploy + ingest stays GATED (go-live).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"da8824a","date":"2026-07-28 07:10:21 -0700","author":"Steve","subject":"build-loop: go nationwide — sweep 42 top homebuilding states (all-50 name map)","body":""},{"hash":"40750c0","date":"2026-07-28 07:05:15 -0700","author":"Steve","subject":"fix: david-weekley stories/garages must be integer (1.5-story home 400'd the Houston page)","body":"Round stories+garages at emission — schema wants int; num() returned a float for\na 1.5-story home, rejecting the whole Houston homes-ready-soon page."},{"hash":"b319e2f","date":"2026-07-28 06:58:44 -0700","author":"Steve Abrams","subject":"TK-10: add finish-tk10.sh turnkey go-live driver","body":"Gates on GoDaddy->Cloudflare NS propagation (exits with the DO-THIS-ONE-THING\ncard if not swapped), then runs the CF-API cutover half + Kamatera deploy +\napex/admin smoke test, and prints (does not run) the old-GoDaddy-key revocation\nstep. Secret-free; reads creds from secrets-manager at runtime like cutover-dns.sh.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"887b38f","date":"2026-07-28 06:58:13 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-28T06:58:06 (2 files) — collectors/discovery/src/index.ts scripts/build-loop.sh","body":""},{"hash":"eacead2","date":"2026-07-27 21:53:02 -0700","author":"Steve Abrams","subject":"collectors: add David Weekley adapter (national; server-rendered homes-ready-soon)","body":"Plain-fetch HTML_PARSE adapter over davidweekleyhomes.com per-metro\nhomes-ready-soon list pages (robots-clean, no browser). Parses per-home\nQMI showcase cards: address/price/beds/baths/sqft/stories/garage/status/\nplan/jobNumber. Live-verified 3 TX pages -> 284 inventory_home recs, 0 err;\nfixture parse matches source exactly. 6/6 vitest + typecheck green.\nRegistered in workers cli. Env: DAVIDWEEKLEY_STATE, DAVIDWEEKLEY_PAGE_LIMIT.\nFacts-only (mediaRights=NONE). BUILDERS.md: also re-verdicts Highland as\nBOT-WALLED (CF challenge blocks Algolia search; Insights key can't reach index).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8550e53","date":"2026-07-27 21:38:11 -0700","author":"Steve Abrams","subject":"recon: classify 8 regional builders' plain-fetch inventory feasibility","body":"Evidence-backed pass over registered 'adapter pending' regionals. Findings\nmirrored into SourceRegistry.notes. Highland Homes is the best next adapter\n(open robots + large inventory; needs one browser-trace of its AJAX endpoint).\nMost regionals render inventory client-side — plain-fetch adapters are the\nexception; SPA/XHR builders share one next-step (capture the inventory XHR).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"444eee6","date":"2026-07-27 20:58:29 -0700","author":"Steve","subject":"collectors: add Discovery Homes adapter (first regional; Seeno-family feed)","body":"discoveryhomes.com JSON API (/api/communities + a single site-wide /api/homes).\nJoins each home card to its community by href-slug in fetch(), emits a normalized\npage so extract() stays pure. Onboards 4 Seeno-family brands from one feed\n(discovery/seeno/jmc/sterling). Facts-only (images omitted), robots-enforced,\nsold/unpriced skipped. Fixed a location-mislabel bug (community_id param is\nignored by the server; derive location from the home's own href+address). Live:\ndiscovery 14 homes + sterling 3, +109 communities. Registered seeno/sterling builders."},{"hash":"c612735","date":"2026-07-27 20:54:41 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T20:54:34 (4 files) — apps/workers/package.json apps/workers/src/cli.ts pnpm-lock.yaml collectors/discovery/","body":""},{"hash":"fbd5fc6","date":"2026-07-27 20:39:02 -0700","author":"Steve","subject":"workers: register 29 Pacific-region regional builders as onboarding targets","body":"Inactive Builder + SourceRegistry rows (CRAWL, mediaRights=NONE, active=false,\nhealth=PAUSED) for CA/AZ/WA/OR/NV/HI regionals (Trumark, New Home Co, Fulton,\nHolt, Pahlisch, Castle & Cooke, etc.) with verified websites. Tracked 'coming\nsoon' targets; no crawl until bespoke adapters are built (Loop B backlog)."},{"hash":"76c1d27","date":"2026-07-27 20:24:30 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T20:24:23 (1 files) — scripts/build-loop.sh","body":""},{"hash":"48110bc","date":"2026-07-27 20:23:38 -0700","author":"Steve","subject":"scripts: all-night autonomous build-loop (ingest x states + enrichment sweeps)","body":"Deterministic overnight driver: activates the 4 working adapters + dr-horton, sweeps\nCA/TX/FL/AZ/NV/CO/GA/NC/SC/TN/WA/UT (op-40 each), drains public-records enrichment,\nrepeats freshness sweeps (max 6, ~2.5h apart) until tmp/BUILD-LOOP-STOP. Facts-only,\nrobots-enforced, LOCAL DB only; public go-live stays gated. Idempotent re-sweeps."},{"hash":"8dda332","date":"2026-07-27 20:15:04 -0700","author":"Steve","subject":"workers: public-records nearby-enrichment stage (NCES schools + OSM places)","body":"Attaches objective nearby facts to communities from PUBLIC RECORDS instead of\nbuilders' robots-disallowed nearby-schools/amenities pages: NCES CCD schools\n(via Urban Institute API; no ratings -> Fair-Housing safe) + OpenStreetMap places\n(ODbL, attributed). Keyed on Community.lat/lon, persisted to Community.amenities\nwith per-source provenance. Idempotent, op-N batched, $0. Verified on 40 real\nLennar/Toll communities (schools 100%, OSM places 25/35 with graceful fallback)."},{"hash":"7677fe3","date":"2026-07-27 19:56:04 -0700","author":"Steve","subject":"collectors: enforce robots.txt in LiveFetcher (POLICY compliance)","body":"Adds a robots.txt parser + longest-match Allow/Disallow matcher (with */$ wildcards)\nand a per-origin cache to LiveFetcher, throwing DisallowedError on blocked paths.\nCloses the gap where POLICY.md claimed robots compliance but the fetcher only did\nUA+rate-limit+stop-on-403/429. Verified: 13/13 matcher unit cases, typecheck clean,\nkb-home + lennar paths regression-clean (no false blocks)."},{"hash":"7782f9c","date":"2026-07-27 19:54:19 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T19:54:12 (1 files) — collectors/common/src/live-fetch.ts","body":""},{"hash":"ce2edb5","date":"2026-07-27 19:15:21 -0700","author":"Steve Abrams","subject":"chore: v0.3.1 (session close — spechomes→homesonspec rename)","body":""},{"hash":"63efe78","date":"2026-07-27 18:53:18 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"ff7f593","date":"2026-07-27 18:46:38 -0700","author":"Steve Abrams","subject":"Scrub non-owned domain spechomes.com -> homesonspec.com (Layer 1)","body":"'spechomes.com' is not ours (rebranded to homesonspec.com). Removed the last domain\nrefs: the outbound collector bot User-Agent (was advertising SpecHomesBot + spechomes.com\n+ data@spechomes.com to every scraped site) and the nginx vhost filename in cert-homesonspec.sh.\nLeft 'spechomes.compare' localStorage key + all structural 'spechomes' names (dir/pm2/DB/pkg)\nfor the Layer-2 coordinated migration.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"762fa0e","date":"2026-07-27 17:46:51 -0700","author":"Steve Abrams","subject":"chore: v0.3.0 (session close) — honest positioning, admin fail-closed auth, secret history scrub, typecheck gate green","body":""},{"hash":"1c821fb","date":"2026-07-27 17:24:45 -0700","author":"Steve Abrams","subject":"chore(TK-10): finalize secret scrub — gitignore ROLLBACK-DNS.txt, env-based admin test cred","body":"History rewritten via git filter-repo --replace-text (GoDaddy sso-key + admin\ndefault removed from all 70 commits). This commit stops the rollback file from\nre-entering git and removes the last hardcoded test credential.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"77fbb63","date":"2026-07-27 17:22:30 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T17:22:24 (1 files) — deploy-kamatera.sh","body":""},{"hash":"89f29a3","date":"2026-07-27 17:10:19 -0700","author":"Steve Abrams","subject":"admin: fail-closed auth + generated prod password (TK-10 security #2, partial)","body":"- middleware: remove hardcoded 'admin:DWSecure2024!' fallback; deny all when\n  BASIC_AUTH is unset/malformed (fail closed). First-colon split on BOTH the\n  configured value and the incoming credential (symmetric; ':' allowed in pw).\n- deploy-kamatera: generate a random BASIC_AUTH into the gitignored .env.kamatera\n  (mirrors the SPECHOMES_DB_PW pattern) instead of writing a committed default.\n- .env.example: placeholder, not a real credential.\n\nVerified: admin typecheck+build clean; gate 401(no-auth)/200(correct)/401(wrong).\nNOT fully resolved (Steve/gated): the string still exists in tests/end-to-end/\nadmin.spec.ts AND git history — needs the same rotate+filter-repo scrub as the\nGoDaddy key (TK-10 blocker A). Existing prod boxes rotate on next deploy-kamatera.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"2fa9a7f","date":"2026-07-27 16:52:21 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T16:52:13 (3 files) — apps/workers/src/pipeline.itest.ts collectors/taylor-morrison/tsconfig.json packages/source-registry/src/","body":""},{"hash":"ef45303","date":"2026-07-27 16:41:07 -0700","author":"Steve Abrams","subject":"web: honest Lennar-anchored positioning (TK-10 blocker C)","body":"- hero stat leads with homes+metros; shows builder count only when >1,\n  else 'more builders coming' (no '1 builder' under 'Every builder')\n- builder count now counts only builders with live published inventory\n- builder photos default OFF (BUILDER_IMAGES_ENABLED=1 to opt in) on BOTH\n  homepage and home-detail — media-rights safe per docs/data-rights/POLICY.md\n- drop over-claims from root + /builders meta descriptions\n  (no 'across the United States' / 'national, regional, and local')\n\nVerified: web build compiles clean; renders '...27 metros · more builders\ncoming', no builder <img>, home detail 200. Gated go-live still blocked on\nTK-10 A (leaked GoDaddy key) + B (committed admin default).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"0d87dcd","date":"2026-07-23 13:54:56 -0700","author":"Steve","subject":"chore: v0.2.1 (session close) — spechomes pm2 prod + redeploy scripts","body":""},{"hash":"8f6d3bf","date":"2026-07-23 13:51:51 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-23T13:51:43 (1 files) — pnpm-lock.yaml","body":""},{"hash":"b04f2be","date":"2026-07-23 13:35:53 -0700","author":"Steve Abrams","subject":"add pnpm redeploy scripts (build + pm2 restart) for prod web/admin","body":""},{"hash":"844edb3","date":"2026-07-23 13:33:33 -0700","author":"Steve Abrams","subject":"pm2: boot spechomes-workers via node --env-file so DATABASE_URL loads","body":""},{"hash":"ff4a50f","date":"2026-07-23 08:24:09 -0700","author":"Steve Abrams","subject":"chore: gitignore screenrecord/ test artifacts","body":""},{"hash":"4acc9f1","date":"2026-07-23 08:14:49 -0700","author":"Steve Abrams","subject":"chore: v0.2.0 (session close) — Taylor Morrison adapter + national multi-state state-fixes","body":""},{"hash":"6612fe5","date":"2026-07-23 07:57:29 -0700","author":"Steve Abrams","subject":"fix(dr-horton,tri-pointe): use real parsed state instead of hardcoded CA","body":"Same class of bug as the Pulte fix: both adapters PARSED the true state\n(DRH parseCityStateZip → geo.state; TriPointe state_alpha_2_code) then\ndiscarded it and wrote fv(\"CA\" as const, …). On the national drain this\nmislabeled every TX/FL/etc. home as California — corrupting search-by-state.\nNow the parsed 2-letter code becomes the published value. state is not in\ncanonicalKey, so a re-drain UPDATES existing rows in place (no dupes).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"55372bc","date":"2026-07-23 07:25:54 -0700","author":"Steve Abrams","subject":"fix(pulte): use real state code instead of hardcoded CA (enables multi-state)","body":"The community + home state value was pinned to 'CA' while raw evidence\nheld the true stateAbbreviation — a silent data-integrity bug that would\nmislabel every non-CA home as California on a multi-state drain. Now\nnormalizes stateAbbreviation (or the PULTE_STATE full-name fallback) to\nthe real 2-letter code. Prereq for the authorized national expansion.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ac8dff8","date":"2026-07-23 01:23:42 -0700","author":"Steve Abrams","subject":"docs(collectors): update builder status — 5 live, TM egress-blocked, Meritage needs XHR trace","body":""},{"hash":"2570ea0","date":"2026-07-23 01:14:51 -0700","author":"Steve Abrams","subject":"fix(workers): declare taylor-morrison collector dep so pnpm links it","body":""},{"hash":"86433ff","date":"2026-07-23 01:13:04 -0700","author":"Steve Abrams","subject":"feat(collectors): add Taylor Morrison adapter (Sitecore fedmodel, CA)","body":"Two-level sitemap → per-community /available-homes. Scans all 13 fedmodel\nblocks for the one carrying availableHomesList (first is a browser-warning\ndecoy), walks sections[].homes[]. Normalizes California→CA, M/D/YYYY→ISO,\nJSON-LD telephone, photo.Src → images. Verified against live fixture:\n3 records, 0 errors, all fields correct. Builder+source rows already seeded.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"08c6d17","date":"2026-07-23 01:08:26 -0700","author":"Steve Abrams","subject":"fix(collectors): raise DRH+Lennar default PAGE_LIMIT 8→300 for statewide coverage","body":"The 8-page default stranded >96% of inventory: there is no cursor to\nadvance past the sorted head, so successive runs re-hit the same 8\ncommunities forever. DRH's CA sitemap alone has 226 communities.\n300 covers a whole state per run; contentHash dedup keeps unchanged\ncommunities cheap on recurring cron passes. Matches Pulte/TriPointe (200).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"aa61dfd","date":"2026-07-23 01:04:59 -0700","author":"Steve Abrams","subject":"fix(live-fetch): broaden Accept header so D.R. Horton WAF stops 406ing","body":"Narrow 'text/html,application/json' failed DRH's strict content\nnegotiation (406 Not Acceptable) from the datacenter IP. Added the\nstandard */*;q=0.8 fallback (kept the honest SpecHomesBot UA — no\nbrowser spoofing). */* still covers Pulte's JSON API + XML sitemaps.\nFixes DRH = 0 published; helps every adapter through the one choke-point.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"f66f9ae","date":"2026-07-23 00:52:04 -0700","author":"Steve","subject":"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","body":""},{"hash":"8456a67","date":"2026-07-23 00:16:36 -0700","author":"Steve","subject":"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","body":""},{"hash":"7478696","date":"2026-07-23 00:06:01 -0700","author":"Steve","subject":"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","body":""},{"hash":"ca4ba1d","date":"2026-07-22 23:37:13 -0700","author":"Steve","subject":"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","body":""},{"hash":"65775ba","date":"2026-07-22 23:36:15 -0700","author":"Steve","subject":"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","body":""},{"hash":"d27cab5","date":"2026-07-22 23:34:10 -0700","author":"Steve","subject":"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","body":""},{"hash":"0d7bc77","date":"2026-07-22 23:24:02 -0700","author":"Steve","subject":"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","body":""},{"hash":"c642140","date":"2026-07-22 23:13:59 -0700","author":"Steve","subject":"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)","body":""},{"hash":"ef19ec0","date":"2026-07-22 22:19:24 -0700","author":"Steve","subject":"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","body":""},{"hash":"8231981","date":"2026-07-22 22:14:11 -0700","author":"Steve","subject":"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","body":""},{"hash":"2968a92","date":"2026-07-22 20:58:00 -0700","author":"Steve","subject":"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)","body":""},{"hash":"f5b9111","date":"2026-07-22 20:49:20 -0700","author":"Steve","subject":"Contrarian fixes: StagedRecord unique (source,snapshot,home) + upsert/delete-recreate → FORCE_REEXTRACT idempotent (no raw-row bloat); img loading=lazy + hero fetchPriority","body":""},{"hash":"bda9b29","date":"2026-07-22 20:46:45 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T20:46:37 (1 files) — packages/database/prisma/schema.prisma","body":""},{"hash":"f4b686d","date":"2026-07-22 20:12:13 -0700","author":"Steve","subject":"Featured homes: spread price bands (value ~250-380k / mid ~480-650k / luxury 750k+) so tiers read distinctly","body":""},{"hash":"ba86ab2","date":"2026-07-22 20:10:12 -0700","author":"Steve","subject":"Homepage: 3 featured homes on load — Value / Mid-range / Luxury price tiers, real listings with builder photos","body":""},{"hash":"4be9de7","date":"2026-07-22 19:00:40 -0700","author":"Steve","subject":"deploy-full.sh: also ship collectors + publisher + schemas src (image extractor was silently missing from prod deploys)","body":""},{"hash":"ba895b7","date":"2026-07-22 18:55:10 -0700","author":"Steve","subject":"Pipeline: FORCE_REEXTRACT env to re-extract already-snapshotted pages (backfills new fields like images onto unchanged-source homes) + durable grant note","body":""},{"hash":"13997e3","date":"2026-07-22 18:33:11 -0700","author":"Steve","subject":"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","body":""},{"hash":"77b81eb","date":"2026-07-22 18:19:25 -0700","author":"Steve","subject":"Home detail: branded hero header + status badge, 'more homes in this community' carousel, prominent builder-contact CTA (builders-want-to-sell), full brand reskin","body":""},{"hash":"da530f2","date":"2026-07-22 18:17:00 -0700","author":"Steve","subject":"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","body":""},{"hash":"008a9de","date":"2026-07-22 18:16:01 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"ec6046b","date":"2026-07-22 17:43:04 -0700","author":"Steve","subject":"Contrarian gate fixes: guard auto-pause recovery (manual disable stays down), defense-in-depth freshness!=INACTIVE on search+map, honest design-bundle README","body":""},{"hash":"3cb6635","date":"2026-07-22 17:37:25 -0700","author":"Steve","subject":"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","body":""},{"hash":"832a5c0","date":"2026-07-22 17:31:12 -0700","author":"Steve","subject":"Design system iter-2: reskin /map explorer panel + /search cards & controls from tokens (brand/accent, Fraunces prices, card-interactive)","body":""},{"hash":"8b8126d","date":"2026-07-22 17:29:21 -0700","author":"Steve","subject":"Design system iter-1: Claude Design bundle (tokens + buttons/badges/home-card/map-legend cards w/ @dsCard markers) staged for DesignSync push","body":""},{"hash":"678cf48","date":"2026-07-22 17:27:34 -0700","author":"Steve","subject":"Design system iter-1: @theme token layer (brand/accent/status ramps, Fraunces+Inter, radii/shadows), reskin app shell + hero from tokens","body":""},{"hash":"be45764","date":"2026-07-22 17:15:45 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T17:15:39 (2 files) — deploy-heromap.sh deploy-web.sh","body":""},{"hash":"bbbcbc6","date":"2026-07-22 17:08:21 -0700","author":"Steve Abrams","subject":"Add robust map explorer (/map): 12k canvas markers, per-field on/off toggles (status/price/beds/builder), color-by + legend, localStorage-persisted","body":""},{"hash":"13c6b83","date":"2026-07-22 16:57:40 -0700","author":"Steve Abrams","subject":"Add live national map to homepage hero (loads on page load) + fix stale demo copy","body":""},{"hash":"ab1a330","date":"2026-07-22 14:45:05 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T14:44:58 (1 files) — cert-homesonspec.sh","body":""},{"hash":"1a42593","date":"2026-07-22 14:14:02 -0700","author":"Steve Abrams","subject":"rebrand SpecHomes → HomesOnSpec; add /builders directory (all 30 builders w/ coverage, website, live home counts + links)","body":""},{"hash":"af67cea","date":"2026-07-22 13:34:31 -0700","author":"Steve Abrams","subject":"clean-relaunch script for homesonspec.com (ship demo-filtered code + purge synthetic DB rows + rebuild + retarget nginx)","body":""},{"hash":"f895480","date":"2026-07-22 13:33:26 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"5c85769","date":"2026-07-22 13:20:19 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"e8366c4","date":"2026-07-22 13:14:31 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T13:14:23 (1 files) — ROLLBACK-DNS.txt","body":""},{"hash":"6e35e39","date":"2026-07-22 13:10:41 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"013b828","date":"2026-07-22 12:59:49 -0700","author":"Steve Abrams","subject":"yolo: harden go-live scripts per contrarian (self-signed origin TLS + CF Full, admin origin-only, default_server preflight, rollback capture)","body":""},{"hash":"030753f","date":"2026-07-22 12:55:47 -0700","author":"Steve Abrams","subject":"go-live scripts (Kamatera deploy + CF/GoDaddy cutover), gitignored (contain infra topology); pm2 env hardening","body":""},{"hash":"30af084","date":"2026-07-22 12:16:37 -0700","author":"Steve Abrams","subject":"go-live: Kamatera deploy script; start scripts respect PORT env; national-builder recon recorded (batches 3-4); dream-finders adapter","body":""},{"hash":"0e090e4","date":"2026-07-22 12:14:06 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T12:13:58 (1 files) — collectors/dream-finders/","body":""},{"hash":"4ba331c","date":"2026-07-22 11:57:00 -0700","author":"Steve Abrams","subject":"source runbooks for toll-brothers + lennar live adapters","body":""},{"hash":"45f9ee2","date":"2026-07-22 11:55:44 -0700","author":"Steve Abrams","subject":"lennar live adapter (172 real homes from 8 pages, Apollo state extraction), streaming runPipeline for large sweeps, honest early-preview banner","body":""}]}