Implementation plan
- Audit the scanner's per-site fan-out, snapshot schema and scan API; retain existing delivery guards and new-opening detection.
- Store site attributes through an additive Alembic migration. Share minimum-stay and site-filter logic in the database package so API and worker agree; older unknown attributes cannot satisfy restrictive filters until refreshed.
- Add summary/direct worker configuration and a validated public app URL. Enqueue one summary per matching subscription and label its action “View campsites”; preserve direct mode and old serialized notification payloads.
- Enrich scan results with attributes and provider campground booking URLs, filter counts consistently, and regenerate OpenAPI types.
- Replace the raw-date list with a responsive, searchable site list and explicit check-in/check-out blocks. Keep freshness and empty/error states visible.
- Run regression tests, Task quality gates, migration round-trip verification on a disposable database, and visual snapshots. Update architecture/configuration docs and checklist.
Constitution check: preserve provider-verified snapshots, asynchronous delivery, Pydantic contracts, typed React/TanStack Query and package boundaries. Add behavior tests before implementation. No new dependencies or notification channels.
Grouped results refinement
- Preview desktop/mobile date sections with synthetic data before changing the results page (completed and reviewed).
- Add behavior tests for shared ranges, separated stays, minimum stays, unique counts, search, sorting, collapsing and campground/provider links; confirm they fail against the current site-card layout.
- Reuse the existing consecutive-night calculation, group by both endpoints, and render native details/summary sections with compact site rows. Preserve freshness, empty/error states and alert anchors. Read the full campground URL with TanStack Query from the existing campground endpoint; no backend contract changes or direct provider requests.
- Verify frontend tests, lint/types, and desktop/mobile light/dark screenshots of the actual page. Update the frontend blueprint and global checklist.