Skip to content

Follow up items for the week of June 23, 2026Β #73

Description

@espg

πŸ€– from Claude

Sweep of closed PRs from the last 10 days (June 16–25, 2026): #41, #43, #44, #49, #51, #52, #53, #55, #57, #58, #59, #70. Items already tracked in open issues (#54, #61, #68, #48) are excluded. This covers the gaps.


Items

(1) on_minor_arc FP sensitivity in robust_crossing β€” PR #44 (hemisphere+ PIP)

The Phase-7 SoS hardening covers robust_crossing's four straddle gates but not its antipodal-disambiguation on_minor_arc, which still uses raw f64 signs. A probe point lying exactly on a polygon edge's great circle can flip on floating-point noise, silently producing incorrect PIP results with no error raised. PR #44's author explicitly recommended opening a follow-up issue for this. Not a known active bug, but a latent correctness risk on edge-great-circle inputs.

(2) Versioning automation in CI β€” PR #55 / commit 1cf29c2

Manual Cargo.toml version bumps are the current release path. Both the PR body ("...needs to get fixed and automated in a workflow...") and the merge commit message ("Update Cargo.toml... REALLY needs to be automated!!!") flag this as an explicit pain point. Risk: version drift between the tag that triggers build-wheels.yml and the Cargo.toml that sets the wheel version. A CI workflow or pre-release script that bumps the version and opens a PR would close this.

(3) mort2norm FORCE_PYTHON fallback remnant β€” PR #49 (Closes #37)

PR #49 removed four of the five MORTIE_FORCE_PYTHON-gated Python parity twins. mort2norm's _python_mort2norm fallback, the env-var switch, and the os import remain in tools.py because mort2norm was outside #37's stated scope. CLAUDE.md Β§7 states the Rust extension is the sole runtime path with no Python fallbacks; this remnant is inconsistent with that guarantee. Scope: one function + ~5 lines of cleanup.

(4) from_latlon point-encode path not surfaced in the morton_index skin β€” PR #51

The pandas ExtensionArray and pyarrow ExtensionType skin only produces area cells (Kind::Area). The Rust kernel also supports Kind::Point encoding, but there is no points=True constructor parameter or any other public API surface for it. Users who want point-precision encoding (e.g. for observation-location indexing) have no public path. PR #51 flagged this explicitly.

(5) Arrow β†’ pandas __from_arrow__ hook not wired β€” PR #51

table.to_pandas() on a table with a MortonIndexDtype Arrow column yields a plain int64 Series, not a MortonIndexArray. The __from_arrow__ hook on the dtype was deliberately skipped to stay in scope. This breaks round-tripping through Arrow-typed interchange (e.g. Parquet β†’ pandas). PR #51 flagged it as a known gap.

(6) Pre-emptive flat-cover size guard β€” PR #70 (order-29 lift, Closes #60)

The current implementation warns post-hoc when a flat cover exceeds 1<<20 cells. A hard pre-emptive guard that estimates the densified cell count from the cheap MOC representation before materializing would prevent OOM on very high-order covers. PR #70 described this as "a larger, separate change" and did not implement it.

(7) smallvec dependency sign-off for Node.relevant β€” PR #41 (perf cluster, Refs #34)

PR #41 held item (3) β€” SmallVec<[usize; 8]> for Node.relevant, eliminating per-child Vec reallocations the perf audit flagged β€” pending explicit approval to add the smallvec crate. It is MIT/Apache-2.0, ~500 lines, no transitive deps, and ubiquitous in the Rust ecosystem. The change is mechanical; the blocker is the dependency sign-off per Β§4.

(8) Clippy useless_conversion 27 warnings β€” decision pending β€” PR #57 (fmt/clippy sweep, Refs #34)

27 pre-existing clippy warnings exist on main: the pyo3/numpy ? idiom over Result types triggers clippy::useless_conversion even though the conversion is load-bearing (false positive). PR #57 did not add a blanket #[allow] and left the decision open: keep as-is (consistent with main, noisy clippy output) or add #[allow(clippy::useless_conversion)] at the crate root.

(9) prefix_trie.morton_polygon tie-break non-determinism β€” PR #57

The max-heap refactor changed which equal-efficiency cell is selected on ties β€” the result is still a valid cover, but the exact returned cell set can differ from the old index-scan on tie inputs and is not reproducible across runs. No test pins tie-break order. Worth deciding: document as implementation-defined, add a determinism pass, or pin the order in a test.

(10) Benchmark scripts reference removed MORTIE_FORCE_PYTHON functions β€” PR #49

benchmarks/benchmark_rust_vs_python.py and benchmark_morton_bbox.py still set MORTIE_FORCE_PYTHON. For the four removed functions the env var is now a no-op; the benchmarks silently measure only the Rust path rather than the comparison they advertise. Not run by CI so no failure, but they are misleading. Scope: small update or deletion.


Priority / severity table

Priority Item Severity Source PR
1 on_minor_arc FP sensitivity β€” silent wrong PIP on edge-great-circle probes High #44
2 Versioning automation β€” repeated manual pain, explicit committer flag Medium-High #55
3 mort2norm FORCE_PYTHON remnant β€” violates Β§7 Rust-only guarantee Medium #49
4 from_latlon point-encode path missing β€” API surface gap in morton_index skin Medium #51
5 __from_arrow__ hook not wired β€” breaks Arrow β†’ pandas round-trip Medium #51
6 Pre-emptive flat-cover size guard β€” prevents OOM at high order Medium #70
7 smallvec sign-off β€” perf win blocked on dependency approval Low-Medium #41
8 Clippy useless_conversion 27 warnings β€” decision pending, clippy noise Low #57
9 morton_polygon tie-break non-determinism β€” undocumented behavior change Low #57
10 Benchmark scripts reference removed FORCE_PYTHON functions β€” misleading dead code Low #49

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions