feat(abi): skip objects that already have the per-minor builds they need #207

Merged
pat-s merged 1 commit from feat/skip-already-repaired-objects into main 2026-09-09 10:33:42 +00:00
Owner

Why

The fleet repair (12410) was interrupted after 14 of 18 slots, having done:

2522 objects enumerated | 2568 uploads | 1451 symbol overrides

Resuming would repeat all of it. The verdict in abi_flat_safety describes the flat object, and building a per-minor copy does not change that object, so the repair list is identical on the next run. Roughly 2500 objects of duplicated compute.

What changed

list-unsafe-flat-objects.R now drops rows that are already repaired: an object counts as repaired once a per-minor build exists for every minor that cannot load the flat one.

  • The bucket is the source of truth, listed directly (it cannot be routed).
  • Where unsupported is empty — unsafe without a recorded reason — a build under every minor the image carries is required, rather than assuming one suffices.
  • It reports how many were skipped, so an unexpectedly short list is visible rather than silent.
  • It fails when the bucket cannot be listed, because an empty listing would make every object look unrepaired and silently restore the full rebuild.

Verification

The predicate, exercised directly:

Rcpp   needs[4.4,4.6]      -> SKIP (repaired)
Rcpp   needs[4.4,4.5,4.6]  -> REBUILD     (4.5 missing)
yaml   needs[4.4]          -> SKIP (repaired)
lobstr needs[]             -> REBUILD     (no recorded minors: all required)

Note

~70 packages fail to build regardless — glmmTMB, tmbstan, OpenMx, Cyclops, RSiena, pdftools, odbc among them — all on uvr sync --install-system-deps. They keep their unsafe flat binaries and stay broken for the minors they cannot load under. That is a missing-system-dependency problem in the build images, not an ABI one, and needs separate attention.

## Why The fleet repair (12410) was interrupted after 14 of 18 slots, having done: ``` 2522 objects enumerated | 2568 uploads | 1451 symbol overrides ``` Resuming would repeat all of it. The verdict in `abi_flat_safety` describes the **flat** object, and building a per-minor copy does not change that object, so the repair list is identical on the next run. Roughly 2500 objects of duplicated compute. ## What changed `list-unsafe-flat-objects.R` now drops rows that are already repaired: an object counts as repaired once a per-minor build exists for **every** minor that cannot load the flat one. - The bucket is the source of truth, listed directly (it cannot be routed). - Where `unsupported` is empty — unsafe without a recorded reason — a build under every minor the image carries is required, rather than assuming one suffices. - It reports how many were skipped, so an unexpectedly short list is visible rather than silent. - It **fails when the bucket cannot be listed**, because an empty listing would make every object look unrepaired and silently restore the full rebuild. ## Verification The predicate, exercised directly: ``` Rcpp needs[4.4,4.6] -> SKIP (repaired) Rcpp needs[4.4,4.5,4.6] -> REBUILD (4.5 missing) yaml needs[4.4] -> SKIP (repaired) lobstr needs[] -> REBUILD (no recorded minors: all required) ``` ## Note ~70 packages fail to build regardless — `glmmTMB`, `tmbstan`, `OpenMx`, `Cyclops`, `RSiena`, `pdftools`, `odbc` among them — all on `uvr sync --install-system-deps`. They keep their unsafe flat binaries and stay broken for the minors they cannot load under. That is a missing-system-dependency problem in the build images, not an ABI one, and needs separate attention.
The verdict in abi_flat_safety describes the *flat* object, and building a
per-minor copy does not change it, so the repair list stays the same after a
run. The first fleet repair was interrupted at 14 of 18 slots having uploaded
2568 objects; resuming would have rebuilt every one of them again.

An object is repaired once a per-minor build exists for every minor that cannot
load the flat one, and the bucket is the source of truth for that. Where no
minors are recorded -- unsafe without a reason -- a build under every minor the
image carries is required, rather than assuming one is enough.

This change will:

- list the slot's objects from S3 and drop the rows already covered
- report how many were skipped, so an unexpectedly short list is visible rather
  than silent
- fail rather than proceed when the bucket cannot be listed, since an empty
  listing would make everything look unrepaired
pat-s merged commit e3b7212eaf into main 2026-09-09 10:33:42 +00:00
pat-s deleted branch feat/skip-already-repaired-objects 2026-09-09 10:33:42 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
devxy/build-cran-binaries!207
No description provided.