Design · one register, one ID per decision, linked to the page that argues it
Each design page argues its own decisions, with the options and the recommendation; this page only lists them, so one ID means one question everywhere.
An ID is the page code, a hyphen and the page’s own label: OP-O8 is open question O8 on the operators page.
When a status changes, change it on the page first, then here.
Statuses: decided (with the date), forced (follows from the dependency rules, no real choice), open (not yet decided; the page gives the recommendation and the alternative), superseded (replaced; the page says by what), deferred.
Testing gates are not listed here; each page keeps its own.
Compose a frozen dataclass; do not subclass ndarray
open
GA-A2
Float64 transform leaf; to_jax requires x64
open
GA-A3
FrozenAttrs keeps whole-carrier metadata; per-band metadata lives on a SpectralAxis
open (narrowed 21 Oct 2026)
GA-A4
No fill value by default
open
GA-B1
map and combine instead of arithmetic dunders
open
GA-B2
Per-band attrs follow a band selection
superseded 21 Oct 2026 by coordinates
GA-B3
geoarray reads only the georeference (re-index, join, re-describe, read at); everything that computes is geoops; H(x) is interp_at
decided 24 Oct 2026; amended 4 Nov 2026 by GA-B6
GA-B4
The positional band guard stays until geoops takes dim= (geotoolz #531); removed in geotoolz-array 0.4
decided 24 Oct 2026
GA-B5
geoarray.stack is a 0.3 deprecation shim; pipekit_array.stack from 0.4
decided 24 Oct 2026
GA-B6
interp_at and the named reductions move to geoops: geoops.geom.interp_at plus an InterpAt operator, and nodata-aware geoops.compositing.reduce / argreduce; geoarray stops re-exporting reduce / argreduce (they stay in pipekit-array, GA-Q3). geoarray’s documented computing exceptions are valid_mask (the nodata model) and astype (a cast)
decided 4 Nov 2026
GA-C1
Eager np.asarray copies to host and raises under transforms; mixed NumPy and JAX inputs refuse (0.3 warns, 0.4 raises)
decided 17 Oct 2026, partly superseded 21 Oct 2026; migration decided 24 Oct 2026
GA-D1
One coordinated breaking release from GeoTensor to GeoArray
decided 17 Oct 2026
GA-E1
JAX kernels in geoops.functional
superseded 22 Oct 2026 by the kernel model on operators
GA-T1
GeoImageSeries and GeoTimeSeries as the series names
decided 21 Oct 2026
GA-T2
band and variable are separate dims
decided 21 Oct 2026
GA-T3
level is allowed on observations
decided 21 Oct 2026
GA-T4
coordax is an optional converter, not the JAX lane’s foundation
decided 21 Oct 2026
GA-T5
Readable types are dims signatures any carrier matches; a DataArray’s horizontal dims read as y x; GeoMapSeries is time y x beside GeoImageSeries (time band y x)
decided 23 Oct 2026 (CS-F1)
GA-Q1
What esmax and vardax take at their boundary
open
GA-Q2
The georeference in xarray: CF grid_mapping plus GeoTransform (same as LL-F1)
decided 23 Oct 2026
GA-Q3
Shared dim-level functions live in pipekit-array
decided 21 Oct 2026
GA-Q4
What happens to geoops compositing
open
GA-Q5
Do geoops operators accept a DataArray
decided 23 Oct 2026: kernel operators yes, lazily; geometry operators no
Deterministic neural-field parts in geonnax, probabilistic in pyrox-nn, assimilation in vardax; case 9, case 11 and methane stage 3 are the acceptance tests
open (proposed; Wave 6)
NF-O1
Averaging kernels: field on pressure levels or one collapsed weight per pixel
open
NF-O2
pyrox Parameterized registry under eqx.tree_at rebuilds
open
NF-O3
geonnax field names pyrox-nn swaps are added to, never renamed
open
NF-O4
Error bars for neural-field 4D-Var: ensemble spread from the start
open
NF-O5
SWOT wave-correlated noise in case 9
open
NF-O6
Ownership of field derivatives (geonnax.diffops vs xrgrad vs spectraldiffx)