Files
weatherreporter/docs/internal/state.md

4.1 KiB

State Internals

This document describes filesystem state in internal/state.

Purpose

internal/state owns managed workspace paths, atomic JSON writes, persisted metadata, prior snapshot lookup, and read-only artifact inspection helpers.

Inputs And Outputs

Inputs:

  • workspace configuration
  • resolved report definition and valid period
  • briefing package
  • prompt input data package
  • preflight artifact
  • rendered report path preparation request
  • RunID for inspection lookups

Outputs:

  • briefing snapshot JSON path
  • prompt input data package JSON path
  • render preflight JSON path
  • managed Markdown report path
  • metadata JSON path
  • prior comparable snapshot metadata
  • loaded briefing or data package
  • recent report records for inspection

Boundaries

internal/state owns local filesystem layout, path validation, durable writes, metadata reads, prior lookup, and report listing. It does not fetch weather data, derive forecasts, build prompt input content, compare briefing contents, invoke Scriptorium, import adapter result types, or parse CLI flags.

Preflight persistence uses the state-owned PreflightArtifact shape. The app converts adapter render results into that shape before saving.

Config Fields Used

  • workspace.root
  • workspace.snapshots_dir
  • workspace.reports_dir
  • workspace.data_packages_dir
  • workspace.preflight_dir
  • workspace.notifications_dir

Workspace subdirectories must be relative paths that stay under workspace.root.

Managed Layout

Paths are derived from the resolved report definition's artifact group, the valid-period start date for JSON artifacts, and the RunID.

<workspace.root>/
  snapshots/<artifact_group>/<YYYY-MM-DD>/<run_id>.briefing.json
  snapshots/<artifact_group>/<YYYY-MM-DD>/<run_id>.metadata.json
  data-packages/<artifact_group>/<YYYY-MM-DD>/<run_id>.data_package.json
  preflight/<artifact_group>/<YYYY-MM-DD>/<run_id>.render.json
  notifications/<artifact_group>/<YYYY-MM-DD>/<run_id>.distributor.json
  reports/<artifact_group>/<run_id>.md

Metadata is stored beside briefing snapshots and links the briefing, data package, preflight, report paths, notification path when attempted, and configured prompt location. Report listing walks metadata files under the snapshots directory.

Prior Lookup

Prior snapshot lookup reads stored metadata through the shared lookup path and selects the latest earlier snapshot whose report ID is compatible with the current report definition.

  • Daily Today and Daily Tomorrow are compatible with each other for the same valid local date.
  • 3-Day Outlook compares with prior 3-Day snapshots for the same valid local date.
  • Weekend Outlook compares with prior Weekend snapshots for the same weekend window.
  • Storm Report currently has no prior lookup because explicit event-window comparison is not searched by the filesystem store.

Writes And Inspection

Durable JSON writes use shared atomic file helpers. Managed Markdown reports are prepared by creating their parent directory; Scriptorium writes the report body to the prepared path. Extra Markdown copies are handled by app orchestration. Distributor notification debug artifacts are written atomically when notification is attempted and include rendered distributor pipeline ID, bundle ID, idempotency key, bundle paths, upload status, latest run status, and redacted errors.

Inspection helpers read existing metadata, briefing, and data package files. Missing metadata directories return no inspection records or no prior snapshot rather than creating state.

Failure Behavior

  • Invalid workspace paths return validation errors.
  • Missing required metadata fields prevent metadata writes.
  • JSON writes use a temporary file followed by rename where practical.
  • Read and decode failures include path context.
  • Unknown RunIDs produce an actionable lookup error.

Tests

Inspect:

  • internal/state/filesystem_test.go
  • internal/app/app_test.go

Invariants

  • Managed paths stay under the configured workspace root.
  • Artifact grouping comes from report definitions.
  • Metadata links artifacts produced for a run.
  • Prior lookup is based on structured metadata, not rendered report text.