test(gfql): stop test_index.py fabricating 20 failures without cudf_polars - #1811
Conversation
Update: the first CI run found what this PR exists to find
The polars lane resolves pandas 3.0.3; local dev and
So Filed as #1812. Not fixed here: it needs an owner call on which mapping is correct (Neo4j uses Java's full mapping; openCypher does not pin the algorithm; matching it on pandas 3 costs a Pinned with Worth stating plainly, because it is the argument for this PR: that divergence has been in the tree with a test already written for it, and the test never ran. |
458498f to
66a462f
Compare
…olars
`_engines()` appended `"polars-gpu"` when **`cudf`** imported. But `polars-gpu`
is the `cudf_polars` GPU collect target and raises
ImportError: GFQL engine='polars-gpu' requires the RAPIDS cudf_polars stack
without it. So any box with cuDF installed and `cudf_polars` absent — a common
developer configuration — got 20 failures indistinguishable from product
breakage, in a file that IS listed in `bin/test-polars.sh`. CI never caught it
because that lane installs neither package, so the parameter did not exist
there: a gate can only fabricate failures where it is never exercised.
Measured on a box with cuDF 25.10 and no `cudf_polars`:
before 20 failed, 116 passed
after 0 failed, 105 passed
SCOPE NOTE. This branch originally carried the whole CA4 allowlist change
(seven files added to `bin/test-polars.sh`). PR #1805
(`fix/gfql-polars-lane-invisible-tests`), opened concurrently, is a SUPERSET of
that list AND adds `test_polars_lane_completeness.py`, a guard that fails when a
polars-parametrized file is missing from the lane — which makes the fix
permanent rather than one-time. It also lands the same pandas-3 case-mapping
xfail, against the same issue. Reduced to the one hunk #1805 does not contain,
so the owner reviews the allowlist once instead of twice.
RUNTIME DELTA: zero. One test file's engine list and a CHANGELOG line; no
pyg-bench lane run required (CB5), checkable from the diff.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015YsqAZQLbqjSDrYSFz2GoB
66a462f to
cee1dd0
Compare
Resolves the CHANGELOG.md conflict: master added an Infrastructure section and new Changed/Fixed/Documentation entries under [Development] while this branch added one Changed entry. Took master's file and re-inserted this branch's entry at the head of ### Changed. graphistry/tests/compute/gfql/index/test_index.py is untouched on master, so the branch side carries through unchanged. Verified against master: test_index.py IS listed (exactly once) in bin/test-polars.sh POLARS_TEST_FILES, and the test-polars lane installs the `test,polars` extras only, so the CHANGELOG claims still hold.
Resolves the CHANGELOG.md conflict only. Master added an Infrastructure section plus new Changed/Fixed/Documentation entries under [Development]; this branch adds one ### Changed entry. Took master's file verbatim and re-inserted this branch's entry at the head of ### Changed. graphistry/tests/compute/gfql/index/test_index.py is untouched on master, so the branch side carries through unchanged. This branch does not modify bin/test-polars.sh. Verified against this master: test_index.py is listed exactly once in bin/test-polars.sh POLARS_TEST_FILES (so the CHANGELOG's "a file that IS in the polars lane" claim holds), and the test-polars lane installs the `test,polars` extras only on ubuntu-latest, so "that lane installs neither package" holds too.
Only CHANGELOG.md changed on both sides. Resolved structurally, not textually: took master#\s file whole and re-inserted this branch#\s single ### Changed entry at the top of that section, so the diff vs master is +1/-0 on CHANGELOG. The eight source files this branch retypes were untouched by #1811 (which only moved test_index.py and the CHANGELOG), so they carry through unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YYZRXegrALuXd3NHH5evqx
My previous merge of this branch was built by a helper that assumes a branch ADDS a CHANGELOG entry and re-inserts it under its section. This branch does not add one -- it REWRITES #1823's existing entry -- so the helper produced the entry TWICE: master's uncorrected line plus the corrected one, which left the withdrawn claim still present in the file the PR was meant to fix. Rebuilt from master with the correction applied as an in-place replacement, asserting both that the anchor occurs exactly once on master before the edit and that the entry occurs exactly once after it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YYZRXegrALuXd3NHH5evqx
#1828 landed the low-cardinality count(*) gate in gfql_fast_paths.py, which is the same file this branch adds its fused two-hop count lane to, so this needed a real 3-way rather than the CHANGELOG-only resolution the earlier merges took. git merge-file returns rc=0 with zero conflict markers, and the arithmetic checks out: 2687 merged lines = 2538 (branch) + 149 (master-added), so nothing was dropped. Structurally the two additions are disjoint -- this branch dispatches the two-hop lane from _execute_two_hop_count_fast_path, while #1828 gates a SINGLE-hop grouped count on _LOWCARD_COUNT_MAX_GROUPS / _MAX_INPUT_ROWS. They do not gate on the same shape. A clean textual merge is not on its own proof of semantic compatibility -- the sibling PR #1819 hit exactly that trap, where a marker-free merge silently put a new fused lane in front of a guarded twin. Flagging it here so review checks the interaction rather than trusting rc=0; CI is the arbiter. CHANGELOG resolved structurally: master file taken whole, this branch entry re-inserted at the top of the same section it occupied. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YYZRXegrALuXd3NHH5evqx
The remaining change
graphistry/tests/compute/gfql/index/test_index.pybuilt its engine list by appending"polars-gpu"whencudfimported:But
polars-gpuis thecudf_polarsGPU collect target, and without it GFQL raises:So any box with cuDF installed and
cudf_polarsabsent — a common developer configuration, and mine — gets 20 failures indistinguishable from product breakage, in a file that is listed inbin/test-polars.sh.CI never caught it because that lane installs neither package, so the
polars-gpuparameter did not exist there. A gate can only fabricate failures where it is never exercised — which is the same blind spot as #1795, one level down: not "a file that runs nowhere", but "a parameter that exists only where nobody looks".Measured
Box with cuDF 25.10, no
cudf_polars:The 15-test difference is the
polars-gpuparameters correctly no longer being generated; they still generate — and pass — on a box with the full RAPIDS stack.Runtime delta: zero
One test file's engine list and a CHANGELOG line. Per CB5 no pyg-bench lane run is required, and that is checkable from the diff.
What the (now-withdrawn) allowlist work found, for the record
Running the assembled lane locally and on GPU before rescoping produced evidence worth keeping, since #1805 will inherit these files:
2658 passed, 58 skipped, 0 failedin 160s, plus the appended cypher-lowering pass at49 passed. The lane's timeout is 10 min and it runs twice (plain + coverage); the added files cost ~15s per run.graphistry/test-rapids-official:26.02-gfql-polars,docker run --gpus all, cuDF 26.02.01 / polars 1.35.2, every cuDF and polars-gpu parameter live:394 passed, 0 failed, 0 skipped.test_indexed_bindings.py::test_explicit_polars_gpu_declines_indexed_helper_and_falls_backhas no GPU guard — building polars frames does not need the RAPIDS stack, so the graph constructs fine and the run dies later inside.gfql(). test(gfql): make the polars lane see the 280 tests it was skipping everywhere #1805 fixes this in the same file; flagging it so it is not lost.cudfimportable butlibnvrtc.so.12missing are that environment, not the product — they reproduce nowhere with a working CUDA runtime. Re-running on real hardware before reporting is why the conclusion is "no product failures" rather than seven issues.🤖 Generated with Claude Code
https://claude.ai/code/session_015YsqAZQLbqjSDrYSFz2GoB