{"slug":"govarbitrage","total":89,"limit":100,"offset":0,"since":null,"commits":[{"hash":"eb7e313","date":"2026-07-28 06:58:13 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-28T06:58:06 (1 files) — tsconfig.tsbuildinfo","body":""},{"hash":"0de2691","date":"2026-07-28 06:49:48 -0700","author":"Steve Abrams","subject":"agents: drop CRE-adjacent service/trade firms from CRE finder","body":"Distinct precision unit after type-gate (93bf1bd), relevance-ranking\n(c53b1f2), finance-FP (2d44193): a name-signal false-positive class for\nCRE-ADJACENT SERVICE firms. A Places 'commercial real estate broker'\ntext search surfaces appraisal/title/escrow/construction/mortgage-lending/\ninspection/property-management firms whose 'commercial'/'property' tokens\nsatisfy COMMERCIAL_RE, so they were wrongly kept as buyer/leasing brokers.\n\nisCommercial() now drops a CRE_SERVICE_RE name UNLESS it carries a\nBROKER_ANCHOR_RE (broker/brokerage/realty/real estate/leasing/tenant rep/\ninvestment sales/net lease) or an allowlisted brand — a full-service\nbrokerage's valuation/PM arm survives. Runs before the positive keep\n(same reason as the finance gate). 9/9 service FPs drop, 7/7 legit\nbrokers + brand arms preserved. +20 tests, 151/151, tsc+eslint clean."},{"hash":"a2ed0e6","date":"2026-07-27 21:24:51 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T21:24:43 (1 files) — tsconfig.tsbuildinfo","body":""},{"hash":"2d44193","date":"2026-07-27 21:23:40 -0700","author":"Steve Abrams","subject":"agents: drop financial-advisory/wealth firms from CRE finder","body":"The broker/finance verticals overlap, so a Places text search for\n'commercial real estate broker' surfaces wealth-management, financial-\nadvisory and securities firms. Their names carry finance-ambiguous\ntokens (investments/advisors/capital markets) that also satisfy the\ngeneric COMMERCIAL_RE keep, so 'Sterling Financial Advisors',\n'Vanguard Investment Advisors', 'Edward Jones Investments' etc. were\nwrongly kept as CRE brokers (the finance type-gate only catches\nGoogle-tagged finance; many wealth firms come back as establishment/POI).\n\nAdd a financial-advisory name gate that runs before the commercial keep:\na wealth/securities/financial firm is dropped UNLESS it carries an\nunambiguous real-estate anchor (real estate/realty/CRE/properties/\nleasing/net lease/investment sales/commercial) or an allowlisted CRE\nbrand. 'investment sales' stays a CRE anchor so legit investment-sales\nbrokers survive. +18 offline regression tests, 131/131, tsc+eslint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c53b1f2","date":"2026-07-27 21:19:24 -0700","author":"Steve Abrams","subject":"agents: relevance-weighted ranking — surface stronger CRE matches first","body":"The commercial-RE finder ranked purely by rating*log(reviews), so a\nweakly-commercial high-rated generic outranked a two-lens national\nbrokerage (CBRE surfaced by both buyer+leasing) with modest reviews.\nAdd bounded relevanceScore() (national brand +0.3, strong commercial\nname +0.2, both-lens coverage +0.1) folded into the rank as a\nmultiplier + relevance tiebreak. Bounded so a 0-review brand still\nweighs rating*log(1)=0 and cannot leapfrog a genuinely reviewed office.\nPure/offline/reversible; +7 tests (113/113), tsc clean, $0 no billing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c173473","date":"2026-07-27 20:24:31 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T20:24:23 (1 files) — tsconfig.tsbuildinfo","body":""},{"hash":"93bf1bd","date":"2026-07-27 20:23:08 -0700","author":"Steve Abrams","subject":"agents: fix off-topic type gate — exact-token match, not \\b-regex","body":"Google Places types are underscore-joined (furniture_store, shopping_mall).\n'_' is a JS word char, so \\bstore\\b never fired inside a compound type — the\nstep-1 off-topic gate was a near no-op: an 'Office Furniture Warehouse' tagged\nfurniture_store (commercial-sounding name) was wrongly KEPT as a CRE broker.\n\nReplace OFF_TOPIC_TYPE_RE / RESIDENTIAL_TYPE_RE with exact-token Sets +\nisOffTopicType() (Set membership OR *_store suffix), and expand the blocklist\n(shopping_mall, finance, lawyer, car_dealer, *_store, etc). +11 regression tests.\ntsc clean; full suite 106/106.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8093362","date":"2026-07-27 09:06:33 -0700","author":"Steve Abrams","subject":"chore: v0.4.0 → v0.5.0 (session close — basic-auth login + price lock)","body":""},{"hash":"70e7b1e","date":"2026-07-27 08:49:19 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T08:49:12 (1 files) — tsconfig.tsbuildinfo","body":""},{"hash":"05f0b66","date":"2026-07-27 08:38:25 -0700","author":"Steve Abrams","subject":"auctions/govarbitrage: basic un/pw IS the login — passing the outer wall mints an ADMIN session, no email/login form (Steve)","body":""},{"hash":"4d4adb4","date":"2026-07-27 07:49:02 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T07:48:56 (1 files) — tsconfig.tsbuildinfo","body":""},{"hash":"5385092","date":"2026-07-27 07:28:50 -0700","author":"Steve Abrams","subject":"govarbitrage: lock Standard=$19 / Premium=$49 (Steve-approved prices; code had drifted to 12/29)","body":""},{"hash":"6452910","date":"2026-07-26 19:58:45 -0700","author":"Steve Abrams","subject":"chore: v0.4.0 (session close) — /agents search debug+improve, precision filter, sort+density, security hardening, a11y+dedupe","body":""},{"hash":"d17c2b2","date":"2026-07-26 19:14:41 -0700","author":"Steve Abrams","subject":"agents: a11y + empty/loading-state polish on agent-finder","body":"- aria-label on City/State/ZIP inputs (placeholder is not an accessible name)\n- type filter is a role=group with aria-pressed toggle buttons + focus-visible ring\n- error text gets role=alert; sr-only role=status/aria-live announces searching + result count\n- loading skeleton grid (shaped placeholders) replaces the bare Searching… button\n- sort <select> gets aria-label + focus-visible ring; results container aria-busy\n- fix pre-existing react-hooks/set-state-in-effect lint error on the deliberate\n  localStorage-hydration effect (scoped disable w/ justification)\n\nDTD-loop follow-on to the dedupe pass. tsc clean, eslint clean (this file), next build OK, 96/96 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"b791b34","date":"2026-07-26 19:08:22 -0700","author":"Steve Abrams","subject":"agents: contact-based dedupe — collapse same office surfaced under multiple lenses (same phone; or same website when phones don't contradict), so national-brand branch offices stay distinct","body":"DTD unanimous 5/5 (Claude+Codex+Qwen+Grok+Kimi) picked this as the highest-value SAFE/reversible refinement. Phone is authoritative per-office identity (fixes CBRE + CBRE Investment Sales dup); website only merges when phones can't prove two branches. Pure lib logic + 23 new offline unit tests (dedupeByContact/normalizePhone/normalizeHost), zero live Places billing. tsc clean, 96/96 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"3b38d91","date":"2026-07-26 17:14:52 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-26T17:14:46 (4 files) — src/app/api/agents/search/route.ts src/lib/places.ts src/lib/rate-limit.ts src/lib/places.test.ts","body":""},{"hash":"8b39674","date":"2026-07-26 16:35:12 -0700","author":"Steve Abrams","subject":"agents: harden search route — session-keyed rate-limit (unspoofable vs X-Forwarded-For), city/state/zip validation, allSettled (partial results survive) + billed-only query count + sanitized upstream errors","body":""},{"hash":"78d5fa8","date":"2026-07-26 16:29:34 -0700","author":"Steve Abrams","subject":"agents: results grid gets sort (best/rating/reviews/name) + density slider, localStorage-persisted (Steve standing-rule: every grid needs sort+density)","body":""},{"hash":"69f9dc1","date":"2026-07-26 16:21:45 -0700","author":"Steve Abrams","subject":"agents: precision-first commercial filter — require positive commercial evidence (name signal or brokerage-brand allowlist), drop residential/off-topic (LA 57->28, verified live vs Google Places)","body":""},{"hash":"f82010f","date":"2026-07-26 16:01:30 -0700","author":"Steve Abrams","subject":"deploy: provision GOOGLE_PLACES_API_KEY (non-destructive) + bounded /login smoke-retry — fixes silent 503 on /agents live search","body":""},{"hash":"75b5e88","date":"2026-07-26 16:01:30 -0700","author":"Steve Abrams","subject":"agents: better search — 3 curated CRE query lenses/kind (buyer+leasing), types-based commercial filter, exact billed-query count + honest cost estimate ($0.24/both)","body":""},{"hash":"63fd9d5","date":"2026-07-26 08:29:02 -0700","author":"Steve Abrams","subject":"agents: explicit 'not tied to surplus listings' disclaimer (contrarian FIX-FIRST — the nav link implied a catalog connection the copy fix alone left standing)","body":""},{"hash":"4aa0234","date":"2026-07-26 08:26:38 -0700","author":"Steve Abrams","subject":"agents: honest copy — standalone commercial-RE finder 'by location', drop false 'near a surplus property' framing (catalog has ~2 commercial real-property listings, not 111)","body":""},{"hash":"dd2a641","date":"2026-07-25 13:32:31 -0700","author":"Steve","subject":"chore: lint, refactor (ssrf fe80::/10 mask, middleware dedup), v0.3.0 (session close)","body":""},{"hash":"74ea2fe","date":"2026-07-25 13:26:51 -0700","author":"Steve Abrams","subject":"feat(agents): commercial CRE buyer/leasing agent finder via Google Places (commercial-only, login-gated, rate-limited, cost-surfaced)","body":""},{"hash":"4501587","date":"2026-07-25 13:23:23 -0700","author":"Steve","subject":"fleet-sso: bump minted role VIEWER->ANALYST + PREMIUM tier for the fleet operator (operational access + full data; credentials still ADMIN-only)","body":""},{"hash":"dd56e4d","date":"2026-07-25 13:19:12 -0700","author":"Steve","subject":"seo: make /selling-avenues public in middleware (was crawlable in robots+sitemap but gated → indexed-redirect)","body":""},{"hash":"026c8ee","date":"2026-07-25 13:06:05 -0700","author":"Steve","subject":"security(DTD-B): fleet SSO mints VIEWER not ADMIN; role-tier requireWrite (ANALYST floor) + requireAdmin on credentials (GET was unguarded)","body":""},{"hash":"d468e96","date":"2026-07-25 12:42:09 -0700","author":"Steve","subject":"refine(yolo): DB-side pagination + bounded reports, table sort/density controls, public-page dark-mode tokens, buyer-page reorder; contrarian fixes (double-desc, sort-select label, null-order, non-silent caps)","body":""},{"hash":"1a778cf","date":"2026-07-25 12:36:21 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-25T12:36:15 (8 files) — src/app/b/[slug]/page.tsx src/app/deals/page.tsx src/app/newsletter/page.tsx src/app/pricing/page.tsx src/components/listings-table.tsx","body":""},{"hash":"1d1a7ee","date":"2026-07-25 11:43:43 -0700","author":"Steve","subject":"refine: SEO (real-domain sitemap/robots, metadata+JSON-LD), SSRF guard on url import, login timing fix, dashboard/score/retail correctness, table+detail UX polish","body":""},{"hash":"2c066de","date":"2026-07-25 11:29:31 -0700","author":"Steve","subject":"auctions: accept fleet SSO (aafleet) cookie → one shared login across *.agentabrams.com","body":""},{"hash":"6c0f4d8","date":"2026-07-22 19:11:25 -0700","author":"Steve Abrams","subject":"Username-only sign-in (email login retired); admin uses std fleet password","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"1a64a1d","date":"2026-07-22 19:08:15 -0700","author":"Steve Abrams","subject":"Sign-in accepts bare username (resolved via email local-part) or full email","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"873b83f","date":"2026-07-14 08:46:32 -0700","author":"Steve","subject":"chore: v0.2.1 (session close — auth wall)","body":""},{"hash":"9b99d81","date":"2026-07-13 14:51:43 -0700","author":"Steve","subject":"Add outer admin/DW2024! basic-auth wall (bypass Stripe webhook + import-token clients)","body":""},{"hash":"8e80bc6","date":"2026-07-13 12:13:56 -0700","author":"Steve Abrams","subject":"chore: lint (Link over bare <a>), refactor (toEdition helper, HTML_ESCAPE), stale-comment fix, v0.1.0 → v0.2.0 (session close)","body":""},{"hash":"887f5c6","date":"2026-07-13 09:41:06 -0700","author":"Steve Abrams","subject":"5x sweeps 3-4: OG/twitter tags on /newsletter, honest live copy (page+email), https-only guard on live digest links","body":""},{"hash":"059a054","date":"2026-07-13 09:33:30 -0700","author":"Steve Abrams","subject":"5x live verification: 2 consecutive clean sweeps, 0 defects","body":""},{"hash":"974fc37","date":"2026-07-13 09:19:04 -0700","author":"Steve Abrams","subject":"Go-live: george-env runtime cred injection (py), newsletter server + digest wrappers, launchd 6am/5pm subscriber digest","body":""},{"hash":"c484634","date":"2026-07-13 02:04:40 -0700","author":"Steve Abrams","subject":"Newsletter live transport: George /api/send with external-send approval header, runtime-injected creds (george-env.sh pattern), server + digest wrappers; live still gated on env mode+token","body":""},{"hash":"dba59ea","date":"2026-07-13 01:52:14 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-13T01:52:00 (8 files) — prisma/schema.prisma scripts/seed-digest-snapshots.ts src/app/api/listings/[id]/route.ts src/app/listings/[id]/page.tsx src/lib/digest-snapshot.ts","body":""},{"hash":"519132e","date":"2026-07-13 01:38:44 -0700","author":"Steve Abrams","subject":"SEO plumbing: sitemap.xml (static pages + every archive date), robots.txt (public routes allowed, app/private disallowed), canonicals from NEWSLETTER_BASE_URL","body":""},{"hash":"5e22c50","date":"2026-07-13 01:38:44 -0700","author":"Steve Abrams","subject":"Public SEO deal archive: /deals index + /deals/[date] teaser pages (ROI band + confidence shown, max-bid/net-profit withheld behind subscribe CTA), middleware allowlist, nav links","body":""},{"hash":"343863b","date":"2026-07-13 01:38:44 -0700","author":"Steve Abrams","subject":"DigestSnapshot model: freeze each honesty-gated Top-10 at send time (public-safe fields only); capture wired into digest send + standalone; seed script with marked fabricated edition","body":""},{"hash":"8d98349","date":"2026-07-13 01:26:51 -0700","author":"Steve Abrams","subject":"Contrarian fixes: digest send-to-list engine (TEST-logged), redact tokens in outbox logs, honest pre-launch landing copy","body":""},{"hash":"e626b08","date":"2026-07-13 01:19:22 -0700","author":"Steve Abrams","subject":"Public /newsletter landing: digest pitch, subscribe form with confirm-your-email state, CAN-SPAM small print; nav link","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"d242730","date":"2026-07-13 01:19:22 -0700","author":"Steve Abrams","subject":"Newsletter API: subscribe (honeypot+rate-limit, enumeration-safe), confirm, one-click unsubscribe; TEST-mode email outbox","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"562ea5d","date":"2026-07-13 01:19:22 -0700","author":"Steve Abrams","subject":"Subscriber model: double-opt-in newsletter (PENDING/CONFIRMED/UNSUBSCRIBED, unique tokens)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"687fd82","date":"2026-07-13 01:03:36 -0700","author":"Steve","subject":"Reprice tiers to research-backed audience-building points: Standard $19->$12, Premium $49->$29","body":"Market research (search-specialist, 2026 comps): category entry norm $5-30/mo;\ndirect gov-auction comp GovAuctions.app=$7/mo; Amazon tools $19-89. $12/$29\nundercuts the pack to maximize signups in the growth phase. env-overridable."},{"hash":"f564b8f","date":"2026-07-13 00:59:05 -0700","author":"Steve","subject":"3-tier paid-alerts paywall (Free/Standard/Premium) — TEST/mock Stripe, value-gated","body":"Tier enum + User.tier/stripe fields; src/lib/tiers.ts (Free $0 / Standard $19 /\nPremium $49 draft, env-overridable); src/lib/billing.ts (Stripe TEST-only,\nrefuses sk_live_, mock mode when no key); /pricing page + UpgradeButton;\n/api/billing/checkout + /billing/success (mock-upgrades) + /api/billing/webhook\n(real source of truth in test); getCurrentTier() (ADMIN->PREMIUM); listings API\ngates FREE (caps rows + redacts max-bid/ROI/scores) vs paid (full intelligence).\nVerified: /pricing 200 (3 tiers), checkout 401 unauth, typecheck+build clean.\nLive keys/real charges/price/distribution remain Steve-gated."},{"hash":"1162672","date":"2026-07-13 00:47:28 -0700","author":"Steve","subject":"Honesty Gate: confidence-discounted, capped, disclaimed hot-deal figures (no inflated-ROI chargeback trap)","body":"Per yolo cycle-2 DTD (A + Honesty-Gate-first) and the cycle-1 contrarian: paid\nalerts must never sell a bare '727% ROI' heuristic. hot-deals.ts now computes a\nCONFIDENCE (from real comp count + sell-prob + used-comps) that haircuts the\noptimistic sale/ROI (LOW 0.5 / MED 0.7 / HIGH 0.9) and caps displayed ROI at\n200%; hot-deal-alert.ts shows the conservative low-side figures + a confidence\nbadge + a mandatory 'verify comps' disclaimer + honest header. Unit-verified."},{"hash":"bba7207","date":"2026-07-12 23:49:50 -0700","author":"Steve","subject":"set-admin: generate strong random password server-side (no hardcoded default)","body":""},{"hash":"deba4c5","date":"2026-07-10 12:21:15 -0700","author":"Steve","subject":"seed: never hardcode admin password — set out-of-band via set-admin (ADMIN_PASSWORD env)","body":"Redeploys no longer clobber a real credential; fresh installs get a random\nthrowaway hash until set-admin runs. Removes the hardcoded default from the repo."},{"hash":"6b2f576","date":"2026-07-10 12:17:36 -0700","author":"Steve","subject":"Unified admin credential (admin@agentabrams.com) durable across deploys + set-admin script","body":""},{"hash":"0eefdaf","date":"2026-07-10 12:10:10 -0700","author":"Steve","subject":"deploy: non-destructive db push + install prod cron (refresh @noon + liveness /15m)","body":"Drop --force-reset (schema changes are additive; imports upsert) so deploys no\nlonger wipe live data. Install /etc/cron.d/govarbitrage so the live site self-\nrefreshes daily and sweeps dead listings every 15 min. Hot-deal alerts stay on\nmac3 (George creds never touch prod)."},{"hash":"e9ed2a5","date":"2026-07-10 12:08:07 -0700","author":"Steve","subject":"Add HOT DEAL alerts + fast dead-listing removal + listing lifecycle","body":"- ListingStatus (ACTIVE/ENDED/REMOVED) + endedAt/lastSeenAt/livenessCheckedAt\n  + hotAlertedAt on Listing; queryListings defaults to ACTIVE (dead listings\n  vanish from the grid); ingest reactivates + stamps lastSeenAt on re-import.\n- HOT DEAL gate (src/lib/hot-deals.ts): buy-side headroom (recMaxBid>bid) +\n  proven sell-side (demand + probOfSale + comps/expected-sale) + net/ROI bar.\n  Tuned to score>=82 elite band (corpus is bimodal; heuristic valuations run\n  optimistic until real-comp calibration). scripts/hot-deal-alert.ts emails\n  new deals via George (sell-side-first layout, flags buyer leads), dedups via\n  hotAlertedAt. Verified live send.\n- Two-tier liveness (scripts/liveness-sweep.ts): Tier1 instant-expire past\n  closingAt ($0, no net); Tier2 network-verify null-clock items, REMOVE on\n  404/410/gone-markers only (never on transient errors).\n- Runners run-hot-deals.sh (George shim, mac3) + run-liveness.sh."},{"hash":"97704b2","date":"2026-07-10 11:55:47 -0700","author":"Steve","subject":"Add daily-noon refresh runners for Municibid/PublicSurplus/GovPlanet","body":"launchd jobs com.steve.govarbitrage-{municibid,publicsurplus,govplanet}-free\nfire at 12:00/12:04/12:08 (staggered), refreshing the LOCAL db that feeds\nthe digest. Verified via kickstart+log (100 fetched, idempotent upsert)."},{"hash":"b44789f","date":"2026-07-10 11:45:38 -0700","author":"Steve","subject":"Crack GovPlanet (free): extract embedded quickviews JSON, USD, no browser","body":"GovPlanet runs the IronPlanet/Ritchie Bros stack (NOT on LS maestro API).\nsearchResults.ips + /buy-now embed a per-item quickviews.push({...}) JSON\nobject with all fields (equipId/description/price/location/photo/timeLeft),\nalready USD. Brace/string-aware scanner extracts them (values contain ')'\ninside strings). Added GOVPLANET to enum + SOURCE_MAP + table filter.\n116 rows ingested. 8th free source. $0 no-browser-at-runtime."},{"hash":"6b3da44","date":"2026-07-10 11:34:06 -0700","author":"Steve","subject":"Wire Municibid + Public Surplus imports into deploy-auctions.sh","body":""},{"hash":"e9f92ce","date":"2026-07-10 11:33:46 -0700","author":"Steve","subject":"Crack Public Surplus (free): SSR category HTML parser, no API/browser","body":"/sms/browse/cataucs?catid=C&page=P returns 25 fully-rendered auction cards\nto plain curl (HTTP 200). Parse .auction-item cards across 28 categories;\n100% field coverage (title/price/state/image + relative-time->closingAt).\n$0 no-browser-at-runtime. 80 rows ingested. 7th free source."},{"hash":"860397d","date":"2026-07-10 11:28:45 -0700","author":"Steve","subject":"Crack Municibid (free): SSR /browse HTML parser, no API/browser at runtime","body":"Municibid is server-rendered ASP.NET (no JSON listings API — the earlier\ngist.build lead was the Customer.io chat widget). Plain curl gets HTTP 200,\nso parse .browse-item cards + ?page=N pagination. 100% field coverage\n(title/price/bids/absolute-close/location/image), $0. 100 rows ingested."},{"hash":"a0d4cae","date":"2026-07-10 08:44:55 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-10T08:44:50 (1 files) — scripts/deploy-auctions.sh","body":""},{"hash":"5216572","date":"2026-07-10 08:11:09 -0700","author":"Steve Abrams","subject":"Phase 21b: deploy-auctions.sh uses --force-reset (old Kamatera DB = 26 disposable stub rows on incompatible schema; repopulated by seed + free feeds)","body":""},{"hash":"49f1858","date":"2026-07-10 07:51:38 -0700","author":"Steve Abrams","subject":"Phase 21: deploy-auctions.sh — one-shot update deploy to auctions.agentabrams.com (rsync+migrate+build+free-feed populate+pm2), preserves server .env","body":""},{"hash":"357a4ea","date":"2026-07-10 07:35:33 -0700","author":"Steve Abrams","subject":"Phase 20: FREE GraysOnline (AU) importer via harvested Algolia index GOL_MAIN (public app-id+key, $0); AUD→USD conversion; +GRAYS_AU source; 100 lots verified","body":""},{"hash":"ab80273","date":"2026-07-10 07:23:46 -0700","author":"Steve Abrams","subject":"Phase 19: free maestro importer now pulls 3 LS marketplaces (GovDeals + GoIndustry + Network Intl) via businessId; +2 source enums; daily job pulls all three ($0). GoIndustry industrial/lab equipment now flowing (60 listings)","body":""},{"hash":"bd52903","date":"2026-07-10 00:53:17 -0700","author":"Steve Abrams","subject":"Phase 18: FREE GovDeals importer via maestro.lqdt1.com/search/list (public key, no Apify, no browser, $0) — cracked via openclaw real-Chrome API capture; daily-120 free job replaces paid Apify (retired: plist + runners deleted); GI/NI siblings supported","body":""},{"hash":"9b61dc8","date":"2026-07-10 00:46:53 -0700","author":"Steve Abrams","subject":"Phase 17: all fields searchable + sortable — client global filter matches every field (text/number/score), per-column filter row (toggle), all data columns sortable, filtered-count + filtered CSV export, pageSize 1000","body":""},{"hash":"cbd0fd3","date":"2026-07-10 00:24:39 -0700","author":"Steve Abrams","subject":"Phase 16: activate daily-30 GovDeals Apify job (4:40am, ~$0.49/run/~$15mo); compute real cost from known pricing (init+results×0.01599) not run usageTotalUsd which undercounts; verification run OK (30 listings, 0 failed)","body":""},{"hash":"eb11f2d","date":"2026-07-10 00:07:52 -0700","author":"Steve Abrams","subject":"Phase 15: daily GovDeals Apify runner built (triggerApifyRun + run-apify-govdeals.ts + wrapper + 4:40am plist + cost-tracker apify_govdeals pricing) — schedule NOT loaded pending Steve's go; reads free, runs paid","body":""},{"hash":"abdaa99","date":"2026-07-10 00:02:02 -0700","author":"Steve Abrams","subject":"Phase 14: GovDeals via Apify (parseforge/govdeals-scraper) — apify-govdeals importer + script + read-only auth-gated route; 10 real GovDeals listings ingested; token routed via secrets-manager; paid actor runs intentionally gated","body":""},{"hash":"2be5739","date":"2026-07-09 23:57:07 -0700","author":"Steve Abrams","subject":"Phase 13: 5am GSA import launchd job (com.steve.govarbitrage-gsa-import) refreshes 200 live auctions before the 6am digest; run-gsa-import.sh wrapper","body":""},{"hash":"424827a","date":"2026-07-09 23:56:12 -0700","author":"Steve Abrams","subject":"Phase 12: international arbitrage venues — per-item offer links (eBay UK/DE/AU, Yahoo Auctions JP, Mercari, Carousell HK, Grays/Pickles AU, Taobao/JD/Alibaba CN, Catawiki/Troostwijk EU) as 'International Offers' column + detail section; sourcing directory for Europe/HK/Japan/AU/China on /selling-avenues; +1 test","body":""},{"hash":"e4596b5","date":"2026-07-09 23:50:56 -0700","author":"Steve Abrams","subject":"Phase 11: per-item cross-network offer links (eBay sold/active, GovDeals, AllSurplus, MachineryTrader/LabX/DOTmed) + social 'goods-needed' board links (Reddit/r-Flipping/ISO, FB Marketplace, Craigslist, Discord) — 2 dashboard columns + detail sections; +4 tests","body":""},{"hash":"1a7aa38","date":"2026-07-09 23:30:11 -0700","author":"Steve Abrams","subject":"Phase 10: live GSA Auctions API importer (free, no scraping) — src/importers/gsa.ts + /api/import/gsa + scripts/import-gsa.ts; ingest useAI toggle for fast bulk; 30 real federal listings imported, now surfacing in the digest","body":""},{"hash":"5a58b68","date":"2026-07-09 23:14:33 -0700","author":"Steve Abrams","subject":"chore: gitignore logs/ (untrack generated digest preview)","body":""},{"hash":"dbc3003","date":"2026-07-09 23:14:10 -0700","author":"Steve Abrams","subject":"Phase 9: twice-daily Top-10 opportunity email digest with detailed per-item tables (valuation + full cost breakdown + scores) via George; launchd 6am/5pm; creds sourced from ~/.claude.json (never duplicated)","body":""},{"hash":"ec9c8a3","date":"2026-07-09 23:12:46 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-09T23:12:38 (1 files) — scripts/","body":""},{"hash":"3d43a92","date":"2026-07-09 23:05:55 -0700","author":"Steve Abrams","subject":"Phase 8: rate-limiting (in-memory sliding window) on login (per-IP + per-email) and public buyer-lead; +3 tests, live-verified 429","body":""},{"hash":"2eef6fc","date":"2026-07-09 23:01:29 -0700","author":"Steve Abrams","subject":"Phase 7: real session auth — scrypt passwords, jose JWT cookies, Edge middleware gating all routes, login/logout/me, roles+AuditLog, session-aware write-guard, +5 auth tests","body":""},{"hash":"5833bd0","date":"2026-07-09 22:51:40 -0700","author":"Steve Abrams","subject":"Phase 6 (contrarian fixes): real AES-256-GCM secret encryption + credentials API, IMPORT_TOKEN write-guard on all write routes, fix scrape ?ac= typo, qty>1 cost test, honest security README","body":""},{"hash":"7b18a95","date":"2026-07-09 22:45:50 -0700","author":"Steve Abrams","subject":"Phase 5: importers (CSV/extension/URL) + worker + compliant buyer workflow + reports + selling-avenues + MV3 extension + docs/Docker + Playwright","body":""},{"hash":"1934684","date":"2026-07-09 22:42:36 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-09T22:42:31 (5 files) — README.md extension/ src/app/selling-avenues/ src/importers/ src/lib/selling-avenues.ts","body":""},{"hash":"cd72087","date":"2026-07-09 22:39:50 -0700","author":"Steve Abrams","subject":"Phase 4b: ESLint 9 flat config (Next 16 native) — lint passes 0 errors","body":""},{"hash":"270f059","date":"2026-07-09 22:38:10 -0700","author":"Steve Abrams","subject":"Phase 4: dashboard (cards + full-column TanStack table + CSV/profiles), listing detail, API routes — builds + serves live","body":""},{"hash":"23bcc51","date":"2026-07-09 22:32:31 -0700","author":"Steve Abrams","subject":"Phase 3: local-Ollama AI identification, research pipeline, 25-listing seed (full research/costs/scores)","body":""},{"hash":"111d8f1","date":"2026-07-09 22:27:46 -0700","author":"Steve Abrams","subject":"Phase 2: deterministic valuation/cost/scoring engines + 16 passing Vitest tests","body":""},{"hash":"d537d06","date":"2026-07-09 22:23:51 -0700","author":"Steve Abrams","subject":"Phase 1: Next.js 16 + TS + Prisma 6 + Postgres scaffold, full schema synced","body":""}]}