Files
weatherreporter/docs/internal/generatedtext.md

2.3 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 first implemented contract is the Hourly Report.

Inputs And Outputs

Inputs:

  • raw Hourly Report GeneratedText JSON
  • report metadata from internal/briefing
  • a module snapshot from internal/module
  • validated hourly generated text

Outputs:

  • typed Hourly generated text
  • normalized stable JSON for validated hourly generated text
  • typed HourlyRenderContext values for internal/reporttemplate

The hourly generated text JSON accepts:

{
  "summary": "string",
  "timing": "string",
  "impacts": "string",
  "confidence": "string"
}

summary, timing, and impacts are required after trimming whitespace. confidence is 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 hourly fields fail after trimming whitespace.
  • Missing required render-context stanzas fail with the stanza name.
  • Invalid render metadata, including missing timezone, missing generated time, or invalid valid period, fails before template rendering.

Tests

Inspect:

  • internal/generatedtext/hourly_test.go
  • internal/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.