Use when auditing and recovering Warp changelog fragments, finalizing a release changelog, or synchronizing a tagged release back to main.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
The canonical home for this skill is warp-changelog-audit in NVIDIA/warp
Audit the pending files under changelog/, preview their combined Towncrier
render, and optionally finalize or synchronize a release. CHANGELOG.md is the
historical release record, not the source of pending entries.
Read changelog/README.md from the target ref before acting. Its fragment
naming and content rules are authoritative.
changelog/README.md.CHANGELOG.md.WARP_CACHE_PATH for every Warp command. Build Warp when a
verification needs it; do not skip verification because binaries are stale.The optional positional argument is any Git ref and defaults to HEAD.
Read these references when their phases begin:
references/language-conventions.md for fragment inclusion and language.references/sorting-rubric.md for final generated-section ordering.Resolve the ref, symbolic name, SHA, and working directory. Strip
origin/ or upstream/ before classifying the branch. A name beginning
with release- selects release-branch mode; everything else selects main
mode.
Read VERSION.md and warp/config.py at the ref. Parse the leading
MAJOR.MINOR.PATCH; VERSION.md wins on conflict.
Resolve the previous stable tag using integer version components. For a
feature release, use the highest stable tag from the previous minor (or
previous major at an X.0 boundary). For a patch release, use the highest
lower patch tag in the same minor. Exclude prerelease tags.
Enumerate recognized fragment paths at the ref. In the target worktree, also include uncommitted and untracked fragment files:
git ls-tree -r --name-only <ref> -- changelog
rg --files changelogExclude changelog/README.md. A fragment path must match:
changelog/(<digits>|+<readable-slug>).(added|removed|deprecated|changed|fixed|documentation)(.<counter>).mdRun the pinned draft render in the worktree that contains the exact fragment state being audited:
uvx --from towncrier==25.8.0 towncrier build --draft \
--version <X.Y.Z> --date <YYYY-MM-DD>For an immutable ref not checked out anywhere, use a temporary detached worktree and remove it after rendering. Do not use a detached worktree when the audit must include uncommitted fragment edits.
In main mode, parse the newest stable version section already present in
CHANGELOG.md. Among stable tags reachable from the ref, consider only
versions newer than that section; tags for older historical releases may
intentionally have no section. Newer tags whose sections are absent form
the post-release sync set. Process them oldest first before auditing
remaining fragments.
If edits are needed, require a writable feature or release branch. Never
mutate main, master, or detached HEAD; propose a feature branch and
wait. Surface a dirty worktree and let the user decide how to handle it.
Never auto-stash.
Present mode, ref/SHA, working directory, target version, previous tag, fragment count, draft result, and missing release tags. Wait for explicit confirmation.
Skip unless main is missing a stable tag's release section.
For each missing tag, find the dedicated release build commit between the previous stable tag and that tag:
git log --reverse --format='%H' <previous-tag>..<tag> -- CHANGELOG.md changelog/
git show --stat --summary <candidate>
git show --format=fuller <candidate> -- CHANGELOG.md changelog/The correct commit adds ## [X.Y.Z], updates comparison links, and deletes the
fragment paths consumed by that release. Verify the tag contains the candidate
and that its generated section exactly matches git show <tag>:CHANGELOG.md.
Preferred sync:
If the build commit cannot be cherry-picked cleanly, use a manual fallback only when its diff still proves the consumed fragment paths. Insert the tagged section verbatim, preserving its final order; delete exactly those proven paths; and apply the build commit's comparison-link changes. Show the complete fallback diff and wait for confirmation. If consumed paths cannot be proven, stop rather than guessing.
Do not compare released entries with remaining fragments for deduplication. The build commit is the source of truth for what shipped.
For every pending fragment, record:
git log --follow <previous-tag>..<ref> -- <path>;**Breaking:** and **Experimental** markers;Validate names and content against changelog/README.md. In particular:
-.+ and use a readable slug.Surface malformed or duplicate identities before any prose review. Re-run the draft after every rename, category move, consolidation, or deletion.
If a fragment already exists at <previous-tag>, mark it as carried over and
inspect at most the nearest 20 older path commits with
git log --follow --max-count=20 <previous-tag> -- <path>. Do not replace the
selected ref or release range with an unbounded history search.
Translate the old lost-entry safeguard into fragment terms. Enumerate commits in the release range with the same cherry-pick filtering used by release notes:
git log --no-merges --reverse --cherry-pick --right-only \
<previous-tag>...<ref> --format='%H%x1f%s%x1f%b' --name-statusMap commits to fragments using, in order:
Inspect every remaining commit against changelog/README.md. Drop test-only,
CI-only, release automation, formatting, and internal refactors with no user
effect. A commit affecting public API, runtime behavior, performance,
compatibility, diagnostics, packaging, supported workflows, or substantive
documentation is a missing-fragment candidate.
For each candidate, show the commit, user impact, proposed category, identifier,
path, and content. Prefer the supplied GitHub issue number; otherwise propose a
readable +slug. Combine several commits for the same not-yet-released feature
into one final-state entry when appropriate. Confirm each proposal before
staging a new fragment, then re-render the draft. Never infer coverage merely
because unrelated fragment prose sounds similar.
If no previous tag exists, report that omission recovery was skipped; do not invent an unbounded history range.
Verify new public APIs, breaking changes, quantified claims, experimental
features, and requested headline items against the implementation and docs.
Find candidate commits through fragment history, issue IDs, symbols, and the
release range; never search pending prose in CHANGELOG.md.
Read diffs and confirm symbol names, signatures, defaults, behavior, and issue
topic. For non-obvious runtime claims, write a temporary script and run it with
uv run. Kernel scripts must be real files, never python -c. If native code
changed or binaries are stale, rebuild first. Record accurate, revised, and
unverifiable results.
Group fragments that describe Add/Fix/Change iterations on the same feature when none of those states shipped. Draft one entry describing the final state. If several issues must remain linked, keep one identical fragment per issue. Show original paths/text and proposed paths/text, then confirm before staging.
Do not consolidate a change to already-released behavior with its earlier introduction.
.fixed.md to .changed.md.**Breaking:** for source-incompatible Changed, Removed, or new
requirement entries. Confirm because it is a public stability signal.Use per-entry confirmation for identifier changes, category moves, consolidations, and stability markers.
Read references/language-conventions.md and apply it to every pending
fragment.
Track every deletion and meaning-bearing rewrite with a one-line reason. Mechanical corrections may be summarized by count.
Stage proposed files under a temporary directory, render Towncrier there, and show one consolidated source diff plus the resulting draft. Wait for explicit confirmation before writing fragment changes to the worktree. Re-run the draft after writing and require a clean render.
In main mode, stop here after reporting the audit and any post-release sync.
Require an explicit release date. Do not substitute a guessed date or
YYYY-?? in a final build.
Copy pyproject.toml, CHANGELOG.md, and the current changelog/ tree to
a temporary directory. Run the final Towncrier build there:
uvx --from towncrier==25.8.0 towncrier build --yes \
--version <X.Y.Z> --date <YYYY-MM-DD>Read references/sorting-rubric.md. In the generated ## [X.Y.Z]
section, preserve canonical subsection order and sort entries high to low
impact within each subsection. Use topic clustering only as a tie-breaker.
Wrap the generated section to at most 120 columns. Towncrier's generated issue links stay at each entry's end.
Add [X.Y.Z] to the comparison-link block and rotate [Unreleased] to
compare vX.Y.Z...HEAD. Do not edit older release sections.
Show the exact simulated diff: generated section, sorted order, consumed fragment deletions, and comparison links. Wait for explicit confirmation.
Run the same build in the actual release worktree and apply the reviewed ordering, wrapping, and link updates. Compare the actual diff with the simulation; stop if they differ unexpectedly.
Re-run a draft. It must report no pending fragments that were part of this release. Fragments intentionally excluded from the release must remain.
Keep the build, fragment deletions, final ordering, and link changes together in one dedicated release changelog commit when the user has authorized a commit. Record its full SHA; post-release synchronization depends on it. Do not silently create a commit when the user requested only an audit.
Report:
pending commit;CHANGELOG.md.^changelog/(?:\+[A-Za-z0-9][A-Za-z0-9-]*|\d+)\.(added|removed|deprecated|changed|fixed|documentation)(?:\.\d+)?\.md$^## \[(\d+\.\d+\.\d+(?:-[A-Za-z0-9.]+)?)\]( - .*)?$^### (Added|Removed|Deprecated|Changed|Fixed|Documentation)$\bGH-(\d+)**Breaking:**.**Experimental** with an optional colon
inside or immediately after the bold span.238de60
Canonical home
since Sep 5, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.