Weather labels, METAR translation, risk badges, and hero meta chips were still embedded in dashboard-utils even though panel, modal, and detail views use them as focused presentation helpers. This moves them into weather-summary-utils while keeping dashboard-utils re-export compatibility.
Constraint: Preserve existing weather/METAR/risk/hero meta wording.
Rejected: Move airport narrative in the same pass | it has broader AI narrative coupling and should be separated independently.
Confidence: high
Scope-risk: narrow
Reversibility: clean
Tested: TypeScript diagnostics for weather-summary-utils, dashboard-utils, PanelSections, DetailPanel, and FutureForecastModal
Tested: npm run build
Not-tested: Visual snapshot of every weather icon/label combination.
Probability and multi-model view adapters were still embedded in dashboard-utils even though table, panel, modal, and city-card views use them as small pure selectors. This moves them into model-utils and keeps dashboard-utils re-export compatibility.
Constraint: Preserve model/probability return shapes and existing fallback behavior.
Rejected: Merge model-utils with chart-utils | model selectors and chart data preparation change at different rates.
Confidence: high
Scope-risk: narrow
Reversibility: clean
Tested: TypeScript diagnostics for model-utils, dashboard-utils, and PanelSections
Tested: npm run build
Not-tested: Bundle analyzer size comparison.
The intraday chart data builder lived inside dashboard-utils with observation-source and TAF helpers, so chart consumers had to depend on the large dashboard utility surface. This moves chart data preparation, observation-source helpers, and TAF marker labels into focused modules while keeping dashboard-utils re-export compatibility.
Constraint: Preserve existing chart data shape, observation labels, TAF labels, and legacy dashboard-utils exports.
Rejected: Rewrite chart data generation while moving it | this pass is a boundary move only so visual behavior remains stable.
Confidence: high
Scope-risk: moderate
Reversibility: clean
Tested: TypeScript diagnostics for chart-utils, dashboard-utils, observation-source-utils, and taf-utils
Tested: npm run build
Not-tested: Browser visual regression across every chart city.
Pace-adjusted high calculations were embedded in dashboard-utils alongside chart, profile, and modal helpers. This moves the pure pace model and reusable HM time helpers into focused modules while keeping dashboard-utils re-export compatibility for older callers.
Constraint: Preserve existing pace wording, thresholds, and calculation output.
Rejected: Split all remaining dashboard-utils helpers at once | model/chart/modal helpers have wider call surfaces and should move in separate reversible passes.
Confidence: high
Scope-risk: narrow
Reversibility: clean
Tested: TypeScript diagnostics for pace-utils, time-utils, dashboard-utils, and FutureForecastModal
Tested: npm run build
Not-tested: Bundle analyzer size comparison.
Temperature formatting was embedded in the large dashboard utility module, so small scan-terminal views had to import the heavy utility surface for simple labels. This moves the pure temperature helpers into a lightweight module while keeping dashboard-utils re-exports for compatibility.
Constraint: Preserve existing temperature text output and all dashboard-utils import compatibility.
Rejected: Split chart, pace, and model helpers in the same pass | those helpers have wider coupling and should move one boundary at a time.
Confidence: high
Scope-risk: narrow
Reversibility: clean
Tested: TypeScript diagnostics for temperature-utils, dashboard-utils, and OpportunityTable
Tested: npm run build
Not-tested: Bundle analyzer size comparison.