# Changes Internals This document describes the implemented structured change comparison boundary. ## Purpose `internal/changes` compares current and prior structured briefing snapshots and produces compact change records for prompt input data packages. ## Inputs and Outputs Inputs: - prior Daily briefing package - current Daily briefing package - configured Recent Changes thresholds Output: - ordered `changes.Change` records with type, message, previous value, and current value where useful ## Boundaries - This package compares structured briefing data only. - It does not read state directly, render Markdown, invoke `scriptorium`, or compare generated report text. ## Config Fields Used The app maps these config fields into comparison thresholds: - `recent_change.temperature_degrees` - `recent_change.precip_probability_points` - `recent_change.wind_gust_miles_per_hour` - `recent_change.precip_timing_shift_minutes` ## Behavior Daily comparison currently detects: - temperature changes crossing configured thresholds - precipitation probability and timing changes - alert additions and removals - peak wind gust changes - snow, ice, and thunder risk changes When no prior comparable snapshot exists, the app sends an empty Recent Changes section in the data package. ## Failure Behavior Daily comparison requires both inputs to contain Daily briefing content. ## Tests Inspect: - `internal/changes/daily_test.go` - `internal/app/app_test.go` ## Invariants - Recent Changes are based on structured snapshots, not Markdown report text. - Comparison thresholds come from configuration. - The comparison output remains compact enough for prompt input.