From 09b050399fa01bac27b3558a33aa12e8cc242215 Mon Sep 17 00:00:00 2001 From: pat-s Date: Sat, 5 Sep 2026 17:09:59 +0000 Subject: [PATCH] fix(ci): do not gate the targeted repair on the source classifier rebuild-abi-gap ran build-one.R with --sensitive-only, which skips a version the source classifier does not call r-minor-sensitive. That classifier misses Rcpp, so the repair skipped it 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 and 3 minors found 44 such failures, Rcpp, Matrix and RJSONIO among them. 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, one that does not lands in the flat slot. Skipping before the build is precisely what removed that decision. --- .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: -- 2.54.0