Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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`
Expand Down Expand Up @@ -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
Expand Down