diff --git a/poetry.lock b/poetry.lock index 96069ae..3b06a83 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4537,14 +4537,14 @@ dataframe = ["pandas (>=1.5.3,<2.0.0)"] [[package]] name = "views-frames" -version = "1.6.0" +version = "1.10.2" 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-1.6.0-py3-none-any.whl", hash = "sha256:bcd09ebf71275f6ad81111dd028fc7e969fc1d514a4364b72f12a3b155d1bf5e"}, - {file = "views_frames-1.6.0.tar.gz", hash = "sha256:081f8f236d9587fe23ed4ae542399f64c0cfe3745b74f37c835a12f905931871"}, + {file = "views_frames-1.10.2-py3-none-any.whl", hash = "sha256:ace7f6a09bdb743edbb39e7e95139a0c647ef7c6100ef4c612a3ce5975078ef0"}, + {file = "views_frames-1.10.2.tar.gz", hash = "sha256:96b4916afe9b64389045043ec1cf05fa2ea9b872ac0d12cb57f0d629ffd88106"}, ] [package.dependencies] @@ -4552,6 +4552,7 @@ numpy = ">=1.26,<3" [package.extras] arrow = ["pyarrow (>=14,<20)"] +docs = ["jupyterlab (>=4,<5)", "matplotlib (>=3.8,<4)", "nbmake (>=1.5,<2)", "pyarrow (>=14,<20)", "scipy (>=1.11,<2)"] [[package]] name = "views-pipeline-core" @@ -4800,4 +4801,4 @@ viz = ["matplotlib", "nc-time-axis", "seaborn"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.15" -content-hash = "5f2d192a6a36dd429b473195ca6dc30424b57aed8890fbce99741895015578ef" +content-hash = "81e3ce9892400ac7a3aa4469015b2695f2d3f9c3cee244e5c56c8fe8fee4077a" diff --git a/pyproject.toml b/pyproject.toml index 87de5af..a704039 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" [tool.poetry.dependencies] python = ">=3.11,<3.15" views-pipeline-core = ">=2.1.3,<3.0.0" -views-frames = ">=1.0,<2" +views-frames = ">=1.10.2,<2" pyarrow = ">=16.1.0,<17.0.0" [build-system] diff --git a/tests/fixtures/wire_contract/README.md b/tests/fixtures/wire_contract/README.md index 64b6299..83bb000 100644 --- a/tests/fixtures/wire_contract/README.md +++ b/tests/fixtures/wire_contract/README.md @@ -29,6 +29,14 @@ injected fixed literals (`run_id="fixture_run_0"`, `generated_at="2026-07-15T00: ## Regeneration `PYTHONPATH=. python3 scripts/build_wire_fixture.py` — byte-reproducible **with the pinned -tool versions** (numpy per lockfile, `pyarrow 16.1.0`, `views_frames 1.0.0`; parquet bytes -vary across pyarrow versions). The committed bytes + `SHA256SUMS` are canonical regardless. -**A change to this fixture is a change to the contract (§10)** — do not regenerate casually. +tool versions** (numpy per lockfile, `pyarrow 16.1.0`). The committed bytes + `SHA256SUMS` +are canonical regardless. **A change to this fixture is a change to the contract (§10)** — +do not regenerate casually. + +**`pyarrow` is the version-sensitive one; `views_frames` is not.** Parquet bytes vary +across pyarrow versions — that is why the pin is `>=16.1.0,<17.0.0` and why a local +pyarrow 23.x fails byte-parity while CI passes (register **C-72**). `views_frames` sits +above it: the fixture was generated under `1.0.0`, CI has reproduced it continuously under +`1.6.0`, and `1.10.2` was verified to regenerate **all five artifacts byte-identically** +before the pin was raised (2026-08-02). Raising it again does not require regenerating the +fixture — but it does require proving that, the same way.