- Home
- Skills
- Code Quality & Review
- PR Description Writer — Summary, Changes + Test Plan
Works with the AI Agents you already use
PR Description Writer — Summary, Changes + Test Plan
Unlike free PR writers, every line traces to your diff: summary, why, what changed per file, confirmed vs suggested tests, risks (migrations, deps, secrets), 3 titles. No invented tickets.
$4
PR Description Writer — Summary, Changes + Test Plan
Example session with this skill installed
Draft the PR description for my branch fix-partition-usage -> main. Evidence below (git log --oneline main..HEAD, git diff --stat, git diff). Intent: hosts like [::1]:8080 broke because we split on ":".
7203fea Fix IPv6 server name parsing
de8429f Fix IPv6 session transactions
src/flask/app.py | 11 +++++++----
src/flask/testing.py | 2 +-
tests/test_basic.py | 1 +
tests/test_testing.py | 14 ++++++++++++++
4 files changed, 23 insertions(+), 5 deletions(-)
Tests I ran: pytest tests/test_testing.py::test_session_transaction_ipv6 tests/test_basic.py::test_run_from_config -> 9 passed on the branch; on main (514fc6b) the 2 new cases fail (2 failed, 7 passed).
[full diff pasted: app.py run() now parses SERVER_NAME with urlsplit(f"//{server_name}") instead of server_name.partition(":"); testing.py session_transaction() uses urlsplit(ctx.request.host_url).hostname or "localhost"; new test case ("[::1]:8080" -> "::1", 8080) in test_run_from_config; new test test_session_transaction_ipv6]
- Read your context and instructions
- Compiled the pr description writer
Pull request draft
Recommended title
Fix IPv6 host parsing in app.run() and test client session_transaction()
Summary
SERVER_NAME and request hosts were split on the first ":", so an IPv6 host such as [::1]:8080 was cut into the wrong host and port. Both places now parse the host with urllib.parse.urlsplit.
Why
"[::1]:8080".partition(":") returns host "[" and port ":1]:8080". With an IPv6 SERVER_NAME, app.run() picked the wrong host/port, and session_transaction() stored the session cookie for the wrong domain, so the next request did not see the session.
What changed
src/flask/app.py(run): host and port come fromurlsplit(f"//{server_name}"); port is used when it is notNone(so port 0 still works); thet.cast(str, host)in therun_simplecall is removed. (+7/-4)src/flask/testing.py(session_transaction): cookie domain isurlsplit(ctx.request.host_url).hostname or "localhost". (+1/-1)tests/test_basic.py: newtest_run_from_configcase[::1]:8080-> host::1, port 8080. (+1)tests/test_testing.py: newtest_session_transaction_ipv6with base_urlhttp://[::1]:8000/. (+14)
Test plan
- Confirmed:
pytest tests/test_testing.py::test_session_transaction_ipv6 tests/test_basic.py::test_run_from_config-> 9 passed with this change (merge commit 05e9c6b). - Confirmed: the same 2 new cases fail on main before this change (514fc6b: 2 failed, 7 passed).
- Suggested: run the full suite;
app.run()withSERVER_NAME="localhost:0"and"localhost"(no port) should behave as before.
Risks / rollout
- Low. Behaviour changes only where the old split was wrong (hosts with extra colons). A SERVER_NAME with a non-numeric port now raises in
urlsplit(...).portinstead of inint(sn_port); same failure, different message. - No migrations, no new dependencies, no config changes. No secrets in the diff.
Issue / ticket refs
- None given. Not adding one.
Title alternatives
- Parse IPv6 hosts with urlsplit instead of partition(":")
- Fix SERVER_NAME and session cookie domain for IPv6 hosts
- Handle [::1]:port in app.run() and session_transaction()
Red flags / ask author
- Is a CHANGES.rst entry expected for this fix? None is in the diff.
Evidence used: 2 commits, 4 files, 23+/5- (diff stat + full diff). Nothing inferred beyond the diff.
Connects securely to your tools. The creator never sees your data.
About this skill
Commit → PR description → Review
Unlike free PR description writers, every line here traces back to your diff: tests are marked Confirmed (you ran them) or Suggested, risks are flagged from the code (migrations, new dependencies, config, secrets), and no ticket number or result is ever invented.
Sample output: real run on a merged public PR (pallets/flask #6096, 2 commits, 4 files, +23/-5), 20 Oct 2026
| Section | What the skill wrote (unedited excerpt) |
|---|---|
| Title | Fix IPv6 host parsing in app.run() and test client session_transaction() |
| Why | "[::1]:8080".partition(":") returns host "[", so app.run() and the session cookie used the wrong host |
| What changed | app.py run: host/port via urlsplit(f"//{server_name}"), port 0 still works (+7/-4); testing.py: cookie domain from urlsplit(host_url).hostname (+1/-1) |
| Test plan | Confirmed: 9 passed with the change; the 2 new cases fail on main (2 failed, 7 passed). Suggested: full suite + SERVER_NAME without a port |
| Risks | Low; no migrations, no new dependencies, no secrets. Non-numeric port now fails in urlsplit instead of int() |
| Ticket refs | "None given. Not adding one." |
| Ask author | Is a CHANGES.rst entry expected? None is in the diff |
Tested on a real public PR · works in Claude Code, Cursor and Codex · v1.0 updated Oct 2026 · questions answered within 24h
Writing PR descriptions is a chore that leads to lazy summaries like "misc fixes" or "update files," which slows down reviews and hides risks. This skill turns raw git evidence into a description a busy reviewer can act on, and every claim is grounded in the diff.
What it does
- Evidence-based drafting: turns commit logs, diff hunks or a file list into a structured PR description (summary, why, what changed per file).
- Risk flags: migrations, schema changes, new dependencies, config changes and secrets found in the diff go in a Risks section.
- Test plan you can trust: steps you ran are marked Confirmed; everything else is marked Suggested.
- Better titles: a recommended title plus 3 specific alternatives to replace vague branch names.
- Integrity checks: no invented ticket numbers, CI results or numbers; missing facts become "ask author" questions.
How it works
- Paste
git log --oneline main..HEAD,git diff --statand the diff (or the key hunks), plus one line of intent and any test output. - The agent groups the changes by file and area and checks for risk patterns.
- You get the PR draft: title, summary, why, what changed, test plan, risks, ticket refs, title alternatives and questions for the author.
- Pick a title, confirm the suggested tests, paste it into GitHub, GitLab or Bitbucket.
Who it's for
Developers and leads who want reviewable PRs without writing them from scratch, and teams that want one consistent PR format.
Pairs well with
- Write Commits Reviewers Approve (Conventional + Why): https://www.agensi.io/skills/write-commits-reviewers-approve-conventional-why
- Code Reviewer: Severity-Rated PR Review + Fix Plan: https://www.agensi.io/skills/code-reviewer-severity-rated-pr-review-fix-plan
- Find the Commit That Broke Your Code: https://www.agensi.io/skills/find-the-commit-that-broke-your-code-from-git-history
- README Generator (from your real project files): https://www.agensi.io/skills/readme-generator-readme-md-from-your-real-project-files
Known limitations
Needs the diff or commit log pasted in (no direct access to private repositories). It does not open, push or merge PRs.
How to use
- 1
Connect your agent to the Agensi MCP
Copy the prompt and paste it into Claude, ChatGPT, Cursor or any agent that supports MCP. It sets up the connection for you. Manual setup
- 2
Sign in to Agensi
Your agent shows a sign-in link. Sign in and click Allow.
- 3
Ask for what you need
Your agent loads this skill and uses it on your task. It always asks before any payment.
Reviews
No reviews yet
Be one of the first to try it. Every listed skill goes through the trust checks below.
Security scanned
Checked by our 8-point scan before listing
Fresh listing
Recently published to Agensi
Money-back guarantee
Doesn't do what its page promises? You get your money back.
Trust & safety
Security scan
Security scan passed 1 month ago
Requires