Benton Drones logo Benton Drones

MVP Changelog

Benton Drones lead ingest MVP: Shopify-friendly public signup, owned backend data, protected admin, exports, and a clear path to production.

Changelog

A running history of what has been built, fixed, and shipped. Newest entries are at the bottom of the build phase and the top of the release log.

Build phases

IterationCompletedOutcome
0Workflow modernization planDefined owned replacement for Google Forms, PDFfiller, Sheets, and manual Google Earth planning.
1Local MVP foundationBuilt Python/SQLite signup, consent, geocoding mock, admin dashboard, exports, and clustering utilities.
2Shopify awarenessAdded Shopify context fields and documentation for Shopify page/app proxy integration.
3Shopify HMAC utilitiesAdded signature verification helpers and signed context token handoff for future App Proxy use.
4Admin/export protectionProtected admin and exports with password login and signed session cookies.
5CSRF + spam resistanceAdded CSRF tokens, honeypot field, and in-memory POST rate limiting.
6Project communication pagesAdded overview, Shopify preview, changelog, and roadmap pages for clear MVP review.
7Waiver + signature + audit trailReal waiver text from PDF, typed-name signature capture, and a full consent/signature audit trail.
8Branding + dashboard upgradeMaterial 3 + Benton design system across all pages; admin dashboard with Leaflet map, analytics cards, and breakdowns.
9Production hardeningSecurity headers, secret validation, body-size limits, and production-readiness review.
10Hosted deploymentDockerfile, Railway config, then Render + Neon PostgreSQL. App live at benton-drones-lead-ingest.onrender.com.
11Real geocoderReplaced the mock with US Census primary + Nominatim fallback, cached in the database (geocode_cache), plus a live-gated backfill script. Map pins are real now.
12Persistent rate limitingToken-bucket-in-DB limiter shared across processes and restarts, per-route limits, 429 + Retry-After, loud fallback on storage failure.
13JIRA queue replayOn-read sweep + daemon worker with exponential backoff, dead-letter after 5 attempts, and idempotency keys so ambiguous timeouts never duplicate tickets.
14Email notifications (code)stdlib smtplib sender, DB-backed email_queue with backoff + dead-letter, customer confirmation + internal alert templates. Live-send waits on the Workspace SMTP app password.
15Backups & monitoring (code + docs)DB-aware /healthz (no DDL on the health path), strictly read-only scripts/verify_backup.py, and a recovery playbook with human placeholders for Neon/monitor evidence.

Release log

TypeChange
FeaturePlaywright browser-automation E2E suite — 12 real-Chromium tests covering public pages, signup flow, admin journey, and exports. New make test-e2e-browser and make test-e2e-live targets; CI installs Chromium and gates on the count.
FeatureCI workflow (GitHub Actions) with pip caching and test-count gates so a deleted test can never silently pass.
FixAuto-migrate older signups tables by adding missing columns on startup.
FixCast text created_at to timestamptz in the Postgres weekly-analytics query.
FeatureRender deployment blueprint (render.yaml) + deployment guide; live URL added to README.
FeatureNeon PostgreSQL support via DATABASE_URL with automatic SQLite fallback; real waiver extracted from PDF.
DocsVisual before & after architecture page, Anderson plain-language guide, and refreshed training/explainer guides with fully visual SVG diagrams.
FeatureWiggum loop build phase (iterations 11–15): real geocoder (Census + Nominatim + DB cache), persistent DB-backed rate limiting, JIRA queue replay worker, email notification queue + templates, and backup/monitoring tooling + playbook. 79 new tests. Full write-up in docs/wiggum-loop-report.md.

Current test posture

459 tests verified green locally 2026-08-17, all passing. 402 unit/integration + 57 HTTP end-to-end (+ 12 real-browser Playwright = 471 with browser). The suite covers validation, database persistence, consent & signature audit, Shopify context, exports, clustering, authentication, protected routes, CSRF, persistent rate limiting, security headers, geocoding providers + cache, JIRA queue replay, email notification queue, backup verification, production hardening, and the full signup-to-admin-to-export journey in a real browser.