From 16680e3f6166a422a2be072a165a6912b277d70f Mon Sep 17 00:00:00 2001 From: Eric Rakestraw Date: Fri, 12 Jun 2026 14:58:14 +0000 Subject: [PATCH] Route SPC convective stanzas in prompt packages --- docs/internal/prompt-input.md | 2 ++ internal/promptinput/package.go | 2 ++ internal/promptinput/package_test.go | 44 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/docs/internal/prompt-input.md b/docs/internal/prompt-input.md index fcda0da..3c0c77c 100644 --- a/docs/internal/prompt-input.md +++ b/docs/internal/prompt-input.md @@ -41,6 +41,7 @@ briefing: metadata: {} applicable_risk_products: alert_digest: {} + spc_convective_outlooks: {} derived_summaries: derived_daily_summary: {} derived_daypart_summaries: {} @@ -49,6 +50,7 @@ briefing: narrative_products: narrative_forecast: {} area_forecast_discussion: {} + spc_convective_discussion: {} weather_story: {} raw_data: current_conditions: {} diff --git a/internal/promptinput/package.go b/internal/promptinput/package.go index b1f0ba5..c82dc7a 100644 --- a/internal/promptinput/package.go +++ b/internal/promptinput/package.go @@ -35,6 +35,7 @@ var briefingCategoryOrder = []string{ var briefingStanzaCategories = map[string]string{ string(module.AlertDigest): categoryApplicableRiskProducts, + string(module.SPCConvectiveOutlooks): categoryApplicableRiskProducts, string(module.DerivedDailySummary): categoryDerivedSummaries, string(module.DerivedDaypartSummaries): categoryDerivedSummaries, string(module.PrecipTiming): categoryDerivedSummaries, @@ -42,6 +43,7 @@ var briefingStanzaCategories = map[string]string{ string(module.TomorrowPlanning): categoryDerivedSummaries, string(module.NarrativeForecast): categoryNarrativeProducts, string(module.AreaForecastDiscussion): categoryNarrativeProducts, + string(module.SPCConvectiveDiscussion): categoryNarrativeProducts, string(module.WeatherStory): categoryNarrativeProducts, string(module.CurrentConditions): categoryRawData, string(module.HourlyForecast): categoryRawData, diff --git a/internal/promptinput/package_test.go b/internal/promptinput/package_test.go index 4695f9f..e43585b 100644 --- a/internal/promptinput/package_test.go +++ b/internal/promptinput/package_test.go @@ -164,6 +164,50 @@ func TestMarshalYAMLIsDeterministicAndGroupsNamedStanzas(t *testing.T) { } } +func TestMarshalYAMLPlacesSPCConvectiveStanzasInPromptCategories(t *testing.T) { + req := validBuildRequest(t) + req.Modules = snapshotWithOutputs(t, + module.Output{ID: module.Metadata, StanzaName: "metadata", Value: map[string]string{"run_id": req.Metadata.RunID}}, + module.Output{ID: module.SPCConvectiveDiscussion, StanzaName: string(module.SPCConvectiveDiscussion), Value: map[string]any{"discussions": []string{"day1"}}}, + module.Output{ID: module.SPCConvectiveOutlooks, StanzaName: string(module.SPCConvectiveOutlooks), Value: map[string]any{"outlook_count": 1}}, + ) + + pkg, err := Build(req) + if err != nil { + t.Fatalf("Build() error = %v", err) + } + data, err := MarshalYAML(pkg) + if err != nil { + t.Fatalf("MarshalYAML() error = %v", err) + } + text := string(data) + + riskIndex := strings.Index(text, " applicable_risk_products:\n") + outlookIndex := strings.Index(text, " spc_convective_outlooks:\n") + narrativeIndex := strings.Index(text, " narrative_products:\n") + discussionIndex := strings.Index(text, " spc_convective_discussion:\n") + if riskIndex < 0 || outlookIndex < 0 || narrativeIndex < 0 || discussionIndex < 0 { + t.Fatalf("YAML output missing SPC convective category placement:\n%s", text) + } + if !(riskIndex < outlookIndex && outlookIndex < narrativeIndex && narrativeIndex < discussionIndex) { + t.Fatalf("YAML output placed SPC convective stanzas in wrong order:\n%s", text) + } + if strings.Contains(text, " raw_data:\n spc_convective") || strings.Contains(text, " derived_summaries:\n spc_convective") { + t.Fatalf("YAML output placed SPC convective stanzas in wrong category:\n%s", text) + } + + loaded, err := LoadYAML(data) + if err != nil { + t.Fatalf("LoadYAML() error = %v", err) + } + if _, ok := loaded.Briefing.Values[string(module.SPCConvectiveOutlooks)]; !ok { + t.Fatal("loaded package missing spc_convective_outlooks stanza") + } + if _, ok := loaded.Briefing.Values[string(module.SPCConvectiveDiscussion)]; !ok { + t.Fatal("loaded package missing spc_convective_discussion stanza") + } +} + func TestLoadYAMLRoundTrip(t *testing.T) { pkg, err := Build(validBuildRequest(t)) if err != nil {