v1.2.0 Phase C1: email channel, NWS CAP fallback, pipeline drill #101
No reviewers
Labels
No labels
area:ai
area:ci-cd
area:notifications
area:observability
area:public-pages
backlog
bug
duplicate
enhancement
help wanted
invalid
question
type:decision
type:feature
type:infra
type:maintenance
type:security
v1.0.1
v1.1.0
v1.2.0
v1.3.0
v2.0.0
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/WeatherBot!101
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/v1.2.0-phaseC1-email-cap-drill"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Three v1.2.0 feature issues.
#80 — Email / SMTP channel
New
ChannelType.email(migration0021,ALTER TYPE ADD VALUE, mirroring the webex one) + an SMTP notifier built through the shared formatter, sending via stdlibsmtpliboffloaded withasyncio.to_thread(no event-loop block). SMTP failures are classified into theTransient/PermanentDeliveryErrortaxonomy so the outbox retries them correctly. Recipients are redacted for non-managers;EmailConfigvalidation + a channels-UI recipients field. GlobalSMTP_*settings.#78 — NWS CAP fallback
When the primary
/alerts/activeJSON fetch exhausts its retries, fall back to theapi.weather.govCAP ATOM feed (stdlib ElementTree) so a JSON-path failure doesn't blind the poller. Best-effort: any CAP error falls through toNone, preserving the existing skip-cycle-on-outage contract. Gated byNWS_CAP_FALLBACK_ENABLED(default on).#86 — Pipeline drill
Admin-only
POST /api/diagnostics/pipeline-drillinjects a synthetic "Pipeline Drill (TEST)" alert through the real matching → dedup → dispatch → outbox path for end-to-end verification, with adry_runmode. CSRF-protected, short-expiry, clearly-marked TEST event.Testing
Full suite green on the dev server: 617 passed (28 new tests); migration
0021applies cleanly through to head on real Postgres.Closes #80, #78, #86
🤖 Generated with Claude Code