prescreen_status='none' was truthy so it triggered /api/enriched, which only
finds rows already in enriched_domains with NULL status — missing all the
unprocessed domains that only exist in the 72M DuckDB index.
- exclude 'none' from the hasEnrichFilter check
- 'Not checked' now uses /api/domains (DuckDB) and filters client-side:
rows where prescreen_status is absent = never touched
- all other prescreen status values (live/dead/parked/error) still use
/api/enriched server-side
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: loadDomains() always hit /api/domains (DuckDB 72M rows) and filtered
niche/site_type/prescreen_status client-side on a random page of 100 domains —
virtually none had been classified, so Live+Beauty+Ecommerce always returned 0.
- loadDomains() now routes to /api/enriched when any enrichment filter is active
(prescreen_status, niche, site_type, country) — all filters are server-side SQLite
- Falls back to /api/domains only when no enrichment filters are set (discovery mode)
- alpha_only and no_sld supported in both modes:
- DuckDB: existing regex support
- SQLite: LIKE patterns (no hyphens/digits) + dot-count (no SLD)
- Add alpha_only/no_sld params to /api/enriched endpoint and get_enriched()
- Fix stale d.classified reference in prescreenOne toast
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously /api/prescreen/batch blocked for 4-10 minutes waiting for Replicate/
DeepSeek, causing browser connection timeout and zero results saved.
- Phase 1 (HTTP check) runs synchronously and saves results immediately
- Phase 2 (DeepSeek classify) fires as asyncio.create_task and runs in background
- Response is returned to client as soon as phase 1 completes (~30-90s)
- Frontend toast shows "classifying N in background" so user knows niche/type
will appear shortly without waiting
- Each DeepSeek sub-batch saves independently so partial results are preserved
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- /api/validate/batch endpoint: HTTP-check only (no DeepSeek), accepts up to 500 domains
- Validate Selected bulk button: runs validate in 500-domain chunks, shows live/dead summary
- Alpha only checkbox: passes alpha_only=true to /api/domains to exclude hyphens/numbers
- No SLD checkbox: passes no_sld=true to /api/domains to skip com.es / co.uk style domains
- Both flags wired into loadDomains() and resetFilters()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- loadDomains() now calls /api/domains (72M domain index) instead of /api/enriched
- keyword and TLD filters are server-side (DuckDB); prescreen_status, niche,
site_type, country are client-side — same pattern as main DomGod _fetch()
- "Not checked" now correctly finds domains that exist in DuckDB but have never
been pre-screened (no row in enriched_domains, so no prescreen_status)
- results info shows "X shown · Y matching · page N" to reflect DuckDB total vs
client-side-filtered visible count
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- drop standalone Pre-screen tab (textarea upload) — confusing duplicate
- bulk bar Pre-screen Selected button is the only entry point now
- add prescreening flag with loading state on button + double-click guard
- remove dead prescreenInput/prescreenRunning/prescreenResult state vars and runPrescreen()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- add keyword and tld params to get_enriched() in db.py (LIKE on domain + page_title)
- forward keyword/tld through /api/enriched in beauty_main.py
- rewrite beauty/index.html loadDomains() to pass all filters server-side via URLSearchParams
- track domainsTotal from API response for correct pagination display
- add Pre-screen Selected and B2B Assess Selected bulk action buttons
- add per-row Screen and Assess buttons
- goSearch() resets to page 1 before fetching
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>