# M1 — import donor: STATUS **Date**: 2026-05-21 (continuing from M0 same day) **Branch**: `merge/import-donor` **Anchor**: branched off `pls4all-final/v1.0.0-pre-merge` (`3b99c0b`) **Merge commit SHA**: `2ca4aa8f681472817e15288f8f83a8ff3ca3e968` **Pushed**: `origin/merge/import-donor` = `2ca4aa8` ✅ ## What was done | # | Action | Outcome | |--:|---|---| | 1 | Branch `merge/import-donor` from `pls4all-final/v1.0.0-pre-merge` | ✅ HEAD now at clean baseline (`3b99c0b`) | | 2 | Add donor as local-path remote: `git remote add donor /home/delete/nirs4all/nirs4all-methods/` | ✅ | | 3 | `git fetch donor` | ✅ 45 commits + 18 archive tags fetched | | 4 | `git subtree add --prefix=_donor/nirs4all-methods donor main` | ✅ Merge commit `2ca4aa8` created | | 5 | `cmake --preset dev-release` configure | ✅ no collision; pls4all 0.97.3 configured cleanly | | 6 | `cmake --build --preset dev-release -j 4` | ✅ 24 build steps; libn4m.so.1.16.0 + n4m_cli + n4m_tests + libp4a_static.a all linked | | 7 | `ctest --preset dev-release` (n4m_tests binary) | ✅ **265 run, 0 failures, 0 skipped** | | 8 | `n4m_cli --selfcheck` | ✅ "selfcheck OK", project version `0.97.3+abi.1.16.0` | | 9 | `git push -u origin merge/import-donor` | ✅ | ## Merge commit structure ``` commit 2ca4aa8f681472817e15288f8f83a8ff3ca3e968 parents: 3b99c0b4a348c271b22deff1c4822709522f451b (pls4all baseline: "Publish partial benchmark dashboard refresh") 6195574a64b167cabdfa8d9a1d8bf3cd706a80da (donor M0 baseline: "M0 baseline: unblock donor CI ahead of merge") Add '_donor/nirs4all-methods/' from commit '6195574a64b167cabdfa8d9a1d8bf3cd706a80da' git-subtree-dir: _donor/nirs4all-methods git-subtree-mainline: 3b99c0b4a348c271b22deff1c4822709522f451b ``` Both histories are reachable from the merge commit. `git log --first-parent` walks pls4all history; `git log` (default = follow all parents) walks both. ## Tree layout after import (verified) ``` /home/delete/nirs4all/pls4all/ (pls4all root — untouched) ├── cpp/include/pls4all/p4a.h (86.8 KB, original) ├── bindings/ (14 sub-bindings) ├── parity/ (pls4all parity) ├── benchmarks/ (pls4all benchmarks) ├── docs/, roadmap/, scripts/ (pls4all) └── _donor/nirs4all-methods/ (NEW — fully donor tree) ├── cpp/include/n4m/n4m.h (136.8 KB, donor ABI) ├── bindings/ (python, r) ├── parity/ (donor parity gate) ├── benchmarks/ (donor benchmarks) ├── docs/, roadmap/, scripts/ (donor) ├── CMakeLists.txt (donor — NOT activated by pls4all's root CMakeLists) └── ARCHITECTURE.md, CHANGELOG.md, README.md, … ``` ## Roadmap gate satisfied > M1 gate per `MERGE_ROADMAP.md` row M1: *"both symbol tables co-exist; ctest can build pls4all only at this stage"* - Both ABI symbol tables coexist on disk: pls4all `n4m_*` + donor `n4m_*` (each in its own header tree) - pls4all builds and tests at 265/265 green - Donor tree is dormant — neither pls4all's `CMakeLists.txt` nor any other build glue picks it up yet. That's correct for M1; M2.5 will start consolidating the common-core under `cpp/src/core/common/`. ## What is NOT done (intentionally, per the roadmap) - Donor tree's CMakeLists not wired into pls4all's build (M2.5 will start that) - No source moves yet (M3 moves donor non-PLS sources out from `_donor/` to final paths; M4 splits pls4all's `model.cpp` etc.) - No ABI rename (M5) - No catalog yet (M2 lands it) ## Untracked working-tree noise ~596 files showing as `??` in `git status`. These are leftover oracle dumps + `.x_target/` from the earlier `codex/parity-30x30-dashboard-fixes` checkout. They are NOT tracked by any branch — they are just orphan files on disk. They will be cleaned up either: - by checking out a clean state after work resumes, or - by the M2 catalog scripts when they run their own `.gitignore` propagation No impact on the merge or build. ## Next: M2 — target tree skeleton - Create the namespaced category dirs (per `MERGE_ROADMAP.md` §2) - Land `catalog/schema/method_v1.json` (the expanded schema from §5.4) - Auto-generate `catalog/methods.yaml` from both source trees - Land the 7 subset YAMLs (2 active: `nirs4all_methods` + `pls4all`; 5 planned: `aompls`, `nirs4all_preprocessing`, `nirs4all_augmentation`, `nirs4all_selection`, `n4m_transfer`) - Write `catalog/scripts/{validate_catalog,build_closure,render_subset}.py` - Gate: `validate_catalog.py` passes; the two active subsets close