From cceda03935bc6390c02f3f9b01e25a4cb12e347b Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 7 Sep 2026 06:20:04 +0000 Subject: [PATCH] fix(ci): do not gate the targeted repair on the source classifier (#205) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Why The repair workflow ran `build-one.R --sensitive-only`. That flag skips any version the **source** classifier does not call r-minor-sensitive — and it misses `Rcpp`. So the repair skipped `Rcpp` on every slot, leaving its 4.5-built flat binary as the only copy: ``` flat 200 built under R 4.5.3 4.4/ 404 4.5/ 404 4.6/ 404 ``` Every R 4.4 client on those slots then failed at `dyn.load()`. A real install check across 8 slots x 3 minors x 3 repository forms found **44 such failures**, `Rcpp`, `Matrix` and `RJSONIO` among them. ## What changed Drops `--sensitive-only`. Since bincraft v5.3.0 the destination is decided by the built binary's symbols in `upload_single_binary()`, so building unconditionally is safe and correct: a package that needs a per-minor slot lands there, one that does not lands in the flat slot. Skipping before the build is exactly what removed that decision from the path. `crow lint` passes. ## Companion bincraft #129 is the other half: the index build could not compensate either, because it only considered dropping records whose *package* was flagged risky, and `Rcpp` is not — even though the backfill had recorded that object as unable to load under 4.4. Reviewed-on: https://git.devxy.io/devxy/build-cran-binaries/pulls/205 --- .crow/rebuild-abi-gap.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.crow/rebuild-abi-gap.yaml b/.crow/rebuild-abi-gap.yaml index d346adf..289781d 100644 --- a/.crow/rebuild-abi-gap.yaml +++ b/.crow/rebuild-abi-gap.yaml @@ -14,9 +14,15 @@ # minor from CI, only `just rebuild` from a workstation with the S3 and Postgres # credentials to hand. This adds that path. # -# `build-one.R --sensitive-only` re-runs the ABI classifier per version, so a -# package that turns out not to be risky is skipped rather than written into the -# wrong slot. +# `--sensitive-only` is deliberately NOT passed. That flag gates on the source +# classifier, which misses Rcpp: the repair therefore skipped Rcpp entirely, +# leaving its 4.5-built flat binary as the only copy and breaking every R 4.4 +# client on the slot. +# +# Since bincraft v5.3.0 the destination is decided by the built binary's symbols +# in `upload_single_binary()`, so building unconditionally is safe: a package +# that needs a per-minor slot lands there, and one that does not lands in the +# flat slot. Skipping before the build is what removed that decision. # # Trigger with the slot and an explicit package list: # @@ -207,7 +213,7 @@ steps: continue fi echo "=== rebuilding $$pkg $$ver into $$ABI_R_MINOR ===" - "$$RBIN/Rscript" local/build-one.R --sensitive-only "$$pkg" "$$ver" || rc=1 + "$$RBIN/Rscript" local/build-one.R "$$pkg" "$$ver" || rc=1 done exit $$rc backend_options: