feat(local): aggregate blocked-on-dependency reporting by dependency

With cascade detection live, a run surfaced ~30 root-cause dependencies, but the
"blocked on a dependency" list repeated the same dependency once per fingerprint
group (rstan x4, lpsymphony x4, salso x2, ...), burying the priority.

Aggregate across all groups by the dependency each dependent waits on: expose
`blocked_map` (package -> dependency) from build_triage_report, and add
`blocked_by_dependency()` which dedupes dependents and ranks dependencies by how
many they block. One line per dependency, sorted by impact, in the proposer and
tracker (log + issue). Replaces the per-group `blocked_summary`.
This commit is contained in:
Patrick Schratz 2026-07-16 21:22:39 +00:00
commit 1b57d45c80
No known key found for this signature in database
GPG key ID: 62050D5BC68AB6DC

View file

@ -127,13 +127,13 @@ if (length(retire) > 0L) {
# ---------------------------------------------------------------------------
# Blind spots: failures the classifier could not auto-propose.
# ---------------------------------------------------------------------------
blocked <- blocked_summary(report)
blocked <- blocked_by_dependency(report)
unmatched <- unclassified_summary(report)
cat("\nBlocked on a dependency (fix the dependency, not each dependent):\n")
if (length(blocked) > 0L) {
for (b in blocked) {
cat(sprintf(" %s: %d dependent(s) waiting\n", b$blocked_on, b$n_packages))
cat(sprintf(" %-20s %5d dependent(s)\n", b$dependency, b$n_packages))
}
} else {
cat(" (none)\n")
@ -207,8 +207,8 @@ if (do_issue) {
body_lines <- c(
body_lines,
sprintf(
"- **%s**: %d dependent(s) waiting (e.g. %s%s)",
b$blocked_on,
"- **%s**: %d dependent(s) (e.g. %s%s)",
b$dependency,
b$n_packages,
toString(b$packages),
if (isTRUE(b$packages_truncated)) ", ..." else ""