Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
4e8f8d3
test(oracle): pin conjugate MLL, predict, and LOOCV to closed form
thomaspinder Aug 5, 2026
0ff8f2d
test(equivalence): pin cross-derivation agreement; xfail two-owner ji…
thomaspinder Aug 5, 2026
d195be8
test(integration): fail loudly when golden values drift
thomaspinder Aug 5, 2026
5d96ee2
test(integration): re-pin golden values to current-main behaviour
thomaspinder Aug 5, 2026
880c58f
feat(linalg): stabilised_cholesky — single stabilise-and-factor seam
thomaspinder Aug 5, 2026
5814aa3
feat(dataset): static n_total metadata; get_batch stamps full size
thomaspinder Aug 5, 2026
8c7ba10
feat(likelihoods)!: pure conditional families — drop num_datapoints a…
thomaspinder Aug 5, 2026
9b9a43c
feat!: v1.0 conditioning architecture — JointModel, Posterior, condition
thomaspinder Aug 5, 2026
b5c9884
refactor!: rename sweep — tests, benchmarks, examples onto the v1.0 API
thomaspinder Aug 6, 2026
1ce4ca1
style: ruff format after the rename sweep
thomaspinder Aug 6, 2026
f113932
docs: v1.0 migration guide, CONTEXT.md glossary, ADR-0001
thomaspinder Aug 6, 2026
bb44a85
docs: self-contained migration snippets
thomaspinder Aug 6, 2026
78debf3
test(equivalence): pin predict/MLL same-matrix consistency at non-def…
thomaspinder Aug 6, 2026
72a7212
docs: fix Sphinx build for the v1.0 API
thomaspinder Aug 6, 2026
84a133e
feat(natural-gradients): add fit_natgrads and exponential-family mach…
thomaspinder Jul 26, 2026
12fa290
fix(natural-gradients): address review findings on PR#1
thomaspinder Jul 26, 2026
bc74e69
refactor(natgrads): adapt to the v1.0 conditioning API
thomaspinder Aug 6, 2026
d53c808
docs(fit): replace Markdown code fences with RST doctest block in fit…
thomaspinder Aug 6, 2026
6799c39
docs(examples): add dual/t-SVGP tutorial notebook and wire docs nav
thomaspinder Jul 27, 2026
40f8985
docs(examples): address dual notebook review findings
thomaspinder Jul 27, 2026
ada0f1d
refactor(variational)!: remove NaturalVariationalGaussian and Expecta…
thomaspinder Jul 26, 2026
d8cb621
feat(variational): add DualVariationalGaussian and dual_elbo (t-SVGP)
thomaspinder Jul 27, 2026
413f03c
docs(examples): add natural gradients tutorial notebook
thomaspinder Jul 27, 2026
6060a74
fix(examples): avoid markdown-katex crash in the dual notebook
thomaspinder Jul 27, 2026
2410564
fix(variational): address PR#2 review findings
thomaspinder Jul 26, 2026
df14c6e
fix(variational): address PR#3 review findings
thomaspinder Jul 27, 2026
c5a2edd
docs(examples): address natgrads notebook review findings
thomaspinder Jul 27, 2026
3337bec
fix(natural-gradients): address whole-stack review findings
thomaspinder Jul 27, 2026
21c4ec0
refactor(natgrads): adapt vestigial-family removal to the v1.0 API
thomaspinder Aug 6, 2026
0fbe545
refactor(natgrads): adapt DualVariationalGaussian and dual_elbo to th…
thomaspinder Aug 6, 2026
1c0555e
refactor(natgrads): adapt natural-gradients notebook to the v1.0 API
thomaspinder Aug 6, 2026
c6d2bce
refactor(natgrads): adapt dual notebook to the v1.0 API
thomaspinder Aug 6, 2026
75aa6a3
feat(conditioning): add sparse and collapsed conditioning modes
thomaspinder Aug 6, 2026
5368ad1
refactor(variational)!: families condition through the conditioning m…
thomaspinder Aug 6, 2026
9af3f0d
test(variational): rename sweep, jitter relocation, xfail flip, confo…
thomaspinder Aug 6, 2026
8a17448
docs(examples): posterior -> model rename and jitter relocation
thomaspinder Aug 6, 2026
cc8bf6c
docs(records): variational universalisation in CONTEXT, ADR-0001, mig…
thomaspinder Aug 6, 2026
b8acedf
style: ruff-clean the safety-net test files
thomaspinder Aug 6, 2026
9032188
refactor!: complete the conditioning contract — uniform signature, Ka…
thomaspinder Aug 7, 2026
6860548
docs(api): Google-convention docstrings and RST across the natgrads s…
thomaspinder Aug 7, 2026
4690ff4
test: close the verification gaps the review found
thomaspinder Aug 7, 2026
26e4e92
docs(records): state what "universal" means as shipped
thomaspinder Aug 7, 2026
dbfce06
refactor(oilmm)!: bring OILMM onto the conditioning contract
thomaspinder Aug 7, 2026
0549b8e
test(oilmm): migrate callers and pin contract conformance
thomaspinder Aug 7, 2026
a451c1d
docs(records): OILMM is on the contract
thomaspinder Aug 7, 2026
2f61a30
docs(oilmm): migrate the latent-space cell onto the conditioning cont…
thomaspinder Aug 7, 2026
943cb19
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
13cc134
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
f270f9c
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
e5ca1a2
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
8f1c3f9
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
466b474
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
3547786
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
90fca3c
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
04cd4f1
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
4e10dd5
ci(security): scan every PR, not only those targeting main
thomaspinder Aug 7, 2026
b49e11a
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
46be309
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
58e8845
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
23c2067
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
9eae480
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
35f470d
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
8bc89d3
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
2e4cb84
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
9ec5abb
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
2f19b8d
ci(security): exclude TruffleHog's Lob detector, which flags pytest n…
thomaspinder Aug 7, 2026
74a9106
Merge pull request #743 from thomaspinder/v1-01-safety-net
thomaspinder Aug 7, 2026
a10023e
Merge pull request #744 from thomaspinder/v1-02-conditioning
thomaspinder Aug 7, 2026
5952b01
Merge pull request #714 from thomaspinder/natgrads-01-core
thomaspinder Aug 7, 2026
4e48381
Merge pull request #715 from thomaspinder/natgrads-02-remove-vestigial
thomaspinder Aug 7, 2026
ad484a1
Merge pull request #716 from thomaspinder/natgrads-03-dual
thomaspinder Aug 7, 2026
0d4e800
Merge pull request #729 from thomaspinder/natgrads-04-notebook-natgrads
thomaspinder Aug 7, 2026
70f0e16
Merge pull request #730 from thomaspinder/natgrads-05-notebook-dual
thomaspinder Aug 7, 2026
76f2d5e
Merge pull request #745 from thomaspinder/v1-03-variational
thomaspinder Aug 7, 2026
a321ec0
Merge pull request #748 from thomaspinder/v1-04-review-fixes
thomaspinder Aug 7, 2026
41079b4
Merge pull request #749 from thomaspinder/v1-05-oilmm-conditioning
thomaspinder Aug 7, 2026
7e832b6
fix(oilmm)!: default OILMMPosterior covariance to "diagonal"
thomaspinder Aug 7, 2026
9477f88
feat(conditioning): extend pathwise sampling to SparsePosterior (#673)
thomaspinder Aug 7, 2026
984d0b2
feat(state-space): dense joint predictive covariance for the smoothed…
thomaspinder Aug 7, 2026
40380f4
feat(state-space): support TruncatedPeriodic x Matern product SDEs
thomaspinder Aug 7, 2026
87a642c
fix(linalg): register has_unit_diagonal for BlockDiag and Kronecker o…
thomaspinder Aug 7, 2026
f59b2d6
fix(state-space): make rts_smoother a genuine QR square-root smoother
thomaspinder Aug 7, 2026
ee650d9
fix(kernels): make gram() delegate to _gram, closing RFF double-compu…
thomaspinder Aug 7, 2026
03afcb9
fix(kernels): honest field defaults so RBF() type-checks, drop stale …
thomaspinder Aug 7, 2026
7f24998
refactor(kernels): merge _newton_girard and _newton_girard_matrices (…
thomaspinder Aug 7, 2026
dd31c67
ci(bench): wire bench-check into all-tests poe sequence
thomaspinder Aug 7, 2026
4608ff1
fix(state-space): adapt #669's new quasi-periodic test to the v1.0 li…
thomaspinder Aug 7, 2026
348951c
feat(objectives): add with_log_prior for MAP-style regularised fitting
thomaspinder Aug 7, 2026
711dbce
style: ruff-format after porting #515 onto v1.0
thomaspinder Aug 7, 2026
ab5fdbb
feat(likelihoods): add StudentT likelihood for robust regression (#671)
thomaspinder Aug 7, 2026
adff330
Merge branch 'main' into v1.0
thomaspinder Aug 7, 2026
207f7dd
Merge pull request #753 from thomaspinder/fix/709-kl-blockdiag-kronecker
thomaspinder Aug 8, 2026
9bc5936
Merge pull request #754 from thomaspinder/fix/668-rts-sqrt-smoother
thomaspinder Aug 8, 2026
2f9e948
Merge pull request #755 from thomaspinder/fix/682-oilmm-diagonal-default
thomaspinder Aug 8, 2026
c49e3e5
Merge pull request #756 from thomaspinder/fix/679-dead-gram-rff
thomaspinder Aug 8, 2026
95d8c25
Merge pull request #757 from thomaspinder/fix/695-kernel-abstract-final
thomaspinder Aug 8, 2026
76e598c
Merge pull request #758 from thomaspinder/fix/683-merge-newton-girard
thomaspinder Aug 8, 2026
9bfd302
Merge pull request #761 from thomaspinder/fix/671-student-t-likelihood
thomaspinder Aug 8, 2026
42a49df
Merge pull request #764 from thomaspinder/ci/638-bench-check-all-tests
thomaspinder Aug 8, 2026
2b1153a
Merge pull request #762 from thomaspinder/feat/669-quasiperiodic-sde
thomaspinder Aug 8, 2026
18b96b7
Merge pull request #759 from thomaspinder/fix/673-sparse-pathwise-sam…
thomaspinder Aug 8, 2026
683439c
Merge pull request #763 from thomaspinder/fix/515-log-prior-regularis…
thomaspinder Aug 8, 2026
4b3f3d9
Fix bug when unwrapping paramax parameters
Thomas-Christie Aug 8, 2026
6e03833
Merge pull request #767 from Thomas-Christie/unwrap-fix
thomaspinder Aug 9, 2026
1e21d3a
Merge branch 'v1.0' into fix/651-state-space-dense-covariance
thomaspinder Aug 9, 2026
2450b04
Merge pull request #760 from thomaspinder/fix/651-state-space-dense-c…
thomaspinder Aug 9, 2026
6218be7
Simplify bijection logic by solely using val() to tranform parameters
Thomas-Christie Aug 10, 2026
01d364a
Fix Ruff error
Thomas-Christie Aug 11, 2026
9cfe355
Merge pull request #769 from Thomas-Christie/bijector-consolidation
thomaspinder Aug 11, 2026
6b37b02
docs: merge CLAUDE.md into AGENTS.md (#772)
thomaspinder Aug 12, 2026
680f543
ci: wire up the zizmor audit and clear its findings (#773)
thomaspinder Aug 12, 2026
40014fd
Add functionality for MAP estimation of parameters
Thomas-Christie Aug 14, 2026
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
7 changes: 7 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ updates:
day: "monday"
time: "04:00"
timezone: "Europe/Amsterdam"
# Wait a week after a release before proposing it: fresh releases are where
# compromised or yanked packages show up, and nothing here is urgent.
# Security updates are exempt from the cooldown by Dependabot itself.
cooldown:
default-days: 7
open-pull-requests-limit: 10
assignees:
- "thomaspinder"
Expand Down Expand Up @@ -46,6 +51,8 @@ updates:
day: "monday"
time: "04:00"
timezone: "Europe/Amsterdam"
cooldown:
default-days: 7
open-pull-requests-limit: 5
commit-message:
prefix: "ci"
Expand Down
29 changes: 17 additions & 12 deletions .github/workflows/auto-label.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
name: "Automatic Labeling"

on:
# `pull_request_target` is required, not incidental: labelling a PR needs write
# access to the pull request, and the `pull_request` token is read-only for
# fork PRs, which is most of them. The standard danger of this trigger is
# running fork code with a privileged token, so this workflow never checks the
# PR out and never executes anything from it — every step below talks to the
# API only.
on: # zizmor: ignore[dangerous-triggers]
pull_request_target:
types: [opened, synchronize, reopened]
issues:
Expand All @@ -14,20 +20,19 @@
issues: write
pull-requests: write

# No checkout: `actions/labeler` reads .github/labeler.yml through the API,
# and nothing else here touches the working tree.
steps:
- name: Checkout repository
uses: actions/checkout@v7

- name: Auto-label based on files changed
if: github.event_name == 'pull_request'
uses: actions/labeler@v7
if: github.event_name == 'pull_request_target'
uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
configuration-path: .github/labeler.yml

- name: Size labeling for PRs
if: github.event_name == 'pull_request'
uses: codelytv/pr-size-labeler@v1
if: github.event_name == 'pull_request_target'
uses: codelytv/pr-size-labeler@095a41fca88b8764fd9e008ad269bcdb82bb38b9 # v1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
xs_label: 'size/xs'
Expand All @@ -45,7 +50,7 @@

- name: Label ML-specific issues
if: github.event_name == 'issues'
uses: actions/github-script@v9
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const title = context.payload.issue.title.toLowerCase();
Expand Down Expand Up @@ -143,8 +148,8 @@
}

- name: Label PRs based on content
if: github.event_name == 'pull_request'
uses: actions/github-script@v9
if: github.event_name == 'pull_request_target'
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const title = context.payload.pull_request.title.toLowerCase();
Expand Down Expand Up @@ -203,4 +208,4 @@
issue_number: context.payload.pull_request.number,
labels: labels
});
}
}
29 changes: 17 additions & 12 deletions .github/workflows/build_docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ on:
- main
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write
# Pages publication is confined to `deploy-docs`; the build job only reads the
# repository. Keeping `pages`/`id-token` off the workflow level means the
# notebook execution step never runs with a deployment-capable token.
permissions: {}

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand All @@ -30,19 +30,21 @@ jobs:
# Full render on main executes every example notebook for real.
timeout-minutes: 120
runs-on: ubuntu-latest
permissions:
contents: read # checkout, including the asv-results branch
steps:
- name: Check out the code
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v7
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: "3.11"

- name: Install uv
uses: astral-sh/setup-uv@v7
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "latest"
enable-cache: true
Expand All @@ -58,7 +60,7 @@ jobs:
# refuses to overwrite an existing key). Combined with jupyter-cache's
# own content-hash invalidation, this makes the cache accumulate every
# successfully executed notebook instead of freezing partial progress.
uses: actions/cache@v6
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
docs/_build/.jupyter_cache
Expand All @@ -83,15 +85,15 @@ jobs:
# traceback of any failed notebook to <outdir>/reports/<docname>.err.log
# rather than aborting. Nothing else in the deploy log carries it.
if: always()
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: notebook-error-logs
path: docs/_build/html/reports
if-no-files-found: ignore
retention-days: 14

- name: Checkout benchmark results
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: asv-results
path: .asv-results
Expand All @@ -110,7 +112,7 @@ jobs:
continue-on-error: true

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v5
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
with:
path: docs/_build/html

Expand All @@ -123,6 +125,9 @@ jobs:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
pages: write # deploy to GitHub Pages
id-token: write # OIDC verification of the deployment
concurrency:
group: pages
cancel-in-progress: false
Expand All @@ -132,4 +137,4 @@ jobs:
steps:
- name: Deploy documentation
id: deployment
uses: actions/deploy-pages@v5
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
5 changes: 3 additions & 2 deletions .github/workflows/commit-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false

- name: Check commit message format
run: |
Expand Down Expand Up @@ -51,4 +52,4 @@ jobs:
echo "::warning::This is a warning only - PR can still be merged"
else
echo "All commit messages follow conventional commit format ✅"
fi
fi
35 changes: 24 additions & 11 deletions .github/workflows/full_render_notebooks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,39 @@ on:
release:
types: [published]

permissions:
contents: read
issues: write
# Only the failure-reporting job files an issue. The render job itself, which
# executes every example notebook, runs with a read-only token.
permissions: {}

jobs:
full-render:
runs-on: ubuntu-latest
permissions:
contents: read # checkout
timeout-minutes: 90
steps:
- name: Check out the code
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v7
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: "3.11"

# The three cache steps below carry `zizmor: ignore[cache-poisoning]`.
# zizmor flags them because `release: published` makes this a publishing
# workflow, and a cache written under a publishing event can be restored
# by later runs. That is exactly what the guards prevent: caching is
# switched off whenever the run was triggered by a release, so only the
# scheduled and manual runs read or write the cache. zizmor evaluates the
# workflow statically and cannot see through the expression.
- name: Install uv
uses: astral-sh/setup-uv@v7
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 # zizmor: ignore[cache-poisoning]
with:
version: "latest"
enable-cache: true
enable-cache: ${{ github.event_name != 'release' }}

- name: Install docs dependencies
run: uv sync --frozen --extra docs
Expand All @@ -46,7 +55,8 @@ jobs:
# Same accumulate-always cache as build_docs.yml: the Sunday full render
# warms `.jupyter_cache`, so the next production deploy reuses real
# figures instead of re-executing every notebook (or erroring out).
uses: actions/cache@v6
if: github.event_name != 'release' # see the enable-cache note above
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 # zizmor: ignore[cache-poisoning]
with:
path: |
docs/_build/.jupyter_cache
Expand All @@ -64,7 +74,8 @@ jobs:
echo "version=$(uv run --extra docs python -c 'from importlib.metadata import version; print(version("playwright"))')" >> "$GITHUB_OUTPUT"

- name: Restore the Playwright browser cache
uses: actions/cache@v6
if: github.event_name != 'release' # see the enable-cache note above
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 # zizmor: ignore[cache-poisoning]
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.playwright.outputs.version }}
Expand Down Expand Up @@ -92,7 +103,7 @@ jobs:

- name: Upload the link-check report
if: always()
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: docs-linkcheck
path: docs/_build/linkcheck
Expand All @@ -101,10 +112,12 @@ jobs:
open-issue-on-failure:
runs-on: ubuntu-latest
needs: full-render
permissions:
issues: write # open the failure report
if: failure()
steps:
- name: Open GitHub issue
uses: actions/github-script@v9
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const title = `Notebook full render failed (${context.runNumber})`;
Expand Down
10 changes: 7 additions & 3 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

# The job only reads the checkout and runs the integration script.
permissions: {}

jobs:
integration-tests:
name: Run Integration Tests
Expand All @@ -22,17 +25,18 @@ jobs:
fail-fast: true
steps:
- name: Check out the code
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: ${{ matrix.python-version }}

# Install uv
- name: Install uv
uses: astral-sh/setup-uv@v7
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "latest"
enable-cache: true
Expand Down
Loading
Loading