fix(safetensors): validate zero-based shards and bind retained inputs#1668
fix(safetensors): validate zero-based shards and bind retained inputs#1668mldangelo-oai wants to merge 84 commits into
Conversation
|
@codex review |
Performance BenchmarksCompared Top regressions:
|
|
Codex Review: Didn't find any major issues. Chef's kiss. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
@codex review |
|
Codex Review: Didn't find any major issues. Bravo. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Independent Review: promptfoo/modelaudit PR #1668DispositionBLOCK / DO NOT MERGE at head The branch is conflict-free and exact-head CI is green, but three deterministic medium-severity defects remain in the new SafeTensors index/base handling. The exact pinned MiniCPM5 artifact also still exits Exact review target
Findings
1. Medium: Remote SafeTensors indexes can widen an explicit SafeTensors-only selection to foreign shard formatsAffected code: The remote validator calls the generic Exact-head reproduction:
Impact: a malformed index in an untrusted Hub repository can force a nominally SafeTensors-only scan to download an arbitrarily large foreign shard. Required fix: validate targets with Validator result: 2. Medium: Local indexes with nested shard targets are ignored, allowing a missing indexed shard to scan cleanlyAffected code:
Exact-head reproduction:
Impact: an indexed local artifact can omit a declared shard and substitute an unreferenced same-family shard while ModelAudit reports complete coverage. This contradicts the PR's claim that validated index inventories are authoritative and that missing/unreferenced evidence fails closed. Required fix: discover and validate governing index files at directory-discovery scope, map each safe relative target to the indexed family, and carry that inventory into grouped shard scanning. Add direct-directory tests for nested zero- and one-based targets, missing targets, unreferenced substitutes, traversal, symlink aliases, and index mutation. Validator result: 3. Medium: Streaming accepts a mixed-base/unreferenced total-1 family and regresses from exit 2 to exit 0Affected code: Base inference is performed independently for each streamed file. For The remote index validator compounds this by checking that referenced targets exist but not rejecting unreferenced same-pattern/same-total siblings. Exact-head reproduction:
Impact: the PR introduces a fail-open for mixed-base streamed inventories and does not enforce its stated rejection of unreferenced same-family shards. The same ambiguity applies to larger no-index families where Required fix: reject unreferenced same-pattern/same-total siblings while validating a remote index, carry authoritative base/inventory metadata into streaming reconciliation, and emit an explicit incomplete result when combined validated targets have invalid cardinality or mixed base instead of merely declining to remove prior errors. Add head-vs-base regression tests for total 1 and larger ambiguous families. Validator result: 4. Low: The user-visible fix has no required
|
| Evidence | Observed |
|---|---|
| Index bytes | 18004 |
| Index SHA-256 | 162add042e75abc3d571c4a8679523fa4f1ffc55d1fea25fc6658a19d6e957ee |
| Real shard range bytes | 25248 |
| Header length | 25240 |
| Header payload SHA-256 | bca5391cbdf4bc5ae84d62b82d46ec3a5030a77d171faed609b723a1f4a2efb0 |
| Prefix + header SHA-256 | ecbdf640e2ce4cf283b3d6d7c758d7cf71cfbbd30c3aea04601f36f8999c5675 |
| Sparse logical shard size | 2161290912 bytes |
| Sparse allocated blocks | 56 filesystem blocks |
Exact-head CLI result on that index plus real header in the correctly sized sparse shard:
- Exit
2. success=false,has_errors=true,files_scanned=2.- Failure:
Shard Scan Pinning. - Reason:
shard_pin_unavailable/descriptor-bound shard pinning unavailable.
Relevant paths: modelaudit/utils/file/handlers.py:192-222,862-901,1621-1642.
The focused test slice showed the same limitation: 35 passed, 11 failed, and 4 skipped on macOS; every failure stopped at shard pinning before the intended scanner assertion. The repo already explicitly skips several descriptor-path tests on Darwin, but the new ordinary zero-/one-based shard tests are not platform-gated and therefore fail locally. The PR either needs a secure single-shard/macOS path or must explicitly scope and test the limitation rather than claiming universal exit 0 for the motivating artifact.
Validation evidence
Live GitHub state
- Exact head rechecked immediately before report generation:
058eeb66d5f93e4fc25a21507a3a84f4d4a75ce8. - Exact base:
8d6c4864fe2ea833ceaef1b9803d225afb1e8d69. - Checks: 23 passing, 6 skipped, 0 pending/failing.
- CI umbrella jobs, Python 3.10/3.13, Windows, lint/format, type check, build/package, dependency audit, CodeQL, Docker, docs, title, and benchmarks all report success.
- Benchmark bot comment reports one threshold regression: duplicate registry snapshot
+16.0%; aggregate shared-benchmark median was+7.8%. The regressed workload contains no SafeTensors files, so it was retained as non-blocking noise rather than promoted to a code finding. - Reviews: 0. Review threads: 0 total and 0 unresolved.
Static and focused runtime checks
git diff --check origin/main...HEAD: passed.- Ruff on all seven changed files: passed.
- Mypy on
modelaudit/core.py,modelaudit/utils/file/handlers.py, andmodelaudit/utils/sources/huggingface.py: passed. - Adding
modelaudit/cli.pyto the local mypy invocation exposed three pre-existing Darwin stub errors foros.listxattr,os.setxattr, andos.getxattr; exact-head CI's Type Check is green. - Platform-independent focused slice: 5 passed, covering snapshot/streaming zero-based selection, missing remote target rejection, and huge declared shard-total bounding.
- Six zero-/one-based streaming and malicious-finding assertions passed when only the unavailable Darwin descriptor transport was replaced; malicious findings remained exit
1. - A
10 MiB + 1sparse local index failed closed assafetensors index exceeds bounded parse limit, withunvalidated_shard_count=1. - The exact pinned MiniCPM5 index/header hashes matched every immutable value stated in the PR body.
Focused test command with platform result
The requested focused PR slice completed as:
35 passed, 11 failed, 4 skipped
The 11 failures were all the known macOS shard_pin_unavailable path, including the newly parameterized zero-/one-based tests. They are not evidence that Linux CI is stale: exact-head GitHub CI is green. They are evidence that the motivating behavior is not portable to the current macOS runtime.
Review-lane conclusions
- Gatekeeper: review required; open, non-trivial, runtime/security change.
- Policy paths: only root
AGENTS.mdapplies; one changelog violation validated. - Diff-only and contextual bug review: three runtime defects validated above; no additional compile/import defect.
- Review-thread reconciliation: no threads or reviews exist; no stale feedback to discount.
- History/intent: one commit, no linked issue; the change targets the filename-only SafeTensors coverage gap using the pinned MiniCPM5 model.
- Code-comment verification: no contradictory changed inline comment survived validation. The PR body security claims are broader than the implementation in findings 2 and 3.
- Behavior impact: explicit scanner selection can be widened to foreign downloads; local and streamed coverage can report clean for inconsistent inventories.
- Repo-surface/cross-repo: no rename, generated contract, or second-repository change.
- Branch/CI: current with
main; no analysis merge needed; exact-head CI green.
Required disposition before rereview
- Restrict remote index targets to the exact SafeTensors shard pattern before selection expansion.
- Carry governing nested index inventories into local grouped shard scans.
- Reject unreferenced same-family remote siblings and emit explicit incomplete outcomes for mixed/invalid streamed families.
- Add macOS-aware acceptance coverage for the pinned one-shard MiniCPM5 case or explicitly document and enforce the platform limitation.
- Add the required
[Unreleased]changelog entry. - Rerun exact real-artifact QA, focused adversarial tests, full fast CI, and a new macOS shard lane at the final head.
|
New pinned all-format QA on main
Please add this exact complete two-shard/index family to current-head QA. Repository/index reconciliation must happen before per-file missing-family outcomes are aggregated; a complete family must not exit 2. Audit: |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9891fd530d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c0759322f0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
|
Codex Review: Didn't find any major issues. More of your lovely PRs please. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
Fleet sequencing note: keep the goal active and continue the full review, simplification, conflict resolution, validation, title/body cleanup, and exact-head CI work. Please hold only the final merge until Nightly repair PR #1679 reports MERGED. Immediately afterward, fetch the new |
|
Review closeout at current head
The branch contains additive merges from |
|
Fleet release: Nightly repair PR #1679 is MERGED as |
|
Fleet sequencing complete: #1679 merged as Post-sync local gates are clean: 703 passed / 35 optional or real-network skips across the affected SafeTensors, Hugging Face, streaming, handler, and #1679 six.moves surfaces; repository-wide Ruff format/check and full mypy also pass. The final gate is exact-head CI on |
|
Serial landing update: #1673 is the next release gate because it is a one-test fail-closed regression with a fully green pre-sync run. Continue your current-main sync, review, simplification, and CI work, but hold the final merge until #1673 reports MERGED. This avoids making #1673 restart against an unrelated large feature branch. Keep the goal active; once #1673 lands, merge the newest main again if needed and complete your exact-head landing cycle. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1c7333a1c3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Share bounded SafeTensors discovery state across explicit families while isolating speculative failures. Bind direct Hugging Face downloads and receipt-only POSIX paths to retained generations, and make streaming cleanup reject generation swaps.
|
@codex review Please review exact head |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b868600785
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Quarantine streamed cleanup candidates before generation verification, isolate speculative SafeTensors index failures per probe while sharing aggregate budgets, and keep Windows receipt matching bound to the guarded resolved target.
|
@codex review Please review exact head |
|
Codex Review: Didn't find any major issues. Chef's kiss. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
@codex review for security vulnerabilities Please perform a security-focused review of exact head |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ee9a19a21
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ee9a19a21
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Validate Windows guard entries immediately around handle acquisition, bind reparse lexical identity to stable structure while resolved receipts and handles own object identity, and treat access-denied ancestor substitution as a successful guard outcome.
|
@codex review Please review exact head |
|
Codex Review: Didn't find any major issues. 🚀 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Restore quarantined index and streamed-source generations without overwriting recreated paths. Keep caller-supplied Hugging Face cache directories outside invocation-owned cleanup, and make the deadline regression deterministic.
|
@codex review for security vulnerabilities Please perform a security-focused review of exact head |
|
@codex review Please review exact head |
|
Codex Review: Didn't find any major issues. Swish! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
💡 Codex Review
https://github.com/promptfoo/modelaudit/blob/6a437d6a05e17182e13f54ac23c6656eac1df77e/core.py#L10722
Include ctime when deleting index candidates
When a SafeTensors index candidate is rewritten in place after classification but before cleanup, dev/ino/mode/size/mtime can still match because mtime can be restored, while ctime changes. This post-rename proof compares only the truncated stat[:5] identity, so cleanup can unlink that newer index generation instead of preserving it for terminal validation; compare the full captured identity, including st_ctime_ns, before deleting the tombstone.
https://github.com/promptfoo/modelaudit/blob/6a437d6a05e17182e13f54ac23c6656eac1df77e/core.py#L11073-L11074
Include ctime when deleting streamed sources
When a streamed source is rewritten in place between the pre-cleanup identity check and the quarantine rename, the inode can keep the same dev/ino/size/mode and restored mtime while ctime changes. Comparing only expected_cleanup_identity.stat[:5] lets cleanup treat that replacement as the scanned generation and unlink it, instead of restoring or preserving it as a boundary failure; compare the full captured stat tuple before deleting the tombstone.
modelaudit/modelaudit/utils/sources/huggingface.py
Lines 6502 to 6503 in 6a437d6
For streaming Hugging Face scans with overlap scanners active and a tight --max-download-bytes, a declared .safetensors whose size is at most _HF_CONTENT_SNIFF_BYTES is already charged for the full prefix read by min(file_size, _HF_CONTENT_SNIFF_BYTES). This branch adds the whole file size a second time before the actual header scan, so minimum_selected_bytes can exceed the limit even when the real prefix plus bounded header reads would fit; only reserve the additional header bytes that will actually be fetched.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Keep index tombstones in retained private same-filesystem directories so validated cleanup cannot unlink a swapped generation. Evaluate descriptor-bound cache eligibility using the guarded logical path, including shard-family bypasses.
|
@codex review for security vulnerabilities Please perform a security-focused review of exact head |
|
@codex review Please review exact head |
There was a problem hiding this comment.
💡 Codex Review
modelaudit/modelaudit/utils/sources/huggingface.py
Lines 5503 to 5505 in 9146250
When streaming with a caller-supplied persistent cache_dir whose final component starts with modelaudit_hf_, this treats files under the deterministic Hugging Face download_path as invocation-owned and later unlinks context-only ONNX sidecars. If that sidecar already existed in the caller's cache/local dir, the scan deletes caller-owned data; cleanup should be tied to an explicit temp/staging ownership marker rather than the cache directory name.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
@codex review exact head 5584839 Please perform a fresh full correctness and security review of this exact head. Revalidate retained local/unrooted/Hugging Face generation binding, OpenVINO consumed-companion identity, SafeTensors cleanup quarantine and content proof, zero/one-based index authority, bounded shard discovery/futures/descriptors, Windows reparse semantics, cache integrity, and fail-closed terminal coverage. Treat every earlier SHA as stale. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 55848391d7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review exact head b04f5c0717979282da58d7f9dc46160597b64d35 |
|
Codex Review: Didn't find any major issues. Keep them coming! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
What and why
Make SafeTensors shard coverage honor validated
*.safetensors.index.jsoninventories, including legitimate zero-based families such asmodel-00000-of-00001.safetensors, without weakening one-based coverage, scanner-selection boundaries, cache integrity, or fail-closed behavior.Filename-only inference treated every family as one-based. This change carries bounded index authority through local, explicit, streaming, and Hugging Face scans and refuses to certify coverage when that authority or the retained input namespace cannot be reproduced at the terminal scan boundary.
Release and base integration
914625043473ccce96a0b84909251ab846504774.main@3cf924f2cad4345570ede7a0aba785604f610065.8245a965additively merged the live PR heade3c76f7d, preserving its deterministic Windows fixture update.5eb797a9additively merged currentorigin/main, including coordinator release gate ci: shard Python coverage across runners #1682, disjoint Docker digest PR chore(deps): update python:3.12-slim docker digest to d764629 #1686, and subsequent Nightly CI changes.21ca415dcloses retained-input, companion-namespace, OCI accounting, ONNX alias, and Hugging Face routing gaps found by exact-head review.534f36e9removes attacker-controlled path and exception text from hash-failure logs after exact-head CodeQL identified a clear-text secret flow.398b2b36keeps Windows ancestor handles rename-denying but directory-write-compatible and stops unrelated sibling/cache creation from invalidating ordinary directory identity.3e0ef439retains trusted ancestor index authority when multiple complete same-shape families are selected, requests a native Windows delete-access directory guard, and distinguishes stable directory identity from ordinary child metadata changes.20821c1ebinds streamed SafeTensors shard and index reads to the retained local-source descriptor tree, including symlink targets; keeps every hash-failure log generic; and isolates the explicit-authority regression from unrelated concurrent test directories.ae8ce191rejects a retained symlink target descriptor unless it matches the initially captured namespace generation, closing a pre-open replace-and-restore window.5c1417c2captures trusted Hugging Face snapshot blob generations before generator execution and binds every retained local-stream input through the descriptor tree, including scan-and-delete aliases.a33b912bevaluates common ancestor indexes against every selected same-shape family while isolating speculative broad-directory failures; it also makes the authority fixtures independent of the process umask.5f6ef367shares one bounded index-inspection budget across selected same-shape explicit families, constrains speculative ancestor authority to their deterministic common scope, and fails closed when the aggregate listing cap is exhausted.1c7333a1binds Windows reparse receipts to stable object identity, attributes, and tag instead of volatile timestamps while preserving POSIX symlink A-B-A detection; it also makes late-checkpoint routing order deterministic across retained and staged path aliases.b8686007shares aggregate index-discovery budgets across every explicit family group, retains receipt-only POSIX lexical chains, binds direct Hugging Face downloads before dispatch, and makes scan-and-delete cleanup reject a replaced pathname generation.2ee9a19amoves scan-and-delete candidates into a private same-filesystem tombstone before generation verification, isolates speculative index failures per probe while retaining one aggregate budget, and keeps Windows dispatch receipts bound to the resolved object protected by retained handles.a4051a1bvalidates each Windows source entry immediately around handle acquisition, keeps reparse lexical receipts on stable structural fields while target receipts and handles own object identity, and treats a denied ancestor rename as successful guard enforcement.6a437d6arestores quarantined replacement generations without overwriting recreated paths, limits failed-download cleanup to invocation-owned Hugging Face staging, and makes the dispatch-deadline regression deterministic.91462504moves index deletion into retained private same-filesystem quarantine and evaluates descriptor-bound cache eligibility against the guarded logical path, preventing post-validation tombstone substitution and stale shard-family cache reuse.Security and correctness behavior
Current diff versus
main@3cf924f2+11,986 / -914across 17 files.+17,351 / -2,573across 20 files.+29,337 / -3,487across 37 files, net+25,850.The simplification review consolidated duplicated Hugging Face route-policy derivation into one shared helper. The final delta review kept descriptor binding and platform-specific guards explicit because collapsing those boundaries would obscure distinct fail-closed invariants; no unused compatibility layer or safely removable branch remains.
Validation at exact head
914625043473ccce96a0b84909251ab84650477421,276 passed, 921 skipped, 40 warningsin 17m31s.1,591 passed, 84 skipped, 4 warningsin 2m05s.226 passed, 3 skippedin 7.11s.667 passed, 18 skippedin 24.81s.167 passed, 3 skippedin 11.68s.264 passed, 32 skippedin 23.17s.7 passed, 1 Windows-only skippedlocally.os.name; Windows receipt comparison binds the resolved target; each lexical entry is checked immediately around handle acquisition; and stable reparse hashes exclude volatile file-index metadata. Native Windows and Python 3.10 exact-head CI remain the terminal proof.git diff --check: clean.a1378389c851f2b211c5f1c9dd51d2eba085b22bc0c80ccc529d1d555d976b94.88958012f6604cdfad4ec9f25af97d476d3fc6b3.uv.lockis byte-identical at head and base: blob9d4a0c584f2a0b3c622dde29113c96fdd0e6c786.Pinned real-artifact corroboration from the reviewed lineage remains unchanged:
openbmb/MiniCPM5-1B@4e9de7a0778dc1c362e983e6858f0e77542cbdca: zero-based indexed sparse-header probe exited 0 with complete coverage.Hcompany/Holo-3.1-4B@b63fb9bacd968a20b31d0c704b14429c0aad3a84: two-shard sparse-header probe exited 0 with complete coverage.Remaining merge gate
This worker must not merge. Fresh exact-head Codex correctness/security review and exact-head CI must finish green or skipped, every actionable review thread must be resolved, and base/head/mergeability must be refreshed against the same SHA before coordinator handoff.
The current Dependency Audit baseline is waiting on coordinated aiohttp #1698 and cryptography #1697 upgrades; this PR intentionally retains a byte-identical
uv.lock.Exact-head remediation at 5584839
Exact-head timeout remediation at b04f5c0