π€ 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 |
π€ 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_arcFP sensitivity inrobust_crossingβ PR #44 (hemisphere+ PIP)The Phase-7 SoS hardening covers
robust_crossing's four straddle gates but not its antipodal-disambiguationon_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
1cf29c2Manual
Cargo.tomlversion 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 triggersbuild-wheels.ymland theCargo.tomlthat sets the wheel version. A CI workflow or pre-release script that bumps the version and opens a PR would close this.(3)
mort2normFORCE_PYTHONfallback remnant β PR #49 (Closes #37)PR #49 removed four of the five
MORTIE_FORCE_PYTHON-gated Python parity twins.mort2norm's_python_mort2normfallback, the env-var switch, and theosimport remain intools.pybecausemort2normwas 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_latlonpoint-encode path not surfaced in themorton_indexskin β PR #51The pandas
ExtensionArrayand pyarrowExtensionTypeskin only produces area cells (Kind::Area). The Rust kernel also supportsKind::Pointencoding, but there is nopoints=Trueconstructor 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 #51table.to_pandas()on a table with aMortonIndexDtypeArrow column yields a plainint64Series, not aMortonIndexArray. 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)
smallvecdependency sign-off forNode.relevantβ PR #41 (perf cluster, Refs #34)PR #41 held item (3) β
SmallVec<[usize; 8]>forNode.relevant, eliminating per-childVecreallocations the perf audit flagged β pending explicit approval to add thesmallveccrate. 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_conversion27 warnings β decision pending β PR #57 (fmt/clippy sweep, Refs #34)27 pre-existing clippy warnings exist on
main: the pyo3/numpy?idiom overResulttypes triggersclippy::useless_conversioneven 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 withmain, noisy clippy output) or add#[allow(clippy::useless_conversion)]at the crate root.(9)
prefix_trie.morton_polygontie-break non-determinism β PR #57The 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_PYTHONfunctions β PR #49benchmarks/benchmark_rust_vs_python.pyandbenchmark_morton_bbox.pystill setMORTIE_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
on_minor_arcFP sensitivity β silent wrong PIP on edge-great-circle probesmort2normFORCE_PYTHONremnant β violates Β§7 Rust-only guaranteefrom_latlonpoint-encode path missing β API surface gap inmorton_indexskin__from_arrow__hook not wired β breaks Arrow β pandas round-tripsmallvecsign-off β perf win blocked on dependency approvaluseless_conversion27 warnings β decision pending, clippy noisemorton_polygontie-break non-determinism β undocumented behavior changeFORCE_PYTHONfunctions β misleading dead code