Write a release announcement — changelog, blog post, in-app note, or social post — that leads with user impact, names the audience, and includes upgrade/migration steps without filler.
4a641d0Write the channel-appropriate announcement for a release without churn. Different surfaces need different shapes: a changelog entry is not a blog post is not a social card. The bar is: a reader of the chosen surface can decide in under 30 seconds whether this release affects them, and if so what to do.
When this skill runs inside Paperclip and experimental.enableCases is enabled,
emit durable release-content cases before handing off the copy. Cases preserve
the inspectable output; the issue coordinates the work.
Use skills/paperclip/references/cases.md for the API contract. Include
X-Paperclip-Run-Id on writes when PAPERCLIP_RUN_ID is set. If the API returns
403 Cases are disabled, report that limitation and continue with the requested
copy artifact.
Upsert the parent release case first when it does not already exist:
{
"caseType": "release",
"key": "paperclip-release:vYYYY.MDD.P",
"title": "Paperclip vYYYY.MDD.P release",
"status": "in_progress",
"fields": {
"schema_version": 1,
"version": "vYYYY.MDD.P",
"release_date": "YYYY-MM-DD",
"release_patch": 0,
"stable": true,
"channels": ["blog_post", "tweet_storm"],
"artifacts": {
"changelog_path": "releases/vYYYY.MDD.P.md",
"publish_url": null
}
}
}
For a dev blog, upsert a child case with parentCaseId set to the release case:
{
"caseType": "blog_post",
"key": "paperclip-release:vYYYY.MDD.P:blog-post",
"title": "Paperclip vYYYY.MDD.P launch post",
"status": "in_review",
"parentCaseId": "<release-case-id>",
"fields": {
"schema_version": 1,
"version": "vYYYY.MDD.P",
"slug": "paperclip-vYYYY-MDD-P",
"word_count_target": 650,
"target_audience": ["operators", "developers"],
"requires_screenshot": false,
"links": {
"release_notes": "releases/vYYYY.MDD.P.md",
"publish_url": null
},
"sections": ["hook", "whats_new", "upgrade", "whats_next"]
}
}
For social output, upsert a sibling child case:
{
"caseType": "tweet_storm",
"key": "paperclip-release:vYYYY.MDD.P:tweet-storm",
"title": "Paperclip vYYYY.MDD.P tweet storm",
"status": "in_review",
"parentCaseId": "<release-case-id>",
"fields": {
"schema_version": 1,
"version": "vYYYY.MDD.P",
"post_count": 1,
"channel": "x",
"target_audience": ["operators", "contributors"],
"links": {
"release_notes": "releases/vYYYY.MDD.P.md",
"publish_url": null
},
"review": {
"needs_human_copy_paste": true,
"approved_by": null
}
}
}
Write the produced copy to PUT /api/cases/:caseId/documents/body with
format: "markdown" and a changeSummary. Fetch the latest document revision
and pass baseRevisionId when updating an existing body document.
| Audience | Best channel | Tone | |---|---|---| | Existing power users | Changelog, in-app note | Terse, factual, links | | Engineering teams adopting your API | Release notes, dev blog | Examples, migration steps, version pins | | Prospective customers | Landing page, marketing blog | Story arc, problem → solution, social proof | | Broad audience | Social post, email newsletter | One-sentence pitch, link to depth | | Internal team | Slack/Discord post | What changed, who to ping if it breaks |
Pick the audience for this writeup. One release often needs several writeups; do not blend them.
Whatever the channel, lead with:
Everything else is depth that supports those three.
## v1.42.0 — 2026-05-26
### Added
- <feature> — <one-line user benefit>. ([#1234](link))
### Changed
- <change> — <one-line impact>. ([#1235](link))
### Fixed
- <bug> — <one-line user-visible symptom>. ([#1236](link))
### Deprecated
- <thing>. Replaced by <thing>. Removal planned for v<x>.
### Breaking
- <change>. **Migration:** <one-line> or <link to guide>.
Same as changelog, plus:
You can now export to CSV beats We've added CSV export.60% faster cold start beats much faster. Cite the methodology.**Breaking:** prefix. Repeat in the email/social channel.Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/release-announcement · pinned to the source commit
# Run from your project root
git clone https://github.com/paperclipai/paperclip.git .skillboard-tmp
git -C .skillboard-tmp checkout 4a641d0980fdaffc4c4e805f6f0a8809eb5702f2
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/packages/skills-catalog/catalog/optional/content/release-announcement" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/paperclipai/paperclip.git .skillboard-tmp
git -C .skillboard-tmp checkout 4a641d0980fdaffc4c4e805f6f0a8809eb5702f2
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/packages/skills-catalog/catalog/optional/content/release-announcement" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/release-announcement
Scanner static-checks@0.1.0 · commit 4a641d0980fd. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.