|
| 1 | +--- |
| 2 | +name: nemoclaw-maintainer-release-notes |
| 3 | +description: Draft and publish NemoClaw release notes from live GitHub tag and compare data. Produces the repo's narrative release-note style with three lead paragraphs, categorized shipped changes, why-it-matters bullets, and external-only contributor thanks. Use after cutting a release tag or when asked to write/post a release announcement. Trigger keywords - release note, release notes, announcement, discussion post, changelog, v0.0.x is out, Carl Sagan. |
| 4 | +user_invocable: true |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. --> |
| 8 | +<!-- SPDX-License-Identifier: Apache-2.0 --> |
| 9 | + |
| 10 | +# NemoClaw Maintainer Release Notes |
| 11 | + |
| 12 | +Draft and publish NemoClaw release notes from live release data. The house style is: |
| 13 | + |
| 14 | +- three narrative lead paragraphs, |
| 15 | +- a categorized list of shipped changes, |
| 16 | +- one "what changed and why it matters / why we did it" bullet for every included shipped change, |
| 17 | +- external-only contributor thanks, |
| 18 | +- visible `#NNNN` GitHub links. |
| 19 | + |
| 20 | +Default to a local draft and HTML preview first. Do not create or update a GitHub Discussion until the user explicitly approves posting. |
| 21 | + |
| 22 | +## Prerequisites |
| 23 | + |
| 24 | +- You must be in the NemoClaw git repository. |
| 25 | +- `gh` must be authenticated for `NVIDIA/NemoClaw`. |
| 26 | +- The release tag should already exist. If the user is still cutting the tag, use `nemoclaw-maintainer-cut-release-tag` first. |
| 27 | +- Use live GitHub and remote tag state, not memory or a stale local branch. |
| 28 | + |
| 29 | +## Step 1: Verify the Release Range |
| 30 | + |
| 31 | +Identify the current release tag and previous release tag. If the user gives only the current version, derive the previous semver tag from remote tags. |
| 32 | + |
| 33 | +```bash |
| 34 | +git ls-remote https://github.com/NVIDIA/NemoClaw.git \ |
| 35 | + refs/heads/main \ |
| 36 | + refs/tags/<previous-version> 'refs/tags/<previous-version>^{}' \ |
| 37 | + refs/tags/<current-version> 'refs/tags/<current-version>^{}' \ |
| 38 | + refs/tags/latest 'refs/tags/latest^{}' |
| 39 | +``` |
| 40 | + |
| 41 | +Confirm: |
| 42 | + |
| 43 | +- `<current-version>^{}` peels to the intended release commit. |
| 44 | +- `latest` points to the same peeled commit unless the user explicitly says otherwise. |
| 45 | +- The compare range is `<previous-version>...<current-version>`. |
| 46 | + |
| 47 | +## Step 2: Collect the Shipped Surface |
| 48 | + |
| 49 | +Use the compare API as the first source of truth: |
| 50 | + |
| 51 | +```bash |
| 52 | +gh api repos/NVIDIA/NemoClaw/compare/<previous-version>...<current-version> \ |
| 53 | + --jq '{status,ahead_by,total_commits,commits:[.commits[] | {sha:.sha, headline:(.commit.message|split("\n")[0]), author:.commit.author.name}], files:[.files[] | {filename,status,changes}]}' |
| 54 | +``` |
| 55 | + |
| 56 | +For each PR number in commit headlines, collect live PR metadata: |
| 57 | + |
| 58 | +```bash |
| 59 | +gh pr view <number> --repo NVIDIA/NemoClaw \ |
| 60 | + --json number,title,author,headRepositoryOwner,url,mergeCommit,labels,body,mergedAt |
| 61 | +``` |
| 62 | + |
| 63 | +Also inspect any shipped commit that does not have a PR number in the headline. Include it only if it is a real shipped change worth announcing. |
| 64 | + |
| 65 | +## Step 3: Decide What to Include |
| 66 | + |
| 67 | +Include the shipped product, docs, release-surface, and CI confidence changes that a reader should know about. |
| 68 | + |
| 69 | +For each included item, write: |
| 70 | + |
| 71 | +- what changed, |
| 72 | +- why it matters or why we did it, |
| 73 | +- a visible PR link like `[#4474](https://github.com/NVIDIA/NemoClaw/pull/4474)`. |
| 74 | + |
| 75 | +Be careful with sensitive internal cleanup: |
| 76 | + |
| 77 | +- Do not count testing reverts or guardrail reversions as release value unless the user explicitly asks for a full raw changelog. |
| 78 | +- If a revert-like commit must be mentioned, use neutral language and do not frame it as someone else's mistake. |
| 79 | +- Avoid public wording that could embarrass a teammate. |
| 80 | + |
| 81 | +## Step 4: Categorize the Changes |
| 82 | + |
| 83 | +Use categories that match the release surface. Prefer 4-6 sections. Common categories: |
| 84 | + |
| 85 | +- OpenClaw, Sandbox, and Network Stability |
| 86 | +- Windows, WSL, and Onboarding Recovery |
| 87 | +- Messaging and OpenClaw Runtime Activation |
| 88 | +- Hermes and Inference |
| 89 | +- Skills, Docs, and Release Surface |
| 90 | +- CI and Release Confidence |
| 91 | + |
| 92 | +Every included shipped change should appear in exactly one category unless the user asks for a shorter note. |
| 93 | + |
| 94 | +## Step 5: Handle Contributor Credit |
| 95 | + |
| 96 | +By default, thank external contributors only. Do not thank NVIDIA/internal contributors by GitHub ID unless the user explicitly asks. |
| 97 | + |
| 98 | +Determine external contributors from live GitHub state: |
| 99 | + |
| 100 | +```bash |
| 101 | +for login in <github-logins>; do |
| 102 | + code=$(gh api -i orgs/NVIDIA/members/$login 2>/dev/null \ |
| 103 | + | sed -n '1s/.* \([0-9][0-9][0-9]\).*/\1/p' || true) |
| 104 | + printf '%s %s\n' "$login" "${code:-unknown}" |
| 105 | +done |
| 106 | +``` |
| 107 | + |
| 108 | +Interpretation: |
| 109 | + |
| 110 | +- `204` means the account is a visible member of `NVIDIA`. |
| 111 | +- `404` means the account is not a visible member and should be treated as external for release-note thanks. |
| 112 | + |
| 113 | +Replay PRs need special care: |
| 114 | + |
| 115 | +- If a maintainer replayed an external PR, inspect the replay PR body and the original PR. |
| 116 | +- Credit the original external GitHub username in the issue-level bullet for the shipped replay. |
| 117 | +- Also thank that username in the final thanks section. |
| 118 | +- Do not mention affiliations, organizations, domains, or companies unless the user explicitly asks. Use the GitHub username only. |
| 119 | + |
| 120 | +Example: |
| 121 | + |
| 122 | +```markdown |
| 123 | +- [#4474](https://github.com/NVIDIA/NemoClaw/pull/4474) replays and narrows the Hermes Provider host-smoke fix originally contributed by @shannonsands in [#4385](https://github.com/NVIDIA/NemoClaw/pull/4385). ... |
| 124 | + |
| 125 | +## Thank you |
| 126 | + |
| 127 | +Thank you to external contributor @shannonsands for the original Hermes Provider smoke-check contribution in [#4385](https://github.com/NVIDIA/NemoClaw/pull/4385), which was replayed and narrowed into [#4474](https://github.com/NVIDIA/NemoClaw/pull/4474) for this release. |
| 128 | +``` |
| 129 | + |
| 130 | +## Step 6: Draft the Narrative |
| 131 | + |
| 132 | +Write the top section as exactly three paragraphs unless the user asks otherwise. |
| 133 | + |
| 134 | +If the user requests a theme, let it shape the paragraphs. If the user asks for the voice of Carl Sagan, keep it subtle: cosmic scale, humility, clarity, and wonder, but no parody, no quotes, and no overdone imitation. |
| 135 | + |
| 136 | +Suggested structure: |
| 137 | + |
| 138 | +1. Stability theme and infrastructure/security boundary changes. |
| 139 | +2. User-facing workflow stability: messaging, Hermes, inference, onboarding. |
| 140 | +3. Maintenance stability: skills, docs, checks, and release confidence. |
| 141 | + |
| 142 | +Keep the prose warm and polished, but concrete. Tie the narrative to actual PRs in the release range. |
| 143 | + |
| 144 | +## Step 7: Write Local Drafts First |
| 145 | + |
| 146 | +Create a Markdown draft and an HTML preview. By default, place these outside the checkout root so the repo stays clean, for example: |
| 147 | + |
| 148 | +```bash |
| 149 | +../nemoclaw-<current-version>-release-note-draft.md |
| 150 | +../nemoclaw-<current-version>-release-note-draft.html |
| 151 | +``` |
| 152 | + |
| 153 | +The Markdown body is the source that will be posted to GitHub Discussions. The HTML file is just a browser preview for review. |
| 154 | + |
| 155 | +After writing the files, open the HTML preview with the platform's default file opener: |
| 156 | + |
| 157 | +```text |
| 158 | +macOS: |
| 159 | +open ../nemoclaw-<current-version>-release-note-draft.html |
| 160 | +
|
| 161 | +Linux: |
| 162 | +xdg-open ../nemoclaw-<current-version>-release-note-draft.html |
| 163 | +
|
| 164 | +Windows (PowerShell): |
| 165 | +Start-Process ../nemoclaw-<current-version>-release-note-draft.html |
| 166 | +``` |
| 167 | + |
| 168 | +Stop here unless the user approves posting. |
| 169 | + |
| 170 | +## Step 8: Publish to GitHub Discussions After Approval |
| 171 | + |
| 172 | +When the user says to post the release note, publish the reviewed Markdown body as a Discussion in `Announcements`. |
| 173 | + |
| 174 | +Resolve repository and category IDs live: |
| 175 | + |
| 176 | +```bash |
| 177 | +gh api graphql -f owner=NVIDIA -f name=NemoClaw -f query=' |
| 178 | +query($owner:String!,$name:String!){ |
| 179 | + repository(owner:$owner,name:$name){ |
| 180 | + id |
| 181 | + discussionCategories(first:20){ nodes{ id name slug } } |
| 182 | + } |
| 183 | +}' |
| 184 | +``` |
| 185 | + |
| 186 | +Check for an existing discussion for the same version before creating a new one: |
| 187 | + |
| 188 | +```bash |
| 189 | +gh api graphql -f owner=NVIDIA -f name=NemoClaw -f query=' |
| 190 | +query($owner:String!,$name:String!){ |
| 191 | + repository(owner:$owner,name:$name){ |
| 192 | + discussions(first:20, orderBy:{field:CREATED_AT,direction:DESC}){ |
| 193 | + nodes{ number title url createdAt category{ name } } |
| 194 | + } |
| 195 | + } |
| 196 | +}' --jq '.data.repository.discussions.nodes | map(select(.title|test("<current-version>"; "i")))' |
| 197 | +``` |
| 198 | + |
| 199 | +Create the discussion: |
| 200 | + |
| 201 | +```bash |
| 202 | +gh api graphql \ |
| 203 | + -f repositoryId='<repo-id>' \ |
| 204 | + -f categoryId='<announcements-category-id>' \ |
| 205 | + -f title='NemoClaw <current-version> is out' \ |
| 206 | + -F body=@../nemoclaw-<current-version>-release-note-draft.md \ |
| 207 | + -f query='mutation($repositoryId:ID!,$categoryId:ID!,$title:String!,$body:String!){ |
| 208 | + createDiscussion(input:{repositoryId:$repositoryId,categoryId:$categoryId,title:$title,body:$body}){ |
| 209 | + discussion{ number title url category{ name } body } |
| 210 | + } |
| 211 | + }' |
| 212 | +``` |
| 213 | + |
| 214 | +Verify the live result: |
| 215 | + |
| 216 | +```bash |
| 217 | +gh api graphql -F number=<discussion-number> -f owner=NVIDIA -f name=NemoClaw -f query=' |
| 218 | +query($owner:String!,$name:String!,$number:Int!){ |
| 219 | + repository(owner:$owner,name:$name){ |
| 220 | + discussion(number:$number){ number title url category{ name } body createdAt } |
| 221 | + } |
| 222 | +}' |
| 223 | +``` |
| 224 | + |
| 225 | +Confirm: |
| 226 | + |
| 227 | +- category is `Announcements`, |
| 228 | +- title is `NemoClaw <current-version> is out`, |
| 229 | +- body starts with the reviewed draft, |
| 230 | +- external thanks are present if expected, |
| 231 | +- no affiliation text appears unless the user requested it. |
| 232 | + |
| 233 | +## Output |
| 234 | + |
| 235 | +For a draft-only run, return: |
| 236 | + |
| 237 | +- Markdown draft path, |
| 238 | +- HTML preview path, |
| 239 | +- a short note about the compare range and any excluded revert/test-cleanup items. |
| 240 | + |
| 241 | +For a posted run, return: |
| 242 | + |
| 243 | +- Discussion URL, |
| 244 | +- discussion number, |
| 245 | +- verification summary. |
| 246 | + |
| 247 | +## Hard Rules |
| 248 | + |
| 249 | +- Never publish a Discussion before the user approves the local draft. |
| 250 | +- Never draft from memory alone; use live `gh api compare` and PR metadata. |
| 251 | +- Never mention contributor affiliation unless the user explicitly asks. |
| 252 | +- Never thank internal contributors by default; keep thanks external-only. |
| 253 | +- Never include testing reverts as release-value bullets unless explicitly asked for a raw changelog. |
| 254 | +- Never create duplicate release Discussions. |
0 commit comments