write-release-notes — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited write-release-notes (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill when you need to turn internal sprint or release output into clear, customer-facing communication. It adds the most value when:
The skill accepts several input forms. The richer the input, the better the filtering and rewriting.
Sprint review output from `sprint-review`:
Path: ./sprint-review-2026-05-05.mdPasted ticket list (with or without descriptions):
- PROJ-1042: Refactor auth middleware to use JWT
- PROJ-1043: Add bulk CSV export to reporting page
- PROJ-1044: Fix crash on mobile when attachment > 5MB
- PROJ-1045: Upgrade React to 18.3
- PROJ-1046: Users can now set a custom notification schedulePR list from a release branch:
PR #312: feat: add CSV export to reports
PR #314: fix: mobile crash on large attachment upload
PR #315: chore: upgrade React 18.3
PR #316: refactor: auth middleware JWT migrationOptionally, channel context to set the tone:
Channel: in-app tooltip / email announcement / public changelog / marketing landing pageIf no channel is specified, the skill defaults to public changelog tone and notes the assumption.
The first and most important step is filtering. Only customer-visible work belongs in release notes. Everything else is noise that dilutes the signal and wastes readers' attention.
The filter test: "Would a customer notice if this item was not shipped?" If the answer is no, it is excluded.
Examples that pass:
Examples that are filtered out:
If the filtered list is empty (e.g. a purely technical sprint), the skill outputs a note: "This sprint contained no customer-visible changes. Consider skipping the external changelog for this release, or bundling with the next sprint."
The skill follows four steps to produce release notes that are clear, accurate, and appropriately toned.
Before filtering tickets, check whether git history can provide the source data:
# Find last release tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null)
echo "Last release: $LAST_TAG"
# Merged PRs since last tag
[ -n "$LAST_TAG" ] && git log --merges --oneline ${LAST_TAG}..HEAD 2>/dev/null | head -40
# Fallback: last 4 weeks if no tags
[ -z "$LAST_TAG" ] && git log --merges --oneline --since="4 weeks ago" 2>/dev/null | head -40If the user hasn't provided a ticket list, use merge commit messages as the raw input and proceed to Step 1. If git history is empty or inaccessible, ask the user to paste the ticket list. Do not mention the scan.
The skill applies the filter rules above to every item in the input. Filtered-out items are listed in a separate section of the working output so the PM can review and override if needed. The final release notes document contains only items that passed the filter.
If an item is ambiguous (e.g. "Improved API response handling" — is this a performance fix users notice or an internal refactor?), the skill flags it and asks: "Does this change affect what users see or experience, or is it an internal improvement? If users will notice faster or more reliable API responses, I'll include it."
Raw ticket titles describe what was built. Release notes should describe what the user gains. The skill rewrites every passing item from the developer's frame of reference into the user's.
The rewrite follows a simple rule: lead with what the user can now do, or what problem is now gone.
Examples of bad titles rewritten as user benefits:
| Original ticket title | Release notes copy |
|---|---|
| "Refactor auth middleware" | (filtered out — no user-visible change) |
| "Add bulk CSV export to reporting page" | "Export your full report as a CSV with one click" |
| "Fix crash on mobile when attachment > 5MB" | "Fixed: app no longer crashes when uploading large attachments on mobile" |
| "Improve search index performance" | "Search results now load up to 4x faster" |
| "Add custom notification schedule settings" | "Set your own notification schedule — choose exactly when and how often you're notified" |
If a quantified improvement is available (e.g. from a PR description or sprint data), the skill includes the number. If not, it uses relative language ("faster", "more reliable") without inventing specific figures.
Every rewritten item is placed into one of three groups:
If an item could fit in multiple groups, the skill uses the primary user impact: a performance fix that also adds a new setting is Improved (the setting is secondary). A new feature that also fixes a bug is New.
The skill identifies the 2–3 most impactful items from the filtered, rewritten list and writes a 2–3 sentence Highlights paragraph. This is the opening section of the release notes — the part a time-pressed reader sees first.
Highlights criteria: customer impact (how many users affected, how significantly?), business alignment (does this close deals, reduce churn, improve activation?), and visibility (flagship features stakeholders have been waiting for).
The highlights paragraph is written in the channel tone (see Tone Guidance below).
The skill saves the release notes as release-notes-[version-or-date].md in the current project directory. The version or date is derived from the input (sprint end date, version tag, or today's date if neither is available).
# Release Notes — [Version or Date]
**Released:** [date]
**Prepared by:** [PM name if provided]
---
## Highlights
[2–3 sentence narrative of the most impactful items this release. Written in the target channel tone. Leads with customer benefit, not feature names.]
---
## New
- **[Feature name]:** [User benefit description.]
- **[Feature name]:** [User benefit description.]
## Improved
- **[Area]:** [What changed and how the user experiences it differently.]
- **[Area]:** [What changed.]
## Fixed
- **[What was broken]:** [What the user experienced before and what is now resolved.]
- **[What was broken]:** [Fix description.]
---
*[Optional: link to full changelog or support documentation]*If a section has no items (e.g. no bugs were fixed this sprint), that section is omitted from the output.
The same facts can be written in very different voices depending on the channel. The skill adapts to the specified channel.
In-app (tooltip, what's new modal): Concise, present tense, action-oriented. The user is in the product and wants to know what changed quickly.
Email announcement: Slightly warmer, benefit-first, a sentence or two per item. The user is in their inbox and needs a reason to care.
Public changelog (website or GitHub): Neutral, factual, developer-friendly. No marketing language. Specific where possible.
Marketing / landing page: Lead with customer impact. Use the strongest version of the benefit. Appropriate for a launch post or feature spotlight.
Ask your assistant to write release notes by saying things like:
This skill will automatically, run the four-step process, and save the result as release-notes-[version-or-date].md in your project directory.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.