Skip to content

pr-merge: hold a PR that could add or raise a charge for an owner decision #9221

Description

@kyle-sexton

Owner rule

Owner, 2026-10-22, relayed verbatim by the GitHub Security & Cost session:

anything that would increase cost or spending, or affect billing ... needs to be run through me ... Those are things that should stop and require me to approve and review if it hasn't already been part of the human in the loop (like actual decisions, like human-recorded decisions).

And on the shape: "Don't overcomplicate it. Don't overengineer it."

Problem

The unattended merge path (pr-merge and the local babysit lane, both scored by
plugins/source-control/skills/babysit-prs/scripts/babysit_risk.py) has no rule for changes that
can add or raise a charge. In this repository most such files sit on the HIGH path floor
(.github/**, docs/conventions/**), but the floor is a path rule switched by
merge.diff-check.high-path-floor, which is off by default in the pr-merge lane, and it has no
entry for IaC files (Pulumi, Terraform, Bicep) at all.

Rule to build

A pull request that could add or raise a charge does not merge unattended unless its body cites an
owner-recorded decision that covers it. Classes:

  • Pulumi or other IaC resources (SKU, tier, capacity, retention, quota live there)
  • runs-on labels that charge: larger runners (always billed) and macOS (billed on private repos)
  • new cron schedules on workflows
  • budgets and billing settings, new paid services, model or API spend config, as far as a
    deterministic check can see them

Suggested shape

  • A cost-review-required HIGH reason in the scorer, applied in both lanes whatever
    high-path-floor says. A PR that hits it waits for a human (the reasons comment, then
    needs-human after merge.risk-escalation-minutes).
  • The hold clears only when the PR body links an owner **Decision recorded.** comment on the PR's
    closing issue or the PR itself, using the same author and edit rule as
    .github/actions/select-trusted-text/select-trusted-text.mjs.

The S&C brief named a NEVER_FLOOR_EXEMPT constant in babysit_merge_policy.py. That constant
does not exist on main; the scorer's reason producers (_high_path_reasons, _score) are the
place to add this.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 22, 2026
  2. github-actions commented on Oct 22, 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.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 22, 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.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions