Skip to content

fix(pr-merge): take a cost decision's decided head from the review lane's check-run annotation, not a bot comment #9635

Open

Description

@kyle-sexton

Problem

The cost-decision readers take the decided head from the sha= in the newest unedited github-actions[bot] claude-lane-hold ... criteria=cost marker comment. That holds for the merge-side readers once #9569 merges, and for ci-workflows apply-review-hold/hold.cjs carryDecision. Any workflow running on GITHUB_TOKEN posts as github-actions[bot]. Someone with push access and the workflows permission could therefore run a workflow that posts a marker naming a commit they have not pushed yet, then push that commit, and the same-head shortcut would carry an earlier cost decision onto it with no compare.

This widens nothing today. The same permission can already edit .github/workflows/pr-require-checks.yml directly, and the lanes App has no workflows permission. It is hardening, so that the carry does not rest on a comment author login.

Fix

Take the decided head from the review lane's own check-run annotation, the one ci-status already vets against a head that does not change the lane workflows (pr-require-checks.yml, the review-lane notice loop, ~3755-3776), and stop reading a github-actions[bot] comment for it. Do it in all three merge-side readers (babysit_merge_policy.cost_decision, merge-holds.mjs costDecision, the ci-status lift) and in ci-workflows hold.cjs, so the readers stay in agreement.

Refs

Refs: #9436

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 24, 2026
  2. github-actions commented on Oct 24, 2026

    @github-actions
    Contributor

    Proposed work class: none

    Thanks for the report. Automated triage handed this issue to a maintainer.

    Unconfirmed model suggestion: work-class: structural
    Basis: automated intake triage; a maintainer confirms or changes it.

    Automated triage. A maintainer reviews it.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 24, 2026
  4. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.status: needs-decisionAwaiting a human or maintainer judgment call.

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions