# M0.d — CI status of both repos — **revision 2** (after Codex M0 review) ## `pls4all` (base) — baselines (refer to `pls4all-cleanup-status.md` for the merge-baseline decision) | Anchor | Full SHA | Subject | |---|---|---| | `v0.97.3` (release tag) | `49dc7507446895b32997f85a6b59803e35d2f823` | Prepare adaptive benchmarks and R release | | `origin/main` | `3b99c0b4a348c271b22deff1c4822709522f451b` | Publish partial benchmark dashboard refresh | | Local `main` (stale, 4 behind) | `a05b1928c191b1c665a74526e7f56686f42db47b` | Make long benchmark shards resumable | | `codex/parity-30x30-dashboard-fixes` (HEAD, pushed) | `6df4611a03522f0b0a9a85515e6507e8d26063c5` | Fill strict binding divergence scores | ### CI verdict per anchor | Anchor | Workflow result | Comment | |---|---|---| | `v0.97.3` | ✅ green at release time | The release was cut at `49dc750`; CI green at that SHA is the v0.97.3 contract. | | `origin/main` (`3b99c0b`) | ✅ all green | All cpp matrix jobs + sanitizers + parity gate + version-sync + docs pass. | | local `main` (`a05b192`) | ✅ green | Same as origin/main's prior tip from CI history; local just lags. | | `codex/parity-...` (`6df4611`) | ⚠️ no check runs at this SHA on origin | The branch is pushed but workflows are gated and never ran at this tip. Before tagging the merge baseline at the post-merge tip, **CI must be re-run on the merged commit and confirmed green.** | **Practical implication.** The merge baseline is **not** any existing anchor. Per `pls4all-cleanup-status.md` "Option A revised", the baseline becomes the merged tip after: 1. local `main` is fast-forwarded to `origin/main`, 2. the codex branch's in-flight work is committed and PR'd into `main`, 3. CI runs green on the merged tip, 4. that new tip gets the additive tag `pls4all-final/v1.0.0-pre-merge`. The existing `v0.97.3` tag at `49dc750` is preserved unchanged. The decision between A1 (land release PR stack first), A2 (close release PRs and redo in M15), and A3 (cherry-pick SOVERSION fix only) sits in `pls4all-cleanup-status.md`; CI implications: A1 adds ~1 week of release-PR CI cycles before M0 closes; A3 adds one CI cycle for the cherry-pick PR only. --- ## `nirs4all-methods` (donor) ### `main` tip `95906aae18ceb882835e25b7ccaa2887f80f02cd` **CI verdict: ❌ RED.** Most recent workflow run at the tip: | Workflow | Result | |---|---| | `version-sync` | ✅ | | `Sanitizers` | ✅ | | `docs` | ✅ | | `CI` (cpp matrix) | ❌ failing — see below | | `release-r` (R CMD check on 4 platforms) | ❌ failing — see below | ### CI cpp matrix failure detail One platform job fails: | Job | Failure | |---|---| | `cpp / macos-clang-debug` | `n4m_tests: 265 passed, 1 failed`
`FAIL split_kmeans_parity: kmeans/seed42_ts_0_25/train: index mismatch at i=34 (got 45, want 46)` | All other cpp matrix jobs (linux-gcc12/13, linux-clang16, macos-clang-release, macos-universal2, windows-msvc-release/debug, windows-mingw, debug variants) pass. **Root-cause hypothesis**: platform-specific tie-breaking in k-means initialisation on macOS clang debug build. Fix is small (deterministic tie-resolution by lower-index-first) but must be verified. ### release-r (R CMD check) failure detail All 4 R CMD check jobs (linux-release, linux-devel, windows-release, macos-arm64-release) fail with the same two warnings, treated as errors by the workflow's `error-on: "warning"`: ``` Status: 2 WARNINGs ❯ checking whether package 'n4m' can be installed ... WARNING Warning: Fortran 2018 deleted feature: Shared DO termination label 20 at (1) Warning: Fortran 2018 deleted feature: Shared DO termination label 80 at (1) Warning: Fortran 2018 deleted feature: Shared DO termination label 260 at (1) ❯ checking for missing documentation entries ... WARNING ``` **Root causes**: 1. Vendored FITPACK Fortran uses Fortran 77 shared DO termination labels (label 20 / 80 / 260) — modern `gfortran -std=f2018` flags as deleted feature. Fix: add `-std=legacy` to FFLAGS in `bindings/r/n4m/src/Makevars` and `Makevars.win`. (Alternative — modernise FITPACK — is far more work and out of M0 scope.) 2. Missing roxygen entries for some R functions in `bindings/r/n4m/man/`. Fix: add `\name{}` / `\title{}` blocks for the few exported R functions lacking docs (or reduce the public R surface to documented set if the exposures were accidental). --- ## M0.d verdict — **BLOCKED** The roadmap's M0 gate (`MERGE_ROADMAP.md` §9 row M0) requires **both `gh pr checks` green** at the chosen baselines. The donor side is not green. ### Required fixes before tagging `nirs4all-methods-final/` 1. **`split_kmeans_parity` macOS debug.** Either tighten tie-resolution in `cpp/src/core/splitters/kmeans.c` so the index choice is platform-stable, or relax the fixture tolerance for this case in `parity/divergences.json` with a documented rationale and a tracking issue. 2. **FITPACK Fortran flag.** Add `-std=legacy` to `FFLAGS` in `bindings/r/n4m/src/Makevars` and `Makevars.win`. 3. **R documentation entries.** Restore the missing roxygen `\title{}` / `\param{}` / `\return{}` blocks so `R CMD check --as-cran` passes with zero WARNINGs. After each push, wait for the workflow to go green. Only then tag `nirs4all-methods-final/` and proceed to M1. These three fixes are estimated 2-3 hours combined. They are **not** deferrable to M11 of the merge plan — the M0 gate requires green CI here, and starting M1 with a red donor amplifies every later debugging session. ### Required action before tagging `pls4all-final/v1.0.0-pre-merge` Per `pls4all-cleanup-status.md` Option A revised: 1. Sync local `main` to `origin/main` (fast-forward). 2. Commit the codex branch's in-flight real source changes (5 focused commits). 3. Decide A1/A2/A3 for the release PR stack. 4. Merge codex → main. 5. Wait for green CI on the merged tip. 6. Tag. The earlier-revision "ready to be tagged at `a05b192`" claim was wrong (local main is stale; `v0.97.3` is at a different commit; baseline is a future merged tip).