Skip to content

fix(ci): repair the Security Gate and CI Gate failures on main - #45

Open
williaby wants to merge 3 commits into
mainfrom
claude/fix-default-branch-ci-0
Open

fix(ci): repair the Security Gate and CI Gate failures on main#45
williaby wants to merge 3 commits into
mainfrom
claude/fix-default-branch-ci-0

Conversation

@williaby

@williaby williaby commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Problem

Both Security Gate Validation and CI Gate fail on the default branch, which
blocks every open PR in this repo. There are two independent root causes.

1. OSV Vulnerability Scanner exits 1 on a dead ignore entry

/github/workspace/osv-scanner.toml has unused ignores:
 - CVE-2022-42969
 - PYSEC-2022-42969
Exit code: 1

No vulnerability was found. OSV withdrew that advisory on 2026-06-09 as
disputed, so the three py/interrogate ignore entries no longer match
anything, and osv-scanner treats a dead ignore as an error. Confirmed against
the OSV API: a query for py 1.11.0 now returns no vulnerabilities, and
PYSEC-2022-42969 carries withdrawn: 2026-06-09.

2. pip-audit finds 136 vulnerabilities in 20 packages

uv.lock was last resolved on 2026-06-10. Every affected package is a dev-tree
dependency with an open lower bound (jupyterlab, mistune, gitpython,
bleach, cryptography, and others).

Change

  • Remove the three withdrawn-advisory ignores from osv-scanner.toml and the
    paired [tool.pip-audit].ignore-vuln entry. The resolution is recorded in
    docs/known-vulnerabilities.md rather than deleting the history.
  • uv lock --upgrade, which clears 135 of the 136 findings.
  • Accept the one remainder, PYSEC-2026-3740 against nltk 3.10.3, with a
    dated entry and reassess-by date. It is reached only through safety, and
    OSV records the advisory as fixed in 3.10.3, which is both the pinned version
    and the latest release; the range published to pip-audit's feed is stale
    upstream. There is no version to upgrade to.

The refreshed lock raises ruff, surfacing two pre-existing issues:

  • PLR0917 on RateLimitMiddleware.__init__ (5 positional arguments). The
    tuning parameters are now keyword-only. Every call site already passes them by
    keyword through Starlette's add_middleware, so this is not a behaviour
    change.
  • N802 on the ast.NodeVisitor visit_* methods in scripts/. Those names
    are dictated by the standard library's dispatch, so renaming them would
    silently disable the visitors. Added as a scoped pep8-naming exception
    rather than inline suppressions.

Finally, .pre-commit-config.yaml pinned ruff at v0.9.0 while the lock resolves
0.16.5. The two disagreed about which rules exist, so pre-commit failed A005 on
code that ruff check src/ tests/ accepts. The rev now tracks the lock, with
ruff-format scoped to Python so the newer Markdown code-block formatting does
not rewrite unrelated documentation.

Verification

All run locally against this branch:

Check Result
ruff format --check src/ tests/ 21 files already formatted
ruff check src/ tests/ All checks passed
basedpyright src/ 0 errors, 27 warnings
pytest 195 passed, 99.58% coverage
bandit -r src/ -lll clean
vulture src/ --min-confidence 80 clean
pip-audit --skip-editable clean with the one documented ignore
pre-commit run --all-files all hooks pass

Follow-up commits after the first CI run

The first run on this branch surfaced one advisory the lockfile refresh could
not clear, so two more commits landed.

osv-scanner still exited 1 with a single finding:

Scanned /github/workspace/uv.lock file and found 302 packages
Loaded filter from: /github/workspace/osv-scanner.toml
Exit code: 1

The results artifact identified it as GHSA-8mgp-746c-j5xp against
nltk 3.10.3 (aliases CVE-2026-81726, PYSEC-2026-3740), CVSS 8.3.
Dependency Review failed on the same advisory.

There is no version to upgrade to. The OSV record runs from introduced 0 to
last_affected 3.10.3 with no fixed event, and 3.10.3 is simultaneously
the pinned version and the newest release on PyPI:

$ curl -s https://api.osv.dev/v1/vulns/GHSA-8mgp-746c-j5xp
  ranges: [{'introduced': '0'}, {'last_affected': '3.10.3'}]
$ curl -s https://pypi.org/pypi/nltk/json | jq -r .info.version
  3.10.3

Exposure is limited to development environments. nltk is not imported
anywhere in src/; it reaches the tree only through safety, declared in the
dev and supply-chain extras, so it is absent from the runtime install:

nltk v3.10.3
└── safety v3.8.1
    ├── foundry-unify v0.1.0 (extra: dev)
    └── foundry-unify v0.1.0 (extra: supply-chain)

Accepted through the org's documented path: suppressions paired with a dated
entry in docs/known-vulnerabilities.md, reassess by 2026-11-02. Three tools
scan this dependency and each needed its own key:

Tool Location Key
osv-scanner osv-scanner.toml [[IgnoredVulns]] GHSA alias
dependency-review-action allow-ghsas in dependency-review.yml GHSA alias
pip-audit [tool.pip-audit].ignore-vuln PYSEC alias

fail-on-severity: high and the deny-licenses list in Dependency Review are
unchanged, so every other high or critical advisory still blocks the PR. Only
this one id is waived. Without it every PR touching uv.lock fails on
something no one can act on, Renovate updates included.

Two corrections to the earlier commit while here. Both the pyproject.toml
comment and the docs entry claimed OSV recorded the advisory as fixed in
3.10.3 and that the range was merely stale. The record says last_affected,
not fixed, so 3.10.3 is affected and no fix exists; the rationale now states
that accurately. The docs entry also records that pip-audit 2.10.1 does not
read [tool.pip-audit] at all (only the --ignore-vuln flag), so that table
documents the accepted risk rather than suppressing a live gate.

Re-verified with the scanner version CI pins:

$ docker run --rm -v "$(pwd):/src" -w /src \
    ghcr.io/google/osv-scanner:v2.3.8 --lockfile=uv.lock
Filtered 1 vulnerability from output
No issues found          # exit 0

Out of scope, flagged for the orchestrator

python-ci.yml is called twice per PR by two different jobs: ci in ci.yml
(named CI Pipeline, pinned @main) and core-validation in
pr-validation.yml (named Core Validation, pinned @e8fc83c9). The whole
CI suite therefore runs twice, at two different reusable-workflow versions, and
they disagree: CI Pipeline / Code Quality Checks fails while
Core Validation / Code Quality Checks passes. This PR fixes the underlying
failure so both agree, but the duplication itself is untouched, and the floating
@main pins in ci.yml and security-analysis.yml are left for a deliberate
decision.

Container Security Scan fails on this branch and already failed on main
before it (runs 33602271059 and 32943974002). It is unrelated to this change:
Trivy reports 12 HIGH OS-package findings in the container base image itself
(wolfi 20230201 / python-3.14), covering libcrypto3, libssl3,
libexpat1, py3-pip-wheel and python-3.14. Every one has a fixed version
available, so the remedy is a base-image bump in the Dockerfile, not a
suppression. That is a runtime behavior change outside the scope of a CI-gate
fix, so it is reported rather than attempted here. Container Security Scan / Security Summary fails only as a consequence of it.

Generated with Claude Code

Both required contexts fail on the default branch, for two independent
reasons.

OSV Vulnerability Scanner exits 1 with "osv-scanner.toml has unused ignores:
CVE-2022-42969, PYSEC-2022-42969". No vulnerability was found. OSV withdrew
that advisory on 2026-06-09 as disputed, so the three py/interrogate ignore
entries no longer match anything, and osv-scanner treats a dead ignore as an
error. Remove all three, plus the paired `[tool.pip-audit].ignore-vuln` entry,
and record the resolution in docs/known-vulnerabilities.md rather than
deleting the history.

pip-audit reports 136 known vulnerabilities across 20 packages. uv.lock was
last resolved on 2026-06-10, and every affected package is a dev-tree
dependency with an open lower bound. `uv lock --upgrade` clears 135 of them.
The remaining one is PYSEC-2026-3740 against nltk 3.10.3, reached only through
safety: OSV records that advisory as fixed in 3.10.3, which is both the pinned
version and the latest release, so the range published to pip-audit's feed is
stale upstream. It is accepted with a dated entry and a reassess-by date, per
the project's existing policy for unfixable findings.

The refreshed lock also raises ruff, which surfaces two pre-existing issues:

  - PLR0917 on RateLimitMiddleware.__init__ (5 positional arguments). The
    tuning parameters are now keyword-only. Every call site already passes
    them by keyword through Starlette's add_middleware, so this is not a
    behaviour change.
  - N802 on the ast.NodeVisitor visit_* methods in scripts/. Those names are
    dictated by the standard library's dispatch, so renaming them would
    silently disable the visitors. Added as a scoped pep8-naming exception
    rather than inline suppressions.

Finally, .pre-commit-config.yaml pinned ruff at v0.9.0 while the lock resolves
0.16.5. The two disagreed about which rules exist, so pre-commit failed A005 on
code that `ruff check src/ tests/` accepts. The rev now tracks the lock, with
ruff-format scoped to Python so the newer Markdown code-block formatting does
not rewrite unrelated documentation.

Verified locally: ruff format, ruff check, basedpyright (0 errors), 195 tests
at 99.58% coverage, bandit, vulture, pip-audit, and pre-commit --all-files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings September 3, 2026 12:19
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 33 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Team

Run ID: 4bdd46e3-c438-4f49-a434-77cbef210c3c

📥 Commits

Reviewing files that changed from the base of the PR and between 7c2c91e and 0bde435.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock, !**/*.lock
📒 Files selected for processing (6)
  • .github/workflows/dependency-review.yml
  • .pre-commit-config.yaml
  • docs/known-vulnerabilities.md
  • osv-scanner.toml
  • pyproject.toml
  • src/foundry_unify/middleware/security.py

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

✅ FIPS Compatibility Check

Metric Count
Errors 0
Warnings 0
Info 0

Status: ✅ PASSED

What is FIPS?

FIPS 140-2/140-3 is a US government standard for cryptographic modules.
Systems running Ubuntu LTS with fips-updates or similar configurations
restrict cryptographic algorithms to NIST-approved ones.

Common issues:

  • Using hashlib.md5() without usedforsecurity=False
  • Dependencies using non-approved algorithms (bcrypt, DES, RC4)
  • Weak cipher configurations

@socket-security

socket-security Bot commented Sep 3, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedpypi/​hypothesis@​6.152.4 ⏵ 6.167.19810010010070
Updatedpypi/​numpy@​2.4.4 ⏵ 2.5.275 +110010010070
Updatedpypi/​safety@​3.7.0 ⏵ 3.8.192 +210010010070
Updatedpypi/​torch@​2.11.0 ⏵ 2.14.073100 +110010070
Updatedpypi/​scikit-learn@​1.8.0 ⏵ 1.9.075 +1100100100100
Updatedpypi/​torchvision@​0.26.0 ⏵ 0.29.079 -2100100100100
Updatedpypi/​cyclonedx-bom@​7.3.0 ⏵ 7.3.19910010010080
Updatedpypi/​pytest@​9.0.3 ⏵ 9.1.187 +1100100100100
Updatedpypi/​google-auth@​2.50.0 ⏵ 2.57.089 +1100100100100
Updatedpypi/​mkdocs-material@​9.7.6 ⏵ 9.7.790100100100100
Updatedpypi/​tensorboard@​2.20.0 ⏵ 2.21.093100100100100
Updatedpypi/​pre-commit@​4.6.0 ⏵ 4.6.293 +1100100100100
Updatedpypi/​nox@​2026.4.10 ⏵ 2026.8.1796100100100100
Updatedpypi/​sqlalchemy@​2.0.49 ⏵ 2.0.5296100100100100
Updatedpypi/​ipykernel@​7.2.0 ⏵ 7.3.097100100100100
Updatedpypi/​pip-audit@​2.10.0 ⏵ 2.10.197 +1100100100100
Updatedpypi/​mutmut@​3.5.0 ⏵ 3.7.097100100100100
Updatedpypi/​uvicorn@​0.46.0 ⏵ 0.52.498 +1100100100100
Updatedpypi/​alembic@​1.18.4 ⏵ 1.19.198 +1100100100100
Updatedpypi/​python-frontmatter@​1.1.0 ⏵ 1.3.099 -1100100100100
Updatedpypi/​python-dotenv@​1.2.2 ⏵ 1.2.399 +1100100100100
Updatedpypi/​basedpyright@​1.39.3 ⏵ 1.39.1099 +1100100100100
Updatedpypi/​python-multipart@​0.0.27 ⏵ 0.0.32100100 +19100100100
Updatedpypi/​google-api-core@​2.30.3 ⏵ 2.34.0100 +1100100100100
Updatedpypi/​pydantic@​2.13.3 ⏵ 2.13.5100 +1100100100100
Updatedpypi/​starlette@​1.2.0 ⏵ 1.6.0100 +1100 +17100100100
Updatedpypi/​ruff@​0.15.12 ⏵ 0.16.5100 +1100100100100
Updatedpypi/​mkdocs-git-revision-date-localized-plugin@​1.5.1 ⏵ 1.5.4100100100100100
Updatedpypi/​fastapi@​0.136.1 ⏵ 0.141.1100 +1100100100100
Updatedpypi/​pytest-asyncio@​1.3.0 ⏵ 1.4.0100 +1100100100100
Updatedpypi/​mkdocstrings@​1.0.4 ⏵ 1.0.6100 +1100100100100
See 5 more rows in the dashboard

View full report

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

Dependency Review

The following issues were found:
  • ❌ 1 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 1 package(s) with unknown licenses.
See the Details below.

Vulnerabilities

uv.lock

NameVersionVulnerabilitySeverity
nltk3.10.3NLTK: Model-artifact APIs bypass pathsec and touch files outside allowed rootshigh
Only included vulnerabilities with severity high or higher.

License Issues

uv.lock

PackageVersionLicenseIssue Type
cuda-bindings13.3.1NullUnknown License
Denied Licenses: AGPL-3.0, AGPL-3.0-only, AGPL-3.0-or-later, GPL-2.0-only, LGPL-2.0-only

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
pip/nltk 3.10.3 UnknownUnknown
pip/absl-py 2.5.0 UnknownUnknown
pip/alembic 1.19.1 UnknownUnknown
pip/annotated-doc 0.0.5 UnknownUnknown
pip/annotated-types 0.8.0 UnknownUnknown
pip/anyio 4.15.0 UnknownUnknown
pip/appnope 1.0.0 UnknownUnknown
pip/argcomplete 3.7.2 UnknownUnknown
pip/argon2-cffi-bindings 26.1.0 UnknownUnknown
pip/asttokens 3.0.2 🟢 4.7
Details
CheckScoreReason
Maintained🟢 34 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Code-Review🟢 6Found 12/19 approved changesets -- score normalized to 6
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing🟢 10project is fuzzed
License🟢 10license file detected
Packaging🟢 10packaging workflow detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/authlib 1.8.0 UnknownUnknown
pip/backrefs 8.0 UnknownUnknown
pip/basedpyright 1.39.10 UnknownUnknown
pip/beautifulsoup4 4.15.0 UnknownUnknown
pip/bleach 6.4.0 🟢 4.9
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Security-Policy🟢 10security policy file detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Maintained⚠️ 0project is archived
Code-Review⚠️ 0Found 0/17 approved changesets -- score normalized to 0
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 4dependency not pinned by hash detected -- score normalized to 4
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing🟢 10project is fuzzed
License🟢 9license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/certifi 2026.7.22 🟢 6.4
Details
CheckScoreReason
Code-Review🟢 3Found 1/3 approved changesets -- score normalized to 3
Maintained🟢 1013 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Security-Policy🟢 10security policy file detected
Pinned-Dependencies🟢 5dependency not pinned by hash detected -- score normalized to 5
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 9license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/cffi 2.1.1 UnknownUnknown
pip/charset-normalizer 3.5.1 UnknownUnknown
pip/click 8.5.0 UnknownUnknown
pip/cloudpickle 3.1.2 🟢 4.4
Details
CheckScoreReason
Code-Review🟢 4Found 13/29 approved changesets -- score normalized to 4
Maintained⚠️ 01 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 9license file detected
Signed-Releases🟢 82 out of the last 2 releases have a total of 2 signed artifacts.
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/colorlog 6.12.0 🟢 4.9
Details
CheckScoreReason
Maintained🟢 1016 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Code-Review⚠️ 2Found 5/18 approved changesets -- score normalized to 2
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Signed-Releases⚠️ -1no releases found
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/coverage 7.16.0 UnknownUnknown
pip/cryptography 50.0.1 UnknownUnknown
pip/cuda-bindings 13.3.1 UnknownUnknown
pip/cuda-pathfinder 1.8.1 UnknownUnknown
pip/cuda-toolkit 13.0.3.0 UnknownUnknown
pip/cyclonedx-bom 7.3.1 UnknownUnknown
pip/cyclonedx-python-lib 11.12.0 UnknownUnknown
pip/debugpy 1.8.21 UnknownUnknown
pip/decorator 5.3.1 UnknownUnknown
pip/dependency-groups 1.3.2 UnknownUnknown
pip/distlib 0.4.3 UnknownUnknown
pip/docstring-parser-fork 0.0.16 UnknownUnknown
pip/fastapi 0.141.1 UnknownUnknown
pip/fastjsonschema 2.22.2 🟢 6.4
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Maintained🟢 1030 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Code-Review🟢 3Found 7/22 approved changesets -- score normalized to 3
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Security-Policy🟢 10security policy file detected
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Fuzzing🟢 10project is fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
SAST🟢 9SAST tool detected but not run on all commits
pip/filelock 3.32.5 UnknownUnknown
pip/fsspec 2026.7.0 UnknownUnknown
pip/gitpython 3.1.61 🟢 7.2
Details
CheckScoreReason
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Code-Review⚠️ 1Found 2/11 approved changesets -- score normalized to 1
Maintained🟢 1030 commit(s) and 8 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing🟢 10project is fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ -1no releases found
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
pip/google-api-core 2.34.0 UnknownUnknown
pip/google-auth 2.57.0 🟢 8.3
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Fuzzing🟢 10project is fuzzed
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
pip/googleapis-common-protos 1.75.2 UnknownUnknown
pip/greenlet 3.5.5 UnknownUnknown
pip/griffelib 2.2.0 UnknownUnknown
pip/grpcio 1.83.1 UnknownUnknown
pip/httptools 0.8.0 UnknownUnknown
pip/humanize 4.16.0 UnknownUnknown
pip/hypothesis 6.167.1 UnknownUnknown
pip/idna 3.19 UnknownUnknown
pip/importlib-metadata 9.0.1 UnknownUnknown
pip/ipykernel 7.3.0 UnknownUnknown
pip/ipython 9.17.1 UnknownUnknown
pip/ipywidgets 8.1.9 UnknownUnknown
pip/jaraco-functools 4.6.0 UnknownUnknown
pip/joblib 1.6.0 UnknownUnknown
pip/joserfc 1.7.5 UnknownUnknown
pip/json5 0.15.0 UnknownUnknown
pip/jupyter-builder 1.2.2 UnknownUnknown
pip/jupyter-client 8.10.0 UnknownUnknown
pip/jupyter-server 2.21.0 UnknownUnknown
pip/jupyterlab 4.6.3 UnknownUnknown
pip/jupyterlab-widgets 3.0.17 UnknownUnknown
pip/libcst 1.9.0 UnknownUnknown
pip/linkify-it-py 2.2.0 UnknownUnknown
pip/lxml 6.1.3 UnknownUnknown
pip/mako 1.4.1 UnknownUnknown
pip/markdown 3.10.3 UnknownUnknown
pip/markdown-it-py 4.2.0 UnknownUnknown
pip/marshmallow 4.3.1 UnknownUnknown
pip/matplotlib-inline 0.2.2 UnknownUnknown
pip/mdit-py-plugins 0.6.1 UnknownUnknown
pip/mistune 3.3.4 UnknownUnknown
pip/mkdocs-git-revision-date-localized-plugin 1.5.4 UnknownUnknown
pip/mkdocs-material 9.7.7 UnknownUnknown
pip/mkdocstrings 1.0.6 UnknownUnknown
pip/mkdocstrings-python 2.0.8 UnknownUnknown
pip/more-itertools 11.1.0 UnknownUnknown
pip/msgpack 1.2.2 UnknownUnknown
pip/mutmut 3.7.0 UnknownUnknown
pip/narwhals 2.25.0 UnknownUnknown
pip/nbclient 0.11.0 UnknownUnknown
pip/nbformat 5.11.1 UnknownUnknown
pip/nest-asyncio2 1.7.2 UnknownUnknown
pip/nodejs-wheel-binaries 24.19.0 UnknownUnknown
pip/notebook 7.6.2 UnknownUnknown
pip/nox 2026.8.17 UnknownUnknown
pip/nox-uv 0.8.0 UnknownUnknown
pip/numpy 2.4.6 UnknownUnknown
pip/numpy 2.5.2 UnknownUnknown
pip/nvidia-cublas 13.1.1.3 UnknownUnknown
pip/nvidia-cudnn-cu13 9.24.0.43 UnknownUnknown
pip/nvidia-cusparselt-cu13 0.8.1 UnknownUnknown
pip/nvidia-nccl-cu13 2.30.7 UnknownUnknown
pip/nvidia-nvjitlink 13.3.33 UnknownUnknown
pip/packaging 26.3 UnknownUnknown
pip/pillow 12.3.0 UnknownUnknown
pip/pip 26.2.1 UnknownUnknown
pip/pip-audit 2.10.1 UnknownUnknown
pip/platformdirs 4.11.7 UnknownUnknown
pip/pre-commit 4.6.2 🟢 4.6
Details
CheckScoreReason
Code-Review⚠️ 1Found 2/12 approved changesets -- score normalized to 1
Maintained🟢 1018 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Security-Policy🟢 10security policy file detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/prettytable 3.18.0 UnknownUnknown
pip/prometheus-client 0.26.0 UnknownUnknown
pip/prompt-toolkit 3.0.53 UnknownUnknown
pip/proto-plus 1.28.4 UnknownUnknown
pip/protobuf 7.36.1 UnknownUnknown
pip/pyasn1 0.6.4 UnknownUnknown
pip/pydantic 2.13.5 UnknownUnknown
pip/pydantic-core 2.46.5 🟢 6.6
Details
CheckScoreReason
Code-Review🟢 3Found 11/29 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
License🟢 10license file detected
Binary-Artifacts🟢 10no binaries found in the repo
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/pydantic-settings 2.15.0 UnknownUnknown
pip/pydoclint 0.9.1 UnknownUnknown
pip/pygments 2.21.0 UnknownUnknown
pip/pymdown-extensions 11.0.2 UnknownUnknown
pip/pytest 9.1.1 UnknownUnknown
pip/pytest-asyncio 1.4.0 UnknownUnknown
pip/pytest-randomly 5.0.0 UnknownUnknown
pip/python-discovery 1.6.0 UnknownUnknown
pip/python-dotenv 1.2.3 UnknownUnknown
pip/python-frontmatter 1.3.0 UnknownUnknown
pip/python-json-logger 4.2.0 UnknownUnknown
pip/python-multipart 0.0.32 UnknownUnknown
pip/pywinpty 3.0.5 UnknownUnknown
pip/pyzmq 27.2.0 UnknownUnknown
pip/regex 2026.9.3 UnknownUnknown
pip/requests 2.34.2 UnknownUnknown
pip/rpds-py 2026.6.3 UnknownUnknown
pip/ruff 0.16.5 UnknownUnknown
pip/safety 3.8.1 UnknownUnknown
pip/scikit-learn 1.9.0 UnknownUnknown
pip/scipy 1.18.1 UnknownUnknown
pip/setuptools 84.0.0 UnknownUnknown
pip/soupsieve 2.9.2 UnknownUnknown
pip/sqlalchemy 2.0.52 UnknownUnknown
pip/starlette 1.6.0 UnknownUnknown
pip/stevedore 5.8.0 UnknownUnknown
pip/stevedore 5.9.1 UnknownUnknown
pip/structlog 26.1.0 UnknownUnknown
pip/tensorboard 2.21.0 🟢 7.3
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Maintained🟢 1024 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Security-Policy🟢 9security policy file detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Binary-Artifacts🟢 10no binaries found in the repo
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Fuzzing⚠️ 0project is not fuzzed
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/textual 8.2.8 UnknownUnknown
pip/tinycss2 1.5.1 UnknownUnknown
pip/tomlkit 0.15.1 UnknownUnknown
pip/torch 2.14.0 UnknownUnknown
pip/torchvision 0.29.0 🟢 5.4
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 8 issue activity found in the last 90 days -- score normalized to 10
Code-Review🟢 9Found 27/30 approved changesets -- score normalized to 9
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Fuzzing⚠️ 0project is not fuzzed
Security-Policy⚠️ 0security policy file not detected
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 2branch protection is not maximal on development and all release branches
SAST🟢 7SAST tool is not run on all commits -- score normalized to 7
pip/tornado 6.5.8 UnknownUnknown
pip/tqdm 4.70.0 UnknownUnknown
pip/traitlets 5.16.1 UnknownUnknown
pip/triton 3.8.0 UnknownUnknown
pip/truststore 0.10.4 UnknownUnknown
pip/typing-extensions 4.16.0 UnknownUnknown
pip/typing-inspection 0.4.4 UnknownUnknown
pip/tzdata 2026.3 🟢 7
Details
CheckScoreReason
Maintained🟢 68 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
Code-Review🟢 8Found 17/20 approved changesets -- score normalized to 8
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 4dependency not pinned by hash detected -- score normalized to 4
License🟢 9license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/uvicorn 0.52.4 UnknownUnknown
pip/virtualenv 21.7.8 UnknownUnknown
pip/watchfiles 1.2.0 🟢 3.4
Details
CheckScoreReason
Code-Review🟢 3Found 9/26 approved changesets -- score normalized to 3
Maintained⚠️ 01 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/wcwidth 0.8.3 UnknownUnknown
pip/webencodings 0.6.1 UnknownUnknown
pip/websocket-client 1.9.2 🟢 3.7
Details
CheckScoreReason
Code-Review⚠️ 2Found 8/30 approved changesets -- score normalized to 2
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Packaging⚠️ -1packaging workflow not detected
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing🟢 10project is fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
pip/websockets 16.1.1 UnknownUnknown
pip/websockets 17.1 UnknownUnknown
pip/widgetsnbextension 4.0.16 UnknownUnknown
pip/zipp 4.1.0 UnknownUnknown

Scanned Files

  • uv.lock

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The changes are consistent with the stated CI/security-gate fixes and the updated middleware/tooling configuration is internally consistent with existing call sites and documentation.

Pull request overview

Repairs CI/Security gate failures on main by removing dead OSV ignore entries, upgrading the lock/toolchain to clear pip-audit findings, and documenting/accepting the single remaining (stale-range) advisory so automated security checks can pass reliably.

Changes:

  • Make RateLimitMiddleware tuning parameters keyword-only to satisfy updated Ruff rules without changing Starlette middleware wiring.
  • Update Ruff configuration to allow ast.NodeVisitor-required visit_* method names, and align pre-commit’s Ruff hook version with the locked toolchain.
  • Remove withdrawn OSV ignore entries, add a single documented/dated pip-audit ignore, and record the resolution/acceptance in docs/known-vulnerabilities.md.
File summaries
File Description
src/foundry_unify/middleware/security.py Makes rate-limit tuning parameters keyword-only (compatible with add_middleware usage).
pyproject.toml Adds targeted Ruff naming exception for visit_* and updates pip-audit ignore to the single documented advisory.
osv-scanner.toml Removes withdrawn/dead ignore entries that caused OSV to fail with “unused ignores”.
docs/known-vulnerabilities.md Documents acceptance of PYSEC-2026-3740 and records resolution of the withdrawn py advisory.
.pre-commit-config.yaml Aligns ruff-pre-commit version with the locked Ruff version and scopes formatting to Python files.
Review details
  • Files reviewed: 5/6 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@williaby
williaby enabled auto-merge September 3, 2026 12:28
williaby and others added 2 commits September 3, 2026 05:31
The previous commit removed the withdrawn CVE-2022-42969 ignores and
refreshed uv.lock, which took OSV from 136 findings to one. That last one
still failed the job, because osv-scanner reads osv-scanner.toml and
nothing there covered it:

  Scanned /github/workspace/uv.lock file and found 302 packages
  Loaded filter from: /github/workspace/osv-scanner.toml
  Exit code: 1

The results artifact identifies it as GHSA-8mgp-746c-j5xp against nltk
3.10.3 (aliases CVE-2026-81726, PYSEC-2026-3740), CVSS 8.3.

There is no version to upgrade to. The OSV record ranges from introduced 0
to last_affected 3.10.3 with no fixed event, and 3.10.3 is both the pinned
version and the newest release on PyPI:

  curl -s https://api.osv.dev/v1/vulns/GHSA-8mgp-746c-j5xp
  -> [{'introduced': '0'}, {'last_affected': '3.10.3'}]
  curl -s https://pypi.org/pypi/nltk/json -> 3.10.3

Exposure is confined to development environments. nltk is not imported
anywhere in src/; it arrives only through safety, which is declared in the
dev and supply-chain extras, so it is absent from the runtime install:

  nltk v3.10.3
  └── safety v3.8.1
      ├── foundry-unify v0.1.0 (extra: dev)
      └── foundry-unify v0.1.0 (extra: supply-chain)

Accepted via the org's documented path: an ignore entry paired with a
dated entry in docs/known-vulnerabilities.md, reassess by 2026-11-02.

Two corrections to the earlier commit while here. Both the pyproject
comment and the docs entry claimed OSV recorded the advisory as fixed in
3.10.3 and that the range was merely stale. The OSV record says
last_affected, not fixed, so 3.10.3 is affected and no fix exists. The
rationale is now stated accurately. The docs entry also records that
pip-audit 2.10.1 does not read [tool.pip-audit] at all, so that table
documents the accepted risk rather than suppressing a live gate.

Verified with the scanner version CI pins:

  osv-scanner v2.3.8 --lockfile=uv.lock  ->  "No issues found", exit 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dependency Review failed on this PR with the same advisory osv-scanner
flagged:

  uv.lock » nltk@3.10.3 - NLTK: Model-artifact APIs bypass pathsec and
  touch files outside allowed roots (high severity)
  GHSA-8mgp-746c-j5xp
  ##[error]Dependency review detected vulnerable packages.

The workflow only runs on pull requests that touch pyproject.toml,
uv.lock or requirements*.txt, which is why no other open PR shows it. The
advisory covers every published nltk version (introduced 0, last_affected
3.10.3, no fixed event), so every future dependency PR would fail the same
way, Renovate updates included, on something no one can act on.

allow-ghsas waives exactly this one id. fail-on-severity stays at high, so
every other high or critical advisory still blocks the PR, and the
deny-licenses list is untouched. This is the third and last suppression
for the same accepted risk, alongside osv-scanner.toml and the
[tool.pip-audit] record, all three tied to the dated entry in
docs/known-vulnerabilities.md with a 2026-11-02 reassessment.

Verified: actionlint clean, pre-commit clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@williaby
williaby added this pull request to the merge queue Sep 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Sep 3, 2026
@williaby
williaby added this pull request to the merge queue Sep 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Sep 3, 2026
@williaby
williaby added this pull request to the merge queue Sep 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants