Generalize the single system monitoring bbox into a named list of areas with
set-union semantics: an event is kept by the archive (and at publish time) if
its geometry intersects ANY configured area. No-geometry events are always
kept; an empty list keeps everything (the pre-feature default).
- Migration 042: new config.monitoring_areas table (name UNIQUE, north/south/
east/west, CHECK ordering); seeds 'default' from config.system.monitor_* so
current bounds (N=49.0 S=41.8 E=-111.0 W=-117.5) are preserved. Old columns
left in place for v0.14.0 (drop in v0.14.1).
- monitoring_area.py: classify_geom_areas + load_monitoring_areas; single-area
classify_geom / load_monitoring_area kept as back-compat shims.
- archive + supervisor consumers load and apply the area list (set-union);
_monitoring_area kept as a back-compat property over the internal list.
- GUI /monitoring-area: list+create+update+delete (server-rendered forms),
shared Leaflet map with per-name golden-angle colored rectangles, add/edit
via leaflet.draw corner handles, empty-state banner, auto-fit to all areas.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v0.10.2's migration 030 set monitor_north=44.5 as the schema default.
Idaho extends to 49.0N -- the original default cut off the entire northern
panhandle (Coeur d'Alene, Lewiston, Sandpoint, Moscow, McCall). Tonight's
investigation caught the impact at scale: supervisor's publish-time bbox
filter was dropping ~56 itd_511 events per 60-second poll (~5,376/day),
the entire north half of Idaho's roadwork, closures, and incidents. NWS
Idaho UGC-zone alerts in the panhandle were similarly dropped (closes
the v0.10.7 PR #95 followup-ticket-(b)).
Three changes:
1. sql/migrations/034: ALTER COLUMN SET DEFAULT 49.0 for fresh installs,
plus an idempotent UPDATE ... WHERE monitor_north = 44.5 that bumps
existing deployments still at the dev value. The WHERE 44.5 guard
preserves any operator who deliberately narrowed -- those rows are
untouched.
2. src/central/gui/routes.py: _DEFAULT_MONITOR["north"] 44.5 -> 49.0
for the Python-level fallback when no system row exists.
3. tests/test_monitoring_area.py: new TestDefaultMonitoringAreaCoversIdaho
class with 9 Idaho sentinel cities spread panhandle-to-south,
west-to-east. Three tests: (a) every sentinel is in-bounds against
the current default; (b) belt-and-suspenders corner-value assertions;
(c) anti-regression test using the OLD v0.10.2 narrow bbox documenting
that it would reject the panhandle.
Phase 1 (immediate, no-PR): the production row was UPDATEd from 44.5 to
49.0 directly via psql before this PR. Drop counter verified to stop
incrementing for itd_511 within one refresh cycle; first post-fix
panhandle publish landed at seq 80741 (Coeur d'Alene closure at
lat=47.7N) at 07:35:33 UTC. published_ids count went from 145 to 201
per poll, no longer dropping the 56-event panhandle batch. This PR
ensures the new code's default is consistent with the live config row
and that future fresh installs don't reintroduce the narrow bound.
Existing IDAHO test fixtures (test_archive_bbox_filter, test_supervisor_
publish_filter, test_fire_fused, test_monitoring_area) still use the
narrow 44.5 value; those are testing bbox behavior with arbitrary inputs
not the production default, so leaving them alone keeps this PR focused
on the production default fix. A separate cosmetic cleanup could update
the IDAHO fixtures if desired.
Full sweep: 1031 passed (+3 from this PR), ruff clean.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>