11 KiB
Near-Term Report Roadmap
Purpose
This roadmap defines planned work to add a rolling near_term report focused
on the next several hours. The feature is not implemented yet, so this document
lives under docs/roadmap/.
The goal is a frequently generated report that helps readers understand what matters in the immediate future: current conditions, hourly evolution, precipitation timing, applicable hazards, applicable SPC risk products, and the most relevant short-term narrative context.
Target Behavior
Add a generated report with:
- report ID:
near_term - display name:
Near-Term Report - prompt ID:
weather.near_term_report - artifact group:
near-term - batch output name:
near-term.md - default valid-period length: 6 hours
- valid period:
[generation_time, generation_time + nearTermHours)
The report should use a package-owned constant for the valid-period length, for example:
const nearTermHours = 6
Do not make the duration configurable in the first implementation. The constant exists so the value can be changed later to 4 or 8 hours without changing valid-period logic in multiple places.
Locked Decisions
- The report ID is
near_term. - The report is rolling and generation-time anchored, not civil-day anchored.
- The first implementation covers the next 6 hours through a constant.
- The report should be generated explicitly by CLI command before deciding whether it belongs in scheduled batches.
- The first implementation should declare
rolling_windowcomparison policy but should not emit Recent Changes output fornear_term. - Alert and SPC products should be included only when their valid periods overlap the resolved near-term report period.
- SPC discussion text should keep the existing categorical-risk threshold rule and should still require overlap with the near-term report period.
- The AFD stanza should include key messages and short term text by default.
- Daily-only modules should not be forced into this report.
Report Definition
Add a report definition under internal/report, preferably in a focused
near_term_report.go file.
Definition fields:
ID:NearTermName:Near-Term ReportPromptID:weather.near_term_reportComparisonStrategy:rolling_windowArtifactGroup:near-termBatchOutputName:near-term.mdGenerated:trueCompatiblePriorIDs:[]ID{NearTerm}Modules: near-term module list belowresolve: rolling near-term resolver
Valid-period resolver:
func resolveNearTerm(req ResolveRequest) (timeutil.Period, error) {
localNow := req.Now.In(req.Location)
return timeutil.Period{
Start: localNow,
End: localNow.Add(nearTermHours * time.Hour),
}, nil
}
The implementation should use idiomatic package-local constants and avoid duplicating duration literals in tests or app code.
Default Module Composition
Default module order should be:
metadatacurrent_conditionshourly_forecastprecip_timingalert_digestspc_convective_outlooksarea_forecast_discussionspc_convective_discussionweather_story
area_forecast_discussion should use options equivalent to:
sections:
- key_messages
- short_term
Do not include these daily/daypart-oriented modules initially:
derived_daily_summaryderived_daypart_summariesoutdoor_windowstomorrow_planning
If the report needs deterministic summary facts later, add a purpose-built
module such as derived_near_term_summary rather than stretching daily modules
into a rolling sub-daily context.
Prompt Package Shape
The existing prompt-input category layout should remain unchanged:
applicable_risk_productsderived_summariesnarrative_productsraw_data
Near-term output is expected to emphasize:
current_conditionsandhourly_forecastunderraw_dataprecip_timingunderderived_summariesalert_digestandspc_convective_outlooksunderapplicable_risk_productsarea_forecast_discussion,spc_convective_discussion, andweather_storyundernarrative_products
Module interval fields should use the existing prompt-facing
period_begins / period_ends convention.
Overlap And Filtering Rules
Hourly forecast:
- use only hourly periods overlapping the near-term valid period;
- preserve hourly period order;
- do not include the full daily forecast.
Narrative products:
- AFD key messages and short term text may be included because the AFD is an official short-term forecast discussion product;
- narrative forecast periods are not included by default unless a later prompt test shows they improve near-term output.
Alerts:
- include active alert overlaps only when the alert overlaps the near-term valid period;
- if alerts were checked successfully and no alerts overlap, emit checked empty alert context through existing module behavior.
SPC outlooks:
- include only retained outlooks whose valid periods overlap the near-term valid period;
- do not include non-overlapping outlooks even if they are severe;
- keep current prompt-facing field exclusions for geometry, severity rank, expiration time, and source URL.
SPC discussion:
- include discussion only for SPC days where a retained overlapping categorical
outlook has severity rank at least
3; - do not include discussion for low-risk, non-categorical-only, or non-overlapping outlooks.
Weather story:
- include when available under current optional-source behavior;
- do not require the story valid period to exactly match the near-term period unless later testing shows stale stories are a problem.
Implementation Stages
Stage 1: Report Registry
Goal: add the near_term report definition and valid-period resolver.
Files to inspect or update:
internal/report/definition.gointernal/report/registry.gointernal/report/period.go- new
internal/report/near_term_report.go internal/report/period_test.godocs/internal/report-registry.mdafter implementation
Acceptance criteria:
report.DefaultRegistry().Lookup(report.NearTerm)succeeds.report.Registry.All()includes the report in a stable order.- resolving the report at a fixed generation time produces a half-open six-hour period.
- report metadata and RunID include
near_term.
Stage 2: Module Compatibility And Defaults
Goal: allow existing relevant modules to build for near_term and define the
default near-term composition.
Files to inspect or update:
internal/briefing/modules.gointernal/report/near_term_report.gointernal/briefing/*_module_test.gointernal/module/module_test.go
Acceptance criteria:
- all default near-term modules validate and build from appropriate test facts;
- daily-only modules remain incompatible unless intentionally expanded;
area_forecast_discussiondefaults to key messages and short term only for this report.
Stage 3: Derived Facts
Goal: make internal/facts derive report-period facts for near_term.
Files to inspect or update:
internal/facts/facts.gointernal/facts/facts_test.gointernal/forecastselection helpers, if needed
Acceptance criteria:
- valid-period hourly periods are sliced to the six-hour window;
- precipitation timing is built from that six-hour hourly slice;
- alert overlaps use the near-term valid period;
- SPC outlook and discussion derivation use the near-term valid period;
- no daily summaries or daypart summaries are required for the default near-term module set.
Stage 4: CLI And App Wiring
Goal: add explicit generation support without changing existing commands.
Files to inspect or update:
internal/appinternal/clicmd/weatherreporter/main.godocs/cli.mdafter implementation
Expected command:
weatherreporter generate near-term [--config PATH] [--units VALUE] [--tz NAME] [--out PATH]
Acceptance criteria:
- command maps to
report.NearTerm; - no
--date,--start, or--endflags are added for this report; - existing
generate daily,generate tomorrow,generate three-day,generate weekend, andgenerate stormbehavior is unchanged; - CLI help lists the new command.
Stage 5: Prompt Input And State Coverage
Goal: prove the managed module snapshot and data package contain the intended near-term stanzas.
Files to inspect or update:
internal/app/app_test.gointernal/promptinputinternal/state
Acceptance criteria:
- generated module snapshot includes the near-term default module list in order;
- data package uses existing categories;
- alert/SPC stanzas are omitted or checked-empty according to current module behavior and valid-period overlap;
- report metadata preserves canonical
valid_period; - module interval labels use
period_beginsandperiod_ends.
Stage 6: Documentation And Examples
Goal: document implemented behavior only after the code exists.
Files to inspect or update after implementation:
docs/cli.mddocs/internal/report-registry.mddocs/internal/module.mddocs/internal/facts.mddocs/internal/briefing.mddocs/config.mdonly if report module overrides need an example updateexamples/config.ymlonly if it lists report module overrides
Acceptance criteria:
- non-roadmap docs describe
near_termonly after implementation; - future or deferred near-term summary modules remain under roadmap docs;
- examples, if updated, load through existing config tests.
Test Plan
Focused tests:
go test ./internal/report ./internal/briefing ./internal/facts
go test ./internal/app ./internal/cli ./internal/promptinput
Full validation:
go test ./...
go run ./cmd/weatherreporter --help
git diff --check
Important coverage:
- six-hour valid-period resolution from a fixed generation time;
- timezone-aware period start and end;
- no civil-day truncation;
- hourly periods selected by overlap with the rolling window;
- alert overlap filtering;
- SPC outlook filtering by overlap;
- SPC discussion filtering by overlap plus categorical severity threshold;
- AFD key messages and short term included;
- daily-only modules rejected or absent from default near-term composition;
- distributor bundle path templates render sensibly for a sub-daily report, especially valid start time variables.
Deferred Work
Do not include these in the first implementation:
- user-configurable near-term duration;
- adding
near_termto scheduled morning or evening batches; - a dedicated
derived_near_term_summarymodule; - narrative forecast periods by default;
- separate AFD section modules;
- near-term-specific Recent Changes comparison output;
- CLI flags for custom near-term duration.
Open Questions
None block the roadmap.
Recommendation: implement the first version as explicit generate near-term
only, with no scheduled batch membership. That keeps the user-visible behavior
small while the prompt and generated report are tested.
Viable alternative: add near_term to a frequent scheduled batch immediately.
That may be useful operationally, but it should wait until the report cadence
and downstream distributor behavior are clear.