# Zarr archive acceptance: reproduction package

Three version-scoped controlled-software studies, synthesized on 2026-10-23.
Companion analysis: https://hesela.com/analyses/zarr-fill-values-and-archive-completeness/
Dataset: https://hesela.dev/datasets/zarr-archive-acceptance/

## Preserve the experiment boundaries
The original Zarr 3.1.3 and strict Zarr 3.4.1 studies use fill -999.
The Xarray study uses storage fill 0 and tests CF attributes separately.
Local synthetic int32 arrays, not field failures, hardware tests or cloud races.
No current-Xarray or independent-review claim.

## Native replay
Use four separate Python 3.12 environments; never upgrade a shared environment.
Download the files listed by inputs.json, preserving their relative directories.
The original code only creates private temporary stores.

From zarr-fill-evidence:
- Install requirements.txt in a fresh environment.
- Run python -B experiment.py --output fresh.json
- Run python -B -m unittest -v
- Run python -B -O -m unittest -v
Compare fresh.json observations with observations.json (54 rows).

From zarr-xarray-consumer, for each pinned Xarray release:
- Install requirements-2025.10.1.txt or requirements-2026.9.0.txt in its own environment.
- Run python -B experiment.py --output fresh.json
- Run python -B -m unittest -v
- Run python -B -O -m unittest -v
Compare fresh observations to the version-matching retained file (252 per release).
The direct backend path is a diagnostic control, not a stable API workaround.

From zarr-strict-shards:
- Install requirements.txt in another environment.
- Run python -B experiment.py --output fresh.json
- Run python -B routing.py --output fresh-routing.json
- Run python -B -m unittest -v
- Run python -B -O -m unittest -v
Compare fixtures, observations and reopen_controls to retained observations.json;
compare fresh-routing.json to routing.json. Environment fields can differ honestly.

## Review on 25 October 2026
All 558 older-study observations were freshly reproduced in normal and optimized
Python. Full reports match except for Python 3.12.14 versus 3.12.3; pinned packages
and relevant source-module hashes match. The 3.4.1 shard/routing/reopen suite also
passed both modes. Original evidence and the 696-row dataset are unchanged.
See [the machine-readable replay receipt](review-20261025.json) for dependency
versions, installed-source hashes, capture hashes and comparison boundaries.
The original harnesses above remain the public reproduction route.

The historical Xarray forwarding issue has an upstream correction:
https://github.com/pydata/xarray/pull/11748 (merged 17 October 2026).
Both tested Xarray releases predate that correction. This does not establish
the first fixed release or turn fill-value decoding into a completeness check.

## Regenerate publication data
Retain this directory under replay/public/research/zarr-archive/.
Run node build-dataset.mjs --root replay from any working directory, using the
actual path to build-dataset.mjs. --check compares generated files without writing.
The outputs are replay/public/data/datasets/zarr-archive-acceptance.json and .csv.
dataset-source.json supplies editorial metadata; inputs.json pins 22 unchanged
original files from the source research stack. The manifest is not signed.

CSV contains 54 original, 504 consumer and 138 strict read observations: 696 rows.
Eight routing controls and one reopen control stay separate.
sourceFile and sourceIndex resolve every CSV row to its original observation.
Counts must not be pooled into a reliability sample.

## Reuse
CC0-1.0 for Hesela's original code and observations. Third-party libraries and
source documents retain their licenses; no wheels or third-party source text
are redistributed. Provenance records identify the pinned dependencies and
source-module checks used by the original experiments.
