# Release readiness — v0.1.0-alpha **Target:** snapshot `origin/develop` as a publishable, merge-ready baseline. **Version:** v0.1.0-alpha (unless JFW changes it). ## Stable APIs (semver — no breaking changes in patch/minor) These are the validated production paths. A user following the tutorial (`docs/TUTORIAL.md`) stays entirely inside this surface. | API surface | Entry point | Validated | |---|---|---| | OpenCV stereo path | `api.calibration.fit_opencv_stereo_from_image_dirs` | ✅ slow tests | | Ray2D corner refinement | `eval.predictors.predict_charuco_points` | ✅ benchmark | | Central stereo rayfield | `api.calibration.fit_stereo_central_rayfield_from_image_dirs` | ✅ slow tests | | Non-central Zernike origin field | `calibration.fit_stereo_zernike_origin_field` | ✅ benchmark | | Model import / export | `api.model_io.{save,load}_stereo_central_rayfield` | ✅ round-trip test | | Reconstruction diagnostics | `metrics.reconstruction_metrics.reconstruct_points_central_stereo` | ✅ benchmark | ## Advanced APIs (stable interface, expert use) These are validated but require domain knowledge (optical models, gauge conventions, parameter layout). Breaking changes may happen after deprecation notice. | API surface | Entry point | |---|---| | Physical model selection | `physics.model_selection.fit_physical_model_to_rayfield` | | CMO physical model | `physics.cmo_physical.fit_cmo_physical_stereo_model_to_rayfields` | | CMO telecentric model | `physics.cmo_physical.fit_cmo_telecentric_model_to_rayfields` | | CMO warped model | `physics.cmo_physical.fit_cmo_warped_model_to_rayfields` | | Schur diagnostics | `optical_ba.regularized_ba` | | Paper reproduction helpers | `benchmarks/`, `synthetic/` | ## Experimental APIs (no stability promise) These exist as scaffolding for future work. Signatures, parameter layouts, and return types will change without notice. | API surface | Status | |---|---| | N-camera facades (`api.calibration.calibrate(cameras=...)`) | Routes only `("left","right")`; other topologies raise `NotImplementedError` | | `MultiCameraCharucoObservationSet` | Container only; real N-rayfield BA not implemented | | `MultiCameraZernikeRayField` | Container only | | `CMOTelecentricNModel` | Wraps stereo model via `from_stereo()` | | `fit_zernike_rayfields_from_multi_camera_observations` | Routes only `("left","right")` | | N-camera oracles / simulators | Benchmark scaffolding only | | `optical_ba/` scripts | Paper-specific, not general-purpose | **Explicit non-goals for v0.1.0-alpha:** - True N-camera bundle adjustment (Phase 2 — specification exists, not implemented) - Shared-rig SE(3) constraints across >2 channels - Production-grade multi-camera calibration from real images - GUI / web dashboard ## Paper-only code This code exists to reproduce the CMO paper. It is not part of the library API and may use hard-coded paths, deprecated helpers, or paper-specific conventions. | Location | Purpose | |---|---| | `paper/cmo/` | Manuscript source, build scripts, standalone figure generators | | `docs/assets/pycaso_real_data/` | JSON/NPZ artefacts for paper figures | | `examples/notebooks/09_pycaso_real_data.py` | Full paper analysis walkthrough | | `examples/notebooks/generate_fig_*.py` | Standalone figure generators | ## Quality gates (all passing @ 2026-05-24) | Gate | Command | Status | |---|---|---| | Lint | `rtk .venv/bin/python -m ruff check src/` | 0 errors | | Docstring contract | `rtk .venv/bin/python examples/notebooks/check_docstring_params.py` | 0 alarms, 88 files, wired into CI | | Fast tests | `rtk .venv/bin/python -m pytest` | 159 passed, 39 deselected | | Slow tests | `rtk .venv/bin/python -m pytest -m slow` | 39 passed, 0 failures | | Doc coverage | `100%` (425/425 public functions) | ✅ | ## Known heavy artefacts (audit 2026-05-24 — 234 MB total) | Artefact | Size | Strategy | |---|---|---| | `docs/assets/pycaso_real_data/schur_ba/*.npz` (available on Zenodo: https://doi.org/10.5281/zenodo.20369312) | 140 MB (6 files × ~24 MB) | Archived on Zenodo — DOI: 10.5281/zenodo.20369312 — regeneration artefacts, not primary data | | `docs/assets/pycaso_real_data/specimen_*.npz` | 51 MB (3 files) | Keep (needed for paper figure reproduction) | | `paper/cmo/figures/` | 15 MB | Keep (vector PDF versions are 2 MB, PNGs are paper legacy) | | `paper/cmo/manuscript.pdf` | 8 MB | Keep (submission artefact) | | `Biblio/*.pdf` | 6 MB (2 files) | Already local bibliography — keep | | `examples/notebooks/*.ipynb` | 5 MB | Keep (Colab badges point to develop) | | `dataset/` | 2 MB | Keep (needed for notebook walkthroughs) | | `src/` | <1 MB | Keep | **Recommendation:** move `docs/assets/pycaso_real_data/schur_ba/` (available on Zenodo: https://doi.org/10.5281/zenodo.20369312) to Zenodo (140 MB would be removed) and add the DOI to the paper's data-availability statement. The 6 large NPZ files are Schur-BA snapshots reproducible from the smaller `specimen_correspondences.npz` (12 MB) + the fitting code. After removal, the repo would be ~94 MB (after Zenodo archival). ## Pending before merge to main 1. Switch Colab links from `blob/develop/` to `blob/main/` (see CLAUDE.md § Colab branch hack) 2. Tag `v0.1.0-alpha` on the merge commit 3. Update `docs/START_HERE.md` to reflect that `develop` → `main` has happened 4. Archive paper artefacts on Zenodo and link from README