Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
0e43f31
ci: shorten pr workflow critical path
qartik Jun 24, 2026
70a4f6e
ci: fix workflow cache policy and julia triggers
qartik Jun 25, 2026
0da0c27
ci: narrow julia test triggers
qartik Jun 25, 2026
6e33b23
ci: align cache policy with trusted branches
qartik Jun 25, 2026
d1c2341
ci: keep lint lane off llvm package builds
qartik Jun 25, 2026
fc6cbdc
ci: provision llvm for python lint lane
qartik Jun 25, 2026
adefe9f
ci: retry ci bootstrap on cargo fetch flakes
qartik Jun 25, 2026
fae374d
ci: install ripgrep in python lint lane
qartik Jun 25, 2026
1a5c37c
ci: isolate python lint lane
qartik Jun 25, 2026
653815f
ci: use package metadata in python smoke
qartik Jun 25, 2026
6713da1
ci: fix python fast-lane regressions
qartik Jun 25, 2026
da16ce0
ci: shorten python smoke build path
qartik Jun 25, 2026
75e7c16
ci: fix smoke artifact installs
qartik Jun 25, 2026
8360d63
ci: slim docs setup
qartik Jun 25, 2026
c58aab0
ci: skip smoke wheel dependency resolution
qartik Jun 25, 2026
067411a
ci: reuse built rust test binary
qartik Jun 25, 2026
682f56f
ci: install smoke runtime dependencies
qartik Jun 25, 2026
f460704
ci: read llvm smoke version from metadata
qartik Jun 25, 2026
2b48241
ci: trim PR workflow setup overhead
qartik Jun 25, 2026
8645030
ci: fix fast-lane dependency setup
qartik Jun 25, 2026
98ed9c3
ci: fix docs and smoke workflow assumptions
qartik Jun 25, 2026
337f567
ci: fix docs and smoke workflow runtime assumptions
qartik Jun 25, 2026
0001864
ci: restore docs deps and smoke checkout
qartik Jun 25, 2026
63c6178
ci: fix smoke job checkout placement
qartik Jun 25, 2026
fe42ecb
ci: trim compat-smoke llvm setup and skip slow docs snippet
qartik Jun 25, 2026
12db754
ci: restore compat build env setup
qartik Jun 25, 2026
0215e61
ci: free disk before docs build
qartik Jun 25, 2026
962a759
ci: drop windows disk cleanup from compat build
qartik Jun 25, 2026
ef0a602
ci: enable llvm setup for mac compat smoke
qartik Jun 25, 2026
a0b70ca
ci: guard llvm wheel install against missing artifact
qartik Jun 25, 2026
42004e0
ci: suppress pipefail for missing llvm wheel glob
qartik Jun 25, 2026
b6e7dbd
ci: shorten PR lanes for python rust and docs
qartik Jun 25, 2026
25ada00
ci: fix rust PR fast-path matrix gating
qartik Jun 25, 2026
9179041
ci: slim python-core PR fast path
qartik Jun 25, 2026
db4a1db
ci: address PR review gaps in CI filters and smoke wiring
qartik Jun 26, 2026
007a0ac
ci: drop apt-based ripgrep install in python-lint
qartik Jun 26, 2026
ef41d89
ci: retry windows vanilla cargo check on transient fetch failures
qartik Jun 26, 2026
71004db
ci: ensure ripgrep without apt index refresh in python-lint
qartik Jun 26, 2026
48ea0c6
ci: address latest review feedback on workflow wiring
qartik Jun 26, 2026
581127b
ci: address final review feedback on rust-test and compat-smoke
qartik Jun 26, 2026
1763cca
ci: skip non-ubuntu rust matrix on PRs
qartik Jun 26, 2026
a0798d2
ci: fix compat smoke failure and tighten cache policy checks
qartik Jun 26, 2026
670b6c3
ci: relax trusted ref regex whitespace in integrity check
qartik Jun 26, 2026
992245b
Merge branch 'dev' into codex/ci-pr-critical-path
ciaranra Jun 26, 2026
826619f
ci: close remaining PR review gaps
qartik Jun 26, 2026
ad26330
ci: allowlist cache guards and fix release wheel collector
qartik Jun 26, 2026
bbd801c
Merge branch 'dev' into codex/ci-pr-critical-path
ciaranra Jun 27, 2026
c73ccf2
Stop tracking scripts/native_bench/bench_pecos/Cargo.lock to avoid de…
ciaranra Jun 27, 2026
7d34743
Add required paths-aware PR core-test gate (Linux Python + Rust)
ciaranra Jun 27, 2026
fbecd10
Narrow pr-core detect ignore to provably-safe paths so docs fixtures …
ciaranra Jun 27, 2026
791878b
Split pr-core gate into parallel pr-core-python and pr-core-rust jobs…
ciaranra Jun 27, 2026
7bc72e7
Bump pyo3 to 0.29 to resolve RUSTSEC-2026-0176/0177 advisories
ciaranra Jun 27, 2026
1d1a711
Stop cargo-deny/dependabot watching the untracked native bench crate
ciaranra Jun 28, 2026
ed102c1
Fix pr-core detect fail-open and anchor LICENSE/CITATION ignore
ciaranra Jun 28, 2026
4b10002
Bump quinn-proto to 0.11.15 to resolve RUSTSEC-2026-0185
ciaranra Jun 28, 2026
24b74cf
Remove dead TRIGGER_ON_PR_PUSH env and correct pr-core required-conte…
ciaranra Jun 28, 2026
62c8661
Fail release artifact uploads on missing files; fix pr-core comment o…
ciaranra Jun 28, 2026
5db9898
Fail all remaining release artifact uploads on missing files (julia, …
ciaranra Jun 28, 2026
42f7610
Bump tar to 0.4.46 and Go toolchain to 1.26.4 to clear stdlib/depende…
ciaranra Jun 28, 2026
866eaf1
Bump examples jupyter chain and ignore structopt RUSTSEC-2022-0104 to…
ciaranra Jun 28, 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
19 changes: 4 additions & 15 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,10 @@ updates:
- dependency-name: "*"
update-types: ["version-update:semver-patch", "version-update:semver-minor", "version-update:semver-major"]

# Rust (Cargo) - native benchmark security updates only
- package-ecosystem: "cargo"
directory: "/scripts/native_bench/bench_pecos"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
groups:
native-bench-rust-security:
applies-to: security-updates
patterns: ["*"]
allow:
- dependency-type: "all"
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-patch", "version-update:semver-minor", "version-update:semver-major"]
# Note: scripts/native_bench/bench_pecos is intentionally NOT watched here. It
# is a dev-only benchmark (publish = false) whose Cargo.lock is untracked
# (.gitignore), so it is not in the dependency graph. Tracking it would
# reintroduce per-directory security PRs that cannot be suppressed.

# Python (pip) - security updates only
- package-ecosystem: "pip"
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/cargo-deny.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,8 @@ jobs:
- name: Check root Rust workspace
run: cargo deny --locked --all-features check advisories bans sources

- name: Check native benchmark crate
run: cargo deny --manifest-path scripts/native_bench/bench_pecos/Cargo.toml --locked --all-features check advisories bans sources
# No separate check for scripts/native_bench/bench_pecos: that crate is a
# dev-only benchmark (publish = false) whose Cargo.lock is intentionally
# untracked (.gitignore), so it is neither pinned here nor watched by
# Dependabot. Re-add a tracked lock + a --locked check here if it ever
# gains shipped or CI-executed status.
2 changes: 0 additions & 2 deletions .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ on:
paths:
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/native_bench/bench_pecos/Cargo.toml'
- 'scripts/native_bench/bench_pecos/Cargo.lock'
- 'pyproject.toml'
- 'python/**/pyproject.toml'
- 'uv.lock'
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/julia-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,26 @@ on:
- master
tags:
- 'jl-*' # Trigger on Julia-specific tags
paths:
- 'julia/**'
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/ci/**'
- '.github/workflows/julia-release.yml'
pull_request:
branches:
- main
- dev
- development
- master
paths:
- 'julia/**'
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/ci/**'
- '.github/workflows/julia-release.yml'
workflow_dispatch:
inputs:
sha:
Expand Down Expand Up @@ -256,6 +270,7 @@ jobs:
with:
name: julia-binary-${{ matrix.os }}-${{ matrix.architecture }}
path: pecos_julia-*.tar.gz
if-no-files-found: error

test_binaries:
needs: build_julia_binaries
Expand Down Expand Up @@ -492,6 +507,7 @@ jobs:
with:
name: pecos-julia-distribution
path: dist/
if-no-files-found: error

create_release_bundle:
needs: [build_julia_binaries, test_binaries]
Expand Down Expand Up @@ -650,6 +666,7 @@ jobs:
with:
name: pecos-julia-release-bundle
path: pecos-julia-release-bundle-*.tar.gz
if-no-files-found: error
retention-days: 30 # Keep for 30 days

- name: Determine if pre-release
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/julia-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,20 @@ env:
on:
push:
branches: [ "main", "master", "development", "dev" ]
paths:
- 'julia/**'
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/ci/**'
pull_request:
branches: [ "main", "master", "development", "dev" ]
paths:
- 'julia/**'
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/ci/**'
workflow_dispatch:

concurrency:
Expand Down
247 changes: 247 additions & 0 deletions .github/workflows/pr-core-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
name: PR core gate

# Pre-merge test sentinels (intended to become the required contexts
# pr-core-python / pr-core-rust once promoted in branch protection -- NOT yet
# required): run the Linux core Python and Rust test suites on pull requests, in
# parallel. Neither has a `paths:` filter, so each always reports a status (a
# path-filtered required check would stuck-block PRs that don't touch its paths).
# A shared detect script short-circuits to a pass when a PR changes nothing the
# core suites depend on, so docs-only / unrelated PRs stay fast.
#
# Intended required contexts (not yet enforced): pr-core-python, pr-core-rust.
#
# The setup below mirrors the Linux legs of python-test.yml (python-core) and
# rust-test.yml. Keep their action SHAs, uv/just/LLVM versions, and cache keys
# in sync when editing either side. The change-detection rule lives in
# scripts/ci/pr-core-changed.sh (single source of truth for both jobs).

permissions:
contents: read

env:
LLVM_VERSION: "14.0.6"
RUSTFLAGS: -C debuginfo=0
RUST_BACKTRACE: 1
PYTHONUTF8: 1
CARGO_HTTP_MULTIPLEXING: "false"
CARGO_NET_GIT_FETCH_WITH_CLI: "true"
CARGO_NET_RETRY: "10"

on:
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

defaults:
run:
shell: bash

jobs:
pr-core-python:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Harden the runner (egress audit)
uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
with:
egress-policy: audit

- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
persist-credentials: false

- name: Detect core-relevant changes
id: detect
# Assign on its own line so a git failure in the detect script aborts the
# step under `set -e` (fail closed) instead of writing an empty `run=`,
# which would let this gate pass green having run no tests.
run: |
run="$(bash scripts/ci/pr-core-changed.sh '${{ github.event.pull_request.base.sha }}')"
case "$run" in
true|false) ;;
*)
echo "unexpected pr-core detect output: <$run>" >&2
exit 1
;;
esac
printf 'run=%s\n' "$run" >> "$GITHUB_OUTPUT"

- name: Free Disk Space (Ubuntu)
if: steps.detect.outputs.run == 'true'
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
with:
android: true
dotnet: true
haskell: true
large-packages: false
docker-images: true
tool-cache: false
swap-storage: true

- name: Set up Python
if: steps.detect.outputs.run == 'true'
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: "3.12"

- name: Install the latest version of uv
if: steps.detect.outputs.run == 'true'
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "0.11.14"
enable-cache: true
save-cache: ${{ github.event_name == 'push' && contains(fromJSON('["main", "master", "development", "dev"]'), github.ref_name) }}

- name: Set up Rust
if: steps.detect.outputs.run == 'true'
run: |
bash scripts/ci/ensure-rust.sh stable minimal
export PATH="$HOME/.cargo/bin:$PATH"
rustup show

- name: Verify cmake is available (MWPF decoder build)
if: steps.detect.outputs.run == 'true'
run: cmake --version

- name: Install just
if: steps.detect.outputs.run == 'true'
uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4

- name: Cache Rust
if: steps.detect.outputs.run == 'true'
uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
cache-bin: false
prefix-key: v1-rust-no-bin
save-if: ${{ github.event_name == 'push' && contains(fromJSON('["main", "master", "development", "dev"]'), github.ref_name) }}
workspaces: |
python/pecos-rslib
python/pecos-rslib-llvm

- name: Cache LLVM ${{ env.LLVM_VERSION }}
if: steps.detect.outputs.run == 'true'
id: cache-llvm
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ~/.pecos/deps/llvm-14
key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2

- name: Ensure LLVM ${{ env.LLVM_VERSION }}
if: steps.detect.outputs.run == 'true'
run: just ci-env

- name: Run core Python tests
if: steps.detect.outputs.run == 'true'
run: just python-ci-core

- name: Core Python gate passed (no core-relevant changes)
if: steps.detect.outputs.run != 'true'
run: echo "No core-relevant paths changed; core Python suite skipped."

pr-core-rust:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Harden the runner (egress audit)
uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
with:
egress-policy: audit

- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0
persist-credentials: false

- name: Detect core-relevant changes
id: detect
# Assign on its own line so a git failure in the detect script aborts the
# step under `set -e` (fail closed) instead of writing an empty `run=`,
# which would let this gate pass green having run no tests.
run: |
run="$(bash scripts/ci/pr-core-changed.sh '${{ github.event.pull_request.base.sha }}')"
case "$run" in
true|false) ;;
*)
echo "unexpected pr-core detect output: <$run>" >&2
exit 1
;;
esac
printf 'run=%s\n' "$run" >> "$GITHUB_OUTPUT"

- name: Free Disk Space (Ubuntu)
if: steps.detect.outputs.run == 'true'
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
with:
android: true
dotnet: true
haskell: true
large-packages: false
docker-images: true
tool-cache: false
swap-storage: true

- name: Set up Python
if: steps.detect.outputs.run == 'true'
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: "3.12"

- name: Install the latest version of uv
if: steps.detect.outputs.run == 'true'
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "0.11.14"
enable-cache: true
save-cache: ${{ github.event_name == 'push' && contains(fromJSON('["main", "master", "development", "dev"]'), github.ref_name) }}

- name: Set up Rust
if: steps.detect.outputs.run == 'true'
run: |
bash scripts/ci/ensure-rust.sh stable minimal
export PATH="$HOME/.cargo/bin:$PATH"
rustup show

- name: Verify cmake is available (MWPF decoder build)
if: steps.detect.outputs.run == 'true'
run: cmake --version

- name: Install just
if: steps.detect.outputs.run == 'true'
uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4

- name: Cache Rust
if: steps.detect.outputs.run == 'true'
uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
cache-bin: false
prefix-key: v1-rust-no-bin
save-if: ${{ github.event_name == 'push' && contains(fromJSON('["main", "master", "development", "dev"]'), github.ref_name) }}
workspaces: |
python/pecos-rslib
python/pecos-rslib-llvm

- name: Cache LLVM ${{ env.LLVM_VERSION }}
if: steps.detect.outputs.run == 'true'
id: cache-llvm
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ~/.pecos/deps/llvm-14
key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2

- name: Ensure LLVM ${{ env.LLVM_VERSION }}
if: steps.detect.outputs.run == 'true'
run: just ci-env

- name: Run core Rust tests
if: steps.detect.outputs.run == 'true'
# debug profile keeps this sentinel fast; the full release matrix runs
# post-merge on push via rust-test.yml.
run: just rstest debug

- name: Core Rust gate passed (no core-relevant changes)
if: steps.detect.outputs.run != 'true'
run: echo "No core-relevant paths changed; core Rust suite skipped."
Loading
Loading