# Changelog ## 0.2.0 — 2026-10-19 Closes the gaps between `SCOPE.md` and `INTENT.md` (WEBFETCH-WP-0002). ### Added - Replay: `--replay DIR` / `run_spec(..., replay_dir=)` serves every URL from a cache written by `--cache`, without network access; payload hashes are verified and the original retrieval time is kept, so a replayed run reproduces the original observations. Uncached URLs become `error`. - HTTP `Last-Modified` is recorded as `published` for the `http_json`, `http_csv` and `xlsx_wide` adapters, and stored in the cache index. - `period_format` (default `auto`) and `value_type` spec fields. - Opt-in live smoke test: `WEB_FETCHER_LIVE=1 python3 -B -m unittest tests.test_live`. ### Changed (may affect existing specs) - A value is never returned without a source: an `ok` observation from a spec without `source` becomes `error` (the Eurostat adapter names its own). - "Latest" period is chosen by parsed period order (year, month, date, quarter, semester, week, fixed-width digits). Mixed or unrecognised formats are an `error` unless `period_format` is set (`string` = lexicographic). The rule used is stated in the observation `note`. - Non-numeric values are `not_found` unless `value_type: string`; `.` is also treated as a missing marker. Ambiguous matches (several CSV rows with different values for the latest period, or several XLSX rows) are `error`. - Retries only on connection errors, timeouts and HTTP 429/5xx, with exponential backoff (1.5 s, 3 s) or the server's `Retry-After` (capped at 120 s); other HTTP errors fail immediately. Verified: all 31 assembly-economics checkpoint specs give identical status/value/period to 0.1.0, and a replay of the cached run is byte-identical. ## 0.1.0 — 2026-10-12 Initial release: Observation records, Eurostat / JSON / CSV / wide-XLSX adapters, write-only payload cache, CLI.