v1.4.0 Phase 2: SPC fire-weather Day 2 (#63) #108

Merged
claude-bot merged 1 commit from feat/v1.4.0-phase2-firday2 into main 2026-07-19 04:08:52 +00:00
Contributor

Resolves the dead SPC fire-weather Day-2 plumbing (F-24). Decision: add Day 2 (recorded on #63), matching the Day 1/2/3 convective coverage — rather than removing the dead text fetch.

Before: only Day-1 fire geometry was fetched and _parse_fire_feature hardcoded day=1, so no fire outlook could ever match Day 2 — yet fetch_spc_fire_outlook_text(2) ran every poll into a dict slot day-2 could never index (dead work).

  • SPC_FIRE_LAYER_URLS maps day 1 → MapServer layer 1 and day 2 → layer 4 ("Day 2 Outlook"), verified against the live SPC firewx service metadata (layers 0/3 are the broader "Fire Weather Outlook", 2/5 are "Dry Thunderstorm" — the categorical ELEV/CRIT/EXTR outlook is 1/4).
  • _parse_fire_feature(day, feature) takes the day; product_id is now D{day}_FIRE_... mirroring the convective D{day}_ convention.
  • fetch_fire_outlooks() loops both layers with per-day freshness recording and per-day try/except (one day's failure won't abort the other).
  • No spc_processor.py change: it already threads outlook.day through dedup/dispatch and its fire_outlook_texts dict already held both {1, 2} slots, so Day-2 outlooks (and the previously-dead Day-2 text) now flow through automatically.
  • README: fire coverage documented as Day 1-2.

Transition note

The Day-1 fire product_id changes from FIRE_... to D1_FIRE_..., so its dedup id changes. If a CRIT/EXTR Day-1 fire outlook happens to be active at deploy time, it could be re-notified once. Fire CRIT/EXTR outlooks are rare and issued daily, so this one-time transition is low-risk.

Testing

Full suite green on the dev server: 661 passed (3 new SPC tests: Day-1 and Day-2 parse/product_id, and fetch_fire_outlooks fetching both layers).

Closes #63

🤖 Generated with Claude Code

Resolves the dead SPC fire-weather Day-2 plumbing (F-24). **Decision: add Day 2** (recorded on #63), matching the Day 1/2/3 convective coverage — rather than removing the dead text fetch. Before: only Day-1 fire *geometry* was fetched and `_parse_fire_feature` hardcoded `day=1`, so no fire outlook could ever match Day 2 — yet `fetch_spc_fire_outlook_text(2)` ran every poll into a dict slot day-2 could never index (dead work). - `SPC_FIRE_LAYER_URLS` maps day 1 → MapServer layer 1 and **day 2 → layer 4** ("Day 2 Outlook"), verified against the live SPC firewx service metadata (layers 0/3 are the broader "Fire Weather Outlook", 2/5 are "Dry Thunderstorm" — the categorical ELEV/CRIT/EXTR outlook is 1/4). - `_parse_fire_feature(day, feature)` takes the day; `product_id` is now `D{day}_FIRE_...` mirroring the convective `D{day}_` convention. - `fetch_fire_outlooks()` loops both layers with per-day freshness recording and per-day try/except (one day's failure won't abort the other). - **No `spc_processor.py` change**: it already threads `outlook.day` through dedup/dispatch and its `fire_outlook_texts` dict already held both `{1, 2}` slots, so Day-2 outlooks (and the previously-dead Day-2 text) now flow through automatically. - README: fire coverage documented as Day 1-2. ## Transition note The Day-1 fire `product_id` changes from `FIRE_...` to `D1_FIRE_...`, so its dedup id changes. If a CRIT/EXTR **Day-1** fire outlook happens to be active at deploy time, it could be re-notified once. Fire CRIT/EXTR outlooks are rare and issued daily, so this one-time transition is low-risk. ## Testing Full suite green on the dev server: **661 passed** (3 new SPC tests: Day-1 and Day-2 parse/product_id, and `fetch_fire_outlooks` fetching both layers). Closes #63 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Add SPC fire-weather Day 2 outlook; retire the dead Day-2 plumbing (#63)
All checks were successful
CI / test (pull_request) Successful in 4m13s
85a7ff1cb1
F-24: only Day-1 fire geometry was fetched (_parse_fire_feature hardcoded
day=1), so no fire outlook could ever match Day 2 — yet fetch_spc_fire_outlook_text(2)
was fetched every poll into a dict slot day-2 could never index. Decision was to
ADD Day 2 (matches the Day 1/2/3 convective coverage), making that fetch live.

- SPC_FIRE_LAYER_URLS now maps day 1 -> MapServer layer 1 and day 2 -> layer 4
  ("Day 2 Outlook"), verified against the SPC firewx service metadata.
- _parse_fire_feature(day, feature) takes the day (was hardcoded 1); product_id
  is now D{day}_FIRE_... mirroring the convective D{day}_ convention.
- fetch_fire_outlooks() loops both layers with per-day freshness recording and
  per-day try/except so one day's fetch failure doesn't abort the other.
- spc_processor.py needs no change: it already threads outlook.day through
  dedup/dispatch and its fire_outlook_texts dict already had the {1,2} slots, so
  Day-2 outlooks (and the previously-dead Day-2 text) now flow through.
- README: fire coverage documented as Day 1-2.

Transition note: the Day-1 fire product_id changes from FIRE_... to D1_FIRE_...,
so a CRIT/EXTR Day-1 fire outlook active at deploy could be re-notified once.
Fire CRIT/EXTR outlooks are rare and daily, so this one-time transition is
low-risk.

Full suite green on the dev server: 661 passed (3 new SPC tests).

Closes #63

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
claude-bot deleted branch feat/v1.4.0-phase2-firday2 2026-07-19 04:08:52 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/WeatherBot!108
No description provided.