Allstate Check First Forecast

A day with the forecast skill

Whenever the skill mentions a time β€” a storm, a wind advisory, tomorrow's forecast β€” it now always says which day it means: today, tonight, tomorrow morning, or tomorrow night. Below is the same day, told four different times, so you can hear exactly how that changes what's said.

🌬️ A day with a wind advisory

Reno, NV has a wind advisory running from 11am to 2am the next morning. Here's what four different customers hear, depending only on when they happen to ask.

πŸŒ™
The evening before, 9:00 pm
The advisory hasn't started yet β€” it's still a whole day away.
"...a wind advisory will be in effect from 11:00 AM tomorrow morning through 2:00 AM tomorrow night..."
β˜€οΈ
The morning of, 9:00 am
Two hours before it starts.
"...a wind advisory will be in effect from 11:00 AM today through 2:00 AM tonight..."
🌬️
Right in the middle of it, 1:00 pm
It's already going on.
"...a wind advisory will be in effect from 11:00 AM today through 2:00 AM tonight..."
Same sentence as the 9am call β€” and that's correct. Both calls happen on the same day, so "today" and "tonight" mean the same thing either time.
😴
After it's over, 3:00 am
The advisory already ended at 2am.
Nothing about the advisory β€” it's over, so it's simply not mentioned. The customer hears the ordinary forecast instead.

🌀️ An ordinary day, no advisories

No alert, just the regular forecast β€” but the skill always looks ahead, never back at conditions the customer is already in the middle of.

β˜€οΈ
Morning call, 9:00 am
Alexa looks at tonight, tomorrow, and tomorrow night β€” whichever of the three has the most notable weather.
"...there's a chance of thunderstorms tonight, with a high of 85 and a low of 63."
πŸŒ™
Evening call, 8:30 pm
Tonight's own weather is never repeated back β€” only tomorrow counts from here.
"...there's a chance of severe thunderstorms tomorrow evening, with a high of 84 and a low of 55."

βœ… A mix-up we found and fixed

For a little while, that evening call had a bug: if the worse weather was the next night rather than tomorrow's daytime, the skill said "tonight" instead of "tomorrow evening" β€” making weather over a day away sound like it was happening right now.

Before
"...there's a chance of severe thunderstorms tonight..." β€” sounded immediate, but meant over 24 hours away.
After
"...there's a chance of severe thunderstorms tomorrow evening..." β€” correct, and the storm is still mentioned so nobody's caught off guard.

Fixed, tested, and live.

For the engineering team β€” technical detail

Branch fix/forecast-forward-window-and-alert-time-context Β· PR #60 (open) Β· deployed as Lambda version 204, both ETHAN and development aliases.

All 42 configured alert types speak one of two sentence shapes: 13 "until" types (never mention a start time, only when it ends β€” e.g. Tornado Warning) and 29 "from…through" types (speak both a start and an end β€” e.g. Wind Advisory, Severe Thunderstorm Warning). An alert whose start falls beyond the forward window, or that's already expired, is suppressed entirely and the ordinary forecast plays instead.

The ordinary (no-alert) forecast's window size depends on whether "now" falls in a daytime or nighttime NWS block (~6am–6pm vs 6pm–6am): 3 blocks on a morning check, 2 on an evening check. It always picks the most severe block in that window (Thunderstorm > Snow/Ice > Rain > Wind > Cloudy > Sunny); ties keep the nearer block.

The fixed bug: lambda/forecast.js's forwardLabels labeled blocks by position alone β€” the first night-block it saw was always "tonight," regardless of whether "now" was already night. lambda/timeBlocks.js's dayQualifier (used for alerts) already branched correctly on this; forwardLabels just never got the same treatment. Now takes a nowIsDaytime parameter (default true, so the morning-check case is unchanged); when false, the window's one possible night block always reads "tomorrow evening."

Verification: full suite 282/282, live-tip-probe.mjs 252/0, plus a dedicated regression test and a direct read of the deployed Lambda's response.