Skip to content

Respond to a dependency-audit failure

The weekly Dependency audit workflow checks the locked application, development, and documentation dependencies against the public Open Source Vulnerabilities service. It runs separately for Python 3.12, 3.13, and 3.14 and can also be dispatched by a maintainer.

A green run describes that commit at that time. A new advisory can appear later.

Before you begin

For a local reproduction, use a clean checkout with Git and mise. The audit needs outbound HTTPS access to api.osv.dev and any configured package index. Package names and versions are sent to the public OSV service; GitHub credentials are not needed.

To inspect or dispatch the hosted workflow, authenticate GitHub CLI with an account that may run Actions and read results:

gh auth status

Confirm the account and GitHub host before continuing.

What the workflow proves

Each Python matrix job runs:

uv --no-cache \
  --no-python-downloads \
  --preview-features audit-command audit \
  --locked \
  --python-version "$PYTHON_VERSION"

--locked turns lockfile drift into an error instead of resolving a different environment. The job selects its matrix Python and forbids uv from downloading a substitute interpreter. It has read-only repository permission, no OIDC or publication authority, no persistent uv cache, and a ten-minute timeout.

This network-dependent control does not run on pull requests. An OSV outage therefore cannot freeze unrelated changes. Pull requests still run GitHub's dependency review and deterministic toolchain checks.

Classify the failure

Open the failed matrix job and match the result to one of these cases:

Failure What it means Response
Active advisory A locked dependency for that Python line has a known vulnerability. Confirm the package, version, and advisory. Update the requirement and lockfile, run the full test matrix, then rerun the audit. Use the private security policy when exploitability or an undisclosed weakness needs discussion.
Withdrawn or adverse release A locked version is no longer acceptable upstream—for example, an index quarantined or withdrew it. Treat the event as a supply-chain incident. Verify the upstream project and index record, select a reviewed replacement, regenerate the lockfile, and rerun tests and audit. Do not restore an unknown file from local cache.
OSV or network failure The job did not obtain a complete answer. Check service status and runner networking, then rerun the same commit. If the outage continues, record evidence from an independent advisory source and leave the failed run visible. Do not add an ignore to hide an outage.
Lockfile or resolution mismatch uv.lock does not describe the checked-out project for that Python line. Reproduce with the pinned uv version, change project metadata and lockfile together, and run all supported Python tests.

A scheduled failure does not add a new check to an already-open pull request. Maintainers must identify affected open changes and any published artifacts, pause publication when needed, and carry remediation through normal review.

Reproduce locally

Review the checked-out revision and mise.toml before trusting it. mise trust permits repository configuration and tasks to execute locally. Then install the pinned tools and run all three resolutions:

mise trust
mise install
for python_version in 3.12 3.13 3.14; do
  mise exec -- uv --no-cache \
    --no-python-downloads \
    --preview-features audit-command audit \
    --locked \
    --python-version "$python_version"
done

The same package should fail locally for the affected Python line. A network failure remains an unknown result, not a clean audit.

Dispatch and verify a hosted rerun

Run the control against the default branch:

gh workflow run dependency-audit.yml --ref main
gh run list \
  --workflow dependency-audit.yml \
  --branch main \
  --event workflow_dispatch \
  --limit 1 \
  --json databaseId,headSha,status,conclusion,url

Before using the listed run as evidence, confirm that headSha is the intended main commit. Open its URL or pass databaseId to gh run watch.

Record the commit, Python version, advisory or outage evidence, remediation, and successful rerun in the issue or pull request. Leave out credentials, private index URLs, and environment dumps.

When the uv audit interface changes

mise.toml is the reviewed uv version. The digest-pinned uv image in the Dockerfile and every astral-sh/setup-uv step must report that same version. Both architecture builds check the digest-selected executable, and pull-request tests exercise the pinned preview audit help without making a network request.

Renovate manages the image, digest, runtime strings, and setup action as one uv toolchain update; Dependabot intentionally ignores only astral-sh/setup-uv. Review the upstream release notes and image digest before merging. Never change one location alone or bypass test_toolchain_configuration.py when it reports drift.