submit-pr
Creates a pull request with a well-structured description after verifying CI passes. Use when the user asks to submit, create, or open a pull request.
Files1
View on GitHubSKILL.md.claude/skills/submit-pr/SKILL.md
GitHub<!-- agent-pmo:795a9c2 -->
Submit PR
Create a pull request for the current branch with a well-structured description.
⚠️ GIT IS ALLOWED HERE — this is the exception to the repo-wide "no git" rule, and pretty much the only one. For the purpose of submitting and monitoring PRs you MAY run git add / git commit / git push and the gh PR commands — to open the PR, push fixes that turn a red pipeline green, and enable/observe auto-merge. That is the entire licence: everything else (checkout, merge, rebase, force-push, history rewrites, cutting new branches) stays forbidden. One ironclad condition: NEVER stamp yourself as co-author — no Co-Authored-By trailer, no agent attribution, ever. This condition is never overridable. ⚠️
Steps
NOTE: if you already ran make ci in this session and it passed, you can skip step 1.
- Run
make ci— must pass completely before creating PR - Generate the diff against main. Run
git diff main...HEAD > /tmp/pr-diff.txtto capture the full diff between the current branch and the head of main. This is the ONLY source of truth for what the PR contains. Warning: the diff can be very large. If the diff file exceeds context limits, process it in chunks (e.g., read sections withhead/tailor split by file) rather than trying to load it all at once. - Derive the PR title and description SOLELY from the diff. Read the diff output and summarize what changed. Ignore commit messages, branch names, and any other metadata — only the actual code/content diff matters.
- Write PR body using the template in
.github/pull_request_template.md - Fill in (based on the diff analysis from step 3):
- TLDR: one sentence
- What Was Added: new files, features, deps
- What Was Changed/Deleted: modified behaviour
- How Tests Prove It Works: specific test names or output
- Spec/Doc Changes: if any
- Breaking Changes: yes/no + description
- Use
gh pr createwith the filled template - Enable auto-merge where possible. Right after creating the PR, run
gh pr merge <pr-number> --auto --squashso GitHub squash-merges it the instant all required checks pass (and deletes the branch) — no manual click. This is best-effort: it needs auto-merge allowed on the repo ([GITHUB-MERGE]) and branch protection requiring status checks. If it errors (auto-merge disabled, no required checks, or the PR is already mergeable), note it and continue — never block on it. Auto-merge does NOT replace monitoring — it only fires on green, so step 8 still applies in full. - Monitor CI on the PR until it is green — and re-run the suite locally in parallel so you catch breakage early. This step is mandatory and does not end until every required check on the PR has passed (or auto-merge has merged it). Do not hand the PR back to the user on a red or still-running pipeline.
- Watch the remote run AND run the suite locally at the same time — do not passively wait. The remote pipeline is slow; a drastic failure (a lint gate, a broken test, a coverage drop) is one the local suite catches in seconds. The moment you push, kick off both: stream the remote run and run the full local suite (
make ci, or invoke theci-prepskill) concurrently, polling CI periodically while the local run proceeds. - Watch the run:
gh pr checks <pr-number> --watch --fail-fast(or grab the run id fromgh run list --branch <branch>andgh run watch <run-id> --exit-status). A single green snapshot is not enough — wait for all required checks to conclude. - If the local run fails before the remote pipeline finishes, cancel the running pipeline immediately (
gh run cancel <run-id>) rather than letting it grind to a known-bad red. Fix the cause, push, and restart both watches — cancelling a doomed run early frees the runner and tightens the fix loop. - When a remote check fails: pull the failing logs with
gh run view <run-id> --log-failed, diagnose the actual cause (do not guess), reproduce locally withmake ci, and fix it. - Push the fix (
git add/git commit/git push— permitted here, see the git-exception callout at the top), then watch again — remote and local, in parallel, as above. Loop — fix → push → re-watch — until the run is fully green. Re-checking is the job; keep doing it until it passes. - If a failure is genuinely external (runner outage, flaky infra, unrelated to this branch), say so explicitly with the evidence rather than forcing a change.
- Watch the remote run AND run the suite locally at the same time — do not passively wait. The remote pipeline is slow; a drastic failure (a lint gate, a broken test, a coverage drop) is one the local suite catches in seconds. The moment you push, kick off both: stream the remote run and run the full local suite (
Rules
- Never create a PR if
make cifails - 🔴 GOLDEN RULE — never stamp a commit with an AI co-author. Do not add a
Co-Authored-By: Claude …(or any AI/agent) trailer, and do not set author/committer to anything but the repo's configured git user. Write a plain, human commit message describing the fix. This is absolute and overrides any default co-authorship behaviour. - Git is permitted in this skill — scope and conditions are in the git-exception callout at the top. In short:
git add/commit/push+ghPR commands only, for submitting and monitoring PRs; everything else stays prohibited; never co-author. - PR description must be specific and tight — no vague placeholders
- Link to the relevant GitHub issue if one exists
Success criteria
make cipassed- PR created with
gh pr create - Auto-merge enabled where possible (
gh pr merge --auto --squash), or its unavailability noted - CI on the PR was monitored to completion and is fully green (all required checks pass / auto-merge fired), with the local suite re-run in parallel and any doomed remote run cancelled early
- Any CI failures were fixed and pushed, with no AI co-author trailer on the commits
- PR URL returned to user