Skip to content

chore(deps): hand-roll four minor/patch bumps, keeping the setuptools CVE floor - #289

Merged
Gavin-Borges merged 3 commits into
mainfrom
chore/deps-minor-patch-2026-08-24
Aug 26, 2026
Merged

chore(deps): hand-roll four minor/patch bumps, keeping the setuptools CVE floor#289
Gavin-Borges merged 3 commits into
mainfrom
chore/deps-minor-patch-2026-08-24

Conversation

@Gavin-Borges

Copy link
Copy Markdown
Owner

Replaces #285 and #287, both closed unmerged. Applies the same four bumps they proposed - hypothesis 6.165.9 -> 6.165.10, pygments 2.20.0 -> 2.21.0, fastjsonschema 2.22.1 -> 2.22.2, nbformat 5.11.0 -> 5.11.1 - without the two defects that made them unmergeable.

Why #287 could not be merged

Its compiled requirements.txt silently dropped the setuptools==84.0.0 entry entirely, including the # via -r requirements.in / # via torch trace showing two consumers, while leaving requirements.in untouched and still implying setuptools is required.

That pin is what closes GHSA-h35f-9h28-mq5c per requirements.in:15-21. Root requirements.txt is installed --no-deps --require-hashes in four workflows, so under --no-deps the file IS the install set - the advisory fix genuinely would not have been installed.

The hash-pin gate could not have caught this, and that distinction is the durable part: deleting a requirement removes its --hash= lines with it, so a pin gate sees a fully-hashed file and nothing wrong. tools/check_lockfile_freshness.py is what catches this shape.

Why #285 could not be merged

Its environments/requirements-ci.txt rewrote five provenance comments from # via -r environments/requirements-ci.in to # via -r requirements-ci.in - what the compiler emits when run from inside environments/ rather than the repo root. Neither PR regenerated environments/requirements.lock, which shares the hypothesis pin and would have gone stale against the file they did change.

What this branch does instead

Regenerates all ten managed lockfiles through tools/update_dependencies.py from the repo root, keeping setuptools==84.0.0. Only five files carry a content change; the other five recompiled byte-identical. environments/requirements-ci-render.txt is tier 4 (hand-maintained, no .in source, per CONTRIBUTING.md's dependency-tier table) and was edited following its own header recipe rather than compiled.

Verification

Every hash was verified against the live PyPI JSON API rather than trusted from the Dependabot diff. All six changed digests across the three tier-4 packages resolve to a real published artifact of the stated version - one wheel and one sdist each.

The tier-4 hand-edit independently reproduced Dependabot's own blob (ec4c697) byte-for-byte, which is the strongest available check that the hand-edit and the tool agree on that file.

Gates run locally: check_lockfile_freshness.py --check (10/10 fresh and fully hashed), check_hash_pins.py (13 manifests, all pinned), check_doc_line_citations.py, check_doc_commit_refs.py, git diff --check, and the full fast test suite via the pre-push gate.

One expected CI failure

docs/sbom.json is deliberately not touched here. It is a generated supply-chain attestation and security.yml forbids hand-editing rows - editing them would fabricate freshness in an attestation. The SBOM freshness gate will go red once on this branch; the fix is the sanctioned path the workflow itself documents, downloading the python-sbom artifact and committing it over the copies in docs/. Expect exactly that one failure and no other.

… CVE floor

Dependabot proposed exactly these four bumps across #285 and #287. Both were
closed unmerged, for different reasons, and this replaces them.

#287 was a security regression. Its compiled requirements.txt silently dropped
the setuptools==84.0.0 entry - including the `# via -r requirements.in` /
`# via torch` trace showing two consumers - while leaving requirements.in
untouched and still implying setuptools is required. That pin is what closes
GHSA-h35f-9h28-mq5c per requirements.in:15-21. Root requirements.txt is
installed --no-deps --require-hashes in four workflows, so under --no-deps the
file IS the install set and the advisory fix would genuinely not have been
installed. The hash-pin gate could not have caught it: deleting a requirement
removes its --hash= lines with it, so a pin gate sees a fully-hashed file and
nothing wrong. check_lockfile_freshness.py is what catches this shape.

#285 was a wrong-working-directory artifact. Its environments/requirements-ci.txt
rewrote five provenance comments from `# via -r environments/requirements-ci.in`
to `# via -r requirements-ci.in`, which is what the compiler emits when run from
inside environments/ rather than the repo root. Neither PR regenerated
environments/requirements.lock, which shares the hypothesis pin and would have
gone stale against the file they did change.

This branch regenerates all ten managed lockfiles through
tools/update_dependencies.py from the repo root, keeping setuptools==84.0.0.
Only five files carry a content change; the other five recompiled byte-identical.
environments/requirements-ci-render.txt is tier 4 (hand-maintained, no .in
source) and was edited per its own header recipe rather than compiled.

Every hash was verified against the live PyPI JSON API rather than trusted from
the Dependabot diff: all six changed digests across the three tier-4 packages
resolve to a real published artifact of the stated version, one wheel and one
sdist each. The tier-4 edit independently reproduced Dependabot's own blob
(ec4c697) byte-for-byte, which is the strongest available check that the
hand-edit and the tool agree.

Gates run: check_lockfile_freshness.py --check (10/10 fresh and fully hashed),
check_hash_pins.py (13 manifests, all pinned), check_doc_line_citations.py,
check_doc_commit_refs.py, git diff --check, and the fast test suite.

docs/sbom.json is deliberately NOT touched here. It is a generated
supply-chain attestation and security.yml forbids hand-editing rows, so it is
refreshed via the sanctioned download-the-CI-artifact path after the first run
on this branch goes red. Expect exactly that one failure.

Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
Both artifacts were taken verbatim from the `python-sbom` artifact uploaded by
the Security Scan run on this branch (run 32807744961), which is the path
security.yml documents. They were NOT hand-edited: editing individual rows
would fabricate freshness in an attestation downstream tooling reads as
authoritative, which is the thing that gate exists to prevent.

The gate reported exactly one drifted package - `docs/sbom.json` listed
hypothesis==6.165.9 where the freshly generated artifact reported 6.165.10 -
across 147 packages present in both. Verified before committing that the
downloaded pair differs from the committed pair in that one row and nothing
else: same 147 packages on both sides, one version delta, no additions and no
removals. A larger row-count change would have meant something other than this
bump moved, and would have needed explaining rather than committing.

Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
@Gavin-Borges
Gavin-Borges merged commit 58c174a into main Aug 26, 2026
21 checks passed
@Gavin-Borges
Gavin-Borges deleted the chore/deps-minor-patch-2026-08-24 branch August 26, 2026 02:32
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.

1 participant