@@ -5,6 +5,50 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55
66## [ Unreleased]
77
8+ ## [ 0.8.0] - 2026-05-17
9+
10+ ### Added
11+ - ** Offline forecasting past the bundled data.** New ` Timeprice::Forecast `
12+ module: ` CpiForecaster.project ` and ` FxForecaster.project ` use a
13+ trailing-window CAGR for the point estimate and ±1σ of year-over-year
14+ changes for the band. Pure-Ruby, deterministic, no network calls or
15+ stats dependencies. Defaults: 10-year window for CPI, 5-year for FX;
16+ horizon caps 5y CPI / 2y FX (caps raise ` horizon_exceeds_cap `
17+ warnings, they don't block). ` Forecast::Result ` is a frozen value
18+ object with ` value ` , ` low ` , ` high ` , ` projection_method ` , ` sigma_pct ` ,
19+ ` last_known_date ` , ` target_date ` , ` horizon_months ` , ` basis_kind ` ,
20+ ` warnings ` . ` Timeprice.forecast(...) ` is the public dispatcher.
21+ - ` Timeprice.compare ` accepts ` forecast: true ` ; when the target date
22+ is past the bundled CPI window the result carries a populated
23+ `forecast: { basis_kind:, projection_method:, window_years:,
24+ sigma_pct:, last_known_date:, horizon_months:, low:, high:,
25+ warnings: }` block and ` granularity: : forecast `.
26+ - CLI: ` timeprice compare --forecast ` prints the range, basis, and
27+ caveats; ` --json ` exposes the same fields machine-readably.
28+ - ` Timeprice::Compare.series_for(from:, to:, forecast:, amount:) ` returns
29+ annual sample points for the chart strip; forecast points carry
30+ ` :low ` / ` :high ` for the ±1σ band.
31+ - ` rake forecast:backtest ` reports per-country MAPE for the bundled
32+ data with assertions, so accuracy regressions are caught in CI.
33+
34+ ### Web calculator
35+ - Inline ** 📈 Forecast this date** affordance replaces the old form-level
36+ checkbox. It only appears when the entered target year is past the
37+ destination country's bundled CPI window. Clicking toggles
38+ ` state.form.forecast ` and re-computes; the toggle round-trips through
39+ the existing ` &forecast=1 ` URL param.
40+ - New SVG strip beneath the result paints the measured polyline, the
41+ dashed forecast line, a striped ±1σ fan, and tick labels — answers
42+ "how did we get this number?" visually.
43+ - Amount input now carries locale thousands separators with a
44+ caret-preserving live formatter; ` parseAmount ` strips them before
45+ parsing.
46+ - From/To rows reflow to ` label + currency (60%) + 'in' + date (40%) `
47+ on a single line, all three form rows ending at the same right edge.
48+ - Footer meta line ("refreshed …, gem v…") now hydrates from
49+ ` Timeprice.metadata ` at boot; the HTML carries placeholders only, so
50+ releases no longer hand-edit the index.
51+
852### Changed
953- ` thor ` is now a development dependency, not a runtime dependency. The
1054 CLI (` exe/timeprice ` ) still works exactly as before, but users who only
0 commit comments