fix(local): route multi-signature packages to human triage in the proposer
A package whose failing builds match more than one auto-proposable signature (e.g. some logs hit `tbb-stddef-removed` and others `rcppparallel-bundled-tbb`) produced two candidate registry entries with the same package/platforms/versions key, so the candidate set failed `validate-patches.R` with "ambiguous duplicate entries" and the whole proposer run aborted. Add a pure `dedupe_candidates()` that keeps a package only when it maps to a single signature and routes genuinely ambiguous packages (conflicting fix tiers) to human triage instead of guessing between them. The proposer prints the skipped packages and proceeds with the unambiguous candidates.
This commit is contained in:
parent
77508f8fc5
commit
ec64fb6db8
1 changed files with 80 additions and 1 deletions
|
|
@ -46,6 +46,38 @@ test_that("merge_ledger handles an empty/NULL starting ledger", {
|
|||
expect_length(merge_ledger(list(), new), 1L)
|
||||
})
|
||||
|
||||
test_that("dedupe_candidates keeps single-signature pkgs, routes conflicts to triage", {
|
||||
candidates <- list(
|
||||
list(package = "StanHeaders", signature = "tbb-stddef-removed"),
|
||||
list(package = "hmmTMB", signature = "tbb-stddef-removed"),
|
||||
list(package = "hmmTMB", signature = "rcppparallel-bundled-tbb") # conflict
|
||||
)
|
||||
out <- dedupe_candidates(candidates)
|
||||
kept <- vapply(out$keep, function(c) c$package, character(1L))
|
||||
expect_identical(sort(kept), "StanHeaders") # hmmTMB dropped as ambiguous
|
||||
expect_true("hmmTMB" %in% names(out$ambiguous))
|
||||
expect_setequal(
|
||||
out$ambiguous$hmmTMB,
|
||||
c("tbb-stddef-removed", "rcppparallel-bundled-tbb")
|
||||
)
|
||||
})
|
||||
|
||||
test_that("dedupe_candidates collapses a package repeated under one signature", {
|
||||
candidates <- list(
|
||||
list(package = "rstan", signature = "tbb-stddef-removed"),
|
||||
list(package = "rstan", signature = "tbb-stddef-removed")
|
||||
)
|
||||
out <- dedupe_candidates(candidates)
|
||||
expect_length(out$keep, 1L)
|
||||
expect_length(out$ambiguous, 0L)
|
||||
})
|
||||
|
||||
test_that("dedupe_candidates handles the empty list", {
|
||||
out <- dedupe_candidates(list())
|
||||
expect_length(out$keep, 0L)
|
||||
expect_length(out$ambiguous, 0L)
|
||||
})
|
||||
|
||||
test_that("signature_hit_rate splits addressed vs open per signature", {
|
||||
report <- build_triage_report(mk_failures(), registered_pkgs = "RcppParallel")
|
||||
hit <- signature_hit_rate(report, registered_pkgs = "RcppParallel")
|
||||
|
|
|
|||
Loading…
Reference in a new issue