Registers one point alarm per CSV row (recipientId, lat, lng, radius) with the shared filter JSON and the existing webhook bootstrap, records status, httpStatus, registrationId and errorBody back into the CSV and recovers ambiguous failures only on an identical recipient, point and radius match.
Adds point_alarm.py (flattening, secret masking, SQLite upsert store, paged fetch with 403 fallback, CSV/TXT export, shared filter loader), nowcast-point-page.py CLI and unit tests. Register will read the shared filter from nowcast-point-alarm-filter.json instead of repeating it in the CSV.
Move webhook config loading, UUID and warning helpers and the atomic semicolon CSV writer out of geo_alarm so the upcoming point alarm clients can reuse them. Behavior is unchanged and the existing geo tests still pass.
Backend already treats a missing/null lightning.type as "no type
constraint", but the sandbox validator required it whenever a
lightning block was present, causing valid configs to be rejected
with "filter.lightning.type FLASH_CLOUD_TO_GROUND veya PULSE_IN_CLOUD
olmalıdır." Now the check only rejects an explicitly invalid value.