dot_agents/skills/creating-azure-devops-pull-requests/SKILL.md
Create Azure DevOps Pull Requests with consistent, high-quality titles and descriptions. Use when opening a PR in Azure DevOps - covers JIRA-based title formatting, summary, decision log, and before/after comparison.
npx skillsauth add MrPointer/dotfiles creating-azure-devops-pull-requestsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create Pull Requests in Azure DevOps with a consistent structure that is easy to review and understand.
Before writing anything, collect the raw material:
ABC-42 from feature/ABC-42-local-accounts).git log <base>..HEAD --oneline to understand the full scope.git diff <base>...HEAD (or --stat first for an overview). Read enough of the diff to understand what changed and why.Do not rely solely on commit messages. Read the actual changes.
All PR content must describe the net change from the base branch to HEAD. Do not describe intermediate implementation steps, temporary refactors made during the session, or changes elsewhere in the worktree that are not part of the branch diff.
Format: <JIRA-ticket>: <short description>
ABC-42.[NO-TICKET]. This should be rare.Examples:
ABC-42: add support for local user accountsPLAT-118: prevent duplicate webhook deliveries on retry[NO-TICKET]: extract payment validation into dedicated serviceThe PR description has three sections, plus an optional closing line at the very end. All sections use plain, direct language with no filler.
Azure DevOps PR descriptions are limited to 4000 characters total. Keep the generated body concise enough to stay under that limit.
In the generated PR description, prefix each section heading with a matching emoji: 📝 Summary, 🔑 Key Decisions, 🔄 Before & After.
3-5 lines maximum. Answer: what changed and why does it matter?
Write for a reviewer who has not seen the ticket. State the problem or goal, then the approach taken. Do not list files or repeat commit messages.
Describe only the final reviewer-visible outcome relative to the base branch.
Each significant component or area that was added, changed, or removed gets its own ### sub-heading under this section. A short paragraph describes what changed and, when the rationale is not obvious from the ticket alone, why.
If a change is not worth more than a single bullet point, it is not worth calling out here. The diff speaks for itself.
Do not explain the order you made changes during the session unless that order is visible in the final branch state and matters to the reviewer.
Include rationale when:
## 🔑 Key Decisions
### Validation Service
Added `validation.Service` to encapsulate all input validation rules, replacing the inline checks that lived in HTTP handlers. The inline approach had zero test coverage, so extracting it makes the rules unit-testable without HTTP scaffolding.
### Webhook Idempotency
Introduced an idempotency key on webhook delivery to prevent duplicates on retry. Chose optimistic locking over pessimistic locking because contention is rare and the retry cost is low.
A table comparing the previous state to the new state. This helps reviewers understand the net effect without reading every line of the diff.
Each row covers one meaningful area of change. Keep cells concise - short phrases, not sentences.
Every row must compare the base branch state to the final branch state. Never use intermediate states from the implementation process as the Before or After values.
## 🔄 Before & After
| Area | Before | After |
|------|--------|-------|
| User creation | Only OAuth providers supported | Local username/password accounts available |
| Validation | Inline in HTTP handler | Extracted to `validation.Service` |
| Retry behavior | Webhooks re-sent on any failure | Idempotency key prevents duplicate delivery |
If the branch name contains a JIRA ticket key, add a closing line as the last line of the PR body using a markdown link to the ticket.
Always use Closes: Closes [ABC-42](https://solaredge-prod.atlassian.net/browse/ABC-42)
Omit this line entirely if there is no associated ticket.
Use the Azure DevOps CLI:
BODY="$(cat <<'EOF'
## 📝 Summary
<summary>
## 🔑 Key Decisions
### <area>
<details>
## 🔄 Before & After
| Area | Before | After |
|------|--------|-------|
Closes [ABC-42](https://solaredge-prod.atlassian.net/browse/ABC-42)
EOF
)"
az repos pr create \
--detect true \
--title "<title>" \
--description "$BODY"
--detect true is not enough in the current repo, pass --org, --project, and --repository explicitly.git push -u origin HEAD.base...HEAD, not the sequence of edits made while implementing the change.testing
Create implementation plans from a reviewed RFC. Uses the RFC as the approved design baseline, decomposes it into executable sub-plans, and runs RFC-specific plan review.
tools
Create implementation plans directly from user requirements when no reviewed RFC is available or the user explicitly declines RFC-first planning. Decomposes work into self-contained sub-plans with full iterative multi-agent plan review.
content-media
Decompose a reviewed RFC into sequenced features for a single project. Uses the RFC as the approved design baseline and produces a persistent epic plan reviewed for RFC fidelity and feature decomposition.
tools
Decompose large efforts directly from user requirements when no reviewed RFC is available or the user explicitly declines RFC-first epic planning. Produces a persistent epic plan with rich feature descriptions that feed into planning-project-features separately.