Repository navigation
Dependabot: auto-merge green pip updates through their own GitHub App, after a cooldown #740
Description
What
Auto-merge Dependabot's pip PRs once they are green, as marola-merge-bot, from one scheduled workflow in this repo. Decided with the maintainer (2026-10-10), identity per MIP-0086 (#787, task 13):
- pip only; GitHub Actions bumps stay manual (
just deps-merge, as today). Today that is marola-ml alone; marola and marola-app have onlygithub-actions, and site, corpus, oods and the devkit have no Dependabot config. - The token has no Workflows permission. marola-merge-bot holds Workflows write for the devkit bumps, so this job mints its token without
permission-workflows: GitHub then refuses to merge a PR that touches.github/workflows/through it (MIP-0086 §5.5).deps-merge --unattendedrefuses such a PR first anyway. - A cooldown first. A hijacked PyPI release (
ultralytics, December 2024) would otherwise land onmainthe day it is published. marola-ml's Dependabot waits 7 days (Dependabot waits 7 days before it proposes an update (cooldown) marola-ml#80, merged).
Done so far: the cooldown (marola-dev/marola-ml#80) and deps-merge --repo OWNER/REPO --unattended (marola-dev/marola-devkit#150, released in devkit v0.18.0). That mode merges a PR only when Dependabot authored it and every commit, it has no hold label, it changes only Python manifests, every version moves by a patch or minor (read from the diff; a 0.x minor counts as major), and every check is green; the merge is pinned to the checked head commit.
Built in this repo (#878):
.github/workflows/deps-merge.yml: on a schedule (daily, off:00) andworkflow_dispatch. One job: exits early onvars.AUTO_MERGE == 'false'; mints a marola-merge-bot token withmarola-dev/marola-devkit/.github/actions/bot-token@v0.18.0(MERGE_BOT_APP_ID/MERGE_BOT_KEY),repositories: marola-ml, Contents and Pull requests write, Checks and Commit statuses read, no Workflows; clones marola-devkit atv0.18.0(git clone -b, a pinbump-consumersmoves) and runsscripts/deps-merge.sh --repo marola-dev/<repo> --unattendedfor each repo in a list in the file (marola-ml today).- The file is added to
.github/merge-key-allowlistand passesmerge-key-check: no nix, installs,curlor third-party actions in the job holding the key.ghandjqcome with the runner. - The bypass comes from the devkit's
@consumersextra (MIP-0086 task 3: ruleset-sync's @consumers extra gives marola-merge-bot its bypass marola-devkit#100), so there is no per-repo bypass entry.
The first scheduled runs refused marola-dev/marola-ml#90 (pip only, every version a minor, its newest checks green) for two faults in deps-merge --unattended (devkit v0.20.2):
- Old cancelled checks count. The
PRworkflow started 3 times when Dependabot opened Bump docker/setup-buildx-action from 3 to 4 #90; concurrency cancelled 2 and the third passed.statusCheckRolluplists all 3, so the 2026-10-19 run said#90 refused: checks not green (CANCELLED)(https://github.com/marola-dev/marola/actions/runs/39271329592). marola-ml#78 hit the same in deps-merge gains an unattended mode for Dependabot pip PRs marola-devkit#176's dry run. mergeableisUNKNOWNon the first read. GitHub computes it only when asked, so the 2026-10-20 run said#90 refused: not mergeable (UNKNOWN)(https://github.com/marola-dev/marola/actions/runs/39424647913). A read a few seconds later saysMERGEABLE.
Left, in marola-devkit (scripts/deps-merge.sh, both modes):
- Judge a PR by the newest run of each check only: per workflow and check name, the entry with the highest job id in its
detailsUrl(a re-run gets a new job id too). A status context keeps its neweststartedAt. - On
UNKNOWN, readmergeableagain (a few tries, a few seconds apart) before it refuses. - Self-test cases for both: Bump docker/setup-buildx-action from 3 to 4 #90's real rollup, and an
UNKNOWNthat becomesMERGEABLE(a stubghon PATH). - Then a devkit release;
bump-consumersmovesdeps-merge.yml's pin, and a dispatch or the next daily run merges Bump docker/setup-buildx-action from 3 to 4 #90.
Acceptance criteria
-
cooldownset in everydependabot.ymlwith apipecosystem (Dependabot waits 7 days before it proposes an update (cooldown) marola-ml#80) -
deps-merge --unattendedmerges a green patch/minor pip PR and refuses a major, a non-Dependabot author, a file outside the manifests, a red or pending check and aholdlabel (deps-merge gains an unattended mode: Dependabot author, Python manifests only, patch or minor, green, no hold marola-devkit#150) -
deps-merge.ymlexists, is in.github/merge-key-allowlist, mints without Workflows permission, and exits early onAUTO_MERGE == 'false' -
just qualitygreen, includingactionlintandmerge-key-check - a
workflow_dispatchrun onmainlists marola-ml's open Dependabot PRs and merges or refuses each with its reason (https://github.com/marola-dev/marola/actions/runs/39066498995) -
deps-mergejudges a PR by the newest run of each check and reads anUNKNOWNmergeableagain before it refuses (fix(deps-merge): ignore superseded cancelled checks marola-devkit#198, v0.20.3; the unattended merge also passes--admin, fix(deps-merge): the unattended merge passes --admin marola-devkit#200, v0.20.4);deps-merge.ymlpins v0.20.4 (chore: marola-devkit v0.20.4 #909) - one live auto-merge of a marola-ml Dependabot PR: Bump the "marola-ml-deps" group with 2 updates across multiple ecosystems marola-ml#90, merged by marola-merge-bot at 2026-10-20 21:26Z (https://github.com/marola-dev/marola/actions/runs/39500348051); marola-ml
mainCI green on e63f0ad
Named test
merge-key-check and actionlint on .github/workflows/deps-merge.yml (in just quality); deps-merge.sh --self-test in marola-devkit v0.18.0 and in the release with the fix; the dispatch run's link and the live merge's link.
Docs, AGENTS.md's pointer and NEW-REPO's day-one setup: #741.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
brunogbv commentedon Oct 10, 2026
Identity decided by MIP-0086 (#787, task 13): deps-merge mints as
marola-merge-bot, not a dedicatedmarola-deps-mergeApp, from the umbrella's key (MERGE_BOT_APP_ID/MERGE_BOT_KEY). That App holds Workflows write for the devkit bumps, so #740's guarantee moves into the token: mint withoutpermission-workflows, and GitHub still refuses to merge a PR that touches.github/workflows/(MIP-0086 §5.5). Its workflow goes in.github/merge-key-allowlistand must passmerge-key-check(no nix, installs or third-party actions in the job holding the key); it exits early onvars.AUTO_MERGE == 'false'and skips a PR labelledhold(§5.8). The bypass comes from the devkit's@consumersextra (marola-dev/marola-devkit#100), so no per-repo extras entry. Superseded in the body above: the "Its own App" bullet, the App bullet under Design, and the second acceptance criterion. Blocked by marola-dev/marola-devkit#100 and #766.docs(mip-0086): GitHub Apps for automation, marola-pr-bot opens and m…
MIP-0086: docs(mip-0086): GitHub Apps for automation (#773)
2 remaining items
deps-merge gains an unattended mode for Dependabot pip PRs (#176)
release: v0.18.0 (#177)
deps-merge.yml: merge Dependabot's green pip PRs as marola-merge-bot (#…
brunogbv commentedon Oct 17, 2026
#878 merged (47304c4; CI 8 success, 6 skipped). The first
workflow_dispatchrun passed: https://github.com/marola-dev/marola/actions/runs/39066498995. It minted the marola-merge-bot token for marola-ml only,gh auth statusworked with that installation token, anddeps-mergerefused marola-dev/marola-ml#78 (checks not green (CANCELLED)) and merged nothing. The last open criterion is one live auto-merge, after the 7-day cooldown.Implemented: every task row is done (#880)
fix(deps-merge): ignore superseded cancelled checks, read an UNKNOWN …
fix(deps-merge): the unattended merge passes --admin, as bump-merge d…