nirs4all-lite → nirs4all-core rename runbook¶
This is the ordered, concrete procedure for promoting the aggregate from
nirs4all-lite to nirs4all-core without breaking current production package
availability. Originally drafted by the RC-E language-surface lane as a
rename-readiness record; topology/naming ownership and the ecosystem-level
moves belong to the coordinator / RC-A.
Status (2026-07-02, RC-A): Phase R1 is executed on the RC V1 head (
rc/v1-full-refactor-core) per the RC V1 control-board decision that RC is the final topology. Exception: Phase R1 item 2 (canonical/alias package inversion) is deliberately deferred — the canonical import staysnirs4all_litebecause the ecosystem release-lock consumesbindings/python/src/nirs4all_lite/_topology.pyby path and must move in lockstep with any such inversion. The topology schema id was bumped tonirs4all-core.release-topology.v2(the shape changed:future_id→legacy_id,target_distribution→legacy_distribution); no code consumer pinned the old id — only the intentionally-stale committed aggregation lock, which is regenerated at final head selection. Phase R2 (GitHub repo rename, PyPInirs4all-coreTrusted Publisher, RTD slug, finalnirs4all-litealias release) remains pending admin action and blocks the actual publish.
Governance context: SW2_GOV_CORE_NAMING_spec.md (GOV-003/GOV-004),
A13_A13-core-release.md (DEC-GOV-001/002, staged T0→T2), and
NAMING.md. The direction is a concept rename whose only Python
distribution name is actually in question — Rust/npm/R/MATLAB already ship the
bare nirs4all name and are unaffected.
Invariants that must hold at every step¶
PyPI
nirs4all-litestays installable before, during, and after cutover. After the flip it becomes a thin alias/successor that depends onnirs4all-core;pip install nirs4all-litemust keep working.Rust / npm / R / MATLAB are untouched. They already use the bare
nirs4allname (crate / npm package /library(nirs4all)/+nirs4all). The rename is Python-distribution-only.nirs4allstays reserved as a Python import. The full Pythonnirs4allmodelling library owns it until an intentional core cutover; neithern4a,nirs4all_core, nornirs4all_litemay define a top-levelnirs4allmodule.No behaviour fork.
nirs4all-coreis the same code lineage, published as an alias/successor — never a divergent re-implementation.
Phase R1 — in-repo edits (EXECUTED by RC-A, except item 2)¶
bindings/python/pyproject.toml— done:name = "nirs4all-core";self-referential extra flipped to
everything = ["nirs4all-core[all,datasets]"];[project.urls]stays on the current repo slug until Phase R2 (GitHub redirects permanently after the rename);the wheel
packageslist still shipsnirs4all_core,nirs4all_lite, andn4aso invariant (1) holds (the old import keeps resolving).
Facade direction — deferred (see status note above): making
src/nirs4all_corethe canonical implementation and turningsrc/nirs4all_lite/__init__.pyinto the thin forwarding alias requires a lockstep update of the ecosystem release-lock artifact path (aggregation-manifest.n4a.json→lite.contract_artifacts.release_topology_manifest.path).n4acontinues to re-export whichever package is canonical via__aggregate_import__.bindings/python/src/nirs4all_lite/_topology.py— done:aggregate.id = "nirs4all-core",legacy_id = "nirs4all-lite",target_repo = "GBeurier/nirs4all-core"(repo rename pending);python.distribution = "nirs4all-core",canonical_importunchanged (nirs4all_lite),legacy_distribution_status = "superseded";install_distributions:nirs4all-core→status = "current"withworkflow = "release-python.yml";nirs4all-litekept as the legacy alias row (status = "legacy-superseded", no workflow/artifact);schema id bumped to
nirs4all-core.release-topology.v2(not a silent rename: shape changed, consumers audited — none pinned the old id).
Guard tests in
test_release_topology.pyflipped in the same change — done: they now assert the new canonical name and thenirs4all-litealias row.test_facade.pyunchanged (canonical/alias__name__s did not swap; item 2 deferred).Source/SBOM naming — done:
release-source.ymlprefix and the manifest row renamednirs4all-lite-source-sbom→nirs4all-core-source-sbom(cosmetic; keep the old artifact name as an alias for one release if downstreams fetch it).Cosmetic diagnostics sweep — done: the “outside the current nirs4all-lite portable subset” strings in
_pipeline.py,bindings/r/R/pipeline.R,bindings/rust/nirs4all/src/lib.rs,bindings/wasm/src/index.js, and MATLAB now saynirs4all-core. These are diagnostics, not contracts.
Phase R2 — coordinator / GitHub / registry actions (PENDING, not simulated)¶
These require repository-admin or registry credentials and are recorded, not executed:
Rename the GitHub repo
GBeurier/nirs4all-lite→GBeurier/nirs4all-core. GitHub installs an automatic redirect, but update[project.urls], the RustREADME/Cargo.tomlrepo links, and every workflow that hard-codes the slug.Ecosystem submodule pin (owned by RC-A / coordinator): update the
nirs4all-ecosystemsubmodule path/URL for the renamed repo.PyPI: register/claim
nirs4all-coreand create its Trusted Publisher (ownerGBeurier, repo per the rename, workflowrelease-python.yml, environmentpypi); publishnirs4all-corefromrelease-python.yml; then publish a finalnirs4all-literelease whose only dependency isnirs4all-core(alias wheel) so invariant (1) holds. Never yank existingnirs4all-liteversions.Read the Docs: rename/alias the
nirs4all-liteproject slug; docs URLs in this repo stay on the current slug until then.Docs site /
nirs4all.org: install snippets updated on the org RC head (RC-A); that head must not deploy before the PyPInirs4all-corepublish.
Phase R3 — verification (after R1 + R2)¶
pip install nirs4all-coreandpip install nirs4all-liteboth succeed;import nirs4all_core,import n4a, and the legacyimport nirs4all_liteall work;import nirs4allstill resolves to the full library (invariant 3).make test-python-v1-surfacespasses with the flipped guard tests.Rust/npm/R/MATLAB gates unchanged and green (invariant 2).
release_topology_manifest()reportsnirs4all-coreascurrentandnirs4all-liteas the alias.
One-line status¶
Phase R1 is executed on the RC V1 head (canonical-import inversion deferred with its lockstep requirement recorded). Remaining work is Phase R2 coordinator/registry actions, then Phase R3 verification.