M7 + M8 — parity gate + dashboard unification: STATUS¶
Status: 🟡 partial — donor infrastructure lifted under unified paths; full runner merge deferred Date: 2026-05-21 Pushed: pending commit
What was done¶
M7 — parity infrastructure lift¶
Donor’s _donor/nirs4all-methods/parity/ was relocated to parity/donor_imports/ so it sits alongside pls4all’s existing parity/{schema,fixtures,python_generator,r_generator} tree, while keeping the two distinct (no namespace collision yet).
Origin |
Target |
Files |
|---|---|---|
|
|
1 (107.8 KB; the 5-stage gate driver) |
|
|
1 (the Stage 4 scaffold) |
|
|
1 (machine-readable skip registry, 3 classes) |
|
|
1 |
|
|
1 |
|
|
full subtree (locked env + adapters for SciPy/sklearn/pybaselines/PyWavelets/nirs4all) |
|
|
full subtree (~250 JSON fixtures) |
|
|
|
|
|
1 (the n4m-side tolerance table) |
|
|
1 |
M8 — benchmark dashboard portability¶
Donor’s _donor/nirs4all-methods/benchmarks/ similarly relocated:
Origin |
Target |
Files |
|---|---|---|
|
|
subtree (orchestrator, results, validate_dashboard_payload.py) |
|
|
subtree |
|
|
subtree (the v0 registry/{datasets,suites,references,…}.json) |
|
|
1 (donor’s scaffold registry) |
|
|
1 |
|
|
1 |
|
|
1 |
Dashboard orchestrator de-hardcoded¶
benchmarks/cross_binding/orchestrator.py:142 was the only hardcoded
/home/delete/... path Codex flagged (the rest of the 31346 grep hits
are inside generated CSV result files, not source). Replaced the
hardcoded path with an env-var-driven fallback:
PLS4ALL_R_ENV = os.environ.get(
"N4M_R_ENV",
os.environ.get("PLS4ALL_R_ENV", "/home/delete/miniconda3/envs/pls4all_r"),
)
A clean clone now works without editing the file. The maintainer’s
historical fallback stays for backward-compat. A warning emits if the
fallback doesn’t exist and N4M_R_ENV_NOWARN is unset.
What is NOT done (carried to focused session)¶
The roadmap M7 requires more than file-relocation:
Sub-goal |
Status |
|---|---|
Single unified runner driving both halves |
❌ — pls4all has no top-level runner; donor’s |
Implement Stage 4 binding parity (donor’s |
❌ — wiring happens after the runner is unified. |
Merge |
❌ — two distinct tables coexist ( |
Port pls4all’s |
❌ — donor’s |
Sync sklearn version (base 1.4 vs donor 1.8.0); regenerate base fixtures |
❌ — needs a fixture regeneration pass in a locked env. |
The roadmap M8 requires the same kind of follow-on work:
Sub-goal |
Status |
|---|---|
Bring donor methods into |
❌ — donor’s |
Add |
❌ |
Split |
❌ — 829 KB → 2 MB issue remains. |
Adopt |
❌ |
Build verification¶
pls4all build and tests unchanged at this commit:
$ cmake --build --preset dev-release && ./build/dev-release/cpp/tests/n4m_tests
=== 265 run, 0 failures, 0 skipped ===
The donor infrastructure parked at parity/donor_imports/ and
benchmarks/donor_imports/ is dormant: pls4all’s CMakeLists doesn’t
activate it and no Python entrypoint references the parked paths.
Remaining _donor/ footprint after this commit¶
_donor/nirs4all-methods/ still contains:
cpp/include/n4m/(donor’s umbrella header — duplicates the one already atcpp/include/n4m/from M2.5; deletion deferred to M5+M6 focused session)cpp/src/c_api/(donor’s c_api wrappers — pairs with cpp/include/n4m/)cpp/cli/,cpp/tests/,cpp/abi/(donor’s CLI + test harness + ABI golden symbol tables — useful for the M5+M6 session)docs/,roadmap/,bindings/{python,r},scripts/,cmake/,.github/Top-level config files (ARCHITECTURE.md, CHANGELOG.md, CITATION.cff, README.md, etc.)
Total: ~815 files preserved as donor archeology
Final cleanup of _donor/ lands when the donor repo is renamed in M16
(at which point the prefix becomes redundant — everything is in the
unified repo by name).