You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(pr-merge): keep a cost hold when a newer lane run was deleted #10437
After #10357, a cost decision's decided head is taken from the review lane's cost notice on a lane run, not from comments. If a newer lane run (head Y) is deleted, the older run's notice (head X) becomes the newest lane run before the decision, so an older cost notice is promoted to the decided head. Neither check suggested on the review thread catches it: once Y's run is deleted, the runs listing's total_count already reflects the deletion, and X's run really is the newest lane run before the decision. The PR body states this residual ("Nothing detects run deletion. That needs actions: write."). Review thread: #10357 (comment)
Desired behavior
A cost hold detects that a lane run between the decided head and the current head is missing, using a signal that survives deletion (for example, the pull request's head history checked against the lane runs per head), and keeps the hold when a head in that history has no lane run.
Done when
The detector exists in .github/scripts/pr-merge/merge-holds.mjs, mirrored in babysit_merge_policy.py and the ci-status cost-hold step, with one shared rule.
A test deletes a newer lane run in the fixture and the cost hold stays.
A cost decision with no deleted run still clears as today.
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Knowable
Flags: none
Blocked by: none
Understood: after #10357, a cost decision's decided head comes from the newest lane run's cost notice. If a newer lane run is deleted, an older notice can be promoted to the decided head. You want the cost hold to compare the PR's head history against the lane runs per head, so it stays when a head has no lane run. The rule would be shared across merge-holds.mjs, babysit_merge_policy.py and the ci-status step, with tests for both the deleted-run and no-deletion cases. No duplicates found among the open issues.
The work-resolve-issue lane stopped partway through this issue and needs a person.
Why, in the run's own words:
The run stopped early (patch-protected-path): its change needs a path the issue lane may not push, which a person changes instead. In the run's words: patch-protected-path: .github/workflows/pr-require-checks.yml. The issue's first Done-when item requires the detector to be mirrored in the ci-status cost-hold step ('Clear a cost-only review hold the owner decided', id cost_hold). That step's carries() function, which derives the decided head, sits inline in .github/workflows/pr-require-checks.yml (around line 4049), so the lane cannot push that change. Also, the issue assumes #10357's design, which takes the decided head from the review lane's check-run notice. #10357 is still open (labeled do-not-merge and needs-human) and is not on this branch. Here the decided head still comes from the newest github-actions[bot] cost hold comment (merge-holds.mjs costMarker), and a deleted newer marker is already caught by deletedSince. A lane-run deletion detector has nothing to attach to until #10357 lands. This needs a person: land #10357 first, then run this issue from a context that may edit pr-require-checks.yml.
What the run says it did not do:
Detector in merge-holds.mjs, babysit_merge_policy.py and the ci-status cost-hold step: not started, because the cost-hold step is in protected .github/workflows/pr-require-checks.yml and the lane-run-notice base from #10357 is not merged
Tests (a deleted newer lane run keeps the hold; an undeleted decision still clears): not written, for the same reason
PR prep review, build/test and lint: skipped because the tree has no changes
Routed to a builder.#10357 merged at 2026-10-27T17:27Z, so the PR this issue was waiting on is no longer open. What still stops the issue lane is the protected path its first Done-when item needs: .github/workflows/pr-require-checks.yml (run 40460183934, patch-protected-path). The lanes App cannot push a workflow file, and none of the owner's reasons applies: the change tightens a cost hold, it does not loosen one.
Builder: Automation Lanes (workflow edits; merge-holds.mjs and the ci-status cost-hold step).
needs-human comes off and status: confirmed goes on; agent-ready stays off, so the issue lane does not pick it up again.
Activity
github-actions commentedon Oct 27, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Knowable
Flags: none
Blocked by: none
Understood: after #10357, a cost decision's decided head comes from the newest lane run's cost notice. If a newer lane run is deleted, an older notice can be promoted to the decided head. You want the cost hold to compare the PR's head history against the lane runs per head, so it stays when a head has no lane run. The rule would be shared across merge-holds.mjs, babysit_merge_policy.py and the ci-status step, with tests for both the deleted-run and no-deletion cases. No duplicates found among the open issues.
Automated triage, applied by the lanes App.
melodic-automation-lanes commentedon Oct 27, 2026
The work-resolve-issue lane stopped partway through this issue and needs a person.
Why, in the run's own words:
What the run says it did not do:
Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/40460183934
To retry, remove
needs-humanand addagent-readyagain.kyle-sexton commentedon Oct 27, 2026
Routed to a builder. #10357 merged at 2026-10-27T17:27Z, so the PR this issue was waiting on is no longer open. What still stops the issue lane is the protected path its first Done-when item needs:
.github/workflows/pr-require-checks.yml(run 40460183934,patch-protected-path). The lanes App cannot push a workflow file, and none of the owner's reasons applies: the change tightens a cost hold, it does not loosen one.merge-holds.mjsand the ci-status cost-hold step).needs-humancomes off andstatus: confirmedgoes on;agent-readystays off, so the issue lane does not pick it up again.