# Changes Internals This document describes structured Recent Changes comparison. ## Purpose `internal/changes` compares current and prior briefing packages and emits compact change records for prompt input data packages. ## Inputs And Outputs Inputs: - prior briefing package - current briefing package - comparison thresholds from configuration Outputs: - ordered `changes.Change` items with type, message, previous value, and current value where useful ## Boundaries - This package compares structured briefing data only. - It does not read filesystem state, find prior snapshots, render Markdown, invoke Scriptorium, or compare generated report text. ## Config Fields Used The app maps these 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` ## External Adapters Used None. ## State Or Manifest Behavior None directly. The app loads prior briefing snapshots through `internal/state` before calling comparison functions. ## Skip And Resume Behavior No resume behavior. When the app has no prior comparable snapshot, it sends an empty Recent Changes list without calling a comparison function. ## Failure Behavior - Daily comparison requires both inputs to contain Daily briefing content. - 3-Day comparison requires both inputs to contain 3-Day briefing content. - Weekend comparison requires both inputs to contain Weekend briefing content. - Storm Report currently has no comparison implementation, so the app leaves Recent Changes empty for Storm reports. ## Tests Inspect: - `internal/changes/daily_test.go` - `internal/changes/three_day_test.go` - `internal/changes/weekend_test.go` - `internal/app/app_test.go` ## Invariants - Recent Changes are based on structured snapshots, not Markdown report text. - Report compatibility is determined outside this package by report definitions and state lookup. - Output stays compact enough for prompt input.