You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Canonical roadmap for the remaining cng-datasetstooling/source work. This is the durable source of truth for sequencing and cross-issue dependencies — individual issues hold their own detail. Keep all work generic (this repo is the engine + workflow generators; dataset-specific pipelines live in data-workflows).
Last updated: 2026-06-24.
Recently completed (context)
Closed via #109 (#108), #110 (#87/#79/#35), #111 (#77), #113 (#104); #66/#68 verified already-fixed in #74; CI network flakiness fixed in #112.
Then #115 (#102 + #103), #116 (#43 — parquet-input path; ST_Read path was already done), #117 (#61 — parquet-input BLOB→GEOMETRY cast; ST_Read path was already done in #75). v0.2.0 released (#118) — first tagged release.
Then #120 (#119 — clear error for unsupported geometry encodings on the parquet-input path), #121 (#107 — oversized per-feature H3 cell-array guardrail).
Then #135 (#106 — row-group byte cap workaround; #136 tracks the upstream revisit), #137 (#134 duckdb 1.5.4 bump + #130 GDB-in-zip/generic-s3 + #131 non-EPSG SRS), #138 (#122 ST_MakeValid at convert time), #139 (#133 bounded PMTiles max zoom).
Open work, grouped
A. Hex-write & H3 indexing (correctness + query perf)
Note: #43 and #61 were both half-landed — their ST_Read convert paths were already fixed, and the recent PRs closed the matching gap on the parquet-input path (process_parquet_input). #119 was a third instance of the same ST_Read-vs-parquet asymmetry. Worth auditing remaining convert-step features for it.
Checkboxes here track high-level status; detail and decisions go in each linked issue and its PR.
Canonical roadmap for the remaining
cng-datasetstooling/source work. This is the durable source of truth for sequencing and cross-issue dependencies — individual issues hold their own detail. Keep all work generic (this repo is the engine + workflow generators; dataset-specific pipelines live indata-workflows).Last updated: 2026-06-24.
Recently completed (context)
Closed via #109 (#108), #110 (#87/#79/#35), #111 (#77), #113 (#104); #66/#68 verified already-fixed in #74; CI network flakiness fixed in #112.
Then #115 (#102 + #103), #116 (#43 — parquet-input path; ST_Read path was already done), #117 (#61 — parquet-input BLOB→GEOMETRY cast; ST_Read path was already done in #75).
v0.2.0 released (#118) — first tagged release.
Then #120 (#119 — clear error for unsupported geometry encodings on the parquet-input path), #121 (#107 — oversized per-feature H3 cell-array guardrail).
Then #135 (#106 — row-group byte cap workaround; #136 tracks the upstream revisit), #137 (#134 duckdb 1.5.4 bump + #130 GDB-in-zip/generic-s3 + #131 non-EPSG SRS), #138 (#122 ST_MakeValid at convert time), #139 (#133 bounded PMTiles max zoom).
Open work, grouped
A. Hex-write & H3 indexing (correctness + query perf)
h{N≥1}column isUBIGINTafter hex build (h0 exempt) — fix(#102,#103): UBIGINT hex-column assertion + intra-partition _cng_fid ordering #115ORDER BY _cng_fidwithin each h0 partition for row-group pruning — fix(#102,#103): UBIGINT hex-column assertion + intra-partition _cng_fid ordering #115_cng_fid(monotonic row id); sourcefidmay be a feature key, not row-unique — fix(#43): always synthesize _cng_fid on the parquet-input convert path #116--resolution-by-areasize-stratified variable-resolution polyfill + per-feature Oversized-geometry safety guardrail for the 2 GB Arrow/parquet-page limit (graceful, not a C++ assertion) #107 back-off — feat(#98): adaptive variable-resolution H3 polyfill via --resolution-by-area #123. Deferred follow-ups split out: Auto-scale hex chunk-size by feature size (cells-per-chunk budget) #124 (cells-per-chunk auto-scaling) and Recursive classify-and-descend H3 polyfill for single oversized features #125 (recursive classify-and-descend for a single feature too big even for the coarsest tier).B. Geometry ingest hardening
stoi-crash narrative (geopandas-writer discriminator + antimeridian multipolygon) did not reproduce on small files with the pinned duckdb 1.5.3 — see the Hardened geometry ingest/rebuild: route through GDAL/WKB (not DuckDB COPY) + make_valid/antimeridian/CRS84 — kill the stoi landmine #106 comment. DuckDB stays the standard; no speculative GDAL-replacement fix. Needs the actual offendingiucn-ranges-2025geometry to re-diagnose; any fix should be DuckDB-first (clear error + convert-to-compatible-format fallback).ogr2ogrwrite) is moot: no GDAL write path exists under the DuckDB-only standard.cng-convert-to-parquetwrites BLOB instead of GEOMETRY for MULTIPOINT (missing GeoParquet metadata) → breaks PMTiles — fix(#61): cast BLOB WKB geometry to GEOMETRY on the parquet-input convert path #117ST_MakeValidon all geometry expressions at convert time (repairs invalid input geometries at the source) — fix(#122): ST_MakeValid on all geometry expressions at convert time #138s3://→https rewrite (no longer gated on hard-coded substrings) — fix(#134,#130,#131): duckdb bump, GDB-in-zip support, non-EPSG SRS crash #137B2. Dependency / upstream tracking
==1.5.4(h3 community ext now ships) — fix(#134,#130,#131): duckdb bump, GDB-in-zip support, non-EPSG SRS crash #137C. Raster
AutoIdentifyEPSG()crash on valid EPSG-less SRS (ESRI:102003) now caught — fix(#134,#130,#131): duckdb bump, GDB-in-zip support, non-EPSG SRS crash #137D. Scale / backends
E. PMTiles publish metadata
--extend-zooms-if-still-dropping— fix(#133): bound PMTiles max zoom; drop --extend-zooms-if-still-dropping #139table:columnsfrom the PMTiles footer at publish time (tiles carry a column subset vs source parquet)--simplify-tolerancegeometry simplification to convert/workflowRecommended sequence & dependencies
Assert all physical H3 index columns are UBIGINT after hex build (h0 exempt) #102 + Hex write: ORDER BY _cng_fid within each h0 partition for row-group pruning #103✅ done (fix(#102,#103): UBIGINT hex-column assertion + intra-partition _cng_fid ordering #115) — hex-write assertion + intra-partition_cng_fidordering.Always create _cng_fid: source fid columns are not reliably unique #43✅ done (fix(#43): always synthesize _cng_fid on the parquet-input convert path #116) — parquet-input path now always synthesizes_cng_fid.cng-convert-to-parquet writes BLOB instead of GEOMETRY for MULTIPOINT sources — breaks PMTiles step #61✅ done (fix(#61): cast BLOB WKB geometry to GEOMETRY on the parquet-input convert path #117);convert_to_parquet silently passes geoarrow-native/WKT geometry through as a non-GEOMETRY column (no error, no GeoParquet metadata) #119✅ done (fix(#119): clear error for unsupported geometry encodings on the parquet-input path #120) — convert-step geometry-encoding hardening.Oversized-geometry safety guardrail for the 2 GB Arrow/parquet-page limit (graceful, not a C++ assertion) #107✅ done (fix(#107): graceful guardrail for oversized per-feature H3 cell arrays #121). Hardened geometry ingest/rebuild: route through GDAL/WKB (not DuckDB COPY) + make_valid/antimeridian/CRS84 — kill the stoi landmine #106 is blocked on an MRE (see above) — do not implement without a reproducer.Adaptive variable-resolution H3 polyfill for very large polygons (fine edges, coarse interior, no OOM/page-size) #98✅ Plan A done (feat(#98): adaptive variable-resolution H3 polyfill via --resolution-by-area #123):--resolution-by-area+ per-feature Oversized-geometry safety guardrail for the 2 GB Arrow/parquet-page limit (graceful, not a C++ assertion) #107 back-off. Remaining Adaptive variable-resolution H3 polyfill for very large polygons (fine edges, coarse interior, no OOM/page-size) #98 scope tracked in Auto-scale hex chunk-size by feature size (cells-per-chunk budget) #124 (cells-per-chunk auto-scaling) and Recursive classify-and-descend H3 polyfill for single oversized features #125 (recursive classify-and-descend).Note: #43 and #61 were both half-landed — their ST_Read convert paths were already fixed, and the recent PRs closed the matching gap on the parquet-input path (
process_parquet_input). #119 was a third instance of the same ST_Read-vs-parquet asymmetry. Worth auditing remaining convert-step features for it.Checkboxes here track high-level status; detail and decisions go in each linked issue and its PR.