herald
Skill1 starsChanged 52 days agoApache-2.0View on GitHub
Have the AI draft release notes for a tag or the unreleased work since the last one, grounded in the pull requests and commits that actually landed, then write them into the GitHub release once the user approves. Use when the user says herald, asks for release notes, or wants a release described.
- Commits and pushes
1 other project uses a version of this.
Adopted by
Most recently taken up by
- 3zequiel3/heraldtheir own version, first seen Jun 18, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- 3zequiel3/herald★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
22 rules. About 0 are common, 16 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈16
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 8
Use this skill when the user asks the AI to write release notes: what a release, or the work waiting for one, actually changed, told for …
- Very specific: line 41
Not a changelog generator.
- Distinctive: line 47
Not a release tool. It never creates a tag, bumps a version, merges a release pull request, or publishes a draft release.
- Distinctive: line 49
Not permission to describe changes the merged pull requests and commits in the range don't show.
- Distinctive: line 54
Run when the user explicitly asks for release notes, asks to describe a release or what shipped since the last one, or says herald.
- Very specific: line 83
Read the target repo's config file — .orchraft.jsonc, else .orchraft.json — when one exists, per context/policies/config-policy.md, for …
- Distinctive: line 112
Read each pull request's title and body, and the issues it closes.
- Very specific: line 119
When the user asks to publish, wrap the notes between the hidden markers <!-- herald:start --> and <!-- herald:end --> so a later run can …
- Distinctive: line 135
Read the release back and confirm its body holds exactly one marked block containing the notes before reporting success.
- Distinctive: line 148
Every breaking change says what to do about it.
- Very specific: line 149
No marketing language, no emoji, and no orc voice.
- Distinctive: line 151
If the repository has earlier release notes written by hand, match their shape instead.
- Very specific: line 156
Never edit, stage, or commit files, including CHANGELOG.md.
- Distinctive: line 157
Never create a tag, bump a version, or publish a draft release.
- Distinctive: line 158
Never write to a release without the user's current-turn go-ahead, or a verified Autonomous Mode entry naming it, and never replace an …
- Distinctive: line 161
Never describe a change no merged pull request or commit in the range shows.
- Distinctive: line 168
Stop if the named tag doesn't exist.
- Distinctive: line 169
Stop if the range holds no commits.
- Very specific: line 171
Stop before publishing if gh is unavailable or lacks write access, and leave the draft in chat.
- Distinctive: line 173
Stop if the release body changed between reading it and writing it.
- Distinctive: line 188
After publishing, report the release URL and which write happened: the notes added above the existing body, the block from an earlier run …
- Distinctive: line 191
If blocked, drop the orc voice and state the blocker plainly.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Herald Workflow
Use this skill when the user asks the AI to write release notes: what a release, or the work waiting for one, actually changed, told for the people who use the project rather than the people who built it.
Contents
- At A Glance
- What This Is Not
- Trigger Rules
- Requirements
- Prerequisites
- Default Path
- Notes Format
- Guardrails
- Stop Conditions
- Handoff
- Response Examples
At A Glance
- Resolve the range: a named tag against the tag before it, or the last tag to the base branch's head for unreleased work.
- Collect the pull requests merged in that range, with their titles, bodies, and linked issues, plus any commit that reached the base branch without one.
- Draft notes grouped by what changed for users, each item citing its pull request, or its commit when there is none.
- Show the draft in chat. Stop there unless the user asks to publish it.
- Once the approval policy is satisfied, write the notes into the GitHub release for that tag.
What This Is Not
- Not a changelog generator. Tools such as release-please, changesets, and
semantic-release own
CHANGELOG.mdwhere a repository uses them, and a hand edit there is overwritten or conflicts with the next release. This skill never editsCHANGELOG.mdor any other file. - Not
chronicle:chroniclewrites Markdown docs into the repository. Release notes live on the hosting platform's release, not in a file. - Not a release tool. It never creates a tag, bumps a version, merges a release pull request, or publishes a draft release.
- Not permission to describe changes the merged pull requests and commits in the range don't show.
Trigger Rules
- Run when the user explicitly asks for release notes, asks to describe a release or what shipped since the last one, or says herald.
- Drafting is read-only and needs no approval. Writing the notes to a
release is a mutation under
context/policies/approval-policy.md(the target repo's copy when it exists, otherwise${CLAUDE_PLUGIN_ROOT}/context/policies/approval-policy.md): a request for notes is a request for the draft, not for the write. Publish only when the current turn asks for it, unless verified Autonomous Mode from the applicable policy or active config names creating or editing a release for this repository. For configs, apply the shared verification rules, including the trusted exact-path ignore check for a local config absent from the default branch. A failed or mismatched verification requires current-turn approval.
Requirements
- A GitHub MCP connector configured for this session, or
ghinstalled and authenticated, to read releases, tags, and pull requests. ghwith write access to publish. The GitHub MCP connector exposes release reads (list_releases,get_release_by_tag,get_latest_release) but no release write, so the write goes throughgh release.
Prerequisites
- Read
context/policies/docs-policy.mdandcontext/policies/writing-guidelines.md, using the target repo's copy of each when it exists; otherwise use the bundled copy at${CLAUDE_PLUGIN_ROOT}/context/policies/<file>. The notes follow their grounding and tone rules. - Read the target repo's config file —
.orchraft.jsonc, else.orchraft.json— when one exists, percontext/policies/config-policy.md, forbaseBranch. Without it, the base branch is the repository's default branch; do not assumemain. - Fetch tags and the base branch fresh (
git fetch --tags origin <base-branch>) before resolving a range, so a tag created since the last fetch isn't missed and the base branch's head is the remote's, not a local ref that may be behind it.
Default Path
- Resolve the range:
- A named tag — from the previous tag to that tag. The previous tag is
the nearest earlier one by version order among tags following the same
pattern (
v1.2.0beforev1.3.0), not whichever was created last. - Unreleased work (the default when no tag is named) — from the
latest tag to the just-fetched
origin/<base-branch>, not the local branch. - No earlier tag — from the repository's first commit, and say so in the handoff.
- A named tag — from the previous tag to that tag. The previous tag is
the nearest earlier one by version order among tags following the same
pattern (
- List the commits in the range (
git log --first-parent <from>..<to>on the base branch; with no earlier tag,git log --first-parent <to>, since<from>..<to>would leave out the first commit itself), and map each to its pull request: the(#123)suffix a squash merge leaves, theMerge pull request #123subject a merge commit leaves, or the platform's commit-to-pull-request lookup for a rebase merge, which leaves neither. A commit pushed straight to the base branch has no pull request but is still part of the release; use its own message, and cite its short SHA where a pull request number would go. - Read each pull request's title and body, and the issues it closes. These say what changed and why; the commit titles alone often don't.
- Drop what users never see: release pull requests themselves (such as
release-please's
chore: release), dependency bumps with no behavior change, and CI or tooling changes. Keep a dependency bump that fixes a vulnerability or changes supported versions. - Draft the notes per Notes Format and show them in chat.
- When the user asks to publish, wrap the notes between the hidden markers
<!-- herald:start -->and<!-- herald:end -->so a later run can find them, then check the release for that tag:- It exists — when the body already holds that block from an earlier
run, replace only what lies between the markers; otherwise put the block
above the current body, separated by a horizontal rule. Replace the
whole body only when the user asks for that. GitHub keeps no history of
release bodies, so a replacement would lose whatever a release tool
wrote there. Write with
gh release edit "$tag" --notes-file "$file". - The tag exists but has no release — create a draft with
gh release create "$tag" --draft --verify-tag --notes-file "$file"and leave publishing it to the user.--verify-tagmakesghabort rather than create a missing tag. - Unreleased work — there is nothing to write to yet. Say so, and offer to publish once the release exists.
- It exists — when the body already holds that block from an earlier
run, replace only what lies between the markers; otherwise put the block
above the current body, separated by a horizontal rule. Replace the
whole body only when the user asks for that. GitHub keeps no history of
release bodies, so a replacement would lose whatever a release tool
wrote there. Write with
- Read the release back and confirm its body holds exactly one marked block containing the notes before reporting success.
Notes Format
- Group by what changed for users, in this order, and omit empty groups:
Breaking changes, Features, Fixes, Documentation, Other.
A commit type is a hint, not the answer: a
fix:that changes a default may be a breaking change. - One bullet per change, in plain language, stating what a user can now do
or what stopped going wrong. End each with its pull request number, such
as
(#42), or the short SHA of a direct commit that has none, such as(a1b2c3d). Several pull requests that deliver one change share a bullet. - Every breaking change says what to do about it.
- No marketing language, no emoji, and no orc voice. Release notes are
release text, which
context/personality.mdkeeps plain. - If the repository has earlier release notes written by hand, match their shape instead.
Guardrails
- Never edit, stage, or commit files, including
CHANGELOG.md. - Never create a tag, bump a version, or publish a draft release.
- Never write to a release without the user's current-turn go-ahead, or a verified Autonomous Mode entry naming it, and never replace an existing release body unless the user asks for a replacement specifically.
- Never describe a change no merged pull request or commit in the range shows. When a pull request's body doesn't say what changed for users, describe it from its diff, or mark the gap in the draft rather than guessing.
Stop Conditions
- Stop if the named tag doesn't exist.
- Stop if the range holds no commits; say the tag or base branch has nothing new to announce.
- Stop before publishing if
ghis unavailable or lacks write access, and leave the draft in chat. - Stop if the release body changed between reading it and writing it. Read it again, rebuild the combined body, and confirm with the user before writing.
Handoff
- Unless the user asked for plain output, open with a fresh one-line phrase
in the orc voice, speaking as the Herald from
context/personality.md(the target repo's copy when it exists, otherwise${CLAUDE_PLUGIN_ROOT}/context/personality.md). If they did, open with the plain result instead. The line is the skill's own message, never part of the notes. - Report the range, and how many pull requests and direct commits it covered.
- Show the drafted notes.
- After publishing, report the release URL and which write happened: the notes added above the existing body, the block from an earlier run updated, the whole body replaced, or a draft release created.
- If blocked, drop the orc voice and state the blocker plainly.
Response Examples
Opening lines are samples of the orc voice; write a fresh one each time.
Notes drafted:
📯 Hrrm. Seven raids since v0.1.0, ready to be cried from the walls.
Range: `v0.1.0`..`main`, 7 pull requests.
## Features
- Add an optional `.orchraft.jsonc` for fixed choices such as merge
method. (#42)
...
Say publish once the release exists to write these into it.Notes published:
📯 The horn is sounded. v0.2.0 carries its news.
https://github.com/example/repo/releases/tag/v0.2.0
Placed above release-please's generated list.Blocked:
⚠️ Tag `v0.3.0` doesn't exist. Nothing was drafted.Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

