Skip to content

build(deps): update numpy requirement from >=2.5.2 to >=2.5.3 in /services/data - #516

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/services/data/numpy-gte-2.5.3
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/services/data/numpy-gte-2.5.3

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 11, 2026

Copy link
Copy Markdown
Contributor

Updates the requirements on numpy to permit the latest version.

Release notes

Sourced from numpy's releases.

v2.5.3 (Sep 6, 2026)

NumPy 2.5.3 Release Notes

The NumPy 2.5.3 is a patch release that fixes bugs discovered after the 2.5.2 release. Apart from the usual bug and maintenance work, there are a number of StringDType related fixes for problems discovered during the ongoing string work in the main branch.

This release supports Python versions 3.12-3.15

Changes

  • Casting a fixed-width byte string array (np.bytes_) to StringDType now raises TypeError when the bytes are not valid UTF-8. Previously the invalid bytes were stored as-is and later caused undefined behavior in string operations.

    (gh-32296)

  • MaskedArray._fill_value would become stale when ufuncs that change dtype left the result holding a fill_value typed for the old dtype. The mismatch was silent until something later called _check_fill_value, such as .view(), and then a TypeError would be raised. Now, when the copied fill_value is no longer valid for the new dtype, fall back to the default fill_value for that dtype instead of propagating the stale value. This may raise a ComplexWarning if the fill_value is complex and the new dtype is real.

    (gh-32423)

Contributors

A total of 9 people contributed to this release. People with a "+" by their names contributed a patch for the first time.

  • Charles Harris
  • Iason Krommydas
  • James Davies +
  • Joren Hammudoglu
  • Maanas Arora
  • Matti Picus
  • Nathan Goldbaum
  • Shikhar Goel +
  • Yeonho Kim +

Pull requests merged

A total of 27 pull requests were merged for this release.

  • #32235: MAINT: Prepare 2.5.x for further development

... (truncated)

Changelog

Sourced from numpy's changelog.

This is a walkthrough of the NumPy 2.4.0 release on Linux, which will be the first feature release using the numpy/numpy-release <https://github.com/numpy/numpy-release>__ repository.

The commands can be copied into the command line, but be sure to replace 2.4.0 with the correct version. This should be read together with the :ref:general release guide <prepare_release>.

Facility preparation

Before beginning to make a release, use the requirements/*_requirements.txt files to ensure that you have the needed software. Most software can be installed with pip, but some will require apt-get, dnf, or whatever your system uses for software. You will also need a GitHub personal access token (PAT) to push the documentation. There are a few ways to streamline things:

  • Git can be set up to use a keyring to store your GitHub personal access token. Search online for the details.

Prior to release

Add/drop Python versions

When adding or dropping Python versions, multiple config and CI files need to be edited in addition to changing the minimum version in pyproject.toml. Make these changes in an ordinary PR against main and backport if necessary. We currently release wheels for new Python versions after the first Python RC once manylinux and cibuildwheel support that new Python version.

Backport pull requests

Changes that have been marked for this release must be backported to the maintenance/2.4.x branch.

Update 2.4.0 milestones

Look at the issues/prs with 2.4.0 milestones and either push them off to a later version, or maybe remove the milestone. You may need to add a milestone.

Check the numpy-release repo

... (truncated)

Commits
  • dd88c0c Merge pull request #32511 from charris/prepare-2.5.3
  • edcac6a REL: Prepare for the NumPy 2.5.3 release
  • fd4d908 Merge pull request #32509 from charris/backport-32496
  • 65bb1da BUG: fix crash in ufunc.resolve_dtypes with a Python scalar type (#32496)
  • 294956e Merge pull request #32506 from charris/backport-32503
  • 26428d9 DOC: fix scipy docs links in intersphinx mapping (#32507)
  • 5fab1cb DOC: use static scipy doc site for intershpinx (#32503)
  • 7beed2f Merge pull request #32481 from ngoldbaum/stringdtype-backport
  • 8972f70 Merge pull request #32478 from charris/backport-32466
  • ab1b589 Merge pull request #32477 from charris/backport-32423
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Updates the requirements on [numpy](https://github.com/numpy/numpy) to permit the latest version.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](numpy/numpy@v2.5.2...v2.5.3)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.5.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python Pull requests that update python code labels Sep 11, 2026
@strix-security

Copy link
Copy Markdown

Strix is installed on this repository, but we couldn't run this PR security review because this workspace's trial has ended. Add a card to resume code reviews here.

So far, Strix has reviewed 28 pull requests, surfaced 3 security issues (1 critical/high) and blocked 2 risky merges across this workspace.

@coderabbitai

coderabbitai Bot commented Sep 11, 2026

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: d051f0b6-e637-4b8f-be3e-b23dee5d1481

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

ibuilder pushed a commit that referenced this pull request Sep 13, 2026
The previous commit's changelog entry blamed this environment's package index for
resolving differently from the prod container -- "whatever this environment's egress
serves as an index is not what the prod container sees". That was a guess dressed as a
diagnosis, and it was wrong.

pip-compile treats an EXISTING output file as constraints: it moves only what the
inputs force and leaves every other pin alone. The local runs wrote to fresh scratch
paths, so there were no pins to preserve and the whole graph resolved to latest --
hence "34 packages move". Compiling into a copy of the REAL lock instead moves ZERO
packages, measured just now: numpy stays 2.5.2, manifold3d 3.5.2, alembic 1.20.0. That
is also why only alembic moved in CI; its floor was the only one that changed.

What broke the wrong story was checking a fact rather than reasoning from the gap:
numpy 2.5.3 and manifold3d 3.5.3 both exist on PyPI with cp312 manylinux wheels, so
"the index is different" had nothing left to stand on, and the remaining candidate was
the one variable the two runs did not share -- the output path.

TWO THINGS FOLLOW, and the second is the one that will save time later.

The reproduction rule is concrete: compile IN PLACE, to the lock you intend to replace.
A regeneration aimed at a new path is a different operation and answers a different
question. Nothing was wrong with the local toolchain, and the earlier entry would have
taught the next reader to distrust it.

And it settles the remaining sweep. #517 (manifold3d >=3.5.3) and #516 (numpy >=2.5.3)
fail the API test gate because they raise floors only in services/data/requirements.txt,
which pip-compile never reads -- requirements.in says so in a comment. Raising the floor
in BOTH files will move those pins, for exactly the reason alembic's did: a floor that
changes is a constraint the existing pin no longer satisfies. That is now a measured
mechanism rather than a hope.

I wrote an entry criticising confident measurement over checks that can fail, and put a
confidently wrong cause inside it. Correcting the record in place rather than quietly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tt2XKB83wwNt2nrMbK6eEA
ibuilder pushed a commit that referenced this pull request Sep 13, 2026
…517)

Dependabot raised these floors only in services/data/requirements.txt, and both PRs
fail the API test gate for a reason the tree already documents. services/api/
requirements.in carries the explanation on the numpy line itself: "floor raised WITH
services/data/requirements.txt: pip-compile reads only this file, so a floor raised only
there cannot move the lock."

So the failure is structural rather than incidental. test_lock_satisfies_requirements
reads BOTH requirements files and checks them against requirements.lock -- deliberately,
because the API image RUNS the data service's code while installing only the API's lock,
and a floor raised in the data requirements is otherwise a claim nothing enforces. With
the lock still pinning numpy==2.5.2 and manifold3d==3.5.2, a floor of 2.5.3/3.5.3 is
unsatisfied and the gate fails. Neither PR could ever have gone green alone.

Both floors move here, so pip-compile sees a constraint the existing pins no longer
satisfy, and the lock follows.

MEASURED, NOT ASSUMED: compiling with both floors raised moves EXACTLY TWO pins --
manifold3d 3.5.2 -> 3.5.3 and numpy 2.5.2 -> 2.5.3 -- and nothing else. Both versions
exist on PyPI with cp312 manylinux wheels, checked directly rather than inferred.

This commit deliberately leaves the lock stale, as the alembic bump did: the recompile
belongs in python:3.12-slim, which lockfile.yml provides, and pushing this fires it on
the requirements.in path. Its Verify step is red on this commit alone and prints the
diff the next commit transcribes. That is the documented bootstrap path, not a failure
to chase.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tt2XKB83wwNt2nrMbK6eEA
ibuilder pushed a commit that referenced this pull request Sep 13, 2026
…orrection said to

Exactly two pins move: numpy 2.5.2 -> 2.5.3 and manifold3d 3.5.2 -> 3.5.3. Zero packages
added, zero removed, nothing else touched -- which is what was predicted before the
floors were raised, from a measurement rather than a hope.

THIS USED THE LOCAL COMPILER, and that is a deliberate reversal of how the alembic lock
in the previous PR was produced. There the lock bytes were transcribed out of CI's Verify
diff, because a local resolve had produced a wildly different answer and could not be
trusted. The cause turned out to be the invocation: pip-compile treats an EXISTING output
file as constraints and moves only what the inputs force, while those runs wrote to fresh
scratch paths where nothing was preserved. Compiled in place, against the real lock, the
local tool is the same tool CI runs.

The runtime says the same thing more loudly than the diff does. The fresh-path compile
took over forty minutes, because it re-resolved and re-hashed the entire graph; this one
took THIRTY-NINE SECONDS, because an in-place compile only has to fetch what actually
changed. A forty-minute run and a forty-second run were never doing the same work, and
that was visible from the start for anyone who thought to look at the clock.

Transcribing from CI was also not available here even if wanted: alembic had two hashes
and fit in the Verify step's `head -60`, while manifold3d alone carries dozens of wheel
hashes, so the printed diff is truncated well before the content ends. The artifact that
holds the full file sits on a host this environment's egress policy blocks. So the choice
was a correctly-invoked local compile or nothing -- and CI's Verify step will confirm
byte-identity either way, which is the property that makes either route safe.

Verified: test_lock_satisfies_requirements (the gate that reads BOTH requirements files
and is the reason #516 and #517 could never pass alone), test_declared_imports and
test_desktop_paths all pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tt2XKB83wwNt2nrMbK6eEA
ibuilder added a commit that referenced this pull request Sep 13, 2026
…#547)

Supersedes dependabot's #516 (numpy) and #517 (manifold3d), neither of which could
have gone green as filed.

WHY THEY WERE STUCK, and it is written in the file they were editing. Dependabot raises
these floors in services/data/requirements.txt only. pip-compile never reads that file --
services/api/requirements.in says exactly this in a comment on the numpy line: "floor
raised WITH services/data/requirements.txt: pip-compile reads only this file, so a floor
raised only there cannot move the lock." Meanwhile test_lock_satisfies_requirements reads
BOTH requirements files and checks them against requirements.lock, deliberately, because
the API image RUNS the data service's code while installing only the API's lock. So a
floor above the lock's pin fails that gate by construction. Structural, not incidental:
no rebase or recreate could ever have fixed either PR.

Raising both floors gives pip-compile a constraint the existing pins no longer satisfy,
and the lock follows. Exactly two pins move -- numpy 2.5.2 -> 2.5.3 and manifold3d 3.5.2
-> 3.5.3 -- with zero added and zero removed. Predicted from a measurement before the
change was made, then confirmed by lockfile.yml's Verify step on the committed bytes.

ON WHERE THE LOCK CAME FROM, because it reverses what the previous PR concluded. #546
transcribed its lock out of CI's Verify diff, because a local resolve had produced an
unrecognisable answer. This one was compiled locally, and that is correct now for a
reason #546 established: pip-compile treats an EXISTING output file as constraints and
moves only what the inputs force, while a fresh output path preserves nothing and
re-resolves the world. Compiled in place against the real lock, the local tool is the
tool CI runs -- and Verify agreed byte-for-byte on a lock carrying hundreds of hash
lines rather than alembic's two.

The clock said it before the diff did: the fresh-path compile took over forty minutes,
the in-place compile took thirty-nine seconds. Two runs of the same command differing
sixty-fold in cost were never doing the same work, and that was visible from the start
without reading a single package name.

Transcription was not available here in any case. Verify prints head -60 of its diff,
which alembic's two hashes fit inside and manifold3d's dozens of wheel hashes do not,
and the artifact holding the full file sits behind an egress block in this environment.
Both routes end at the same gate, which is what makes either one safe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tt2XKB83wwNt2nrMbK6eEA

Copy link
Copy Markdown
Owner

Superseded by #547, merged as f1382ffa. Closing as replaced, not abandoned — the bump itself shipped: the lock now pins numpy==2.5.3.

Why this PR could never have gone green, however many times it was rebased or recreated. It raises the floor in services/data/requirements.txt only. pip-compile never reads that file — and services/api/requirements.in says so, in a comment sitting on the very line dependabot edits in the sibling file:

numpy>=2.5.2    # floor raised WITH services/data/requirements.txt: pip-compile reads
                # only this file, so a floor raised only there cannot move the lock

Meanwhile services/api/test_lock_satisfies_requirements.py reads both requirements files and checks them against requirements.lock. That is deliberate: the API image runs the data service's code while installing only the API's lock, so a floor raised in the data requirements is otherwise a claim nothing enforces (the test's own docstring records the 2026-08-01 case where exactly that shipped a lie). With the lock still pinning numpy==2.5.2, a floor of 2.5.3 is unsatisfied and the gate fails.

So the failure was structural. The floor had to move in both files at once, which is not a shape dependabot can produce.

What #547 did: raised numpy>=2.5.3 and manifold3d>=3.5.3 in both files, then recompiled. Exactly two pins moved — numpy 2.5.2 → 2.5.3 and manifold3d 3.5.2 → 3.5.3 — with zero packages added and zero removed. lockfile.yml's Verify step confirmed byte-identity against a fresh compile in python:3.12-slim, and all 15 checks passed including the Postgres migration-parity job.

Both target versions were confirmed to exist on PyPI with cp312 manylinux wheels before the floors were raised, rather than assumed from the version number.


Generated by Claude Code

@ibuilder ibuilder closed this Sep 13, 2026
@dependabot @github

dependabot Bot commented on behalf of github Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/pip/services/data/numpy-gte-2.5.3 branch September 13, 2026 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python Pull requests that update python code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant