docs(changelog): the two entries missing from #1792 and #1793 - #1809
Open
lmeyerov wants to merge 1 commit into
Open
docs(changelog): the two entries missing from #1792 and #1793#1809lmeyerov wants to merge 1 commit into
lmeyerov wants to merge 1 commit into
Conversation
Both landed without a CHANGELOG entry. #1793 is the one that matters: it fixes a SILENT WRONG ANSWER that is user-visible on every engine. Reproduced on the pre-fix tree while auditing the merge, so the entry states a measured effect rather than a description: `MATCH (a {grp:1}) WITH a MATCH (a)-[]->(b) RETURN count(*)` followed by a plain `MATCH (a)-[]->(b) RETURN count(*)` on the SAME graph object returned 60 instead of 134, 69 instead of 136 and 61 instead of 143 across seeds. On polars the poisoned graph then raised `NotImplementedError` for EVERY subsequent query — a failed query left the user's object broken. Both are fixed on master; neither was written down. #1792's graphviz half (`KeyError: None` -> an actionable `ValueError` on a bound-but-unlabelled frame) is smaller but is still a user-facing error-message change, so it gets an entry too. DOCS ONLY: no code touched, so runtime delta is zero and no pyg-bench lane run is required (CB5) — checkable from the diff, which is one file. NOT INCLUDED, deliberately. The audit also flagged #1792's `dtype: object` -> `dtype: DType` as a typing WIDENING (`DType = Any`, which is strictly weaker than `object`, and mypy is indifferent between them here — verified). I am not reverting it: `graphistry/compute/typing.py` declares `DType` as the repo's engine-agnostic dtype alias with the comment "Honestly Any -- the concrete type is engine-dependent", and these parameters do receive pandas/cuDF/polars dtypes, so the named alias is the documented convention even though it checks as `Any`. Reverting on the audit's reading would churn against a stated convention on a judgement call that belongs to the owner. Reported, not silently decided. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015YsqAZQLbqjSDrYSFz2GoB
lmeyerov
force-pushed
the
audit/unapproved-merge-remediation
branch
from
July 28, 2026 03:01
a56f998 to
aa76348
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Remediation from the audit of the six merges that landed without recorded approval (#1782, #1783, #1784, #1790, #1792, #1793). Docs only — no code touched.
What the audit found, in one line
No correctness regression in any of the six. 707/707 non-cypher differential cases (12 random graphs × 14 chain shapes × {pandas, polars} × {scan,
index_policy="force"}, with duplicate node keys, dangling edges and null-carrying columns) are byte-identical between84be35fb(pre-stack) and233b64c8; the 37 that differ are #1793 fixing a real bug, reproduced independently. The defects are in process, not in behaviour.What this PR fixes
The two missing CHANGELOG entries. #1793 is the one that matters — it fixes a silent wrong answer that is user-visible on every engine, and it was the highest-value entry of the six.
Reproduced on the pre-fix tree so the entry states a measured effect rather than a description:
On polars the poisoned graph then raised
NotImplementedErrorfor every subsequent query — a failed query left the user's object broken. Both fixed on master; neither written down.#1792's graphviz half (
KeyError: None→ an actionableValueErroron a bound-but-unlabelled frame) is smaller but is still a user-facing error-message change, so it gets an entry too.Deliberately NOT included
The audit also flagged #1792's
dtype: object→dtype: DTypeas a typing widening (DType = Any, strictly weaker thanobject; mypy is indifferent between them here — verified by running both). I am not reverting it.graphistry/compute/typing.pydeclaresDTypeas the repo's engine-agnostic dtype alias, with the comment "Honestly Any — the concrete type is engine-dependent", and these parameters do receive pandas/cuDF/polars dtypes. So the named alias is the documented convention even though it checks asAny. Reverting on the audit's reading would churn against a stated convention on a judgement call that belongs to the owner — reported here rather than silently decided.Other audit findings, filed separately rather than bundled
MATCH (a)-[]->(b)on a 2-edge graph: pandas 2, polars 1). Verified identical on84be35fband233b64c8, so not from these PRs. polars is the correct one, which means the parity suites are calibrated against the wrong oracle for this shape.bin/test-polars.shandtest-gfql-coreinstalls no polars. Fixed in the CA4 allowlist PR and in the fix(gfql): rows(table=...) must survive a named middle on both chain surfaces #1788/fix(gfql): the indexed bypass and the named-middle rewrite must not discard rows() params #1790 engine-parametrization PR..unique()removals leavestest_engine_polars_semi_key_dedup.pyat 36 passed: the PR's own suite pins the boundary (removing thehow="left"feeder's.unique()correctly fails 14) but not the change. Its perf-regression theory was tested and refuted: at N=3000/E=3,000,000 the undirected semi build side went 235.0 → 235.1 ms.Runtime delta: zero
One file changed, and it is
CHANGELOG.md. Per CB5 no pyg-bench lane run is required, and that is checkable from the diff.🤖 Generated with Claude Code
https://claude.ai/code/session_015YsqAZQLbqjSDrYSFz2GoB