| name | work-pr |
| description | Open and drive a single-issue PR to merge-ready in django-oauth-toolkit. Use when implementing a bug/feature that ships as its own PR, or when babysitting an open PR through CI and Copilot review. |
Work a PR
One issue → one branch → one PR. Drive to green CI with no open review threads.
Open
- Branch off
master: claude/fix-<issue>-<slug>.
- Implement the smallest correct change. Add a regression test that fails before, passes after.
- Add a
## [unreleased] entry in CHANGELOG.md referencing #<issue> (skip for changes that aren't user-relevant, e.g. tooling).
- Lint and run related tests locally:
ruff check + ruff format --check, and DJANGO_SETTINGS_MODULE=tests.settings python -m pytest <paths>.
- Commit, push
-u. Open the PR filling .github/pull_request_template.md; Fixes #<issue>.
- Request a Copilot review. Subscribe to PR activity. Arm a ~1h fallback check-in.
On each CI / review event
- Fix if confident and small; rebut if the suggestion is wrong; skip duplicates/no-ops.
- Push the fix (prefer a follow-up commit; only force-push when you intentionally rebased, and always use
--force-with-lease).
- Reply on each review thread, then resolve it — not a PR-level comment.
- Re-request Copilot review. Repeat until CI green and Copilot has no comments.
When master advances
When the branch falls behind master while the PR is open — it shows merge conflicts against the base, or CI ran against a now-stale base — rebase onto the latest master and force-push with lease:
git fetch upstream
git rebase --autostash upstream/master
# resolve conflicts, re-run the affected tests
git push --force-with-lease
Rules
- Reply on threads only; no PR-level status comments.
- Never
git add -A — stage explicit paths, so stray untracked files (local venvs, build output, editor scratch) are never committed.
- Don't poll with sleep; events + the fallback check-in wake you. Re-arm it silently if nothing changed.
- Don't self-merge. A subscription ends only when the PR is merged/closed.