diff --git a/poetry.lock b/poetry.lock index d9690e3..d56a859 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3507,14 +3507,14 @@ frames = ["views-frames (>=1.10.2,<2)"] [[package]] name = "views-frames" -version = "2.0.0" +version = "3.0.0" description = "The VIEWS platform data-contract layer: immutable array+identifier frames (numpy only, root of the dependency DAG)." optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "views_frames-2.0.0-py3-none-any.whl", hash = "sha256:389feb16d6bda995d9f2914de6f5619a38ff37025a0022216eb65d44e03f0b48"}, - {file = "views_frames-2.0.0.tar.gz", hash = "sha256:de13c9713fdecbeb705d0698d285941ea1c614c37e80e8bc2ed7b68f83733ac5"}, + {file = "views_frames-3.0.0-py3-none-any.whl", hash = "sha256:0dab8ff3c374ac987734a1afce952db6db4538b9ee96b0fbe02b9f83a92c37e3"}, + {file = "views_frames-3.0.0.tar.gz", hash = "sha256:b9b6407d5eaf25ba5a49893e807548b1049d5e4eeb4127c4e288222b3ee415c2"}, ] [package.dependencies] @@ -3526,14 +3526,14 @@ docs = ["jupyterlab (>=4,<5)", "matplotlib (>=3.8,<4)", "nbmake (>=1.5,<2)", "py [[package]] name = "views-pipeline-core" -version = "3.3.0" +version = "3.4.0" description = "Core orchestration, data and model-management library for the VIEWS conflict forecasting platform." optional = false python-versions = "<3.15,>=3.11" groups = ["main"] files = [ - {file = "views_pipeline_core-3.3.0-py3-none-any.whl", hash = "sha256:7c0c7535ee9de7a74528bb64393621e379d57556ee125785d4d149a745dab515"}, - {file = "views_pipeline_core-3.3.0.tar.gz", hash = "sha256:8edf80123d35a626ce282aae8bac94c9b6a56cdf3b0163c0d98c9ddbfb5aa7d1"}, + {file = "views_pipeline_core-3.4.0-py3-none-any.whl", hash = "sha256:c560396f1ff880ea76da7365e75bbb6a49d4fa58b4518ab57021240cb29e553e"}, + {file = "views_pipeline_core-3.4.0.tar.gz", hash = "sha256:806c4410caab4562ca1542af604808eca4532c079c800fb3b7615171b1156599"}, ] [package.dependencies] @@ -3546,7 +3546,7 @@ pyarrow = ">=14.0.0,<17.0.0" pyprojroot = ">=0.3.0,<0.4.0" tqdm = ">=4.66,<5.0" views-evaluation = ">=2.0.0,<3.0.0" -views-frames = ">=1.10.2,<3.0.0" +views-frames = ">=3.0.0,<4.0.0" viewser = ">=6.6.4,<7.0.0" wandb = ">=0.18.7,<1.0" @@ -3723,4 +3723,4 @@ test = ["pytest", "websockets"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.15" -content-hash = "e305efbfd4f9ed430ac7051fca50378ec49692af59354a03c2072ebf5cfaade6" +content-hash = "454f301b3fa62ea74ff8b906804cc6e02f758854d47d290f4fbe8ef3fb44ee46" diff --git a/pyproject.toml b/pyproject.toml index 599d77a..62d2521 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,25 @@ python = ">=3.11,<3.15" # import the SDK unguarded. Without the extra the FAO delivery fails **at import**, not # at runtime, and inside a dependency rather than in our own code. Register C-07. views-pipeline-core = {version = ">=3.0.0,<4.0.0", extras = ["appwrite"]} -views-frames = ">=2.0.0,<3" +# Widened from `<3` on 2026-11-02 (#324, filed from views-models). The cap was not +# harmless: views-models' pod runners require views-frames >= 3.0.0, so `<3` meant this +# repo could not be installed alongside the ensemble lane that produces its input. +# +# Why 3.x is safe for us is recorded ONCE, in `tests/fixtures/wire_contract/README.md` — +# the home of the byte question, already carrying the 1.10.2 and 2.0.0 measurements in the +# same series. Short version: the MAJOR's behavioural change is in `views_frames_reconcile`, +# which this repo does not import, and the arrow writer is byte-identical across the +# boundary. **Read that file before raising this pin again.** It names the check to run and +# the control that tells you the check is working — the first draft of this change offered +# a pathspec that silently matched nothing. +# +# **views-frames 3.x is not reachable alone:** pipeline-core 3.3.0 caps +# `views-frames <3.0.0`, so the lock moves pipeline-core 3.3.0 -> 3.4.0 with it. Both are +# inside the ranges already declared here. The floor stays at 2.0.0 and pipeline-core's at +# 3.0.0 deliberately — (frames 2.x + pipeline-core 3.3.x) is still a coherent resolution. +# The lock moves rather than staying at 2.0.0 so CI asserts this ceiling instead of +# leaving it a claim. +views-frames = ">=2.0.0,<4.0.0" pyarrow = ">=16.1.0,<17.0.0" # pytest was never declared here; it arrived transitively through pipeline-core, which diff --git a/tests/fixtures/wire_contract/README.md b/tests/fixtures/wire_contract/README.md index bcab8c5..7c3496d 100644 --- a/tests/fixtures/wire_contract/README.md +++ b/tests/fixtures/wire_contract/README.md @@ -46,6 +46,34 @@ fixture — but it does require proving that, the same way. equal the committed fixture (`203650fd…12c54`) — measured in an isolated environment at the pinned toolchain (pyarrow 16.1.0, numpy 1.26.4), where all 61 frames-dependent tests also pass at 2.0.0. So the views-frames 2.0.0 adoption (#286) is **not** a fixture re-vendor. It -is blocked only by views-pipeline-core, every published release of which (through 3.1.1) -pins `views-frames <2.0.0`. Recorded so the byte question is not re-opened when that -constraint widens. \ No newline at end of file +was blocked only by views-pipeline-core, every release published at the time (through +3.1.1) pinning `views-frames <2.0.0`. Recorded so the byte question is not re-opened when +that constraint widens. + +**That constraint has since widened, and the byte question was re-opened and answered the +same way (2026-11-02, #324).** Regenerating with `scripts/build_wire_fixture.py` under +**views-frames 3.0.0** at the pinned toolchain (pyarrow 16.1.0) reproduces **all five +artifacts byte-identically** — `SHA256SUMS` is unchanged and the arrow shard still hashes +`203650fd…12c54`. Expected, because `views_frames/io/arrow.py` is byte-identical between +`v2.0.0` and `v3.0.0`, and because the 3.0.0 MAJOR's behavioural change is confined to +`views_frames_reconcile`, which this repo does not import. (The MAJOR does also touch +`views_frames/conformance/__init__.py`, which moves its published `CONFORMANCE_FLOOR` to +3.0.0 — inert here, since nothing in this repo reads that constant.) The full suite passes +at that version on Python 3.11 — 527 passed, 3 skipped, 41 xfailed, 0 failed — with the +lock also moving views-pipeline-core 3.3.0 -> 3.4.0, since 3.3.0 was the release that +still capped `views-frames <3.0.0`. So 3.0.0 is not a fixture re-vendor either, and the +pin is now `>=2.0.0,<4.0.0`. + +**If you are the next person raising this pin, run the check like this.** views-frames +uses a **src layout**, so the pathspec needs `src/`: + +``` +git -C diff v2.0.0..v3.0.0 -- src/views_frames/io/ # empty -> arrow.py is unchanged +git -C diff v2.0.0..v3.0.0 -- src/views_frames/ # NOT empty -> the control +``` + +**Run the second one too.** `git diff` prints nothing and exits 0 for a pathspec that +matches no file in either tree, so `-- views_frames/io/` (no `src/`) comes back empty +whatever changed, and reads exactly like a pass. The first draft of this very paragraph +quoted that form as its proof. The control line is what tells you the command can still +speak — if it is also empty, your pathspec is wrong, not the tree. \ No newline at end of file