PySentry becomes a first-class CI citizen: an official GitHub Action, SARIF reports GitHub can actually anchor, distinct exit codes, and a hardened release pipeline.
✨ New Features
First-Party GitHub Action
The action downloads the prebuilt release binary for the runner platform, verifies it against SHA256SUMS, runs the audit, and uploads a SARIF report to GitHub Code Scanning — findings appear in the Security tab and on pull requests:
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: nyudenkov/pysentry@v0.4.9
with:
fail-on: highInputs map 1:1 to CLI flags (path, fail-on, sources, format, output, ignore, plus a raw args passthrough). The SARIF report is uploaded even when the audit fails, so findings always reach the Security tab before the job exits non-zero. See the new CI guide — it covers other CI systems too.
--service-url: Custom OSV-Compatible Endpoint
Corporate and air-gapped environments can point the OSV provider at a self-hosted or mirrored OSV-compatible endpoint:
pysentry-rs --sources osv --service-url https://osv.internal.example.comOnly valid with --sources osv; also available as a config file option.
Distinct Exit Code for System Errors
Exit code 1 previously meant both "vulnerabilities found" and "the audit never ran". System errors (bad configuration, network failure, parse failure) now exit 2; findings at or above the --fail-on threshold keep 1. Gate on any non-zero exit as before, or handle the two cases separately.
🔧 Improvements
- SARIF reports carry line numbers for every source. Previously only
pyproject.tomlanduv.lockresults had a source line; GitHub Code Scanning could not anchor the rest. Location scanning now covers everything the parsers read:requirements.txt(including multi-file audits),poetry.lock,pylock.toml,Pipfile.lock,Pipfile, and — insidepyproject.toml— extras and PEP 735 dependency groups. - Maintenance checks skip non-registry dependencies — no more pointless PyPI queries for Git/path/URL installs.
- Own supply chain hardened: release assets ship with
SHA256SUMS(verified by the Action),cargo auditin CI is pinned with a reviewed ignore list,quinn-protobumped to 0.11.15 (RUSTSEC-2026-0185). - OSV and PyPI clients send a
pysentry/{version}user-agent, matching the rest of the codebase.
🐛 Bug Fixes
- SARIF: multi-file requirements audits emitted a bogus URI (
"requirements.txt, dev-requirements.txt"); each finding now resolves to its own real file. - SARIF: substring package matching could anchor
jinja2to aflask-jinja2line; names are compared through full PEP 503 normalization. - Advisory aliases were double-reported in single-source audits; aliased advisories (same CVE under GHSA and PYSEC IDs) are collapsed into one finding.
Note: v0.4.8 was tagged but never published due to a release-pipeline failure (fixed in this release); v0.4.9 is the same content. Install: uvx pysentry-rs, pip install pysentry-rs, or cargo install pysentry. Full changelog: https://docs.pysentry.com/changelog