From ae4d5781448f754f29d09826d93cfa923ddc9649 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 23 Jul 2026 12:43:21 +1000 Subject: [PATCH 1/2] Release v0.9.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves [Unreleased] into a dated 0.9.0 section and closes the gaps that made the section an inaccurate description of what ships. Minor rather than patch: dropping the bare `build-` restore-key changes default restore behaviour for consumers — an environment.yml change is now a genuine cache miss and a cold build, where it previously restored a _build produced by the superseded environment. Marked BREAKING with a migration note, per the 0.x policy in CONTRIBUTING. Two accuracy fixes were needed before this could be tagged honestly: The Anaconda 2026.06 migration had no entry at all, despite being live in `:latest` since 2026-07-08. Added under Changed. The #28 entry stated the baseline is `anaconda=2025.12`, which stopped being true when #95 landed in this same unreleased block. It now points forward to the migration entry rather than asserting a stale baseline. Also logs the dependabot bumps that reached the composite actions — actions/cache v5 to v6 in build-jupyter-cache, restore-jupyter-cache and setup-environment, and action-gh-release v3.0.1 in publish-gh-pages — which are consumer-facing and were previously unlogged. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0d2560..03eff08 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 @@ -60,7 +76,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 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) + pins `anaconda=2025.12` and was unaffected. (#28) — note 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 latest stable release (currently v0.9.0) - **v0.x.x**: Development/testing releases ## Migration from Legacy Workflows From c9ec5b99d5c8630530c96d5fc5807b8ea7cff5ee Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 23 Jul 2026 12:57:58 +1000 Subject: [PATCH 2/2] Address Copilot review on #113 Past-tense the #28 bullet: it asserted the 2025.12 baseline as current fact ('that every lecture repo builds against', 'already pins') while the same release records the move to 2026.06. The forward-pointer alone left two false present-tense claims ahead of it. Drop the version number from the Version History line rather than re-setting it. It was stale at v0.8.0, which is why this PR touched it, and it would have been briefly false again between this merge and the v0 tag move. The latest release is already the topmost dated section. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03eff08..71b1fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,14 +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) — note both images have since moved to the - 2026.06 baseline within this same release; see **Changed** above (#95). + 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` @@ -388,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.9.0) +- **v0**: Tracks the latest stable release — the topmost dated section above - **v0.x.x**: Development/testing releases ## Migration from Legacy Workflows