# Phase P10 validation — packaging and fresh-machine acceptance Date: 2026-09-28. Artifacts built and tested on fresh AWS Ubuntu 24.04 VMs (4 vCPU): aarch64 c7g.xlarge and x86_64 m6a.xlarge / c6a.xlarge (one x86 spot instance was reclaimed by AWS after 4 min and relaunched). Cloud cost ≈ $0.10. ## Artifacts | Artifact | How | Notes | |---|---|---| | `simurg-1.0.0-py3-none-any.whl`, `simurg-1.0.0.tar.gz` | `uv build` (hatchling) | QC report assets, profiles, `LICENSE` and `THIRD_PARTY_NOTICES.md` inside | | `simurg_core-1.0.0-cp312-abi3-manylinux_2_28_{aarch64,x86_64}.whl` | `maturin --zig --compatibility manylinux_2_28` (both built on either machine) | one wheel per architecture for every Python ≥ 3.12; glibc ≥ 2.28 | | Docker image (`Dockerfile`) | multi-stage, `python:3.12-slim-bookworm`, non-root user | 545 MB (x86_64), 551 MB (aarch64) | | conda packages (`packaging/conda/`) | `conda build -c conda-forge` | `simurg` (noarch) + `simurg-core` (Rust compiler from conda-forge) | `scripts/build_dist.sh` builds the wheels and sdist and writes `dist/SHA256SUMS`. A wheel built on the Pi is not portable (glibc 2.41 symbols such as `exp@GLIBC_2.29`), hence the zig-linked manylinux build. ## Acceptance (plan §18 P10: clean install + tutorial works on a fresh VM) `scripts/cloud/tasks/p10.sh` (and `p10t.sh`, the same without Docker/conda) on each architecture: | Step | aarch64 | x86_64 | |---|---|---| | Build sdist, pure wheel, both kernel wheels | ok | ok | | `pip install` into a new venv of the system Python 3.12.3 (with / without kernels) | ok / ok | ok / ok | | Unit tests against the installed package (225) | pass | pass | | Tutorial `examples/gsa_demo.sh` on 6 demo samples, pip install with kernels | ok (506 s) | ok (521 s) | | Tutorial, pure-Python install | ok (539 s) | ok (494 s) | | Docker build + `genotype` + `gtc-to-vcf` | ok | ok | | conda build + install + `genotype` | ok | ok | Content digests (`scripts/p10/digest.py`: every numeric GTC field and sample statistic with NaNs canonicalised, all VCF data lines) of the 6 GTCs and 6 VCFs are **identical across all of them**: pip with kernels, pip pure, Docker and conda, on aarch64 and on x86_64, and equal to the Raspberry Pi's own run of the same tutorial. The x86_64 results come from AMD EPYC (m6a/c6a) machines; bit-exactness had so far only been shown on ARM. ## Found and fixed * `simurg inspect … | head` made the CLI report `E_INTERNAL: BrokenPipeError` and exit 1, which stopped the tutorial under `set -o pipefail` (it passed on the Pi only by timing luck). A closed stdout now exits with 141 (like a tool killed by SIGPIPE) and prints nothing; the tutorial reads with `sed` instead of `head`; unit test added. * The `fast` extra (`simurg[fast]` → `simurg-core`) was dropped: `uv` must resolve every extra, and `simurg-core` is not on a package index. The kernels are installed as their own wheel.