Official agent skill

Publish .NET Release Announcements

by dotnet in dotnet/core

Creates the GitHub release discussion in dotnet/core and the locked mirror issue in dotnet/announcements for a .NET release, safely re-runnable after interruptions.

OfficialMITAuto-check passedDevelopment

Install Publish .NET Release Announcements

skills CLI
$ npx skills add dotnet/core --skill publish-release-announcements -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dotnet/core publish-release-announcements --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/publish-release-announcements .claude/skills/publish-release-announcements && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
publish-release-announcements
GitHub stars
22k
Token cost
~1.6k tokens
SKILL.md length
810 words
Files
1
Skills in repo
15
Repo updated
First seen
Licence
MIT

At a glance

Creates the GitHub release discussion in dotnet/core and the locked mirror issue in dotnet/announcements for a .NET release, safely re-runnable after interruptions.

  • Works in 11 steps: Inspect the local release-note surface → Reuse the previous post as a template → Search for existing posts before… → …
  • Publishing the discussion after release notes are merged
  • SKILL.md covers Purpose, Inputs, Required preflight and Discussion workflow, plus 3 more sections
  • Calls gh; reaches github.com

What it does

Built around the fact that GitHub create mutations are not idempotent: creating a discussion or issue twice makes duplicates, and a canceled tool call does not prove the create failed. The goal is at most one new discussion in dotnet/core and at most one mirror issue in dotnet/announcements that links to it, with title, body, labels and lock state verified after each write.

Inputs are the release identifier, the release notes directory, the prior discussion and mirror issue, and the blog announcement URL if one exists. Preflight reads the local release notes, fetches the previous posts as a formatting template, searches for existing posts before creating anything, and treats cancellations as ambiguous success. It is not for writing release notes or generating features.json, and it needs the gh CLI with permission to create discussions and issues in both repositories.

When your agent uses it

  • Publishing the discussion after release notes are merged
  • Mirroring a new discussion into dotnet/announcements
  • Verifying an existing release post
  • Re-running a partly completed publication safely

Example prompts

  • “Publish the release discussion and announcement mirror for .NET 11 Preview 3.”
  • “Check whether the dotnet/announcements issue for this preview already exists.”
  • “Re-run the publication after the canceled terminal session without creating duplicates.”

Requirements

  • gh CLI with permission to create discussions and issues in dotnet/core and dotnet/announcements
  • Compatibility (from SKILL.md): Requires gh CLI with permission to query and create discussions and issues across dotnet/core and dotnet/announcements.

Workflow steps

11 steps, taken from the step headings in SKILL.md.

  1. Inspect the local release-note surface
  2. Reuse the previous post as a template
  3. Search for existing posts before creating anything
  4. Treat cancellations as ambiguous success
  5. Build the new discussion body from the prior template
  6. Create only after preflight passes
  7. Verify immediately after create
  8. Use the discussion URL in the mirror preamble
  9. Match the existing issue pattern
  10. Search again before creating the issue
  11. Verify and lock

What it can do on your machine

Read from SKILL.md and the folder at commit 44927bc. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Requires gh CLI with permission to query and create discussions and issues across dotnet/core and dotnet/announcements.

    From compatibility in the SKILL.md frontmatter.

Context cost

Publish .NET Release Announcements loads about 1.6k tokens when it runs. Until then it costs about 133 tokens; SKILL.md has 810 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~133
When it runs · the whole SKILL.md, loaded when a task matches
~1.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dotnet/core at commit 44927bc, republished under its MIT licence (© dotnet). 810 words, ~1,565 tokens.

Download SKILL.mdSave it as .claude/skills/publish-release-announcements/SKILL.md (or your agent's skills folder).
name
publish-release-announcements
description
Create the GitHub release discussion in dotnet/core and the locked mirror announcement issue in dotnet/announcements for a .NET preview, RC, or GA release. USE FOR: publishing release discussions after release notes exist, mirroring a newly created discussion into dotnet/announcements, verifying an existing post, and re-running a partially completed publication safely. DO NOT USE FOR: writing release notes, generating changes/features.json, or retrying create commands blindly after cancellation.
compatibility
Requires gh CLI with permission to query and create discussions and issues across dotnet/core and dotnet/announcements.

Publish Release Announcements

Use this skill when the release notes are already published in this repository and you need to publish the corresponding GitHub discussion and announcements mirror.

This skill exists because GitHub create mutations are not idempotent. Creating a discussion or issue twice creates duplicates. A canceled tool call or partial terminal result does not prove the create failed.

Purpose

The goal is to:

  1. reuse the previous release's discussion and announcement issue as the exact formatting template
  2. create at most one new dotnet/core discussion for the release
  3. create at most one new dotnet/announcements mirror issue that links to the discussion
  4. verify title, body, labels, and lock state after each write

Inputs

Collect these before creating anything:

  1. the release identifier, such as .NET 11 Preview 3
  2. the release notes directory, such as release-notes/11.0/preview/preview3/
  3. the prior discussion in dotnet/core
  4. the prior mirror issue in dotnet/announcements
  5. the new blog announcement URL, if one exists

Required preflight

Before any create mutation, perform these checks in order.

1. Inspect the local release-note surface

Read the target release directory and README.md to confirm:

  • the release name and preview number
  • the component markdown files that actually exist
  • the preferred section names and product naming for that release

Do not copy links from the previous discussion without checking that the new files exist.

2. Reuse the previous post as a template

Fetch:

  • the previous dotnet/core discussion body
  • the previous dotnet/announcements issue body

Preserve the established wording and structure unless the current release notes or publishing pattern changed.

3. Search for existing posts before creating anything

This step is mandatory.

Search dotnet/core for an existing discussion matching the target title or blog/release link. Search dotnet/announcements for an existing issue matching the same release title.

If a matching discussion or issue already exists:

  • stop treating the task as a create
  • verify and, if needed, update or report on the existing item
  • do not create another item with the same title
4. Treat cancellations as ambiguous success

If a terminal run, tool call, or agent step was canceled after sending a create command, assume the create may already have succeeded.

The next action must be a search or direct fetch for the expected title, not a second create attempt.

Discussion workflow

1. Build the new discussion body from the prior template

Update only the release-specific fields:

  • title, such as .NET 11 Preview 3
  • blog announcement URL
  • release-note links pointing at the new release directory
  • component bullets that reflect the files present for the new release
2. Create only after preflight passes

Use gh api graphql or another non-interactive gh command to create the discussion.

Capture and report:

  • discussion number
  • discussion URL
  • category name and ID
3. Verify immediately after create

Fetch the created discussion and confirm:

  • title is correct
  • category is correct
  • body matches the intended markdown
  • links point at the expected release directory

Example verification target:

  • .NET 11 Preview 3 discussion: https://github.com/dotnet/core/discussions/10363

If verification succeeds, use that discussion URL as the source of truth for the announcement mirror.

Show full SKILL.md (302 more words)Show less

Announcement issue workflow

1. Use the discussion URL in the mirror preamble

The mirror issue should start with the locked-mirror sentence that points to the new discussion URL.

2. Match the existing issue pattern

Reuse the previous release issue as the template for:

  • title
  • body structure
  • labels
  • lock behavior

For the current .NET 11 preview pattern, the mirror issue uses the Preview and .NET 11.0 labels and is locked with reason resolved.

3. Search again before creating the issue

Even if the discussion is new, the issue might already exist because of a prior attempt. Search dotnet/announcements by exact title before creating.

4. Verify and lock

After creation, verify:

  • issue number and URL
  • labels
  • locked state
  • active_lock_reason

Example verification target:

  • .NET 11 Preview 3 announcement issue: https://github.com/dotnet/announcements/issues/393

Do not assume the lock succeeded just because the command returned. Query the issue API and verify locked: true and the expected reason.

Safe retry rules

Follow these rules on every rerun:

  1. never retry createDiscussion or gh issue create until you have searched for an existing item with the target title
  2. if a create step might have run already, switch to verification mode first
  3. capture created URLs immediately and carry them into the next step
  4. prefer updating or reporting on an existing post over creating a replacement

Default outcome

For a normal release publication run:

  1. inspect the new release-note directory
  2. fetch the previous discussion and issue as templates
  3. search both repositories for an existing item with the new release title
  4. create the discussion only if no matching discussion exists
  5. verify the discussion and capture its URL
  6. create the announcements issue only if no matching issue exists
  7. lock and verify the issue

This keeps the publication workflow repeatable without producing duplicate discussions or mirror issues.

© dotnet, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .github/skills/publish-release-announcements of dotnet/core.

Open the folder on GitHubat commit 44927bc

Compare with similar skills

Publish .NET Release Announcements next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Publish .NET Release Announcements compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Publish .NET Release Announcements this skilldotnet/core22k—~1.6kAutomated safety check: PassMIT
Release Roslynatordotnet/roslynator3.5k—~1kAutomated safety check: PassCustom licence
Cutting A ReleaseTriliumNext/Trilium38k—~3.2kAutomated safety check: PassAGPL-3.0
Mole CLI Release Flowtw93/Mole70k—~2.6kAutomated safety check: PassGPL-3.0
Draft Release Notesjamiepine/voicebox57k—~941Automated safety check: PassMIT
Mole Release Notes Publishertw93/Mole70k—~1.9kAutomated safety check: PassGPL-3.0

Similar skills

  • Release Roslynator

    dotnet/roslynator

    Official

    A skill your agent uses when shipping a roslynator release, rolling CHANGELOG.md [Unreleased], updating the VS Code extension changelog, creating a GitHub v release, or optionally tagging cli-v.

    3.5k GitHub stars~1k tokensUpdated 5 days ago
    DevelopmentAuto-check passed
  • Cutting A Release

    TriliumNext/Trilium

    A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.

    38k GitHub stars~3.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.

    70k GitHub stars~2.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Draft Release Notes

    jamiepine/voicebox

    Writes or refreshes the Unreleased section of CHANGELOG.md as a themed narrative built from the commits, PRs and diff since the last version tag.

    57k GitHub stars~941 tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Publishes curated, bilingual release notes for an existing Mole version tag with gh release edit, including contributor thanks and reactions, after the release workflow finishes.

    70k GitHub stars~1.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Release Bump

    jamiepine/voicebox

    Ends a release cycle by moving the Unreleased changelog notes under a dated version heading, bumping version files with bumpversion and tagging the commit.

    57k GitHub stars~1.1k tokensUpdated 3 days ago
    DevelopmentAuto-check passed

More from dotnet/core

All 15 skills in this repo
  • Official

    Audits and updates os-packages.json files listing the Linux packages each .NET release needs per distro, then regenerates the Markdown from the JSON.

    22k GitHub stars~2.3k tokensUpdated yesterday
    Auto-check passed
  • Official

    Audits and updates the supported-os.json files for .NET releases, checking them against upstream lifecycle data and regenerating the markdown with the release-notes tool.

    22k GitHub stars~4.1k tokensUpdated yesterday
    Auto-check passed
  • Official

    Validates .NET release data with the release-notes CLI: download URL liveness, SHA512 hashes, CDN latest.version files and aka.ms redirects.

    22k GitHub stars~1.8k tokensUpdated yesterday
    Auto-check passed
  • Produces the changes.json manifest for a .NET preview, RC or GA milestone by choosing the right VMR base and head refs and running release-notes generate changes.

    22k GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Official

    Ranks the changes in a release manifest and writes a scored features file that release notes, docs and blog posts can each cut at their own threshold.

    22k GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed
  • Official

    Audits a scored features.json file and its draft release notes against editorial examples to catch over-scored, under-scored, or missing entries.

    22k GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed

Works with

Categories

Questions about Publish .NET Release Announcements

What does Publish .NET Release Announcements do?

Creates the GitHub release discussion in dotnet/core and the locked mirror issue in dotnet/announcements for a .NET release, safely re-runnable after interruptions. Built around the fact that GitHub create mutations are not idempotent: creating a discussion or issue twice makes duplicates, and a canceled tool call does not prove the create failed. The goal is at most one new discussion in dotnet/core and at most one mirror issue in dotnet/announcements that links to it, with title, body, labels and lock state verified after each write.

When should I use Publish .NET Release Announcements?

Publish .NET Release Announcements fits situations like: publishing the discussion after release notes are merged; mirroring a new discussion into dotnet/announcements; verifying an existing release post; re-running a partly completed publication safely.

How do I install Publish .NET Release Announcements in Claude Code?

Run `npx skills add dotnet/core --skill publish-release-announcements -a claude-code`. Or copy the skill folder (.github/skills/publish-release-announcements in dotnet/core) into .claude/skills/publish-release-announcements in your project. Claude Code loads it when a task matches its description.

How do I install Publish .NET Release Announcements in Codex?

Run `npx skills add dotnet/core --skill publish-release-announcements -a codex`. Or copy the skill folder (.github/skills/publish-release-announcements in dotnet/core) into .agents/skills/publish-release-announcements in your project. Codex loads it when a task matches its description.

Can I use Publish .NET Release Announcements in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnet/core --skill publish-release-announcements -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/publish-release-announcements, .gemini/skills/publish-release-announcements, .github/skills/publish-release-announcements and .opencode/skills/publish-release-announcements in your project.

What does Publish .NET Release Announcements need to run?

Going by SKILL.md and its folder, Publish .NET Release Announcements needs the command-line tools its instructions call (gh). Our summary lists: gh CLI with permission to create discussions and issues in dotnet/core and dotnet/announcements. Compatibility (from SKILL.md): Requires gh CLI with permission to query and create discussions and issues across dotnet/core and dotnet/announcements..

Does Publish .NET Release Announcements access the network?

SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Publish .NET Release Announcements safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Publish .NET Release Announcements use?

Publish .NET Release Announcements is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Publish .NET Release Announcements use?

About 1.6k tokens (SKILL.md is roughly 6.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Publish .NET Release Announcements?

Skills that share tags, products or a category with Publish .NET Release Announcements: Release Roslynator (dotnet/roslynator, 3.5k stars), Cutting A Release (TriliumNext/Trilium, 38k stars), Mole CLI Release Flow (tw93/Mole, 70k stars) and Draft Release Notes (jamiepine/voicebox, 57k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Publish .NET Release Announcements?

dotnet (a GitHub organization, an official publisher) maintains it in dotnet/core, which has 22,037 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 9, 2026.

Source: dotnet/core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.