CRITICAL SCSC-2026-001: publish build dependencies bypass the committed lock
Evidence: .github/workflows/publish.yml:32-33 upgrades pip and installs build hatchling cyclonedx-bom twine from the live registry without exact versions or a frozen, hashed requirements set.
Risk: an attacker who compromises any selected build-tool release can execute code in the artifact-building job and alter the wheel that the separate OIDC job publishes.
Remediation: declare the release toolchain in a locked dependency group, run it with uv run --frozen, and keep the build and OIDC publish jobs separated. This audit did not change the publish workflow.
HIGH SCSC-2026-002: Starlette has no upper bound
Evidence: pyproject.toml:35 declares starlette>=0.48, while the other production dependencies use upper bounds.
Risk: an attacker who publishes a malicious or incompatible future major release could be selected by downstream fresh resolution even though this repository's current lock is safe.
Remediation: choose and test an upper bound in a dedicated dependency update. Lockdown never changes dependency manifests automatically.
MEDIUM SCSC-2026-003: no required CVE scanner runs in CI
Evidence: the two workflows run tests and publish, but neither runs pip-audit or osv-scanner. The local pre-commit configuration covers secrets and workflow lint only.
Risk: a known vulnerable transitive dependency can remain in the release lock until a human notices it.
Remediation: add a locked, blocking CVE scan over uv.lock on pull requests and a scheduled cadence.