Skip to content

feat: fall back to older cooled-down release instead of skipping update - #47730

Merged
pelikhan merged 13 commits into
mainfrom
copilot/update-cooldown-logic
Jul 25, 2026
Merged

feat: fall back to older cooled-down release instead of skipping update#47730
pelikhan merged 13 commits into
mainfrom
copilot/update-cooldown-logic

Conversation

Copilot AI commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

When the newest available release is still within the cooldown window, gh aw update was silently skipping the action/workflow entirely. It should instead walk older candidates (newer than current) until it finds one that has cooled down.

Cooldown fallback logic

  • resolveLatestReleaseWithDeps — sorts compatible upgrade candidates newest-first, iterates checking cooldown, returns first cooled-down version; falls back to currentRef if all are still hot
  • updateActions / updateActionRefsInContentWithDeps — same fallback via new findCooledDownActionVersion helper, which fetches the full release list and walks it when the primary check triggers cooldown
  • checkCoolDown is now injectable on both actionUpdateDeps and workflowUpdateDeps for deterministic testing

Empty-SHA guard

ActionCache.Set now rejects entries with sha == "" (logs and returns early). findCooledDownActionVersion also validates SHA before returning a candidate, preventing a cooldown failure from silently writing an unresolvable pin to actions-lock.json.


Run: https://github.com/github/gh-aw/actions/runs/30074181699

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 10.1 AIC · ⌖ 7.6 AIC · ⊞ 7K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 22 AIC · ⌖ 9.21 AIC · ⊞ 7K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 11.4 AIC · ⌖ 7.3 AIC · ⊞ 7K ·
Comment /souschef to run again


Run: https://github.com/github/gh-aw/actions/runs/30087480557

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 19.1 AIC · ⌖ 8.14 AIC · ⊞ 7K ·
Comment /souschef to run again


Run: https://github.com/github/gh-aw/actions/runs/30091871574

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 16 AIC · ⌖ 5.98 AIC · ⊞ 7K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 19.3 AIC · ⌖ 10 AIC · ⊞ 7K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 15.5 AIC · ⌖ 7.01 AIC · ⊞ 7K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 10.5 AIC · ⌖ 9.46 AIC · ⊞ 7K ·
Comment /souschef to run again

…Cache.Set

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title feat: cooldown fallback to older releases + empty-SHA guard feat: fall back to older cooled-down release instead of skipping update Jul 24, 2026
Copilot AI requested a review from pelikhan July 24, 2026 06:18
@pelikhan
pelikhan marked this pull request as ready for review July 24, 2026 06:18
Copilot AI review requested due to automatic review settings July 24, 2026 06:18
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds cooldown fallback so updates select the newest cooled-down release instead of skipping entirely.

Changes:

  • Adds cooldown-aware fallback for actions and workflows.
  • Injects cooldown checks for testing.
  • Rejects empty-SHA action cache entries and adds tests.
Show a summary per file
File Description
pkg/workflow/action_cache.go Rejects empty SHA entries.
pkg/workflow/action_cache_test.go Tests empty-SHA rejection.
pkg/cli/update_workflows.go Adds workflow release fallback.
pkg/cli/update_workflows_test.go Tests workflow cooldown behavior.
pkg/cli/update_actions.go Adds action release fallback.
pkg/cli/update_actions_test.go Tests action fallback paths.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (2)

pkg/cli/update_actions.go:1006

  • The primary cooldown lookup on line 996 still bypasses deps.checkCoolDown, so this fallback is only reached according to a live GitHub API result rather than the injected result used by the new test. Route that lookup through the dependency to make the behavior deterministic and honor the new injection point.
				olderVersion, olderSHA, findErr := findCooledDownActionVersion(ctx, deps, repo, currentVersion, effectiveAllowMajor, verbose, coolDown)

pkg/cli/update_actions.go:1006

  • This message claims the whole workflow-file update is skipped, but the newly added fallback may immediately update it to an older release. Change the message to say that only latestVersion is being skipped so successful runs do not emit contradictory status.
				// Try to find an older release that has passed the cooldown period.
				olderVersion, olderSHA, findErr := findCooledDownActionVersion(ctx, deps, repo, currentVersion, effectiveAllowMajor, verbose, coolDown)
  • Files reviewed: 6/6 changed files
  • Comments generated: 8
  • Review effort level: Medium

Comment thread pkg/workflow/action_cache.go Outdated
Comment on lines +433 to +435
if sha == "" {
actionCacheLog.Printf("refusing to store action pin entry with empty SHA for %s@%s; entry skipped", repo, version)
return
Comment thread pkg/cli/update_actions.go Outdated
continue

// Try to find an older release that has passed the cooldown period.
olderVersion, olderSHA, findErr := findCooledDownActionVersion(ctx, deps, entry.Repo, entry.Version, effectiveAllowMajor, verbose, coolDown)
Comment thread pkg/cli/update_actions.go
) (string, string, error) {
baseRepo := gitutil.ExtractBaseRepo(repo)

output, err := deps.runGHReleasesAPI(ctx, baseRepo)
// Iterate from newest to oldest upgrade candidate, stopping at the first release
// that has passed the cooldown period. This lets users receive the latest cooled
// release rather than being blocked on a single too-recent version.
for _, c := range upgradeCandidates {
Comment thread pkg/cli/update_actions.go Outdated
@@ -198,8 +200,16 @@ func updateActions(ctx context.Context, deps actionUpdateDeps, allowMajor, verbo
if coolDownResult.InCoolDown {
cooldownLog.Printf("Action %s: %s", entry.Repo, coolDownResult.Message)
fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", entry.Repo, coolDownResult.Message)))
Comment thread pkg/cli/update_actions.go Outdated
if result.InCoolDown {
cooldownLog.Printf("Action fallback %s@%s: %s", repo, c.tag, result.Message)
if verbose {
fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", repo, result.Message)))
Comment thread pkg/cli/update_workflows.go Outdated
return c.tag, nil
}
cooldownLog.Printf("Workflow source %s: %s", repo, result.Message)
fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", repo, result.Message)))
Comment thread pkg/cli/update_actions.go
Comment on lines +608 to +609
for _, c := range candidates {
result := deps.checkCoolDown(ctx, repo, c.tag, coolDown)
@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100 — Excellent

Analyzed 8 test(s): 8 design, 0 implementation, 0 violation(s).

📊 Metrics (8 tests)
Metric Value
Analyzed 8 (Go: 8, JS: 0)
✅ Design 8 (100%)
⚠️ Implementation 0 (0%)
Edge/error coverage 8 (100%)
Duplicate clusters 0
Inflation YES (action_cache_test.go: 28 lines vs 4 prod lines)
Violations 0
Test File Classification Issues
TestFindCooledDownActionVersion_SelectsOlderCooledRelease update_actions_test.go design_test none
TestFindCooledDownActionVersion_AllInCooldownReturnsEmpty update_actions_test.go design_test none
TestFindCooledDownActionVersion_EmptySHASkipped update_actions_test.go design_test none
TestUpdateActions_CooldownFallbackToOlderRelease update_actions_test.go design_test none
TestUpdateActionRefsInContent_CooldownFallback update_actions_test.go design_test none
TestResolveLatestRelease_CooldownFallback update_workflows_test.go design_test none
TestResolveLatestRelease_CooldownAllInWindow update_workflows_test.go design_test none
TestActionCache_Set_EmptySHARejected action_cache_test.go design_test minor inflation
Flagged Tests (1)

TestActionCache_Set_EmptySHARejected (action_cache_test.go) — design_test, high_value. Adds 28 lines for 4 production lines (7:1 ratio). Not a quality concern: covers both negative (empty SHA rejected) and positive (valid SHA accepted) paths in one test, which is good practice for this guard condition.

Verdict

Passed. 0% implementation tests (threshold: 30%). All 8 tests verify behavioral contracts of the cooldown-fallback feature and empty-SHA guard. Build tags present, no mock library violations. Minor test inflation on action_cache_test.go is justified by thorough positive/negative coverage.

🧪 Test quality analysis by Test Quality Sentinel · sonnet46 · 37.4 AIC · ⌖ 10.6 AIC · ⊞ 7K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Quality Sentinel: 90/100. 0% implementation tests (threshold: 30%). All 8 tests are behavioral design tests covering cooldown-fallback and empty-SHA guard invariants. Build tags present, no mock library violations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (446 new lines in pkg/) but does not have a linked Architecture Decision Record (ADR).

Draft ADR committed: docs/adr/47730-cooldown-fallback-to-older-release.md — review and complete it before merging.

This PR cannot merge until an ADR is linked in the PR body.

What to do next
  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete the missing sections — add context the AI could not infer, refine the decision rationale, and list real alternatives you considered
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-47730: Cooldown Fallback to Older Release

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Why ADRs Matter

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.

Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 47730-cooldown-fallback-to-older-release.md for PR #47730).

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · sonnet46 · 60.2 AIC · ⌖ 11.9 AIC · ⊞ 8.5K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: Cooldown fallback logic

The implementation is clean and well-structured. The core logic correctly walks candidates newest-first, stopping at the first release that has passed the cooldown window. The empty-SHA guard in ActionCache.Set is a good defensive addition. Test coverage is thorough across unit and integration scenarios.

Non-blocking observation: In updateActionRefsInContentWithDeps, when a repo's primary candidate is in cooldown, findCooledDownActionVersion makes an additional runGHReleasesAPI call. However, the fallback result is correctly written back to the per-invocation cache[cacheKey] map, so subsequent occurrences of the same repo+currentVersion pair in the same file are served from cache — no correctness issue and the extra API call is bounded to one per unique repo+version.

Overall the change achieves its goal safely. ✅

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 32.8 AIC · ⌖ 4.52 AIC · ⊞ 5K

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review 🧠

Applied /diagnosing-bugs, /tdd, and /codebase-design — requesting changes on two correctness issues and one design concern.

📋 Key Themes & Highlights

Issues Found

  1. Misleading "Skipping update" message (update_actions.go lines ~203 and ~1001): The stderr skip message fires unconditionally before the fallback attempt, so users see "Skipping update for ruby/setup-ruby" even when the action is actually updated to a fallback version. Same pattern in both updateActions and updateActionRefsInContentWithDeps. See inline comments.

  2. Missing test: SHA error falls to next candidate (findCooledDownActionVersion): The code correctly continues when getActionSHAForTag returns an error, but no test covers the case where the first candidate fails SHA resolution and the second succeeds. See inline comment on line 575.

  3. Duplicated filter/sort logic (findCooledDownActionVersion): The release-filtering, parsing, and descending-sort pattern is now in at least three places. Worth extracting as a shared helper to prevent drift.

Positive Highlights

  • checkCoolDown is now injectable on both deps structs — excellent for deterministic testing
  • ActionCache.Set empty-SHA guard is a clean, defensive fix
  • ✅ Good test coverage overall: 5 new integration-level tests covering the key fallback paths
  • resolveLatestReleaseWithDeps refactor is clean and easy to follow

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 44.1 AIC · ⌖ 5.13 AIC · ⊞ 6.7K
Comment /matt to run again

Comment thread pkg/cli/update_actions.go
fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", entry.Repo, coolDownResult.Message)))
skippedActions = append(skippedActions, entry.Repo)
continue

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/diagnosing-bugs] The "Skipping update for %s" message is printed to stderr unconditionally before attempting the fallback — so users see "Skipping update for ruby/setup-ruby" in the output even when the update actually proceeds to an older fallback version.

💡 Suggested fix

Move the stderr user-facing message inside the if findErr != nil || olderVersion == "" ... branch, and add an informational message on the fallback path:

if findErr != nil || olderVersion == "" || olderSHA == "" {
    fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", entry.Repo, coolDownResult.Message)))
    skippedActions = append(skippedActions, entry.Repo)
    continue
}
fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Falling back to %s for %s (latest release still in cooldown)", olderVersion, entry.Repo)))

@copilot please address this.

Comment thread pkg/cli/update_actions.go Outdated
@@ -907,7 +1001,17 @@ func updateActionRefsInContentWithDeps(ctx context.Context, deps actionUpdateDep
if verbose {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/diagnosing-bugs] Same misleading stderr message issue exists in updateActionRefsInContentWithDeps: the "Skipping update for %s" message is emitted before calling findCooledDownActionVersion, so the user sees a skip message even when the fallback succeeds.

💡 Suggested fix

Restructure to only show the skip message when no fallback is found, matching the same fix as the updateActions path for consistent UX:

// Only log skip when fallback also fails
olderVersion, olderSHA, findErr := findCooledDownActionVersion(...)
if findErr != nil || olderVersion == "" || olderSHA == "" {
    cooldownLog.Printf(...)
    fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Skipping update for %s: %s", repo, coolDownResult.Message)))
    continue
}

@copilot please address this.

Comment thread pkg/cli/update_actions.go
releases := strings.Split(strings.TrimSpace(string(output)), "\n")

currentVer := parseVersion(currentVersion)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] findCooledDownActionVersion makes two network calls per fallback candidate (cooldown check + SHA fetch), but there is no test covering the case where getActionSHAForTag fails for one candidate and succeeds for the next — i.e., SHA fetch failure should silently continue to the next candidate.

💡 Suggested test
func TestFindCooledDownActionVersion_SHAErrorFallsToNext(t *testing.T) {
    deps := newTestActionUpdateDeps()
    deps.runGHReleasesAPI = func(_ context.Context, _ string) ([]byte, error) {
        return []byte("v1.322.0
v1.321.0
v1.320.0"), nil
    }
    deps.checkCoolDown = func(_ context.Context, _, tag string, cd time.Duration) coolDownCheckResult {
        return coolDownCheckResult{} // all cooled down
    }
    deps.getActionSHAForTag = func(_ context.Context, _, tag string) (string, error) {
        if tag == "v1.322.0" {
            return "", errors.New("not found")
        }
        if tag == "v1.321.0" {
            return "sha321...", nil
        }
        return "", errors.New("unexpected")
    }

    version, _, err := findCooledDownActionVersion(context.Background(), deps, "repo/action", "v1.320.0", true, false, 7*24*time.Hour)
    require.NoError(t, err)
    assert.Equal(t, "v1.321.0", version)
}

@copilot please address this.

Comment thread pkg/cli/update_actions.go
// findCooledDownActionVersion searches for the newest release that is strictly
// newer than currentVersion but has passed the cooldown period. It is used as
// a fallback when the highest candidate is still in cooldown: rather than
// skipping the update entirely, we walk down the release list toward older

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/codebase-design] findCooledDownActionVersion duplicates the release-list fetch, version parsing, filtering, and sorting logic already in resolveLatestReleaseWithDeps (in update_workflows.go) and the inner loop in getLatestActionReleaseViaGit. This is the third place this pattern appears, which will make future changes (e.g. adding pre-release opt-in) require triple updates.

Consider extracting a shared filteredUpgradeCandidates(releases []string, currentVer, allowMajor) helper that both the workflow and action paths can call, leaving the cooldown iteration to the call sites. This keeps the sorting/filtering logic as a single deep module.

@copilot please address this.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_CHANGES — one confirmed correctness bug in the test suite; two medium UX/observability regressions.

Findings summary

High — test correctness

  • TestFindCooledDownActionVersion_EmptySHASkipped: the currentVersion (v4.4.0) is already newer than all mocked releases, so the function returns before reaching getActionSHAForTag. The guard it claims to test is never exercised. Fix the currentVersion to something like v1.0.0.

Medium — UX regressions

  • resolveLatestReleaseWithDeps (workflows): the new fallback loop emits a "Skipping update" stderr line for every in-cooldown candidate, not just the first. Repos with many recent releases will spam the terminal.
  • isExemptFromCoolDown early-return: the --verbose "Found newer release" message is lost for exempt repos — regression from the old code path.

Low — design concern (non-blocking)

  • findCooledDownActionVersion (actions): a getActionSHAForTag error silently advances to the next-oldest release instead of aborting. The implicit retry-on-error is surprising and undocumented.

🔎 Code quality review by PR Code Quality Reviewer · sonnet46 · 62.5 AIC · ⌖ 5.1 AIC · ⊞ 5.7K
Comment /review to run again

Comments that could not be inline-anchored

pkg/cli/update_actions_test.go:245

False-positive test — the empty-SHA guard is never exercised: currentVersion is &quot;v4.4.0&quot; but the mocked release list only contains v1.321.0 and v1.320.0. Neither is newer than v4.4.0, so candidates is empty and the function returns (&quot;&quot;, &quot;&quot;, nil) before ever calling getActionSHAForTag. The test passes for the wrong reason.

<details>
<summary>💡 Fix</summary>

Use a currentVersion that is older than the mocked releases so the candidates list is non-empty, e.g.:

version</details>

<details><summary>pkg/cli/update_workflows.go:488</summary>

**Cooldown log spam for every skipped candidate**: the loop prints a cooldown message (`fmt.Fprintln(os.Stderr, ...)`) for every in-cooldown candidate, not just the first. For a repo with 10 recent releases all in cooldown, users will see 10 &quot;Skipping update&quot; lines for a single actionnoisy and confusing.

&lt;details&gt;
&lt;summary&gt;💡 Fix&lt;/summary&gt;

Log once (at entry to the loop or only for the first skipped candidate), then continue silently:

```go
firstSkip := true
for _, c := range upgradeCandi…

</details>

<details><summary>pkg/cli/update_workflows.go:473</summary>

**`verbose` log silently dropped for cooldown-exempt repos**: when `isExemptFromCoolDown(repo)` is true the function returns the best candidate immediately, but never emits the `&quot;Found newer release&quot;` log that the old code did (and that the in-loop path still does). Users running with `--verbose` will see no output for exempt repos even when they are being updated.

&lt;details&gt;
&lt;summary&gt;💡 Fix&lt;/summary&gt;

```go
if isExemptFromCoolDown(repo) {
    if verbose {
        fmt.Fprintln(os.Stderr, consol…

</details>

<details><summary>pkg/cli/update_actions.go:113</summary>

**`findCooledDownActionVersion` makes a SHA call even when it will be discarded on cooldown error**: the function calls `deps.getActionSHAForTag` after confirming a candidate is not in cooldown — this is correct — but if `getActionSHAForTag` fails it logs and continues trying the _next_ candidate. That means a transient SHA resolution failure silently falls through to an older release rather than bubbling the error. Callers will get a quietly downgraded version with no warning to the user.

&lt;de…

</details>

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Triage

Field Value
Category feature
Risk 🟡 Medium
Score 52 / 100
Action 🔄 needs_revision (fast_track when resolved)

Score breakdown: Impact 28 · Urgency 16 · Quality 8

Summary: Adds cooldown-fallback logic to gh aw update so it walks older releases when the newest is still in cooldown window. Two CHANGES_REQUESTED reviews citing test correctness bugs and UX regressions.

Reviews: 2× CHANGES_REQUESTED (github-actions[bot]) · 1× APPROVED
Next action: Address AI review findings, then fast-track human review.

Generated by 🔧 PR Triage Agent · sonnet46 · 49.5 AIC · ⌖ 5.34 AIC · ⊞ 5.7K ·

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please run the pr-finisher skill, address unresolved review comments, and rerun checks once the branch is up to date.

Unresolved review feedback:...

Addressed in eac8516, 6d06210, and ee0097f.

I refactored release-candidate filtering/sorting into shared helpers and reused them in both action/workflow cooldown fallback paths, then ran local validation (make fmt, make lint, make test-unit, make test) plus parallel_validation (Code Review clean; CodeQL scan produced no alerts). CI on this new HEAD is still stale until a maintainer re-triggers workflows.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, confirm the remaining unresolved review items are fully addressed on the current head, and rerun checks once the branch is up to date.

Unresolved review feedback:

Generated by 👨🍳 PR Sous Chef

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 16 AIC · ⌖ 5.98 AIC · ⊞ 7K ·
Comment /souschef to run again

Copilot AI commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please run the pr-finisher skill, confirm the remaining unresolved review items are fully addressed on the current head, and rerun checks once the branch is up to date.

Unresolved review f...

Confirmed on current HEAD (ee0097f) that the remaining unresolved review items are already addressed in code (pagination in action/workflow release fetch, skip-tag handling for cooldown fallback, candidate-specific messaging, shared candidate helpers, and SHA-fallback test coverage). I reran local checks: make fmt, make lint, make test-unit, make test, plus targeted go test ./pkg/cli for the cooldown fallback cases. The only failures are pre-existing in pkg/workflow (TestGetLatestActionPinByRepo, TestWarnIfOutdatedActionVersion, TestLookupEmbeddedActionPin) and unrelated wasm golden tests. I also checked workflow logs for referenced runs and found no failed jobs there. CI for this PR head is still pending/stale and must be re-triggered by a maintainer to refresh required checks.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Triage

Field Value
Category feature
Risk medium
Priority Score 60/100
Score Breakdown Impact: 30 · Urgency: 15 · Quality: 15
Recommended Action fast_track
CI ✅ passing

Rationale: Core update logic change — walks back through release candidates when newest is in cooldown. Good description, CI green, 8 files +683/-57. Needs human review of release-selection logic.

Generated by 🔧 PR Triage Agent · sonnet46 · 32.4 AIC · ⌖ 5.13 AIC · ⊞ 5.7K ·

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, confirm all unresolved review feedback is fully addressed on the current head, and rerun checks once the branch is up to date.

Unresolved review feedback:

Run: https://github.com/github/gh-aw/actions/runs/30102818328

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 19.3 AIC · ⌖ 10 AIC · ⊞ 7K ·
Comment /souschef to run again

Copilot AI commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please run the pr-finisher skill, confirm all unresolved review feedback is fully addressed on the current head, and rerun checks once the branch is up to date.

Unresolved review feedback:...

Confirmed on current HEAD (ee0097f) that all listed unresolved review items are already addressed in code (ActionCache.Set write-status handling + safe delete order, injected cooldown checks, paginated release fetch, candidate-specific cooldown messaging, skip-tag handling in fallback search, shared release-candidate helpers, and SHA-error fallback test coverage). I reran local checks (make fmt, make lint, make test-unit, make test, make recompile) and reran targeted cooldown tests in pkg/cli.

Current failures remain in pkg/workflow and match the existing CI pattern: TestGetLatestActionPinByRepo, TestWarnIfOutdatedActionVersion, TestLookupEmbeddedActionPin, and wasm goldens (TestWasmGolden_AllEngines / TestWasmGolden_CompileFixtures). I also checked workflow logs for the latest PR branch runs; failed jobs (test, build-wasm in run 30089548696) show the same wasm-golden workflow test failures. No new code changes were made in this pass.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, confirm the remaining unresolved review feedback is fully addressed on the current head, and rerun or retrigger checks as needed once the branch is up to date.

Unresolved review feedback with follow-up replies already present:

Failed checks on the latest head:

Run: https://github.com/github/gh-aw/actions/runs/30112737562

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 7.13 AIC · ⌖ 8.41 AIC · ⊞ 7K ·
Comment /souschef to run again

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Triage

Field Value
Category feature
Risk 🟡 Medium
Score 52/100
Score breakdown impact=28, urgency=12, quality=12
Recommended action defer

Rationale: Adds cooldown fallback logic so gh aw update walks older releases instead of silently skipping. Useful feature with good description, but CI has failing checks (test, impacted-go-tests, build-wasm) and a prior CHANGES_REQUESTED review (since dismissed). Needs CI fixes before review.

Blockers: 3 CI failures — test, impacted-go-tests, build-wasm.

Generated by 🔧 PR Triage Agent · sonnet46 · 39.2 AIC · ⌖ 4.9 AIC · ⊞ 5.7K ·

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, confirm the branch is up to date, address any still-unresolved review feedback, and rerun or retrigger checks as needed.

Failed checks on the latest head:

Run: https://github.com/github/gh-aw/actions/runs/30120416243

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 15.5 AIC · ⌖ 7.01 AIC · ⊞ 7K ·
Comment /souschef to run again

@github-actions

Copy link
Copy Markdown
Contributor

Triage | Category: feature | Risk: medium | Score: 55/100 (impact:28, urgency:15, quality:12)

Recommended action: defer — Fallback to cooled-down release on update; CI has 3 failures (blocking). Needs CI fix before advancing.

Score breakdown: impact=28 (UX improvement), urgency=15 (open 19+ hrs), quality=12 (CI 3 failures, has ADR+tests)

Generated by 🔧 PR Triage Agent · sonnet46 · 31.3 AIC · ⌖ 5.51 AIC · ⊞ 5.7K ·

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, confirm the branch is up to date, address the unresolved review feedback below, and fix or retrigger the failed checks on the latest HEAD.

Unresolved review feedback:

Failed checks on the latest head:

Run: https://github.com/github/gh-aw/actions/runs/30139125642

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 10.5 AIC · ⌖ 9.46 AIC · ⊞ 7K ·
Comment /souschef to run again

@pelikhan
pelikhan merged commit 4874225 into main Jul 25, 2026
24 checks passed
@pelikhan
pelikhan deleted the copilot/update-cooldown-logic branch July 25, 2026 02:45
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This pull request is included in a new release.

Release: v0.83.3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants