From f678bb73133f7910da43fa8156251d2c0ff9114d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Mon, 8 Jun 2026 02:37:41 -0400 Subject: [PATCH 1/2] Auto-populate downgrade skip (stdlibs + in-repo sublibs); default Julia 1.10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The reusable downgrade workflows previously required callers to hand-list every Julia standard library (and, for the sublibrary workflow, every in-repo lib/* package) in the `skip` input so they would not be downgrade-pinned. This was verbose, easy to get wrong, and drifted as stdlibs/sublibs changed. Now the effective skip list is computed automatically: sublibrary-downgrade.yml: effective skip = Julia stdlibs ∪ in-repo lib/* sublibrary names ∪ caller `skip` downgrade.yml: effective skip = Julia stdlibs ∪ caller `skip` Standard libraries are enumerated robustly from Pkg (the dict is keyed by UUID, so the name is taken from each value, handling both the (name, version) tuple shape on recent Julia and the plain-String shape on older Julia). The in-repo sublibrary names come from `basename lib/*/` (only dirs with a Project.toml), matching the existing discovery logic. The `skip` input is now documented as ADDITIONAL deps beyond the auto-included set, with default "". The `julia-version` default changes from "lts" to "1.10": downgrade tests the minimum-supported Julia floor, which is 1.10 across SciML. Backward compatible: callers that still pass a long hand-listed skip keep working, since their list is simply unioned in (any redundant stdlib/sublib entries are harmless, as the action treats skip as a membership filter). Callers can now drop their hand-listed skip entirely. Unchanged: lib/* discovery, group-env, allow_reresolve:false, projects/exclude. Validated with actionlint (exit 0, shellcheck enabled). Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/downgrade.yml | 32 ++++++++++++--- .github/workflows/sublibrary-downgrade.yml | 45 +++++++++++++++++++--- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/.github/workflows/downgrade.yml b/.github/workflows/downgrade.yml index 97520ae..0496c65 100644 --- a/.github/workflows/downgrade.yml +++ b/.github/workflows/downgrade.yml @@ -4,8 +4,8 @@ on: workflow_call: inputs: julia-version: - description: "Julia version (downgrade is usually run on the oldest supported version)" - default: "lts" + description: "Julia version (downgrade tests the minimum-supported Julia floor, 1.10 across SciML)" + default: "1.10" required: false type: string group: @@ -14,8 +14,8 @@ on: required: false type: string skip: - description: "Comma-separated list of packages to skip when downgrading compat (passed to julia-actions/julia-downgrade-compat)" - default: "Pkg,TOML" + description: "ADDITIONAL deps to skip when downgrading, beyond the auto-included Julia stdlibs (comma-separated; unioned into the effective skip passed to julia-actions/julia-downgrade-compat)" + default: "" required: false type: string projects: @@ -55,9 +55,31 @@ jobs: with: version: "${{ inputs.julia-version }}" + - name: "Compute effective downgrade skip list" + run: | + # Effective skip = Julia stdlibs ∪ the caller's `skip` input (extra + # skips). Standard libraries are always in-tree at their pinned + # version, so they must never be downgrade-pinned. Enumerate them + # robustly from Pkg (the dict is keyed by UUID, so take the NAME from + # each value; the value is (name, version) on recent Julia and a + # String on older). + stdlibs="$(julia --startup-file=no -e ' + using Pkg + ns = String[] + for v in values(Pkg.Types.stdlibs()) + push!(ns, v isa AbstractString ? v : first(v)) + end + println(join(sort(unique(ns)), ",")) + ')" + echo "Julia stdlibs: $stdlibs" + effective="$stdlibs" + [ -n "${{ inputs.skip }}" ] && effective="$effective,${{ inputs.skip }}" + echo "Effective downgrade skip: $effective" + echo "EFFECTIVE_SKIP=$effective" >> "$GITHUB_ENV" + - uses: julia-actions/julia-downgrade-compat@v2 with: - skip: "${{ inputs.skip }}" + skip: "${{ env.EFFECTIVE_SKIP }}" projects: "${{ inputs.projects }}" mode: "${{ inputs.mode != '' && inputs.mode || 'deps' }}" diff --git a/.github/workflows/sublibrary-downgrade.yml b/.github/workflows/sublibrary-downgrade.yml index 9aaa163..c648b2e 100644 --- a/.github/workflows/sublibrary-downgrade.yml +++ b/.github/workflows/sublibrary-downgrade.yml @@ -8,13 +8,13 @@ on: workflow_call: inputs: julia-version: - description: "Julia version to run the downgrade tests on" - default: "lts" + description: "Julia version to run the downgrade tests on (downgrade tests the minimum-supported Julia floor, 1.10 across SciML)" + default: "1.10" required: false type: string skip: - description: "Comma-separated deps to skip when downgrading (passed to julia-downgrade-compat)" - default: "Pkg,TOML" + description: "ADDITIONAL deps to skip when downgrading, beyond the auto-included Julia stdlibs and in-repo lib/* sublibraries (comma-separated; unioned into the effective skip passed to julia-downgrade-compat)" + default: "" required: false type: string projects: @@ -93,10 +93,45 @@ jobs: - name: "Set sublibrary test group" if: "${{ inputs.group-env-name != '' }}" run: echo "${{ inputs.group-env-name }}=${{ inputs.group-env-value }}" >> "$GITHUB_ENV" + - name: "Enumerate Julia standard libraries" + run: | + # Standard libraries are always in-tree at their pinned version, so + # they must never be downgrade-pinned. Enumerate them robustly from + # Pkg (the dict is keyed by UUID, so take the NAME from each value; + # the value is (name, version) on recent Julia and a String on older). + names="$(julia --startup-file=no -e ' + using Pkg + ns = String[] + for v in values(Pkg.Types.stdlibs()) + push!(ns, v isa AbstractString ? v : first(v)) + end + println(join(sort(unique(ns)), ",")) + ')" + echo "Julia stdlibs: $names" + echo "STDLIB_SKIP=$names" >> "$GITHUB_ENV" + - name: "Compute effective downgrade skip list" + run: | + # Effective skip = Julia stdlibs ∪ in-repo lib/* sublibrary NAMES + # ∪ the caller's `skip` input (extra skips). + # In-repo path-[sources] sublibs must not be downgrade-pinned, so add + # every lib/ directory name to the skip set. + sublibs="" + for d in lib/*/; do + d="${d%/}" + [ -f "$d/Project.toml" ] || continue + name="$(basename "$d")" + if [ -z "$sublibs" ]; then sublibs="$name"; else sublibs="$sublibs,$name"; fi + done + echo "In-repo sublibraries: $sublibs" + effective="$STDLIB_SKIP" + [ -n "$sublibs" ] && effective="$effective,$sublibs" + [ -n "${{ inputs.skip }}" ] && effective="$effective,${{ inputs.skip }}" + echo "Effective downgrade skip: $effective" + echo "EFFECTIVE_SKIP=$effective" >> "$GITHUB_ENV" - uses: julia-actions/julia-downgrade-compat@v2 with: projects: ${{ matrix.project }} - skip: ${{ inputs.skip }} + skip: ${{ env.EFFECTIVE_SKIP }} julia_version: ${{ inputs.julia-version }} - uses: julia-actions/julia-buildpkg@v1 with: From e092802fcd7a0a9bb574f159c0406ecb03dcd735 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Mon, 8 Jun 2026 04:18:48 -0400 Subject: [PATCH 2/2] downgrade: default julia-version to the lts alias instead of hardcoded 1.10 Use the moving "lts" alias for the downgrade julia-version input default (in both downgrade.yml and sublibrary-downgrade.yml) so the downgrade floor tracks the LTS as it advances. It is currently 1.10, but the alias keeps it future-proof. Descriptions updated accordingly. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/downgrade.yml | 4 ++-- .github/workflows/sublibrary-downgrade.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/downgrade.yml b/.github/workflows/downgrade.yml index 0496c65..b92a262 100644 --- a/.github/workflows/downgrade.yml +++ b/.github/workflows/downgrade.yml @@ -4,8 +4,8 @@ on: workflow_call: inputs: julia-version: - description: "Julia version (downgrade tests the minimum-supported Julia floor, 1.10 across SciML)" - default: "1.10" + description: "Julia version (downgrade tests the minimum-supported Julia floor; defaults to the LTS alias 'lts', currently 1.10, tracking the LTS as it advances)" + default: "lts" required: false type: string group: diff --git a/.github/workflows/sublibrary-downgrade.yml b/.github/workflows/sublibrary-downgrade.yml index c648b2e..2fb3f47 100644 --- a/.github/workflows/sublibrary-downgrade.yml +++ b/.github/workflows/sublibrary-downgrade.yml @@ -8,8 +8,8 @@ on: workflow_call: inputs: julia-version: - description: "Julia version to run the downgrade tests on (downgrade tests the minimum-supported Julia floor, 1.10 across SciML)" - default: "1.10" + description: "Julia version to run the downgrade tests on (downgrade tests the minimum-supported Julia floor; defaults to the LTS alias 'lts', currently 1.10, tracking the LTS as it advances)" + default: "lts" required: false type: string skip: