Skip to content
cccskills
FreePublished on GitHub

release-notes

Write a short release note people finish reading. Picks the few changes a user will notice from the pull requests since the last release, names each by what the reader can now do, keeps to a length budget, writes every language from the intent instead of translating, and traces every line to a PR. Use when cutting a release, or filling a GitHub Release body, a store "what's new", a package changelog or an in-app what's new screen. Triggers - "write the release notes", "release notes for 0.4.0", "what's new", "changelog for this release", "notes de version".

The English summary is being prepared. Showing the original description.

Works withGitHub
See how to install

Files included (1)

  • SKILL.md7.2 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Release notes

A release note is read once, in a few seconds, by someone who did not ask for it. Almost all of the work is deciding what to leave out. What is left says, in the reader's words, what they can now do.

Read the project's rules first

Where the note goes, its shape, its languages and its length budget belong to the project, and they outrank this skill:

git ls-files --cached --others --exclude-standard | grep -iE 'release[-_]?notes|changelog|releasing'

Read that doc and the previous notes, if there are any. Write the files where the doc says. With no doc, print the note in the reply, use the defaults at the end of this file, and say that you did.

Gather

The range runs from the last release tag to what is being released, usually the default branch. If the user named a version or a range, use theirs. Match the release tag's own form. A repository that also tags modules, packages or vendored builds has other tags in the way, and v* matches vendor-... too.

git tag --list 'v[0-9]*' --sort=-v:refname | head -3
git log <tag>..<ref> --format='%h %s'

On a squash-merged repository each commit is one pull request. Read the body of every candidate, whatever its type:

gh pr view <n> --json title,body,labels,files

A title is written for a reviewer. It names the code or it is figurative, and either way it rarely says what changed on screen. A refactor can carry the fix a user noticed, and a feat can be mostly fixes. Skip a PR unread only when its file list proves it internal, such as CI or tests alone.

The reader's before is the last release, not the PR's before. A bug introduced and fixed inside the range never reached anyone, and neither did a feature added and removed inside it. Check against the last tag when unsure.

Check what this release carries. A plugin, a module or an app that has its own version and its own tag is not in it, and its own changes are not this note's to claim. What this release does to them is.

Choose

Put every candidate in one of three piles:

  1. The person using the product will notice it.
  2. The person running or administering it will notice it.
  3. Nobody outside the repository will: refactors, CI, tests, lint, dependency bumps, developer tools, internal components.

The third pile is gone. A refactor or a dependency earns a line only when it changed something someone can see or measure, and then the line is about that.

Rank what is left by how many people meet it, how often, and how bad it was. A bug that quits the app or loses someone's place beats a cosmetic one that more people saw. Keep the top few, and merge the PRs a user would see as one change.

A line needs proof that it works where the reader meets it. A change its own PR calls untested on the device, platform or host it targets stays out until someone has seen it work there. Say so in the reply.

Write each line

A highlight is a title and at most two sentences.

  • The title is the outcome. What the reader can now do, or what now happens, in their words. Never the component, the code path or the PR's title.
  • The first sentence says what happens and where. Name the screen, the setting or the button exactly as the product spells it in that language.
  • The second sentence is optional. It says what this replaces, its one limit, or the second half of a merged change.
  • A fix names the symptom that is gone, the way a user would have reported it. The cause belongs in the PR.
  • A number beats an adjective, and only a measured one, taken from the PR. With no measurement there is no speed claim.
  • Present tense, active voice, with "you" or the product as the subject.
  • No PR numbers, component names, package names or ticket IDs.
  • No marketing: "exciting", "seamless", "powerful", "under the hood", "various improvements". No exclamation marks, no emoji.
Instead ofWrite
Refactored the subtitle pipelineSubtitles now start in your language
Improved search performanceSearch shows results as you type
Fixed a race condition in the upload queueA file you drop twice uploads once
New ExportButton componentExport any report as a spreadsheet from its menu
Bug fixes and performance improvementsSay which, or say nothing

Anything the reader must do goes first

Write it as an instruction, before or after the update, whichever it is: a setting that moved, a minimum version, something to update alongside.

Look for stored data the release changes in a way the last version cannot undo: a migration that deletes rows, drops or moves a table, or rewrites a format. When there is one, the note tells the owner to back up before updating, even when no PR says so.

Images

At most one per highlight, and only one that shows the change itself: the new screen, cropped to it. The PR's screenshot of the finished state is usually the right one. The alt text says what the picture shows. An image never carries a sentence the note should have said. A picture with readable text is captured once per language.

Every language is written, not translated

The first draft is the brief for the others. Write each language from what the change means to the reader, in the register the product's own copy already uses.

  • Take every name of a screen, button or setting from the product's translation catalog in that language, as the release ships it: git grep -i '<word>' <ref> -- <catalog path>. The working tree may hold edits that are not in the release.
  • Keep a technical word in English where the catalog does.
  • Restructure freely. Two languages need the same facts in the same order, not the same sentences.
  • A literal rendering of the other language reads as machine output. If a native speaker would not have written the sentence unprompted, rewrite it.

Check before handing back

  • For every line, name the PR it comes from. A line you cannot trace goes.
  • Count against the budget in every language. The longer language sets the limit.
  • Run the unslop skill's pattern list over each language. Its advice to use "I" and hold opinions does not apply here, because a release note speaks for the product.
  • In your reply, not in the note, list what you left out with a one-line reason, so the author can put something back.
  • Also in the reply, list every check a PR asked for before release that nothing shows was done. Those block the release, not the note.

Defaults

When the project states no budget: at most three highlights and five fixes, a title of at most seven words, a body of at most two sentences and 30 words, a fix of one line, and a whole note someone reads in under 30 seconds.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

One file, one job, and short enough to hold in your head. Covers the size policy (hard-split over 300 lines, split 200 to 300 at a seam, aim for 150), what a natural seam is and where to cut, the exemptions, the dependency rules that decide where the split lands, and the signals that a file is already two files. Use before adding to a file that is already long, when naming a new file, when a function has nowhere obvious to live, or when a review says a file is doing too much. Triggers - "this file is too long", "where should this go", "split this file", "is this file too big", "one responsibility".

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

naming

Free

What things get called. A file is named after its export in the project's case convention, a suffix is a resolution instruction rather than decoration, an index file only re-exports, and some symbol names are always wrong (utils, helpers, V2, Enhanced, New). Covers learning a tree's local vocabulary before adding to it, test and platform-variant naming, and the per-language conventions. Use when creating a file or directory, naming a test file, adding a platform variant, or when a name has to change. Triggers - "what should I call this file", "where does this file go", "naming convention", "kebab or camel", "name this test".

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

Spawn the comment hunter, fix accepted findings, and offer encodings for claimed constraints.

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

Rust best practices. Use when reading or editing any .rs file, designing a crate's public API, choosing an error type, splitting a workspace, or writing async code on tokio. Triggers - "rust best practices", "is this idiomatic", "should this be a newtype", "anyhow or thiserror", "why does the borrow checker", "review this Rust".

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

Write cargo tests. A test name is a sentence, the body is setup, mock, test and verify blocks separated by blank lines with no comments, and shared setup lives in a named test-support module rather than in each test. Covers naming, the block shape, where a test file goes, async and time, workspaces, and running one crate or one filter. Use when adding or changing any #[test] or #[tokio::test], or when Rust coverage has to come up. Triggers - "write a rust test", "cargo test", "test this crate", "cover this handler".

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

Security guidance and vulnerability review for codebases, APIs, services, CLI tools, libraries, and daemons. Use for security questions, focused reviews, vulnerability research, security audits, or pen tests. Run the complete workflow only for explicit codebase audit or pen-test requests, full/comprehensive/end-to-end reviews, or requested report artifacts.

The English summary is being prepared. Showing the original description.

kromatv/kroma60Updated Oct 19, 2026

See all skills by kromatv

Report a problem with this skill