Version: 0.2.4 (2026-08-18) | previous release: 0.2.3 (2026-08-05) | 75 crates | 18,327 tests passing (101 skipped), 0 failures (
--all-features); 16,862 passing (80 skipped) on default features | 414 doc tests passing (86 ignored) | ~814K Rust SLoC | clippy clean (--all-features --all-targets) |cargo deny checkpassing
GitHub issue #17: GeoPackage::from_bytes/load_contents() rejected any sqlite_master row wide enough to spill onto SQLite overflow pages (e.g. a ~5000-character QGIS layer name) — the local-payload split used the wrong formula and the overflow-page chain was never followed. Issue #18: oxigeo-vrt rejected every GDAL-written SrcRect/DstRect carrying the sub-pixel values gdalbuildvrt/gdalwarp -of VRT actually write (str::parse::<u64> on a value like 9783.50000000003) — now parsed as f64. Issue #19: VRT mosaic compositing let the first source to cover a pixel win even when all it had there was nodata, punching holes along overlap bands — compositing now honours each source's <NODATA> in document order like GDAL. Beyond the three issues: the browser COG URL path (AdvancedCogViewer) works end to end for the first time (new buffered_source sync-over-fetch driver), GDAL internal-mask IFDs are now excluded from overview-level counting consistently across oxigeo-geotiff/oxigeo-wasm, oxigeo-proj gained a verified no_std/proj-db/proj4rs-compat feature matrix and no longer changes transform results depending on the proj-db feature, the SIMD batch fast path is now gated to configurations it can reproduce faithfully (previously silently mis-projected some CRS pairs), and the embedded EPSG registry gained two large correctness passes (US State Plane native units, JGD2011 Japan Plane Rectangular zones I–XIX). Gates green: cargo fmt --check clean, cargo clippy --workspace --all-features --all-targets 0 warnings, cargo nextest run --all-features 18,327 passed / 0 failed / 101 skipped (16,862 / 0 / 80 skipped on default features), 414 doc tests passing (86 ignored), cargo deny check bans passing, cargo publish --dry-run clean on the leaf crate (oxigeo-core). Full categorized list in CHANGELOG.md [0.2.4].
-
oxigeo-gpkg: overflow-page B-tree cells read correctly (issue #17) — local-payload size computed against the true usable page size, overflow chain followed -
oxigeo-vrt:SrcRect/DstRectparse GDAL's fractional numeric formats (issue #18); mosaic compositing honours per-source<NODATA>in document order (issue #19) -
oxigeo-proj: embedded EPSG registry corrected — NAD83/State Plane native units (US survey/international feet, ~79 entries) and JGD2011 Japan Plane Rectangular zones I–XIX (previously misregistered as UTM or absent); SIMD batch fast path gated against datum/ellipsoid/unit mismatches it can't reproduce;proj-dbfeature no longer changes transform results;no_std/proj4rs-compatbuilds compile for the first time -
oxigeo-wasm/oxigeo-geotiff: GDAL internal-mask IFDs excluded from overview-level counting/indexing everywhere; browserAdvancedCogViewer.open()works for the first time (synchronous-over-fetchbuffered range source) -
oxigeo-geoparquet: encoding-aware geometry decode (GeoArrow no longer misread as WKB); null geometries stay index-aligned with property rows
-
oxigeo-geoparquet:GeoParquetReader::from_bytes,read_geometries_optional/extract_geometries_optional,geometry_encoding() -
oxigeo-geotiff:tiff::is_mask_ifd,CogReader::{ifd_count, level_ifd, level_ifd_index, tile_pixel_size} -
oxigeo-gpkg:GeoPackage::scan_table_by_name_typed(SQLite REAL-affinity-aware scan)
GitHub issue #15: oxigeo-vrt rejected
every gdalwarp -of VRT product ("Band must have at least one source or a pixel
function") because the driver had no concept of a Warped VRT's <GDALWarpOptions> block.
Now implemented for real: new warp.rs/warped.rs/srs.rs/source_dataset.rs (1,635
lines) give oxigeo-vrt a backward warp engine, depth-aware WKT AUTHORITY resolution
(fixed a WKT naming EPSG:4326 that silently resolved to the spheroid's EPSG:7030),
relativeToVRT round-tripping, and a quick-xml 0.41 entity-reference fix. Issue
#16: vector-layer support was
incomplete — Dataset::open on a GeoPackage always reported 0 layers, and there was no
public API to read a layer's features. Now implemented: new layer.rs/gpkg_schema.rs
(1,405 lines) give oxigeo::Dataset a layers()/layer()/layer_by_name()/
Layer::features() API for GeoPackage/Shapefile/GeoJSON, plus a GeoPackage fid
rowid-alias fix and a table-constraint-parsed-as-column fix. Issue
#14 needed no code change — the readers
it asked for shipped in 0.2.2. Gates green: cargo fmt --check clean, cargo clippy --workspace --all-features --all-targets 0 warnings, cargo nextest run --all-features
18,184 passed / 0 failed / 101 skipped (16,722 / 0 / 80 skipped on default features), 412
doc tests passing (86 ignored), cargo deny check bans passing, cargo publish --dry-run clean on the
leaf crate (oxigeo-core; dependent crates cannot dry-run until 0.2.3 is actually
published — registry resolution, not a defect). Full categorized list in CHANGELOG.md
[0.2.3].
-
oxigeo-vrt: Warped VRTs no longer rejected at parse time (VrtDataset::is_warpedrelaxes the source/pixel-function rule when a validated<GDALWarpOptions>block is present); depth-awareAUTHORITY/IDWKT resolution (srs::resolve_crs, bracket-depth tracked so the root CRS code is read, not the first — usually the spheroid's — code in the string);relativeToVRTround-trip on both parse and write; quick-xml 0.41Event::GeneralRefentity events ("/&/") no longer dropped, which had corrupted escaped WKT/paths;VrtReader::read_window's uncheckedband - 1underflow replaced withchecked_sub- typed error
-
oxigeofacade:Dataset::open(".vrt")no longer returns a zero-filledDatasetInfo(newextract_vrt_infoheader probe), and every raster read method (read_band/read_window/read_interleaved/_intoforms) now dispatches to the VRT reader — including through nested warps and mosaics — instead of being hardwired to GeoTIFF only -
oxigeofacade / GeoPackage:Dataset::open("x.gpkg")always reported 0 layers (open_vectorhad no GeoPackage arm) — fixed via newextract_gpkg_info; GeoPackagefidread backNULLon every feature (SQLiteINTEGER PRIMARY KEYrowid-alias not substituted) — fixed ingpkg_schema; named table-level constraints (CONSTRAINT ... PRIMARY KEY (...)) were parsed as bogus extra columns — fixed viais_table_constraint
-
oxigeo-vrt:warpmodule (WarpOptions,WarpResampleAlg,WarpKernel,WarpBandMapping,InitDest,ReprojectionTransformer,GenImgProjTransformer),srs::resolve_crs,source_dataset::SourceDataset(nested-VRT recursion,MAX_VRT_NESTING = 16),VrtError::EmptyWindow -
oxigeo::Dataset::{layers, layer, layer_by_name, layer_names},Layer::features(); newoxigeo::{Layer, LayerFeatures}and re-exportedoxigeo::{Feature, FieldValue, Geometry}
-
oxigeo-vrtwarp engine resamples Cubic/CubicSpline/Lanczos/Average/Mode bilinearly rather than with their named kernel (WarpResampleAlg::is_kernel_exact()reports which algorithms are exact today:NearestNeighbour/Bilinearonly) -
Dataset::layers()covers GeoPackage (featuregpkg)/Shapefile/GeoJSON only; FlatGeobuf and GeoParquet returnOxiGeoError::NotSupportedand remain reachable only through the streaming feature API
GitHub issue #14: Dataset::read_band
silently ignored its band argument on multi-band rasters, returning the whole
pixel-interleaved image. Root-caused to the GeoTIFF driver's block-decode engine
(rewritten as band_read.rs/band_read/multi.rs), which also surfaced the identical
defect pattern — wrong planar-config assumption or wrong byte order on multi-band raster
reads — independently re-implemented in a dozen other crates (QC, server, mobile, WASM,
WCS, Node, CLI, ML, Jupyter, VRT), plus several unrelated bugs found along the way. 192
files changed; 33 new issue_14_*-named files (30 regression tests, 2 benchmarks, 1
example). Gates green: cargo fmt --check clean, cargo clippy --workspace --all-features --all-targets 0 warnings, cargo nextest run --all-features 18,133
passed / 0 failed / 101 skipped (16,684 / 0 / 80 skipped on default features), 402 doc
tests passing, cargo deny check passing, cargo publish --dry-run --workspace clean
across all 75 crates. Full categorized list in CHANGELOG.md [0.2.2].
-
oxigeo-drivers/geotiff:read_bandroot-cause fixed (newband_read/band_read::multiengine); predictor cross-band-stride bug on planar files; LERC+predictor undefined-combination silent corruption; O(n)→O(1) tile-offset lookup (cog/block_index.rs, was 77% of one band read on an 8000-strip file) -
oxigeo-core: new sealedRasterElementtyped conversion layer;RasterBuffer::convert_toprecision corruption forUInt64/Int64> 2^53; latent UB inas_slice/as_slice_mut/row_slice(unchecked alignment + dangling pointer at zero length);DataSource::read_range_into/range_slicefast-path trait methods - Downstream fan-out (same defect, #14): oxigeo-qc (big-endian +
planar scan), oxigeo-server (WMS/WMTS overview-level + multi-band window),
oxigeo-services WCS (multi-band truncation), oxigeo-mobile (planar tile, region read,
overview stats), oxigeo-wasm (byte-order double-swap), oxigeo-node (multi-band open),
oxigeo-cli (workaround removal), oxigeo-ml-foundation (dataset loader),
oxigeo-jupyter (
%stats), oxigeo-drivers-vrt (byte order) - Unrelated bugs found along the way: oxigeo-streaming
ChunkedReaderfailed on its first call on every stream; oxigeo-mbtiles spill-file (-wal/-shm/-journal) leak;oxigeo-ml::optimization::iterative_pruningconcurrent-call model corruption;oxigeo-compress32-bit/wasm32usizeoverflow inLZ4_MAX_OUTPUT_GUESS;oxigeo-compressfailed to build forwasm32-unknown-unknown(ahash/getrandom) - DEFLATE tile decoding 1.45–1.79× faster —
oxiarc-*0.3.6 → 0.4.0 (two-level Huffman, buffered bit reader, in-place LZ77 history); GeoTIFF driver uses the new decompress-into-slice entry point
-
oxigeo::Dataset::{read_interleaved, read_interleaved_into, read_window_interleaved, read_window_interleaved_into, read_band_into, read_window_into, data_type}— the supported replacement for the pre-0.2.2read_bandbehaviour -
oxigeo-drivers/geotiff:read_band_into/read_band_into_typed,read_window*,read_bands_into_typed/read_window_bands_into_typed,byte_order(),level_size(), opt-inparallelfeature (rayon block-decode fan-out)
Workspace-wide multi-agent defect sweep across all 76 crates: 342 confirmed
defects (47 critical / 84 high / 83 medium / 33 low), 314 fixed across 38
crate lanes (~520 files), 79 honestly deferred (each left with a safe typed-error
path — see "Deferred from 0.2.1 hardening" below). Gates green: cargo fmt --check
clean, cargo clippy --workspace --all-features --all-targets 0 warnings,
cargo nextest run --all-features 17,723 passed / 0 failed / 100 skipped,
cargo deny check passing. Full categorized list in CHANGELOG.md [0.2.1].
-
oxigeo-kafkaretired as a project. Crate deleted from the workspace; no further releases; crates.io 0.0.1 and 0.2.0 yanked. It was the workspace's sole mandatory C-toolchain dependency (rdkafka-sys→cmake→ librdkafka), against the Pure Rust Policy, at 4,831 lines (0.62% of ~778k) with zero in-workspace reverse dependencies. Thekafkafeatures ofoxigeo-etlandoxigeo-workflowand therdkafkaworkspace dependency went with it. Result:cargo check --workspace --all-featuresno longer requirescmake. Kafka metadata enums inoxigeo-workflow(IntegrationType::Kafka,MessageQueueType::Kafka) are pure Rust and remain. See CHANGELOG.md[0.2.1]→ Removed.
- (partial) 80+ new projections toward 100+ — native catalog grew to ~24 methods; the long tail (Van der Grinten, Winkel Tripel, Wagner, McBryde-Thomas, …) is still reachable only via the external oxiproj PROJ-string engine
- Equidistant Conic, Sinusoidal, Mollweide, Robinson, Eckert IV/VI — native
forward/inverse + round-trip tests (
transform/conic.rs,transform/pseudocylindrical.rs) - Cassini-Soldner, Gauss-Kruger extended zones —
transform/cylindrical.rs+ DHDN zone-3 test - EPSG expansion to 500+ definitions (added 300+ extended definitions in oxigeo-proj/src/epsg/extended.rs)
- (partial) Grid shift files OSTN15/RGF93/DHDN — a real NTv2
.gsbparser +GridRegistry/with_hgridloading path now exists (users supply real grid bytes); bundled OSTN15/RGF93/DHDN data and automatic EPSG grid-operation selection are still Helmert-parameter approximations, not shipped.gsbinterpolation
- (partial) Tier-2 packet decoder (layer/resolution/component/position) —
real progression-order-driven packet demux (
tier2/{packet,progression,tile}.rs) now wired into the reader for single-quality-layer streams; multi-layer (num_layers>1) is rejected with a typedUnsupportedFeature - Rate control and quality layers —
tier2/rate_control.rsexists but is not yet wired into reader/writer - ROI (Region of Interest) support —
tier2/roi.rsexists but is not yet invoked from the decode/encode path - JPEG2000 Part 2 extensions (JP2 boxes)
- Additional compute shaders for raster operations (reproject/raster_algebra/hillshade WGSL)
- GPU-accelerated reprojection (
oxigeo-gpu/src/reprojection.rs+ shader) - GPU raster algebra evaluation (
oxigeo-gpu/src/algebra.rs+ shader) - Multi-GPU workload distribution improvements (
oxigeo-gpu/src/multi_gpu.rs) - WebGPU compute shader compilation for WASM (compile-time
ShaderRegistry)
- ONNX model hot-reload (
oxigeo-ml/src/hot_reload.rs— file-watch + atomic swap) - Inference caching with content-addressed storage (SHA-256 key + LRU,
inference_cache.rs) - Batch prediction with adaptive batch sizing (
batch/dynamic.rs) - Model versioning and A/B testing (
model_versioning.rs— deterministic traffic split) - Foundation model fine-tuning workflows (
oxigeo-ml-foundationtransfer/fine-tuning strategies)
(measured 2026-07-17 via cargo test -p <crate> --all-features -- --list | grep -c ': test$')
- oxigeo-node: 5 → 50+ tests (measured: 60)
- oxigeo (umbrella): 8 → 50+ tests (measured: 257)
- oxigeo-jupyter: 33 → 60+ tests (measured: 105)
- oxigeo-services: 34 → 60+ tests (measured: 608)
- oxigeo-metadata: 38 → 60+ tests (measured: 162)
- Target: 10,000+ total tests (workspace at ~16,775 tests as of 0.1.7 production-hardening, see header above)
- GeoTIFF: JPEG-in-TIFF decompression, LERC codec (
jpeg_codec.rs;lerc_codec/lerc2.rsreal BitStuffer2 v1/v2/v3 decode) - GeoParquet: nested geometry encoding, partitioned datasets (extended-WKB; Hive + spatial partitioning)
- (partial) Zarr v3: full sharding codec with partial chunk reads — the
ZEP-0002 sharding codec (
sharding.rs) is real, butreader/v3.rsstill fetches the entire shard file before extracting one inner chunk (no range-based partial fetch) - GRIB2: template-based product definition expansion (
templates.rs, PDT 0.0–0.48) - NetCDF: CF conventions v1.11 full compliance (
cf_conventions/v1_11.rs)
-
oxigeo::open()universal format detection — implemented (crates/oxigeo/src/open.rs: cloud-scheme → magic-byte → extension detection, returnsOpenedDataset) - Builder pattern for all readers/writers (
crates/oxigeo/src/builder.rs—DatasetOpenBuilder/DatasetCreateBuilder) - Streaming iterator API for large datasets (
crates/oxigeo/src/streaming.rs—FeatureStream/TileStream/StreamingExt) - (partial) Unified error context with source file/line —
ErrorContext(category/details/path/operation/parameters) exists, but it captures the dataset path, not Rust#[track_caller]/file!()/line!()source locations
The 79 deferred findings all have safe typed-error paths today — a loud
Unsupported*/NotImplemented/DecodingError, never silent or fabricated data.
Below is the de-duplicated, actionable synthesis plus the large cross-crate passes
the Opus critic flagged.
-
#[non_exhaustive]on the ~62 public error enums that lack it (semver stability; reconcile every downstream match arm in one pass) + acargo-semver-checksbaseline - Library
println!/eprintln!→tracingmigration (~624 calls in lib src: core 25, gpu 24, ml 11, …) + a lib-scopedprint_stdout/print_stderrclippy lint -
include/excludein all 75 crate manifests to bound published tarballs (0 of 75 currently declare them) + acargo publish --dry-run --listsize/content gate - Route header-driven allocation through a shared
oxigeo-coreread_range/bounded helper (the 0.2.1 caps covered in-crate driver buffers only) - Sweep the remaining
oxigeo-drivers/*parsers (jpeg2000, lerc, and the NTv2.gsbparser — confirmed overflow via fuzz) for the same header-driven-allocation pattern
- JPEG2000: multi-layer (
num_layers>1) Tier-2 decode, custom/variable precinct sizes, ROI (RGN/MaxShift), 9/7 irreversible (lossy) wavelet, GeoJP2 IFD→geotransform extraction, and consolidation of the three divergent JP2 box parsers - GeoTIFF: LERC encode (BitStuffer2/Huffman), full old-style JPEG (
compression=6) TN2 reconstruction +jpegon by default, pure-Rust LZMA (34925) / JPEG XL (50002) decoders - GRIB2: DRT 5.41 (PNG) and 5.42 (CCSDS AEC) decode; validate the rotated-grid (GDT 3.1) nonzero-angle path against real vectors
- (partial) HDF5/NetCDF: chunked/compressed write landed in 0.2.1 (the
oxigeo-drivers/hdf5writer no longer silently drops chunking/compression/fill-value hints — honest errors for shapesoxih5cannot represent — and object-header parsing is real, sodecode_chunk/filter-pipeline/chunking are no longer dead code); still open: big-endian source normalization, V2 object headers + Data Layout v4 chunk metadata, real SWMR/VDS and write-side group symmetry + scale/offset auto-apply (the last three need upstream oxih5/oxinetcdf changes) - FlatGeobuf: curved geometry types (CircularString/CompoundCurve/CurvePolygon/ MultiCurve/MultiSurface) via arc densification; a true streaming parser for large standard (non-NDJSON) GeoJSON
- GeoPackage: arbitrary-WKB + typed attribute columns + multi-page tables
(writer is currently 2-D point / fid+geom only); COPC: LAZ point formats 6–10
(LASzip contextual decoder) and full-waveform
.wdpsample fetch
- Real NEON SIMD for the remaining 8
_simdalgorithm files (projection/terrain/ focal/colorspace are naturally vectorizable; histogram/texture scatter and cost-distance/hydrology graph are harder) — currently honest scalar with a status note
- Mount
oxigeo-servicesOGC endpoints (WFS/WCS/WPS/CSW/Features/Tiles) insideoxigeo-server— needs a root workspace dependency + feature/coverage-source adapters - CQL2 spatial (
S_INTERSECTS/…) and temporal (T_AFTER/…) predicates; consolidate the two CQL implementations (ogc_features::cqlvswfs/database::CqlFilter) -
oxigeo-gateway: serving layer DONE in 0.2.1. The previously stubbedGateway::serve()(accepted TCP connections, no-ophandle_connection) is now a real axum 0.8 HTTP service via a newGatewayServer/GatewayServerBuilder. Routes:GET /health,GET /gateway/metrics,POST /graphql(+ GraphiQL when introspection enabled,/graphql/wssubscriptions whenenable_subscriptions),GET /wsWebSocket upgrade, and a load-balanced reverse-proxy fallback (streaming hyper 1 client, Pure-Rust OxiTLS HTTPS upstreams, hop-by-hop stripping,FailoverManagerretries honoringretry_attempts, circuit breaking, per-attempt timeouts). Pipeline: query-free trace spans, version negotiation + deprecation headers, in-house middleware chain (CORS +OPTIONSpreflight, realAccept-Encodingcompression, real LRU+TTL response caching, logging, metrics), JWT/API-key/session auth (+require_auth/require_mfaenforced), atomic rate limiting, body/timeout limits, and arequire_permissionRBAC route guard. Honesty fixes: realCachingMiddleware(was a no-op), the orphaned 1,865-linemiddleware::advancedmodule un-orphaned/compiling/tested, andenable_subscriptions/retry_attempts/require_mfa/enable_websocketflags now actually enforced. Crate tests: 266 → 381 (+ 3 doctests).- v0.3.0+ follow-ups: WebSocket pass-through proxying; upstream keep-alive connection
pooling; response-side (upstream→client) transformation wiring (request-side only
today); GraphQL resolvers backed by real storage (currently serve demo/in-memory
data); middleware-chain hops and proxied requests are buffered (bounded by
max_body_size) while proxy responses stream
- v0.3.0+ follow-ups: WebSocket pass-through proxying; upstream keep-alive connection
pooling; response-side (upstream→client) transformation wiring (request-side only
today); GraphQL resolvers backed by real storage (currently serve demo/in-memory
data); middleware-chain hops and proxied requests are buffered (bounded by
- ML: consolidate the duplicate model-versioning systems, re-enable the
temporalfeature, harden DirectML COMQueryInterface(Windows-only), wireFineTuningSchedulerintoTrainer.train(), and replace the batch-norm/bottleneck approximations - Azure/GCP data-plane ops left as typed
NotImplemented(Monitor metric/diagnostic ingestion, Cost alert/export, Synapseexecute_query, MLinvoke_endpoint, GCP cost forecast/export) — each needs a per-region/data-plane endpoint the control-plane can't mint - OAuth2/SAS auto-refresh for S3/GCS/Azure backends (HttpBackend only today),
anonymous S3 (
AWS_NO_SIGN_REQUEST), Python GCS/Azure per-call auth +driver="VRT", and credit-based backpressure + exactly-once (Kinesis/PubSub) wiring into the broker crates
-
oxigeo-mobile: AndroidnativeReadTileJNI export; build-verify iOS/Android objc paths (no toolchain in CI); the Jupyter kernel is still a toy evaluator (honest error); fix upstreamoxigeo-geotiffread_band(band)ignoring itsbandargument - no_std reach:
oxigeo-coreserde_json/time conversions std-only under no_std+alloc (needs a workspaceserde_jsonalias);oxigeo-offlinewasm-only build fails on an unconditionaltokio::sync::RwLock; WASM Component Model (wasip2) general CRS transforms; RISC-V/Redox CI verification; Python 3.13 free-threaded testing;PowerManagerdefaultNoControllerremains bookkeeping-only (needs vendor HAL)
- Commit a golden interop corpus of small GDAL/QGIS-produced files per format with value assertions — every driver test currently round-trips only its own output
- Add
# Safetyinvariants to the 818 unsafe blocks (~123 documented) and add a Miri/ASAN gate over the parser/SIMD/GPU/mmap paths - (partial) Fuzzing blind spots: 7 new libFuzzer targets landed in 0.2.1 (NetCDF,
HDF5 superblock/object-headers, VRT XML, GeoJSON, and more — 11 format/parser targets
total); still open: J2K-codestream/DBF/NTv2-grid targets, seeding the targets that ship
no corpus, and routing the confirmed upstream
oxih5overflow panics to the oxih5 project - (partial)
deny.toml(advisories + bans + licenses) is now committed and wired intocargo deny check, and a 75-crate topological publish-order manifest is now in-repo (both landed in 0.2.1); still open: a feature-powerset build (cargo hack), an all-crate MSRV check, and assembling the above into one local release gate; make writers reproducible (injectable deterministic clock for gpkg/hdf5/pmtiles timestamps); add encoding/locale round-trip tests and byte-offset/field context to driver parser errors
-
oxigeo-cloud-enhanced: real Azure IMDS managed-identity tokens (azure_identity::ManagedIdentityCredential) replacing placeholder-token stub -
oxigeo-cloud-enhanced: real GCP metadata-server access/identity tokens + IAM Credentials impersonation (GCE_METADATA_HOSToverridable, mock-server tests);reqwestoptional undergcpfeature -
oxigeo-cloud: multicloudbuild_backend()factory (S3/GCS/AzureBlob/Http, feature-gated) + backend cache;get/put/delete/exists_in_providernow functional -
oxigeo-drivers-advanced: JPEG2000 decode delegates tooxigeo-jpeg2000(real decode, full header parse) instead of gray placeholder pixels;jpeg2000feature now dep-gated -
oxigeo-services: WFS-T Memory/File transactions fully implemented (insert/update/delete/replace, per-path write serialization) -
oxigeo-services: Database transactions/feature-sources/SQL count behind new non-defaultpostgisfeature (oxigeo-postgispool,ST_GeomFromGeoJSON/ST_AsGeoJSON) -
oxigeo-services: WCS File/Url/Memory coverages real (GeoTIFF read/write viaoxigeo-geotiff), Url fetch behind new non-defaultremotefeature;encode_as_geotiffproduces real GeoTIFF bytes -
oxigeo-ml-foundation:onnx_export.rs— pure-Rust ONNX protobuf encoder (ir_version 8, opset 13), round-trip-validated againstoxionnx -
oxigeo-ml-foundation: honest typed errors for unavailable scirs2 input gradients (no more silent zero gradients); weights save/load viaoxicode; augmentation noise now real Gaussian sampling (scirs2_coreseeded RNG) -
oxigeo-workflow: Temporal/Prefectimport_workflowround-trips exporter-generated definitions (metadata headers for lossless ID recovery); export emits real activity bodies -
oxigeo-etl:transform_crsimplemented viaoxigeo_proj::transform_epsg(spawn_blocking to avoid nested-runtime panic — real bug fix, previously panicked inside any tokio runtime);calculate_bboxfixed (was returning[0,0,0,0]);calculate_ndviimplemented (zero-denominator guard) -
oxigeo-cli:info/statsimplemented for FlatGeobuf, GeoParquet, Zarr, GeoPackage, JPEG2000, COPC, PMTiles, MBTiles (was "not yet implemented");mergeplaceholder test replaced with real assertion -
oxigeo-algorithms: Lanczos resampling Wrap & Mirror edge modes implemented (rem_euclid/ reflect-101) -
oxigeo-gpkg: tile matrix setsrs_idnow writes real 4326 via newint2_st()(was placeholder4) -
oxigeo-geojson-stream: TopoJSON writer now emits real arcs for LineString/MultiLineString (open-chain topology: endpoint junctions, no-rotation splitting, shared-arc dedup with negative reversed indices) — was"arcs": []stub -
oxigeo-gpu: subgroup/warp operations emit native WGSL subgroup builtins with workgroup-shared-memory emulation fallback; Metal filter/reduction/nn shader generators implemented; ballot/vote/SimdGroupOperationsupgraded; new execute-and-compare GPU tests (verified on Metal) -
oxigeo-bench: raster/io scenarios now do real work (tile reads,MmapDataSource) -
oxigeo-wasm: new browser APIs —WasmCogViewer.openBytes(drag-drop local GeoTIFF with full codec support incl. LZW/Zstd viaCogReader<MemorySource>),readTileElevation(SampleFormat tag 339 parsing),WasmTerrain(hillshade/multidirectional/slope/aspect/color-relief-shaded — Horn method,ImageDataoutput),WasmProjection+wgs84ToWebMercator/webMercatorToWgs84shims - GeoLab demo:
demo/cog-viewerrebranded OxiGeo GeoLab, drag-drop, terrain-analysis panel, honest byte counters, all CDN deps vendored locally; staged to cooljapan.tech/geolab/ (deploy manual) -
oxigeo-server: new examplerender_hero.rs(DEM → combined_hillshade → colormap → PNG) - README: compile-correct quickstart (
crs()Option), refreshed stats, fixed doc links, clickable GeoLab hero +## Demosection with native-render gallery (docs/media/) - New:
CONTRIBUTING.md,CODE_OF_CONDUCT.md; docs.rs metadata on all 64 remaining publishable crates (21 curated for Pure-Rust docs builds) - Examples/benches: 31 orphaned top-level examples wired into
oxigeo-examples(API rot fixed, 5 dupes pruned), 11 benches wired intooxigeo-bench - Hygiene: removed rustc-ICE dump, auto-fix logs/backups, 3 stray
.bakfiles in cratesrctrees;.gitignorehardened;.cargo/config.tomlstale rusqlite/proj-sys entries removed;pypi-publish.ymlstale openssl-devel step removed;pyproject.toml+package.jsonsynced to 0.1.7 -
oxigeo-security:enterprise/tls/attestationfeature split (default = all three; wasm32-clean attestation-only surface) + newattestationmodule — domain-separated blake3 hash chain → Merkle root/proofs → Ed25519 seal, full re-verification from attestation JSON alone, nativeverify_attestation.rsexample -
oxigeo-wasm:sentinelmodule (Earth Search STAC pair search, self-contained UTM↔WGS84, NDVI change-detection pipeline with Otsu/polygonize/Karney hectares),vaultmodule (hash-chained session log + Ed25519 seal),anomalymodule (Z-score/IQR/modified-Z/percentile ports); COG reader: overview-level reads (read_tile_level,read_window_u16/read_window_rgb8), PREDICTOR=2 undo, BitsPerSample/SampleFormat array-parse fix -
oxigeo-geoparquet:plan_pushdown()/execute_pushdown()APIs (metadata-only planning +ChunkReaderexecution), GeoParquet 1.1covering.bbox+ plain-bboxstruct detection,AttributeFilter::Cmpwith Int64/Float64 literal coercion, multi-filter conjunctions - New crate
oxigeo-wasm-geoparquet: browser range-request GeoParquet client (sparseChunkReader, 64 KiB range coalescing, SQLWHERElowering via sqlparser,RecordBatch→GeoJSON) — npm@cooljapan/oxigeo-geoparquet - Three new demos staged (deploy manual): GeoSentinel (cooljapan.tech/geosentinel/), GeoVault (/geovault/ — CSP zero-egress + independent verifier), GeoParquet Live (/geoparquet/ — live 5.9 GB VIDA dataset); GeoLab pkg refresh; README
## Demossections for all four
-
oxigeo-query: feature-gate tokio so the SQL engine is consumable from wasm32; until then GeoParquet Live ships its own SQLWHERE-fragment lowering (crates/oxigeo-wasm-geoparquet/src/filter_expr.rs) as a deliberate workaround -
oxigeo-geoparquet: Overture and other zstd-compressed GeoParquet remain out of scope until a pure-Rust parquet zstd path exists (zstd-sysis C FFI — forbidden by Pure Rust Policy; snappy via pure-Rustsnapis the supported codec) -
oxigeo-wasm: parallelize per-window tile fetches in the COG reader (verified 2026-07-16:detect_changesincrates/oxigeo-wasm/src/sentinel/core.rsstill awaitsred_a/nir_a/red_b/nir_bsequentially; currently sequential; observed sentinel-cogs S3 latency variance of 23 s – 250 s on cold reads makes serial fetches the long pole) -
oxigeo-wasm:GeoSentinel.trueColorRgbareturns a bare RGBA buffer — should return dimensions alongside the pixels (callers currently need a separateoverlayInfocall) — done:true_color_rgba()(crates/oxigeo-wasm/src/sentinel/core.rs) now returns aTrueColorImagecarryingwidth/heightalongside the pixel buffer -
oxigeo-geoparquet:ScalarValue::Boolpredicates are stats-only — boolean scalars surface a type-mismatch error at execution time; implement boolean-column evaluation — done:eval_scalar_comparison(crates/oxigeo-drivers/geoparquet/src/predicate.rs) now evaluatesScalarValue::BoolagainstBooleancolumns via the Arrow comparison kernel -
demo/cog-viewer/examples.json: stale remote URLs — theelevation-tiles-prodS3 bucket no longer sends CORS headers; refresh the example COG list (candidates: sentinel-cogs and other CORS-enabled open buckets)
-
oxigeo-pythonnumpy.rs:586: complex dtype not yet supported — done:to_numpy_complex()mapsCFloat32/CFloat64buffers to nativenumpy.complex64/numpy.complex128(round-trip tested) -
oxigeo-proj:transform_epsgopens the PROJ DB per-coordinate call — inefficient for bulk transforms; needs a reusable/cachedTransformerpath — done: opt-inTransformerCache/TransformerKey(crates/oxigeo-proj/src/cache.rs) provides an LRU-cached, thread-safe reusable transform path -
oxigeo-stac: implicitreqwestfeature should be promoted to a named feature (currently pulled in without an explicit flag) — done:asyncis now the real feature gatingdep:reqwest;reqwestis kept only as a backwards-compatible alias -
oxigeo-cloud-enhanced: docs.rs build shows only the default feature surface (Azure/GCP feature-gated APIs not visible in generated docs) — done:[package.metadata.docs.rs]now setsfeatures = ["aws", "azure", "gcp"]so the full API surface is documented
Parallel multi-lane defect-sweep campaign following the Beyond-GeoLab campaign
(2026-07-13): 233 verified defects fixed across 69 crates. Workspace green:
cargo check / cargo clippy --workspace --all-features --all-targets / cargo fmt --check
all clean, ~16,775 tests passing with 0 failures. See CHANGELOG.md's
"Fixed (production-hardening campaign, 2026-07)" entry for the full categorized list
(format drivers / algorithms / security / cloud & infra / bindings / no_std & platform).
Headline fixes:
- GeoTIFF floating-point predictor (
Predictor=3) decode + encode implemented (was a silent no-op corrupting float COG round-trips) - JPEG2000 MQ-decoder
INITDECbrought into ITU-T T.800 Annex C spec conformance - GML
srsDimensionattribute parsing (3D geometries no longer silently treated as 2D) - VRT
FirstValidmulti-byte-sample compositing fix +BandMathB10+ variable substitution - Raster/DSL calculator NaN-safe optimizer (
x * 0no longer discards NoData/Inf semantics) - Weiler-Atherton concave fallback made non-silent (mismatch surfaced rather than masked as a plausible result)
- RBAC
resource_patternnow enforced (was a privilege-widening bug — parsed but never consulted) - TOTP constant-time verify + ±1 time-step clock-skew tolerance window (RFC 6238 §5.2)
- SQL
GROUP BYexecutor implemented inoxigeo-query(was a no-op) - Umbrella
DatasetWriter::finalize()now writes real formats or a typed error (was a fakeOXIG-prefixed placeholder blob) -
server.tomlnow actually loaded in Docker/k8s viaOXIGEO_CONFIG(was parsed then discarded) -
oxigeo-stacfeature wiring fixed — no longer pullsaws-lc-sysfor consumers who never use the async surface - Kafka/Kinesis streaming commit-strategy & consumer-lease correctness fixes
-
oxigeo-core(no_std) now compiles under--no-default-features --features alloc -
oxigeo-drivers/hdf5andoxigeo-netcdfre-backed by the real Pure-Rustoxih5 0.1.4/oxinetcdf 0.1.4crates (crates.io, no libhdf5/libnetcdf FFI) — replaces the legacyOXIGDAL_HDF5_METADATA_V1JSON-sidecar placeholder (0.1.x-era on-disk identifier, removed) that returned zeros for real.h5files;oxigeo-netcdfnow reads genuine NetCDF-4/CF files. Public API unchanged (Hdf5Reader::open,Attribute/AttributeValue/Datatype/Hdf5Version/Hdf5Writer,NetCdfReader::open); 730 tests passing across the 4 affected crates, clippy clean
The current code has safe error paths and correct fallbacks for all of the following — not silent corruption — but the full fix is architecturally larger than this campaign's scope:
- HDF5 v2/v3 superblock reading:
oxih50.1.4 fully reads v0-superblock.h5files; v2/v3-superblock files currently open but yield an empty tree (best-effort, never faked as populated data) - HDF5 big-endian source normalization:
oxih50.1.4 does not yet normalize big-endian-encoded source datatypes on read - HDF5 chunked/compressed write:
oxih50.1.4's writer produces contiguous real HDF5 only — chunk and compression hints passed by callers are accepted but dropped (written values are correct, layout is not chunked/compressed) - NetCDF sub-group flattening:
oxinetcdf0.1.4's reader surfaces the root group only; nested NetCDF-4 sub-groups are not yet flattened/exposed - NetCDF auto scale/offset/fill application:
scale_factor/add_offset/_FillValueare exposed as attributes but not automatically applied to decoded values (unchanged contract — same as prior releases) - JPEG2000 Tier-2: packet/precinct/layer decode is not yet invoked by the reader — code-block bytes are still sliced by naive even division rather than driven by the real progression order (LRCP/RLCP/RPCL/PCRL/CPRL) from the COD marker. Tier-1 (EBCOT/MQ) decode is real; Tier-2 packet assembly, rate control, and ROI support are not
- FlatGeobuf: header and feature geometry use a custom ad-hoc binary layout, not real
FlatBuffers — files are not interoperable with the upstream
flatgeobuf.fbsschema (header.fbs+feature.fbs) despite the pure-Rustflatbufferscrate already being a workspace dependency - oxigeo-ml multi-channel tensors:
buffer_to_ndarray()cannot produce a multi-channel tensor becauseRasterBufferis architecturally single-band;Model::predict/predict_batchdo not yet acceptMultiBandBufferand stack per-band slices into a real[1,C,H,W]tensor (nor is there a symmetric multi-bandndarray_to_buffer) — the fix ripples across the trait and multiple call sites - oxigeo-python GIL release: remaining
#[pyfunction]/#[pymethods]entry points still hold the GIL for their full duration —operations.rs(read/read_bands/write/clip/merge/translate/build_overviews) andalgorithms.rs(histogram/gaussian_blur/median/...) still needPython::allow_threadswrapping - Root integration-test suite: 21 quarantined tests across 7 of 11 root-level
integration files (~4,280 lines) exercise local stand-in parsers/fixtures instead of the
real driver crates (NetCDF, HDF5, Shapefile, GeoParquet, and others) and are not
compiled/run by
cargo test/nextest - PowerManager SoC-specific power states:
oxigeo-embedded/oxigeo-noallocPowerManager::apply_*()for HighPerformance/Balanced/LowPower/UltraLowPower/DeepSleep remain bookkeeping-only no-ops — CPU frequency scaling and peripheral clock/power gating are inherently SoC-specific (vendor clock/power controllers, not the ARM/RISC-V ISA) and cannot be implemented generically without per-vendor HAL crates. (Note: this is distinct from the no_std build itself, which is green — see "oxigeo-core... now compiles" above.) - LERC2: bit-stuffed external-decode path is not yet implemented
- Publish-script verification: MSRV 1.89 claim and crate-publish ordering/dry-run gate
for
~/work/pub_oxigeo.sh's CRATES array remain unchecked (cross-repo, outside this workspace's ownership)
- Pure-Rust SQLite migration:
rusqlite/libsqlite3-sys(C FFI) fully replaced byoxisql-sqlite-compat 0.1.5(Limbo engine) across db-connectors, gpkg, drivers-advanced, mbtiles, pmtiles - Policy fixes:
ring,rusqlite,rdkafka-sysremoved from default feature closure - native-tls → oxitls migration (pure Rust TLS stack)
- ~35 inline deps migrated to
*.workspace = true -
oxigeo-shapefile: non-UTF-8 DBF encoding viaencoding_rs(CPG/LDID support, PR #10) -
oxigeo-proj:wkt_to_proj_string()— WKT→PROJ conversion (PR #9) -
oxigeo-cache-advanced: W-TinyLFU + Count-Min Sketch cache eviction -
oxigeo-copc: LiDAR waveform point formats 9/10 (WaveformPacket) -
oxigeo-drivers/hdf5: HDF5 v2/v3 superblock parser + Jenkins hash -
oxigeo-index: Delaunay triangulation (triangulate(),Triangulation::convex_hull()) -
oxigeo-qc: Batch QC runner, GPKG/STAC/radiometric validators, per-sensor band ranges -
oxigeo-sensors: Gaussian Maximum Likelihood Classifier -
oxigeo-streaming: OxiStore-backed persistentKvStateBackend -
oxigeo-terrain: GLCM texture derivatives, TPI variants, geomorphons, cost-distance/least-cost-path -
oxigeo-temporal: Whittaker smoother + Savitzky-Golay filter for gap filling -
oxigeo-analytics: permutation significance testing for Local Moran's I -
oxigeo-metadata: DOI/INSPIRE metadata transform - Umbrella: GPX, KML, TopoJSON format support in
open()/ vector streaming - Dependency upgrades: scirs2 0.4.4→0.5.0, oxionnx 0.1.3→0.1.4, oxiarc 0.3.0→0.3.3, oxicode 0.2.3→0.2.4
-
oxigeo-gpu: WGSLRayMarchUniformslayout fix — removed stray_pad1: f32that shifted every field by 4 bytes and caused the Metal compute kernel to readmax_steps≈ 1.05×10⁹, hangingdevice.poll(wait_indefinitely)for 120s+. Previously-timing-outtest_ray_march_gpu_matches_cpu_when_backend_presentnow passes in 0.127s.
- Wave 1: Weiler-Atherton polygon clipping, Karney geodesic area, DE-9IM topology, marching squares contour extraction
- Wave 1: ML migration ort → oxionnx (Pure Rust ONNX runtime)
- Wave 2: R-tree enhancements (deletion, STR bulk load, k-NN priority queue, serialization)
- Wave 2: SIMD resampling (AVX2+NEON), raster polygonization, topology-preserving simplification
- Wave 2: NoAlloc geometry types (FixedLineString, FixedRing, BBox3D, Mercator, geohash neighbours)
- Wave 2: PMTiles reader completion (tile retrieval, OxiARC decompression, FNV-1a dedup)
- Wave 2: COPC reader, GeoPackage B-tree + 3D WKB
- Fixes: pyo3 0.28 migration in oxigeo-python, geojson-stream test clippy cleanup
- Fixed wgpu 29 API breaking changes (Instance::new, bind_group_layouts)
- Fixed libsqlite3-sys version conflict (rusqlite 0.37, proj-sys compat)
- Fixed macOS librocksdb-sys DYLD rpath via .cargo/config.toml
- Fixed 6 critical oxiarc-brotli bugs (patched via [patch.crates-io])
- Fixed pipeline_builder.rs clippy redundant closure
- WASM enhancements and optimizations
- npm publishing workflow for WASM bindings
- Code growth to 540K SLoC (1,934 .rs files)
- Core geospatial types, traits, async I/O, Arrow buffers, no_std core
- SIMD-optimized raster algorithms (AVX2, AVX-512, NEON)
- Vector algorithms (topology, buffering, convex hull, spatial joins)
- Raster algebra DSL (Pest grammar parser)
- DSL statistical functions (median, mode, percentile)
- DSL for-loop support with 1M-iteration OOM guard
- calculator.rs refactor: 7 modules (ast/lexer/parser/optimizer/evaluator/ops/mod)
- Terrain analysis: hillshade, slope, aspect, curvature, TRI, TPI, roughness
- Pure Rust PROJ: 20+ projections (UTM 1-60, Web Mercator, LCC, Albers, etc.)
- 211+ EPSG definitions (all UTM zones, JGD2011, GDA2020, CGCS2000, polar)
- WKT2 parser (ISO 19162:2019) with WKT1/ESRI WKT backward compatibility
- Datum transformations (Helmert, Molodensky, NTv2, NADCON)
- SIMD-vectorized batch transforms
- GeoTIFF/COG: BigTIFF, overviews, DEFLATE/LZW/ZSTD/JPEG, float predictor
- GeoJSON: RFC 7946, streaming, GeoArrow zero-copy
- GeoParquet: Arrow-native, spatial predicate pushdown
- Zarr v2/v3: sharding, codec pipeline, consolidated metadata
- FlatGeobuf: Hilbert R-tree spatial indexing
- Shapefile: SHP/SHX/DBF full attribute table
- NetCDF: CF conventions, unlimited dims, groups
- HDF5: chunking, compression, SWMR protocol
- GRIB1/2: parameter/level tables
- JPEG2000: tier-1 EBCOT decoder (MQ coder, 3-pass)
- VRT: band math, source mosaicking
- S3/GCS/Azure Blob backends with HTTP range
- Pure Rust compression (oxiarc-deflate/zstd/lz4/bzip2/lzw)
- Multi-tier cache (in-memory LRU, disk, Redis)
- Delta encoding (all 10 data types)
- Security: AES-256-GCM, ChaCha20-Poly1305, Argon2id, RBAC/ABAC
- HA: Raft consensus, failover, leader election
- Observability: OpenTelemetry, Prometheus, Jaeger
- OGC server: WMS 1.3.0, WFS 2.0.0
- API gateway: JWT, OAuth2, rate limiting
- WASM: WasmCogViewer, Huffman compression, < 1MB bundle
- Python: PyO3/Maturin, NumPy array returns
- Node.js: napi-rs, CJS + ESM
- iOS/Android: Swift FFI, Kotlin/JNI
- Embedded: no_std, heapless, embedded-hal
-
inspect,convert,buildvrtcommands - DEM terrain: hillshade, slope, aspect, TRI, TPI, roughness
- 0 unwrap() in production code (2 in non-compiled doc comments)
- 0 clippy warnings, 0 rustdoc warnings
- 0 todo!()/unimplemented!() stubs (except 4 in oxigeo-python, 1 in grib)
- All files < 2,000 lines
- All deps via workspace inheritance
- Pure Rust default features (C/Fortran feature-gated)
- Backpressure-aware stream processing with credit-based flow control
- Session window improvements with gap detection
- Exactly-once semantics for Kinesis/Pub/Sub (Kafka dropped —
oxigeo-kafkaretired in 0.2.1) - Stream-to-stream joins with temporal alignment
- Checkpoint-based recovery with minimal replay
- OGC Tiles API (replacing WMTS)
- OGC Features API Part 1 & 2
- Vector tile generation (MVT/Mapbox)
- Dynamic style rendering (Mapbox GL style spec)
- CDN-friendly caching headers
- STAC Extensions: eo, sar, view, projection, scientific
- STAC API conformance classes
- STAC collection-level aggregation
- STAC transaction extension (create/update/delete)
- GeoPackage (Pure Rust SQLite reader)
- MBTiles (vector tile archives)
- Cloud Optimized Point Cloud (COPC)
- PMTiles (single-file tile archive)
- Adaptive tile size selection for COG
- Parallel I/O coalescing for cloud reads
- Memory-mapped file support for local reads
- Zero-copy Arrow IPC for inter-process communication
- Semantic versioning guarantee: no breaking changes until 2.0
- Minimum 24-month LTS maintenance commitment
- Migration guide from 0.x to 1.0
- Full API documentation with examples for every public item
- SOC2 Type II audit trail
- GDPR data handling compliance documentation
- FIPS 140-2 cryptographic module validation
- FedRAMP authorization support
- Conda-forge package
- Homebrew formula
- Docker Hub official images (Alpine, Debian)
- Kubernetes Helm chart for oxigeo-server
- GitHub Actions for geospatial CI/CD
- Complete API reference with examples
- Architecture decision records (ADRs)
- Performance tuning guide
- Cookbook: 50+ recipes for common geospatial tasks
- Video tutorials
- (partial) Replace unmaintained transitive deps:
indicatif'snumber_prefixdropped via the 0.2.1indicatif0.18 bump; still open: rustls-pemfile, sled/fxhash, evcxr/json - Track and patch security advisories within 48h
- Keep Arrow ecosystem at latest stable (currently 59, bumped in 0.2.1)
- Keep all COOLJAPAN deps (oxiarc-*, scirs2-core, oxiblas, oxicode, OxiFFT) at latest
-
oxigeo-security: remove unusedtempfiledev-dependency (declared inCargo.toml, not referenced anywhere in the crate's source — missed by the 0.2.1 cargo-machete sweep)
- Maintain 0 clippy warnings, 0 rustdoc warnings
- Maintain 0 unwrap() in production code
- Maintain all files < 2,000 lines
- Increase test count toward 10,000+ — target exceeded (~16,775 tests as of 0.1.7 production-hardening, see "Test Coverage Expansion" above)
- Property-based testing (proptest) for core algorithms
- Fuzzing (cargo-fuzz) for format parsers (GeoTIFF, JPEG2000, GRIB)
- RISC-V support (no_std)
- Redox OS compatibility testing
- WASM Component Model (wasm32-wasip2) support
- Python 3.13+ free-threaded mode testing
- oxigeo-mobile: Android nativeReadTile JNI export is missing (Kotlin declares 11 external funs, Rust exports 10 — pre-existing since 0.1.x); implement Java_com_cooljapan_oxigeo_OxiGeo_nativeReadTile
Last updated: 2026-07-28
-
oxigeo-wasm:crates/oxigeo-wasm/src/tests/functions_3.rs:542— implement full Huffman codec for wasm decompression path (or wire oxiarc equivalent)- Priority: P2 | Scope: medium | Hint: oxiarc
-
oxigeo-wasm:crates/oxigeo-wasm/src/tests/functions_4.rs:249— implement decompression roundtrip test- Priority: P2 | Scope: small | Hint: oxiarc
-
oxigeo-python:crates/oxigeo-python/src/numpy.rs:586— implement proper complex dtype mapping when pyo3 supports it — done:to_numpy_complex()(production-hardening campaign, 2026-07-16)- Priority: P2 | Scope: small | Hint: none
-
oxigeo-algorithms:crates/oxigeo-algorithms/tests/texture_analysis_test.rs:212— investigate GLCM computation on uniform rasters (empty matrix bug) and re-enable ignored test- Priority: P2 | Scope: small | Hint: none
-
oxigeo-workflow:crates/oxigeo-workflow/src/integrations/temporal.rs:27— replace generated activity-logic TODO placeholder with real Temporal workflow activity bodies- Priority: P2 | Scope: medium | Hint: none
-
oxigeo-drivers/jpeg2000:crates/oxigeo-drivers/jpeg2000/src/lib.rs:154— implement JPEG2000 driver (tracked as TODO in module doc)- Priority: P2 | Scope: large | Hint: none
- oxigeo: 0 production
.unwrap()(clean)- Verified: 36 src/ files scanned; all
.unwrap()calls are inside#[cfg(test)]blocks. Cross-confirmed by checking every.rsfile for unwraps before the first#[cfg(test)]annotation — result: zero hits.oxigeois fully policy-compliant on #1.
- Verified: 36 src/ files scanned; all
- oxigeo
oxigeo-python:crates/oxigeo-python/src/numpy.rs:586—TODO:Use proper complex dtype when pyo3 supports it— done:to_numpy_complex()(production-hardening campaign, 2026-07-16)- Priority: P2 Scope: small Cross-project: none
- Approach: Map numpy complex64/complex128 arrays to the Rust Complex type instead of falling back, so complex raster/array data round-trips correctly.
- Risk: pyo3 complex support is version-dependent; guard the mapping so unsupported builds give a clear error rather than corrupting real/imag layout.