Excludes ops/meshguide-sync/sync_areas.py (meshguide.dk-specific data
fetch script, not useful without that community site's account) --
everything else is generic: draw-a-polygon areas, homeArea<->geo_filter
linking, per-area regionScopes (one area can now link multiple scope
names, e.g. Europa's "eu"/"europe"), Scope Adoption by Area with
per-node matched-scope breakdown, Domestic/Foreign filters on the
Scopes tab's hygiene sections, a live-resolved "Area:" tag on channel
messages (including WebSocket-appended ones) distinct from the
scope-linked tag, and a wardriving-session area badge.
AreaEntry.RegionScope (single string) -> RegionScopes ([]string), so a
broad umbrella area (e.g. Europa) can link more than one scope name
(e.g. both "eu" and "europe") -- a node matching any one of them now
counts as supporting the area in computeScopeAdoptionByArea, the
"Scope Adoption by Area" section, and the regionScope->label lookup
used to annotate region codes elsewhere on the Scopes tab.
Covers AreaEntry fields (label/polygon-or-box/regionScope), why
hierarchy is purely geometric (no parent field -- draw a broad area
generously enough to contain its sub-areas and rollup just works),
the two different area lookups (single most-specific match for
badges vs. all-containing-areas for aggregate counts), the homeArea
link to geo_filter and why it exists, and a verify-before-deploy
checklist for anyone drawing a new polygon.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>