{
  "_about": "shinnslist updates — the living public record of what was worked on and changed. Entries are newest-first. Every entry carries a link to the exact place on shinnslist.com where the change is visible. Add an entry for every shipped change with: node scripts/log-update.mjs \"title\" \"detail\" \"area\" \"/link\" [\"shipped\"|\"in progress\"] — the link is required; the script refuses entries without one. Never present unfinished work as shipped: mark it \"in progress\". This file is written by scripts/log-update.mjs (which validates the JSON after every write) and shipped to the site by scripts/build-deploy.sh.",
  "entries": [
    {
      "ts": "2026-10-12T08:16:44.414Z",
      "title": "Hunt API quota-proofed: precomputed facets, response cache, graceful degradation",
      "detail": "Search facets now come from a precomputed table (migration 0008, populated with tallies for 666,791 parcels) instead of scanning ~669k rows on every request; search and map responses are cached (10-minute fresh window, invalidated automatically by every ingest); composite indexes added (migration 0009, applied). If the D1 daily read limit is ever hit again, the API serves recent cached results flagged stale instead of erroring. Today's limit is already exhausted, so hunt results stay in degraded mode until the reset at midnight UTC (6:00 PM MDT) — after that the new fast path serves everything.",
      "area": "hunt platform / database",
      "link": "/",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T08:04:38.881Z",
      "title": "Full hunt walk live in the database: 668,666 parcels",
      "detail": "The completed exhaustive walk is ingested into the live database: Colorado 52,707 + Virginia 615,959 parcels, 3,565 buy-box PINNED (incl. 145 in VA), 166,920 PROFIT rows, 184 Janis pre-listing leads. Every parcel from FULL-RESULTS.csv is now behind the search API (one source-CSV duplicate parcel in Goochland, VA collapsed to a single record). Note: the free-tier D1 daily row-read quota was exhausted by the ingest verification scans on 2026-10-12; search reads reset at midnight UTC.",
      "area": "hunt database",
      "link": "/",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T06:05:33.974Z",
      "title": "Composer filters are now fully server-side (CONTRACTS v1.2)",
      "detail": "On the hunt page, picking 2+ lanes at once and the deal-shape flags (two living spaces, seller-carry capable, free & clear) used to be filtered in your browser over only the loaded rows, with a label saying so. Those were the last on-page filters. The API now takes lane as a comma list (OR across lanes, counted once per parcel), two_space_min, carry and free_clear, and search + map share them — so the results, counts and map pins are exact database answers for every combination. The on-page pass and its label are deleted.",
      "area": "hunt",
      "link": "/",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T05:58:00.574Z",
      "title": "signal composer now searches the whole database",
      "detail": "The hunt page's signal stack is evaluated in the database, not over the loaded window: stacking signals (absentee owner + 10+ yr tenure, match at least 2) returns the exact database count — 2,485 — and the map plots that same filtered set straight from the API. The rail and stack bar now read 'database matches' with exact totals; the old 'of N loaded' caveat is gone. Pages of results say 'showing N of X'.",
      "area": "hunt",
      "link": "/",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T05:46:43.443Z",
      "title": "Signal stacks are now database-exact",
      "detail": "The /hunt composer's signal stacking moved server-side: the hunt API now takes signals + stack_min (a parcel must match at least N of the picked signals, counted in the database), multi-pick distress and cool filters with and/or modes, and a pre-listing stack minimum. Search counts and map pins now come from the database for the exact same filter set — no more counting only the rows loaded on screen.",
      "area": "api",
      "link": "/hunt",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T05:27:58.805Z",
      "title": "the hunt is live — the whole site is the deal-hunting map now",
      "detail": "shinnslist.com opens straight onto the hunt: full-screen map of 6,220 colorado parcels from the live database, layers panel (parcels, water, protected lands), owner + numbers on every click, pin your picks and save them as lists. walk status shows the count growing as the full colorado + virginia walk runs.",
      "area": "hunt",
      "link": "/hunt",
      "status": "shipped"
    },
    {
      "ts": "2026-10-12T05:23:51.001Z",
      "title": "Deal-hunt backend live: search, map, pins, shared lists",
      "detail": "New /api/hunt/* endpoints over a 6,220-parcel hunt database in D1 (migration 0006): real-time search with filters/facets, map points, fresh feed, per-user pins, savable lists and share links — another user opening a share link sees the same results. Ingest is re-runnable as the CO + VA walk produces new checkpoints.",
      "area": "backend",
      "link": "/playground",
      "status": "shipped"
    },
    {
      "area": "site",
      "detail": "shinnslist.com/updates is now the permanent public record of what was worked on and changed. Every entry is clickable to the exact place on the site where the change is visible. New entries are added with scripts/log-update.mjs on every ship.",
      "link": "/updates",
      "status": "shipped",
      "title": "This updates page — the living record goes live",
      "ts": "2026-10-11T23:20:00-06:00"
    },
    {
      "area": "site",
      "detail": "The new hunting surface in the Land ID × PAD Mapper idiom: full-bleed map, layers panel (parcels, owners, water, protected lands), search on top, parcel click → owner card, pins and lists. Wiring to live hunt data is in progress — the page ships visibly and improves in place.",
      "link": "/hunt",
      "status": "in progress",
      "title": "/hunt — the live deal-hunting map (in progress)",
      "ts": "2026-10-11T23:12:00-06:00"
    },
    {
      "area": "platform",
      "detail": "D1 hunt tables, the walk-ingest pipeline, and the /api/hunt search, map, fresh-feed, pins and shared-list endpoints. This is the plumbing the /hunt page runs on; endpoints are landing one by one behind the full test gate.",
      "link": "/hunt",
      "status": "in progress",
      "title": "Hunt platform backend — database + search APIs (in progress)",
      "ts": "2026-10-11T23:05:00-06:00"
    },
    {
      "area": "hunt data",
      "detail": "Both Larimer lists obtained read-only past the county bot wall: 113 tax-delinquent parcels inside the target ZIPs (90 Estes Park, 21 Drake, 2 Glen Haven) — now a live leg of the walk. The Oct 14 foreclosure sale has 25 cases countywide, zero in the target ZIPs: on the mountain side the distress is tax-side, not bank-side.",
      "link": "/hunt",
      "status": "shipped",
      "title": "Larimer County distress legs pulled",
      "ts": "2026-10-11T22:58:00-06:00"
    },
    {
      "area": "build",
      "detail": "The build script now ships public/docs and public/seo into the deploy: /docs/ serves the real docs hub (15 pages) and the metro SEO pages serve their real content (20 pages). The 302-redirect workaround functions are deleted. Verified live; 17,220/17,220 tests green.",
      "link": "/docs/",
      "status": "shipped",
      "title": "Docs + area pages ship for real — redirect workaround deleted",
      "ts": "2026-10-11T22:50:00-06:00"
    },
    {
      "area": "hunt engine",
      "detail": "The hunt is now an exhaustive walk, not a sample: every parcel in the 15 Colorado ZIPs plus the full Harrisonburg→Midlothian corridor, checked against the income-space profile, loan era, distress legs and hard exclusions (no HOA, no condos, no apartments, no mobile homes, no empty land). Ranking recalibrated: buy-box matches pinned on top, then profit order (wholesale spread / Janis lead value); trustee foreclosures are call-the-owner-before-the-sale targets, never auction buys. Crash-safe, resumable, running for days until both regions are fully walked.",
      "link": "/hunt",
      "status": "in progress",
      "title": "The full walk launched — every parcel, both regions (in progress)",
      "ts": "2026-10-11T22:47:00-06:00"
    },
    {
      "area": "hunt data",
      "detail": "First candidate build from county records: 6,220 rows (583 headline rows inside the confirmed ZIPs), each with two-living-space evidence, 2020-22 loan-era band, distress legs and an estimated equity gap. CORA water-shutoff + inactive-tap requests drafted for Longmont, Erie, Lyons, Left Hand Water and Estes Park — drafts only, nothing filed.",
      "link": "/hunt",
      "status": "shipped",
      "title": "Hunt pass 1 — 6,220 off-market candidates ranked",
      "ts": "2026-10-11T22:44:00-06:00"
    },
    {
      "area": "site fixes",
      "detail": "Root cause found and fixed: typed chat questions crashed on a broken language helper whenever a word was auto-corrected, so only the pre-made chips worked. Now live: typed assumable questions return cards in ~2s; out-of-coverage ZIPs get an honest coverage answer + waitlist; plain questions (down payment, water rights) get real answers instead of silence; the homepage '[object Object]' rate bug is gone (rates read '2.8-3.2% (2020-2021 FHA cohort)'); a junk filter removed $100 slivers and city-owned parcels from results; 'show all' fixes the 5-of-10 card mismatch; stale 'searching' pill relabeled. 17,217/17,217 tests green at ship time.",
      "link": "/chat",
      "status": "shipped",
      "title": "Chat answers again — 7 end-user fixes, verified live",
      "ts": "2026-10-11T22:27:00-06:00"
    },
    {
      "area": "database",
      "detail": "The KV log store that was never bound is now live (real search + feedback logs flowing). Four new D1 tables (parcels, signal results, lists, list items) added, and the assumable engine now saves its scored results into the database instead of throwing them away — verified by reading 30 parcels + 30 scored results back out of production D1. 17,171/17,171 tests green at ship time.",
      "link": "/console",
      "status": "shipped",
      "title": "Database plumbing — logs connected, parcel + list tables live",
      "ts": "2026-10-11T21:58:00-06:00"
    }
  ]
}
