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
| Iteration | Completed | Outcome |
|---|---|---|
| 0 | Workflow modernization plan | Defined owned replacement for Google Forms, PDFfiller, Sheets, and manual Google Earth planning. |
| 1 | Local MVP foundation | Built Python/SQLite signup, consent, geocoding mock, admin dashboard, exports, and clustering utilities. |
| 2 | Shopify awareness | Added Shopify context fields and documentation for Shopify page/app proxy integration. |
| 3 | Shopify HMAC utilities | Added signature verification helpers and signed context token handoff for future App Proxy use. |
| 4 | Admin/export protection | Protected admin and exports with password login and signed session cookies. |
| 5 | CSRF + spam resistance | Added CSRF tokens, honeypot field, and in-memory POST rate limiting. |
| 6 | Project communication pages | Added overview, Shopify preview, changelog, and roadmap pages for clear MVP review. |
| 7 | Waiver + signature + audit trail | Real waiver text from PDF, typed-name signature capture, and a full consent/signature audit trail. |
| 8 | Branding + dashboard upgrade | Material 3 + Benton design system across all pages; admin dashboard with Leaflet map, analytics cards, and breakdowns. |
| 9 | Production hardening | Security headers, secret validation, body-size limits, and production-readiness review. |
| 10 | Hosted deployment | Dockerfile, Railway config, then Render + Neon PostgreSQL. App live at benton-drones-lead-ingest.onrender.com. |
| 11 | Real geocoder | Replaced 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. |
| 12 | Persistent rate limiting | Token-bucket-in-DB limiter shared across processes and restarts, per-route limits, 429 + Retry-After, loud fallback on storage failure. |
| 13 | JIRA queue replay | On-read sweep + daemon worker with exponential backoff, dead-letter after 5 attempts, and idempotency keys so ambiguous timeouts never duplicate tickets. |
| 14 | Email 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. |
| 15 | Backups & 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
| Type | Change |
|---|---|
| Feature | Playwright 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. |
| Feature | CI workflow (GitHub Actions) with pip caching and test-count gates so a deleted test can never silently pass. |
| Fix | Auto-migrate older signups tables by adding missing columns on startup. |
| Fix | Cast text created_at to timestamptz in the Postgres weekly-analytics query. |
| Feature | Render deployment blueprint (render.yaml) + deployment guide; live URL added to README. |
| Feature | Neon PostgreSQL support via DATABASE_URL with automatic SQLite fallback; real waiver extracted from PDF. |
| Docs | Visual before & after architecture page, Anderson plain-language guide, and refreshed training/explainer guides with fully visual SVG diagrams. |
| Feature | Wiggum 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.