name: nemoclaw-maintainer-cut-release-tag description: Creates deterministic NemoClaw semver release tags on origin/main, handles release housekeeping, and drafts release notes. Use when cutting a release, tagging a version, shipping a build, creating vX.Y.Z tags, or preparing release announcements. user_invocable: true
Cut Release Tag
Use the release scripts for normal release operations. Do not run raw git tag, git push, gh api, or version-bump commands by hand for the normal release flow.
The release is one annotated semver tag on an already-merged origin/main commit. The GitHub workflow moves latest; release admins promote lkg manually after validation. After the tag is cut, finish version-label housekeeping for remaining open issues/PRs and draft release notes for the maintainer to post.
Hard Rules
- Tag only the commit captured in a generated release plan.
- Ask the maintainer to paste the exact confirmation phrase from the plan before cutting the tag.
- Push only the semver tag (
vX.Y.Z) from the agent-controlled step. - Never push
latestorlkgfrom this skill. - Never move, delete, or force-push an existing remote semver tag unless the maintainer explicitly starts protected-tag remediation.
- Draft release notes locally. Do not create the GitHub Discussion; the maintainer does that.
- Follow the shared Git and GitHub Access Hard Stop for SSH, authentication, remote access, authorization, or permission failures.
Workflow
Copy this checklist and update it as you proceed:
Release Progress:
- [ ] Step 1: Generate release plan
- [ ] Step 2: Show plan and exact confirmation phrase
- [ ] Step 3: Cut the semver tag from the confirmed plan
- [ ] Step 4: Wait for workflow-managed latest
- [ ] Step 5: Housekeep remaining open issues/PRs
- [ ] Step 6: Generate release-note data and draft Markdown
- [ ] Step 7: Hand off announcement steps
Step 1: Generate Release Plan
Run exactly one of:
npm run release:plan -- --bump patch
npm run release:plan -- --bump minor
npm run release:plan -- --bump major
Patch is the default if the maintainer says "yes", "go", or similar without choosing.
The script writes a plan outside the checkout root, for example:
../nemoclaw-release-v0.0.58/plan.json
Step 2: Show Plan and Ask for Exact Confirmation
Read the generated plan.json and show the maintainer:
- previous tag,
- next tag,
- target
origin/maincommit and headline, - plan hash,
- forbidden operations,
- exact confirmation phrase,
- open issue/PR housekeeping plan for the release label.
Ask the maintainer to paste the exact phrase:
CONFIRM RELEASE vX.Y.Z <full-origin-main-sha>
Do not proceed on a generic "yes" at this step.
Step 3: Cut the Semver Tag
Run the cut script with the plan and the maintainer's exact phrase:
npm run release:cut -- --plan <plan.json> --confirm "CONFIRM RELEASE vX.Y.Z <full-origin-main-sha>"
The script verifies a clean worktree, unchanged origin/main, tag availability, target reachability, and remote peeled tag state. It writes:
<release-dir>/cut-result.json
If the script fails because of SSH, authentication, remote access, authorization, or permissions, follow Git and GitHub Access Hard Stop. For other precondition failures, report the failed precondition and use the recovery guidance below. Do not improvise git commands.
Step 4: Wait for Workflow-Managed latest
Run:
npm run release:wait-latest -- --plan <plan.json>
The script waits until vX.Y.Z^{} and latest^{} both peel to the planned commit and verifies lkg did not change from the plan. It writes:
<release-dir>/latest-result.json
If it fails, report the failed workflow/status. Do not manually move latest.
Step 5: Housekeep Remaining Open Issues/PRs
Move any remaining open issues or PRs labeled with the released version to the next patch label:
node --experimental-strip-types --no-warnings .agents/skills/nemoclaw-maintainer-day/scripts/bump-stragglers.ts <released-version> <next-version>
Then verify the released version has no open stragglers:
gh issue list --repo NVIDIA/NemoClaw --state open --label <released-version> --limit 100
gh pr list --repo NVIDIA/NemoClaw --state open --label <released-version> --limit 100
Summarize:
- shipped/closed items that remain associated with
<released-version>; - open issues/PRs bumped to
<next-version>; - any items that need manual maintainer attention.
Step 6: Generate Release-Note Data and Draft Markdown
Collect deterministic release-note input:
npm run release:notes-data -- --plan <plan.json>
This writes:
<release-dir>/notes-data.json
If notes-data.json has status: "partial" or non-empty pullRequestWarnings, report the warnings and ask the maintainer whether to fetch/fill the missing PR metadata before drafting.
Draft release notes from notes-data.json using the style from nemoclaw-maintainer-release-notes. Save only Markdown, outside the checkout root:
<release-dir>/release-note-draft.md
Do not create or update a GitHub Discussion.
Step 7: Hand Off Announcement
Return:
- release tag,
- confirmed release commit,
- plan path and plan hash,
cut-result.json,latest-result.json, andnotes-data.jsonpaths,- Markdown draft path,
- issue/PR housekeeping summary,
- suggested discussion title:
NemoClaw <new-version> is out, - reminder: maintainer creates the Announcement discussion and shares its link in external channels.
Recovery
- Plan generation fails: fix the named precondition, then regenerate the plan.
origin/mainmoved after plan generation: regenerate the plan and ask for the new exact confirmation phrase.- Remote semver tag already exists: stop; do not retag unless the maintainer explicitly starts protected-tag remediation.
latestworkflow fails or times out: report the workflow/status; do not movelatestmanually.latestworkflow rejects a rollback: keeplatestunchanged, inspect the plan target commit, and regenerate the plan for the currentorigin/maintip if appropriate.lkgchanged: stop and escalate to a release admin.- Housekeeping finds open items that should still ship in the released version: stop and ask the maintainer whether to leave the label or bump them.