## Why The Phase 2 alert throttle prevents SMS spam from the *same spot*, but two gaps remain: (1) **multiple different finders at the same location** — each deserves to reach the owner, yet the current rule re-alerts only on movement >250 m; (2) **the same device can spam alerts** across different locations within minutes — there is no per-device throttle. This change hardens the alert path: re-alert on a *different finder phone* within the window, and block repeat alerts from the *same browser fingerprint* within 24 hours. ## What Changes - **Different-finder re-alert** (`sms-alerting`): within the 10-minute window, an alert is also sent when the new scan carries a finder phone **different** from the last alerted scan's phone (multiple finders at the same spot each reach the owner). Same phone → no re-alert (unchanged dedup). - **Fingerprint 24 h block** (`fingerprint-throttle`): the tag page's JS computes a lightweight browser fingerprint and sends it with every scan. If the same fingerprint was seen within the last 24 hours, the scan is recorded but **no alert is sent**. A fresh device alerts normally. - **Schema**: `scans` gains a `fingerprint` column (idempotent ALTER); scan endpoint accepts an optional `fingerprint` + `phone`; contact flow dedups by phone within the window. - The finder-contact form now also carries the fingerprint (same anti-spam coverage on the contact path). ## Capabilities ### New Capabilities - `fingerprint-throttle`: JS fingerprint generation, per-device 24 h alert block, fingerprint stored on scans. ### Modified Capabilities - `sms-alerting`: ADDED — different-finder re-alert within the window; contact-path dedup. - `database`: ADDED — `scans.fingerprint` column. ## Impact - **New/changed Go**: `internal/handlers/scan.go` (ScanRequest gains `phone`+`fingerprint`; `shouldAlert` gains the different-phone rule and the fingerprint check; `FinderContact` dedups + carries fingerprint), `internal/db/queries.sql` (new `GetRecentScanByFingerprint` query), regenerated sqlc. - **Changed JS**: `templates/tag-public.html` (fingerprint computation sent with scan + contact). - **Schema**: `scans.fingerprint` idempotent ALTER. - No changes to auth, registry, or templates beyond the script.