Player-facing patch notes from git history and changelogs. Translates developer language into player communication.
57
72%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.claude/skills/patch-notes/SKILL.md!bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation
Automation mode: Resolve modes.automation (project.local.yaml →
project.yaml → default collaborative). Every AskUserQuestion call and
every file write follows .claude/docs/automation-modes.md
(collaborative asks always · guided major-only · autonomous logs and proceeds;
automation_always_ask categories always prompt).
Confirm the history you are about to read belongs to THIS game. Run this before Phase 2 and stop if it fails.
git log --oneline -20. If it is empty or git is
unavailable, skip this check — there is nothing to classify, and Phase 2's
no-changelog-data branch is the right stop.Filter per commit; do not stop on a repo that merely contains maintenance work. Every project built on this framework accumulates commits touching hooks, CI and skills — the game repo is the framework repo. An earlier version of this check listed "subjects naming the framework, its skills, hooks, agents or test plan" as a hard STOP, which fires on virtually every real project and contradicted its own step 2 whenever a history was mostly the game's. The danger was never that such commits exist; it is that they get rendered as player-facing copy. Excluding them addresses that exactly, and a repo-level stop does not.
Corroborate before you proceed, cheaply: the Game commits should name systems
that appear in design/ and the code root (src/, Assets/ or Source/). If
they name a product those directories
never mention, that is the real wrong-history signal — stop.
If no commit in the range is this game's, say so and stop:
"The git history in this repo does not appear to belong to [game]: 0 of the [N] recent commits are Game commits. The recent commits describe [what they actually describe]. I cannot generate release notes from it — point me at the right history, or supply the change list directly."
Verdict: BLOCKED — stop here without generating notes.
Why this is a hard stop, not a warning. This exact failure is real, not hypothetical: a batch of framework-internal commits produced player-facing copy reading "Fixed an issue where progress from your last session could be lost on launch" — a session-hook timeout rendered as a gameplay fix for a game with no save system. It was fluent, plausible, and entirely false. A reader cannot tell the difference; only this check can.
version: the release version to generate notes for (e.g., 1.2.0)--style: output style — brief (bullet points), detailed (with context), full (with developer commentary). Default: detailed.If no version is provided, ask the user before proceeding.
production/releases/[version]/changelog.md if it existsdocs/CHANGELOG.md for the relevant version entrygit log between the previous release tag and current tag/HEAD as a fallbackproduction/sprints/ for contextdesign/balance/If no changelog data is available (neither production/releases/[version]/changelog.md
nor a docs/CHANGELOG.md entry for this version exists, and git log is empty or unavailable):
"No changelog data found for [version]. Run
/changelog [version]first to generate the internal changelog, then re-run/patch-notes [version]."
Verdict: BLOCKED — stop here without generating notes.
Tone guide detection — before drafting notes, check for writing style guidance:
.claude/docs/technical-preferences.md for any "tone", "voice", or "style"
fields or sections.docs/PATCH-NOTES-STYLE.md if it exists.design/community/tone-guide.md if it exists.Template detection — check whether a patch notes template exists:
docs/patch-notes-template.md and .claude/docs/templates/patch-notes-template.md.--style
was passed, that the template replaced it.Categorize all changes into player-facing categories:
Translate developer language to player language:
# Patch [Version] — [Title]
**New**
- [Feature 1]
- [Feature 2]
**Changes**
- [Balance/mechanic change with before → after values]
**Fixes**
- [Bug fix 1]
- [Bug fix 2]
**Known Issues**
- [Issue 1]# Patch [Version] — [Title]
*[Date]*
## Highlights
[1-2 sentence summary of the most exciting changes]
## New Content
### [Feature Name]
[2-3 sentences describing the feature and why players should be excited]
## Gameplay Changes
### Balance
| Change | Before | After | Reason |
| ---- | ---- | ---- | ---- |
| [Item/ability] | [old value] | [new value] | [brief rationale] |
### Mechanics
- **[Change]**: [explanation of what changed and why]
## Quality of Life
- [Improvement with context]
## Bug Fixes
### Combat
- Fixed [description of what players experienced]
### UI
- Fixed [description]
### Networking
- Fixed [description]
## Performance
- [Improvement players will notice]
## Known Issues
- [Issue and workaround if available]Includes everything from Detailed, plus:
## Developer Commentary
### [Topic]
> [Developer insight into a major change — why it was made, what was considered,
> what the team learned. Written in first-person team voice.]Check the generated notes for:
Present the completed patch notes to the user along with: a count of changes by category, and any internal changes that were excluded (for review).
Ask: "May I write these patch notes to docs/patch-notes/[version].md, and an
archive copy to production/releases/[version]/patch-notes.md?"
If yes, write both files, creating the directories if needed. If no, write nothing.
Verdict: COMPLETE — patch notes generated and saved. (If the write was declined: Verdict: COMPLETE — patch notes generated and shown, not saved.)
/release-checklist to verify all other release gates are met before publishing.b21fa0f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.