diff --git a/CHANGELOG.md b/CHANGELOG.md index b0d2560..71b1fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.0] - 2026-07-23 + ### Added - **CI**: `test-containers-lectures.yml` and `build-containers.yml` now open (or comment on) a deduplicated tracking issue when they fail, via the new @@ -16,6 +18,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 are appended as comments. Manual `workflow_dispatch` runs are excluded, since those have someone watching. (#103) +### Changed +- **Containers**: Migrated both images to the **Anaconda 2026.06** baseline (`anaconda=2026.06` in + `containers/quantecon/environment.yml`, and the matching linux-64 py313 MKL pin set in the lean + image's explicit stack). This is the baseline the lecture repos build against. The images have + shipped this since 2026-07-08 — it is live in `:latest` and reaches consumers through the image + tag rather than through this release. (#95) +- **build-jupyter-cache, restore-jupyter-cache, setup-environment**: `actions/cache`, + `actions/cache/restore` and `actions/cache/save` moved from `@v5` to `@v6`. (#90) +- **publish-gh-pages**: `softprops/action-gh-release` moved to v3.0.1. (#94) + ### Fixed - **restore-jupyter-cache**: Every output, and the `fail-on-miss` guard, now work with `save-cache: 'true'`. The save-mode step used the top-level `actions/cache@v6`, which declares @@ -26,13 +38,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 through `actions/cache/restore@v6`, and save mode adds an `actions/cache@v6` step with `lookup-only: true` whose only job is to register the job-end save `post:` hook. ⚠️ This is the mode the preview-optimisation work rolls out (#92). (#104) -- **restore-jupyter-cache**: Dropped the bare `build-` restore-key fallback, which made the build - cache impossible to miss — an `environment.yml` change silently restored a `_build` produced by - the old environment instead of missing and rebuilding, contradicting the action's own documented - behaviour. The `build-{env-hash}-{update-hash}-` and `build-{env-hash}-` fallbacks remain, so a - warm start is still found within the same environment. The execution cache keeps its bare - `jupyter-cache-` fallback: `.jupyter_cache` is content-addressed per notebook and revalidates +- ⚠️ **BREAKING** **restore-jupyter-cache**: Dropped the bare `build-` restore-key fallback, which + made the build cache impossible to miss — an `environment.yml` change silently restored a `_build` + produced by the old environment instead of missing and rebuilding, contradicting the action's own + documented behaviour. The `build-{env-hash}-{update-hash}-` and `build-{env-hash}-` fallbacks + remain, so a warm start is still found within the same environment. The execution cache keeps its + bare `jupyter-cache-` fallback: `.jupyter_cache` is content-addressed per notebook and revalidates itself, whereas `_build` carries no record of what produced it. (#104) + + **Migration:** no config change is needed, but the first build after an `environment.yml` change + is now a genuine cache miss and therefore cold. That is the intended behaviour — the warm start it + replaces was reusing build output generated by the superseded environment. - **CI**: The buildx registry layer cache in `build-containers.yml` now resolves. Both `cache-from` refs interpolated `github.repository_owner`, which preserves the `QuantEcon` casing; buildx rejects `ghcr.io/QuantEcon/...` as "repository name must be lowercase" and treats a failed cache @@ -54,13 +70,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 (#103) - **Containers (quantecon-build)**: Pinned the lean image's core scientific stack (numpy, scipy, pandas, matplotlib, seaborn, sympy, numba, networkx, statsmodels, scikit-learn) to the Anaconda - 2025.12 baseline that every lecture repo builds against (via `anaconda=2025.12`), instead of + 2025.12 baseline the lecture repos built against at the time (via `anaconda=2025.12`), instead of resolving to "latest at build time". The unpinned stack drifted ahead of that baseline, yielding non-reproducible images that diverged from what the lectures are tested against; downstream this surfaced as a `CellExecutionError` in `un_insure.md` on repos building on the lean image (the likely trigger being numpy 2.4.0's stricter array-to-scalar conversion, though the exact breaking combination is no longer reproducible on current packages). The full `quantecon` image already - pins `anaconda=2025.12` and was unaffected. (#28) + pinned `anaconda=2025.12` and was unaffected. (#28) — both images have since moved to the 2026.06 + baseline within this same release; see **Changed** above (#95). - **Containers**: Pinned `kaleido<1.0` in both images and dropped the build-time `kaleido.get_chrome_sync()` step. Unpinned, `kaleido` resolved to v1.x, which dropped the bundled chromium and requires a separately provisioned Chrome; the build-time download landed in `/root` @@ -371,7 +388,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Version History -- **v0**: Tracks latest stable release (currently v0.8.0) +- **v0**: Tracks the latest stable release — the topmost dated section above - **v0.x.x**: Development/testing releases ## Migration from Legacy Workflows