3.0 KiB
Generated Text Internals
This document describes structured generated-text handling in
internal/generatedtext.
Purpose
internal/generatedtext validates structured text returned for
generated-text-template reports and builds curated render contexts for
templates. The implemented contracts are Tomorrow Report and Hourly Report.
Inputs And Outputs
Inputs:
- raw GeneratedText JSON for Tomorrow Report or Hourly Report
- report metadata from
internal/briefing - a module snapshot from
internal/module - validated generated text
Outputs:
- typed
Tomorrowgenerated text - typed
Hourlygenerated text - normalized stable JSON for validated generated text
- typed
TomorrowRenderContextvalues forinternal/reporttemplate - typed
HourlyRenderContextvalues forinternal/reporttemplate
The hourly generated text JSON accepts:
{
"summary": "string",
"forecast_discussion": "string",
"precipitation_timing": "string",
"confidence": "string"
}
summary and forecast_discussion are required after trimming whitespace.
precipitation_timing and confidence are optional and omitted from normalized
JSON when blank.
The Tomorrow generated text JSON accepts:
{
"summary": "string",
"forecast_discussion": ["string"],
"precipitation_timing": "string",
"confidence": "string"
}
summary is required after trimming whitespace. forecast_discussion must
contain at least one nonblank paragraph after trimming blank items.
precipitation_timing and confidence are optional and omitted from normalized
JSON when blank.
Boundaries
- This package owns typed generated-text validation and render-context shaping.
- It uses typed module snapshot decoding through
module.StanzaValue. - It does not invoke Scriptorium, write state artifacts, choose report definitions, compare snapshots, or render templates directly in production workflows.
- It does not use a Go JSON Schema dependency; schema enforcement in Go is limited to typed JSON decoding, unknown-field rejection, and required-field checks.
Failure Behavior
- Malformed generated-text JSON fails with decode context.
- Unknown generated-text JSON fields fail during decoding.
- Empty required fields fail after trimming whitespace.
- Tomorrow forecast discussion fails when no nonblank paragraphs remain.
- Missing optional render-context stanzas become nil module pointers.
- Invalid render metadata, including missing timezone, missing generated time, or invalid valid period, fails before template rendering.
Tests
Inspect:
internal/generatedtext/hourly_test.gointernal/generatedtext/tomorrow_test.gointernal/generatedtext/render_context_test.go
Invariants
- Render contexts are curated structs, not raw prompt-input packages.
- Required generated text is normalized before downstream artifact storage.
- Missing optional weather narrative stanzas produce empty or fallback render context fields rather than forcing raw module data into templates.