Skip to content

Commit e744e55

Browse files
hyperpolymathclaude
andcommitted
security(ci): neuter Inbox Steward auto-merge (owner directive: never auto-merge)
The Inbox Steward workflow auto-merged PRs with no human in the loop, in three ways that violate the standing 'never auto-merge security/dep PRs' rule: 1. a */15-minute schedule cron ran it unattended; 2. TRUSTED_AUTHORS='hyperpolymath|dependabot|renovate' let those authors' PRs squash-merge with ZERO approvals (so the owner's own PRs, and dependency PRs, auto-merged unreviewed); 3. the auto-merge job ran whenever candidates existed. Neutered surgically, monitoring/dispatch jobs preserved: - removed the */15 autonomous cron (no unattended runs); - removed the trusted-author approval-bypass (IS_TRUSTED=false -> a real approval is always required); - gated the auto-merge job behind a default-OFF opt-in (vars.INBOX_STEWARD_AUTOMERGE == 'true'); until set, it never merges. identify/validate/dispatch-to-hypatia/summary still run for MONITORING. Found by the fleet auto-merge audit (dev-notes/2026-06-16-fleet-auto-merge-audit.md), which also flags two other auto-merge paths (robot-repo-automaton GraphQL auto-merge; fleet-coordinator.sh:711) for a follow-up decision. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent ebdd7a2 commit e744e55

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

.github/workflows/inbox-steward.yml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ on:
4242
required: false
4343
default: 'false'
4444
type: boolean
45-
# Scheduled sweep
46-
schedule:
47-
# Every 15 minutes
48-
- cron: '*/15 * * * *'
45+
# NEUTERED 2026-06-16 (owner directive: never auto-merge security/dep PRs).
46+
# The */15 autonomous sweep cron was removed so this workflow no longer runs
47+
# unattended. It still runs on PR/review/check events and workflow_dispatch for
48+
# MONITORING; the auto-merge job itself is gated OFF by default (see below).
4949

5050
permissions:
5151
contents: write
@@ -219,10 +219,13 @@ jobs:
219219
"repos/${{ github.repository }}/pulls/$PR_NUM/reviews" \
220220
--jq '[.[] | select(.state == "APPROVED")] | length')
221221
222-
# Check 6: Author is trusted or has approval
222+
# Check 6: Approval is REQUIRED.
223223
AUTHOR=$(echo "$PR" | jq -r '.user.login')
224-
TRUSTED_AUTHORS="hyperpolymath|dependabot|renovate"
225-
IS_TRUSTED=$(echo "$AUTHOR" | grep -E "$TRUSTED_AUTHORS" && echo "true" || echo "false")
224+
# NEUTERED 2026-06-16 (owner directive: never auto-merge without human
225+
# review). The trusted-author approval-bypass (hyperpolymath|dependabot|
226+
# renovate merging with ZERO approvals) is removed: no author bypasses
227+
# the approval requirement.
228+
IS_TRUSTED="false"
226229
227230
# Validate
228231
ALL_CHECKS_PASSED="true"
@@ -280,7 +283,11 @@ jobs:
280283
runs-on: ubuntu-latest
281284
timeout-minutes: 10
282285
needs: validate-prs
283-
if: needs.validate-prs.outputs.auto_merge_candidates != '[]' && inputs.dry_run != 'true'
286+
# NEUTERED 2026-06-16 (owner directive: security/dep PRs are manual-review only).
287+
# Auto-merge is gated behind an explicit, default-OFF opt-in. Until the repo
288+
# variable INBOX_STEWARD_AUTOMERGE is set to 'true', this job NEVER runs and
289+
# nothing is auto-merged. Re-enable deliberately, and only with human-gated review.
290+
if: vars.INBOX_STEWARD_AUTOMERGE == 'true' && needs.validate-prs.outputs.auto_merge_candidates != '[]' && inputs.dry_run != 'true'
284291

285292
steps:
286293
- name: Checkout gitbot-fleet

0 commit comments

Comments
 (0)