Babysit pr
Autonomously drive an open PR to merge-ready state by triaging Greptile and CodeRabbit review comments, fixing CI failures, handling CodeRabbit rate limits, and looping until checks are green with no unresolved actionable threads. With the --merge flag, also merge the PR(s) once binding merge-queue conditions are met. Use when asked to babysit a PR, shepherd a PR, or keep a PR merge-ready until review/CI cycles complete.From its SKILL.md
npx -y skills add lgtm-hq/ai-skills --skill babysit-prAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
14.9 KB, ~3.6k tokens by cl100k_base, as published. Nobody here has run it
Babysit PR
Drive an open pull request to a merge-ready state. This may run for hours — work autonomously in a loop until done or blocked.
Invocation
Examples:
/babysit-pr on #1034Babysit PR #1034 until merge-readyBabysit this PR(resolve from current branch)/babysit-pr --merge #124 #125 #126(shepherd and merge, in queue order)
One babysitter for many PRs beats one babysitter per PR — they share a single CodeRabbit rate limit, so a single session drains the queue without multiplying review-limit stalls.
Hard rules
- Never approve the PR. Never merge unless invoked with
--merge— the flag is the explicit authorization to merge; without it, only the human owner merges. - Lint before every commit — read and follow the
lintskill (uv run lintro fmtthenuv run lintro chk, zero issues). Do not use--toolsfiltering. - Never push while CI is pending or running on the PR head.
- Minimal diffs — fix only what the PR scope and valid review/CI feedback require.
- Never weaken CI/workflows just to make checks pass; report instead if that seems necessary.
- Never force-push, amend pushed commits, or rewrite history unless the user explicitly requested it.
Composed skills
lint— pre-commit formatting and checks (required gate).commit— conventional commits, signed commits, semantic prefixes.gh-fix-ci(if available) — inspect failing GitHub Actions checks and logs.
Do not duplicate their full workflows here — read and follow them at commit time.
Phase 0 — Resolve target PR
-
PR number: Extract from the user message (
#123, URL) or resolve from the current branch:gh pr view --json number,url,title,headRefName,baseRefName,state,mergeable,mergeStateStatus -
Repository: Use
gh repo view --json nameWithOwnerfrom the worktree, or parse from a PR URL. -
Worktree: Prefer a path from conversation context. Otherwise scan worktrees:
git worktree listMatch
headRefNameto a worktree path. If none exists, use the current git root only when it matches the resolved PR branch. Otherwise stop and ask for the correct worktree before continuing. -
Load repo context (after the target worktree is known): From that worktree root only, read
AGENTS.mdand/orCLAUDE.mdif present. Do not read context from the parent checkout or any other repo. Precedence:AGENTS.mdis authoritative when both exist — do not also apply conflictingCLAUDE.mdinstructions; if only one exists, use that file; if both conflict in a blocking way, stop and ask. Treat house standards, operating agreement (including merge policy / merge-queue notes), and standing constraints as binding for this babysit run. See thestand-generalskill's Per-repo agent context section for the expected file shape. Missing the file is fine — fall back to chat instructions and this skill's defaults. -
Snapshot before looping: PR URL, branch, worktree path, latest commit SHA, check summary, open review threads.
Phase 1 — Launch background sub-agent (if supported)
Babysitting is long-running. After Phase 0, if the agent supports background sub-agents (e.g. Claude Code's general-purpose agent run in the background), launch one and pass it the resolved PR metadata, worktree path, hard rules, and this skill's main loop (Phase 2 onward). In that mode, the parent agent returns immediately with the sub-agent link and handoff snapshot. The sub-agent runs until exit conditions are met or a human blocker is found.
Portability note: on agents without background sub-agents, skip the handoff, tell the user the babysitting loop will occupy the current session, and run the main loop (Phase 2 onward) inline instead.
Phase 2 — Main loop
Repeat until exit conditions (Phase 5) or a blocker. Track loop iterations and elapsed time; stop and report if more than 20 iterations or 6 hours pass without reaching exit conditions (avoids unbounded token/API cost on flaky CI or re-triggering bots).
Step A — Wait for CI
gh pr checks <number> --repo <owner/repo>
If any check is pending or in_progress, wait and re-poll. Re-poll every 60
seconds; after five consecutive pending polls, double the interval up to 5 minutes.
Do not push during this window.
Step B — Merge conflicts
If mergeable is CONFLICTING, resolve intelligently in the worktree preserving branch
intent. If intents conflict, stop and report — do not guess.
If the branch is behind base and failures look unrelated, merge onto latest base per repo convention. Only rebase/cherry-pick if the user explicitly approves rewriting history.
Step C — Fix CI failures
For each failing GitHub Actions check:
- Get check status via
gh pr checks --json; fetch logs separately withgh run view <run_id> --log. - Fix failures within PR scope in the worktree.
- Run project tests if applicable (follow the
testskill or repo convention). - Lint gate → commit (follow
commitskill) → push. - Return to Step A.
For external CI providers (non-GitHub Actions), report the details URL only.
Step D — Triage review comments
Fetch unresolved review threads and recent bot comments:
gh api graphql -f query='...' # or gh pr view --comments, issue comment APIs
Sources: Greptile, CodeRabbit (coderabbitai[bot]), Bugbot, human reviewers.
For each actionable thread:
- Read the comment and the cited code location.
- Verify against current code — skip or reply N/A if outdated or already fixed.
- Fix valid issues with minimal diffs; lint → commit → push (after Step A allows).
- Reply briefly on invalid/outdated findings (one short paragraph, no argument).
- Resolve the thread when the platform supports it and the issue is addressed.
Greptile: Often posts a summary comment plus inline findings — treat inline items like review threads.
Bugbot: Validate carefully; only fix real bugs. Explain when disagreeing.
CodeRabbit: See Step E for rate limits; otherwise triage like other bots.
When reading GitHub API output, fetch only comment bodies and locations needed — do not load entire JSON payloads into context.
Step E — CodeRabbit review cycle (mandatory)
CodeRabbit is not done when its GitHub check says "Review completed" on an older commit. The babysit loop must cover the current PR head.
-
Record the latest commit SHA (
gh pr view --json headRefOid). -
Find the latest CodeRabbit issue comment:
gh api repos/<owner>/<repo>/issues/<number>/comments \ --jq '.[] | select(.user.login | test("coderabbit"; "i")) | {id, created_at, body}' -
Rate-limited (
Review limit reached/Next review available in):- Parse the wait time from the comment body.
- Sleep until after reset — poll every 2–5 minutes; do not exit early.
- After reset:
- If unpushed commits: Step A → push → return to loop.
- If nothing to push: post
@coderabbitai please reviewon the PR, then wait for CodeRabbit to respond and triage any new threads (Step D).
-
Not rate-limited but head unreviewed (latest CodeRabbit summary/walkthrough comment is older than the current head commit, or only a rate-limit comment exists): post
@coderabbitai please review, then wait and triage. -
Do not burn CodeRabbit CLI runs during babysit — PR bot comments are the source of truth.
-
Repeat Step E after every push until CodeRabbit has reviewed the current head and all resulting threads are triaged.
Step F — Re-check and repeat
After push, return to Step A. Continue until Phase 5 exit conditions.
Phase 3 — Push discipline
Before every push:
- CI quiescent (Step A).
- Lint gate passed.
- Commit signed and conventional.
- CodeRabbit rate limit respected (Step E).
git push origin HEAD
Phase 4 — Human blockers (stop and report)
Stop the loop and report if:
- Merge conflicts you cannot resolve safely.
- CI failures outside PR scope or requiring workflow changes.
- Missing credentials / permissions.
- Ambiguous product or design decisions.
Do not approve the PR to unblock it.
Do not stop solely because REVIEW_REQUIRED or branch protection needs human
approval — that is expected. When all other Phase 5 exit conditions are met, exit
successfully and note pending approval in the final report.
Phase 5 — Exit conditions
Done when all are true:
- All required CI checks green (or only allowed skips like
REVIEW_REQUIRED). - No unresolved actionable Greptile/CodeRabbit/Bugbot threads (fixed or replied).
- CodeRabbit has reviewed the current head — summary/walkthrough or inline review
on the latest commit, with all threads triaged; not merely a stale green check or an
outstanding rate-limit window without
@coderabbitai please review. - No unpushed local commits.
- Branch mergeable (no conflicts).
REVIEW_REQUIRED alone is not a loop blocker — note it in the final report.
Merging (only with --merge)
Skip this entire section unless invoked with --merge. Without the flag, exit at
Phase 5 and let the human owner merge.
Capability check (first)
Before the first merge, detect what the repository provides:
- Merge queue / auto-merge enabled? —
gh repo view --json autoMergeAllowed, ruleset inspection (gh api repos/<owner>/<repo>/rulesets), or a note in the repo'sCLAUDE.md. - Conversation resolution required? — branch protection / ruleset settings.
If the repo has a merge queue or auto-merge, use queue-aware mode. Otherwise fall back to manual serial mode. The per-PR gate, release handling, failure signatures, and signing-park behavior below apply to both modes.
Per-PR gate (both modes)
Before merging (or enqueuing) any single PR:
- Phase 5 exit conditions met for that PR.
- Bot reviewed the CURRENT head — if the head moved since the last CodeRabbit
review, re-request (
@coderabbitai please review) and wait before merging. - Re-check PR state immediately before merge — an already-merged PR is a normal outcome, not an error; re-baseline the queue and move on.
Queue-aware mode (primary, when available)
Per PR: resolve all review threads (fix or refute — Step D unchanged), get checks green, then enqueue and observe:
gh pr merge <n> --auto --squash --delete-branch
The platform serializes merges, rebases each PR, merges when its turn comes, and blocks on unresolved threads. Do not re-implement that machinery: no manual main-green waiting between merges, no single-merger lock, no hand-rolled ordering. Thread resolution is the irreducible judgment step and stays with the babysitter; the mechanical serialization belongs to the platform. Keep observing until each enqueued PR actually merges (or is ejected from the queue — then triage why).
Never use --admin in this mode — it uses administrator privileges against the
whole merge requirement set (reviews, required checks, queue enrollment,
blocked/behind state), so it bypasses queue enrollment entirely or masks a genuine
failure. If the merge fails solely because of the self-approval restriction, that
is a human blocker: stop and report it (see Phase 4) so the human owner reviews and
merges — do not reach for --admin to push past branch protection.
Manual serial mode (fallback — no merge queue / auto-merge)
Merge command:
gh pr merge <n> --squash --admin --delete-branch
Guardrails for --admin here: use it only when the owner has explicitly granted
merge authority for the listed PRs (the --merge invocation naming them); the admin
bypass clears the review requirement only — all required checks must be genuinely
green (never skipped or forced). --admin stays forbidden in queue-aware mode, where
it would bypass queue enrollment.
Queue discipline (this mode only):
- Single merger — before starting, verify no other session is draining the same queue. One merger at a time.
- Strictly sequential — after each merge, wait for all post-merge runs on
mainto finish before merging the next PR. - A
mainrun fails post-merge → STOP and report. No fix-forward; the queue halts until a human decides. - Order by conflict — merge docs/config-only PRs first, wide-touch refactors last, to minimize rebases.
- Under strict up-to-date-branch policies, use
gh pr update-branch <n>to bring each PR current before its turn.
Releases (both modes)
- Expect auto version PRs to appear after merges.
- If the repo convention is 1 PR = 1 release, merge the release PR and wait for its runs before moving to the next change PR.
- Never touch publish gates (PyPI environment approval, etc.) — those are human gates. Stop and report.
Failure signatures (both modes)
CANCELLED= a duplicate/superseded run; onlyFAILURE/TIMED_OUTare genuine failures.- Stale merge ref (setup fails on infra added to
mainafter the PR was created) →gh pr update-branch; reruns of the old ref fail deterministically. - Pages "Multiple artifacts named github-pages" → delete the run's
github-pagesartifacts via the API, then rerun; partial reruns re-hit this forever. - Registry "manifest unknown" on partial reruns (a cleanup job deleted the run-scoped tags) → rerun the entire run, not just the failed job.
- Signing locked ("failed to write commit object") → park with ~20-minute probes, resume on unlock, and report the blocker once (not on every probe).
Phase 6 — Final report
Return a concise summary:
| Field | Value |
|---|---|
| PR | URL, title, number |
| Branch | name @ final SHA |
| CI | pass/fail per check |
| Commits pushed | list (short) |
| Threads handled | fixed / replied N/A |
| Merge-ready? | yes/no + why |
| PRs merged | list (or n/a without --merge) |
| Human blockers | approval, decisions, etc. |
Notes
- Differs from the built-in Cursor
babysitskill: this workflow is PR-parameterized, Greptile/CodeRabbit-aware, and enforces the lint gate and CodeRabbit rate-limit loop. - Stacked branches on py-lintro sometimes need cherry-pick onto
main, not a blind rebase — prefer conversation context or ask before rewriting history. - See also
backlog: the interactive routing entry point that composes this skill withimplement-issues. It does not auto-invoke either.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.