draft-release-notes
Skill22k starsChanged 2 days agoApache-2.0View on GitHub
Draft the release notes for a NetBox core (this repository, not a plugin) patch release from its GitHub milestone, audit the commits since the previous release for noteworthy changes missing from the milestone, and render the notes as the release PR or GitHub release body. Use when the user asks to draft, preview, or update the release notes or changelog for an upcoming NetBox release, to check a release milestone against the commit log, or when the prepare-release skill reaches its release notes step.
We split this skill into the rules it gives an agent
5 rules. 0 are common, 5 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 9 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 70
Use parallel subagents to read the issues when there are more than a dozen or so, asking each one for a proposed entry plus a one-line note …
- Distinctive: line 78
Write the description for the end user, not from the issue title or the code:
- Distinctive: line 81
Start with a verb: Add, Fix, Prevent, Restrict, Support, Enable, Correct, Avoid, Display.
- Distinctive: line 82
Use "Fix exception when ..." for crashes and HTTP 500 errors.
- Distinctive: line 114
Use absolute URLs for links.
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Draft NetBox Release Notes
Each patch release has a GitHub milestone named for it (e.g. v4.7.5), and every issue closed as completed must carry one (.github/workflows/enforce-milestone.yml reopens any that don't). The milestone is therefore the starting point for the release notes. But it only holds the issues someone assigned to it, so this skill also audits every commit since the previous release for changes the milestone misses. It then turns the issues into a section of docs/release-notes/version-X.Y.md.
The notes are published text. Present the draft to the user for review and editing; never commit it unreviewed.
1. Gather the Milestone
gh issue list --milestone vX.Y.Z --state all --limit 200 \
--json number,title,state,stateReason,labels,url- Warn about any issue still open. The release should not proceed until it is closed or moved to another milestone.
- Skip issues closed as
NOT_PLANNEDorDUPLICATE; onlyCOMPLETEDissues are candidates.
2. Audit the Commits Against the Milestone
A change whose issue was never assigned to the milestone, or was assigned to the wrong one, is invisible to step 1, even though it shipped. Check every commit since the previous release:
git fetch origin main --tags
python3 .claude/skills/draft-release-notes/audit_milestone.py vX.Y.ZThe script follows each first-parent commit on main since the previous release tag to its PR, and to the issues that the PR closes or the commit subject references (Fixes #N). It skips release commits, translation updates, and updates to the list of vouched contributors (.github/VOUCHED.td), and prints two tables:
- Reverts, and commits not linked to the milestone, with each linked issue's milestone and
type:label, and the areas of the codebase changed (app,dependencies,install,schema,docs,tests,tooling). Reverts are always listed, even when their issue is in the milestone. A commit marked "not on GitHub" hasn't been pushed, so its PR and issues can't be looked up. - Milestone issues not linked to any commit
To audit a past release, pass --base vPREV --head vX.Y.Z.
Review every row; the script only finds the gaps, and deciding what's noteworthy is up to you:
- Linked issue with no milestone, or a different one: the change shipped in this release, so the issue belongs in this milestone. Propose moving it (
gh issue edit N --milestone vX.Y.Z). Once the user confirms, it goes through the remaining steps like any other issue. - No linked issue: read the PR and the diff (
gh pr view P --json title,body,files,git show --stat <sha>). Changes confined totooling,tests, ordocsare rarely noteworthy. For any other change, decide whether users would notice it: a bug fix, a change in behavior or in the API, a new feature, a performance change, or a dependency upgrade. If they would, search for an issue the PR should have referenced (gh search issues --repo netbox-community/netbox "<keywords>") and propose assigning it to the milestone. If no issue exists, tell the user; every entry links to an issue, and opening one is up to them. - A commit and its revert cancel out, and neither belongs in the notes. For example, in v4.7.1, the fix for #23097 (which had no milestone) was reverted before the release.
- Milestone issues not linked to any commit: confirm that each one actually shipped. It may have been fixed by a commit which didn't reference it (check
git logfor related changes), or closed without a code change (e.g. an investigation, such as #23362 in v4.7.4). Or it may have been fixed onfeatureinstead (git log origin/feature --oneline --grep "#N"), in which case it belongs in the next minor release's milestone, and not in these notes.
Report a verdict for every row: noteworthy and how to handle it, or not noteworthy and why. Make no milestone changes without the user's confirmation.
3. Sort Into Sections
Assign each issue by its type: label, then sort each section by ascending issue number:
| Label | Section |
type: feature | ### Enhancements |
type: performance | ### Performance Improvements |
type: bug | ### Bug Fixes |
type: housekeeping, type: documentation, type: translation | Omitted |
type: deprecation, type: removal, or no type: label | Flag for the user |
Omit any section that ends up empty.
4. Write Each Entry
For each included issue, read the issue body and the PR(s) that closed it:
gh issue view N --json title,body,closedByPullRequestsReferences
gh pr view P --json title,body,filesUse parallel subagents to read the issues when there are more than a dozen or so, asking each one for a proposed entry plus a one-line note on what changed.
Each entry is one line:
* [#N](https://github.com/netbox-community/netbox/issues/N) - <description>Write the description for the end user, not from the issue title or the code:
- Describe the effect of the change, so that it makes sense without reading the issue.
- Start with a verb: Add, Fix, Prevent, Restrict, Support, Enable, Correct, Avoid, Display.
- Use "Fix exception when ..." for crashes and HTTP 500 errors.
- Include terms users will search for: exception names, field and parameter names in backticks, "REST API", "GraphQL", the UI view involved.
- No trailing period.
Examples from v4.7.4 (issue title → entry):
| Issue title | Entry |
| Add device from location page has wrong argument | Pre-populate the location when adding a non-racked device from a location's view |
| Every non-bulk change enqueues its own Search cache update job instead of coalescing — RQ queue flood | Coalesce search cache updates rather than enqueuing a background job for each change |
| Bookmark, journal entry and related API endpoints fail for objects without a REST serializer | Fix exception when listing bookmarks, journal entries, and other objects assigned to objects which have no REST API serializer |
| Please add several more basic widely used trunk cable profiles ... | Add 8C1P, 12C1P, and 24C1P trunk cable profiles |
5. Flag Judgment Calls
Recommend omitting, but let the user decide:
- Changes with no user-visible effect, such as internal helpers, tests, or CI (e.g. #23432, a TypeScript type guard fix, was left out of v4.7.4).
- Dependency upgrades filed as features (e.g. #23383, an upgrade of
strawberry-graphql-django). - Bugs introduced and fixed within the same release cycle, which no user ever saw.
Present every issue in a table grouped as included, omitted, and needs your decision, with a short reason for each omission.
6. Add Warnings
Place a warning above the first section for anything a user or operator must act on: an API or GraphQL change they need to adapt to, a dependency upgrade requiring action (the prepare-release skill passes these in), or a new minimum version. State what to do, concretely:
!!! warning "GraphQL Circuit Status Values"
The GraphQL enum for circuit and virtual circuit status ... must be updated to use the prefixed form (e.g. `{exact: STATUS_ACTIVE}`). See [#23469](https://github.com/netbox-community/netbox/issues/23469) for details.Use absolute URLs for links; relative links to other docs pages break in the PR and release bodies.
7. Output
The section goes at the top of docs/release-notes/version-X.Y.md, directly below the # NetBox vX.Y heading, and is separated from the previous release by ---:
# NetBox vX.Y
## vX.Y.Z (YYYY-MM-DD)
!!! warning "..."
...
### Enhancements
* ...
### Bug Fixes
* ...
---
## vX.Y.(Z-1) (...)The date is the planned release date (the milestone's due date, and published in netbox/release.yaml).
Rendering the PR and Release Bodies
Once the section is in the docs file, render the GitHub bodies from it rather than by hand:
python3 .claude/skills/draft-release-notes/render_release_notes.py X.Y.Z --format pr # release PR body
python3 .claude/skills/draft-release-notes/render_release_notes.py X.Y.Z --format release # GitHub release bodyThe script drops the ## vX.Y.Z heading and converts admonitions to GitHub alerts (> [!WARNING], dropping the title). The release format also promotes ### headings to ##, as the release checklist specifies.
Why These Choices
- Start from the milestone, then audit the commits. The milestone provides each change's issue, type label, and context, which commit subjects often lack (e.g.
fix(core): ...). But the milestone workflow only catches issues closed with no milestone, not issues given the wrong one, or never linked to the fix at all. Only the commit log shows everything that shipped. - The audit is scripted, the verdicts aren't. Mapping some 50 commits to PRs and issues takes one batched GraphQL query in the script, but well over a hundred separate
ghcalls by hand. Whether a change is noteworthy depends on reading it. - Entries are rewritten, not copied. Issue titles describe the reporter's symptom; the notes must describe the change for someone who never saw the issue.
- Rendering is scripted. The docs file is the single source of truth, so the PR body and the release body (often created in a later session) can't drift from it or from each other.
References
docs/development/release-checklist.md: Update Version and Changelogdocs/release-notes/: Past release notes, for style
Trending
Quiet since June.about the whole repository
Who's talking about netbox-community/netbox
- netbox-community/netbox-topology-views“Use new version identifier from Netbox”GitHub · Feb 11, 2025 · 17 reactions
- Onemind-Services-LLC/netbox-secrets“Netbox 4.0 Support”GitHub · May 7, 2024 · 12 reactions
- netbox-community/ansible_modules“Inventory plugin broken after upgrading Netbox to 2.11.x”GitHub · Apr 20, 2021 · 10 reactions
- scaleway/python-netboxapi“Support endpoints choices/options in Netbox 2.8”GitHub · Apr 16, 2020 · 10 reactions
- vatesfr/xen-orchestra“Netbox 4.4+ support”GitHub · Sep 9, 2025 · 8 reactions
The biggest 5 of 41 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 41
Talked about on GitHub, Hacker News, Bluesky, Stack Overflow and the web (41 times).
On GitHub · 33
- Feb 11, 2025Use new version identifier from Netbox — netbox-community/netbox-topology-views17 reactions · 4 comments
- May 7, 2024Netbox 4.0 Support — Onemind-Services-LLC/netbox-secrets12 reactions · 12 comments
- Apr 20, 2021Inventory plugin broken after upgrading Netbox to 2.11.x — netbox-community/ansible_modules10 reactions · 7 comments
- Apr 16, 2020Support endpoints choices/options in Netbox 2.8 — scaleway/python-netboxapi10 reactions · 12 comments
- Sep 9, 2025Netbox 4.4+ support — vatesfr/xen-orchestra8 reactions · 8 comments
28 more on GitHub
- Mar 30, 2024Netbox 4.0 compatibility — netbox-community/netbox-bgp6 reactions · 5 comments
- Sep 1, 2023fields.E300 error after upgrading Netbox from v3.5.x to v3.6 — iDebugAll/nextbox-ui-plugin6 reactions · 6 comments
- Aug 30, 2023[Feature]: Add support for NetBox v3.6 — netbox-community/netbox-acls6 reactions · 4 comments
- Jul 21, 2021Porting of Provider Network Model — nautobot/nautobot6 reactions · 7 comments
- Apr 16, 2021Release 1.2.0 — netbox-community/netbox-docker6 reactions · 6 comments
- Jan 29, 2026netbox_4_5: init at 4.5.5 — NixOS/nixpkgs5 reactions · 3 comments
- Feb 28, 2024add support for virtual-disk data from netbox as ressource and data source — e-breuninger/terraform-provider-netbox5 reactions · 4 comments
- Apr 8, 2022Package incompatible with NetBox v3.2.0 — netbox-community/go-netbox5 reactions · 2 comments
- Apr 7, 2022[Add]: Netbox — trueforge-org/truecharts5 reactions · 6 comments
- May 15, 2021Cache the openapi schema — netbox-community/ansible_modules5 reactions · 3 comments
- Nov 24, 2025[Feature]: Supply 4.4.0's new "Changelog message" — netbox-community/ansible_modules4 reactions · 1 comment
- Sep 4, 2024Netbox 4.1.0 compatibility — k1nky/netbox-otp-plugin4 reactions · 3 comments
- Aug 30, 2023[Feature]: Add support for NetBox v3.6 — Onemind-Services-LLC/netbox-metatype-importer4 reactions · 7 comments
- Jul 26, 2022Model Chassis Switches (Module support) — nautobot/nautobot4 reactions · 12 comments
- Oct 19, 2025netbox_4_4: 4.4.2 -> 4.4.6 — NixOS/nixpkgs3 reactions · 1 comment
- May 8, 2025Fix PluginTemplateExtension compatibility with NetBox 4.3.0 — NetTech2001/netbox-interface-synchronization3 reactions · 2 comments
- Jun 9, 2026netbox_4_6: init at 4.6.8 — NixOS/nixpkgs2 reactions · 25 comments
- Aug 18, 2025Housekeeping — netbox-community/netbox-docker2 reactions
- Sep 27, 2024fix: handle netbox migration to disk set in MB — e-breuninger/terraform-provider-netbox2 reactions · 7 comments
- Sep 14, 2022Netbox 3.3 — e-breuninger/terraform-provider-netbox2 reactions · 1 comment
- Sep 10, 2021Upgrade go-netbox to Netbox version 3.0.2 — netbox-community/go-netbox2 reactions · 5 comments
- Dec 18, 2020Netbox now call validate() with a 3rd arg. — jeremyschulman/netbox-plugin-auth-saml22 reactions · 5 comments
- Sep 4, 2020RemoteUserBackend class has been moved in Netbox 2.9 — jeremyschulman/netbox-plugin-auth-saml22 reactions · 3 comments
- Jan 26, 2020Update configmap for v2.7 REDIS changes — netbox-community/netbox-chart2 reactions · 2 comments
- Apr 28, 2026netbox: 4.5.7 -> 4.7.9 — NixOS/nixpkgs1 reaction
- Apr 4, 2026netbox_4_5: 4.5.5 -> 4.5.7 — NixOS/nixpkgs1 reaction · 1 comment
- Apr 2, 2026feat: Netbox 4.5.6 compatibility — 1.6TE interface types + CI update — ctrl-alt-automate/PowerNetbox1 reaction
- Dec 10, 2025netbox_4_4: 4.4.6 -> 4.4.8 — NixOS/nixpkgs1 reaction · 1 comment
On Hacker News · 3
- Feb 16, 2022Netbox: Infrastructure resource modeling for network automation8 points · 2 comments
- Jan 18, 2025Netbox – Network Infrastructure Resource Modeling for Automation1 point
- Apr 4, 2020Netbox, the free and open source IPAM and DCIM solution1 point
On Bluesky · 3
- Feb 24, 2024I like diagrams.net if you’re doing it by hand or github.com/netbox-commu... netbox if you want to go full doco — @bossett.social4 likes and reposts
- Dec 15, 2025@vees Netbox, maybe? https://github.com/netbox-community/netbox — @fritzadalis.infosec.exchange.ap.brid.gy0 likes and reposts · 1 reply
- Feb 7, 2024🔥 Hot Repo! 🔥 (100+ new stars) 📦 netbox-community / netbox ⭐ 14,101 (+190) 🗒 Python The premier source of truth powering network… — @github-trending.bsky.social0 likes and reposts · 1 reply
On Stack Overflow · 1
- Dec 17, 2021Wher to look for custom teplate tag in django0 votes
On the web · 1
- Aug 2, 2023github.com-netbox-community-netbox_-_2023-08-02_08- ... — archive.org
Other versions9 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 9
- jamiepine/voicebox★ 57ksame name
- rommapp/romm★ 14ksame name
- omnigent-ai/omnigent★ 11ksame name
- luxury-yacht/app★ 444same name
- oyvindwe/connectlife-ha★ 305same name
- NVIDIA/NeMo-Relay★ 224same name
- defenseunicorns/uds-core★ 198same name
- NVIDIA/NeMo-Fabric★ 64same name
- tenstorrent/tt-studio★ 52same 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.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- add-config-paramSkill
- add-model-fieldSkill
- add-modelSkill
- prepare-releaseSkill
- publish-releaseSkill
- remove-config-paramSkill
- remove-model-fieldSkill
- remove-modelSkill
- run-testsSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
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.

